diff options
author | goodale <goodale@1faa4e14-9dd3-4be0-9f0e-ffe519881164> | 2000-09-14 19:09:58 +0000 |
---|---|---|
committer | goodale <goodale@1faa4e14-9dd3-4be0-9f0e-ffe519881164> | 2000-09-14 19:09:58 +0000 |
commit | 37a1b7289e02a794269bf1ab248da152d4c80648 (patch) | |
tree | cc7d14cc7c672fabb580671608355064ac526213 | |
parent | 68d3b18fee8e7331fd47f85b396a0fe25634e0d6 (diff) |
Initial version of C http thorn. There are still a fair number of things on
my to-do list, but it is fairly usable now as far as functionality is
concerned.
Tom
git-svn-id: http://svn.cactuscode.org/arrangements/CactusConnect/HTTPD/trunk@2 1faa4e14-9dd3-4be0-9f0e-ffe519881164
-rw-r--r-- | README | 138 | ||||
-rw-r--r-- | interface.ccl | 4 | ||||
-rw-r--r-- | param.ccl | 29 | ||||
-rw-r--r-- | schedule.ccl | 17 | ||||
-rw-r--r-- | src/Content.c | 717 | ||||
-rw-r--r-- | src/Server.c | 299 | ||||
-rw-r--r-- | src/Sockets.c | 241 | ||||
-rw-r--r-- | src/Startup.c | 99 | ||||
-rw-r--r-- | src/http.c | 618 | ||||
-rw-r--r-- | src/http_Request.h | 51 | ||||
-rw-r--r-- | src/httpd.h | 37 | ||||
-rw-r--r-- | src/images/wwwcactuscodeorg.h | 1053 | ||||
-rw-r--r-- | src/make.code.defn | 9 |
13 files changed, 3312 insertions, 0 deletions
@@ -0,0 +1,138 @@ +Cactus Code Thorn httpd +Authors : Tom Goodale +CVS info : $Header$ +-------------------------------------------------------------------------- + +Purpose of the thorn: +------------------- +This is a prototype C version of a web server thorn. + +Usage: +------------------- + +Interface: +--------- + +The current interface for this webserver is contained in + +http_Request.h + +(Note that this will change once we have an agreed common protocol for +other thorns to talk to web-serving thorns.) + +The primary mechanism is to + +HTTP_RegisterPage(path, function, data) + +where 'path' is the URI you want to register, e.g. + +/parameters + +'function' is a function of the form + +int foo(cGH *cctkGH, httpRequest *request, void *data) + +which will be called when the page is accessed, with 'data' being the +same data pointer that was passed into the registration routine. + +Note that a request of the form '/foo/bar/' will look for a page of +the called '/foo/var/index.html' first, followed by '/foo/bar', +followed by '/foo' followed by '/'. + +The httpRequest structure contains various pieces of information - + +request->filedes The file descriptor of the socket to write + to. + +request->body The body of the http request. This is + empty for a GET. + +request->body_length The length of the body. + +request->method The http method. +request->uri The full URI of the request. +request->residual The URI remaining after the registered URI + is removed from it. + +request->http_major_version The major version of the HTTP protocol + used. + +request->http_minor_version The minor version of the HTTP protocol + used. + +request->n_arguments The number of arguments passed to the + request. + +All other members of the structure should be considered opaque. + + +To get details of arguments or HTTP header lines, the functions + +const char *HTTP_ArgumentValue(const httpRequest *request, + const char *arg); + +const char *HTTP_HeaderValue(const httpRequest *request, + const char *header); + +may be used. Given the name of a header field or an argument, these +functions will return the corresponding value, or NULL if the argument +or header does not exist. + + +Writing to the browser: +---------------------- + +Currently this is done via the 'write' command. This takes three +arguments - the file-descripter, a buffer, and the length of the +buffer. + +The first line sent to the browser should be + +write(request->filedes, "HTTP/1.0 200 OK\r\n",19) + +(or an error code, e.g. "404 Not Found"). This should be followed by +any HTTP headers, such as "Content-Type", followed by "\r\n\r\n" and +then the content of your page, or at least that's what the standard +says 8-). + + +Examples: +--------- + +For examples of how to use the interface, please look at the Content.c +file. + +Structure of the thorn: +---------------------- + +The thorn is split into two parts - web serving and content provision. + +Web serving: +----------- +The web server capabilities are held in + +Sockets.c - basic socket utilities; these should be + replaced by or moved to the Socket thorn. + +Server.c - Stuff to register and serve pages. + +http.c - Parsing of HTTP requests. + +Startup.c - normal scheduled stuff. + +The above files should not need to be touched apart from debugging +purposes, to add more HTTP methods, or otherwise to enhance the +interaction with the network and protocols. + +Content Provision: +----------------- + +The content provision is currently all in + +Content.c + +This makes use of the interfaces in http_Request.h described above to +provide content. In principle this could be in another thorn, but +that should wait until we have an agreed set of interfaces to allow +web-server thorns to be interchangeable, at least at compile time, but +hopefully at run-time. diff --git a/interface.ccl b/interface.ccl new file mode 100644 index 0000000..df89c86 --- /dev/null +++ b/interface.ccl @@ -0,0 +1,4 @@ +# Interface definition for thorn httpd +# $Header$ + +implements: httpd diff --git a/param.ccl b/param.ccl new file mode 100644 index 0000000..56579d1 --- /dev/null +++ b/param.ccl @@ -0,0 +1,29 @@ +# Parameter definitions for thorn httpd +# $Header$ + +private: + +INT port "HTTP port number" +{ + 1:65535 :: "Any valid port" +} 5555 + +INT queue_length "Listen queue length" +{ + 1: :: "Any positive number" +} 4 + +INT timeout_seconds "Polling timeout seconds" +{ + 0: :: "Any whole number" +} 0 + +INT timeout_useconds "Polling timeout micro-seconds" +{ + 0: :: "Any whole number" +} 0 + +BOOLEAN standalone "Should the server poll continuously in startup" +{ +} "no" +
\ No newline at end of file diff --git a/schedule.ccl b/schedule.ccl new file mode 100644 index 0000000..5f975c3 --- /dev/null +++ b/schedule.ccl @@ -0,0 +1,17 @@ +# Schedule definitions for thorn httpd +# $Header$ + +SCHEDULE HTTP_Startup AT startup +{ + LANG: C +} "HTTP daemon startup" + +SCHEDULE HTTP_Work AT poststep +{ + LANG: C +} "HTTP working routine" + +SCHEDULE HTTP_Shutdown AT shutdown +{ + LANG: C +} "HTTP daemon shutdown" diff --git a/src/Content.c b/src/Content.c new file mode 100644 index 0000000..8f44f86 --- /dev/null +++ b/src/Content.c @@ -0,0 +1,717 @@ + /*@@ + @file Content.c + @date Wed Sep 13 23:47:43 2000 + @author Tom Goodale + @desc + The actual content of the web pages. + Note that this need not be in this thorn, since + it should just use the interface defined in http_Request.h + and should never touch the internals. + @enddesc + @version $Header$ + @@*/ + +#include <stdio.h> + +#include "cctk.h" + +#include "util_String.h" + +#include "http_Request.h" + +static char *rcsid = "$Header$"; + +CCTK_FILEVERSION(DevThorns_httpd_Content_c) + +/******************************************************************** + ********************* Local Data Types *********************** + ********************************************************************/ + +struct httpStaticPage +{ + char *page; + unsigned int length; + char *mime_type; +}; + +/******************************************************************** + ********************* Local Routine Prototypes ********************* + ********************************************************************/ + +static int RegisterImages(void); + +static int MainPage(cGH *cctkGH, httpRequest *request, void *data); +static int ParameterPage(cGH *cctkGH, httpRequest *request, void *data); + +static int ShowStaticPage(cGH *cctkGH, httpRequest *request, void *data); + +static int TestPage(cGH *cctkGH, httpRequest *request, void *data); + +static int CompareStrings(const void *string1, const void *string2); + +/******************************************************************** + ********************* Other Routine Prototypes ********************* + ********************************************************************/ + +/******************************************************************** + ********************* Local Data ***************************** + ********************************************************************/ + +/******************************************************************** + ********************* External Routines ********************** + ********************************************************************/ + + /*@@ + @routine HTTP_RegisterPages + @date Wed Sep 13 23:47:43 2000 + @author Tom Goodale + @desc + Main page registration routine. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_RegisterPages(void) +{ +#ifdef HTTP_DEBUG + printf("Registering index.html\n"); +#endif + + /* Register the master page. */ + HTTP_RegisterPage("/index.html", MainPage, NULL); + + /* Register a duff parameters page */ + + HTTP_RegisterPage("/parameters", ParameterPage, NULL); + + /* Register a test page */ + HTTP_RegisterPage("/test_page", TestPage, NULL); + + /* Registrer images */ + RegisterImages(); +} + +/******************************************************************** + ********************* Local Routines ************************* + ********************************************************************/ + + /*@@ + @routine CompareStrings + @date Thu Sep 14 18:57:52 2000 + @author Tom Goodale + @desc + Case independent string comparison to pass to qsort. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static int CompareStrings(const void *string1, const void *string2) +{ + return Util_StrCmpi(*(const char **)string1, *(const char **)string2); +} + +/****************************************************************************** + ***************************** Main Page ************************************** + ******************************************************************************/ + + +static const char *cactus_mainheader = " \ +</HEAD>\n \ +<BODY BGCOLOR=\"#FFFFFF\" \ + link=\"#1B831D\" vlink=\"#768000\" alink=\"#00FF00\">\n \ +<center><A HREF=\"http://www.cactuscode.org/\"> \ +<img src=\"/Images/wwwcactuscodeorg.jpg\" \ + alt=\"Cactus\" BORDER=0></A> \ +</A> \ +<table width=70% border=0><tr><td> \ +\n"; + +static const char *cactus_header = " \ +</HEAD>\n \ +<BODY BGCOLOR=\"#FFFFFF\" \ + link=\"#1B831D\" vlink=\"#768000\" alink=\"#00FF00\">\n \ +<center> \ +</A> \ +<table width=70% border=0><tr><td> \ +\n"; + +static const char *cactus_footer = \ +"</table>" \ +"\n \ +<HR size=1>\n \ +<ADDRESS><DIV ALIGN=left>\n \ +<SMALL>\n \ +<A HREF=\"http://www.cactuscode.org/\">Cactus Home Page</A><BR>\n\ +Cactus Web Interface by <A HREF=\"mailto:cactusmaint@cactuscode.org\">The Cactus Team</A><BR>\n\ +</SMALL></DIV></ADDRESS></BODY></HTML>\n"; + +static const char base_page[] = +"<HTML>\n<HEAD><TITLE>Test Page for Tom's trivial web server</TITLE></HEAD>\ +<BODY BGCOLOR=\"#FFFFFF\" \ + link=\"#1B831D\" vlink=\"#768000\" alink=\"#00FF00\">\n \ +<center><A HREF=\"http://www.cactuscode.org/\"> \ +<img src=\"/Images/wwwcactuscodeorg.jpg\" \ + alt=\"Cactus\" BORDER=0></A> \ +</A> \ +</BODY></HTML>"; + + /*@@ + @routine MainPage + @date Wed Sep 13 23:47:43 2000 + @author Tom Goodale + @desc + Displays the main page. + @enddesc + @calls + @calledby + @history + @hdate Thu Sep 14 10:54:22 2000 @hauthor Tom Goodale + @hdesc Copied content format from original http thorn + developed by Werner Benger, with the aesthetic + enhancements of Gabrielle Allen, John Shalf and + Ed Seidel. + @endhistory + +@@*/ +static int MainPage(cGH *cctkGH, httpRequest *request, void *data) +{ + int retval; + char message[4098]; + + /* Status message */ + strcpy(message,"HTTP/1.0 200 OK\r\n"); + + write(request->filedes, message, strlen(message)); + + /* Content-Type */ + strcpy(message,"Content-Type: text/html\r\n\r\n"); + + write(request->filedes, message, strlen(message)); + + /* Start the page */ + strcpy(message,"<HTML><HEAD><TITLE>Running CACTUS Status Information</TITLE>\n"); + + write(request->filedes, message, strlen(message)); + + /* Write out the main header part */ + write(request->filedes, cactus_mainheader, strlen(cactus_mainheader)); + + /* Some blurb */ + strcpy(message, "<br>" + "<center><table cellspacing=5 cellpadding=5 border=0><tr><td valign=top>" + "<h3>Simulation web server:</h3>" + "<p>This browser is connected to a Cactus simulation which contains " + "a web server thorn. This thorn allows you to monitor the simulation, " + "and view and change parameters</p>" + "<p>Depending on which other thorns are active, there may be additional " + "features available, such as the viewing and downloading of output files</p>"); + + write(request->filedes, message, strlen(message)); + + + /* CONFIGURATION DETAILS */ + + sprintf(message, "<h3>Configuration:</h3>" + "<ul> <li>Flesh version <FONT COLOR=RED> %s" + "</FONT></li>\n" + "<li>Code compiled on <FONT COLOR=RED>" + __DATE__ "</FONT> at <FONT COLOR=RED>"__TIME__ "</font></li>\n" + "</ul>", CCTK_FullVersion()); + + write(request->filedes, message, strlen(message)); + + /******************************************************************************/ + + /* NEW COLUMN */ + + strcpy(message, "</td><td valign=top>"); + + write(request->filedes, message, strlen(message)); + + /*******************************************************************************/ + + /* CURRENT STATE OF SIMULATION */ + + if (cctkGH) + { + + sprintf(message, "<H3> Current state:</h3> " + "<ul><li>Physical time <FONT COLOR=RED> %f" + "</FONT> \n" + "<li>Iteration number <FONT COLOR=RED> %d" + "</FONT></li>\n", + cctkGH->cctk_time, + cctkGH->cctk_iteration); + + } + else + { + strcpy(message, "<li>Current cactus time is unknown</li>\n"); + } + + write(request->filedes, message, strlen(message)); + + strcpy(message, "</ul>"); + + write(request->filedes, message, strlen(message)); + + /* LIST COMPILED THORNS */ + + { + int i; + int nthorns; + const char **thorns; + + nthorns = CCTK_NumCompiledThorns(); + + thorns = (const char **)malloc(nthorns * sizeof(char *)); + + for(i=0; i < nthorns; i++) + { + thorns[i] = CCTK_CompiledThorn (i); + } + + /* Sort the thorns */ + qsort(thorns, nthorns, sizeof(char *), CompareStrings); + + strcpy(message, "<h3>Compiled thorns:</h3>" + "<p>This list shows all thorns compiled into the executable, " + "those thorns which have been activated in the parameter " + "file for this simulation are shown in " + "<font color=red>red</font></p>" + "<UL>"); + + for(i=0; i < nthorns; i++) + { + strcat(message, "<LI>"); + if (CCTK_IsThornActive(thorns[i])) + { + sprintf(message,"%s <FONT COLOR=red> %s </FONT>\n", message, thorns[i]); + } + else + { + strcat(message, thorns[i]); + } + } + strcat(message, "</UL>"); + + free(thorns); + } + + write(request->filedes, message, strlen(message)); + + + /* Finish table started by blurb */ + strcpy(message, "</td></tr></table>"); + + write(request->filedes, message, strlen(message)); + + /* Write out the footer part. */ + + retval = write(request->filedes, cactus_footer, strlen(cactus_footer)); + + /* retval = write(request->filedes, base_page, strlen(base_page)); */ + + return retval; +} + + +/****************************************************************************** + ***************************** Parameter Page ********************************* + ******************************************************************************/ + + /*@@ + @routine ParameterPage + @date Wed Sep 13 23:47:43 2000 + @author Tom Goodale + @desc + Displays the parameter page. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static int ParameterPage(cGH *cctkGH, httpRequest *request, void *data) +{ + int retval; + char message[4098]; + + /* Status message */ + strcpy(message,"HTTP/1.0 200 OK\r\n"); + + write(request->filedes, message, strlen(message)); + + /* Content-Type */ + strcpy(message,"Content-Type: text/html\r\n\r\n"); + + write(request->filedes, message, strlen(message)); + + /* Start the page */ + strcpy(message,"<HTML><HEAD><TITLE>Running CACTUS Status Information</TITLE>\n"); + + write(request->filedes, message, strlen(message)); + + /* Write out the main header part */ + write(request->filedes, cactus_header, strlen(cactus_header)); + + /* This is just a test to see what the actual page requested was. */ + sprintf(message, "Residual is '%s'\n", request->residual); + + write(request->filedes, message, strlen(message)); + + /* Write out the footer part. */ + + retval = write(request->filedes, cactus_footer, strlen(cactus_footer)); + + /* retval = write(request->filedes, base_page, strlen(base_page)); */ + + return retval; +} + +/****************************************************************************** + ***************************** Images ***************************************** + ******************************************************************************/ + +#include "images/wwwcactuscodeorg.h" + + /*@@ + @routine RegisterImages + @date Wed Sep 13 23:47:43 2000 + @author Tom Goodale + @desc + Registers images. Images are static pages, so it + registers a function which takes a data structure and + displays it. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static int RegisterImages(void) +{ + struct httpStaticPage *image; + + image = (struct httpStaticPage *)malloc(sizeof(struct httpStaticPage)); + + if(image) + { + image->page = (char *)malloc(sizeof(wwwcactuscodeorg)); + memcpy(image->page, wwwcactuscodeorg, sizeof(wwwcactuscodeorg)); + image->length = sizeof(wwwcactuscodeorg); + image->mime_type = (char *)malloc(strlen("image/jpeg")); + strcpy(image->mime_type, "image/jpeg"); + +#ifdef HTTP_DEBUG + printf("Registering /Images/wwwcactuscodeorg.jpg\n"); +#endif + + HTTP_RegisterPage("/Images/wwwcactuscodeorg.jpg", ShowStaticPage, (void *)image); + } + + return 0; +} + + /*@@ + @routine ShowStaticPages + @date Wed Sep 13 23:47:43 2000 + @author Tom Goodale + @desc + Displays a static page. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static int ShowStaticPage(cGH *cctkGH, httpRequest *request, void *data) +{ + int retval; + char message[1024]; + struct httpStaticPage *page; + + if(data) + { + page = (struct httpStaticPage *)data; + + strcpy(message,"HTTP/1.0 200 OK\r\n"); + + write(request->filedes, message, strlen(message)); + + sprintf(message,"Content-Length: %d\r\nContent-Type: %s\r\n\r\n", page->length, page->mime_type); + + write(request->filedes, message, strlen(message)); + + retval = write(request->filedes, page->page, page->length); + } + else + { + retval = -1; + } + + + return retval; +} + + +/****************************************************************************** + ***************************** Test Page ************************************** + ******************************************************************************/ + +static char *test_page="\n +<html> + <head> + <title>Advanced Query</title> + </head> + <body bgcolor=\"#FFFFFF\" background=\"/Images/cac_bord.gif\" + link=\"#1B831D\" vlink=\"#768000\" alink=\"#00FF00\"> + <table width=80%> + <tr> + <td><img src=\"/Images/cac_space.gif\"></td> + <td> +<TABLE><TR><TD NOWRAP=\"1\"><FONT SIZE=\"+3\"><font color=\"#047704\"><H1>Query Problem Reports</H1></font></FONT></TD> <TD WIDTH=\"100%\"> </TD> <TD NOWRAP=\"1\"><tt><small>User: goodale<br>Database: normal<br>Access: edit</tt></small></TD></TR></TABLE><FORM ACTION=\"http:/test_page\" ENCTYPE=\"application/x-www-form-urlencoded\"> +<INPUT TYPE=\"submit\" NAME=\"cmd\" VALUE=\"submit query\"> or <INPUT TYPE=\"reset\" VALUE=\"reset\"><hr><center><table border=1 bgcolor=#d0d0d0><caption>Search All Text</caption><tr bgcolor=#9fbdf9><th nowrap>Search these text fields<th nowrap>using regular expression</tr> +<tr><td>Single-line text fields:<td><INPUT TYPE=\"text\" NAME=\"text\" SIZE=30></tr> +<tr><td>Multi-line text fields:<td><INPUT TYPE=\"text\" NAME=\"multitext\" SIZE=30></tr> +</table> +<table border=1 bgcolor=#d0d0d0><caption>Search By Date</caption><tr bgcolor=#9fbdf9><th nowrap>Date Search<th nowrap>Example: <tt>1999-04-01 05:00 GMT</tt></tr> +<tr><td>Arrived After:<td><INPUT TYPE=\"text\" NAME=\"arrivedafter\" SIZE=30></tr> +<tr><td>Arrived Before:<td><INPUT TYPE=\"text\" NAME=\"arrivedbefore\" SIZE=30></tr> +<tr><td>Modified After:<td><INPUT TYPE=\"text\" NAME=\"modifiedafter\" SIZE=30></tr> +<tr><td>Modified Before:<td><INPUT TYPE=\"text\" NAME=\"modifiedbefore\" SIZE=30></tr> +<tr><td>Closed After:<td><INPUT TYPE=\"text\" NAME=\"closedafter\" SIZE=30></tr> +<tr><td>Closed Before:<td><INPUT TYPE=\"text\" NAME=\"closedbefore\" SIZE=30></tr> +</table> +<table border=1 bgcolor=#d0d0d0><caption>Search Individual Fields</caption><tr bgcolor=#9fbdf9><th nowrap>Search this field<th nowrap>using regular expression, or<th nowrap>using multi-selection</tr> +<tr valign=top><td>Category:<td><INPUT TYPE=\"text\" NAME=\"category\" SIZE=30><td><SELECT NAME=\"category\" SIZE=4 MULTIPLE> +<OPTION VALUE=\"all\">all +<OPTION VALUE=\"CVS\">CVS +<OPTION VALUE=\"Cactus\">Cactus +<OPTION VALUE=\"CactusBase\">CactusBase +<OPTION VALUE=\"CactusEinstein-ADM\">CactusEinstein-ADM +<OPTION VALUE=\"CactusEinstein-ADMConstraints\">CactusEinstein-ADMConstraints +<OPTION VALUE=\"CactusEinstein-BMA\">CactusEinstein-BMA +<OPTION VALUE=\"CactusEinstein-Einstein\">CactusEinstein-Einstein +<OPTION VALUE=\"CactusEinstein-IDAnalyticBH\">CactusEinstein-IDAnalyticBH +<OPTION VALUE=\"CactusEinstein-IDLinearWaves\">CactusEinstein-IDLinearWaves +<OPTION VALUE=\"CactusEinstein\">CactusEinstein +<OPTION VALUE=\"CactusElliptic-EllBase\">CactusElliptic-EllBase +<OPTION VALUE=\"CactusElliptic-EllPETSc\">CactusElliptic-EllPETSc +<OPTION VALUE=\"CactusElliptic-EllSOR\">CactusElliptic-EllSOR +<OPTION VALUE=\"CactusElliptic-EllTest\">CactusElliptic-EllTest +<OPTION VALUE=\"CactusElliptic\">CactusElliptic +<OPTION VALUE=\"CactusPUGH-Interp\">CactusPUGH-Interp +<OPTION VALUE=\"CactusPUGH-PUGH\">CactusPUGH-PUGH +<OPTION VALUE=\"CactusPUGH\">CactusPUGH +<OPTION VALUE=\"CactusPUGHIO-IOASCII\">CactusPUGHIO-IOASCII +<OPTION VALUE=\"CactusPUGHIO-IOFlexIO\">CactusPUGHIO-IOFlexIO +<OPTION VALUE=\"CactusPUGHIO-IOHDF5\">CactusPUGHIO-IOHDF5 +<OPTION VALUE=\"CactusPUGHIO-IsoSurfacer\">CactusPUGHIO-IsoSurfacer +<OPTION VALUE=\"CactusPUGHIO\">CactusPUGHIO +<OPTION VALUE=\"CactusWave\">CactusWave +<OPTION VALUE=\"Compiler\">Compiler +<OPTION VALUE=\"Documentation\">Documentation +<OPTION VALUE=\"IO\">IO +<OPTION VALUE=\"Thorns\">Thorns +<OPTION VALUE=\"Webpage\">Webpage +<OPTION VALUE=\"external\">external +</SELECT> + +<tr valign=top><td>Synopsis:<td><INPUT TYPE=\"text\" NAME=\"synopsis\" SIZE=30><td> +<tr valign=top><td>Confidential:<td><INPUT TYPE=\"text\" NAME=\"confidential\" SIZE=30><td><SELECT NAME=\"confidential\" SIZE=3 MULTIPLE> +<OPTION VALUE=\"all\">all +<OPTION VALUE=\"no\">no +<OPTION VALUE=\"yes\">yes +</SELECT> + +<tr valign=top><td>Severity:<td><INPUT TYPE=\"text\" NAME=\"severity\" SIZE=30><td><SELECT NAME=\"severity\" SIZE=4 MULTIPLE> +<OPTION VALUE=\"all\">all +<OPTION VALUE=\"critical\">critical +<OPTION VALUE=\"serious\">serious +<OPTION VALUE=\"non-critical\">non-critical +</SELECT> + +<tr valign=top><td>Priority:<td><INPUT TYPE=\"text\" NAME=\"priority\" SIZE=30><td><SELECT NAME=\"priority\" SIZE=4 MULTIPLE> +<OPTION VALUE=\"all\">all +<OPTION VALUE=\"high\">high +<OPTION VALUE=\"medium\">medium +<OPTION VALUE=\"low\">low +</SELECT> + +<tr valign=top><td>Responsible:<td><INPUT TYPE=\"text\" NAME=\"responsible\" SIZE=30><td><SELECT NAME=\"responsible\" SIZE=4 MULTIPLE> +<OPTION VALUE=\"all\">all +<OPTION VALUE=\"allen\">allen +<OPTION VALUE=\"bernd\">bernd +<OPTION VALUE=\"gnats-admin\">gnats-admin +<OPTION VALUE=\"goodale\">goodale +<OPTION VALUE=\"lanfer\">lanfer +<OPTION VALUE=\"tradke\">tradke +<OPTION VALUE=\"werner\">werner +</SELECT> + +<tr valign=top><td>State:<td><INPUT TYPE=\"text\" NAME=\"state\" SIZE=30><br><INPUT TYPE=\"checkbox\" NAME=\"ignoreclosed\" VALUE=\"Ignore Closed\" CHECKED>Ignore Closed<td><SELECT NAME=\"state\" SIZE=4 MULTIPLE> +<OPTION VALUE=\"all\">all +<OPTION VALUE=\"open\">open +<OPTION VALUE=\"analyzed\">analyzed +<OPTION VALUE=\"suspended\">suspended +<OPTION VALUE=\"feedback\">feedback +<OPTION VALUE=\"Cactus4.0beta7\">Cactus4.0beta7 +<OPTION VALUE=\"Cactus4.0beta8\">Cactus4.0beta8 +<OPTION VALUE=\"Cactus4.0beta9\">Cactus4.0beta9 +<OPTION VALUE=\"closed\">closed +</SELECT> + +<tr valign=top><td>Class:<td><INPUT TYPE=\"text\" NAME=\"class\" SIZE=30><td><SELECT NAME=\"class\" SIZE=4 MULTIPLE> +<OPTION VALUE=\"all\">all +<OPTION VALUE=\"sw-bug\">sw-bug +<OPTION VALUE=\"doc-bug\">doc-bug +<OPTION VALUE=\"support\">support +<OPTION VALUE=\"feature-request\">feature-request +<OPTION VALUE=\"mistaken\">mistaken +<OPTION VALUE=\"duplicate\">duplicate +</SELECT> + +<tr valign=top><td>Submitter-Id:<td><INPUT TYPE=\"text\" NAME=\"submitter_id\" SIZE=30><td><SELECT NAME=\"submitter_id\" SIZE=3 MULTIPLE> +<OPTION VALUE=\"all\">all +<OPTION VALUE=\"test\">test +<OPTION VALUE=\"unknown\">unknown +</SELECT> + +<tr valign=top><td>Originator:<td><INPUT TYPE=\"text\" NAME=\"originator\" SIZE=30><td> +<tr valign=top><td>Release:<td><INPUT TYPE=\"text\" NAME=\"release\" SIZE=30><td> +</table> +<table border=1 bgcolor=#d0d0d0><caption>Select Columns to Display</caption><tr valign=top><td>Display these columns:<td><SELECT NAME=\"columns\" SIZE=14 MULTIPLE> +<OPTION SELECTED VALUE=\"category\">category +<OPTION VALUE=\"confidential\">confidential +<OPTION SELECTED VALUE=\"state\">state +<OPTION VALUE=\"class\">class +<OPTION VALUE=\"severity\">severity +<OPTION VALUE=\"priority\">priority +<OPTION VALUE=\"release\">release +<OPTION SELECTED VALUE=\"responsible\">responsible +<OPTION VALUE=\"submitter_id\">submitter_id +<OPTION SELECTED VALUE=\"originator\">originator +<OPTION VALUE=\"arrival_date\">arrival_date +<OPTION VALUE=\"last_modified\">last_modified +<OPTION VALUE=\"closed_date\">closed_date +<OPTION SELECTED VALUE=\"synopsis\">synopsis +</SELECT> +</table> +</center> +<hr><INPUT TYPE=\"submit\" NAME=\"cmd\" VALUE=\"submit query\"> or <INPUT TYPE=\"reset\" VALUE=\"reset\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"confidential\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"columns\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"state\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"priority\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"submitter_id\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"severity\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"class\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"ignoreclosed\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"responsible\"><INPUT TYPE=\"hidden\" NAME=\".cgifields\" VALUE=\"category\"></FORM><HR><!-- Included footer with navigation bar --> + <div align=\"center\"> + <table border=\"0\" width=\"100%\"> + <tr> + <td bgcolor=\"#E9F4D3\" align=\"center\" + nowrap><font face=\"arial,helvetica\"><small><a href=\"/index.html\">Welcome</a></small></font> + </td> + <td bgcolor=\"#E9F4D3\" align=\"center\" + nowrap><font face=\"arial,helvetica\"><small><a href=\"/Documentation.html\">Documentation</a></small></font> + </td> + <td bgcolor=\"#E9F4D3\" align=\"center\" + nowrap><font face=\"arial,helvetica\"><small><a href=\"/Download.html\">Download</a></small></font> + </td> + <td bgcolor=\"#E9F4D3\" align=\"center\" + nowrap><font face=\"arial,helvetica\"><small><a href=\"/Development.html\">Development</a></small></font> + </td> + <td bgcolor=\"#E9F4D3\" align=\"center\" + nowrap><font face=\"arial,helvetica\"><small><a href=\"/Showcase.html\">Showcase</a></small></font> + </td> + <td bgcolor=\"#E9F4D3\" align=\"center\" + nowrap><font face=\"arial,helvetica\"><small><a href=\"/Links.html\">Links</a></small></font> + </td> + </tr> + <tr> + <td align=\"center\" colspan=\"6\"> + <a href=\"/index.html\"><img src=\"/images/wwwcactuscodeorg_small.jpg\" + border=\"0\" alt=\"CactusCode\"></a><br> + <a href=\"mailto:cactus@cactuscode.org\">cactus@cactuscode.org</a> + <!--#config timefmt=\"Last Modified: <i>%a %b %d, %Y</i>\" --> + <!--#echo var=\"LAST_MODIFIED\" --> + </td> + </tr> + </table> + </div> +</td></tr></table></BODY></HTML>"; + + /*@@ + @routine TestPage + @date Thu Sep 14 20:42:37 2000 + @author Tom Goodale + @desc + A test page for showing how to access arguments and header lines + and generally playing about. + If this is called with no arguments, it displays a form. If it is + called with arguments it displays some info. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static int TestPage(cGH *cctkGH, httpRequest *request, void *data) +{ + int retval; + char message[1024]; + + const char *value; + + strcpy(message,"HTTP/1.0 200 OK\r\n"); + + write(request->filedes, message, strlen(message)); + + strcpy(message,"Content-Type: text/html\r\n\r\n"); + + write(request->filedes, message, strlen(message)); + + if(request->n_arguments == 0) + { + retval = write(request->filedes, test_page, strlen(test_page)); + } + else + { + strcpy(message, "<html><head><title>Advanced Query</title></head>" + "<body><H1> Query Result </H1><br>"); + + write(request->filedes, message, strlen(message)); + + sprintf(message, "Number of arguments is %d<hr>\n", request->n_arguments); + + write(request->filedes, message, strlen(message)); + + value = HTTP_ArgumentValue(request, "cmd"); + + sprintf(message, "cmd = %s<hr>\n", value); + + write(request->filedes, message, strlen(message)); + + value = HTTP_HeaderValue(request, "Host"); + + sprintf(message, "Host header = %s<hr>\n", value); + + write(request->filedes, message, strlen(message)); + + strcpy(message, "</body></html>"); + + retval = write(request->filedes, message, strlen(message)); + } + + return retval; +} diff --git a/src/Server.c b/src/Server.c new file mode 100644 index 0000000..b72c3a6 --- /dev/null +++ b/src/Server.c @@ -0,0 +1,299 @@ + /*@@ + @file Server.c + @date Wed Sep 13 20:10:24 2000 + @author Tom Goodale + @desc + Web serving and utility routines. + @enddesc + @version $Header$ + @@*/ + +#include <stdio.h> +#include <stdlib.h> + +#include "cctk.h" +#include "util_Hash.h" + +#include "httpd.h" + +static char *rcsid = "$Header$"; + +CCTK_FILEVERSION(DevThorns_httpd_Server_c) + +/******************************************************************** + ********************* Local Data Types *********************** + ********************************************************************/ + +typedef struct +{ + int (*function)(cGH *, httpRequest *, void *); + void *data; +} httpPage; + +/******************************************************************** + ********************* Local Routine Prototypes ********************* + ********************************************************************/ + +static httpPage *CreatePageData(int (*function)(cGH *,httpRequest *, void *), void *data); +static httpPage *FindPage(char *path, char **residual); + +/******************************************************************** + ********************* Other Routine Prototypes ********************* + ********************************************************************/ + +/******************************************************************** + ********************* Local Data ***************************** + ********************************************************************/ + +static uHash *pages = NULL; + +static const char *notfound_page = +"<HTML>\n<HEAD><TITLE>Error 404: Not Found</TITLE></HEAD>\ +<BODY>The URI you requested could not be found</BODY>\n<HTML>\n"; + +static const char *notimplemented_page = +"<HTML>\n<HEAD><TITLE>Error 501: Not Implemented</TITLE></HEAD>\ +<BODY>The requested method is not implemented</BODY>\n<HTML>\n"; + +#define INITIAL_SIZE 16 + +/******************************************************************** + ********************* External Routines ********************** + ********************************************************************/ + + /*@@ + @routine HTTP_RequestGet + @date Wed Sep 13 20:10:24 2000 + @author Tom Goodale + @desc + Routine to deal with a GET request. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ + +int HTTP_RequestGET(cGH *cctkGH, httpRequest *request) +{ + httpPage *pagedata; + int retval; + char message[1024]; + + if((pagedata = FindPage(request->uri, &(request->residual)))) + { + retval = pagedata->function(cctkGH, request, pagedata->data); + } + else + { + retval = -1; + } + + if(retval < 0) + { + strcpy(message,"HTTP/1.0 404 Not Found\r\n"); + + write(request->filedes, message, strlen(message)); + + strcpy(message,"Content-Type: text/html\r\n\r\n"); + + write(request->filedes, message, strlen(message)); + + + write(request->filedes, notfound_page, strlen(notfound_page)); + } + + return retval; +} + + /*@@ + @routine HTTP_RequestUnsupported + @date Thu Sep 14 12:18:56 2000 + @author Tom Goodale + @desc + + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_RequestUnsupported(cGH *cctkGH, httpRequest *request) +{ + char message[1024]; + + strcpy(message,"HTTP/1.0 501 Not Implemented\r\n"); + + write(request->filedes, message, strlen(message)); + + strcpy(message,"Content-Type: text/html\r\n\r\n"); + + write(request->filedes, message, strlen(message)); + + + write(request->filedes, notimplemented_page, strlen(notimplemented_page)); + + return 0; +} + + /*@@ + @routine HTTP_RegisterPage + @date Wed Sep 13 20:10:24 2000 + @author Tom Goodale + @desc + Routine to register a web page. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_RegisterPage(const char *path, int (*function)(cGH *, httpRequest *, void *), void *data) +{ + int retval; + + httpPage *pagedata; + + /* Create the hash table if it's not already been created */ + if(! pages) + { + pages = Util_HashCreate(INITIAL_SIZE); + } + + if(Util_HashData(pages, strlen(path), path, 0)) + { + fprintf(stderr, "Page %s already exists\n", path); + retval = -1; + } + else + { + pagedata = CreatePageData(function, data); + + if(pagedata) + { + retval = Util_HashStore(pages, strlen(path), path, 0, (void *)pagedata); + } + else + { + retval = -2; + } + } + + return 0; +} + + +/******************************************************************** + ********************* Local Routines ************************* + ********************************************************************/ + + /*@@ + @routine CreatePageData + @date Wed Sep 13 20:10:24 2000 + @author Tom Goodale + @desc + Creates a httpPage structure. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static httpPage *CreatePageData(int (*function)(cGH *, httpRequest *, void *), void *data) +{ + httpPage *pagedata; + + pagedata = (httpPage *)malloc(sizeof(httpPage)); + + if(pagedata) + { + pagedata->function = function; + pagedata->data = data; + } + + return pagedata; +} + + /*@@ + @routine FindPage + @date Wed Sep 13 20:10:24 2000 + @author Tom Goodale + @desc + Finds a page, if it exists. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static httpPage *FindPage(char *path, char **residual) +{ + httpPage *pagedata; + char *position; + char *temp; + + pagedata = NULL; + + if(pages) + { + /* Check for index.html */ + if(path[strlen(path)-1] == '/') + { +#ifdef HTTP_DEBUG + printf("Looking for '%sindex.html'\n", path); +#endif + temp = (char *)malloc(sizeof(path)+11); + + sprintf(temp,"%sindex.html", path); + + pagedata = Util_HashData(pages, strlen(temp), temp, 0); + + *residual = NULL; + free(temp); + } + else + { +#ifdef HTTP_DEBUG + printf("Looking for '%s'\n", path); +#endif + /* Or exact path */ + pagedata = Util_HashData(pages, strlen(path), path, 0); + *residual = NULL; + } + + if(!pagedata) + { + /* Ok, now cycle through. Know it doesn't end with a slash */ + for(position = path+strlen(path)-1; position >= path; position--) + { + if(*position == '/') + { +#ifdef HTTP_DEBUG + printf("Looking for '%s' less '%s' \n", path, position); +#endif + if((pagedata = Util_HashData(pages, position-path, path, 0))) + { + *residual = position+1; + break; + } + } + } + } + } + else + { + pagedata = NULL; + } + + return pagedata; +} diff --git a/src/Sockets.c b/src/Sockets.c new file mode 100644 index 0000000..6643ffd --- /dev/null +++ b/src/Sockets.c @@ -0,0 +1,241 @@ + /*@@ + @file Sockets.c + @date Wed Sep 13 20:39:15 2000 + @author Tom Goodale + @desc + Routines which deal with sockets. + These should probably move into thorn Socket at some point if + they aren't already there. + @enddesc + @version $Header$ + @@*/ + +#include <stdio.h> +#include <errno.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netdb.h> +#include <arpa/inet.h> +#include <sys/time.h> +#include <sys/types.h> + +#include "cctk.h" + +#include "httpd.h" + +static char *rcsid = "$Header$"; + +CCTK_FILEVERSION(DevThorns_httpd_Socket_c) + +/******************************************************************** + ********************* Local Data Types *********************** + ********************************************************************/ + +/******************************************************************** + ********************* Local Routine Prototypes ********************* + ********************************************************************/ + +int HTTP_MakeSocket (uint16_t port); + +/******************************************************************** + ********************* Other Routine Prototypes ********************* + ********************************************************************/ + +/******************************************************************** + ********************* Local Data ***************************** + ********************************************************************/ + +/* Active file descriptors */ +static fd_set active_fd_set; + +/* Main server socket */ +static int sock; + +/******************************************************************** + ********************* External Routines ********************** + ********************************************************************/ + + + /*@@ + @routine HTTP_SetupServer + @date Wed Sep 13 20:39:15 2000 + @author Tom Goodale + @desc + Creates a socket to listen on. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_SetupServer(int port, int queue_size) +{ + /* Create the socket and set it up to accept connections. */ + sock = HTTP_MakeSocket (port); + if (listen (sock, queue_size) < 0) + { + perror ("listen"); + exit (EXIT_FAILURE); + } + + /* Initialize the set of active sockets. */ + FD_ZERO (&active_fd_set); + FD_SET (sock, &active_fd_set); + + return 0; +} + + /*@@ + @routine HTTP_ShutdownServer + @date Wed Sep 13 20:39:15 2000 + @author Tom Goodale + @desc + Closes all sockets we are interested in. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_ShutdownServer(void) +{ + int i; + + /* Close all sockets in our active set */ + for(i = FD_SETSIZE-1; i >=0; i--) + { + if(FD_ISSET(i, &active_fd_set)) + { + close(i); + } + } + + return 0; +} + + /*@@ + @routine HTTP_Poll + @date Wed Sep 13 20:39:15 2000 + @author Tom Goodale + @desc + Main workhorse routine. + Looks for activity on any of the sockets which are open + and dispatches work. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_Poll(cGH *cctkGH, long sec, long usec) +{ + int i; + size_t size; + fd_set read_fd_set; + + struct sockaddr_in clientname; + struct timeval timeout; + + timeout.tv_sec = sec; + timeout.tv_usec = usec; + + /* Block until input arrives on one or more active sockets. */ + read_fd_set = active_fd_set; + + if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, &timeout) < 0) + { + perror ("select"); + exit (EXIT_FAILURE); + } + + /* Service all the sockets with input pending. */ + for (i = 0; i < FD_SETSIZE; ++i) + { + if (FD_ISSET (i, &read_fd_set)) + { + if (i == sock) + { + /* Connection request on original socket. */ + int new; + size = sizeof (clientname); + new = accept (sock, + (struct sockaddr *) &clientname, + &size); + if (new < 0) + { + perror ("accept"); + exit (EXIT_FAILURE); + } + fprintf (stderr, + "Server: connect from host %s, port %hd.\n", + inet_ntoa (clientname.sin_addr), + ntohs (clientname.sin_port)); + FD_SET (new, &active_fd_set); + } + else + { + /* Data arriving on an already-connected socket. */ + if (HTTP_ReadFromClient (cctkGH, i) < 0) + { + close (i); + FD_CLR (i, &active_fd_set); + } + } + } + } + + return 0; +} + +/******************************************************************** + ********************* Local Routines ************************* + ********************************************************************/ + + /*@@ + @routine HTTP_MakeSocket + @date Wed Sep 13 20:39:15 2000 + @author Tom Goodale + @desc + Creates a socket. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_MakeSocket (uint16_t port) +{ + int sock; + struct sockaddr_in name; + + /* Create the socket. */ + sock = socket (PF_INET, SOCK_STREAM, 0); + if (sock < 0) + { + perror ("socket"); + exit (EXIT_FAILURE); + } + + /* Give the socket a name. */ + name.sin_family = AF_INET; + name.sin_port = htons (port); + name.sin_addr.s_addr = htonl (INADDR_ANY); + if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) + { + perror ("bind"); + exit (EXIT_FAILURE); + } + + return sock; +} diff --git a/src/Startup.c b/src/Startup.c new file mode 100644 index 0000000..ef2b4ba --- /dev/null +++ b/src/Startup.c @@ -0,0 +1,99 @@ + /*@@ + @file Startup.c + @date Wed Sep 13 21:26:56 2000 + @author Tom Goodale + @desc + + @enddesc + @version $Header$ + @@*/ + +#include <stdio.h> +#include <stdlib.h> + +#include "cctk.h" + +#include "cctk_Arguments.h" +#include "cctk_Parameters.h" + +#include "httpd.h" + +static char *rcsid = "$Header$"; + +CCTK_FILEVERSION(DevThorn_http_Startup_c) + + /*@@ + @routine HTTP_Startup + @date Wed Sep 13 21:26:56 2000 + @author Tom Goodale + @desc + Startup routine for the webserver. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_Startup(void) +{ + DECLARE_CCTK_PARAMETERS + + HTTP_RegisterPages(); + + HTTP_SetupServer(port, queue_length); + + if(standalone) + { + while(1) + { + HTTP_Poll(NULL, 10000,0); + } + } + + return 0; +} + + /*@@ + @routine HTTP_Work + @date Wed Sep 13 21:26:56 2000 + @author Tom Goodale + @desc + Main working routine for the webserver. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +void HTTP_Work(CCTK_ARGUMENTS) +{ + DECLARE_CCTK_ARGUMENTS + DECLARE_CCTK_PARAMETERS + + HTTP_Poll(cctkGH, timeout_seconds, timeout_useconds); +} + + /*@@ + @routine HTTP_Startup + @date Wed Sep 13 21:26:56 2000 + @author Tom Goodale + @desc + Shurdown routine for the webserver. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_Shutdown(void) +{ + HTTP_ShutdownServer(); + + return 0; +} diff --git a/src/http.c b/src/http.c new file mode 100644 index 0000000..ec3ea6f --- /dev/null +++ b/src/http.c @@ -0,0 +1,618 @@ + /*@@ + @file http.c + @date Wed Sep 13 20:44:31 2000 + @author Tom Goodale + @desc + Stuff to parse and deal with HTTP requests. + @enddesc + @version $Header$ + @@*/ +#include <stdio.h> +#include <stdio.h> +#include <stdlib.h> + +#include <string.h> + +#include "cctk.h" + +#include "util_String.h" + +#include "httpd.h" + +static char *rcsid = "$Header$"; + +CCTK_FILEVERSION(DevThorns_httpd_http_c) + +/******************************************************************** + ********************* Local Data Types *********************** + ********************************************************************/ + +struct httpHeader +{ + char *line; +}; + +/******************************************************************** + ********************* Local Routine Prototypes ********************* + ********************************************************************/ + +static char *NextLine(char *buffer, int *start, int size); +static int DealWithRequest(cGH *cctkGH, int filedes, char *buffer, int bufsize); +static int AddHeader(httpRequest *request, const char *line); + +static int StripArgs(httpRequest *request, char *request_uri); +static void Decode(char *string); +static int ClearRequest(httpRequest *request); + +static void DestroyHeader(struct httpHeader *header); + +/******************************************************************** + ********************* Other Routine Prototypes ********************* + ********************************************************************/ + +/******************************************************************** + ********************* Local Data ***************************** + ********************************************************************/ + +#define INITIAL_SIZE 16 +#define MAXMSG 2048 + +/******************************************************************** + ********************* External Routines ********************** + ********************************************************************/ + + /*@@ + @routine HTTP_ReadFromClient + @date Wed Sep 13 20:44:31 2000 + @author Tom Goodale + @desc + Reads a request from a client socket. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +int HTTP_ReadFromClient(cGH *cctkGH, int filedes) +{ + char buffer[MAXMSG]; + int nbytes; + + nbytes = read (filedes, buffer, MAXMSG); + if (nbytes < 0) + { + /* Read error. */ + perror ("read"); + exit (EXIT_FAILURE); + } + else if (nbytes == 0) + /* End-of-file. */ + return -1; + else + { + /* Data read. */ +#ifdef HTTP_DEBUG + fprintf (stderr, "Server: got message: `%s'\n", buffer); +#endif + } + + if(nbytes > 0) + { + DealWithRequest(cctkGH, filedes, buffer, nbytes); + } + + return -1; +} + + /*@@ + @routine HTTP_ArgumentValue + @date Thu Sep 14 16:40:11 2000 + @author Tom Goodale + @desc + Returns the value (if any) of an argument. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +const char *HTTP_ArgumentValue(const httpRequest *request, const char *arg) +{ + const char *value; + + if(request->arguments) + { + value = Util_HashData(request->arguments, strlen(arg), arg, 0); + } + else + { + value = NULL; + } + + return value; +} + + /*@@ + @routine HTTP_HeaderValue + @date Thu Sep 14 19:55:04 2000 + @author Tom Goodale + @desc + Gets the value of an HTTP header line. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +const char *HTTP_HeaderValue(const httpRequest *request, const char *header) +{ + struct httpHeader *header_line; + const char *value; + + if(request->headers) + { + header_line = Util_HashData(request->headers, strlen(header), header, 0); + + if(header_line) + { + value = header_line->line; + } + else + { + value = NULL; + } + } + else + { + value = NULL; + } + + return value; +} + +/******************************************************************** + ********************* Local Routines ************************* + ********************************************************************/ + + /*@@ + @routine NextLine + @date Wed Sep 13 20:44:31 2000 + @author Tom Goodale + @desc + Gets the next line from an HTTP header. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static char *NextLine(char *buffer, int *start, int size) +{ + char *line; + int found; + char *pos; + + found = 0; + for(pos = buffer + *start; pos-buffer < size-1; pos++) + { + if(*pos == '\r' && *(pos+1) == '\n') + { + *pos = 0; + found = 1; + break; + } + } + + if(found) + { + line = buffer + *start; + *start = pos-buffer+2; + } + else + { + line = NULL; + *start = size+1; + } + + return line; +} + + /*@@ + @routine DealWithRequest + @date Wed Sep 13 20:44:31 2000 + @author Tom Goodale + @desc + Takes an http request buffer and deals with it. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static int DealWithRequest(cGH *cctkGH, int filedes, char *buffer, int bufsize) +{ + char *line; + char *tmp; + int size; + int start; + char *token; + char *method; + char *request_uri; + char *http_version; + httpRequest request; + + request.filedes = filedes; + + tmp = buffer; + +#ifdef HTTP_DEBUG + printf("Dealing with request\n"); +#endif + + start = 0; + + line = NextLine(tmp, &start, bufsize); + + method = NULL; + request_uri = NULL; + http_version = NULL; + + if(line) + { + method = line; + + for(; *line; line++) + { + if(*line == ' ') + { + *line = 0; + line++; + if(!request_uri) + { + request_uri = line; + } + else + { + http_version = line; + break; + } + } + } + } + + if(method) + { + printf("Method: %s\n", method); + + request.method = method; + } + else + { + request.method = NULL; + } + + request.n_arguments = 0; + if(request_uri) + { + printf("URI: %s\n", request_uri); + + request.uri = request_uri; + StripArgs(&request, request.uri); + } + else + { + request.uri = NULL; + request.arguments=NULL; + } + + if(http_version) + { + printf("HTTP: %s\n", http_version); + + sscanf(http_version, "%*5s%d%*1[.]%d", &(request.http_major_version), + &(request.http_minor_version)); + } + else + { + request.http_major_version = 0; + request.http_minor_version = 90; + } + +#ifdef HTTP_DEBUG + printf("HTTP Major version: %d\n", request.http_major_version); + printf("HTTP Minor version: %d\n", request.http_minor_version); +#endif + +#ifdef HTTP_DEBUG + printf("Start of request header\n"); +#endif + + request.body = NULL; + request.headers = NULL; + + while(line = NextLine(tmp, &start, bufsize)) + { + if(! request.body && *line != 0) + { + AddHeader(&request, line); + } + +#ifdef HTTP_DEBUG + if(line) + { + printf("Line is '%s'\n", line); + } +#endif + + if(*line == 0) + { +#ifdef HTTP_DEBUG + printf("End of request header\n"); + + printf("Start of request body\n"); +#endif + request.body = line + 2; + } + } + +#ifdef HTTP_DEBUG + printf("End of request body\n"); +#endif + + request.body_length = buffer + bufsize - request.body; + + printf("Replying...\n"); + + if(!strcmp(request.method, "GET")) + { + HTTP_RequestGET(cctkGH, &request); + } + else + { + HTTP_RequestUnsupported(cctkGH, &request); + } + +#ifdef HTTP_DEBUG + printf("Dealt with.\n"); +#endif + + ClearRequest(&request); + + return 0; +} + + + + /*@@ + @routine AddHeader + @date Wed Sep 13 20:44:31 2000 + @author Tom Goodale + @desc + Stores an HTTP header line on a request. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static int AddHeader(httpRequest *request, const char *line) +{ + int keylength; + char *value; + char *temp; + struct httpHeader *header_line; + + /* Split the string */ + value = strchr(line, ':'); + + if(value) + { + keylength = value - line; + + value++; + + /* Strip off leading whitespace */ + for(; *value && (*value == ' ' || *value == '\t') ; value++); + } + else + { + fprintf(stderr, "Invalid header line '%s'\n", line); + } + + if(value) + { + if(!request->headers) + { + /* Need to create the hash table */ + request->headers = Util_HashCreate(INITIAL_SIZE); + } + + if(request->headers) + { + /* Does the line already exist ? */ + header_line = (struct httpHeader *)Util_HashData(request->headers, keylength, line, 0); + + if(header_line) + { + temp = (char *)realloc(header_line->line, strlen(header_line->line)+strlen(value)+2); + + if(temp) + { + header_line->line = temp; + sprintf(header_line->line,"%s,%s", header_line->line,value); + } + else + { + fprintf(stderr, "Out of memory !\n"); + } + } + else + { + /* Ok, must create it */ + header_line = (struct httpHeader *)malloc(sizeof(struct httpHeader)); + + if(header_line) + { + header_line->line = (char *)malloc(strlen(value)+1); + + if(header_line->line) + { + strcpy(header_line->line, value); + + Util_HashStore(request->headers, keylength, line, 0, (void *)header_line); + } + } + } + } + } + + return 0; +} + + /*@@ + @routine StripArgs + @date Thu Sep 14 16:36:56 2000 + @author Tom Goodale + @desc + Strips the arguments for a submitted URI from the + URI and decodes any HTTP encodings. + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static int StripArgs(httpRequest *request, char *request_uri) +{ + char *position; + char *token; + char *value; + char *storable; + + /* Do we have arguments ? */ + if((position = strchr(request_uri, '?'))) + { + /* Mark the end of the URI */ + *position = 0; + + /* Create the hash table */ + request->arguments = Util_HashCreate(INITIAL_SIZE); + + /* Parse the argument list */ + *position++; + + token = strtok(position, "&"); + + do + { + value = strchr(token, '='); + *value = 0; + + value++; + + /* Remove any encoding in the token and value */ + Decode(token); + Decode(value); + + storable = Util_Strdup(value); + + if(Util_HashData(request->arguments, strlen(token), token, 0)) + { +#ifdef HTTP_DEBUG + fprintf(stderr, "Ignoring duplicate argument '%s'\n", token); +#endif + } + else + { + Util_HashStore(request->arguments, strlen(token), token, 0, (void *)storable); + request->n_arguments++; + } + + } while(token=strtok(NULL, "&")); + } + else + { + request->arguments = NULL; + } + + /* Finally remove any encoding in the URI */ + Decode(request_uri); + + return 0; +} + +static int ClearRequest(httpRequest *request) +{ + if(request->arguments) + { + Util_HashDestroy(request->arguments, (void (*)(void *))free); + } + + if(request->headers) + { + Util_HashDestroy(request->headers, (void (*)(void *))DestroyHeader); + } + + return 0; +} + + /*@@ + @routine Decode + @date Thu Sep 14 16:25:25 2000 + @author Tom Goodale + @desc + Decode HTTP encodings - + + -> ' ' + %2-bytehexadecimal -> ascii + @enddesc + @calls + @calledby + @history + + @endhistory + +@@*/ +static void Decode(char *string) +{ + char *position; + char *to; + char hexadecimal[3]; + + hexadecimal[3] = 0; + + for(position=string, to=position; *position; position++, to++) + { + switch(*position) + { + case '+' : *to = ' '; break; + case '%' : hexadecimal[0] = *(position+1); + hexadecimal[1] = *(position+2); + position += 2; + *to = strtol(hexadecimal, NULL, 16); + break; + default : *to = *position; + } + } + + *to = 0; +} + +static void DestroyHeader(struct httpHeader *header) +{ + free(header->line); + free(header); +} diff --git a/src/http_Request.h b/src/http_Request.h new file mode 100644 index 0000000..1ff2412 --- /dev/null +++ b/src/http_Request.h @@ -0,0 +1,51 @@ + /*@@ + @header http_Request.h + @date Wed Sep 13 23:49:30 2000 + @author Tom Goodale + @desc + + @enddesc + @version $Header$ + @@*/ + +#include "util_Hash.h" + +#ifndef __HTTP_REQUEST_H__ +#define __HTTP_REQUEST_H__ 1 + +typedef struct +{ + int filedes; + char *body; + int body_length; + + char *method; + char *uri; + char *residual; + + int http_major_version; + int http_minor_version; + + int n_arguments; + + uHash *arguments; + uHash *headers; + +} httpRequest; + +#ifdef __cplusplus +extern "C" +{ +#endif + +int HTTP_RegisterPage(const char *path, int (*function)(cGH *, httpRequest *, void *), void *data); + +const char *HTTP_ArgumentValue(const httpRequest *request, const char *arg); + +const char *HTTP_HeaderValue(const httpRequest *request, const char *header); + +#ifdef __cplusplus +} +#endif + +#endif /* __HTTP_REQUEST_H__ */ diff --git a/src/httpd.h b/src/httpd.h new file mode 100644 index 0000000..50d0eb2 --- /dev/null +++ b/src/httpd.h @@ -0,0 +1,37 @@ + /*@@ + @header httpd.h + @date Wed Sep 13 20:15:23 2000 + @author Tom Goodale + @desc + + @enddesc + @version $Header$ + @@*/ + +#include "http_Request.h" + +#ifndef __HTTP_H__ +#define __HTTP_H__ 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +int HTTP_ReadFromClient (cGH *cctkGH, int filedes); + + +int HTTP_SetupServer(int port, int queue_size); +int HTTP_ShutdownServer(void); + +int HTTP_Poll(cGH *cctkGH, long sec, long usec); + +/* Request stuff */ +int HTTP_RequestGET(cGH *cctkGH, httpRequest *request); +int HTTP_RequestUnsupported(cGH *cctkGH, httpRequest *request); + +#ifdef __cplusplus +} +#endif + +#endif /* __HTTP_H__ */ diff --git a/src/images/wwwcactuscodeorg.h b/src/images/wwwcactuscodeorg.h new file mode 100644 index 0000000..45a51f5 --- /dev/null +++ b/src/images/wwwcactuscodeorg.h @@ -0,0 +1,1053 @@ +#ifndef __wwwcactuscodeorg_H_ +#define __wwwcactuscodeorg_H_ + +/* + Header created from wwwcactuscodeorg.jpg by ImageEncode + Source code in $TOP/DevThorns/HTTPD/src/ImageEncode.cc +*/ + +static char wwwcactuscodeorg[]={0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49, + 0x46,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0xFF, + 0xDB,0x00,0x43,0x00,0x05,0x03,0x04,0x04,0x04,0x03,0x05,0x04, + 0x04,0x04,0x05,0x05,0x05,0x06,0x07,0x0C,0x08,0x07,0x07,0x07, + 0x07,0x0F,0x0B,0x0B,0x09,0x0C,0x11,0x0F,0x12,0x12,0x11,0x0F, + 0x11,0x11,0x13,0x16,0x1C,0x17,0x13,0x14,0x1A,0x15,0x11,0x11, + 0x18,0x21,0x18,0x1A,0x1D,0x1D,0x1F,0x1F,0x1F,0x13,0x17,0x22, + 0x24,0x22,0x1E,0x24,0x1C,0x1E,0x1F,0x1E,0xFF,0xDB,0x00,0x43, + 0x01,0x05,0x05,0x05,0x07,0x06,0x07,0x0E,0x08,0x08,0x0E,0x1E, + 0x14,0x11,0x14,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0xFF,0xC0,0x00,0x11,0x08,0x00,0x74, + 0x02,0x66,0x03,0x01,0x22,0x00,0x02,0x11,0x01,0x03,0x11,0x01, + 0xFF,0xC4,0x00,0x1C,0x00,0x01,0x00,0x03,0x01,0x01,0x01,0x01, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06, + 0x07,0x04,0x03,0x02,0x01,0x08,0xFF,0xC4,0x00,0x44,0x10,0x00, + 0x01,0x03,0x03,0x03,0x01,0x05,0x05,0x05,0x04,0x09,0x03,0x04, + 0x03,0x00,0x00,0x01,0x02,0x03,0x04,0x00,0x05,0x11,0x06,0x12, + 0x21,0x31,0x07,0x13,0x41,0x51,0x61,0x14,0x22,0x32,0x71,0x81, + 0x15,0x23,0x91,0xA1,0xB1,0x42,0x52,0xC1,0xF0,0x08,0x16,0x24, + 0x33,0x62,0x72,0x92,0xD1,0xE1,0x17,0x82,0xA2,0x26,0x43,0x44, + 0xF1,0x73,0xB2,0xB3,0xFF,0xC4,0x00,0x1A,0x01,0x01,0x00,0x02, + 0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0xFF,0xC4,0x00,0x34, + 0x11,0x00,0x02,0x01,0x02,0x04,0x03,0x06,0x06,0x02,0x02,0x02, + 0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x11,0x04,0x12, + 0x21,0x31,0x05,0x41,0x51,0x06,0x13,0x61,0x71,0x81,0x91,0xA1, + 0xB1,0xC1,0xD1,0xE1,0xF0,0x22,0x32,0x15,0x16,0x23,0x42,0x52, + 0x62,0xF1,0xFF,0xDA,0x00,0x0C,0x03,0x01,0x00,0x02,0x11,0x03, + 0x11,0x00,0x3F,0x00,0xFE,0xCB,0xA5,0x29,0x40,0x29,0x4A,0x50, + 0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A, + 0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29, + 0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40, + 0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29, + 0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5, + 0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00, + 0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5, + 0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94, + 0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02, + 0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94, + 0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52, + 0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A, + 0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50, + 0x0A,0x57,0xC3,0xEE,0xB6,0xC3,0x2A,0x75,0xD5,0x84,0x21,0x03, + 0x2A,0x51,0xF0,0xAA,0xFC,0x8B,0xE4,0xE9,0x4A,0x29,0xB5,0x43, + 0x25,0xB1,0xFF,0x00,0xBA,0xE0,0xEB,0xF2,0xCF,0x15,0xA3,0x8D, + 0xE2,0x38,0x7C,0x12,0x4E,0xAC,0xB5,0x7B,0x2E,0x63,0x72,0xC7, + 0x4A,0xAB,0x7F,0xEA,0x35,0x80,0xB5,0x4C,0x42,0x09,0xFD,0x9E, + 0x06,0x3F,0x01,0x5E,0x66,0x46,0xA6,0x65,0x5B,0x52,0xB0,0xF0, + 0xF3,0x01,0x24,0x7E,0x60,0x1A,0xE4,0xAE,0xD3,0xE1,0xAF,0xAC, + 0x25,0xEC,0xBE,0xE5,0xB2,0x4B,0xA1,0x6D,0xA5,0x41,0xD9,0xAF, + 0x6A,0x79,0xF3,0x0A,0xE0,0x84,0xB1,0x2B,0xF6,0x7C,0x97,0xFF, + 0x00,0x35,0x36,0x14,0x0F,0x43,0x5D,0xBC,0x2E,0x2E,0x96,0x2A, + 0x9A,0xA9,0x49,0xDD,0x15,0x3F,0x69,0x4A,0x56,0xC8,0x14,0xA5, + 0x28,0x05,0x29,0x4A,0x01,0x4A,0x52,0x80,0x52,0x94,0xA0,0x14, + 0xA5,0x28,0x05,0x29,0x4A,0x01,0x4A,0x52,0x80,0x52,0xBC,0xE4, + 0x3C,0xD4,0x76,0x54,0xF3,0xEB,0x08,0x6D,0x23,0x25,0x46,0xAB, + 0xEF,0x5F,0x2E,0x12,0xC9,0xFB,0x2E,0x19,0x0D,0x8E,0x8E,0x38, + 0x39,0x57,0xCB,0x3C,0x7E,0xB5,0xA3,0x8D,0xE2,0x58,0x7C,0x12, + 0x5D,0xEC,0xB5,0x7C,0xB9,0x8B,0x5C,0xB2,0x52,0xAA,0xBF,0xFA, + 0x8D,0x60,0x29,0x53,0x50,0x82,0x47,0xC2,0x70,0x31,0xF8,0x0A, + 0xF8,0xF6,0x9D,0x4C,0xD2,0xF6,0xA4,0x87,0x92,0x3C,0x70,0x92, + 0x3F,0x81,0xAE,0x4A,0xED,0x3E,0x1A,0xFA,0xC2,0x5E,0xCB,0xEE, + 0x5B,0x2C,0xBA,0x16,0xDA,0x54,0x2D,0x92,0xF7,0xED,0x2E,0x98, + 0x73,0x92,0x18,0x98,0x9F,0x0F,0x05,0x8F,0x4F,0x5F,0x4F,0xE4, + 0x4C,0x85,0x03,0xD0,0xD7,0x73,0x0B,0x8A,0xA5,0x8A,0xA6,0xAA, + 0x52,0x77,0x4C,0xA9,0xFB,0x4A,0x52,0xB6,0x00,0xA5,0x29,0x40, + 0x29,0x5C,0xF7,0x09,0x8C,0x41,0x8A,0xA9,0x12,0x17,0xB5,0x03, + 0x80,0x07,0x55,0x1F,0x21,0xEB,0x50,0x2A,0xBE,0x5D,0xDF,0x56, + 0xC8,0xD6,0xDE,0xEF,0x3E,0x2B,0x07,0xF5,0x38,0x15,0xCE,0xC6, + 0xF1,0x5C,0x36,0x09,0xA8,0xD5,0x96,0xAF,0x97,0x30,0x95,0xCB, + 0x35,0x2A,0xBF,0x69,0xBD,0xBA,0x89,0x5E,0xC3,0x76,0x29,0x6D, + 0xE5,0x1C,0xA1,0x59,0x1E,0x3E,0x07,0x1D,0x3D,0x2A,0x7C,0x10, + 0x7A,0x1A,0xCD,0x83,0xC6,0xD2,0xC6,0x53,0xEF,0x29,0x3D,0x3E, + 0x2B,0xCC,0x1F,0xB4,0xA5,0x2B,0x6C,0x0A,0x52,0x94,0x02,0x94, + 0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02, + 0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94, + 0x02,0x94,0xA5,0x00,0xA5,0x2A,0x9D,0xAA,0x6F,0xEB,0x5C,0xE5, + 0x5A,0x62,0x4C,0x6A,0x06,0xC3,0x87,0x1F,0x79,0xCE,0xEB,0x72, + 0xBF,0x75,0x24,0xF4,0xFE,0x3F,0x2E,0xBA,0x78,0xDC,0x6D,0x3C, + 0x1D,0x3E,0xF2,0x7E,0x89,0x6E,0xD9,0x0D,0x97,0x1A,0x55,0x13, + 0xB9,0xD4,0x41,0xAC,0xFD,0xB4,0xDE,0xCC,0x75,0xF6,0x83,0xD3, + 0xCF,0x38,0xA8,0x24,0x5F,0xED,0xB2,0x66,0xAA,0xD3,0x2B,0x5B, + 0xDB,0xD5,0x29,0xB7,0x00,0x0D,0x26,0x50,0x74,0xEF,0x23,0xE1, + 0xCE,0x78,0x3F,0xE1,0xFA,0xF8,0xD7,0x0F,0xFD,0x9E,0x9B,0xBE, + 0x5A,0x52,0xB9,0x36,0x7D,0x0D,0x62,0x95,0x9F,0xBF,0x05,0xC6, + 0xE3,0x2D,0xE7,0xF5,0x16,0xD6,0x52,0x92,0xA5,0x29,0x4A,0x38, + 0x03,0xCF,0xE2,0xA8,0x3B,0x76,0xB4,0x82,0xEB,0x12,0x20,0x5A, + 0xF5,0x4C,0x17,0x23,0x25,0x60,0x2A,0x5A,0xDC,0xEE,0xD0,0x85, + 0x73,0x94,0x85,0x9E,0x87,0x3F,0xA5,0x5A,0x9F,0x69,0x61,0x3D, + 0x5D,0x27,0x6E,0xBB,0xEB,0xC8,0x86,0xDA,0xDC,0xD7,0x29,0x59, + 0xC8,0x93,0x75,0x11,0x7B,0xDF,0xEB,0x2C,0x4E,0xE3,0x1F,0xDE, + 0x7B,0x77,0x1C,0xFF,0x00,0x8A,0xBF,0x6D,0xEE,0xDD,0xE5,0xA7, + 0x74,0x1D,0x47,0x1A,0x4A,0x4F,0x8A,0x26,0xF7,0x9F,0xEF,0x51, + 0xFE,0xCF,0x4A,0xF6,0xEE,0xE4,0x35,0xE8,0x68,0xB4,0xAC,0xBE, + 0xF1,0x7B,0x36,0x39,0x2D,0xA2,0xFD,0xAC,0x20,0x41,0x2F,0xFB, + 0x81,0x0F,0x4D,0xF7,0x8E,0x78,0xE1,0x04,0x8C,0xFC,0xFC,0x3A, + 0xF9,0xD7,0x65,0xBE,0x2F,0xB6,0x44,0x4C,0x88,0x1A,0x91,0x2F, + 0x47,0x50,0xCA,0x56,0xD2,0x89,0x49,0xFF,0x00,0xCA,0xAB,0x3E, + 0xD4,0x53,0x8A,0xBF,0x74,0xED,0xE3,0xA1,0x36,0x97,0x43,0x44, + 0xA5,0x64,0xD2,0xF5,0x24,0x2B,0x06,0xA0,0x6A,0x13,0x1A,0x89, + 0x99,0x77,0x55,0x13,0xBA,0x26,0x0A,0x8E,0xDC,0x12,0x4A,0xB9, + 0xE0,0x71,0xD7,0xCF,0x15,0x21,0x6F,0xB8,0x5C,0xAE,0x05,0x4E, + 0xC2,0xD4,0xF0,0xA4,0x15,0x12,0x54,0x96,0xE6,0x83,0xB4,0xF9, + 0x6D,0x1F,0x0F,0xCB,0x03,0x15,0x75,0xDA,0x5A,0x79,0x53,0x74, + 0xE5,0xAF,0xCB,0xA9,0x17,0x77,0xB1,0xA4,0xD2,0xB3,0x66,0xE6, + 0x5C,0x1D,0x94,0x5A,0x6B,0x54,0xC3,0x5B,0xC3,0x92,0xDA,0x6E, + 0x19,0x23,0xFE,0xDA,0xFD,0xB8,0x4C,0xB9,0x44,0x8E,0xA7,0xE7, + 0x6A,0x88,0x71,0x59,0x40,0xCA,0x9C,0x76,0x7F,0x76,0x91,0xF3, + 0x3C,0x54,0x7F,0xB3,0xD2,0xBD,0xBB,0xA9,0x5C,0x6B,0xD0,0xD2, + 0x29,0x59,0x85,0x8E,0x74,0x2D,0x46,0x55,0x2A,0xDB,0xAB,0xA3, + 0x4B,0x78,0xFF,0x00,0x7B,0xDC,0xB9,0x92,0x3C,0x3C,0x0F,0x4E, + 0x38,0xF3,0x18,0x35,0xF5,0xA8,0x9D,0x85,0x61,0x86,0x99,0xD7, + 0xAD,0x56,0xC4,0x36,0x42,0x80,0x42,0xE4,0x2F,0x09,0x2A,0x3D, + 0x06,0x4A,0xBC,0x4E,0x2A,0x8F,0xB5,0x11,0xCD,0x95,0x52,0x77, + 0xF3,0xFC,0x13,0x69,0x6F,0x63,0x4D,0xA5,0x65,0xB1,0x75,0x4B, + 0xB7,0xAF,0x65,0x53,0x1A,0x92,0x0C,0x67,0x14,0xD0,0x53,0x4C, + 0x2E,0x57,0x72,0xE2,0xD2,0x46,0x77,0x14,0x1E,0x4E,0x6B,0xA6, + 0xE7,0x74,0xB8,0x5A,0x10,0x99,0x53,0xF5,0x2C,0x36,0x42,0x30, + 0xA4,0xA5,0xC9,0x83,0xDF,0xF4,0xDB,0xFB,0x59,0xF2,0xAC,0xF2, + 0xED,0x25,0x25,0x2B,0x2A,0x72,0xF6,0x22,0xFC,0xCD,0x26,0xBE, + 0x5D,0x71,0x0D,0x36,0xA7,0x1C,0x50,0x4A,0x10,0x0A,0x94,0xA3, + 0xD0,0x01,0x51,0x9A,0x72,0xF2,0xDD,0xE2,0x00,0x7C,0x36,0xA6, + 0xD6,0x93,0xB5,0x60,0x83,0x8C,0xFA,0x1F,0x11,0x51,0xBD,0xA1, + 0x4C,0x5B,0x56,0xE6,0x21,0xB5,0x9D,0xD2,0x57,0xC8,0x03,0xA8, + 0x4E,0x38,0xFC,0x48,0xAE,0xAD,0x7C,0x75,0x3A,0x78,0x47,0x89, + 0x8E,0xAA,0xD7,0x5F,0x4F,0x88,0xBE,0x97,0x3E,0x1D,0x96,0x6F, + 0x2B,0x54,0x97,0xB7,0x22,0xDE,0xC9,0xFB,0xB6,0xBC,0x5C,0x23, + 0xC4,0xFF,0x00,0xB7,0xF2,0x6A,0xBD,0xA1,0xEA,0xE9,0x16,0x78, + 0x0C,0xC6,0xB7,0x36,0x83,0x3E,0x51,0xEE,0xE3,0x35,0x9F,0x75, + 0x3E,0x6A,0x57,0xF8,0x40,0xC9,0x3F,0x2F,0x95,0x59,0xA1,0xAD, + 0x1F,0x67,0xC7,0x43,0x63,0xDC,0x28,0x0A,0x09,0x58,0xF0,0x23, + 0x8C,0xFD,0x31,0x58,0x87,0x69,0x77,0x76,0x5C,0xED,0x16,0x53, + 0x0D,0xBB,0x93,0x15,0x96,0x98,0x4A,0x01,0x04,0x36,0xB5,0x92, + 0x55,0xC7,0x81,0x20,0x23,0xF9,0x35,0xE0,0x28,0xD5,0x96,0x32, + 0xBB,0x9D,0x4F,0xE5,0x2D,0xFE,0xCB,0xC8,0xBC,0xAF,0x18,0x9D, + 0x82,0xD9,0xA8,0xA4,0xA4,0x4B,0x91,0xA9,0x6F,0xAB,0x79,0x5E, + 0xF0,0x31,0xD6,0x86,0x9B,0x4F,0x8F,0xB8,0x92,0x92,0x71,0xF3, + 0x26,0xA4,0x6C,0x5A,0xBA,0xF1,0x62,0x94,0x88,0x57,0xD9,0x4E, + 0x4D,0x82,0xA2,0x13,0xED,0x2F,0xA0,0x21,0xE6,0x49,0x3D,0x57, + 0x80,0x02,0x93,0xEA,0x00,0xC7,0x97,0x88,0xF3,0xB5,0xCE,0x72, + 0x5B,0xA9,0x43,0x7C,0x24,0x70,0x00,0xF0,0x15,0x63,0x99,0xA6, + 0xD3,0x76,0xB7,0x16,0x9E,0x4F,0x24,0x1D,0xAA,0xC7,0x23,0xFE, + 0x3D,0x2B,0xD5,0xD6,0xE0,0x77,0xA7,0xA4,0xAE,0xFA,0x59,0x5B, + 0xD3,0xA1,0x4B,0x1C,0x9A,0xD2,0x7B,0xB0,0x2F,0x91,0xA6,0x25, + 0x6F,0x2D,0x12,0x58,0xFE,0xF0,0xAB,0xDC,0x42,0x90,0xAE,0x00, + 0x1E,0x64,0x2F,0xFF,0x00,0x1A,0xD1,0xF4,0xF5,0xED,0x13,0xE2, + 0xB2,0xF8,0x23,0xEF,0x10,0x15,0x8F,0x2C,0x8A,0xC3,0x1B,0xD0, + 0xF7,0x64,0x5C,0xD0,0x27,0x49,0x98,0xB8,0xB1,0xB2,0x1A,0x6D, + 0x6E,0xEE,0x40,0x1D,0x3D,0xDF,0x1E,0x9E,0x7D,0x2A,0xDF,0x64, + 0x95,0x70,0x76,0x42,0x6D,0x36,0x44,0x72,0x8F,0x75,0xC7,0x40, + 0xF7,0x5B,0xF4,0x1F,0xEF,0xE1,0x58,0x38,0x6C,0x7F,0xC6,0x52, + 0x95,0x5A,0xDA,0x27,0xA5,0xB9,0xB6,0xBC,0x05,0xCD,0x95,0x2E, + 0xA0,0x20,0x15,0xAD,0x29,0x07,0xCC,0xE2,0xBD,0x01,0x0A,0x00, + 0x82,0x08,0x3D,0x08,0xAC,0x85,0xDB,0x96,0x90,0x87,0x7D,0x4D, + 0x96,0xF3,0xAC,0xE0,0xFD,0xB0,0xE9,0x4A,0x51,0x1B,0xDA,0x13, + 0xDE,0xA9,0x4A,0xE8,0x30,0x72,0x49,0x3E,0x15,0x38,0xA7,0x9F, + 0xD3,0x4B,0x4C,0xD8,0xD2,0xBB,0xE8,0x8A,0x50,0x4B,0x8D,0x2F, + 0x80,0x73,0xD3,0xEB,0xE4,0x6A,0x21,0xDA,0x65,0xDE,0x28,0xD4, + 0xA4,0xD4,0x5F,0x3B,0xFD,0x2C,0x4B,0x4D,0x6A,0xD1,0xA1,0x52, + 0xA3,0x20,0xDF,0x2D,0xF2,0xAD,0xBF,0x68,0x21,0xF4,0xA5,0x80, + 0x32,0xB2,0xAE,0x36,0x1F,0x10,0x7D,0x6A,0x06,0x6C,0xEB,0x95, + 0xE4,0x29,0xC6,0x5F,0xFB,0x3A,0xDA,0x07,0x0B,0x57,0x0A,0x58, + 0xF3,0x3F,0xED,0x9F,0xC6,0xBA,0xF8,0xDE,0x2D,0x43,0x09,0x4D, + 0x4D,0xBB,0xB9,0x6C,0x97,0x3F,0xC1,0x17,0x2D,0xEA,0x75,0xB4, + 0xAB,0x6A,0x9C,0x40,0x3E,0x44,0xD7,0xD5,0x64,0x6C,0xDD,0x34, + 0x4B,0xD7,0x63,0x66,0x6F,0x53,0xB2,0xF5,0xD0,0x12,0x14,0xCA, + 0x14,0x37,0x67,0x19,0x3C,0x63,0xCB,0x9F,0x95,0x4C,0xC4,0xB8, + 0xBD,0xA7,0x9C,0x4B,0xCD,0xCB,0x12,0xE1,0x29,0x5B,0x5C,0x6C, + 0x82,0x9C,0x7C,0x81,0xF1,0xFD,0x6B,0x93,0x4B,0xB4,0xAB,0xBD, + 0x50,0xAD,0x49,0xC5,0x3E,0x77,0xFC,0x0B,0xD8,0xBF,0x4B,0x90, + 0xCC,0x58,0xEB,0x91,0x21,0xC0,0xDB,0x68,0x19,0x52,0x8D,0x41, + 0xDB,0xF5,0x28,0x76,0x79,0x6A,0x64,0x65,0x45,0x61,0xD3,0xF7, + 0x0E,0x2C,0x11,0x9F,0xF3,0x78,0x73,0xE9,0xFF,0x00,0x35,0x14, + 0x95,0x4C,0xBE,0xAD,0x13,0xA7,0xBA,0x86,0xA1,0x67,0x7B,0x31, + 0xC1,0xC8,0xF4,0xCF,0x9F,0xFC,0x9E,0x9D,0x2A,0x37,0x52,0x5B, + 0x6E,0x57,0x2B,0xE4,0x79,0x31,0x5D,0x6D,0x31,0x5A,0x8C,0xB6, + 0xD4,0x87,0x1D,0xDB,0xEF,0x15,0x20,0x83,0x8F,0x90,0x3C,0xD6, + 0x96,0x2F,0xB4,0x93,0x95,0x75,0xDC,0x69,0x18,0xF5,0xFF,0x00, + 0xB7,0xD9,0x7E,0xF9,0x4E,0x56,0xD5,0xCD,0x22,0x95,0x97,0x45, + 0xBB,0x4A,0x99,0x29,0xDB,0x1C,0x8B,0xEB,0x11,0xDC,0x84,0x79, + 0xDA,0xBE,0xA7,0x03,0x8C,0xE4,0x74,0x0A,0x4F,0x1F,0xE2,0xAE, + 0xD9,0xA2,0x4D,0xA6,0x13,0xB7,0x47,0x2F,0xE4,0xA2,0x32,0x7B, + 0xC5,0x64,0x92,0x30,0x3E,0xB5,0xD0,0x7D,0xA6,0xA7,0x75,0x6A, + 0x6E,0xCC,0x8B,0xB3,0x44,0xA5,0x67,0x92,0x75,0x38,0xBC,0x21, + 0x2C,0xBB,0x71,0x66,0xD4,0x86,0xD0,0x14,0xA5,0x2D,0x7B,0x77, + 0xAB,0xA1,0xC1,0xC8,0xE3,0x91,0xF8,0xD7,0xDB,0x30,0x9E,0x7B, + 0xFB,0xAD,0x44,0xA5,0xE4,0x64,0x61,0x47,0x9F,0xFC,0xA9,0x5B, + 0xB4,0xD4,0x61,0x3C,0xB0,0x83,0x92,0xEB,0xB0,0x4E,0xFB,0x1A, + 0x05,0x7E,0x29,0x49,0x4A,0x77,0x28,0x84,0x81,0xE2,0x4D,0x52, + 0x6C,0x7A,0xE6,0x2B,0x96,0xF5,0xA5,0xE2,0x64,0x48,0x41,0xD8, + 0xD1,0x40,0xFE,0xF8,0xE7,0x1F,0x43,0x9E,0xBF,0xC8,0xA8,0xAD, + 0x51,0x71,0xB5,0x5B,0xDB,0x45,0xCF,0x59,0xEA,0x48,0xB6,0xC6, + 0xDE,0x38,0x42,0x1C,0x70,0x21,0x29,0x3E,0x00,0x13,0xE8,0x0F, + 0x87,0x9F,0x5A,0xCF,0x89,0xED,0x05,0x0A,0x70,0x8F,0x74,0xB3, + 0x4A,0x5C,0xBA,0x79,0x92,0xB5,0xD8,0xD2,0xD0,0xB4,0x2C,0x65, + 0x0A,0x4A,0x87,0xA1,0xCD,0x7C,0xBE,0xEB,0x6C,0x32,0xB7,0x9D, + 0x58,0x43,0x68,0x1B,0x94,0x4F,0x80,0xAC,0xCE,0xCF,0xF6,0x1D, + 0xE2,0x2A,0x6E,0x1A,0x6F,0x51,0x35,0x21,0x93,0x90,0x97,0x5B, + 0x56,0xE0,0x48,0xF2,0x23,0x15,0xF9,0x37,0x55,0x3B,0x73,0xB6, + 0x37,0x6C,0x53,0xCD,0xAD,0x69,0x7B,0x63,0x8F,0x05,0x70,0xBD, + 0xA7,0x18,0x3E,0xA0,0xF5,0xF9,0x56,0xBC,0x3B,0x48,0xB2,0x49, + 0xD4,0xA6,0xE3,0x24,0xB4,0xE6,0x9B,0xE9,0xB6,0x85,0x5B,0xB6, + 0xE5,0x91,0xE9,0x5F,0x6B,0x2B,0xDB,0x25,0x25,0x49,0x84,0x85, + 0x7D,0xC3,0x3E,0x2B,0x3F,0xBC,0x7C,0xFE,0x5F,0xC9,0xA8,0xF6, + 0x8F,0xAC,0x26,0x5A,0xA3,0xC6,0x81,0x6A,0x0D,0x7D,0xA5,0x35, + 0x45,0x2C,0x21,0x64,0x84,0x36,0x91,0xF1,0x38,0xAC,0x72,0x42, + 0x47,0xE3,0xC0,0xE3,0x39,0xA9,0xE7,0x5E,0x77,0xBB,0x69,0xB4, + 0x20,0x20,0x36,0x81,0xEE,0x83,0x90,0x32,0x3F,0x91,0xF4,0xAC, + 0x5B,0x5A,0xDD,0x8B,0xFD,0xA0,0xCE,0x2E,0xA0,0xA0,0xB5,0xDD, + 0x43,0x4F,0xBC,0x4F,0x1F,0x12,0x88,0x1E,0x19,0xDC,0x9F,0xF4, + 0xD7,0x95,0xA7,0x1A,0x98,0xDC,0x43,0x9D,0x57,0x79,0x6F,0xF6, + 0x5E,0x45,0xB3,0x59,0x59,0x12,0xC2,0xDD,0xA8,0xDE,0x48,0x96, + 0xFE,0xA6,0xD4,0x0E,0xBE,0xAF,0x7B,0x7B,0x4E,0x36,0xDA,0x07, + 0x8F,0xBA,0x8D,0xA7,0x8F,0x2C,0xE7,0xE6,0x6A,0x46,0xC1,0xAB, + 0xAE,0x96,0x99,0xCD,0xC0,0xD4,0x0F,0x39,0x36,0x32,0xD4,0x10, + 0x89,0x6E,0x20,0x21,0xD6,0x89,0xE9,0xDE,0x01,0x80,0x41,0x3F, + 0xB4,0x00,0xC7,0x88,0xC7,0x23,0xCE,0xD7,0x39,0xD9,0xAF,0x04, + 0xA4,0xF1,0xD0,0x62,0xAC,0x17,0x2D,0x2E,0x9B,0xC5,0xB4,0xB4, + 0xF2,0x70,0xBD,0xA4,0x25,0x58,0xE9,0xE9,0xF2,0xAF,0x5F,0x5F, + 0x81,0xDE,0x9F,0xF1,0x95,0xDF,0x47,0x6F,0x87,0x42,0x0E,0x6D, + 0x6B,0x70,0x55,0x9B,0x53,0xC6,0x73,0xDA,0x8A,0xD5,0x29,0x80, + 0xF3,0x69,0xF0,0x49,0x6D,0x40,0x13,0x9F,0x5D,0xC8,0xFC,0x2B, + 0x4A,0xB1,0xDE,0x1B,0x9A,0xC3,0x6E,0xA1,0x59,0x0B,0x48,0x50, + 0xE7,0xC0,0x8A,0xC1,0xE3,0x68,0x9B,0xB2,0x6E,0xA1,0xCB,0x94, + 0xA9,0xAE,0xB3,0x1D,0x25,0x0D,0x87,0x9D,0xDE,0x02,0x49,0x19, + 0x09,0x3D,0x70,0x76,0x8E,0x49,0xAB,0x95,0x92,0x4D,0xC6,0x5B, + 0xBF,0x66,0xD9,0x7D,0xC6,0xDA,0x18,0x75,0xF1,0xC0,0x48,0x1E, + 0x09,0x3E,0x9E,0x75,0x8B,0x03,0x25,0xC3,0x69,0x4E,0xAD,0x5D, + 0x13,0xB5,0x97,0x36,0xD7,0x44,0x42,0x36,0x30,0xF3,0x61,0x20, + 0xAD,0x69,0x4E,0x7C,0xCE,0x2B,0xD0,0x10,0x46,0x47,0x22,0xB1, + 0xFB,0xA5,0xCF,0x47,0x58,0xE4,0x88,0xBA,0x87,0x56,0x47,0x62, + 0x62,0xF9,0xC2,0xD7,0x82,0x7F,0x10,0x73,0xF8,0xD4,0xC5,0xB9, + 0xD7,0xA2,0xB2,0x2E,0x16,0x3B,0xAA,0x25,0x30,0x13,0xDE,0x14, + 0x73,0xB5,0x49,0xEB,0xD3,0xC7,0x8F,0x11,0x54,0x8F,0x69,0xAD, + 0x25,0xDE,0x51,0x6A,0x2F,0x9D,0xFF,0x00,0x04,0xEA,0x8D,0x22, + 0x95,0x13,0x63,0xBE,0xC3,0xBA,0xC4,0xEF,0x9B,0x50,0x42,0xD1, + 0xFD,0xEB,0x6A,0x3C,0xA0,0xFF,0x00,0xB7,0xAD,0x45,0xDC,0xAE, + 0x52,0xAF,0x0B,0x53,0x16,0xB7,0xFD,0x9E,0x12,0x09,0x0E,0x49, + 0xE8,0x57,0xFE,0x5F,0x4F,0x5F,0x1A,0xEC,0x62,0xF8,0xAE,0x1F, + 0x0D,0x41,0x56,0x6E,0xE9,0xED,0x6E,0x7F,0xBC,0xC9,0xDF,0x63, + 0xA3,0x5A,0x41,0x5B,0xF1,0xFD,0xB2,0x3C,0xB0,0xD4,0x88,0xC8, + 0x2A,0x4A,0x54,0x41,0x18,0xEB,0x90,0x0F,0x8F,0xEB,0x8A,0xAB, + 0xE9,0x8B,0x95,0xF1,0xF4,0x49,0x66,0xEB,0x3D,0x12,0x9C,0x42, + 0xF2,0xDB,0x8D,0x31,0xDC,0xA7,0x61,0xE8,0x36,0xEE,0x39,0x23, + 0x9E,0x73,0x5C,0x77,0xA9,0x9A,0x3A,0xCC,0xB6,0xD8,0xBC,0x6A, + 0x98,0xD1,0x65,0x3C,0xB2,0x84,0x07,0x5C,0x09,0xDE,0xBF,0x20, + 0x0F,0x8D,0x77,0xDB,0x61,0x98,0x89,0x76,0x43,0x52,0x9A,0x92, + 0xC3,0xBB,0x36,0x2D,0x1E,0x3D,0x6B,0xC4,0x63,0xB1,0x2F,0x15, + 0x51,0xD5,0x54,0xF2,0xE6,0xF5,0xBF,0xAD,0x88,0xBB,0x4C,0xA9, + 0xCE,0xB8,0xFB,0x16,0xBC,0x94,0x97,0x17,0xCA,0x95,0x1C,0xF5, + 0xF9,0xD6,0xAD,0x6C,0xBA,0xA2,0x46,0x30,0xAA,0xFE,0x76,0xED, + 0x1E,0x72,0xE3,0xF6,0x8A,0xF6,0x0E,0x32,0x96,0x0F,0xE6,0xAA, + 0xBA,0x69,0xAB,0xDD,0xC2,0xE1,0x25,0x36,0xDB,0x46,0x54,0xF9, + 0xE1,0xC7,0x47,0x21,0xBF,0xF9,0xFD,0x3F,0x4F,0x41,0xC2,0x6B, + 0x53,0xC1,0x61,0xE7,0x52,0xA7,0xFE,0xBF,0x20,0x99,0xB7,0x07, + 0x9B,0x09,0x1B,0xD6,0x94,0xE7,0xA6,0x4E,0x2B,0xD2,0xB2,0x6B, + 0xCC,0xDD,0x25,0x60,0x90,0xD4,0x6D,0x51,0xAB,0xA1,0xC3,0x9D, + 0x23,0xFB,0xB4,0xBE,0xFA,0x50,0x57,0xFE,0xAC,0xE7,0xA8,0xF1, + 0xF1,0xA9,0x86,0x24,0x4E,0xB0,0xA5,0x12,0xE2,0x4B,0x13,0x21, + 0x9F,0x8D,0xBE,0x89,0xC7,0xF0,0xF9,0xD4,0x53,0xED,0x3C,0x73, + 0xA5,0x52,0x9B,0x51,0x7C,0xEF,0x7F,0xA1,0x2D,0x35,0xBA,0x34, + 0x1A,0x57,0x05,0xA6,0xED,0x12,0xE7,0x11,0x32,0x62,0xB8,0x14, + 0x95,0x75,0x1E,0x29,0x3E,0x47,0xD6,0xBB,0xC1,0x07,0xA5,0x7A, + 0x88,0x4E,0x33,0x8A,0x94,0x5D,0xD3,0x02,0x95,0xCD,0x73,0x9D, + 0x1E,0xDD,0x11,0x52,0x64,0xAF,0x6A,0x47,0x00,0x0E,0xAA,0x3E, + 0x00,0x0F,0x13,0x54,0xFB,0x91,0x9B,0x72,0x06,0x4D,0xD2,0xE0, + 0x98,0x11,0x8F,0x28,0x63,0x3D,0x13,0xEB,0xEB,0xEB,0xCF,0xF0, + 0xAE,0x67,0x12,0xE2,0xF4,0xB0,0x36,0x8B,0x59,0xA4,0xF6,0x48, + 0x79,0x17,0x74,0xB8,0xDA,0x95,0xB5,0x2E,0x25,0x47,0xC8,0x1A, + 0xFA,0xAC,0x8A,0xD3,0x77,0xD0,0x97,0xB9,0xEA,0xB7,0xD8,0x35, + 0x95,0xBE,0x64,0xE4,0x65,0x45,0xB6,0xA4,0x25,0xC5,0x00,0x3A, + 0x9C,0x0E,0x78,0x35,0x67,0xB7,0x5F,0x25,0x58,0xE5,0xA2,0x1D, + 0xD9,0xE2,0xFC,0x57,0x3F,0xBB,0x7B,0xA9,0x47,0x87,0xE1,0xE9, + 0xE1,0xC5,0x73,0xF0,0xDD,0xA3,0x84,0xEA,0xAA,0x55,0xE1,0x92, + 0xFF,0x00,0xBA,0xE8,0x83,0xBA,0xDC,0xBB,0x57,0x8B,0x92,0xA3, + 0x37,0x25,0x11,0x96,0xFB,0x69,0x79,0x63,0x29,0x41,0x57,0x27, + 0xE9,0x55,0xEB,0xA6,0xA6,0x79,0x72,0x7D,0x92,0xCA,0xC2,0x65, + 0x2C,0x1D,0xAB,0x7B,0x04,0xA1,0x27,0xC8,0x1E,0x99,0xA8,0x3B, + 0xDC,0x67,0x5A,0x69,0x85,0x94,0xB9,0x2E,0xEB,0x22,0x42,0x12, + 0xA7,0x02,0xC8,0x0D,0xE4,0xF2,0x78,0xF2,0x1E,0x1E,0x95,0x93, + 0x1D,0xDA,0x0A,0x54,0x27,0xDD,0xD1,0x59,0x9A,0xDF,0xA2,0xF5, + 0xEA,0x45,0xCD,0x08,0x29,0x25,0x45,0x21,0x43,0x70,0xEA,0x33, + 0xCD,0x7E,0xD6,0x75,0x39,0x81,0x6D,0x4A,0xEE,0x2D,0x5C,0x9C, + 0x54,0xC6,0x7D,0xF7,0x14,0x46,0x41,0xF3,0xFE,0x72,0x6A,0x45, + 0x9D,0x57,0x2A,0xEF,0x15,0x11,0x2D,0x8C,0x84,0x4D,0x50,0xC3, + 0xAE,0x1F,0x81,0xBF,0x51,0xF3,0xFC,0xBF,0x3A,0x8C,0x3F,0x68, + 0xE8,0x4E,0x32,0x75,0x62,0xE2,0xD6,0xCB,0x7B,0xF9,0x78,0xF8, + 0x0B,0xF2,0x2E,0x6B,0x5A,0x10,0x32,0xB5,0x25,0x23,0xD4,0xE2, + 0x89,0x52,0x54,0x9D,0xC9,0x21,0x40,0xF8,0x83,0x59,0x7E,0xA5, + 0x93,0xA6,0xB4,0xF2,0x53,0x27,0x56,0xEA,0xA8,0xF0,0xCB,0xCA, + 0xDA,0x85,0xBE,0xE8,0x46,0xE5,0x75,0xC6,0x4E,0x72,0x7A,0xD7, + 0x54,0x14,0x6C,0x8A,0xDD,0xDB,0x4E,0x5D,0xD3,0x26,0x3A,0xD2, + 0x1C,0x68,0xA0,0xEE,0x4B,0xA9,0x23,0x20,0xE4,0x70,0xA0,0x47, + 0xA5,0x6A,0x2E,0xD4,0xAC,0xC9,0xCA,0x93,0x51,0xEB,0x7F,0xC1, + 0x2D,0x49,0x72,0x34,0x7A,0x55,0x15,0xDB,0x86,0xA9,0x7D,0xA5, + 0x4B,0x5B,0x8D,0x45,0x69,0xAF,0x7F,0x68,0xC0,0x04,0x0E,0x7D, + 0x73,0xF2,0xCD,0x58,0x34,0xC6,0xA1,0x8B,0x79,0x8B,0xB9,0x0A, + 0x4A,0x5F,0x40,0x1B,0xD0,0x0E,0x47,0xCC,0x79,0x8A,0xEB,0xE0, + 0xB8,0xCE,0x1F,0x19,0x51,0xD3,0x85,0xD3,0xE5,0x7E,0x7E,0x44, + 0x5C,0x9A,0xA5,0x01,0x07,0xA5,0x2B,0xAC,0x48,0xA5,0x29,0x40, + 0x29,0x4A,0x50,0x0A,0xA9,0xF6,0x99,0xA7,0xA1,0x5D,0xEC,0x4F, + 0x3C,0xFC,0x36,0xA4,0x2D,0xA4,0xE5,0x68,0x5A,0x02,0x83,0x88, + 0xF1,0x04,0x1E,0xB8,0xEB,0xF4,0xAB,0x65,0x7E,0x38,0x90,0xB4, + 0x29,0x0A,0x00,0xA5,0x43,0x04,0x1F,0x1A,0xD7,0xC5,0x61,0xE3, + 0x88,0xA4,0xE9,0xCB,0x9F,0xC1,0xF5,0x21,0xAB,0xA3,0x2F,0xEC, + 0xFE,0x6B,0x6F,0xDA,0x1C,0xB6,0x2D,0x69,0x2F,0x40,0x57,0x74, + 0x52,0xA5,0x64,0x96,0xC8,0xCA,0x0F,0xE1,0xC7,0xCD,0x26,0xB3, + 0x3D,0x59,0x0E,0x0D,0x8E,0x7C,0xAD,0x3C,0xEC,0x18,0xC9,0x88, + 0x95,0x6F,0x65,0xB0,0xDA,0x42,0x4B,0x6A,0xE5,0x2A,0x00,0x74, + 0xC7,0x29,0xCF,0x5C,0xA0,0x9A,0xB8,0xCE,0x0B,0xD2,0x7D,0xA0, + 0xB6,0x95,0xA8,0xA6,0x23,0xCB,0x0C,0x2C,0x9E,0x9B,0x16,0x7E, + 0xED,0x5C,0xF9,0x28,0xE0,0x9F,0x53,0x5D,0x7D,0xAD,0x69,0x09, + 0x3A,0x96,0x2D,0xBE,0x55,0xAD,0x28,0x33,0x23,0xBA,0x10,0xB0, + 0x4E,0xDD,0xEC,0xAC,0xF3,0xCF,0xA1,0xC1,0xC9,0xE8,0x0A,0xAB, + 0xC2,0x2C,0x3E,0x56,0xEF,0xA3,0x5B,0xF9,0xA2,0x2E,0xE5,0x1F, + 0x22,0x43,0x45,0xAD,0xCB,0xB6,0x8D,0x8A,0xF4,0xF6,0x42,0xF7, + 0xA1,0x4D,0x2F,0x3C,0x87,0x00,0x25,0x24,0xF3,0xE7,0x8F,0xCE, + 0xB3,0x3B,0xD3,0xAA,0xB2,0xDD,0x5D,0xB1,0x3A,0xD2,0x42,0x12, + 0x42,0x5A,0x0B,0x4E,0x02,0x90,0x7E,0x13,0xF5,0x1C,0x1F,0x0C, + 0xE7,0xCA,0xBD,0x2D,0x5A,0xC9,0xB4,0x76,0xA8,0x6C,0x0C,0xCD, + 0x5B,0x96,0x18,0x48,0x4D,0xA9,0xA2,0x78,0x4A,0xE4,0xA4,0x65, + 0x6E,0x60,0x0E,0xA5,0x79,0x47,0xF9,0xB3,0x56,0xDD,0x69,0x61, + 0xB7,0x5C,0x2E,0xB6,0xEB,0xDC,0xD7,0x52,0xD3,0x50,0x09,0x32, + 0x96,0xA0,0x30,0xEB,0x23,0x2A,0x09,0x3C,0x78,0x1E,0x06,0x48, + 0x00,0x2D,0x46,0xAF,0x3A,0x31,0x8A,0x51,0xB1,0x8E,0x4F,0xA9, + 0x56,0xD5,0xE2,0x12,0x15,0x68,0xD2,0x2D,0xC5,0x68,0x46,0x65, + 0x9F,0x6C,0x98,0xC0,0x6F,0x68,0x3B,0x89,0x28,0x6C,0xA4,0x0C, + 0x1C,0x93,0x9C,0x79,0xA0,0xF9,0xD4,0x9E,0x8F,0x76,0x25,0x93, + 0x54,0x7D,0x94,0x19,0x6A,0x02,0x5E,0x51,0x4E,0x1A,0x48,0x42, + 0x43,0x80,0x64,0x70,0x38,0xE5,0x23,0xCB,0x9C,0x0A,0xA5,0x68, + 0x1B,0x92,0xF5,0x2E,0xAE,0x99,0x7E,0x91,0x9C,0x49,0x7C,0xC9, + 0x19,0x4E,0xDC,0x20,0x1C,0x34,0x9C,0x64,0xE3,0x8C,0x12,0x3C, + 0xC9,0xAB,0x66,0xBE,0x81,0x23,0x7C,0x7B,0xC4,0x35,0x29,0xB7, + 0x52,0xA4,0xE1,0xC1,0xD5,0x2E,0x24,0xE5,0x0A,0xE7,0xE5,0xF9, + 0x56,0xD4,0xF8,0x74,0x9E,0x19,0xD4,0x6F,0x45,0xA7,0xDD,0xFB, + 0xFC,0x89,0xDB,0x52,0x73,0xB5,0x88,0x0C,0xC2,0x91,0x1B,0x53, + 0x26,0x23,0x7D,0xE3,0x88,0x11,0x24,0x3B,0xB3,0xDE,0x03,0x92, + 0x8E,0x7C,0x13,0xCA,0x87,0xA9,0x29,0xAE,0x1E,0xC8,0x26,0x95, + 0x5C,0x67,0x5B,0xE1,0xC6,0x4A,0x22,0xB8,0x8F,0x69,0x01,0xB4, + 0x84,0xA5,0x2B,0x04,0x05,0xF0,0x07,0x53,0x94,0x9F,0xC7,0xCE, + 0xAC,0xED,0x4B,0x85,0xAD,0xF4,0x67,0xD9,0xEF,0xE5,0x8F,0x6C, + 0x8D,0xB7,0x7A,0x91,0x9E,0xE9,0xC1,0xD0,0x8C,0xFE,0xD2,0x54, + 0x3F,0x14,0xD6,0x59,0xA8,0x27,0x5E,0x7B,0x38,0xD2,0xF0,0x6D, + 0x31,0x5F,0x43,0x1A,0x8A,0xEB,0x38,0x3E,0xEE,0x02,0x94,0x1B, + 0x8B,0x1D,0x59,0x3E,0x5C,0x2D,0x58,0x4F,0x38,0xCA,0x57,0x9F, + 0x0E,0x35,0x2A,0x61,0x5D,0x68,0xE5,0xE6,0xFE,0x9C,0xCB,0xED, + 0x2B,0xA6,0x5C,0xFB,0x53,0x82,0xBB,0x24,0xB6,0xAF,0x8D,0x32, + 0x94,0xB5,0x30,0x86,0xDF,0x52,0x52,0x07,0xDE,0x24,0x1C,0x12, + 0x47,0x3C,0xA4,0x63,0x9F,0xDD,0x03,0xC6,0xA0,0xA1,0x4F,0x8D, + 0x6D,0xD2,0x97,0x3D,0x4A,0xCC,0x48,0xFF,0x00,0x68,0x48,0x02, + 0x14,0x77,0x00,0x4E,0xF7,0x14,0xA2,0x30,0x93,0xE2,0x40,0x38, + 0xFF,0x00,0x5D,0x5F,0x6E,0x2C,0xC3,0xD6,0xFA,0x21,0x2B,0xEF, + 0xD4,0x58,0xB8,0x46,0x4A,0xD9,0x51,0xE7,0xBA,0x5F,0x0A,0x4A, + 0xB1,0x9E,0xA9,0x50,0x1C,0x7A,0x11,0x58,0xDE,0xB3,0x98,0x18, + 0xBE,0x59,0x74,0x5C,0x47,0x12,0xEA,0x2C,0xED,0x87,0x64,0xE0, + 0x85,0x05,0x4B,0x74,0x70,0x33,0x8C,0xFB,0xA9,0x24,0x0F,0x42, + 0x9A,0x52,0xC3,0xC5,0xD9,0x2E,0x5F,0x42,0x92,0xDE,0xE4,0xBC, + 0x08,0x10,0xEC,0x70,0xE1,0x5D,0x23,0xDB,0xE3,0x99,0x08,0x70, + 0x93,0x23,0x66,0x1C,0x79,0x43,0x1B,0xCA,0x97,0x82,0xA2,0x55, + 0xB9,0x5E,0x35,0xA4,0xDD,0x6D,0x8C,0xEA,0x2D,0x2A,0xEB,0xFB, + 0x5A,0x7D,0x05,0x09,0x7E,0x38,0x52,0x46,0xD5,0x2D,0x3E,0xF2, + 0x73,0x90,0x70,0x0F,0x4F,0x91,0xA8,0x29,0x36,0xC1,0x33,0x4B, + 0xA6,0x04,0x71,0xB9,0x6C,0x20,0x29,0xBF,0x55,0x0E,0xBF,0x8F, + 0x3F,0x8D,0x7B,0x76,0x43,0x76,0x59,0x8F,0x22,0xC0,0xF2,0xCF, + 0x79,0x18,0xF7,0xD1,0xC7,0x1C,0xB4,0xA3,0xCE,0x07,0x5E,0x15, + 0x90,0x7D,0x0A,0x6B,0x27,0x12,0xC0,0xCF,0x0C,0xE2,0xDB,0xBB, + 0xD1,0xFD,0xC9,0x4A,0xCE,0xCC,0xA6,0x5A,0x6E,0xE9,0x6F,0x51, + 0xC0,0xB8,0xC4,0x8B,0xBA,0x63,0x4B,0x08,0xF7,0x5B,0xFB,0xD5, + 0xB4,0x7E,0x24,0x63,0x83,0xD3,0x90,0x0F,0x8A,0x45,0x6A,0xDA, + 0xEA,0xCC,0xF5,0xD2,0xCC,0xA7,0x11,0x10,0x39,0x2E,0x12,0xBD, + 0xA2,0x38,0x20,0x13,0xBC,0x02,0x0A,0x46,0x78,0xC9,0x49,0x20, + 0x1F,0x03,0x83,0xE1,0x54,0x5B,0xF5,0x9E,0x1E,0x93,0xD6,0x17, + 0x5D,0x65,0x39,0xD6,0xBE,0xC7,0x8A,0xD2,0xA7,0x21,0xB4,0xE3, + 0x25,0xFF,0x00,0x06,0x80,0x27,0x25,0x45,0xCF,0x7C,0x1E,0x9C, + 0xED,0xA9,0x8E,0xC0,0x75,0x6D,0xC6,0xFD,0xA6,0xA4,0xC2,0xBC, + 0x3E,0x1D,0xBA,0xC5,0x78,0xB8,0xE9,0xC1,0x00,0xA1,0xD2,0x56, + 0x9C,0x64,0x9E,0x01,0xDC,0x80,0x33,0xC0,0x40,0xF3,0xAD,0x7A, + 0x98,0x4B,0xC5,0x54,0x4F,0x6F,0xDF,0xDF,0x32,0xF0,0xD9,0xC5, + 0x95,0x6D,0x2A,0xB8,0x1A,0x9A,0xF1,0x1A,0x34,0xC8,0xD1,0x64, + 0xB0,0xDF,0xDE,0xA8,0xBA,0xDE,0xF1,0x80,0x0A,0xB7,0x0F,0x22, + 0x12,0x09,0x18,0xF2,0x15,0xEB,0xA7,0x53,0x0F,0x58,0xEB,0x69, + 0x17,0xB9,0x2C,0xB6,0xF3,0x45,0xD5,0x26,0x1A,0x8E,0x16,0x19, + 0x8E,0x83,0x8C,0xA0,0xF8,0x6E,0x50,0xCE,0x7C,0x8A,0x7C,0xAB, + 0xF3,0xB4,0xC8,0x0C,0xE8,0x2B,0x7D,0xF2,0xE3,0x0E,0x56,0x26, + 0x5F,0xE4,0x08,0xB6,0xF4,0x27,0x76,0xE6,0x03,0x84,0xAD,0xE2, + 0x71,0xC7,0x1B,0x49,0x4F,0x80,0x03,0x15,0xE9,0xD9,0x8A,0xE3, + 0x5B,0x74,0xF1,0x98,0xF2,0xC3,0x4D,0xED,0x09,0x49,0x51,0xE8, + 0xDA,0x78,0x1F,0x89,0xFE,0x15,0xD1,0xC0,0xE1,0x23,0x52,0x6B, + 0xFF,0x00,0x1D,0xDF,0x92,0xFB,0xB3,0x1A,0x5A,0xD8,0xDA,0x6D, + 0x12,0x9A,0x69,0xA4,0x47,0x61,0x21,0x0D,0xA0,0x61,0x29,0x1E, + 0x15,0x09,0xDA,0x63,0xEB,0x6D,0xCB,0x7B,0xE3,0x77,0x08,0x59, + 0x05,0x3D,0x72,0x08,0x3C,0x55,0x72,0xD9,0xFD,0x69,0xBD,0x8F, + 0x6F,0xB5,0x93,0x16,0x1A,0x0F,0xDD,0x82,0xA0,0x92,0xBF,0x5F, + 0x5F,0x97,0xFF,0x00,0x66,0x5A,0x5C,0xF5,0xDF,0xEC,0x6B,0xB7, + 0x4A,0x4F,0x77,0x79,0x84,0x4A,0xD2,0x8C,0x63,0xBE,0x03,0xE2, + 0x00,0x7E,0xF6,0x39,0xC7,0xA7,0xE1,0xB9,0x8F,0xE2,0x14,0x31, + 0x94,0x27,0x86,0xA5,0xBF,0x2E,0x8E,0xCF,0x65,0xF4,0x26,0x52, + 0xBA,0x27,0xE0,0x3C,0x24,0xDB,0x23,0x3E,0x12,0xA0,0x16,0xDA, + 0x48,0xDC,0x30,0x4F,0x15,0xFC,0xCF,0xDA,0xAB,0x8F,0xC4,0xED, + 0x66,0xEC,0x87,0x50,0xA6,0xD2,0xE4,0xE6,0x5C,0x41,0x57,0x01, + 0x49,0xEE,0x5A,0x19,0x1E,0x99,0x04,0x7D,0x0D,0x6D,0x9D,0x9E, + 0x6A,0x24,0x3C,0x8F,0xEA,0xF4,0xD7,0x0A,0x65,0xC5,0xCF,0x74, + 0x55,0xFF,0x00,0xB8,0xD7,0xEC,0x90,0x7C,0xC6,0x76,0x9F,0x97, + 0xA8,0xAC,0xDF,0xFA,0x4D,0x69,0xB9,0x11,0xEF,0x90,0x75,0x64, + 0x64,0xA9,0x4C,0x3C,0xDA,0x63,0x3E,0x40,0xE1,0xB5,0xA0,0xA9, + 0x48,0x27,0xFC,0xC1,0x44,0x67,0xFC,0x23,0xCE,0xB9,0x98,0x4A, + 0x50,0x85,0x55,0x56,0xDB,0xAF,0xAA,0xFB,0x19,0x1C,0xAF,0x12, + 0xC7,0xD9,0xC4,0x60,0xF2,0xD0,0xA5,0x0C,0xD6,0xD3,0x6C,0x84, + 0x81,0x1D,0x23,0x68,0xE9,0x58,0x77,0x65,0x3A,0x82,0xD2,0x59, + 0x69,0x4E,0xCC,0x69,0x95,0x60,0x6E,0x4A,0xCE,0x08,0x3F,0xC6, + 0xB5,0x27,0xB5,0x4A,0x66,0xB6,0x9B,0x75,0x81,0x4A,0x71,0xE5, + 0xF0,0xB9,0x3B,0x0E,0xD6,0x87,0x98,0xCF,0x8D,0x7A,0xDC,0x47, + 0x12,0xC3,0x61,0xE9,0xBA,0x92,0x9A,0xFA,0x95,0x72,0x49,0x1C, + 0x9D,0xA1,0x49,0x61,0xA8,0x6B,0x89,0x09,0xE4,0x99,0x3B,0xC2, + 0x5E,0xD9,0xD5,0xB4,0xE3,0xF2,0x3D,0x05,0x52,0xCE,0xB7,0xD3, + 0x76,0x1B,0x60,0xB7,0xDB,0x9E,0x91,0x2E,0xE1,0xB0,0xE6,0x34, + 0x36,0x0A,0xDE,0x2B,0xC1,0xC6,0xEF,0x04,0x8F,0x52,0x40,0xCF, + 0x88,0xA9,0x3D,0x6A,0xF5,0xB2,0xCA,0xAB,0x64,0x78,0xB9,0x76, + 0x64,0xB7,0xD6,0xDB,0x8B,0x53,0x84,0xF0,0x1B,0x52,0x89,0x23, + 0xA1,0xE4,0x01,0xF5,0xAE,0xCD,0x3B,0xA7,0xA2,0xCC,0x88,0x9B, + 0x94,0xC0,0x56,0xDA,0xC9,0x28,0x69,0x3D,0x2B,0xC3,0xE3,0x71, + 0xB3,0xC5,0xD5,0x55,0x2A,0xC5,0xF8,0x24,0xF6,0xFD,0xE7,0xB1, + 0x4B,0xBC,0xC6,0x6F,0x64,0x8B,0x21,0x16,0xE5,0x34,0x21,0xEF, + 0x9B,0x29,0xC5,0x48,0x95,0xDD,0x27,0x25,0x4F,0x2D,0x45,0x5D, + 0x47,0x52,0x09,0xC0,0xF9,0x0C,0x56,0x9D,0xDA,0x5F,0x7D,0x1F, + 0x42,0x5E,0x64,0xF7,0x78,0x31,0xA2,0x2D,0xD4,0x12,0x3E,0x15, + 0x20,0x6E,0x07,0xE8,0x45,0x67,0x9A,0xFF,0x00,0x5D,0x5E,0xA3, + 0xDE,0x64,0xE9,0xFD,0x20,0xCC,0x7B,0x2C,0x58,0x2B,0x08,0x93, + 0x70,0x42,0x02,0xDF,0x70,0xE0,0x28,0xB6,0xD8,0x39,0x00,0x60, + 0x8C,0xA8,0xE7,0xA9,0x01,0x3C,0x66,0xB4,0x5E,0xD6,0x94,0xB4, + 0x76,0x4F,0xA9,0x46,0xE2,0x4F,0xD9,0x4F,0xE4,0x9F,0xFF,0x00, + 0x19,0xAB,0x4B,0x09,0x2A,0x93,0x8C,0xE6,0xF5,0xBA,0x7E,0x57, + 0x32,0x43,0x4B,0xEA,0x51,0x34,0x3D,0xDD,0xEB,0xB5,0xD2,0x35, + 0x9C,0x3B,0x96,0x56,0xEF,0x78,0xA4,0x67,0x85,0x1C,0x75,0x3E, + 0x78,0x03,0x3F,0x8D,0x5A,0x7B,0x55,0xB8,0x4E,0x46,0x9B,0x5B, + 0x31,0x9C,0x72,0x22,0x1F,0x75,0xB8,0xE9,0x5E,0xDE,0x52,0x85, + 0x28,0x05,0x11,0xD3,0x9C,0x64,0xE7,0xCE,0xB1,0xAE,0xCC,0x6E, + 0x28,0x89,0xAF,0x6D,0x82,0x69,0x53,0x48,0x5B,0x8A,0x6C,0x6E, + 0x04,0x7B,0xCA,0x42,0x92,0x91,0xF5,0x24,0x0F,0xAD,0x6C,0x9D, + 0xA1,0x41,0x95,0x78,0xD3,0x2F,0x44,0x86,0x92,0xE3,0xED,0xAD, + 0x0F,0xB5,0xE2,0x55,0xB1,0x41,0x45,0x23,0xD4,0x80,0x40,0xF5, + 0xC5,0x59,0xD1,0x51,0x9A,0x93,0x31,0x5E,0xC8,0xA8,0xB3,0x09, + 0x30,0xF4,0xD3,0x52,0xAC,0xCD,0xB2,0xD8,0x61,0xC2,0xA4,0xB4, + 0x11,0xF0,0xED,0xFD,0xA3,0xE7,0xD0,0xE7,0xC7,0x15,0xC5,0x79, + 0xD6,0x77,0x3B,0xEB,0x2C,0x5A,0xD9,0xB1,0xBD,0x1D,0x65,0xF6, + 0x96,0xB7,0x8C,0x84,0xA9,0x2A,0xDA,0x42,0xB0,0x90,0x93,0x93, + 0xC8,0xC7,0x20,0x75,0xCF,0x1D,0x0C,0x46,0x98,0xD5,0x6C,0xC4, + 0x6C,0xC3,0x98,0x1E,0x0A,0x43,0x84,0x8D,0xA9,0xCF,0x07,0xC3, + 0xF1,0xCD,0x58,0xE3,0x46,0x96,0x5A,0x73,0x52,0xDB,0xA0,0x35, + 0x1E,0x13,0x6A,0x01,0x7B,0xCE,0x0A,0xF3,0xFA,0x7D,0x3E,0x75, + 0xB9,0x5B,0x0F,0x84,0x8C,0x29,0xCD,0xCB,0x57,0x6B,0xEE,0xDD, + 0xF9,0xB5,0xF9,0x26,0xE8,0x90,0xEC,0xA3,0xBB,0x5E,0xAF,0x94, + 0xA0,0xEC,0x92,0xA3,0x15,0x64,0xA1,0x52,0x9C,0x53,0x40,0xEF, + 0x4F,0x29,0x6C,0xAB,0x6A,0x4E,0x54,0x79,0x00,0x1E,0x6B,0x8B, + 0xFA,0x41,0xAB,0x6D,0xF6,0xCA,0xD3,0xB2,0x66,0xB4,0xD2,0xA2, + 0x48,0x56,0xD8,0xD3,0x5D,0x63,0x71,0x0B,0x68,0x0D,0xDD,0xDA, + 0x93,0x9C,0x05,0x1E,0xBE,0x75,0xD9,0xD9,0x33,0x49,0x6F,0x58, + 0xBE,0xB5,0x1D,0xA9,0x5C,0x57,0x31,0x9F,0xF3,0xA0,0xD4,0x3F, + 0xF4,0x9A,0xCA,0x6F,0xFA,0x7C,0x03,0xFF,0x00,0xC3,0x95,0xFF, + 0x00,0xEE,0xCD,0x69,0xD2,0xC3,0x42,0x55,0x15,0x45,0xE2,0x5E, + 0x32,0x79,0x0A,0xA4,0x66,0x63,0x47,0x6D,0x86,0xDF,0x68,0xBA, + 0x5C,0x50,0x7D,0x2A,0x79,0xD5,0x3A,0xB0,0xA1,0x80,0x15,0xBD, + 0x44,0xAB,0x38,0x48,0xF1,0xE8,0x05,0x6D,0x3D,0xA2,0xA8,0xB1, + 0xA1,0xAF,0x20,0x24,0xE4,0x41,0x70,0xFA,0x00,0x12,0x6B,0x08, + 0x66,0x43,0x73,0x4C,0x52,0x82,0x46,0xC6,0xB6,0x28,0x1F,0x02, + 0x2B,0x6F,0xED,0x32,0x42,0xBF,0xE9,0xFD,0xF9,0xA2,0x16,0xAF, + 0xEC,0x0F,0x61,0x5E,0x1F,0x09,0xE2,0xB6,0x31,0x14,0xA0,0xAB, + 0x28,0xC5,0xDD,0x5D,0x18,0xEF,0x62,0x82,0xF4,0x9B,0x7D,0xCA, + 0xD6,0xA5,0x4E,0x8F,0x1E,0x52,0x50,0xFA,0x51,0xDD,0xBC,0xD8, + 0x5A,0x79,0x04,0xE7,0x9F,0x2D,0xBF,0x9D,0x69,0x7A,0x1A,0x3B, + 0x68,0xD2,0xD1,0xE4,0xB4,0x4B,0x2C,0x36,0x85,0x04,0x84,0x8C, + 0xE3,0x0A,0x23,0xF0,0xC6,0x2B,0x00,0x89,0x3B,0x11,0x97,0x1B, + 0x79,0xEF,0x15,0x21,0x2A,0x09,0xF4,0x09,0x50,0xFE,0x22,0xBF, + 0xA1,0x3B,0x3D,0x6A,0x4B,0x7A,0x0E,0x08,0x7D,0x0B,0x42,0xB6, + 0xBA,0x76,0xA8,0x60,0xE3,0x7A,0xB0,0x7F,0x0A,0xD3,0xC5,0xD1, + 0x51,0x8C,0x72,0xF9,0x96,0x86,0xE6,0x65,0xA4,0xAF,0x82,0x3D, + 0xEA,0x1B,0x3B,0xC2,0x12,0x6E,0x05,0xB3,0xBB,0xF7,0x54,0xF1, + 0x1F,0xA1,0xAD,0x3F,0x53,0x69,0x34,0xDF,0x2F,0x31,0xEF,0x21, + 0x60,0x4A,0x8E,0xCA,0xDA,0x68,0xB8,0x9D,0xC9,0x1B,0x88,0x24, + 0xA4,0xFE,0xC9,0xF7,0x71,0xEA,0x31,0x5F,0xCE,0xF1,0xD8,0x72, + 0xE9,0xA8,0x45,0xAC,0x3C,0x96,0x97,0x2E,0x7A,0xD8,0x42,0xD4, + 0x70,0x02,0x94,0xE9,0x09,0xE7,0xC3,0x92,0x2B,0x4A,0x57,0x68, + 0xBA,0xCB,0x43,0x4D,0x5D,0x83,0x50,0xDA,0x9A,0xBE,0x26,0x30, + 0x18,0x95,0x1D,0xE0,0xD3,0xCB,0x49,0x00,0x83,0xB5,0x58,0x42, + 0xFA,0x9F,0x7B,0x72,0x79,0x04,0x63,0x83,0x59,0x2B,0x61,0x33, + 0x4D,0xCA,0x2E,0xCF,0x52,0x62,0xD5,0x9A,0x67,0x74,0xD8,0x5A, + 0x83,0x47,0x5C,0x57,0x7B,0xFB,0x0D,0x72,0xD9,0x5A,0x3F,0xB5, + 0x22,0x3A,0x93,0xEF,0x81,0xF0,0x92,0x49,0x00,0x28,0x74,0xE4, + 0xF4,0x35,0x56,0x87,0x7E,0x5A,0xBB,0xE9,0x1E,0xC6,0xB8,0x2D, + 0xAE,0x43,0xAE,0x21,0x95,0xB8,0x95,0x29,0x21,0x4A,0x2A,0x39, + 0x29,0x24,0x67,0x2A,0x3D,0x0D,0x68,0x5A,0x2F,0xB4,0x1B,0x06, + 0xB1,0x94,0xEA,0x23,0xBB,0x3A,0x1D,0xC9,0xA6,0xC3,0x8E,0x43, + 0x96,0xDE,0xC5,0x25,0x3D,0x38,0x23,0x29,0x58,0x1E,0x25,0x24, + 0x81,0x91,0x9E,0xA2,0xB2,0xFE,0xD2,0x11,0x1A,0xD7,0xAE,0xA4, + 0xC0,0x8A,0x94,0xA5,0xA7,0x1A,0x44,0x84,0xB6,0x94,0xE1,0x29, + 0x0B,0xC8,0xDA,0x07,0xCD,0x27,0xF1,0x02,0xAE,0xE8,0xBC,0xBD, + 0xDB,0x5B,0x7B,0xFD,0x8A,0x33,0x74,0x4B,0xE1,0xF4,0xF7,0x8D, + 0x24,0xA9,0x27,0x9C,0xE6,0xBF,0x9C,0xB5,0xFC,0xC5,0x23,0xB5, + 0x4B,0xA3,0x5B,0xBF,0xF9,0xAD,0xFF,0x00,0xFC,0x9B,0xAD,0xA3, + 0xB1,0xBB,0xDD,0xBE,0xF5,0x64,0x16,0xC9,0x2F,0x14,0x5C,0xA0, + 0x04,0xB6,0x50,0x9C,0x27,0x73,0x60,0x7B,0x8B,0x03,0xC4,0x60, + 0x60,0xFA,0x83,0xE9,0x59,0xC7,0xF4,0x92,0xD3,0xCF,0x5B,0x35, + 0x64,0x3D,0x4D,0x19,0xBF,0xEC,0xB3,0x02,0x5B,0x71,0x41,0x38, + 0xC3,0xE8,0xF1,0x51,0xF3,0x52,0x40,0xC7,0xF9,0x0D,0x5F,0x05, + 0x15,0x4A,0xB7,0xF2,0x2F,0x66,0x95,0xF9,0x17,0x3E,0xCD,0xE3, + 0x07,0x8A,0x14,0xA1,0x9A,0xD9,0xAD,0xD0,0x90,0x18,0x48,0xDB, + 0xE1,0x58,0x97,0x65,0x9A,0x82,0xD1,0xDC,0x36,0xA7,0x26,0xB4, + 0xD1,0xC0,0xCA,0x56,0x70,0x45,0x69,0x6F,0xEA,0x55,0x5D,0x00, + 0xB5,0xE9,0xF5,0x2C,0xA9,0x7C,0x3D,0x2B,0x69,0x01,0xB4,0xFF, + 0x00,0x87,0xD7,0xD7,0xFF,0x00,0xB1,0xEB,0x71,0x5C,0x4B,0x0D, + 0x86,0xA6,0xE7,0x29,0x27,0xE0,0xB7,0x64,0xB9,0x24,0x70,0xF6, + 0x83,0x2A,0x31,0x67,0xEC,0xEB,0x7B,0xC9,0x5C,0x97,0x1C,0xD8, + 0xEE,0xC3,0xCA,0x47,0x96,0x7C,0xC9,0x38,0xFC,0x6B,0xE6,0x1A, + 0x11,0x69,0xB2,0xB6,0xC4,0x76,0x14,0x90,0x1A,0xEF,0x5C,0xDC, + 0x9D,0xA4,0xF1,0x91,0x9F,0xE7,0xAE,0x6A,0xBF,0xAF,0x97,0x6F, + 0xB2,0x4C,0xB6,0xDB,0x61,0xC7,0x52,0xA5,0xCA,0x4B,0x8B,0x53, + 0xAA,0x59,0x20,0x25,0x03,0x93,0xFE,0xA2,0x91,0xF5,0xA9,0x88, + 0x33,0x93,0x73,0xB3,0x36,0x02,0xCA,0x83,0xCC,0x63,0x7A,0x4E, + 0x52,0x92,0x53,0xD3,0xD7,0x15,0xE2,0xF1,0x58,0x8A,0xB8,0xDA, + 0xBD,0xE5,0x55,0x6E,0x8B,0xA1,0x8D,0xC9,0xA7,0xA9,0x99,0x69, + 0x85,0xB1,0x30,0x4F,0x9E,0x49,0x12,0x24,0xA1,0xD9,0x4A,0x71, + 0x43,0xDE,0x52,0x73,0xEE,0x27,0x9F,0x0D,0xBB,0x45,0x5B,0x7B, + 0x25,0x92,0x16,0xDC,0xE0,0xD1,0x0D,0x33,0x19,0x41,0xC4,0xA5, + 0xB4,0xF2,0x37,0xE7,0x23,0x1E,0x59,0x04,0xFD,0x6B,0x27,0xB1, + 0xDC,0x0C,0x27,0xA4,0xC4,0x5B,0x9B,0x8B,0x10,0xDC,0x61,0x44, + 0x70,0x0A,0x91,0x80,0x71,0x9F,0x54,0x9A,0xD2,0xFB,0x08,0x69, + 0xFF,0x00,0x66,0xBA,0x49,0x28,0x57,0x76,0xB0,0xC8,0x4A,0xBC, + 0x09,0x1B,0xF3,0x57,0xC5,0xD1,0x8A,0xA4,0xA7,0xCD,0xB7,0xF0, + 0x7A,0x13,0x1D,0xD1,0xF7,0xAD,0xE5,0x9B,0x26,0xA8,0x0D,0xA1, + 0xD7,0x23,0xC4,0x9E,0xC8,0x75,0x00,0x7B,0xB8,0x4E,0x70,0xB4, + 0xE3,0xC8,0x1C,0x1F,0xFB,0xB1,0xE1,0x5A,0x0C,0xA2,0xE4,0x1B, + 0x21,0xC2,0x42,0x5B,0x8E,0xC6,0xE5,0x10,0x32,0x32,0x06,0x7F, + 0x01,0xFC,0x2B,0x11,0xFE,0x90,0xB7,0xB4,0xBB,0xAC,0xE0,0xC3, + 0x69,0x61,0x6B,0xB7,0xDB,0xDC,0x2E,0x94,0xF3,0x82,0xEA,0xD3, + 0xB4,0x7C,0xFE,0xE9,0x55,0xB9,0x34,0xFB,0x17,0xCD,0x32,0x17, + 0x15,0xC2,0xB8,0xD3,0xE2,0xE5,0xB5,0x0E,0x32,0x95,0xA7,0x83, + 0xF8,0x11,0x58,0x71,0x18,0x2C,0xF1,0x52,0x7A,0x19,0x21,0xA3, + 0x66,0x17,0xA6,0xD9,0x8F,0x32,0x14,0xDB,0xC4,0xA4,0x30,0xA9, + 0xF2,0x19,0x32,0xA4,0x3A,0xB6,0xC2,0x94,0xA0,0xAE,0x43,0x79, + 0x3C,0x84,0x84,0xF1,0xF4,0xAB,0xAF,0x64,0x93,0x50,0xBB,0x6C, + 0xA8,0x2C,0xE5,0x2C,0xC6,0x74,0x29,0x28,0xC7,0xBA,0x84,0x28, + 0x64,0x25,0x3E,0x99,0x0A,0xE2,0xB2,0x1B,0x7D,0xC2,0x55,0x95, + 0x53,0x6C,0xF7,0x34,0x2D,0x99,0x29,0x60,0xC6,0x71,0x3D,0x76, + 0xB8,0x91,0x8C,0x7C,0xB3,0x9E,0x7E,0x55,0xA4,0xF6,0x22,0xE1, + 0x4B,0x37,0x3D,0xC9,0x25,0x2B,0xEE,0x46,0x47,0x87,0xC7,0x5B, + 0x38,0x9A,0x30,0x54,0xD5,0xB7,0x7B,0xFB,0xE9,0xF0,0x31,0x5E, + 0xC5,0x1F,0xB6,0x79,0x05,0x3D,0xA2,0x4A,0x28,0xCA,0x70,0xC3, + 0x24,0x7A,0x7C,0x55,0xAE,0xF6,0x53,0x69,0x4D,0xB7,0x43,0xC6, + 0x98,0xE2,0xBB,0x87,0x64,0x20,0xC8,0x71,0xC0,0x41,0xCA,0x33, + 0xEE,0x8C,0x8F,0x0C,0x0D,0xD8,0xF5,0xF4,0xAC,0x7F,0xB6,0xC6, + 0xD3,0xFF,0x00,0x50,0x65,0x6D,0x58,0x56,0x23,0x33,0xCF,0xFA, + 0xAB,0x6F,0xEC,0xC6,0x6B,0x77,0x4E,0xCE,0xEC,0xCE,0x35,0x92, + 0x84,0xC4,0x4B,0x0E,0x24,0x8E,0x77,0x20,0x6C,0x56,0x7E,0xA9, + 0x35,0x87,0x17,0x17,0xDC,0x45,0x2F,0x0F,0x91,0x78,0x6A,0xCC, + 0xDD,0x37,0x2E,0xCF,0x7E,0xD2,0xB9,0xDC,0xE4,0xF6,0x9B,0xA5, + 0x9E,0x99,0x70,0x7D,0x65,0xC5,0xBC,0xF8,0xDC,0x1A,0x04,0x84, + 0x35,0x8F,0xDD,0x09,0xC7,0xA1,0x39,0x3E,0x35,0x7A,0xD2,0x57, + 0xCD,0x25,0x1F,0x4A,0x46,0x89,0x1F,0x55,0xD9,0x2E,0x51,0x42, + 0x54,0xD8,0x53,0x32,0x52,0xA4,0x6C,0xC9,0x01,0x3C,0x9F,0x01, + 0xC6,0x3D,0x2B,0x16,0xD5,0x71,0x9E,0xB0,0x5F,0x5E,0xB3,0xCB, + 0x0A,0x61,0x96,0x16,0x50,0xCA,0x90,0x9D,0xC0,0xB5,0x9F,0xBB, + 0x23,0x27,0x9F,0x77,0x19,0xE7,0xA8,0x23,0xA8,0xA8,0xF4,0x5A, + 0x2D,0xF7,0x37,0xC1,0x6A,0x1A,0x27,0xBE,0x7C,0x57,0x11,0x25, + 0x5F,0xA9,0x35,0x92,0xB6,0x12,0x9D,0x58,0x39,0x49,0xB5,0xEA, + 0xBE,0x56,0x41,0x4F,0x2F,0x23,0x5E,0xEC,0xFF,0x00,0x54,0x16, + 0x35,0x54,0x88,0x4C,0x4A,0x44,0x98,0xFD,0xF3,0x8C,0xAD,0x4D, + 0x2B,0x72,0x48,0x49,0x3B,0x15,0x9F,0x3C,0x6D,0xC9,0xF3,0x26, + 0xB6,0xCB,0x5C,0xD0,0xFA,0x01,0x06,0xBF,0x9A,0xB4,0x93,0xF0, + 0xEC,0xF6,0xE4,0xB7,0x02,0x2E,0x26,0xA9,0x5B,0x7B,0x90,0x9C, + 0x64,0xF9,0xF1,0xC0,0x4F,0xF3,0xEB,0x5A,0x25,0x9D,0xDD,0x63, + 0x66,0xDB,0x70,0x98,0xE2,0x5C,0x6C,0x61,0x4E,0x47,0x52,0x87, + 0x09,0xF5,0x4E,0x32,0x9A,0xED,0x61,0xB8,0x86,0x1F,0x87,0xD2, + 0x8D,0x39,0x4B,0x35,0xF5,0xD3,0x92,0x64,0x29,0x24,0x8B,0x13, + 0xF7,0x23,0x74,0xD4,0xEF,0xBC,0xE2,0xB7,0x31,0x0C,0x94,0xB2, + 0xDE,0x78,0x18,0xE3,0x77,0xD7,0x1F,0x98,0xF2,0xAA,0x77,0x6B, + 0x3D,0xE4,0xAB,0x6C,0x46,0x66,0x2D,0x26,0x24,0xE9,0x1D,0xD3, + 0xC8,0x39,0x1B,0xD0,0x12,0x54,0x51,0xC1,0xE8,0x40,0x20,0x8F, + 0x22,0x6B,0xAF,0x4E,0x4F,0x8B,0xFD,0x67,0x43,0x0E,0xB8,0xB6, + 0xD1,0x28,0xAD,0x0D,0xA8,0x80,0x39,0xF8,0x80,0x3E,0x44,0x84, + 0x9A,0xE0,0xFE,0x90,0x8B,0x71,0x9B,0x3D,0x95,0xF6,0x82,0x8B, + 0x6D,0xDC,0x14,0x09,0x03,0x18,0xCB,0x0E,0xF5,0xAF,0x36,0x94, + 0xAB,0x56,0x75,0xA5,0xAB,0x6D,0xBB,0xFC,0x88,0x8D,0xDA,0x6C, + 0xAD,0x5F,0x15,0x1E,0x3D,0xAE,0xDA,0xFB,0x41,0x09,0x58,0xCB, + 0xB1,0xC2,0x10,0x91,0xDC,0xA9,0x0A,0x1B,0x76,0xF9,0x78,0x7E, + 0x95,0xAA,0xCA,0x69,0x77,0xCD,0x2E,0x97,0x9A,0x0A,0x48,0x7A, + 0x30,0x79,0x95,0x94,0xE4,0xA4,0x94,0xE5,0x27,0x1F,0xA8,0xF2, + 0x26,0xB0,0x27,0x27,0x89,0x90,0x6D,0x2D,0x15,0xE3,0x1B,0xC2, + 0x8F,0x5C,0x7B,0xC0,0x7F,0x0A,0xFE,0x87,0x86,0xB1,0x61,0xD1, + 0x51,0xC4,0xB7,0xDB,0x6D,0x10,0xE0,0x23,0xBD,0x71,0x47,0x08, + 0x4E,0xD6,0xC6,0x49,0xCF,0x87,0x15,0x9F,0x19,0x83,0x8E,0x64, + 0xA1,0xC9,0x27,0xEE,0x95,0xFD,0xD9,0x7A,0x7C,0xD1,0x95,0x69, + 0x8D,0x53,0x76,0x4D,0xCA,0x12,0x21,0x4E,0x54,0x46,0x1F,0x75, + 0xB1,0x22,0x3B,0x8C,0xEF,0x51,0x04,0xF2,0x3A,0x8D,0xAA,0x19, + 0xF5,0xE9,0xD2,0xAE,0x3D,0xA5,0x5E,0xAE,0x76,0x7D,0x2D,0x2E, + 0x74,0x2D,0xEC,0x48,0x52,0x92,0xCB,0x4B,0x3C,0x14,0x29,0x6A, + 0xDA,0x15,0xCF,0x91,0x22,0xB0,0x6D,0x19,0x74,0x79,0xFB,0xCD, + 0xB1,0xF7,0xB0,0x95,0xCA,0x94,0x87,0x94,0x90,0x4F,0xBB,0xBD, + 0x7B,0xB1,0xF4,0xCE,0x2B,0x60,0xED,0xD2,0x42,0xC6,0x82,0x90, + 0x90,0x14,0xAC,0x4B,0x8E,0x42,0xBC,0xBE,0xF9,0x35,0x67,0x42, + 0x31,0x9A,0x8B,0x5A,0x26,0x63,0xBD,0x8A,0x25,0xDB,0xB4,0x2D, + 0x4D,0x2A,0xD6,0xE5,0x9D,0x5F,0x66,0xA5,0x2E,0x23,0xBB,0x5C, + 0xD4,0xA9,0x61,0xD2,0x3C,0x48,0x46,0x30,0x0E,0x3F,0xC5,0xD7, + 0xD3,0x8A,0xD3,0x7B,0x21,0x78,0x4C,0xD2,0xEE,0xBA,0xD2,0xD6, + 0xD1,0x6D,0xFE,0xEF,0x70,0x3D,0x42,0x52,0x93,0x8F,0xCC,0x7E, + 0x15,0x8A,0x69,0x58,0xAD,0xDC,0x22,0x48,0x43,0xA9,0x49,0x2A, + 0x71,0x49,0x2B,0xC0,0xDC,0x91,0x81,0xE3,0x57,0x4E,0xCA,0xEE, + 0x97,0x7D,0x3F,0x74,0x76,0x04,0x78,0xB2,0x6E,0xB6,0xD9,0x2E, + 0x8D,0xDE,0xCC,0x9D,0xC5,0xA5,0xF0,0x37,0x81,0xD4,0x82,0x00, + 0xC8,0x19,0x3E,0xEF,0x00,0xF3,0x59,0xB1,0xF8,0x1C,0xB4,0x23, + 0x3B,0xAD,0x75,0xE8,0x59,0x68,0xD5,0xCE,0xDE,0xD0,0xA6,0x86, + 0xFB,0x49,0x95,0x26,0x48,0xCA,0xE3,0x42,0x69,0xB8,0xFB,0xBA, + 0x20,0x2C,0xA8,0xAC,0x81,0xE0,0x55,0x84,0x82,0x7C,0x42,0x45, + 0x5B,0xFB,0x23,0x75,0x52,0x74,0xDC,0x95,0x33,0x92,0xD3,0x73, + 0x16,0x94,0xA4,0x74,0x46,0x52,0x95,0x10,0x3E,0xAA,0x27,0xEB, + 0x55,0xCE,0xD4,0xF4,0xD9,0xD4,0x1A,0x93,0xDB,0x2D,0x37,0x28, + 0x42,0x7A,0x23,0xA2,0x3C,0x88,0x8E,0xBE,0x86,0xD4,0x76,0xA9, + 0x58,0x29,0x24,0x80,0x4E,0x16,0x72,0x09,0x1F,0x08,0xC5,0x4B, + 0xC4,0xBC,0xE9,0xAE,0xCA,0x74,0x6A,0x62,0xDD,0x6F,0x51,0x1D, + 0x9E,0xFB,0x8A,0x74,0xB4,0xC2,0xFB,0xC5,0xBC,0xE6,0x12,0x9D, + 0xAD,0xA4,0x72,0xAE,0x02,0x73,0x81,0xE2,0x4F,0x4A,0xD5,0xAF, + 0x85,0x75,0xA3,0x64,0xB5,0xB2,0x2F,0x1B,0xE6,0x6C,0x86,0xED, + 0x3B,0x59,0x6A,0x4B,0x1E,0xAB,0x99,0x66,0x8C,0x6D,0xD2,0x1A, + 0x72,0x23,0x6E,0x36,0x1F,0xDE,0x85,0x35,0xBF,0x7A,0x73,0x91, + 0x9D,0xFC,0xA4,0xF1,0xC7,0xCF,0xCA,0x7B,0xB2,0x67,0x17,0x6D, + 0x80,0xC9,0x90,0xEE,0x5D,0x2C,0xA1,0xA0,0x9F,0x24,0x80,0x39, + 0x3E,0xA7,0x1D,0x2B,0x17,0x54,0x8B,0xBE,0xA9,0xD4,0xF2,0xF5, + 0x45,0xCD,0xA5,0xB1,0xED,0x2E,0x24,0xB6,0xC9,0x39,0xEE,0xDB, + 0x40,0xC2,0x11,0xF3,0xEA,0x4F,0xAA,0x88,0xAD,0x4B,0x43,0xA5, + 0xF7,0x5C,0x49,0x39,0xAF,0x49,0xC2,0xB8,0x6C,0x60,0xA3,0x36, + 0xBF,0xAE,0xDE,0xDA,0xB2,0x16,0xAE,0xEC,0xDC,0x2D,0xD2,0x7B, + 0xE4,0x03,0x9A,0x90,0xA8,0x5B,0x13,0x4A,0x4B,0x29,0xCF,0x95, + 0x4D,0x0E,0x95,0xE8,0x0B,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00, + 0xA5,0x29,0x40,0x50,0x3B,0x63,0xD3,0xA6,0xED,0x68,0x12,0xD9, + 0x60,0xB8,0xE3,0x49,0x28,0x74,0x24,0x72,0x5B,0x3E,0x3F,0x43, + 0xFA,0x9A,0xCC,0x2F,0x5D,0xA9,0x7D,0x95,0xA1,0xDE,0xB7,0xB4, + 0xF2,0x9C,0xD4,0x61,0xAE,0xE5,0x96,0x54,0x92,0xAD,0xCB,0x3E, + 0xE8,0x59,0xE8,0x36,0xF4,0x51,0xF4,0xCE,0x39,0xAF,0xE8,0xC7, + 0x12,0x14,0x82,0x08,0xCD,0x66,0xBA,0x9F,0xB3,0xDB,0x4C,0x9B, + 0xA2,0xAE,0x01,0x0A,0x00,0x9D,0xC5,0x81,0x8D,0x85,0x5E,0x7F, + 0xF1,0x5C,0x4C,0x67,0x0C,0x94,0xEB,0x77,0xB4,0xF9,0xEE,0xBE, + 0xBF,0x74,0x51,0xA6,0x9D,0xD1,0xFC,0xBD,0x0E,0xCB,0x70,0x83, + 0x66,0x6A,0x4B,0x45,0xD1,0xDD,0x90,0x43,0x99,0x21,0x79,0x1C, + 0xF7,0xB9,0xEB,0xF1,0x73,0x9F,0xAD,0x5E,0xBB,0x41,0xED,0x12, + 0x3D,0xEB,0xB3,0xF6,0xAC,0xD0,0x5C,0xC5,0xD2,0x7A,0x52,0xCC, + 0xC6,0x92,0x31,0xDC,0xA3,0x1F,0x79,0xC1,0xF0,0x20,0x29,0x23, + 0xE6,0x0D,0x69,0x2E,0x69,0x6C,0xC8,0x3F,0x76,0x36,0xF4,0xC6, + 0x38,0xAE,0x68,0xFD,0x9A,0xDB,0xD8,0x98,0xA9,0xA9,0x6D,0x47, + 0xC5,0x0D,0x1F,0x85,0x07,0xCC,0x52,0xB7,0x0B,0x79,0xA2,0xE1, + 0xAF,0x5B,0xF5,0xEB,0xF8,0x21,0xC1,0xF2,0x33,0xAE,0xCD,0x20, + 0xBF,0x02,0x3A,0x7B,0xC4,0x14,0x38,0xE9,0xDC,0x41,0x18,0x20, + 0x78,0x0F,0xE7,0xCE,0xB6,0xC8,0x36,0x84,0xDD,0x6C,0x8F,0x43, + 0x70,0x0F,0xBD,0x6F,0x09,0x27,0xF6,0x55,0xE0,0x7E,0x87,0x15, + 0x13,0x03,0x4C,0x16,0xE5,0x05,0x6C,0xF1,0xF2,0xAD,0x0E,0xC3, + 0x07,0xB8,0x64,0x02,0x3C,0x2B,0xAB,0x1A,0x10,0x54,0xBB,0xAE, + 0x56,0xB1,0x7B,0x69,0x63,0x13,0xB7,0xDD,0xE2,0xE8,0xE9,0x53, + 0xA0,0xEA,0x12,0xB8,0xAC,0x28,0xEF,0x49,0x5A,0x7D,0xD4,0xAF, + 0xA1,0x1E,0x7C,0xF0,0x47,0x87,0x5A,0xCB,0xEE,0xEB,0xB8,0x6A, + 0xFD,0x5D,0x3A,0xF9,0xB5,0x45,0xA2,0x8E,0xE2,0x31,0x50,0xF8, + 0x59,0x46,0xE2,0x81,0x92,0x33,0xEF,0x29,0x4A,0x57,0x3D,0x01, + 0x1E,0x55,0xFD,0x59,0xAE,0x74,0x84,0x0D,0x40,0xCA,0x14,0xF0, + 0x53,0x4F,0x23,0x80,0xEB,0x78,0xDC,0x47,0x91,0xF3,0xAA,0x44, + 0xCD,0x1A,0xC4,0x44,0x26,0x3C,0x56,0x76,0xB6,0x9F,0xC4,0xFA, + 0x9A,0xE2,0xE1,0xB8,0x44,0xA9,0xD4,0x6A,0x4F,0xF8,0xF5,0xEB, + 0xE1,0x6F,0x99,0x8E,0x30,0x6B,0x4E,0x46,0x6F,0xD9,0xB6,0xBC, + 0x8F,0xA5,0xEC,0x13,0xAC,0xB7,0xD9,0x62,0x22,0x19,0x70,0xBB, + 0x0F,0x7A,0x0A,0x8F,0xBD,0x92,0xA4,0x00,0x07,0x82,0x86,0x7A, + 0xE4,0xEF,0xF4,0xAA,0x7E,0x8C,0x66,0x7D,0xCA,0xFE,0xF5,0xFA, + 0x6B,0x6B,0x4A,0xE4,0x3A,0xA7,0xC8,0x24,0x90,0x95,0x2B,0xE1, + 0x46,0x4F,0x82,0x53,0x81,0xFF,0x00,0x68,0xAD,0xAE,0x5F,0x67, + 0x70,0xEE,0x6A,0x6D,0xD7,0x92,0xB6,0xD6,0x9F,0x88,0xA3,0x8D, + 0xC3,0xC8,0xD7,0x57,0xF5,0x41,0xB6,0x0A,0x1B,0x65,0x90,0x84, + 0x23,0x80,0x00,0xAD,0x9C,0x37,0x0E,0x74,0xEA,0xB7,0x2D,0xBE, + 0x65,0x94,0x5D,0xF5,0x3A,0x74,0x53,0x6B,0x75,0x09,0xDC,0x2A, + 0x17,0x59,0x5B,0xE4,0xE9,0x3D,0x4C,0xCD,0xF6,0x3B,0x4E,0x08, + 0x65,0x65,0x47,0xBB,0xC9,0x05,0x0A,0x1E,0xFA,0x70,0x3A,0x91, + 0xF1,0x01,0xE8,0x2B,0x43,0xD2,0xD6,0x9F,0x66,0x4A,0x72,0x9C, + 0x55,0x8A,0xEB,0x6B,0x8B,0x71,0xB6,0xB9,0x0E,0x5B,0x21,0xC6, + 0x5C,0x4E,0x08,0x3F,0xA8,0xF2,0x35,0xB3,0x8F,0xC1,0xAC,0x55, + 0x3B,0x27,0x66,0xB5,0x5F,0xBE,0x24,0xCA,0x37,0x3F,0x97,0xBB, + 0x61,0xD5,0xD1,0xB5,0x6C,0x88,0x56,0x2D,0x38,0xB3,0x26,0x23, + 0x6B,0xEF,0xA5,0xB8,0x84,0x90,0x16,0xB0,0x70,0x86,0xFD,0x79, + 0x05,0x47,0xCB,0x68,0xF3,0xA8,0xBD,0x1B,0x72,0x95,0xA2,0x35, + 0x9C,0x59,0xF2,0x4A,0x93,0x11,0xC4,0x77,0x12,0x56,0x06,0x41, + 0x6D,0x58,0xF7,0xBF,0xED,0x50,0x04,0xF8,0xE3,0x3E,0x75,0xB5, + 0xC8,0xD0,0x10,0xAD,0xBD,0xEA,0xD8,0xDE,0xF3,0xAB,0xE3,0xBC, + 0x70,0x0C,0x81,0xE4,0x31,0x51,0xCE,0x68,0xA6,0x67,0xB0,0xB8, + 0xD2,0x5A,0x25,0x2A,0xE8,0x40,0xE5,0x27,0xCC,0x57,0x3E,0x9F, + 0x0A,0x7D,0xC5,0x9E,0x92,0xE9,0xF9,0xF1,0x2A,0xA2,0xF7,0x32, + 0x2E,0xD4,0xF5,0x12,0xB5,0xF6,0xB8,0x8B,0xF6,0x43,0xEA,0x95, + 0x6C,0x80,0xCE,0xC6,0x16,0x10,0x40,0x53,0x8B,0xC1,0x5A,0xB3, + 0xE2,0x02,0x42,0x40,0xF2,0x25,0x42,0xAD,0x28,0xB6,0xCB,0x95, + 0x64,0x6A,0x3C,0x34,0x29,0x5E,0xCE,0xA0,0xAE,0xEC,0x75,0x52, + 0x40,0x23,0x8F,0x33,0x57,0x58,0x7A,0x02,0x2D,0xB2,0x31,0x6D, + 0x84,0x29,0x6B,0x51,0xCA,0xDC,0x50,0xF7,0x8F,0x90,0xF9,0x54, + 0xEE,0x9C,0xD3,0xE6,0x3B,0x80,0xEC,0xC5,0x6D,0xD0,0xC0,0x25, + 0x45,0xC2,0x7C,0xD5,0xBC,0x8B,0x65,0xBA,0xD4,0xAB,0xE9,0x9E, + 0xD1,0xB4,0xFD,0x9E,0xD8,0xDB,0x1A,0x82,0x6B,0x76,0xE9,0x31, + 0xD2,0x50,0x94,0x3A,0x76,0xA5,0xD1,0x9C,0xE5,0x04,0xF0,0x49, + 0xF2,0xEB,0x9A,0x88,0xD3,0xF7,0xE9,0x9A,0xAB,0x5A,0x49,0xBC, + 0x44,0x61,0xE8,0xB6,0xEF,0x68,0x6D,0x6C,0x17,0x50,0x50,0xBD, + 0x89,0x03,0x2E,0x10,0x79,0x05,0x44,0x70,0x0F,0x38,0x00,0x9C, + 0x73,0x8D,0x23,0x52,0x68,0x28,0x37,0x17,0x4C,0xB6,0x9D,0x72, + 0x2B,0x8A,0xE5,0xC0,0x84,0x82,0x95,0x1F,0x3C,0x78,0x1A,0x87, + 0xFB,0x0D,0x36,0xE6,0xD3,0x16,0x1B,0x65,0x2D,0xA7,0xA9,0x3D, + 0x54,0x7C,0xC9,0xF1,0x35,0xCE,0xC3,0xF0,0x79,0x29,0x65,0xA8, + 0xBF,0x8A,0x7B,0xDF,0x7F,0x25,0xCB,0xF6,0xC5,0x54,0x5D,0xB2, + 0xBD,0x88,0xEE,0xD1,0x34,0xE1,0xBA,0x0F,0xB6,0xAC,0xC5,0x4C, + 0xCF,0x64,0xF7,0x9F,0x76,0x39,0x27,0xC5,0x40,0x78,0x9F,0x31, + 0xE3,0xF3,0xEB,0x57,0x85,0xDA,0xB0,0x8D,0x6F,0x5D,0x93,0x5B, + 0xD8,0x5C,0x91,0x1C,0xFB,0x8B,0x7E,0x3B,0x3E,0xD0,0xD2,0xD2, + 0x31,0xF1,0x36,0x72,0xB0,0x73,0xE0,0x02,0xB1,0x8C,0xE6,0xB5, + 0xDB,0x14,0x17,0x0B,0x60,0x2C,0x1A,0x8A,0xD6,0x1A,0x06,0xD5, + 0x77,0xDC,0xF3,0xD1,0x00,0x78,0xF5,0x71,0xB3,0xB5,0x47,0xE7, + 0x8E,0xBF,0x5A,0xDC,0xC5,0x70,0xB5,0x39,0x66,0xA7,0xCF,0x75, + 0xF5,0x5D,0x3E,0x44,0xB8,0xB5,0xB1,0x95,0x5B,0x6F,0x5D,0x8B, + 0x87,0x0C,0xA8,0xF7,0x29,0xD0,0x37,0x28,0xFF,0x00,0x67,0x90, + 0x97,0x1B,0x23,0xE4,0x95,0xA4,0x2B,0x1E,0xA4,0x9A,0xB3,0x33, + 0xDA,0x8E,0x8C,0x81,0x19,0x50,0xEC,0xAC,0x5C,0x64,0x23,0x6F, + 0x2E,0x45,0x86,0xE3,0xC1,0x7E,0x85,0xC0,0x9C,0x03,0xFC,0x9A, + 0x8E,0x7F,0xB2,0xD8,0xCC,0x3C,0x4B,0x72,0x25,0x25,0x3E,0x47, + 0x69,0xFE,0x15,0xDD,0x0F,0x42,0xC2,0x65,0x23,0xBD,0x76,0x5B, + 0xB8,0xF0,0xDC,0x00,0xFC,0x86,0x7F,0x3A,0xE6,0xCB,0x83,0x4E, + 0x4E,0xF9,0x35,0xF1,0x97,0xE0,0xA6,0x57,0xD0,0xAF,0xAA,0xE5, + 0x73,0xD5,0xDA,0x85,0x13,0x9B,0xB4,0xFB,0x13,0x51,0x23,0x2D, + 0xB6,0x52,0xFA,0xD2,0x5C,0x1B,0x88,0x24,0x92,0x32,0x13,0x9D, + 0xA0,0x01,0x9C,0xF2,0x73,0x8A,0x93,0xB0,0xF6,0x9A,0xCD,0x82, + 0xDA,0xAB,0x3D,0xEE,0xDF,0x3D,0xB5,0x47,0x75,0x61,0x0E,0x46, + 0x8E,0xB7,0xFB,0xC4,0xA9,0x45,0x58,0x21,0x23,0x29,0x50,0xC9, + 0x1C,0xF1,0xC0,0xC1,0xE7,0x02,0xC7,0x1E,0xCE,0x22,0xB5,0xDC, + 0x43,0x60,0x34,0xDE,0x72,0x40,0xF1,0x3E,0x64,0xF8,0xD7,0xE4, + 0xCD,0x0F,0x12,0xEC,0x43,0xB2,0x50,0xEB,0x6E,0x81,0x8D,0xED, + 0x90,0x09,0x1E,0xB9,0x04,0x1A,0xD9,0x7C,0x17,0x2C,0x14,0xA3, + 0x67,0x2E,0x9C,0xBD,0x0B,0x28,0x38,0xEA,0x8A,0x16,0xA4,0xED, + 0x0F,0x47,0xA2,0x6B,0xF7,0x1D,0x39,0xA7,0x2E,0x13,0xAE,0xD2, + 0x0E,0x4A,0xA6,0xC6,0x72,0x3C,0x76,0xD7,0xC0,0xEF,0x14,0x1C, + 0x48,0x24,0xE0,0x74,0x19,0x07,0xC4,0x78,0xD4,0x8E,0x9C,0xED, + 0x96,0xDC,0xD6,0x9C,0x36,0xAD,0x70,0xD4,0xD7,0xA5,0xED,0x2D, + 0x3E,0xB6,0xED,0xEB,0x7D,0xB9,0x00,0xE4,0x12,0x52,0x84,0x9D, + 0xBE,0xA0,0x81,0xE9,0xC5,0x4A,0xBD,0xD9,0xE4,0x18,0x6F,0x07, + 0x50,0xD3,0xAF,0x2C,0x1C,0xA4,0xBA,0x73,0x8F,0xA0,0x00,0x57, + 0x14,0xFE,0xCF,0x62,0xDC,0x5D,0xEF,0x9D,0x43,0xAD,0xB8,0x7E, + 0x22,0xD9,0x03,0x77,0xCF,0x20,0xD4,0x47,0x84,0x49,0x43,0x6D, + 0x7C,0xF5,0xF7,0x09,0x49,0x19,0xC5,0xF6,0xEB,0x3F,0x5E,0xEB, + 0x39,0x37,0x58,0x51,0xDD,0x85,0x06,0x3B,0x2D,0xC5,0x80,0x8D, + 0xBD,0xC9,0x6D,0xB6,0xF7,0x14,0x90,0x07,0xC2,0x4A,0x94,0x71, + 0xD0,0x80,0x13,0x90,0x2A,0xF1,0xA7,0x3B,0x53,0x7E,0xD9,0x1D, + 0x30,0x75,0x64,0x19,0x2B,0x53,0x23,0x69,0x99,0x19,0xA2,0xB2, + 0xAC,0x7E,0xF3,0x69,0xE4,0x2B,0xA7,0xC2,0x08,0xEB,0xD3,0x81, + 0x53,0xB6,0xDD,0x1A,0x98,0x49,0x43,0x31,0xD9,0xD8,0x84,0xFE, + 0x7E,0xA6,0xA5,0x27,0x68,0x38,0x57,0x46,0x33,0x26,0x39,0x0E, + 0xE3,0x1D,0xE2,0x0E,0x15,0xFF,0x00,0x3F,0x5A,0xCF,0x5B,0x84, + 0xE6,0xA6,0xAD,0xBF,0xEE,0xDF,0xBA,0x87,0x16,0xCA,0xCD,0xCB, + 0x5D,0xF6,0x38,0xFC,0x81,0x72,0x9E,0xC3,0x73,0x66,0xAF,0x00, + 0xA2,0x3C,0x77,0x4B,0xA4,0xF5,0xCA,0x90,0xDF,0x39,0xF3,0x24, + 0x67,0xCE,0xB8,0xE6,0x6A,0x4B,0x87,0x69,0x37,0x08,0x76,0x4B, + 0x5D,0xAC,0xDA,0x34,0xD4,0x57,0x43,0xAA,0x6D,0xD4,0x8E,0xF2, + 0x49,0x42,0xB2,0x92,0xA4,0xF3,0xB1,0x00,0x80,0xAE,0x7D,0xE5, + 0x1C,0x70,0x9E,0x41,0xF4,0x9B,0xD9,0x54,0x76,0x64,0x6E,0xEF, + 0xA5,0x29,0x39,0xE9,0xC0,0xFE,0x15,0x64,0xD3,0x36,0x1F,0xB2, + 0x9B,0x0C,0xC5,0x63,0xBB,0x4F,0xED,0x1F,0x15,0x7C,0xCD,0x61, + 0xA1,0xC2,0x1A,0x6B,0x32,0xB2,0xF3,0xBB,0xF4,0x0A,0x2E,0xD6, + 0x38,0xAF,0xD0,0xE6,0x69,0x59,0xCC,0xDC,0x62,0xB4,0x67,0xC4, + 0xF8,0x56,0x33,0xB4,0xA8,0x1E,0xA3,0xD0,0xE4,0x02,0x3C,0x0E, + 0x31,0x91,0x51,0xFA,0x8F,0xB4,0x4E,0xCF,0xAE,0x11,0x58,0x37, + 0xBB,0x15,0xE6,0x74,0xB8,0x68,0x50,0x65,0xBF,0xB3,0xDF,0x49, + 0x19,0xC1,0x28,0x0E,0x01,0xB7,0x92,0x91,0xCE,0x71,0xC7,0x5A, + 0xD4,0xA2,0x5B,0x3D,0xAE,0x22,0xE3,0xC9,0x68,0x38,0xD3,0x89, + 0xC2,0x92,0xA1,0xC1,0x15,0x55,0xBD,0x76,0x63,0x6A,0x53,0x85, + 0xD4,0xFB,0x51,0x49,0x39,0xEE,0xCB,0x83,0x68,0xF4,0xE9,0x9F, + 0xCE,0xA2,0xB7,0x06,0x71,0x9F,0xFC,0x5F,0xD5,0xF2,0xBD,0xAD, + 0xF8,0xF8,0x8C,0x8D,0x3D,0x0C,0xA6,0xD2,0x8B,0x86,0xAD,0xBB, + 0x5C,0xAE,0xD1,0xED,0x11,0xED,0x51,0x9C,0x57,0xDC,0x45,0x6B, + 0x8D,0xA9,0x00,0x0C,0x67,0xA6,0xF3,0x82,0x48,0x1C,0x0C,0xE3, + 0x27,0xA9,0xBC,0xDA,0xFB,0x44,0x83,0x16,0x10,0xB6,0xEA,0x98, + 0xCF,0xB2,0xA4,0xA7,0xBA,0x5B,0xCA,0x64,0xB8,0xCB,0xA3,0x04, + 0x12,0xBC,0x0F,0x77,0xA7,0x21,0x40,0x75,0xC0,0xCD,0x58,0x2C, + 0xDA,0x74,0xC2,0x5A,0x1B,0x65,0xA0,0xDB,0x68,0xE1,0x29,0x03, + 0x81,0x5D,0xB7,0xDD,0x0B,0x02,0xF0,0x82,0xFB,0x89,0x71,0x89, + 0x04,0x7B,0xCB,0x68,0x81,0xBB,0xE6,0x0D,0x5E,0xBF,0x07,0xFE, + 0x29,0xC3,0x57,0xCD,0x6D,0xED,0xF9,0x21,0xC1,0xF2,0x32,0x59, + 0xFA,0xAF,0xB3,0x8B,0x54,0xF5,0xCB,0xD3,0x16,0x19,0xD7,0xCB, + 0x8E,0xEC,0x36,0xD3,0xAB,0x52,0x21,0x36,0x70,0x0E,0xF2,0xE1, + 0x4F,0x23,0xD0,0x15,0x1C,0x9C,0x11,0xE5,0x69,0xB6,0x76,0xC3, + 0x1A,0x16,0x95,0x84,0xCD,0xE5,0xE3,0x72,0xBE,0xA9,0x0B,0x53, + 0xEC,0x5B,0xE3,0x10,0x94,0xFD,0xE2,0x82,0x50,0x12,0x33,0xDD, + 0x80,0x90,0x31,0xB8,0xF2,0x31,0xC9,0xCE,0x6B,0xD1,0x3D,0x9C, + 0xC2,0x83,0x2C,0x3D,0xB1,0xC9,0x0B,0x07,0x8E,0xF7,0x04,0x0F, + 0xA6,0x3F,0x5A,0x31,0xD9,0xEC,0x2E,0xF9,0xC7,0x16,0x1E,0x53, + 0x6A,0x39,0x4B,0x40,0xE0,0x27,0xEB,0xD6,0xB1,0x2E,0x13,0x51, + 0x45,0x7F,0x15,0xEF,0xAF,0xAB,0xE9,0xE0,0x89,0x4A,0x48,0xCC, + 0xEF,0x3A,0x8A,0x14,0xBD,0x41,0x0E,0xE7,0x64,0xD2,0x92,0x6D, + 0x0D,0x43,0x7B,0xDA,0x1D,0x4B,0xB2,0x12,0xB5,0x3A,0xAE,0xF1, + 0x2A,0x1F,0x09,0x50,0x4F,0x3B,0xBC,0x7C,0x45,0x5F,0xAE,0xFA, + 0xCF,0xB3,0xAD,0x5B,0x09,0x94,0x5F,0x27,0xC8,0xB1,0xCC,0x61, + 0x21,0x09,0x91,0x2D,0x92,0x8C,0x03,0x93,0xB0,0xA8,0xFB,0xAB, + 0x03,0x9E,0x84,0xE0,0xF8,0xE0,0x9C,0xCA,0xB5,0xA3,0x98,0x64, + 0xA9,0xB6,0x62,0x21,0x08,0x5F,0x0A,0x18,0xCE,0xE1,0xEB,0x9A, + 0xFC,0x3D,0x99,0xC3,0x5A,0x0A,0x99,0x76,0x43,0x19,0xFD,0x90, + 0x42,0x92,0x3F,0x1E,0x7F,0x3A,0xBD,0x5E,0x13,0x35,0x15,0x97, + 0x5F,0x27,0x6F,0x9D,0xC6,0x56,0x8A,0xC5,0x97,0x50,0xF6,0x6B, + 0xA2,0xA4,0x49,0xB9,0xDB,0x35,0x12,0xF5,0x3D,0xC9,0xC6,0x0B, + 0x6C,0x33,0x01,0x9E,0xF0,0x27,0x24,0x13,0x92,0x38,0x04,0xED, + 0xC0,0x24,0xA4,0x0E,0x72,0x79,0x18,0xAC,0x5A,0xDB,0xBB,0x6A, + 0x5D,0x51,0x23,0x53,0x5D,0x9A,0xEE,0x7B,0xF7,0x42,0x92,0xD0, + 0x51,0x50,0x4A,0x53,0xF0,0xA0,0x1F,0x10,0x39,0x24,0xF4,0x24, + 0x9A,0xD1,0x5B,0xEC,0xD6,0x2B,0x4E,0xEE,0x90,0xEB,0xD2,0x00, + 0x3F,0x0E,0x36,0x83,0xF3,0xC7,0x3F,0x9D,0x4E,0xC6,0xD3,0x60, + 0x29,0x29,0x43,0x41,0x29,0x4F,0x00,0x01,0x80,0x05,0x67,0xC1, + 0xF0,0xE7,0x17,0x7A,0x8A,0xDE,0xB7,0x7F,0xFC,0x11,0x8F,0x52, + 0x9B,0x71,0xD3,0xD7,0x16,0xDC,0x6B,0x50,0x69,0xD7,0x9D,0x89, + 0x71,0x8F,0x95,0x05,0x34,0x9C,0x9F,0x5F,0x77,0xA2,0x81,0xF1, + 0x4F,0x8F,0xCE,0xBA,0xD3,0xDA,0xEB,0x0F,0xDB,0x55,0x69,0xD7, + 0x5A,0x65,0x4E,0xB6,0xB4,0xED,0x79,0xE8,0xAD,0x17,0xD8,0x77, + 0x18,0xE7,0xBB,0x19,0x71,0x2A,0xCF,0x20,0x60,0xE3,0x1F,0x16, + 0x6B,0x58,0xB0,0xD8,0xFB,0xB6,0x80,0x29,0xA8,0xAD,0x5D,0xD9, + 0xED,0xA6,0xE8,0xA5,0x3C,0xE4,0x4D,0xAF,0x1E,0x4B,0x8D,0x9D, + 0xA4,0xFC,0xFC,0x0F,0xD6,0xAF,0x8B,0xE1,0x8A,0xA4,0xB3,0x53, + 0xB7,0x97,0xD9,0xFE,0xA2,0xCD,0x35,0xB1,0x98,0x5B,0x2F,0x5D, + 0x8C,0x36,0xBF,0x69,0x8F,0x74,0x9B,0x0F,0x72,0x89,0x11,0xA4, + 0x05,0xB6,0x53,0xCF,0x4D,0xAB,0x48,0x50,0x1F,0x3C,0xD5,0xAD, + 0x8E,0xD6,0x74,0x65,0xB6,0x2A,0xA1,0xD9,0x98,0xB9,0x48,0x09, + 0x18,0xDF,0x12,0xDE,0xEB,0xA9,0x59,0xC7,0x4E,0xF0,0x27,0x6F, + 0xF3,0xCD,0x44,0x39,0xD9,0x74,0x66,0x1E,0x25,0xB9,0x32,0x80, + 0xF5,0xDA,0x7F,0x85,0x77,0xC4,0xD0,0xD0,0x99,0x48,0xEF,0x5C, + 0x96,0xE9,0x1E,0x05,0x40,0x0F,0xC8,0x67,0xF3,0xAE,0x53,0xE0, + 0xB5,0x1C,0xF3,0x65,0xD7,0xC6,0x5F,0x82,0x99,0x5A,0x77,0x48, + 0x82,0x45,0xD6,0xF1,0xAD,0xB5,0x48,0xB9,0x3D,0x09,0xDB,0x64, + 0x46,0x23,0x77,0x0C,0xB4,0xF2,0x92,0xA5,0xA1,0x2A,0x50,0x52, + 0xD6,0xB2,0x92,0x46,0x4E,0xD4,0x80,0x9C,0x9E,0x84,0xF1,0x9E, + 0x3E,0x53,0xA8,0x2E,0xBA,0x22,0xE8,0xE3,0x2E,0xC7,0x5D,0xC2, + 0xD4,0xF2,0x8A,0xF6,0x21,0x5E,0xFA,0x7F,0xC4,0x8C,0xF1,0xD7, + 0xAA,0x72,0x39,0x39,0x1E,0xB7,0x46,0x2D,0x02,0x3B,0x61,0x88, + 0x8C,0x06,0x9B,0xCE,0x70,0x9F,0x13,0xE6,0x7C,0xEA,0x40,0x69, + 0x76,0x6E,0x31,0x0C,0x79,0xAC,0x07,0x5B,0x57,0x81,0xF0,0xF5, + 0x07,0xC2,0xBA,0x1F,0xE1,0xA2,0xE9,0xDD,0xFF,0x00,0x7F,0x87, + 0x97,0xE7,0x72,0x5C,0x2F,0xAF,0x33,0x23,0xBA,0x1E,0xCB,0x6F, + 0x57,0x47,0x6E,0x7F,0xD7,0x24,0x69,0xE5,0x3A,0xB2,0xB7,0x62, + 0x4D,0x67,0xBB,0x3B,0xC9,0x25,0x4A,0x4E,0xE2,0x0E,0x09,0xE7, + 0x18,0xEA,0x4F,0x38,0xC0,0xAB,0x0A,0x3B,0x4B,0xD3,0xD6,0x3B, + 0x10,0xB1,0x68,0x48,0xB2,0x6F,0x4F,0x03,0x95,0xCB,0xDB,0xDD, + 0xB0,0xA5,0x94,0xFC,0x45,0xC3,0x91,0x81,0x8E,0x89,0xDC,0x7D, + 0x0E,0x49,0xA9,0x2B,0xB7,0x65,0x11,0xBB,0xD2,0xB8,0xF2,0x9F, + 0x6D,0x39,0xF8,0x54,0x90,0xAF,0xF6,0xAF,0x7B,0x36,0x84,0x85, + 0x6E,0x58,0x71,0x69,0x72,0x4B,0x89,0xE9,0xDE,0x7C,0x20,0xF9, + 0xE0,0x7F,0x1C,0xD6,0xAC,0x78,0x55,0x5B,0xEB,0x1F,0x56,0xF4, + 0xF6,0x5A,0x90,0x93,0x5C,0x8C,0xE1,0xBD,0x2D,0x32,0x5B,0x32, + 0x6E,0x57,0x97,0xCA,0xE7,0xCE,0x51,0x75,0xC5,0xA5,0x38,0x25, + 0x44,0x00,0x0E,0x0F,0x3B,0x40,0x00,0x00,0x7C,0x05,0x4A,0xE8, + 0x4D,0x73,0x7E,0xD0,0x2D,0x1B,0x15,0xDE,0x24,0x89,0xF6,0x70, + 0xAC,0xC7,0x5B,0x20,0x17,0x63,0xA4,0x9E,0x70,0x0E,0x37,0xA3, + 0x92,0x7F,0x79,0x3C,0x8C,0x11,0x80,0x34,0x95,0xD8,0xDC,0x90, + 0xEE,0x54,0x82,0x6A,0x41,0xDD,0x13,0x0A,0xE1,0x07,0xB9,0x99, + 0x18,0x38,0x07,0xC2,0x7A,0x14,0x9F,0x43,0x5D,0x2A,0xDC,0x36, + 0x0E,0x96,0x58,0xEF,0xE3,0xCF,0xF7,0x91,0x7C,0xB6,0xD8,0xCE, + 0xB5,0x17,0x68,0xDD,0x94,0x5E,0xE5,0xFB,0x55,0xD2,0xD9,0x73, + 0x97,0x25,0x29,0xC2,0x57,0xF6,0x3C,0x96,0xD6,0xA3,0xC7,0x05, + 0x41,0x20,0x1E,0x98,0x1B,0x81,0xC5,0x7A,0x69,0x3E,0xD3,0xB4, + 0xCC,0x48,0x13,0xFD,0xA2,0xD6,0xD6,0x9F,0x82,0x95,0x20,0xC6, + 0x60,0xA8,0xB9,0x2A,0x56,0x41,0xCF,0xB8,0x33,0x9C,0x1C,0xF0, + 0x09,0xF8,0xBA,0x0A,0xEF,0xBB,0xF6,0x53,0x6E,0x6D,0xE2,0xB4, + 0x2A,0x59,0x19,0xF8,0x4A,0xC6,0x3F,0x4C,0xD7,0x13,0x9D,0x9D, + 0xC7,0x53,0xCD,0xA9,0xA2,0xF4,0x76,0xD2,0x30,0xB4,0x27,0x9D, + 0xDE,0x44,0x13,0xD2,0xB9,0xD2,0xE1,0x33,0x71,0xFE,0xAB,0xDF, + 0xF5,0x14,0x71,0x6C,0xA8,0xF6,0x85,0xAB,0x74,0x9D,0xF6,0x43, + 0xD2,0x20,0x69,0xCB,0xF3,0xB7,0x05,0xB2,0x96,0xDB,0x92,0x54, + 0x96,0x19,0x04,0x13,0x8D,0xE8,0x5F,0xBE,0x7A,0x9F,0x84,0x57, + 0x46,0x80,0xD5,0x77,0xAD,0x08,0xA5,0x37,0x22,0x03,0x92,0xAD, + 0x33,0x0F,0x7A,0xB6,0x01,0xC2,0xDB,0x56,0x30,0x56,0x8F,0x3C, + 0xE0,0x65,0x24,0xFA,0x8F,0x10,0x6D,0x49,0xD0,0x70,0x99,0x7D, + 0x2E,0xB7,0x19,0x4A,0x5A,0x4E,0x42,0x96,0xA2,0x7F,0x2E,0x95, + 0x63,0x87,0xA4,0xDA,0x99,0x10,0xC7,0x97,0x1C,0x38,0xD9,0xF0, + 0x23,0x90,0x7C,0xC1,0xF0,0x35,0x9E,0x1C,0x21,0xAA,0x6D,0x3B, + 0x5F,0xD5,0xFB,0xFE,0x09,0x51,0x68,0x8C,0xBA,0xEB,0xDE,0xC9, + 0xEF,0xB0,0x42,0x2E,0xF7,0x6B,0x52,0x70,0x49,0x4B,0x13,0xF2, + 0xC3,0xA9,0x3C,0x67,0x00,0xED,0x5A,0x73,0x81,0xE5,0x9A,0xAF, + 0xBD,0xDA,0x4E,0x9A,0xB5,0x46,0x54,0x1E,0xCE,0x6C,0x6C,0xBF, + 0x3D,0xC2,0x52,0x26,0xA9,0xA5,0xA5,0x86,0x32,0x31,0xB8,0x2D, + 0x64,0x95,0x70,0x7A,0x23,0xAE,0x30,0x48,0xEB,0x5D,0xF7,0xEE, + 0xCA,0x59,0x2A,0x2A,0x62,0x53,0xE9,0x4F,0x92,0x92,0x15,0xF9, + 0xF1,0x5E,0x36,0x0D,0x12,0xC5,0xA6,0x52,0x5D,0x4B,0x6B,0x79, + 0xD4,0x9E,0x14,0xE7,0x38,0xF9,0x0E,0x95,0xAF,0x4B,0x83,0xCF, + 0x36,0xAA,0xDE,0x6E,0xEB,0xD9,0x04,0x9D,0xCE,0x48,0x30,0x6F, + 0x16,0x16,0xE0,0xDF,0x6E,0x86,0x44,0xE7,0x94,0xF0,0x90,0xF3, + 0x83,0x68,0x71,0x4A,0x2B,0xDC,0xA1,0x8E,0x00,0x27,0x9C,0x0F, + 0xA5,0x59,0x6F,0x9D,0xA7,0xE9,0xB4,0xDB,0x1C,0x4C,0x39,0xA2, + 0x7D,0xC5,0xE4,0x94,0x88,0x4D,0x82,0x5D,0x0A,0x23,0xF6,0x81, + 0x19,0x4F,0xCC,0xD5,0xA2,0xDD,0x01,0x52,0x63,0xAA,0x3C,0x96, + 0x83,0x8D,0x2C,0x61,0x49,0x50,0xE0,0x8A,0x8D,0x5F,0x67,0x90, + 0xD9,0x91,0xDF,0xA9,0xE7,0x9E,0x68,0x1C,0xA5,0x95,0x01,0x8F, + 0x91,0x3E,0x22,0xAD,0x5F,0x83,0x4A,0x33,0xBD,0x35,0x99,0x3E, + 0xAE,0xD6,0xFB,0xAF,0x22,0x1C,0x1A,0xD8,0xA7,0xDB,0x2D,0x17, + 0x3B,0x96,0x99,0x44,0x85,0x3C,0x5A,0x96,0xD2,0x5B,0x5B,0x0A, + 0x07,0xDF,0x52,0xD3,0xCE,0xF4,0xE7,0xA1,0xC8,0x04,0x1F,0x1A, + 0x5C,0x3B,0x42,0x85,0x75,0xB1,0x2F,0x4E,0x6B,0xC8,0x12,0x63, + 0x02,0xA4,0xA5,0x53,0x62,0x36,0x54,0x82,0xA4,0xA8,0x6D,0x59, + 0x03,0x96,0xC8,0x3C,0x90,0xA1,0xB7,0x03,0xAF,0x38,0xAB,0xDB, + 0x56,0xF7,0xFD,0xA0,0x0C,0x10,0x07,0x41,0x5F,0x37,0xED,0x07, + 0x02,0xF2,0xD9,0x75,0xE6,0x96,0xD3,0xE4,0x72,0xE3,0x47,0x04, + 0xFC,0xC7,0x43,0xFA,0xD6,0x69,0xF0,0x65,0x4E,0x0B,0xBA,0xD5, + 0xF3,0xE5,0x7F,0x2E,0x84,0xA8,0xB8,0xAD,0x0C,0xAE,0xD0,0x7B, + 0x2A,0xB1,0xCB,0x17,0x07,0x35,0xF4,0x3B,0xC8,0x6C,0xEE,0x10, + 0xA3,0xA4,0x29,0xC7,0x38,0xE9,0xB4,0x12,0x7E,0x80,0x13,0xE1, + 0xD6,0xBA,0xB5,0xB6,0xB0,0xBD,0x6B,0xE8,0xFF,0x00,0x60,0x5B, + 0x21,0x4A,0x89,0x66,0x52,0xB7,0x48,0x5B,0x84,0xA1,0xE9,0x49, + 0x19,0x3B,0x36,0xE3,0x29,0x6C,0xF1,0x9C,0xE0,0x91,0x94,0xE3, + 0x04,0xE6,0x70,0xF6,0x5A,0xD3,0x32,0x32,0xA9,0x8F,0x94,0x67, + 0xA0,0x40,0x07,0xF1,0xAB,0x0D,0xBF,0x4E,0x31,0x6E,0x8A,0x58, + 0x88,0xC6,0xDD,0xDF,0x12,0x8F,0x2A,0x57,0xCC,0xD6,0x2A,0x1C, + 0x2A,0xA6,0x7B,0xC9,0x5B,0xCD,0xDD,0xFA,0x58,0x28,0xBF,0x23, + 0x25,0xD2,0x97,0x0D,0x13,0x65,0x98,0x66,0x6A,0x66,0xEF,0x4E, + 0x5C,0x63,0x3E,0x15,0x1E,0x34,0x58,0x6B,0x5B,0x6A,0xDB,0x82, + 0x0A,0x94,0x90,0x47,0x27,0x8C,0x71,0xD3,0xAF,0x35,0x70,0xBD, + 0x76,0x9F,0xA3,0x6F,0x76,0xD7,0xA0,0x5E,0x2D,0x97,0xB4,0xC4, + 0x7B,0x92,0x53,0x05,0xC2,0x52,0x41,0xC8,0x23,0x00,0xE0,0x82, + 0x01,0xE8,0x6A,0x7D,0xDE,0xCF,0xE0,0xDC,0xA6,0x09,0x32,0x19, + 0x70,0x2F,0xC7,0x61,0xC0,0x57,0xCE,0x97,0x3E,0xCD,0xAD,0x3D, + 0xC1,0x4A,0x19,0x79,0x27,0xCC,0x38,0x7F,0x8D,0x27,0xC2,0x2A, + 0x5F,0x44,0x9F,0x8D,0xD9,0x19,0x19,0x8F,0xCC,0x9B,0xA7,0x55, + 0x76,0xDB,0xA4,0x57,0x77,0x10,0xDC,0x6B,0xEF,0xC4,0xD6,0x14, + 0xD9,0x07,0x3D,0x32,0x40,0xCF,0xE1,0xF5,0xE6,0xB7,0x8D,0x2B, + 0x32,0x04,0xDD,0x11,0x16,0x2D,0x95,0x5E,0xC6,0x65,0xC2,0x01, + 0xE9,0x71,0x80,0xDC,0xDB,0x84,0x61,0x58,0x27,0x3C,0xA5,0x59, + 0xF7,0x48,0xC6,0x41,0xCD,0x67,0x17,0x7B,0x14,0x3D,0x32,0xD9, + 0x8E,0xC4,0x7E,0xF1,0xF9,0x99,0x48,0x53,0xDC,0x84,0xA7,0x8C, + 0x93,0xF8,0xD5,0x95,0x36,0x9B,0x3E,0x84,0xD2,0xEE,0xEA,0x80, + 0xCC,0xD9,0xB7,0x00,0x81,0xF7,0x2C,0xBA,0xA0,0xDA,0x9C,0x5E, + 0x02,0x42,0x90,0x0E,0xD2,0x72,0x52,0x37,0x63,0x8C,0xF5,0xAE, + 0x6E,0x2E,0x9C,0x69,0x55,0x8D,0x36,0xEF,0x2F,0x97,0xBD,0x8A, + 0xDF,0x2B,0xB1,0x1B,0x3B,0xB0,0x4D,0x37,0x29,0xA2,0xB1,0x39, + 0x12,0x54,0xA3,0x95,0xBB,0x2A,0x30,0x79,0xD7,0x0F,0xEF,0x2D, + 0x4A,0xC9,0x27,0xE6,0x6B,0x95,0x9E,0xC2,0xA2,0xDB,0x7D,0xEB, + 0x2D,0xC2,0xD8,0xD3,0xAA,0xE1,0x79,0x8B,0xDD,0x64,0x7C,0xD2, + 0x0E,0x6A,0xAB,0x73,0xED,0x57,0xB4,0x28,0xEF,0xA9,0xC8,0xEF, + 0x58,0xE1,0xA4,0x9C,0xF7,0x26,0x22,0xDF,0x29,0xF4,0xDF,0xBD, + 0x19,0xFC,0x2B,0xCE,0xD1,0xDB,0x26,0xB9,0x6A,0x58,0x55,0xC1, + 0x9B,0x45,0xCD,0xB2,0x71,0xDD,0x32,0xC2,0xE3,0x2B,0xE8,0xAD, + 0xCB,0xCF,0xCB,0x1F,0x5A,0xD6,0x9C,0x71,0x57,0x79,0x65,0x75, + 0xE7,0xF7,0x26,0xF1,0x64,0xEB,0x51,0xAE,0x16,0x1B,0xB2,0x2C, + 0xBA,0x85,0xA0,0xD0,0x20,0x16,0x5D,0xC8,0x29,0xC7,0x87,0x23, + 0x82,0x3D,0x7C,0x3C,0x7D,0x36,0x2D,0x15,0x69,0x4B,0x49,0x42, + 0xB6,0x8A,0xCC,0xBB,0x69,0xBA,0x34,0xBB,0x3E,0x9C,0x90,0xA4, + 0x16,0x5F,0x90,0xF1,0x50,0x43,0xA3,0x0E,0x06,0xD4,0xD2,0x94, + 0x46,0x0F,0x23,0x90,0x8C,0xFA,0x81,0x5A,0x17,0x64,0x97,0x45, + 0xBD,0xA6,0xA0,0x77,0xE4,0xF7,0x9B,0x31,0xCF,0xEE,0x82,0x42, + 0x7F,0x2C,0x57,0xA0,0xE0,0xB8,0xD9,0xD7,0x86,0x49,0x6B,0xA6, + 0x8F,0xD6,0xD6,0x2D,0x07,0xAD,0x8D,0x4A,0x1B,0x41,0x0D,0x80, + 0x05,0x74,0x57,0x84,0x47,0x02,0xDB,0x04,0x57,0xBD,0x77,0x8C, + 0x82,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0xF2, + 0x79,0x94,0xB8,0x30,0x45,0x7A,0xD2,0x80,0x8E,0x36,0xE6,0xCA, + 0xB3,0xB4,0x57,0xA7,0xB1,0x23,0x6E,0x36,0xD7,0x6D,0x28,0x0E, + 0x04,0xC0,0x6C,0x2B,0x3B,0x45,0x75,0xB4,0xD8,0x40,0xC0,0x15, + 0xE9,0x4A,0x03,0xE5,0x69,0x0A,0x18,0x35,0xC4,0xF4,0x04,0x2D, + 0x59,0x29,0x15,0xDF,0x4A,0x03,0x85,0xB8,0x2D,0xA4,0x7C,0x22, + 0xBF,0x17,0x01,0xB2,0x73,0xB4,0x57,0x7D,0x28,0x0E,0x76,0x23, + 0x25,0xBE,0x83,0x15,0xD1,0x81,0x8C,0x52,0x94,0x07,0x2C,0x88, + 0xA8,0x73,0xA8,0x06,0xBC,0x5B,0xB7,0xB6,0x93,0xF0,0x8A,0x90, + 0xA5,0x01,0xC2,0xB8,0x2D,0xA8,0x7C,0x22,0xBE,0x99,0x84,0x84, + 0x1C,0x84,0x8A,0xEC,0xA5,0x01,0xE2,0xE3,0x01,0x49,0xC6,0x2A, + 0x3D,0xEB,0x63,0x6B,0x5E,0x76,0x8A,0x96,0xA5,0x01,0xC3,0x16, + 0x12,0x1A,0x1C,0x0A,0xE8,0x72,0x3A,0x14,0x30,0x40,0xAF,0x6A, + 0x50,0x11,0x4F,0xDA,0xDA,0x59,0xCE,0xC1,0x5C,0xCA,0xB3,0x37, + 0xFB,0xA2,0xA7,0xA9,0x81,0xE5,0x40,0x41,0x37,0x66,0x68,0x1C, + 0xED,0x15,0xD8,0xD5,0xB9,0xB4,0xA7,0x1B,0x45,0x48,0xE0,0x52, + 0x80,0x8A,0x7E,0xD6,0xD2,0xFA,0xA4,0x57,0x9A,0x6D,0x0D,0x0F, + 0xD8,0x15,0x33,0x4A,0x02,0x20,0x5A,0x5A,0xCF,0xC0,0x3F,0x0A, + 0xF7,0x6E,0xDE,0xDA,0x53,0x8D,0xA2,0xA4,0x29,0x40,0x44,0x48, + 0xB4,0xB4,0xE7,0x54,0x0A,0xE7,0x45,0x91,0xA4,0xAB,0x21,0x02, + 0xA7,0xE9,0x40,0x70,0x46,0x82,0x86,0xC7,0x09,0xAF,0xB7,0xE1, + 0x21,0x63,0x05,0x22,0xBB,0x29,0x40,0x44,0x8B,0x5B,0x41,0x59, + 0xDA,0x3F,0x0A,0xE9,0x4C,0x24,0x04,0xE3,0x6D,0x76,0xD2,0x80, + 0x88,0x7E,0xD4,0xD2,0xD5,0x92,0x91,0x5E,0x69,0xB3,0xB4,0x3F, + 0x64,0x54,0xDD,0x28,0x08,0x51,0x67,0x6B,0x39,0xD8,0x2B,0xD8, + 0x5B,0x1B,0x09,0xC6,0xD1,0x52,0x94,0xA0,0x21,0x1C,0xB4,0xB6, + 0x4E,0x76,0x8A,0xFD,0x6A,0xD2,0xDA,0x4E,0x76,0x8A,0x9A,0xA5, + 0x01,0xCD,0x1E,0x2A,0x1B,0x1C,0x0A,0xFB,0x76,0x3A,0x16,0x30, + 0x40,0xAF,0x6A,0x50,0x11,0x4F,0xDA,0xDA,0x59,0xF8,0x45,0x73, + 0x2A,0xCC,0xDF,0xEE,0x8A,0x9E,0xA6,0x05,0x01,0x04,0xDD,0x99, + 0xA0,0x73,0xB4,0x57,0x7B,0x10,0x1B,0x40,0xC0,0x48,0xAE,0xEA, + 0x50,0x1C,0x0F,0xC0,0x6D,0x63,0x94,0x8A,0xE3,0x5D,0xA1,0xB2, + 0x7E,0x11,0x53,0x74,0xA0,0x22,0x19,0xB5,0x36,0x93,0xF0,0x8A, + 0xEE,0x6E,0x2A,0x12,0x9C,0x60,0x57,0x4D,0x28,0x08,0xF9,0x36, + 0xE6,0xDC,0xEA,0x91,0x5C,0x66,0xCC,0xD6,0x7E,0x01,0x53,0x94, + 0xA0,0x20,0x7E,0xC5,0x67,0x3F,0x00,0xAE,0x98,0xF6,0xC6,0xDB, + 0xE8,0x91,0x52,0xB4,0xA0,0x23,0x24,0x5B,0x1B,0x71,0x38,0x29, + 0x15,0x1E,0xBB,0x0B,0x25,0x79,0xD8,0x3F,0x0A,0xB1,0xD3,0x03, + 0xCA,0x80,0x87,0x8B,0x6A,0x6D,0xAE,0x89,0x15,0xD2,0xE4,0x14, + 0x29,0x38,0xDB,0x5D,0xF4,0xA0,0x21,0xD3,0x6A,0x6C,0x2F,0x3B, + 0x45,0x76,0x22,0x12,0x02,0x31,0xB6,0xBB,0x29,0x40,0x45,0x3F, + 0x6C,0x6D,0x67,0xE1,0x15,0xE0,0x2D,0x0D,0xE7,0xE1,0x15,0x39, + 0x4C,0x0A,0x02,0x31,0x9B,0x6B,0x68,0xFD,0x91,0x5F,0xAF,0x5B, + 0x9B,0x58,0xE5,0x22,0xA4,0xA9,0x40,0x52,0xB5,0x7E,0x88,0x85, + 0x7F,0xB7,0x96,0x56,0x03,0x72,0x10,0x09,0x65,0xCC,0x74,0x27, + 0xA8,0x3E,0x60,0xD6,0x3B,0x2A,0xF9,0xA8,0xF4,0x6B,0xAF,0x59, + 0x6F,0x16,0x71,0x78,0x86,0xDA,0x7B,0xB2,0xDE,0xF4,0xA1,0xE0, + 0x8F,0x01,0xEF,0x61,0x0B,0x18,0xF1,0xC8,0xE9,0xE2,0x79,0xAF, + 0xE9,0x72,0x33,0x55,0xFD,0x53,0x62,0xB7,0xDE,0x18,0xD9,0x3A, + 0x13,0x32,0x02,0x7E,0x12,0xB4,0xE4,0xA7,0xE4,0x7A,0x8A,0xE4, + 0xF1,0x0E,0x17,0x1C,0x53,0xCF,0x1D,0x25,0xF0,0x7F,0x5F,0x53, + 0x1C,0xE1,0x7D,0x51,0xFC,0xAF,0x74,0xBD,0x76,0x6D,0x39,0xCE, + 0xFA,0xE1,0xA6,0xB5,0x45,0xB9,0xF5,0x7C,0x4C,0x32,0x42,0xD2, + 0x9F,0xAA,0x42,0xC7,0xFE,0x55,0xCF,0x6D,0xD4,0xBA,0x7A,0xD5, + 0xEF,0xE9,0xBE,0xCF,0xE5,0xC8,0x94,0x97,0x0F,0x77,0x26,0xF3, + 0x2D,0x1B,0x02,0x7A,0x64,0x25,0x19,0x3E,0xA0,0x29,0x19,0xF9, + 0x78,0x6C,0x17,0x6E,0xCB,0xEC,0x4A,0x7C,0xA9,0x10,0x9C,0x40, + 0xF2,0x0F,0x28,0xFE,0xA6,0xBD,0xAD,0x1A,0x12,0xCD,0x01,0x41, + 0x4D,0x5B,0x1A,0x2B,0x1F,0xB4,0xE6,0x57,0xF5,0xF7,0xB3,0x5C, + 0xE5,0xC0,0xEA,0x35,0x96,0x4F,0x4F,0x39,0x7E,0x3E,0x65,0x15, + 0x39,0x19,0x15,0xBE,0xC5,0xA8,0x75,0x75,0xE7,0xFA,0xCD,0xAA, + 0xE5,0x19,0x0A,0xC6,0xD6,0x5B,0x42,0x4A,0x1A,0x4A,0x78,0xC8, + 0x42,0x49,0x38,0x04,0x8E,0x54,0x79,0x38,0x03,0xA0,0x00,0x6B, + 0xFA,0x2D,0x87,0x19,0x52,0x10,0x13,0xB5,0x29,0xC0,0x00,0x0C, + 0x00,0x2A,0x77,0xEC,0x6D,0xF8,0x1B,0x3F,0x2A,0x99,0xB2,0xD9, + 0x83,0x2A,0x07,0x6D,0x77,0x70,0x98,0x4A,0x78,0x5A,0x6A,0x10, + 0x46,0x58,0xAB,0x16,0x2B,0x4E,0x7B,0x94,0xE6,0xA4,0x2B,0xC2, + 0x2B,0x5D,0xDA,0x00,0xAF,0x7A,0xDA,0x2C,0x29,0x4A,0x50,0x0A, + 0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50, + 0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A, + 0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29, + 0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40, + 0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29, + 0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5, + 0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00, + 0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5, + 0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94, + 0xA5,0x00,0xAF,0x95,0xA4,0x28,0x60,0xD7,0xD5,0x28,0x0E,0x37, + 0xA1,0x21,0x7D,0x52,0x2B,0xC7,0xEC,0xE4,0x67,0xE1,0x15,0x25, + 0x4A,0x03,0x85,0x10,0x50,0x3F,0x66,0xBA,0x5B,0x65,0x28,0xF0, + 0xAF,0x5A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29, + 0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5, + 0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5,0x00, + 0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94,0xA5, + 0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02,0x94, + 0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94,0x02, + 0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52,0x94, + 0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A,0x52, + 0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50,0x0A, + 0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A,0x50, + 0x0A,0x52,0x94,0x02,0x94,0xA5,0x00,0xA5,0x29,0x40,0x29,0x4A, + 0x50,0x0A,0x52,0x94,0x07,0xFF,0xD9}; + +#endif /* __wwwcactuscodeorg_H_ */ + diff --git a/src/make.code.defn b/src/make.code.defn new file mode 100644 index 0000000..a2f26b5 --- /dev/null +++ b/src/make.code.defn @@ -0,0 +1,9 @@ +# Main make.code.defn file for thorn httpd +# $Header$ + +# Source files in this directory +SRCS = Startup.c Server.c Sockets.c http.c Content.c + +# Subdirectories containing source files +SUBDIRS = + |