From 064e50fb06e83e6c1756e2a81c2fcbd4d6fca8e6 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 5 Apr 2021 15:57:50 -0400 Subject: [PATCH] Import all of the bug fixes from the OpenPrinting CUPS repository. Import the improvements to ippeveprinter from OpenPrinting/ippsample. Import the improvements to ippfind and ipptool from OpenPrinting/ippsample. --- CHANGES.md | 79 +- Makefile | 10 +- backend/ipp.c | 64 +- backend/network.c | 2 +- backend/org.cups.usb-quirks | 69 +- backend/snmp.c | 8 + backend/usb-unix.c | 20 +- cgi-bin/admin.c | 11 +- cgi-bin/classes.c | 6 +- cgi-bin/help-index.c | 2 +- cgi-bin/ipp-var.c | 10 +- cgi-bin/printers.c | 6 +- cgi-bin/template.c | 8 +- configure | 20 +- configure.ac | 4 +- cups/auth.c | 28 +- cups/cups.h | 6 +- cups/dest.c | 11 + cups/getifaddrs-internal.h | 1 + cups/hash.c | 2 +- cups/http-addr.c | 2 +- cups/http-addrlist.c | 10 + cups/http-support.c | 7 + cups/ipp-support.c | 4 +- cups/ipp-vars.c | 20 +- cups/ipp.c | 12 +- cups/ppd-cache.c | 82 +- cups/ppd-mark.c | 2 +- cups/ppd-private.h | 2 +- cups/ppd.c | 83 +- cups/request.c | 4 +- cups/snprintf.c | 9 +- cups/testclient.c | 53 +- cups/testdest.c | 5 +- cups/tls-gnutls.c | 2 +- cups/tls-sspi.c | 91 +- doc/help/man-ipptool.html | 6 +- doc/help/man-ipptoolfile.html | 15 +- man/ipptool.1 | 11 +- man/ipptoolfile.5 | 21 +- ppdc/ppdc-import.cxx | 3 + ppdc/sample.drv | 19 +- scheduler/classes.c | 2 +- scheduler/client.c | 50 +- scheduler/cups-deviced.c | 2 +- scheduler/cups-lpd.c | 2 +- scheduler/ipp.c | 22 +- scheduler/job.c | 10 +- scheduler/listen.c | 2 +- scheduler/main.c | 2 +- scheduler/printers.c | 10 +- scheduler/subscriptions.c | 2 +- systemv/cancel.c | 2 +- systemv/lp.c | 18 +- tools/ippeveprinter.c | 878 ++++++++++++---- tools/ippfind.c | 18 +- tools/ipptool.c | 1701 ++++++++++++++++++++++++------ tools/printer-lg-png.h | 1850 +++++++++++++++++++++++++++++++++ tools/printer-lg.png | Bin 0 -> 29521 bytes tools/printer-png.h | 744 +++++++------ tools/printer-sm-png.h | 235 +++++ tools/printer-sm.png | Bin 0 -> 3687 bytes tools/printer.png | Bin 4805 -> 7147 bytes vcnet/config.h | 11 +- xcode/config.h | 6 +- 65 files changed, 5201 insertions(+), 1196 deletions(-) create mode 100644 tools/printer-lg-png.h create mode 100644 tools/printer-lg.png create mode 100644 tools/printer-sm-png.h create mode 100644 tools/printer-sm.png diff --git a/CHANGES.md b/CHANGES.md index 9e1b74c7e..a32d7733c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,10 +1,82 @@ -CHANGES - 2.3.4 - 2020-04-24 (IN PROGRESS) -============================ +Change History +============== + + +Changes in CUPS v2.3.5 +---------------------- + +- The automated test suite can now be activated using `make test` for + consistency with other projects and CI environments - the old `make check` + continues to work as well, and the previous test server behavior can be + accessed by running `make testserver`. +- ippeveprinter now supports multiple icons and strings files. +- ippeveprinter now uses the system's FQDN with Avahi. +- ippeveprinter now supports Get-Printer-Attributes on "/". +- ippeveprinter now uses a deterministic "printer-uuid" value. +- ippeveprinter now uses system sounds on macOS for Identify-Printer. +- Updated ippfind to look for files in "~/Desktop" on Windows. +- Updated ippfind to honor `SKIP-XXX` directives with `PAUSE`. +- Updated IPP Everywhere support to work around printers that only advertise + color raster support but really also support grayscale (OpenPrinting #1) +- ipptool now supports DNS-SD URIs like `ipps://My%20Printer._ipps._tcp.local` + (OpenPrinting #5) +- ipptool now supports monitoring the printer state while submitting a job + with the `MONITOR-PRINTER-STATE` directive (OpenPrinting #153) +- ipptool now supports testing for unique values with the `WITH-DISTINCT-VALUES` + predicate (OpenPrinting #153) +- ipptool now supports retrying requests on a `server-error-busy` status code + (OpenPrinting #153) +- ipptool now supports `value-tag(MAX)` and `value-tag(MIN:MAX)` for the + `OF-TYPE` predicate (OpenPrinting #153) +- The scheduler now allows root backends to have world read permissions but not + world execute permissions (OpenPrinting #21) +- Failures to bind IPv6 listener sockets no longer cause errors if IPv6 is + disabled on the host (OpenPrinting #25) +- The SNMP backend now supports the HP and Ricoh vendor MIBs (OpenPrinting #28) +- The scheduler no longer includes a timestamp in files it writes (OpenPrinting #29) +- IPP Everywhere PPDs could have an "unknown" default InputSlot (OpenPrinting #44) +- The `httpAddrListen` function now uses a listen backlog of 128. +- The PPD functions now treat boolean values as case-insensitive (OpenPrinting #106) +- Temporary queue names no longer end with an underscore (OpenPrinting #110) +- Added USB quirks (Issue #5789, #5766, #5823, #5831, #5838, #5843, #5867) +- Fixed IPP Everywhere v1.1 conformance issues in ippeveprinter. +- Fixed DNS-SD name collision support in ippeveprinter. +- Fixed compiler and code analyzer warnings. +- Fixed TLS support on Windows. +- Fixed ippfind sub-type searches with Avahi. +- Fixed the default hostname used by ippeveprinter on macOS. +- Fixed resolution of local IPP-USB printers with Avahi. +- Fixed coverity issues (OpenPrinting #2) +- Fixed `httpAddrConnect` issues (OpenPrinting #3) +- Fixed web interface device URI issue (OpenPrinting #4) +- Fixed lp/lpr "printer/class not found" error reporting (OpenPrinting #6) +- Fixed a memory leak in the scheduler (OpenPrinting #12) +- Fixed a potential integer overflow in the PPD hashing code (OpenPrinting #13) +- Fixed output-bin and print-quality handling issues (OpenPrinting #18) +- Fixed PPD options getting mapped to odd IPP values like "tray---4" (OpenPrinting #23) +- Fixed remote access to the cupsd.conf and log files (OpenPrinting #24) +- Fixed a logging regression caused by a previous change for Issue #5604 + (OpenPrinting #25) +- Fixed the "uri-security-supported" value from the scheduler (OpenPrinting #42) +- Fixed IPP backend crash bug with "printer-alert" values (OpenPrinting #43) +- Fixed default options that incorrectly use the "custom" prefix (OpenPrinting #48) +- Fixed a memory leak when resolving DNS-SD URIs (OpenPrinting #49) +- Fixed cupsManualCopies values in IPP Everywhere PPDs (Issue #5807) +- Fixed duplicate ColorModel entries for AirPrint printers (Issue 59) +- Fixed crash bug in `ppdOpen` (OpenPrinting #64, OpenPrinting #78) +- Fixed regression in `snprintf` emulation function (OpenPrinting #67) +- Fixed segfault in help.cgi when searching in man pages (OpenPrinting #81) +- Fixed a bug in ipptool that caused the reuse of request IDs when repeating a + test (OpenPrinting #153) +- Root certificates were incorrectly stored in "~/.cups/ssl". +- Fixed a PPD memory leak caused by emulator definitions (OpenPrinting #124) + Changes in CUPS v2.3.4 ---------------------- -- CVE-20XX-YYYY: TODO rdar://61415567 embargo +- CVE-2020-10001: Fixed a buffer (read) overflow in the `ippReadIO` function. + Changes in CUPS v2.3.3 ---------------------- @@ -16,6 +88,7 @@ Changes in CUPS v2.3.3 field. - Fixed WARNING_OPTIONS support for GCC 9.x + Changes in CUPS v2.3.2 ---------------------- diff --git a/Makefile b/Makefile index 15544627f..294ac5ea4 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # # Top-level Makefile for CUPS. # -# Copyright © 2007-2019 by Apple Inc. +# Copyright © 2007-2021 by Apple Inc. # Copyright © 1997-2007 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -230,16 +230,16 @@ uninstall: # Run the test suite... # -test: all unittests - echo Running CUPS test suite... +testserver: all unittests + echo Running CUPS test server... cd test; ./run-stp-tests.sh $(TESTOPTIONS) -check: all unittests +check test: all unittests echo Running CUPS test suite with defaults... cd test; ./run-stp-tests.sh 1 0 n n -debugcheck: all unittests +debugcheck debugtest: all unittests echo Running CUPS test suite with debug printfs... cd test; ./run-stp-tests.sh 1 0 n y diff --git a/backend/ipp.c b/backend/ipp.c index 3f3e1867d..8b1976990 100644 --- a/backend/ipp.c +++ b/backend/ipp.c @@ -2240,7 +2240,8 @@ main(int argc, /* I - Number of command-line args */ else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED) fputs("JOBSTATE: account-authorization-failed\n", stderr); - if (job_canceled) + // job_canceled can be -1 which should not be treated as CUPS_BACKEND_OK + if (job_canceled > 0) return (CUPS_BACKEND_OK); else if (ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED || ipp_status == IPP_STATUS_ERROR_FORBIDDEN || ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED) return (CUPS_BACKEND_AUTH_REQUIRED); @@ -2825,7 +2826,21 @@ new_request( */ _httpDecodeURI(phone, keyword, sizeof(phone)); - for (ptr = phone; *ptr;) + ptr = phone; + + /* + * Weed out "Custom." in the beginning, this allows to put the + * "phone" option as custom string option into the PPD so that + * print dialogs not supporting fax display the option and + * allow entering the phone number. Print dialogs also send "None" + * if no phone number got entered, filter this, too. + */ + if (!_cups_strcasecmp(phone, "None")) + *ptr = '\0'; + if (!_cups_strncasecmp(phone, "Custom.", 7)) + _cups_strcpy(ptr, ptr + 7); + + for (; *ptr;) { if (*ptr == ',') *ptr = 'p'; @@ -2835,20 +2850,36 @@ new_request( ptr ++; } - httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", NULL, NULL, 0, phone); - ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", NULL, tel_uri); - - if ((keyword = cupsGetOption("faxPrefix", num_options, - options)) != NULL && *keyword) + if (strlen(phone) > 0) { - char predial[1024]; /* Pre-dial string */ + httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", NULL, NULL, 0, phone); + ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", NULL, tel_uri); + fprintf(stderr, "DEBUG: Faxing to phone %s; destination-uri: %s\n", phone, tel_uri); - _httpDecodeURI(predial, keyword, sizeof(predial)); - ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT, "pre-dial-string", NULL, predial); - } + if ((keyword = cupsGetOption("faxPrefix", num_options, options)) != NULL && *keyword) + { + char predial[1024]; /* Pre-dial string */ + + _httpDecodeURI(predial, keyword, sizeof(predial)); + ptr = predial; + if (!_cups_strcasecmp(ptr, "None")) + *ptr = '\0'; + if (!_cups_strncasecmp(ptr, "Custom.", 7)) + ptr += 7; + if (strlen(ptr) > 0) + { + ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT, "pre-dial-string", NULL, ptr); + fprintf(stderr, "DEBUG: Pre-dialing %s; pre-dial-string: %s\n", ptr, ptr); + } + else + fprintf(stderr, "WARNING: Pre-dial number for fax not valid! Sending fax without pre-dial number.\n"); + } - ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination); - ippDelete(destination); + ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination); + ippDelete(destination); + } + else + fprintf(stderr, "ERROR: Phone number for fax not valid! Fax cannot be sent.\n"); } } else @@ -3075,7 +3106,7 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */ * Report alerts and messages... */ - if ((pa = ippFindAttribute(ipp, "printer-alert", IPP_TAG_TEXT)) != NULL) + if ((pa = ippFindAttribute(ipp, "printer-alert", IPP_TAG_STRING)) != NULL) report_attr(pa); if ((pam = ippFindAttribute(ipp, "printer-alert-message", @@ -3116,11 +3147,10 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */ if (*ptr < ' ' && *ptr > 0 && *ptr != '\t') { /* - * Substitute "" for the control character; sprintf is safe because - * we always leave 6 chars free at the end... + * Substitute "" for the control character... */ - sprintf(valptr, "<%02X>", *ptr); + snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "<%02X>", *ptr); valptr += 4; } else diff --git a/backend/network.c b/backend/network.c index 5af0a8eea..f7ee2fbbe 100644 --- a/backend/network.c +++ b/backend/network.c @@ -258,7 +258,7 @@ backendNetworkSideCB( i < packet.object_value.string.num_bytes && dataptr < (data + sizeof(data) - 3); i ++, dataptr += 2) - sprintf(dataptr, "%02X", packet.object_value.string.bytes[i]); + snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%02X", packet.object_value.string.bytes[i]); datalen += (int)strlen(dataptr); break; diff --git a/backend/org.cups.usb-quirks b/backend/org.cups.usb-quirks index cd684d33f..83f62c165 100644 --- a/backend/org.cups.usb-quirks +++ b/backend/org.cups.usb-quirks @@ -68,7 +68,7 @@ # Canon, Inc. PIXMA iP6000D Printer (https://bugs.launchpad.net/bugs/1160638) 0x04a9 0x1095 unidir -# Canon, Inc. PIXMA iP4200 Printer (Issue #4155) +# Canon, Inc. PIXMA iP4200 Printer (Apple #4155) 0x04a9 0x10a2 unidir # Canon, Inc. PIXMA iP4300 Printer (https://bugs.launchpad.net/bugs/1032385) @@ -86,12 +86,15 @@ # Canon, Inc. MP540 Printer, https://bugzilla.redhat.com/967873 0x04a9 0x1730 unidir -# Canon, Inc. MP550 Printer (Issue #4155) +# Canon, Inc. MP550 Printer (Apple #4155) 0x04a9 0x173d unidir -# Canon, Inc. MP560 Printer (Issue #4155) +# Canon, Inc. MP560 Printer (Apple #4155) 0x04a9 0x173e unidir +# Canon, Inc. PIXMA G1501 Printer (Apple #5831) +0x04a9 0x1796 unidir + # Canon, Inc. MF4150 Printer (https://bugs.launchpad.net/bugs/1160638) 0x04a9 0x26a3 no-reattach @@ -140,7 +143,7 @@ # Samsung ML-2160 Series (https://bugzilla.redhat.com/show_bug.cgi?id=873123) 0x04e8 0x330f unidir -# All Zebra devices (https://bugs.launchpad.net/bugs/1001028) (Issue #5395) +# All Zebra devices (https://bugs.launchpad.net/bugs/1001028) (Apple #5395) 0x0a5f unidir no-reattach # Canon CP-10 @@ -230,75 +233,87 @@ # Lexmark E238 () 0x043d 0x00d7 no-reattach -# Lexmark E238 (Issue #4448) +# Lexmark E238 (Apple #4448) 0x043d 0x009a no-reattach -# Canon MX310 (Issue #4482) +# Canon MX310 (Apple #4482) 0x04a9 0x1728 unidir -# Canon MX320 (Issue #4482) +# Canon MX320 (Apple #4482) 0x04A9 0x1736 unidir -# All Intermec devices (Issue #4553) +# All Intermec devices (Apple #4553) 0x067e no-reattach -# HP LaserJet 1015 (Issue #5617) +# HP LaserJet 1010 (Apple #5789) +0x03f0 0x0c17 delay-close + +# HP LaserJet 1015 (Apple #5617) 0x03f0 0x0e17 delay-close -# HP LaserJet 1150 (Issue #4549) +# HP LaserJet 1150 (Apple #4549) 0x03f0 0x0f17 delay-close -# HP LaserJet 1300 (Issue #4549) +# HP LaserJet 1300 (Apple #4549) 0x03f0 0x1017 delay-close 0x03f0 0x1117 delay-close -# HP LaserJet 1320 (Issue #4549) +# HP LaserJet 1320 (Apple #4549) 0x03f0 0x1d17 delay-close # Canon, Inc. MP530 Printer 0x04a9 0x1712 unidir -# Xerox WorkCentre 3220 (https://bugs.launchpad.net/bugs/1406203, Issue #4789) +# Xerox WorkCentre 3220 (https://bugs.launchpad.net/bugs/1406203, Apple #4789) 0x0924 0x4294 no-reattach -# Lexmark C540n (Issue #4778) +# Lexmark C540n (Apple #4778) 0x043d 0x0139 no-reattach -# Kyocera Ecosys P6026cdn (Issue #4900) +# Kyocera Ecosys P6026cdn (Apple #4900) 0x0482 0x063f no-reattach -# Kyocera Ecosys P6130cdn (Issue #5102) +# Kyocera Ecosys P6130cdn (Apple #5102) 0x0482 0x0677 no-reattach -# Lexmark E260dn (Issue #4994) +# Lexmark E260dn (Apple #4994) 0x043d 0x0123 no-reattach -# HP LaserJet 1160 (Issue #5121) +# HP LaserJet 1160 (Apple #5121) 0x03f0 0x1e17 delay-close -# Canon, Inc. MP280 series (Issue #5221) +# Canon, Inc. MP280 series (Apple #5221) 0x04a9 0x1746 unidir -# Star Micronics printers (Issue #5251) +# Star Micronics printers (Apple #5251) 0x0519 unidir -# Lexmark Optra E310 (Issue #5259) +# Lexmark Optra E310 (Apple #5259) 0x043d 0x000c no-reattach -# HP LaserJet P1102 (Issue #5310) +# HP LaserJet P1102 (Apple #5310) 0x03F0 0x002A no-reattach # Lexmark MS317dn 0x043d 0x0226 no-reattach -# Star TSP743 (Issue #5443) +# Star TSP743 (Apple #5443) 0x0519 0x0001 delay-close -# Lexmark E120n (Issue #5478) +# Lexmark E120n (Apple #5478) 0x043d 0x00cc no-reattach -# All Xerox printers (Issue #5523) +# Lexmark E120n MT4506-100 (Apple #5766) +0x043d 0x00cd no-reattach + +# All Xerox printers (Apple #5523) 0x0924 no-reattach -# Dymo 450 Turbo (Issue #5521) -0x0922 0x0021 unidir +# Citizen CT-S4000 (Apple #5823) +0x2730 0x2008 unidir delay-close + +# All Arkscan label printers (Apple #5867) +0x2d84 unidir no-reattach + +# HP DesignJet 130 (Apple #5838) +0x03f0 0x0314 no-reattach diff --git a/backend/snmp.c b/backend/snmp.c index 66ac884c6..9572822a8 100644 --- a/backend/snmp.c +++ b/backend/snmp.c @@ -154,6 +154,8 @@ static const int UriOID[] = { CUPS_OID_ppmPortServiceNameOrURI, 1, 1, -1 }; static const int LexmarkProductOID[] = { 1,3,6,1,4,1,641,2,1,2,1,2,1,-1 }; static const int LexmarkProductOID2[] = { 1,3,6,1,4,1,674,10898,100,2,1,2,1,2,1,-1 }; static const int LexmarkDeviceIdOID[] = { 1,3,6,1,4,1,641,2,1,2,1,3,1,-1 }; +static const int HPDeviceIdOID[] = { 1,3,6,1,4,1,11,2,3,9,1,1,7,0,-1 }; +static const int RicohDeviceIdOID[] = { 1,3,6,1,4,1,367,3,2,1,1,1,11,0,-1 }; static const int XeroxProductOID[] = { 1,3,6,1,4,1,128,2,1,3,1,2,0,-1 }; static cups_array_t *DeviceURIs = NULL; static int HostNameLookups = 0; @@ -969,9 +971,15 @@ read_snmp_response(int fd) /* I - SNMP socket file descriptor */ _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, packet.community, CUPS_ASN1_GET_REQUEST, DEVICE_ID, LexmarkDeviceIdOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_ID, RicohDeviceIdOID); _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, packet.community, CUPS_ASN1_GET_REQUEST, DEVICE_PRODUCT, XeroxProductOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_ID, HPDeviceIdOID); break; case DEVICE_DESCRIPTION : diff --git a/backend/usb-unix.c b/backend/usb-unix.c index 81e20c524..d256a813b 100644 --- a/backend/usb-unix.c +++ b/backend/usb-unix.c @@ -214,21 +214,21 @@ list_devices(void) * for USB printer devices. We get the honor of trying them all... */ - sprintf(device, "/dev/usblp%d", i); + snprintf(device, sizeof(device), "/dev/usblp%d", i); if ((fd = open(device, O_RDWR | O_EXCL)) < 0) { if (errno != ENOENT) continue; - sprintf(device, "/dev/usb/lp%d", i); + snprintf(device, sizeof(device), "/dev/usb/lp%d", i); if ((fd = open(device, O_RDWR | O_EXCL)) < 0) { if (errno != ENOENT) continue; - sprintf(device, "/dev/usb/usblp%d", i); + snprintf(device, sizeof(device), "/dev/usb/usblp%d", i); if ((fd = open(device, O_RDWR | O_EXCL)) < 0) continue; @@ -258,7 +258,7 @@ list_devices(void) for (i = 0; i < 8; i ++) { - sprintf(device, "/dev/usb/printer%d", i); + snprintf(device, sizeof(device), "/dev/usb/printer%d", i); if ((fd = open(device, O_WRONLY | O_EXCL)) >= 0) { @@ -278,11 +278,11 @@ list_devices(void) for (i = 0; i < 8; i ++) { - sprintf(device, "/dev/ulpt%d", i); + snprintf(device, sizeof(device), "/dev/ulpt%d", i); if (!access(device, 0)) printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1); - sprintf(device, "/dev/unlpt%d", i); + snprintf(device, sizeof(device), "/dev/unlpt%d", i); if (!access(device, 0)) printf("direct usb:%s \"Unknown\" \"USB Printer #%d (no reset)\"\n", device, i + 1); } @@ -344,15 +344,15 @@ open_device(const char *uri, /* I - Device URI */ * for USB printer devices. We get the honor of trying them all... */ - sprintf(device, "/dev/usblp%d", i); + snprintf(device, sizeof(device), "/dev/usblp%d", i); if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT) { - sprintf(device, "/dev/usb/lp%d", i); + snprintf(device, sizeof(device), "/dev/usb/lp%d", i); if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT) { - sprintf(device, "/dev/usb/usblp%d", i); + snprintf(device, sizeof(device), "/dev/usb/usblp%d", i); if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT) continue; @@ -440,7 +440,7 @@ open_device(const char *uri, /* I - Device URI */ { for (i = 0, busy = 0; i < 8; i ++) { - sprintf(device, "/dev/usb/printer%d", i); + snprintf(device, sizeof(device), "/dev/usb/printer%d", i); if ((fd = open(device, O_WRONLY | O_EXCL)) >= 0) backendGetDeviceID(fd, device_id, sizeof(device_id), diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c index f087809f7..c6489389f 100644 --- a/cgi-bin/admin.c +++ b/cgi-bin/admin.c @@ -208,7 +208,7 @@ main(void) * bytes left in the array... */ - sprintf(ptr, "%%%02X", *url & 255); + snprintf(ptr, sizeof(encoded) - (size_t)(ptr - encoded), "%%%02X", *url & 255); ptr += 3; } else @@ -763,6 +763,13 @@ do_am_printer(http_t *http, /* I - HTTP connection */ cgiSetVariable("TEMPLATE_NAME", template); } + + /* + * Set DEVICE_URI to the actual device uri, without make and model from + * html form. + */ + + cgiSetVariable("DEVICE_URI", var); } } @@ -864,7 +871,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */ break; else { - sprintf(baudrate, "%d", baudrates[i]); + snprintf(baudrate, sizeof(baudrate), "%d", baudrates[i]); cgiSetArray("BAUDRATES", i, baudrate); } diff --git a/cgi-bin/classes.c b/cgi-bin/classes.c index 78ef08e22..718604ab2 100644 --- a/cgi-bin/classes.c +++ b/cgi-bin/classes.c @@ -362,7 +362,7 @@ show_all_classes(http_t *http, /* I - Connection to server */ if (first < 0) first = 0; - sprintf(val, "%d", count); + snprintf(val, sizeof(val), "%d", count); cgiSetVariable("TOTAL", val); for (i = 0, pclass = (ipp_attribute_t *)cupsArrayIndex(classes, first); @@ -378,13 +378,13 @@ show_all_classes(http_t *http, /* I - Connection to server */ if (first > 0) { - sprintf(val, "%d", first - CUPS_PAGE_MAX); + snprintf(val, sizeof(val), "%d", first - CUPS_PAGE_MAX); cgiSetVariable("PREV", val); } if ((first + CUPS_PAGE_MAX) < count) { - sprintf(val, "%d", first + CUPS_PAGE_MAX); + snprintf(val, sizeof(val), "%d", first + CUPS_PAGE_MAX); cgiSetVariable("NEXT", val); } diff --git a/cgi-bin/help-index.c b/cgi-bin/help-index.c index ce97e47a4..3da1010e6 100644 --- a/cgi-bin/help-index.c +++ b/cgi-bin/help-index.c @@ -579,7 +579,7 @@ helpSearchIndex(help_index_t *hi, /* I - Index */ */ for (; node; node = (help_node_t *)cupsArrayNext(hi->nodes)) - if (section && strcmp(node->section, section)) + if (node->section && section && strcmp(node->section, section)) continue; else if (filename && strcmp(node->filename, filename)) continue; diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c index 8c5a5616d..443f920a5 100644 --- a/cgi-bin/ipp-var.c +++ b/cgi-bin/ipp-var.c @@ -224,7 +224,7 @@ cgiGetIPPObjects(ipp_t *response, /* I - IPP response */ char buf[255]; /* Number buffer */ - sprintf(buf, "%d", attr->values[i].integer); + snprintf(buf, sizeof(buf), "%d", attr->values[i].integer); if (cgiDoSearch(search, buf)) add = 1; @@ -291,7 +291,7 @@ cgiMoveJobs(http_t *http, /* I - Connection to server */ char temp[255]; /* Temporary string */ - sprintf(temp, "%d", job_id); + snprintf(temp, sizeof(temp), "%d", job_id); cgiSetVariable("JOB_ID", temp); } @@ -1441,7 +1441,7 @@ cgiShowJobs(http_t *http, /* I - Connection to server */ cgiSetVariable("SECTION", section); - sprintf(val, "%d", count); + snprintf(val, sizeof(val), "%d", count); cgiSetVariable("TOTAL", val); if (which_jobs) @@ -1469,13 +1469,13 @@ cgiShowJobs(http_t *http, /* I - Connection to server */ if (first > 0) { - sprintf(val, "%d", first - CUPS_PAGE_MAX); + snprintf(val, sizeof(val), "%d", first - CUPS_PAGE_MAX); cgiSetVariable("PREV", val); } if ((first + CUPS_PAGE_MAX) < count) { - sprintf(val, "%d", first + CUPS_PAGE_MAX); + snprintf(val, sizeof(val), "%d", first + CUPS_PAGE_MAX); cgiSetVariable("NEXT", val); } diff --git a/cgi-bin/printers.c b/cgi-bin/printers.c index bbc153e3b..2a33b6832 100644 --- a/cgi-bin/printers.c +++ b/cgi-bin/printers.c @@ -379,7 +379,7 @@ show_all_printers(http_t *http, /* I - Connection to server */ if (first < 0) first = 0; - sprintf(val, "%d", count); + snprintf(val, sizeof(val), "%d", count); cgiSetVariable("TOTAL", val); for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, first); @@ -395,13 +395,13 @@ show_all_printers(http_t *http, /* I - Connection to server */ if (first > 0) { - sprintf(val, "%d", first - CUPS_PAGE_MAX); + snprintf(val, sizeof(val), "%d", first - CUPS_PAGE_MAX); cgiSetVariable("PREV", val); } if ((first + CUPS_PAGE_MAX) < count) { - sprintf(val, "%d", first + CUPS_PAGE_MAX); + snprintf(val, sizeof(val), "%d", first + CUPS_PAGE_MAX); cgiSetVariable("NEXT", val); } diff --git a/cgi-bin/template.c b/cgi-bin/template.c index 1972b4ae2..0b785b2f6 100644 --- a/cgi-bin/template.c +++ b/cgi-bin/template.c @@ -307,9 +307,9 @@ cgi_copy(FILE *out, /* I - Output file */ */ if (name[1]) - sprintf(outval, "%d", cgiGetSize(name + 1)); + snprintf(outval, sizeof(outval), "%d", cgiGetSize(name + 1)); else - sprintf(outval, "%d", element + 1); + snprintf(outval, sizeof(outval), "%d", element + 1); outptr = outval; } @@ -457,7 +457,7 @@ cgi_copy(FILE *out, /* I - Output file */ continue; else if (ch == '#') { - sprintf(s, "%d", element + 1); + snprintf(s, sizeof(compare) - (size_t)(s - compare), "%d", element + 1); s += strlen(s); } else if (ch == '{') @@ -473,7 +473,7 @@ cgi_copy(FILE *out, /* I - Output file */ *innerptr = '\0'; if (innername[0] == '#') - sprintf(s, "%d", cgiGetSize(innername + 1)); + snprintf(s, sizeof(compare) - (size_t)(s - compare), "%d", cgiGetSize(innername + 1)); else if ((innerptr = strrchr(innername, '-')) != NULL && isdigit(innerptr[1] & 255)) { diff --git a/configure b/configure index 2958d78df..0abf8c1ad 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for CUPS 2.3.4. +# Generated by GNU Autoconf 2.69 for CUPS 2.3.5. # # Report bugs to . # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='CUPS' PACKAGE_TARNAME='cups' -PACKAGE_VERSION='2.3.4' -PACKAGE_STRING='CUPS 2.3.4' +PACKAGE_VERSION='2.3.5' +PACKAGE_STRING='CUPS 2.3.5' PACKAGE_BUGREPORT='https://github.com/apple/cups/issues' PACKAGE_URL='https://www.cups.org/' @@ -1467,7 +1467,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures CUPS 2.3.4 to adapt to many kinds of systems. +\`configure' configures CUPS 2.3.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1532,7 +1532,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of CUPS 2.3.4:";; + short | recursive ) echo "Configuration of CUPS 2.3.5:";; esac cat <<\_ACEOF @@ -1713,7 +1713,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -CUPS configure 2.3.4 +CUPS configure 2.3.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2177,7 +2177,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by CUPS $as_me 2.3.4, which was +It was created by CUPS $as_me 2.3.5, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2694,7 +2694,7 @@ done ac_config_headers="$ac_config_headers config.h" -CUPS_VERSION="2.3.4" +CUPS_VERSION="2.3.5" CUPS_REVISION="" CUPS_BUILD="cups-$CUPS_VERSION" @@ -10385,7 +10385,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by CUPS $as_me 2.3.4, which was +This file was extended by CUPS $as_me 2.3.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -10448,7 +10448,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -CUPS config.status 2.3.4 +CUPS config.status 2.3.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index ae842ff7e..5ba59dd3e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl dnl Configuration script for CUPS. dnl -dnl Copyright © 2007-2020 by Apple Inc. +dnl Copyright © 2007-2021 by Apple Inc. dnl Copyright © 1997-2007 by Easy Software Products, all rights reserved. dnl dnl Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -12,7 +12,7 @@ dnl We need at least autoconf 2.60... AC_PREREQ(2.60) dnl Package name and version... -AC_INIT([CUPS], [2.3.4], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/]) +AC_INIT([CUPS], [2.3.5], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/]) sinclude(config-scripts/cups-opsys.m4) sinclude(config-scripts/cups-common.m4) diff --git a/cups/auth.c b/cups/auth.c index db45bbba6..b6fec6b98 100644 --- a/cups/auth.c +++ b/cups/auth.c @@ -90,6 +90,7 @@ static void cups_gss_printf(OM_uint32 major_status, OM_uint32 minor_status, # define cups_gss_printf(major, minor, message) # endif /* DEBUG */ #endif /* HAVE_GSSAPI */ +static int cups_is_local_connection(http_t *http); static int cups_local_auth(http_t *http); @@ -174,10 +175,10 @@ cupsDoAuthentication( DEBUG_printf(("2cupsDoAuthentication: Trying scheme \"%s\"...", scheme)); #ifdef HAVE_GSSAPI - if (!_cups_strcasecmp(scheme, "Negotiate")) + if (!_cups_strcasecmp(scheme, "Negotiate") && !cups_is_local_connection(http)) { /* - * Kerberos authentication... + * Kerberos authentication to remote server... */ int gss_status; /* Auth status */ @@ -201,7 +202,9 @@ cupsDoAuthentication( } else #endif /* HAVE_GSSAPI */ - if (_cups_strcasecmp(scheme, "Basic") && _cups_strcasecmp(scheme, "Digest")) + if (_cups_strcasecmp(scheme, "Basic") && + _cups_strcasecmp(scheme, "Digest") && + _cups_strcasecmp(scheme, "Negotiate")) { /* * Other schemes not yet supported... @@ -215,7 +218,7 @@ cupsDoAuthentication( * See if we should retry the current username:password... */ - if ((http->digest_tries > 1 || !http->userpass[0]) && (!_cups_strcasecmp(scheme, "Basic") || (!_cups_strcasecmp(scheme, "Digest")))) + if (http->digest_tries > 1 || !http->userpass[0]) { /* * Nope - get a new password from the user... @@ -295,7 +298,7 @@ cupsDoAuthentication( } } - if (http->authstring) + if (http->authstring && http->authstring[0]) { DEBUG_printf(("1cupsDoAuthentication: authstring=\"%s\".", http->authstring)); @@ -916,6 +919,14 @@ cups_gss_printf(OM_uint32 major_status,/* I - Major status code */ # endif /* DEBUG */ #endif /* HAVE_GSSAPI */ +static int /* O - 0 if not a local connection */ + /* 1 if local connection */ +cups_is_local_connection(http_t *http) /* I - HTTP connection to server */ +{ + if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0) + return 0; + return 1; +} /* * 'cups_local_auth()' - Get the local authorization certificate if @@ -958,7 +969,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */ * See if we are accessing localhost... */ - if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0) + if (!cups_is_local_connection(http)) { DEBUG_puts("8cups_local_auth: Not a local connection!"); return (1); @@ -1032,11 +1043,6 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */ } # endif /* HAVE_AUTHORIZATION_H */ -# ifdef HAVE_GSSAPI - if (cups_auth_find(www_auth, "Negotiate")) - return (1); -# endif /* HAVE_GSSAPI */ - # if defined(SO_PEERCRED) && defined(AF_LOCAL) /* * See if we can authenticate using the peer credentials provided over a diff --git a/cups/cups.h b/cups/cups.h index 3793dfbe8..826e600bc 100644 --- a/cups/cups.h +++ b/cups/cups.h @@ -1,7 +1,7 @@ /* * API definitions for CUPS. * - * Copyright © 2007-2020 by Apple Inc. + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -42,10 +42,10 @@ extern "C" { * Constants... */ -# define CUPS_VERSION 2.0304 +# define CUPS_VERSION 2.0305 # define CUPS_VERSION_MAJOR 2 # define CUPS_VERSION_MINOR 3 -# define CUPS_VERSION_PATCH 4 +# define CUPS_VERSION_PATCH 5 # define CUPS_BC_FD 3 /* Back-channel file descriptor for diff --git a/cups/dest.c b/cups/dest.c index cde987a09..4d0c25032 100644 --- a/cups/dest.c +++ b/cups/dest.c @@ -1839,7 +1839,10 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT cupsEnumDests(0, 1000, NULL, 0, 0, (cups_dest_cb_t)cups_name_cb, &data); if (!data.dest) + { + _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist."), 1); return (NULL); + } dest = data.dest; } @@ -4366,5 +4369,13 @@ cups_queue_name( *nameptr++ = '_'; } + /* + * Remove an underscore if it is the last character and isn't the only + * character in the name... + */ + + if (nameptr > (name + 1) && nameptr[-1] == '_') + nameptr --; + *nameptr = '\0'; } diff --git a/cups/getifaddrs-internal.h b/cups/getifaddrs-internal.h index 35e98be77..4e20f73d9 100644 --- a/cups/getifaddrs-internal.h +++ b/cups/getifaddrs-internal.h @@ -25,6 +25,7 @@ # include # include # include +# include # define CUPS_SOCAST # endif /* _WIN32 */ diff --git a/cups/hash.c b/cups/hash.c index 4fbb443db..c153c6655 100644 --- a/cups/hash.c +++ b/cups/hash.c @@ -199,7 +199,7 @@ cupsHashData(const char *algorithm, /* I - Algorithm name */ goto too_small; _cupsMD5Init(&state); - _cupsMD5Append(&state, data, datalen); + _cupsMD5Append(&state, data, (int)datalen); _cupsMD5Finish(&state, hash); return (16); diff --git a/cups/http-addr.c b/cups/http-addr.c index 86749c848..8e81c6f7d 100644 --- a/cups/http-addr.c +++ b/cups/http-addr.c @@ -243,7 +243,7 @@ httpAddrListen(http_addr_t *addr, /* I - Address to bind to */ * Listen... */ - if (listen(fd, 5)) + if (listen(fd, 128)) { _cupsSetHTTPError(HTTP_STATUS_ERROR); diff --git a/cups/http-addrlist.c b/cups/http-addrlist.c index 485c6f43d..89b3d92fb 100644 --- a/cups/http-addrlist.c +++ b/cups/http-addrlist.c @@ -238,7 +238,14 @@ httpAddrConnect2( } if (!addrlist && nfds == 0) + { +#ifdef _WIN32 + errno = WSAEHOSTDOWN; +#else + errno = EHOSTDOWN; +#endif // _WIN32 break; + } /* * See if we can connect to any of the addresses so far... @@ -369,6 +376,9 @@ httpAddrConnect2( remaining -= 250; } + if (remaining <= 0) + errno = ETIMEDOUT; + while (nfds > 0) { nfds --; diff --git a/cups/http-support.c b/cups/http-support.c index 63175145e..49557300e 100644 --- a/cups/http-support.c +++ b/cups/http-support.c @@ -840,6 +840,13 @@ httpGetDateTime(const char *s) /* I - Date/time string */ DEBUG_printf(("4httpGetDateTime: day=%d, mon=\"%s\", year=%d, hour=%d, " "min=%d, sec=%d", day, mon, year, hour, min, sec)); + /* + * Check for invalid year (RFC 7231 says it's 4DIGIT) + */ + + if (year > 9999) + return (0); + /* * Convert the month name to a number from 0 to 11. */ diff --git a/cups/ipp-support.c b/cups/ipp-support.c index bfb9dff09..d9e900649 100644 --- a/cups/ipp-support.c +++ b/cups/ipp-support.c @@ -2262,7 +2262,7 @@ ippErrorString(ipp_status_t error) /* I - Error status */ * No, build an "0xxxxx" error string... */ - sprintf(cg->ipp_unknown, "0x%04x", error); + snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "0x%04x", error); return (cg->ipp_unknown); } @@ -2339,7 +2339,7 @@ ippOpString(ipp_op_t op) /* I - Operation ID */ * No, build an "0xxxxx" operation string... */ - sprintf(cg->ipp_unknown, "0x%04x", op); + snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "0x%04x", op); return (cg->ipp_unknown); } diff --git a/cups/ipp-vars.c b/cups/ipp-vars.c index 395b0ebf3..69efbd9aa 100644 --- a/cups/ipp-vars.c +++ b/cups/ipp-vars.c @@ -12,7 +12,7 @@ * Include necessary headers... */ -#include +#include "cups-private.h" #include "ipp-private.h" #include "string-private.h" #include "debug-internal.h" @@ -220,10 +220,22 @@ _ippVarsSet(_ipp_vars_t *v, /* I - IPP variables */ { if (!strcmp(name, "uri")) { - char uri[1024]; /* New printer URI */ - http_uri_status_t uri_status; /* URI status */ + char uri[1024]; /* New printer URI */ + char resolved[1024]; /* Resolved mDNS URI */ - if ((uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, value, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource))) < HTTP_URI_STATUS_OK) + if (strstr(value, "._tcp")) + { + /* + * Resolve URI... + */ + + if (!_httpResolveURI(value, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL)) + return (0); + + value = resolved; + } + + if (httpSeparateURI(HTTP_URI_CODING_ALL, value, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource)) < HTTP_URI_STATUS_OK) return (0); if (v->username[0]) diff --git a/cups/ipp.c b/cups/ipp.c index f19747d61..94a2264a6 100644 --- a/cups/ipp.c +++ b/cups/ipp.c @@ -1,7 +1,7 @@ /* * Internet Printing Protocol functions for CUPS. * - * Copyright © 2007-2020 by Apple Inc. + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -2867,7 +2867,7 @@ ippReadIO(void *src, /* I - Data source */ string[IPP_MAX_TEXT], /* Small string buffer */ *bufptr, /* Pointer into buffer */ - *bufptrEnd; /* Pointer after valid buffer range */ + *bufend; /* End of buffer */ ipp_attribute_t *attr; /* Current attribute */ ipp_tag_t tag; /* Current tag */ ipp_tag_t value_tag; /* Current value tag */ @@ -3442,7 +3442,7 @@ ippReadIO(void *src, /* I - Data source */ } bufptr = buffer; - bufptrEnd = &buffer[n]; + bufend = buffer + n; /* @@ -3457,7 +3457,7 @@ ippReadIO(void *src, /* I - Data source */ n = (bufptr[0] << 8) | bufptr[1]; - if ((bufptr + 2 + n) > bufptrEnd || n >= (int)sizeof(string)) + if ((bufptr + 2 + n) >= bufend || n >= (int)sizeof(string)) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP language length overflows value."), 1); @@ -3481,10 +3481,10 @@ ippReadIO(void *src, /* I - Data source */ value->string.language = _cupsStrAlloc((char *)string); - bufptr += 2 + n; + bufptr += 2 + n; n = (bufptr[0] << 8) | bufptr[1]; - if ((bufptr + 2 + n) > bufptrEnd) + if ((bufptr + 2 + n) > bufend) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP string length overflows value."), 1); diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c index 5965e382b..2c47d5995 100644 --- a/cups/ppd-cache.c +++ b/cups/ppd-cache.c @@ -3228,7 +3228,7 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ cupsFilePuts(fp, "*cupsFilter2: \"application/vnd.cups-pdf application/pdf 10 -\"\n"); } else - cupsFilePuts(fp, "*cupsManualCopies: true\n"); + cupsFilePuts(fp, "*cupsManualCopies: True\n"); if (is_apple) cupsFilePuts(fp, "*cupsFilter2: \"image/urf image/urf 100 -\"\n"); if (is_pwg) @@ -3620,10 +3620,12 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-source", IPP_TAG_ZERO)) != NULL) pwg_ppdize_name(ippGetString(attr, 0, NULL), ppdname, sizeof(ppdname)); else - strlcpy(ppdname, "Unknown", sizeof(ppdname)); + ppdname[0] = '\0'; if ((attr = ippFindAttribute(response, "media-source-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1) { + int have_default = ppdname[0] != '\0'; + /* Do we have a default InputSlot? */ static const char * const sources[] = { /* Standard "media-source" strings */ "auto", @@ -3678,21 +3680,31 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ "roll-10" }; - cupsFilePrintf(fp, "*OpenUI *InputSlot: PickOne\n" - "*OrderDependency: 10 AnySetup *InputSlot\n" - "*DefaultInputSlot: %s\n", ppdname); - for (i = 0, count = ippGetCount(attr); i < count; i ++) + cupsFilePuts(fp, "*OpenUI *InputSlot: PickOne\n" + "*OrderDependency: 10 AnySetup *InputSlot\n"); + if (have_default) + cupsFilePrintf(fp, "*DefaultInputSlot: %s\n", ppdname); + + for (i = 0; i < count; i ++) { keyword = ippGetString(attr, i, NULL); pwg_ppdize_name(keyword, ppdname, sizeof(ppdname)); + if (i == 0 && !have_default) + cupsFilePrintf(fp, "*DefaultInputSlot: %s\n", ppdname); + for (j = 0; j < (int)(sizeof(sources) / sizeof(sources[0])); j ++) if (!strcmp(sources[j], keyword)) { snprintf(msgid, sizeof(msgid), "media-source.%s", keyword); + + if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr)) + if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid) + msgstr = keyword; + cupsFilePrintf(fp, "*InputSlot %s: \"<>setpagedevice\"\n", ppdname, j); - cupsFilePrintf(fp, "*%s.InputSlot %s/%s: \"\"\n", lang->language, ppdname, _cupsLangString(lang, msgid)); + cupsFilePrintf(fp, "*%s.InputSlot %s/%s: \"\"\n", lang->language, ppdname, msgstr); break; } } @@ -3744,6 +3756,8 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ int wrote_color = 0; const char *default_color = NULL; /* Default */ + cupsFilePrintf(fp, "*%% ColorModel from %s\n", ippGetName(attr)); + for (i = 0, count = ippGetCount(attr); i < count; i ++) { keyword = ippGetString(attr, i, NULL); @@ -3790,6 +3804,11 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ PRINTF_COLOROPTION("RGB", _("Color"), CUPS_CSPACE_SRGB, 8) default_color = "RGB"; + + // Apparently some printers only advertise color support, so make sure + // we also do grayscale for these printers... + if (!ippContainsString(attr, "sgray_8") && !ippContainsString(attr, "black_1") && !ippContainsString(attr, "black_8") && !ippContainsString(attr, "W8") && !ippContainsString(attr, "W8-16")) + PRINTF_COLOROPTION("Gray", _("GrayScale"), CUPS_CSPACE_SW, 8) } else if (!strcasecmp(keyword, "adobe-rgb_16") || !strcmp(keyword, "ADOBERGB48") || !strcmp(keyword, "ADOBERGB24-48")) { @@ -3924,7 +3943,7 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ else strlcpy(ppdname, "Unknown", sizeof(ppdname)); - if ((attr = ippFindAttribute(response, "output-bin-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1) + if ((attr = ippFindAttribute(response, "output-bin-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 0) { ipp_attribute_t *trays = ippFindAttribute(response, "printer-output-tray", IPP_TAG_STRING); /* printer-output-tray attribute, if any */ @@ -5140,6 +5159,8 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */ { char *ptr, /* Pointer into name buffer */ *end; /* End of name buffer */ + int nodash = 1; /* Next char in IPP name cannot be a + dash (first char or after a dash) */ if (_cups_islower(*ppd)) @@ -5151,7 +5172,9 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */ const char *ppdptr; /* Pointer into PPD keyword */ for (ppdptr = ppd + 1; *ppdptr; ppdptr ++) - if (_cups_isupper(*ppdptr) || strchr(dashchars, *ppdptr)) + if (_cups_isupper(*ppdptr) || strchr(dashchars, *ppdptr) || + (*ppdptr == '-' && *(ppdptr - 1) == '-') || + (*ppdptr == '-' && *(ppdptr + 1) == '\0')) break; if (!*ppdptr) @@ -5163,19 +5186,44 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */ for (ptr = name, end = name + namesize - 1; *ppd && ptr < end; ppd ++) { - if (_cups_isalnum(*ppd) || *ppd == '-') + if (_cups_isalnum(*ppd)) + { *ptr++ = (char)tolower(*ppd & 255); - else if (strchr(dashchars, *ppd)) - *ptr++ = '-'; + nodash = 0; + } + else if (*ppd == '-' || strchr(dashchars, *ppd)) + { + if (nodash == 0) + { + *ptr++ = '-'; + nodash = 1; + } + } else + { *ptr++ = *ppd; + nodash = 0; + } - if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) && - _cups_isupper(ppd[1]) && ptr < end) - *ptr++ = '-'; - else if (!isdigit(*ppd & 255) && isdigit(ppd[1] & 255)) - *ptr++ = '-'; + if (nodash == 0) + { + if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) && + _cups_isupper(ppd[1]) && ptr < end) + { + *ptr++ = '-'; + nodash = 1; + } + else if (!isdigit(*ppd & 255) && isdigit(ppd[1] & 255)) + { + *ptr++ = '-'; + nodash = 1; + } + } } + /* Remove trailing dashes */ + while (ptr > name && *(ptr - 1) == '-') + ptr --; + *ptr = '\0'; } diff --git a/cups/ppd-mark.c b/cups/ppd-mark.c index 7ec0df473..25797b376 100644 --- a/cups/ppd-mark.c +++ b/cups/ppd-mark.c @@ -307,7 +307,7 @@ cupsMarkOptions( * Look it up in the PPD file... */ - sprintf(s, "%d", j); + snprintf(s, sizeof(s), "%d", j); if ((attr = ppdFindAttr(ppd, "cupsIPPFinishings", s)) == NULL) continue; diff --git a/cups/ppd-private.h b/cups/ppd-private.h index 7b406c971..11ddae366 100644 --- a/cups/ppd-private.h +++ b/cups/ppd-private.h @@ -35,7 +35,7 @@ extern "C" { * Constants... */ -# define _PPD_CACHE_VERSION 9 /* Version number in cache file */ +# define _PPD_CACHE_VERSION 10 /* Version number in cache file */ /* diff --git a/cups/ppd.c b/cups/ppd.c index cf84833a4..ac5dbc62b 100644 --- a/cups/ppd.c +++ b/cups/ppd.c @@ -125,6 +125,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */ free(ppd->lang_encoding); free(ppd->nickname); free(ppd->patches); + free(ppd->emulations); free(ppd->jcl_begin); free(ppd->jcl_end); free(ppd->jcl_ps); @@ -871,15 +872,15 @@ _ppdOpen( ppd_decode(ppd->jcl_ps); /* Decode quoted string */ } else if (!strcmp(keyword, "AccurateScreensSupport")) - ppd->accurate_screens = !strcmp(string, "True"); + ppd->accurate_screens = !strcasecmp(string, "True"); else if (!strcmp(keyword, "ColorDevice")) - ppd->color_device = !strcmp(string, "True"); + ppd->color_device = !strcasecmp(string, "True"); else if (!strcmp(keyword, "ContoneOnly")) - ppd->contone_only = !strcmp(string, "True"); + ppd->contone_only = !strcasecmp(string, "True"); else if (!strcmp(keyword, "cupsFlipDuplex")) - ppd->flip_duplex = !strcmp(string, "True"); + ppd->flip_duplex = !strcasecmp(string, "True"); else if (!strcmp(keyword, "cupsManualCopies")) - ppd->manual_copies = !strcmp(string, "True"); + ppd->manual_copies = !strcasecmp(string, "True"); else if (!strcmp(keyword, "cupsModelNumber")) ppd->model_number = atoi(string); else if (!strcmp(keyword, "cupsColorProfile")) @@ -1496,6 +1497,27 @@ _ppdOpen( goto error; } + if (option && (!_cups_strcasecmp(option->defchoice, "custom") || !_cups_strncasecmp(option->defchoice, "custom.", 7))) + { + /* + * "*DefaultOption: Custom..." may set the default to a custom value + * or (for a very small number of incompatible PPD files) select a + * standard choice for the option, which CUPS renames to "_Custom..." + * to avoid compatibility issues. See which this is... + */ + + char tchoice[PPD_MAX_NAME]; /* Temporary choice name */ + + snprintf(tchoice, sizeof(tchoice), "_%s", option->defchoice); + + if (ppdFindChoice(option, tchoice)) + { + strlcpy(option->defchoice, tchoice, sizeof(option->defchoice)); + + DEBUG_printf(("2_ppdOpen: Reset Default%s to %s...", option->keyword, tchoice)); + } + } + option = NULL; free(string); @@ -1510,6 +1532,27 @@ _ppdOpen( goto error; } + if (option && (!_cups_strcasecmp(option->defchoice, "custom") || !_cups_strncasecmp(option->defchoice, "custom.", 7))) + { + /* + * "*DefaultOption: Custom..." may set the default to a custom value + * or (for a very small number of incompatible PPD files) select a + * standard choice for the option, which CUPS renames to "_Custom..." + * to avoid compatibility issues. See which this is... + */ + + char tchoice[PPD_MAX_NAME]; /* Temporary choice name */ + + snprintf(tchoice, sizeof(tchoice), "_%s", option->defchoice); + + if (ppdFindChoice(option, tchoice)) + { + strlcpy(option->defchoice, tchoice, sizeof(option->defchoice)); + + DEBUG_printf(("2_ppdOpen: Reset Default%s to %s...", option->keyword, tchoice)); + } + } + option = NULL; free(string); @@ -1668,11 +1711,9 @@ _ppdOpen( * Set the default as part of the current option... */ - DEBUG_printf(("2_ppdOpen: Setting %s to %s...", keyword, string)); + strlcpy(option->defchoice, string, sizeof(option->defchoice)); - strlcpy(option->defchoice, string, sizeof(option->defchoice)); - - DEBUG_printf(("2_ppdOpen: %s is now %s...", keyword, option->defchoice)); + DEBUG_printf(("2_ppdOpen: Set %s to %s...", keyword, option->defchoice)); } else { @@ -1682,11 +1723,27 @@ _ppdOpen( ppd_option_t *toption; /* Temporary option */ - if ((toption = ppdFindOption(ppd, keyword + 7)) != NULL) { - DEBUG_printf(("2_ppdOpen: Setting %s to %s...", keyword, string)); - strlcpy(toption->defchoice, string, sizeof(toption->defchoice)); + if (!_cups_strcasecmp(string, "custom") || !_cups_strncasecmp(string, "custom.", 7)) + { + /* + * "*DefaultOption: Custom..." may set the default to a custom value + * or (for a very small number of incompatible PPD files) select a + * standard choice for the option, which CUPS renames to "_Custom..." + * to avoid compatibility issues. See which this is... + */ + + snprintf(toption->defchoice, sizeof(toption->defchoice), "_%s", string); + if (!ppdFindChoice(toption, toption->defchoice)) + strlcpy(toption->defchoice, string, sizeof(toption->defchoice)); + } + else + { + strlcpy(toption->defchoice, string, sizeof(toption->defchoice)); + } + + DEBUG_printf(("2_ppdOpen: Set %s to %s...", keyword, toption->defchoice)); } } } @@ -2847,7 +2904,7 @@ ppd_hash_option(ppd_option_t *option) /* I - Option */ for (hash = option->keyword[0], k = option->keyword + 1; *k;) - hash = 33 * hash + *k++; + hash = (int)(33U * (unsigned)hash) + *k++; return (hash & 511); } diff --git a/cups/request.c b/cups/request.c index 69a780137..ff967f05a 100644 --- a/cups/request.c +++ b/cups/request.c @@ -395,7 +395,7 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP ippDelete(response); response = NULL; - http->status = status = HTTP_STATUS_ERROR; + http->status = HTTP_STATUS_ERROR; http->error = EINVAL; } } @@ -422,7 +422,7 @@ cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP if (!cupsDoAuthentication(http, "POST", resource)) httpReconnect2(http, 30000, NULL); else - http->status = status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; + http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; } #ifdef HAVE_SSL diff --git a/cups/snprintf.c b/cups/snprintf.c index 49652e2c4..3c4685718 100644 --- a/cups/snprintf.c +++ b/cups/snprintf.c @@ -81,7 +81,8 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */ format ++; width = va_arg(ap, int); - snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width); + /* Note: Can't use snprintf here since we are implementing this function... */ + sprintf(tptr, "%d", width); tptr += strlen(tptr); } else @@ -113,7 +114,8 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */ format ++; prec = va_arg(ap, int); - snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec); + /* Note: Can't use snprintf here since we are implementing this function... */ + sprintf(tptr, "%d", prec); tptr += strlen(tptr); } else @@ -171,6 +173,7 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */ if ((width + 2) > sizeof(temp)) break; + /* Note: Can't use snprintf here since we are implementing this function... */ sprintf(temp, tformat, va_arg(ap, double)); templen = strlen(temp); @@ -202,6 +205,7 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */ if ((width + 2) > sizeof(temp)) break; + /* Note: Can't use snprintf here since we are implementing this function... */ sprintf(temp, tformat, va_arg(ap, int)); templen = strlen(temp); @@ -226,6 +230,7 @@ _cups_vsnprintf(char *buffer, /* O - Output buffer */ if ((width + 2) > sizeof(temp)) break; + /* Note: Can't use snprintf here since we are implementing this function... */ sprintf(temp, tformat, va_arg(ap, void *)); templen = strlen(temp); diff --git a/cups/testclient.c b/cups/testclient.c index cf945df98..16ac40db7 100644 --- a/cups/testclient.c +++ b/cups/testclient.c @@ -24,7 +24,7 @@ * Constants... */ -#define MAX_CLIENTS 16 /* Maximum number of client threads */ +#define MAX_CLIENTS 100 /* Maximum number of client threads */ /* @@ -44,12 +44,12 @@ typedef struct _client_data_s int grayscale, /* Force grayscale? */ keepfile; /* Keep temporary file? */ ipp_pstate_t printer_state; /* Current printer state */ - char printer_state_reasons[1024]; - /* Current printer-state-reasons */ + char printer_state_reasons[1024]; + /* Current printer-state-reasons */ int job_id; /* Job ID for submitted job */ ipp_jstate_t job_state; /* Current job state */ - char job_state_reasons[1024]; - /* Current job-state-reasons */ + char job_state_reasons[1024]; + /* Current job-state-reasons */ } _client_data_t; @@ -66,12 +66,12 @@ static int verbosity = 0; * Local functions... */ -static const char *make_raster_file(ipp_t *response, int grayscale, char *tempname, size_t tempsize, const char **format); -static void *monitor_printer(_client_data_t *data); +static const char *make_raster_file(ipp_t *response, int grayscale, char *tempname, size_t tempsize, const char **format); +static void *monitor_printer(_client_data_t *data); static void *run_client(_client_data_t *data); -static void show_attributes(const char *title, int request, ipp_t *ipp); -static void show_capabilities(ipp_t *response); -static void usage(void); +static void show_attributes(const char *title, int request, ipp_t *ipp); +static void show_capabilities(ipp_t *response); +static void usage(void); /* @@ -396,15 +396,7 @@ make_raster_file(ipp_t *response, /* I - Printer attributes */ * Figure out the the media, resolution, and color mode... */ - if ((attr = ippFindAttribute(response, "media-default", IPP_TAG_KEYWORD)) != NULL) - { - /* - * Use default media... - */ - - media = pwgMediaForPWG(ippGetString(attr, 0, NULL)); - } - else if ((attr = ippFindAttribute(response, "media-ready", IPP_TAG_KEYWORD)) != NULL) + if ((attr = ippFindAttribute(response, "media-ready", IPP_TAG_KEYWORD)) != NULL) { /* * Use ready media... @@ -417,6 +409,14 @@ make_raster_file(ipp_t *response, /* I - Printer attributes */ else media = pwgMediaForPWG(ippGetString(attr, 0, NULL)); } + else if ((attr = ippFindAttribute(response, "media-default", IPP_TAG_KEYWORD)) != NULL) + { + /* + * Use default media... + */ + + media = pwgMediaForPWG(ippGetString(attr, 0, NULL)); + } else { puts("No default or ready media reported by printer, aborting."); @@ -486,15 +486,15 @@ make_raster_file(ipp_t *response, /* I - Printer attributes */ header.cupsInteger[CUPS_RASTER_PWG_TotalPageCount] = 1; - if (header.cupsWidth > (4 * header.HWResolution[0])) + if (header.cupsWidth > (2 * header.HWResolution[0])) { xoff = header.HWResolution[0] / 2; yoff = header.HWResolution[1] / 2; } else { - xoff = 0; - yoff = 0; + xoff = header.HWResolution[0] / 4; + yoff = header.HWResolution[1] / 4; } xrep = (header.cupsWidth - 2 * xoff) / 140; @@ -603,6 +603,8 @@ make_raster_file(ipp_t *response, /* I - Printer attributes */ for (y = 0; y < header.cupsHeight; y ++) cupsRasterWritePixels(ras, line, header.cupsBytesPerLine); + free(line); + cupsRasterClose(ras); close(fd); @@ -768,11 +770,8 @@ run_client( ipp_attribute_t *attr; /* Attribute in response */ static const char * const pattrs[] = /* Printer attributes we are interested in */ { - "job-template", - "printer-defaults", - "printer-description", - "media-col-database", - "media-col-ready" + "all", + "media-col-database" }; diff --git a/cups/testdest.c b/cups/testdest.c index a65e09960..9b07e7771 100644 --- a/cups/testdest.c +++ b/cups/testdest.c @@ -410,7 +410,6 @@ print_file(http_t *http, /* I - Connection to destination */ { cups_file_t *fp; /* File to print */ int job_id; /* Job ID */ - ipp_status_t status; /* Submission status */ const char *title; /* Title of job */ char buffer[32768]; /* File buffer */ ssize_t bytes; /* Bytes read/to write */ @@ -427,7 +426,7 @@ print_file(http_t *http, /* I - Connection to destination */ else title = filename; - if ((status = cupsCreateDestJob(http, dest, dinfo, &job_id, title, num_options, options)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) + if (cupsCreateDestJob(http, dest, dinfo, &job_id, title, num_options, options) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) { printf("Unable to create job: %s\n", cupsLastErrorString()); cupsFileClose(fp); @@ -454,7 +453,7 @@ print_file(http_t *http, /* I - Connection to destination */ cupsFileClose(fp); - if ((status = cupsFinishDestDocument(http, dest, dinfo)) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) + if (cupsFinishDestDocument(http, dest, dinfo) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED) { printf("Unable to send document: %s\n", cupsLastErrorString()); return; diff --git a/cups/tls-gnutls.c b/cups/tls-gnutls.c index 329cc0eb4..25adbdfb2 100644 --- a/cups/tls-gnutls.c +++ b/cups/tls-gnutls.c @@ -939,7 +939,7 @@ http_gnutls_default_path(char *buffer,/* I - Path buffer */ /* Pointer to library globals */ - if (cg->home) + if (cg->home && getuid()) { snprintf(buffer, bufsize, "%s/.cups", cg->home); if (access(buffer, 0)) diff --git a/cups/tls-sspi.c b/cups/tls-sspi.c index ccbdf8aaf..52ded5f21 100644 --- a/cups/tls-sspi.c +++ b/cups/tls-sspi.c @@ -1332,8 +1332,6 @@ http_sspi_client(http_t *http, /* I - Client connection */ SecBufferDesc outBuffer; /* Array of SecBuffer structs */ SecBuffer outBuffers[1]; /* Security package buffer */ int ret = 0; /* Return value */ - char username[1024], /* Current username */ - common_name[1024]; /* CN=username */ DEBUG_printf(("4http_sspi_client(http=%p, hostname=\"%s\")", http, hostname)); @@ -1349,16 +1347,11 @@ http_sspi_client(http_t *http, /* I - Client connection */ * Lookup the client certificate... */ - dwSize = sizeof(username); - GetUserNameA(username, &dwSize); - snprintf(common_name, sizeof(common_name), "CN=%s", username); - - if (!http_sspi_find_credentials(http, L"ClientContainer", common_name)) - if (!http_sspi_make_credentials(http->tls, L"ClientContainer", common_name, _HTTP_MODE_CLIENT, 10)) - { - DEBUG_puts("5http_sspi_client: Unable to get client credentials."); - return (-1); - } + if (!http_sspi_find_credentials(http, L"ClientContainer", NULL)) + { + DEBUG_puts("5http_sspi_client: Unable to get client credentials."); + return (-1); + } /* * Initiate a ClientHello message and generate a token. @@ -1711,48 +1704,55 @@ http_sspi_find_credentials( goto cleanup; } - dwSize = 0; - - if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL)) + if (common_name) { - DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); - ok = FALSE; - goto cleanup; - } + dwSize = 0; - p = (PBYTE)malloc(dwSize); + if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, NULL, &dwSize, NULL)) + { + DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); + ok = FALSE; + goto cleanup; + } - if (!p) - { - DEBUG_printf(("5http_sspi_find_credentials: malloc failed for %d bytes.", dwSize)); - ok = FALSE; - goto cleanup; - } + p = (PBYTE)malloc(dwSize); - if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL)) - { - DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); - ok = FALSE; - goto cleanup; - } + if (!p) + { + DEBUG_printf(("5http_sspi_find_credentials: malloc failed for %d bytes.", dwSize)); + ok = FALSE; + goto cleanup; + } - sib.cbData = dwSize; - sib.pbData = p; + if (!CertStrToNameA(X509_ASN_ENCODING, common_name, CERT_OID_NAME_STR, NULL, p, &dwSize, NULL)) + { + DEBUG_printf(("5http_sspi_find_credentials: CertStrToName failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); + ok = FALSE; + goto cleanup; + } - storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL); + sib.cbData = dwSize; + sib.pbData = p; - if (!storedContext) - { - DEBUG_printf(("5http_sspi_find_credentials: Unable to find credentials for \"%s\".", common_name)); - ok = FALSE; - goto cleanup; + storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &sib, NULL); + + if (!storedContext) + { + DEBUG_printf(("5http_sspi_find_credentials: Unable to find credentials for \"%s\".", common_name)); + ok = FALSE; + goto cleanup; + } } ZeroMemory(&SchannelCred, sizeof(SchannelCred)); SchannelCred.dwVersion = SCHANNEL_CRED_VERSION; - SchannelCred.cCreds = 1; - SchannelCred.paCred = &storedContext; + + if (common_name) + { + SchannelCred.cCreds = 1; + SchannelCred.paCred = &storedContext; + } /* * Set supported protocols (can also be overriden in the registry...) @@ -2017,13 +2017,6 @@ http_sspi_make_credentials( SchannelCred.cCreds = 1; SchannelCred.paCred = &storedContext; - /* - * SSPI doesn't seem to like it if grbitEnabledProtocols is set for a client. - */ - - if (mode == _HTTP_MODE_SERVER) - SchannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1; - /* * Create an SSPI credential. */ diff --git a/doc/help/man-ipptool.html b/doc/help/man-ipptool.html index 5f9b86212..c908fa709 100644 --- a/doc/help/man-ipptool.html +++ b/doc/help/man-ipptool.html @@ -36,6 +36,8 @@ ipptool - perform internet printing protocol requests -P filename.plist ] [ +-R +] [ -S ] [ -T @@ -128,6 +130,8 @@ The default is to use "Transfer-Encoding: chunked" for requests with attached fi
-P filename.plist
Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (-t). This option is incompatible with the -i (interval) and -n (repeat-count) options. +
-R +
Retries tests when the "server-error-busy" status code is returned.
-S
Forces (dedicated) TLS encryption when connecting to the server.
-T seconds @@ -225,7 +229,7 @@ IANA IPP Registry (http://www.pwg.org/ipp) RFC 8011 (http://tools.ietf.org/html/rfc8011),

Copyright

-Copyright © 2007-2019 by Apple Inc. +Copyright © 2007-2021 by Apple Inc. diff --git a/doc/help/man-ipptoolfile.html b/doc/help/man-ipptoolfile.html index e0f6727d7..3154560d0 100644 --- a/doc/help/man-ipptoolfile.html +++ b/doc/help/man-ipptoolfile.html @@ -175,6 +175,9 @@ test report.
Specifies whether ipptool(8) will ignore errors and continue with subsequent tests. +
MONITOR-PRINTER-STATE [ printer-uri ] { EXPECT attribute-name [ predicate(s) ] } +
Specifies printer state monitoring tests to run in parallel with the test operation. +The monitoring tests will run until all of the EXPECT conditions are satisfied or the primary test operation has completed, whichever occurs first.
NAME "literal string"
Specifies the human-readable name of the test.
OPERATION operation-code @@ -230,8 +233,9 @@ The following predicates are understood following the EXPECT test directi
Makes the EXPECT conditions apply only if the specified variable is not defined.
IN-GROUP tag
Requires the EXPECT attribute to be in the specified group tag. -
OF-TYPE tag[|tag,...] +
OF-TYPE tag[(limits)|tag|...]
Requires the EXPECT attribute to use one of the specified value tag(s). +Most value tags also support the specification of limits in parenthesis, for example "name(42)" would allow nameWith/WithoutLanguage strings up to 42 octets in length, "name(4:MAX)" would allow nameWith/WithoutLanguage strings between 4 and 255 octets in length, and "integer(-273:MAX)" would allow integers between -273 and 2147483647.
REPEAT-LIMIT number

Specifies the maximum number of times to repeat if the REPEAT-MATCH or REPEAT-NO-MATCH predicate is specified. The default value is 1000. @@ -260,7 +264,12 @@ Specifies the maximum number of times to repeat if the REPEAT-MATCH or
WITH-ALL-VALUES "true"
Requires that all values of the EXPECT attribute match the boolean value given.
WITH-ALL-VALUES "/regular expression/" -
Requires that all values of the EXPECT attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive. +
Requires that all values of the EXPECT attribute match the regular expression, which must conform to the POSIX regular expression syntax. +Comparisons are case-sensitive. +
WITH-DISTINCT-VALUES +
Requires that all values of the EXPECT attribute are unique. +Comparisons are case-sensitive. +Only charset, enum, integer, keyword, mimeMediaType, naturalLanguage, rangeOfInteger, resolution, uriScheme attributes support this predicate.
WITH-HOSTNAME "literal string"
WITH-HOSTNAME "/regular expression/"
Requires that at least one URI value contains a matching hostname. @@ -536,7 +545,7 @@ IANA IPP Registry ( PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp), RFC 8011 (http://tools.ietf.org/html/rfc8011)

Copyright

-Copyright © 2007-2019 by Apple Inc. +Copyright © 2007-2021 by Apple Inc. diff --git a/man/ipptool.1 b/man/ipptool.1 index ce858da59..7d2cca562 100644 --- a/man/ipptool.1 +++ b/man/ipptool.1 @@ -1,12 +1,12 @@ .\" .\" ipptool man page. .\" -.\" Copyright © 2010-2019 by Apple Inc. +.\" Copyright © 2010-2021 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ipptool 1 "CUPS" "26 April 2019" "Apple Inc." +.TH ipptool 1 "CUPS" "5 April 2021" "Apple Inc." .SH NAME ipptool \- perform internet printing protocol requests .SH SYNOPSIS @@ -36,6 +36,8 @@ ipptool \- perform internet printing protocol requests .B \-P .I filename.plist ] [ +.B \-R +] [ .B \-S ] [ .B \-T @@ -139,6 +141,9 @@ The default is to use "Transfer\-Encoding: chunked" for requests with attached f Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (\fB\-t\fR). This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options. .TP 5 +.B \-R +Retries tests when the "server-error-busy" status code is returned. +.TP 5 .B \-S Forces (dedicated) TLS encryption when connecting to the server. .TP 5 @@ -249,4 +254,4 @@ IANA IPP Registry (http://www.iana.org/assignments/ipp\-registrations), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp) RFC 8011 (http://tools.ietf.org/html/rfc8011), .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2007-2021 by Apple Inc. diff --git a/man/ipptoolfile.5 b/man/ipptoolfile.5 index 700101773..0fb894c61 100644 --- a/man/ipptoolfile.5 +++ b/man/ipptoolfile.5 @@ -1,12 +1,12 @@ .\" .\" ipptoolfile man page. .\" -.\" Copyright © 2010-2019 by Apple Inc. +.\" Copyright © 2010-2021 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ipptoolfile 5 "CUPS" "15 August 2019" "Apple Inc." +.TH ipptoolfile 5 "CUPS" "5 April 2021" "Apple Inc." .SH NAME ipptoolfile \- ipptool file format .SH DESCRIPTION @@ -214,6 +214,10 @@ Specifies whether .BR ipptool (8) will ignore errors and continue with subsequent tests. .TP 5 +\fBMONITOR-PRINTER-STATE \fR[ \fIprinter-uri \fR] \fB{ EXPECT \fIattribute-name \fR[ \fIpredicate(s) \fR] \fB}\fR +Specifies printer state monitoring tests to run in parallel with the test operation. +The monitoring tests will run until all of the \fBEXPECT\fR conditions are satisfied or the primary test operation has completed, whichever occurs first. +.TP 5 \fBNAME "\fIliteral string\fB"\fR Specifies the human-readable name of the test. .TP 5 @@ -294,8 +298,9 @@ Makes the \fBEXPECT\fR conditions apply only if the specified variable is not de \fBIN\-GROUP \fItag\fR Requires the \fBEXPECT\fR attribute to be in the specified group tag. .TP 5 -\fBOF\-TYPE \fItag[|tag,...]\fR +\fBOF\-TYPE \fItag[(limits)|tag|...]\fR Requires the \fBEXPECT\fR attribute to use one of the specified value tag(s). +Most value tags also support the specification of limits in parenthesis, for example "name(42)" would allow nameWith/WithoutLanguage strings up to 42 octets in length, "name(4:MAX)" would allow nameWith/WithoutLanguage strings between 4 and 255 octets in length, and "integer(-273:MAX)" would allow integers between -273 and 2147483647. .TP 5 \fBREPEAT\-LIMIT \fInumber\fR .br @@ -342,7 +347,13 @@ Requires that all values of the \fBEXPECT\fR attribute match the number(s) or nu Requires that all values of the \fBEXPECT\fR attribute match the boolean value given. .TP 5 \fBWITH\-ALL\-VALUES "/\fIregular expression\fB/"\fR -Requires that all values of the \fBEXPECT\fR attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive. +Requires that all values of the \fBEXPECT\fR attribute match the regular expression, which must conform to the POSIX regular expression syntax. +Comparisons are case-sensitive. +.TP 5 +\fBWITH\-DISTINCT\-VALUES\fR +Requires that all values of the \fBEXPECT\fR attribute are unique. +Comparisons are case-sensitive. +Only charset, enum, integer, keyword, mimeMediaType, naturalLanguage, rangeOfInteger, resolution, uriScheme attributes support this predicate. .TP 5 \fBWITH\-HOSTNAME "\fIliteral string\fB"\fR .TP 5 @@ -652,4 +663,4 @@ IANA IPP Registry (http://www.iana.org/assignments/ipp-registrations), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp), RFC 8011 (http://tools.ietf.org/html/rfc8011) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2007-2021 by Apple Inc. diff --git a/ppdc/ppdc-import.cxx b/ppdc/ppdc-import.cxx index 04b587d7f..b4a834138 100644 --- a/ppdc/ppdc-import.cxx +++ b/ppdc/ppdc-import.cxx @@ -323,5 +323,8 @@ ppdcSource::import_ppd(const char *f) // I - Filename } } + if (ppd) + ppdClose(ppd); + return (1); } diff --git a/ppdc/sample.drv b/ppdc/sample.drv index 148cf0f54..416e545d1 100644 --- a/ppdc/sample.drv +++ b/ppdc/sample.drv @@ -56,6 +56,7 @@ #media "w108h36/1.50x0.50\"" 108 36 #media "w108h72/1.50x1.00\"" 108 72 #media "w108h144/1.50x2.00\"" 108 144 +#media "w142h227/80x50mm" 142 227 #media "w144h26/2.00x0.37\"" 144 26 #media "w144h36/2.00x0.50\"" 144 36 #media "w144h72/2.00x1.00\"" 144 72 @@ -78,7 +79,10 @@ #media "w216h90/3.00x1.25\"" 216 90 #media "w216h144/3.00x2.00\"" 216 144 #media "w216h216/3.00x3.00\"" 216 216 +#media "w216h288/3.00x4.00\"" 216 288 #media "w216h360/3.00x5.00\"" 216 360 +#media "w216h432/3.00x6.00\"" 216 432 +#media "w216h576/3.00x8.00\"" 216 576 #media "w234h144/3.25x2.00\"" 234 144 #media "w234h360/3.25x5.00\"" 234 360 #media "w234h396/3.25x5.50\"" 234 396 @@ -93,6 +97,7 @@ #media "w288h360/4.00x5.00\"" 288 360 #media "w288h432/4.00x6.00\"" 288 432 #media "w288h468/4.00x6.50\"" 288 468 +#media "w288h576/4.00x8.00\"" 288 576 #media "w288h936/4.00x13.00\"" 288 936 #media "w432h72/6.00x1.00\"" 432 72 #media "w432h144/6.00x2.00\"" 432 144 @@ -101,6 +106,7 @@ #media "w432h360/6.00x5.00\"" 432 360 #media "w432h432/6.00x6.00\"" 432 432 #media "w432h468/6.00x6.50\"" 432 468 +#media "w432h576/6.00x8.00\"" 432 576 #media "w576h72/8.00x1.00\"" 576 72 #media "w576h144/8.00x2.00\"" 576 144 #media "w576h216/8.00x3.00\"" 576 216 @@ -108,6 +114,7 @@ #media "w576h360/8.00x5.00\"" 576 360 #media "w576h432/8.00x6.00\"" 576 432 #media "w576h468/8.00x6.50\"" 576 468 +#media "w595h72/8.26x1.00\"" 595 72 // Common stuff for all drivers... Attribute "cupsVersion" "" "2.3" @@ -115,7 +122,7 @@ Attribute "FileSystem" "" "False" Attribute "LandscapeOrientation" "" "Plus90" Attribute "TTRasterizer" "" "Type42" -Copyright "Copyright (c) 2007-2019 by Apple Inc." +Copyright "Copyright (c) 2007-2021 by Apple Inc." Copyright "Copyright (c) 1997-2007 by Easy Software Products." Copyright "" Copyright "Licensed under Apache License v2.0. See the file \"LICENSE\" for more" @@ -936,12 +943,16 @@ Version "2.3" MinSize 36 36 MaxSize 576 3600 + MediaSize A4 + MediaSize A5 + MediaSize A5Rotated MediaSize w90h18 MediaSize w90h162 MediaSize w108h18 MediaSize w108h36 MediaSize w108h72 MediaSize w108h144 + MediaSize w142h227 MediaSize w144h26 MediaSize w144h36 MediaSize w144h72 @@ -959,8 +970,11 @@ Version "2.3" MediaSize w216h72 MediaSize w216h90 MediaSize w216h144 + MediaSize w216h288 MediaSize w216h216 MediaSize w216h360 + MediaSize w216h432 + MediaSize w216h576 MediaSize w234h144 MediaSize w234h360 MediaSize w234h396 @@ -975,6 +989,7 @@ Version "2.3" *MediaSize w288h360 MediaSize w288h432 MediaSize w288h468 + MediaSize w288h576 MediaSize w288h936 MediaSize w432h72 MediaSize w432h144 @@ -983,6 +998,7 @@ Version "2.3" MediaSize w432h360 MediaSize w432h432 MediaSize w432h468 + MediaSize w432h576 MediaSize w576h72 MediaSize w576h144 MediaSize w576h216 @@ -990,6 +1006,7 @@ Version "2.3" MediaSize w576h360 MediaSize w576h432 MediaSize w576h468 + MediaSize w595h72 *Resolution k 1 0 0 0 203dpi Resolution k 1 0 0 0 300dpi diff --git a/scheduler/classes.c b/scheduler/classes.c index 14d2558bf..35d0eb77d 100644 --- a/scheduler/classes.c +++ b/scheduler/classes.c @@ -688,7 +688,7 @@ cupsdSaveAllClasses(void) strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate); cupsFilePuts(fp, "# Class configuration file for " CUPS_SVERSION "\n"); - cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); + cupsFilePrintf(fp, "# Written by cupsd\n"); cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n"); /* diff --git a/scheduler/client.c b/scheduler/client.c index c2ee8f12a..479b70aed 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -2109,18 +2109,13 @@ cupsdSendHeader( } else if (auth_type == CUPSD_AUTH_NEGOTIATE) { -#if defined(SO_PEERCRED) && defined(AF_LOCAL) - if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL) - strlcpy(auth_str, "PeerCred", sizeof(auth_str)); - else -#endif /* SO_PEERCRED && AF_LOCAL */ strlcpy(auth_str, "Negotiate", sizeof(auth_str)); } - if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE && !con->is_browser && !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost")) + if (con->best && !con->is_browser && !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost")) { /* - * Add a "trc" (try root certification) parameter for local non-Kerberos + * Add a "trc" (try root certification) parameter for local * requests when the request requires system group membership - then the * client knows the root certificate can/should be used. * @@ -2789,6 +2784,25 @@ get_file(cupsd_client_t *con, /* I - Client connection */ perm_check = 0; } + else if (!strcmp(con->uri, "/admin/conf/cupsd.conf")) + { + strlcpy(filename, ConfigurationFile, len); + + perm_check = 0; + } + else if (!strncmp(con->uri, "/admin/log/", 11)) + { + if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/') + strlcpy(filename, AccessLog, len); + else if (!strncmp(con->uri + 11, "error_log", 9) && ErrorLog[0] == '/') + strlcpy(filename, ErrorLog, len); + else if (!strncmp(con->uri + 11, "page_log", 8) && PageLog[0] == '/') + strlcpy(filename, PageLog, len); + else + return (NULL); + + perm_check = 0; + } else if (!strncmp(con->uri, "/admin", 6) || !strncmp(con->uri, "/classes", 8) || !strncmp(con->uri, "/jobs", 5) || !strncmp(con->uri, "/printers", 9)) { /* @@ -2822,25 +2836,6 @@ get_file(cupsd_client_t *con, /* I - Client connection */ perm_check = 0; } - else if (!strcmp(con->uri, "/admin/conf/cupsd.conf")) - { - strlcpy(filename, ConfigurationFile, len); - - perm_check = 0; - } - else if (!strncmp(con->uri, "/admin/log/", 11)) - { - if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/') - strlcpy(filename, AccessLog, len); - else if (!strncmp(con->uri + 11, "error_log", 9) && ErrorLog[0] == '/') - strlcpy(filename, ErrorLog, len); - else if (!strncmp(con->uri + 11, "page_log", 8) && PageLog[0] == '/') - strlcpy(filename, PageLog, len); - else - return (NULL); - - perm_check = 0; - } else if (con->language) { snprintf(language, sizeof(language), "/%s", con->language->language); @@ -3471,8 +3466,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */ } else { - sprintf(content_length, "CONTENT_LENGTH=" CUPS_LLFMT, - CUPS_LLCAST con->bytes); + snprintf(content_length, sizeof(content_length), "CONTENT_LENGTH=" CUPS_LLFMT, CUPS_LLCAST con->bytes); snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s", httpGetField(con->http, HTTP_FIELD_CONTENT_TYPE)); diff --git a/scheduler/cups-deviced.c b/scheduler/cups-deviced.c index 77703b983..14478fd99 100644 --- a/scheduler/cups-deviced.c +++ b/scheduler/cups-deviced.c @@ -265,7 +265,7 @@ main(int argc, /* I - Number of command-line args */ * all others run as the unprivileged user... */ - start_backend(dent->filename, !(dent->fileinfo.st_mode & (S_IWGRP | S_IRWXO))); + start_backend(dent->filename, !(dent->fileinfo.st_mode & (S_IWGRP | S_IWOTH | S_IXOTH))); } cupsDirClose(dir); diff --git a/scheduler/cups-lpd.c b/scheduler/cups-lpd.c index 0da3d0c06..7b1dc4834 100644 --- a/scheduler/cups-lpd.c +++ b/scheduler/cups-lpd.c @@ -1268,7 +1268,7 @@ remove_jobs(const char *dest, /* I - Destination */ request = ippNewRequest(IPP_OP_CANCEL_JOB); - sprintf(uri, "ipp://localhost/jobs/%d", id); + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, diff --git a/scheduler/ipp.c b/scheduler/ipp.c index 2fe3bf25c..191844117 100644 --- a/scheduler/ipp.c +++ b/scheduler/ipp.c @@ -880,7 +880,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ * Class doesn't exist; see if we have a printer of the same name... */ - if ((pclass = cupsdFindPrinter(resource + 9)) != NULL) + if (cupsdFindPrinter(resource + 9)) { /* * Yes, return an error... @@ -2273,7 +2273,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * Printer doesn't exist; see if we have a class of the same name... */ - if ((printer = cupsdFindClass(resource + 10)) != NULL) + if (cupsdFindClass(resource + 10)) { /* * Yes, return an error... @@ -4891,7 +4891,7 @@ copy_printer_attrs( } if (printer->alert && (!ra || cupsArrayFind(ra, "printer-alert"))) - ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_STRING, "printer-alert", NULL, printer->alert); + ippAddOctetString(con->response, IPP_TAG_PRINTER, "printer-alert", printer->alert, (int)strlen(printer->alert)); if (printer->alert_description && (!ra || cupsArrayFind(ra, "printer-alert-description"))) ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-alert-description", NULL, printer->alert_description); @@ -5016,6 +5016,9 @@ copy_printer_attrs( if (!ra || cupsArrayFind(ra, "queued-job-count")) add_queued_job_count(con, printer); + if (!ra || cupsArrayFind(ra, "uri-security-supported")) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "uri-security-supported", NULL, is_encrypted ? "tls" : "none"); + copy_attrs(con->response, printer->attrs, ra, IPP_TAG_ZERO, 0, NULL); if (printer->ppd_attrs) copy_attrs(con->response, printer->ppd_attrs, ra, IPP_TAG_ZERO, 0, NULL); @@ -10866,17 +10869,13 @@ set_printer_defaults( case IPP_TAG_INTEGER : case IPP_TAG_ENUM : - sprintf(value, "%d", attr->values[0].integer); - printer->num_options = cupsAddOption(name, value, - printer->num_options, - &(printer->options)); + printer->num_options = cupsAddIntegerOption(name, attr->values[0].integer, printer->num_options, &(printer->options)); cupsdLogMessage(CUPSD_LOG_DEBUG, "Setting %s to %s...", attr->name, value); break; case IPP_TAG_RANGE : - sprintf(value, "%d-%d", attr->values[0].range.lower, - attr->values[0].range.upper); + snprintf(value, sizeof(value), "%d-%d", attr->values[0].range.lower, attr->values[0].range.upper); printer->num_options = cupsAddOption(name, value, printer->num_options, &(printer->options)); @@ -10885,10 +10884,7 @@ set_printer_defaults( break; case IPP_TAG_RESOLUTION : - sprintf(value, "%dx%d%s", attr->values[0].resolution.xres, - attr->values[0].resolution.yres, - attr->values[0].resolution.units == IPP_RES_PER_INCH ? - "dpi" : "dpcm"); + snprintf(value, sizeof(value), "%dx%d%s", attr->values[0].resolution.xres, attr->values[0].resolution.yres, attr->values[0].resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); printer->num_options = cupsAddOption(name, value, printer->num_options, &(printer->options)); diff --git a/scheduler/job.c b/scheduler/job.c index e20e7c563..a1af0603f 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -893,7 +893,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */ goto abort_job; } - sprintf(jobid, "%d", job->id); + snprintf(jobid, sizeof(jobid), "%d", job->id); argv[0] = job->printer->name; argv[1] = jobid; @@ -1247,7 +1247,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */ else if (stat(command, &backinfo)) backroot = 0; else - backroot = !(backinfo.st_mode & (S_IWGRP | S_IRWXO)); + backroot = !(backinfo.st_mode & (S_IWGRP | S_IWOTH | S_IXOTH)); argv[0] = job->printer->sanitized_device_uri; @@ -2201,7 +2201,7 @@ cupsdSaveAllJobs(void) strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate); cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n"); - cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); + cupsFilePrintf(fp, "# Written by cupsd\n"); cupsFilePrintf(fp, "NextJobId %d\n", NextJobId); /* @@ -2625,7 +2625,7 @@ cupsdSetJobState( else cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "%s", buffer); - if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED || newstate == IPP_JOB_HELD) + if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED) cupsdLogJob(job, CUPSD_LOG_ERROR, "%s", buffer); else cupsdLogJob(job, CUPSD_LOG_INFO, "%s", buffer); @@ -3229,7 +3229,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ exit_code = job->status; } - cupsdLogJob(job, CUPSD_LOG_INFO, "Backend returned status %d (%s)", + cupsdLogJob(job, CUPSD_LOG_WARN, "Backend returned status %d (%s)", exit_code, exit_code == CUPS_BACKEND_FAILED ? "failed" : exit_code == CUPS_BACKEND_AUTH_REQUIRED ? diff --git a/scheduler/listen.c b/scheduler/listen.c index 92c7c626b..dbf959b25 100644 --- a/scheduler/listen.c +++ b/scheduler/listen.c @@ -160,7 +160,7 @@ cupsdStartListening(void) if (lis->fd == -1) { - cupsdLogMessage(CUPSD_LOG_ERROR, + cupsdLogMessage(errno == EAFNOSUPPORT ? CUPSD_LOG_INFO : CUPSD_LOG_ERROR, "Unable to open listen socket for address %s:%d - %s.", s, p, strerror(errno)); diff --git a/scheduler/main.c b/scheduler/main.c index d5fdf971a..bd6080a50 100644 --- a/scheduler/main.c +++ b/scheduler/main.c @@ -581,7 +581,7 @@ main(int argc, /* I - Number of command-line args */ * Clean out old temp files and printer cache data. */ - if (!strncmp(TempDir, RequestRoot, strlen(RequestRoot))) + if (!RequestRoot || !strncmp(TempDir, RequestRoot, strlen(RequestRoot))) cupsdCleanFiles(TempDir, NULL); cupsdCleanFiles(CacheDir, "*.ipp"); diff --git a/scheduler/printers.c b/scheduler/printers.c index 432e87dc5..09ffb83bb 100644 --- a/scheduler/printers.c +++ b/scheduler/printers.c @@ -822,12 +822,15 @@ cupsdDeletePrinter( ippDelete(p->attrs); ippDelete(p->ppd_attrs); + _ppdCacheDestroy(p->pc); + mimeDeleteType(MimeDatabase, p->filetype); mimeDeleteType(MimeDatabase, p->prefiltertype); cupsdFreeStrings(&(p->users)); cupsdFreeQuotas(p); + cupsdClearString(&p->uuid); cupsdClearString(&p->uri); cupsdClearString(&p->hostname); cupsdClearString(&p->name); @@ -1503,7 +1506,7 @@ cupsdSaveAllPrinters(void) strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate); cupsFilePuts(fp, "# Printer configuration file for " CUPS_SVERSION "\n"); - cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); + cupsFilePrintf(fp, "# Written by cupsd\n"); cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n"); cupsFilePrintf(fp, "NextPrinterId %d\n", NextPrinterId); @@ -2316,8 +2319,6 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "uri-authentication-supported", NULL, auth_supported); - ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, - "uri-security-supported", NULL, "none"); if (p->printer_id) ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-id", p->printer_id); ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, @@ -4016,7 +4017,8 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */ num_qualities = 0; - if ((output_mode = ppdFindOption(ppd, "OutputMode")) != NULL) + if ((output_mode = ppdFindOption(ppd, "OutputMode")) || + (output_mode = ppdFindOption(ppd, "cupsPrintQuality"))) { if (ppdFindChoice(output_mode, "draft") || ppdFindChoice(output_mode, "fast")) diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c index 15acedca8..eca0bfa19 100644 --- a/scheduler/subscriptions.c +++ b/scheduler/subscriptions.c @@ -1051,7 +1051,7 @@ cupsdSaveAllSubscriptions(void) strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate); cupsFilePuts(fp, "# Subscription configuration file for " CUPS_SVERSION "\n"); - cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); + cupsFilePrintf(fp, "# Written by cupsd\n"); cupsFilePrintf(fp, "NextSubscriptionId %d\n", NextSubscriptionId); diff --git a/systemv/cancel.c b/systemv/cancel.c index c85a86e0c..bcd638cc4 100644 --- a/systemv/cancel.c +++ b/systemv/cancel.c @@ -274,7 +274,7 @@ main(int argc, /* I - Number of command-line arguments */ } else { - sprintf(uri, "ipp://localhost/jobs/%d", job_id); + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); } diff --git a/systemv/lp.c b/systemv/lp.c index 298c15825..fd818a56d 100644 --- a/systemv/lp.c +++ b/systemv/lp.c @@ -161,6 +161,12 @@ main(int argc, /* I - Number of command-line arguments */ "name."), argv[0]); return (1); } + else if (cupsLastError() == IPP_STATUS_ERROR_NOT_FOUND) + { + _cupsLangPrintf(stderr, + _("%s: Error - The printer or class does not exist."), argv[0]); + return (1); + } break; case 'f' : /* Form */ @@ -280,9 +286,7 @@ main(int argc, /* I - Number of command-line arguments */ return (1); } - sprintf(buffer, "%d", num_copies); - num_options = cupsAddOption("copies", buffer, num_options, - &options); + num_options = cupsAddIntegerOption("copies", num_copies, num_options, &options); break; case 'o' : /* Option */ @@ -342,9 +346,7 @@ main(int argc, /* I - Number of command-line arguments */ return (1); } - sprintf(buffer, "%d", priority); - num_options = cupsAddOption("job-priority", buffer, num_options, - &options); + num_options = cupsAddIntegerOption("job-priority", priority, num_options, &options); break; case 's' : /* Silent */ @@ -660,7 +662,7 @@ restart_job(const char *command, /* I - Command name */ request = ippNewRequest(IPP_RESTART_JOB); - sprintf(uri, "ipp://localhost/jobs/%d", job_id); + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); @@ -708,7 +710,7 @@ set_job_attrs( request = ippNewRequest(IPP_SET_JOB_ATTRIBUTES); - sprintf(uri, "ipp://localhost/jobs/%d", job_id); + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); diff --git a/tools/ippeveprinter.c b/tools/ippeveprinter.c index 41954a570..87224db9d 100644 --- a/tools/ippeveprinter.c +++ b/tools/ippeveprinter.c @@ -1,10 +1,12 @@ /* * IPP Everywhere printer application for CUPS. * + * Copyright © 2021 by OpenPrinting. + * Copyright © 2020 by the IEEE-ISTO Printer Working Group. * Copyright © 2010-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information.º + * information. * * Note: This program began life as the "ippserver" sample code that first * appeared in CUPS 1.4. The name has been changed in order to distinguish it @@ -38,6 +40,7 @@ typedef ULONG nfds_t; #else extern char **environ; +# include # include # include # include @@ -48,7 +51,9 @@ extern char **environ; #elif defined(HAVE_AVAHI) # include # include +# include # include +# include # include #endif /* HAVE_DNSSD */ @@ -74,6 +79,8 @@ extern char **environ; #endif /* HAVE_LIBPAM */ #include "printer-png.h" +#include "printer-lg-png.h" +#include "printer-sm-png.h" /* @@ -178,16 +185,22 @@ typedef struct ippeve_printer_s /**** Printer data ****/ /* TODO: One IPv4 and one IPv6 listener are really not sufficient */ int ipv4, /* IPv4 listener */ ipv6; /* IPv6 listener */ - ippeve_srv_t ipp_ref, /* Bonjour IPP service */ - ipps_ref, /* Bonjour IPPS service */ - http_ref, /* Bonjour HTTP service */ - printer_ref; /* Bonjour LPD service */ - char *dnssd_name, /* printer-dnssd-name */ +#ifdef HAVE_DNSSD + ippeve_srv_t ipp_ref, /* DNS-SD IPP service */ + ipps_ref, /* DNS-SD IPPS service */ + http_ref, /* DNS-SD HTTP service */ + printer_ref; /* DNS-SD LPD service */ +#elif defined(HAVE_AVAHI) + ippeve_srv_t dnssd_ref; /* DNS-SD services */ +#endif /* HAVE_DNSSD */ + char *dnssd_subtypes;/* DNS-SD subtypes */ + int dnssd_collision;/* Name collision? */ + char *dnssd_name, /* printer-dns-sd-name */ *name, /* printer-name */ - *icon, /* Icon filename */ + *icons[3], /* Icon filenames */ + *strings, /* Strings filename */ *directory, /* Spool directory */ *hostname, /* Hostname */ - *uri, /* printer-uri-supported */ *device_uri, /* Device URI (if any) */ *output_format, /* Output format */ #if !CUPS_LITE @@ -239,7 +252,10 @@ typedef struct ippeve_client_s /**** Client data ****/ http_state_t operation; /* Request operation */ ipp_op_t operation_id; /* IPP operation-id */ char uri[1024], /* Request URI */ - *options; /* URI options */ + *options, /* URI options */ + host_field[HTTP_MAX_VALUE]; + /* Host: header */ + int host_port; /* Port number from Host: header */ http_addr_t addr; /* Client address */ char hostname[256], /* Client hostname */ username[HTTP_MAX_VALUE]; @@ -264,7 +280,7 @@ static int create_job_file(ippeve_job_t *job, char *fname, size_t fnamesize, co static int create_listener(const char *name, int port, int family); static ipp_t *create_media_col(const char *media, const char *source, const char *type, int width, int length, int bottom, int left, int right, int top); static ipp_t *create_media_size(int width, int length); -static ippeve_printer_t *create_printer(const char *servername, int serverport, const char *name, const char *location, const char *icon, cups_array_t *docformats, const char *subtypes, const char *directory, const char *command, const char *device_uri, const char *output_format, ipp_t *attrs); +static ippeve_printer_t *create_printer(const char *servername, int serverport, const char *name, const char *location, const char *icons, const char *strings, cups_array_t *docformats, const char *subtypes, const char *directory, const char *command, const char *device_uri, const char *output_format, ipp_t *attrs); static void debug_attributes(const char *title, ipp_t *ipp, int response); static void delete_client(ippeve_client_t *client); static void delete_job(ippeve_job_t *job); @@ -280,11 +296,14 @@ static int filter_cb(ippeve_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr static ippeve_job_t *find_job(ippeve_client_t *client); static void finish_document_data(ippeve_client_t *client, ippeve_job_t *job); static void finish_document_uri(ippeve_client_t *client, ippeve_job_t *job); +static void flush_document_data(ippeve_client_t *client); +static int have_document_data(ippeve_client_t *client); static void html_escape(ippeve_client_t *client, const char *s, size_t slen); static void html_footer(ippeve_client_t *client); static void html_header(ippeve_client_t *client, const char *title, int refresh); static void html_printf(ippeve_client_t *client, const char *format, ...) _CUPS_FORMAT(2, 3); static void ipp_cancel_job(ippeve_client_t *client); +static void ipp_cancel_my_jobs(ippeve_client_t *client); static void ipp_close_job(ippeve_client_t *client); static void ipp_create_job(ippeve_client_t *client); static void ipp_get_job_attributes(ippeve_client_t *client); @@ -311,7 +330,7 @@ static int process_http(ippeve_client_t *client); static int process_ipp(ippeve_client_t *client); static void *process_job(ippeve_job_t *job); static void process_state_message(ippeve_job_t *job, char *message); -static int register_printer(ippeve_printer_t *printer, const char *subtypes); +static int register_printer(ippeve_printer_t *printer); static int respond_http(ippeve_client_t *client, http_status_t code, const char *content_coding, const char *type, size_t length); static void respond_ipp(ippeve_client_t *client, ipp_status_t status, const char *message, ...) _CUPS_FORMAT(3, 4); static void respond_unsupported(ippeve_client_t *client, ipp_attribute_t *attr); @@ -368,6 +387,7 @@ main(int argc, /* I - Number of command-line args */ #if !CUPS_LITE *ppdfile = NULL, /* PPD file */ #endif /* !CUPS_LITE */ + *strings = NULL, /* Strings file */ *subtypes = "_print"; /* DNS-SD service subtype */ int legacy = 0, /* Legacy mode? */ duplex = 0, /* Duplex mode */ @@ -475,6 +495,14 @@ main(int argc, /* I - Number of command-line args */ break; #endif /* !CUPS_LITE */ + case 'S' : /* -S filename.strings */ + i ++; + if (i >= argc) + usage(1); + + strings = argv[i]; + break; + case 'V' : /* -V max-version */ i ++; if (i >= argc) @@ -699,7 +727,7 @@ main(int argc, /* I - Number of command-line args */ else attrs = load_legacy_attributes(make, model, ppm, ppm_color, duplex, docformats); - if ((printer = create_printer(servername, serverport, name, location, icon, docformats, subtypes, directory, command, device_uri, output_format, attrs)) == NULL) + if ((printer = create_printer(servername, serverport, name, location, icon, strings, docformats, subtypes, directory, command, device_uri, output_format, attrs)) == NULL) return (1); printer->web_forms = web_forms; @@ -1177,7 +1205,11 @@ create_job(ippeve_client_t *client) /* I - Client */ job->id = client->printer->next_job_id ++; - snprintf(uri, sizeof(uri), "%s/%d", client->printer->uri, job->id); + if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL) + snprintf(uri, sizeof(uri), "%s/%d", ippGetString(attr, 0, NULL), job->id); + else + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, client->printer->hostname, client->printer->port, "/ipp/print/%d", job->id); + httpAssembleUUID(client->printer->hostname, client->printer->port, client->printer->name, job->id, uuid, sizeof(uuid)); ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(&job->created))); @@ -1185,9 +1217,17 @@ create_job(ippeve_client_t *client) /* I - Client */ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, uri); ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL, uuid); if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL) + { ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, ippGetString(attr, 0, NULL)); + } else - ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, client->printer->uri); + { + char printer_uri[1024]; /* job-printer-uri value */ + + httpAssembleURI(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp", NULL, client->printer->hostname, client->printer->port, "/ipp/print"); + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, printer_uri); + } + ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)(job->created - client->printer->start_time)); cupsArrayAdd(client->printer->jobs, job); @@ -1385,9 +1425,10 @@ create_printer( int serverport, /* I - Server port */ const char *name, /* I - printer-name */ const char *location, /* I - printer-location */ - const char *icon, /* I - printer-icons */ + const char *icons, /* I - printer-icons */ + const char *strings, /* I - printer-strings-uri */ cups_array_t *docformats, /* I - document-format-supported */ - const char *subtypes, /* I - Bonjour service subtype(s) */ + const char *subtypes, /* I - DNS-SD service subtype(s) */ const char *directory, /* I - Spool directory */ const char *command, /* I - Command to run on job files, if any */ const char *device_uri, /* I - Output device, if any */ @@ -1399,15 +1440,10 @@ create_printer( #ifndef _WIN32 char path[1024]; /* Full path to command */ #endif /* !_WIN32 */ - char uri[1024], /* Printer URI */ -#ifdef HAVE_SSL - securi[1024], /* Secure printer URI */ - *uris[2], /* All URIs */ -#endif /* HAVE_SSL */ - icons[1024], /* printer-icons URI */ - adminurl[1024], /* printer-more-info URI */ - supplyurl[1024],/* printer-supply-info-uri URI */ - uuid[128]; /* printer-uuid */ + unsigned char sha256[32]; /* SHA-256 digest/sum */ + char uuid_data[1024],/* Data to hash for printer-uuid */ + uuid[128], /* printer-uuid */ + *iconsptr; /* Pointer into icons string */ int k_supported; /* Maximum file size supported */ int num_formats; /* Number of supported document formats */ const char *formats[100], /* Supported document formats */ @@ -1629,23 +1665,47 @@ create_printer( return (NULL); } - printer->ipv4 = -1; - printer->ipv6 = -1; - printer->name = strdup(name); - printer->dnssd_name = strdup(name); - printer->command = command ? strdup(command) : NULL; - printer->device_uri = device_uri ? strdup(device_uri) : NULL; - printer->output_format = output_format ? strdup(output_format) : NULL; - printer->directory = strdup(directory); - printer->icon = icon ? strdup(icon) : NULL; - printer->port = serverport; - printer->start_time = time(NULL); - printer->config_time = printer->start_time; - printer->state = IPP_PSTATE_IDLE; - printer->state_reasons = IPPEVE_PREASON_NONE; - printer->state_time = printer->start_time; - printer->jobs = cupsArrayNew((cups_array_func_t)compare_jobs, NULL); - printer->next_job_id = 1; + printer->ipv4 = -1; + printer->ipv6 = -1; + printer->name = strdup(name); + printer->dnssd_name = strdup(name); + printer->dnssd_subtypes = subtypes ? strdup(subtypes) : NULL; + printer->command = command ? strdup(command) : NULL; + printer->device_uri = device_uri ? strdup(device_uri) : NULL; + printer->output_format = output_format ? strdup(output_format) : NULL; + printer->directory = strdup(directory); + printer->icons[0] = icons ? strdup(icons) : NULL; + printer->strings = strings ? strdup(strings) : NULL; + printer->port = serverport; + printer->start_time = time(NULL); + printer->config_time = printer->start_time; + printer->state = IPP_PSTATE_IDLE; + printer->state_reasons = IPPEVE_PREASON_NONE; + printer->state_time = printer->start_time; + printer->jobs = cupsArrayNew((cups_array_func_t)compare_jobs, NULL); + printer->next_job_id = 1; + + if (printer->icons[0]) + { + /* + * Extract up to 3 icons... + */ + + for (i = 1, iconsptr = strchr(icons, ','); iconsptr && i < 3; i ++, iconsptr = strchr(iconsptr, ',')) + { + *iconsptr++ = '\0'; + printer->icons[i] = iconsptr; + } + + if (iconsptr) + *iconsptr = '\0'; /* Strip any icons after the third... */ + + while (i < 3) + { + printer->icons[i] = printer->icons[i - 1]; + i ++; + } + } if (servername) { @@ -1653,9 +1713,21 @@ create_printer( } else { - char temp[1024]; /* Temporary string */ + char temp[1024], /* Temporary string */ + *tempptr; /* Pointer into temporary string */ + +#ifdef HAVE_AVAHI + const char *avahi_name = avahi_client_get_host_name_fqdn(DNSSDClient); + + if (avahi_name) + strlcpy(temp, avahi_name, sizeof(temp)); + else +#endif /* HAVE_AVAHI */ + + if ((tempptr = strstr(httpGetHostname(NULL, temp, sizeof(temp)), ".lan")) != NULL && !tempptr[5]) + strlcpy(tempptr, ".local", sizeof(temp) - (size_t)(tempptr - temp)); - printer->hostname = strdup(httpGetHostname(NULL, temp, sizeof(temp))); + printer->hostname = strdup(temp); } _cupsRWInit(&(printer->rwlock)); @@ -1677,31 +1749,21 @@ create_printer( } /* - * Prepare URI values for the printer attributes... + * Prepare values for the printer attributes... */ - httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, printer->hostname, printer->port, "/ipp/print"); - printer->uri = strdup(uri); - printer->urilen = strlen(uri); - -#ifdef HAVE_SSL - httpAssembleURI(HTTP_URI_CODING_ALL, securi, sizeof(securi), "ipps", NULL, printer->hostname, printer->port, "/ipp/print"); -#endif /* HAVE_SSL */ - - httpAssembleURI(HTTP_URI_CODING_ALL, icons, sizeof(icons), WEB_SCHEME, NULL, printer->hostname, printer->port, "/icon.png"); - httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/"); - httpAssembleURI(HTTP_URI_CODING_ALL, supplyurl, sizeof(supplyurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/supplies"); - httpAssembleUUID(printer->hostname, serverport, name, 0, uuid, sizeof(uuid)); + snprintf(uuid_data, sizeof(uuid_data), "_IPPEVEPRINTER_:%s:%d:%s", printer->hostname, printer->port, printer->name); + cupsHashData("sha2-256", (unsigned char *)uuid_data, strlen(uuid_data), sha256, sizeof(sha256)); + snprintf(uuid, sizeof(uuid), "urn:uuid:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", sha256[0], sha256[1], sha256[3], sha256[4], sha256[5], sha256[6], (sha256[10] & 15) | 0x30, sha256[11], (sha256[15] & 0x3f) | 0x40, sha256[16], sha256[20], sha256[21], sha256[25], sha256[26], sha256[30], sha256[31]); if (Verbosity) { - fprintf(stderr, "printer-more-info=\"%s\"\n", adminurl); - fprintf(stderr, "printer-supply-info-uri=\"%s\"\n", supplyurl); #ifdef HAVE_SSL - fprintf(stderr, "printer-uri=\"%s\",\"%s\"\n", uri, securi); + fprintf(stderr, "printer-uri-supported=\"ipp://%s:%d/ipp/print\",\"ipps://%s:%d/ipp/print\"\n", printer->hostname, printer->port, printer->hostname, printer->port); #else - fprintf(stderr, "printer-uri=\"%s\"\n", uri); + fprintf(stderr, "printer-uri-supported=\"ipp://%s:%d/ipp/print\"\n", printer->hostname, printer->port); #endif /* HAVE_SSL */ + fprintf(stderr, "printer-uuid=\"%s\"\n", uuid); } /* @@ -1859,9 +1921,6 @@ create_printer( /* printer-geo-location */ ippAddOutOfBand(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location"); - /* printer-icons */ - ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", NULL, icons); - /* printer-is-accepting-jobs */ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1); @@ -1871,9 +1930,6 @@ create_printer( /* printer-location */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", NULL, location); - /* printer-more-info */ - ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, adminurl); - /* printer-name */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name); @@ -1883,19 +1939,8 @@ create_printer( /* printer-organizational-unit */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organizational-unit", NULL, ""); - /* printer-supply-info-uri */ - ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, supplyurl); - - /* printer-uri-supported */ -#ifdef HAVE_SSL - uris[0] = uri; - uris[1] = securi; - - ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", 2, NULL, (const char **)uris); - -#else - ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri); -#endif /* HAVE_SSL */ + /* printer-strings-languages-supported */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE, "printer-strings-languages-supported", NULL, "en"); /* printer-uuid */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, uuid); @@ -1929,10 +1974,10 @@ create_printer( debug_attributes("Printer", printer->attrs, 0); /* - * Register the printer with Bonjour... + * Register the printer with DNS-SD... */ - if (!register_printer(printer, subtypes)) + if (!register_printer(printer)) goto bad_printer; /* @@ -2088,14 +2133,8 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */ #elif defined(HAVE_AVAHI) avahi_threaded_poll_lock(DNSSDMaster); - if (printer->printer_ref) - avahi_entry_group_free(printer->printer_ref); - if (printer->ipp_ref) - avahi_entry_group_free(printer->ipp_ref); - if (printer->ipps_ref) - avahi_entry_group_free(printer->ipps_ref); - if (printer->http_ref) - avahi_entry_group_free(printer->http_ref); + if (printer->dnssd_ref) + avahi_entry_group_free(printer->dnssd_ref); avahi_threaded_poll_unlock(DNSSDMaster); #endif /* HAVE_DNSSD */ @@ -2104,8 +2143,10 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */ free(printer->dnssd_name); if (printer->name) free(printer->name); - if (printer->icon) - free(printer->icon); + if (printer->icons[0]) + free(printer->icons[0]); + if (printer->strings) + free(printer->strings); if (printer->command) free(printer->command); if (printer->device_uri) @@ -2118,8 +2159,6 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */ free(printer->directory); if (printer->hostname) free(printer->hostname); - if (printer->uri) - free(printer->uri); ippDelete(printer->attrs); cupsArrayDelete(printer->jobs); @@ -2130,7 +2169,7 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */ #ifdef HAVE_DNSSD /* - * 'dnssd_callback()' - Handle Bonjour registration events. + * 'dnssd_callback()' - Handle DNS-SD registration events. */ static void DNSSD_API @@ -2141,32 +2180,29 @@ dnssd_callback( const char *name, /* I - Service name */ const char *regtype, /* I - Service type */ const char *domain, /* I - Domain for service */ - ippeve_printer_t *printer) /* I - Printer */ + ippeve_printer_t *printer) /* I - Printer */ { (void)sdRef; (void)flags; (void)domain; + (void)name; - if (errorCode) + if (errorCode == kDNSServiceErr_NameConflict) { - fprintf(stderr, "DNSServiceRegister for %s failed with error %d.\n", regtype, (int)errorCode); - return; + fputs("DNS-SD service name collision detected.\n", stderr); + printer->dnssd_collision = 1; } - else if (strcasecmp(name, printer->dnssd_name)) + else if (errorCode) { - if (Verbosity) - fprintf(stderr, "Now using DNS-SD service name \"%s\".\n", name); - - /* No lock needed since only the main thread accesses/changes this */ - free(printer->dnssd_name); - printer->dnssd_name = strdup(name); + fprintf(stderr, "DNSServiceRegister for %s failed with error %d.\n", regtype, (int)errorCode); + return; } } #elif defined(HAVE_AVAHI) /* - * 'dnssd_callback()' - Handle Bonjour registration events. + * 'dnssd_callback()' - Handle DNS-SD registration events. */ static void @@ -2175,9 +2211,17 @@ dnssd_callback( AvahiEntryGroupState state, /* I - Registration state */ void *context) /* I - Printer */ { + ippeve_printer_t *printer = (ippeve_printer_t *)context; + /* Printer */ + + (void)srv; - (void)state; - (void)context; + + if (state == AVAHI_ENTRY_GROUP_COLLISION) + { + fputs("DNS-SD service name collision detected.\n", stderr); + printer->dnssd_collision = 1; + } } @@ -2191,10 +2235,8 @@ static void dnssd_client_cb( AvahiClient *c, /* I - Client */ AvahiClientState state, /* I - Current state */ - void *userdata) /* I - User data (unused) */ + void *userdata) /* I - User data (printer) */ { - (void)userdata; - if (!c) return; @@ -2226,7 +2268,7 @@ dnssd_init(void) #ifdef HAVE_DNSSD if (DNSServiceCreateConnection(&DNSSDMaster) != kDNSServiceErr_NoError) { - fputs("Error: Unable to initialize Bonjour.\n", stderr); + fputs("Error: Unable to initialize DNS-SD.\n", stderr); exit(1); } @@ -2235,13 +2277,13 @@ dnssd_init(void) if ((DNSSDMaster = avahi_threaded_poll_new()) == NULL) { - fputs("Error: Unable to initialize Bonjour.\n", stderr); + fputs("Error: Unable to initialize DNS-SD.\n", stderr); exit(1); } if ((DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssd_client_cb, NULL, &error)) == NULL) { - fputs("Error: Unable to initialize Bonjour.\n", stderr); + fputs("Error: Unable to initialize DNS-SD.\n", stderr); exit(1); } @@ -2292,10 +2334,12 @@ find_job(ippeve_client_t *client) /* I - Client */ if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL) { const char *uri = ippGetString(attr, 0, NULL); + /* URI value */ + const char *uriptr = strrchr(uri, '/'); + /* Pointer to the last slash in the URI */ - if (!strncmp(uri, client->printer->uri, client->printer->urilen) && - uri[client->printer->urilen] == '/') - key.id = atoi(uri + client->printer->urilen + 1); + if (uriptr && isdigit(uriptr[1] & 255)) + key.id = atoi(uriptr + 1); else return (NULL); } @@ -2476,8 +2520,9 @@ finish_document_uri( * Do we have a file to print? */ - if (httpGetState(client->http) == HTTP_STATE_POST_RECV) + if (have_document_data(client)) { + flush_document_data(client); respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Unexpected document data following request."); goto abort_job; @@ -2727,6 +2772,42 @@ finish_document_uri( } +/* + * 'flush_document_data()' - Safely flush remaining document data. + */ + +static void +flush_document_data( + ippeve_client_t *client) /* I - Client */ +{ + char buffer[8192]; /* Read buffer */ + + + if (httpGetState(client->http) == HTTP_STATE_POST_RECV) + { + while (httpRead2(client->http, buffer, sizeof(buffer)) > 0); + } +} + + +/* + * 'have_document_data()' - Determine whether we have more document data. + */ + +static int /* O - 1 if data is present, 0 otherwise */ +have_document_data( + ippeve_client_t *client) /* I - Client */ +{ + char temp; /* Data */ + + + if (httpGetState(client->http) != HTTP_STATE_POST_RECV) + return (0); + else + return (httpPeek(client->http, &temp, 1) > 0); +} + + /* * 'html_escape()' - Write a HTML-safe string. */ @@ -2989,7 +3070,7 @@ html_printf(ippeve_client_t *client, /* I - Client */ if ((size_t)(width + 2) > sizeof(temp)) break; - sprintf(temp, tformat, va_arg(ap, double)); + snprintf(temp, sizeof(temp), tformat, va_arg(ap, double)); httpWrite2(client->http, temp, strlen(temp)); break; @@ -3007,13 +3088,13 @@ html_printf(ippeve_client_t *client, /* I - Client */ # ifdef HAVE_LONG_LONG if (size == 'L') - sprintf(temp, tformat, va_arg(ap, long long)); + snprintf(temp, sizeof(temp), tformat, va_arg(ap, long long)); else # endif /* HAVE_LONG_LONG */ if (size == 'l') - sprintf(temp, tformat, va_arg(ap, long)); + snprintf(temp, sizeof(temp), tformat, va_arg(ap, long)); else - sprintf(temp, tformat, va_arg(ap, int)); + snprintf(temp, sizeof(temp), tformat, va_arg(ap, int)); httpWrite2(client->http, temp, strlen(temp)); break; @@ -3022,7 +3103,7 @@ html_printf(ippeve_client_t *client, /* I - Client */ if ((size_t)(width + 2) > sizeof(temp)) break; - sprintf(temp, tformat, va_arg(ap, void *)); + snprintf(temp, sizeof(temp), tformat, va_arg(ap, void *)); httpWrite2(client->http, temp, strlen(temp)); break; @@ -3123,6 +3204,53 @@ ipp_cancel_job(ippeve_client_t *client) /* I - Client */ } +/* + * 'ipp_cancel_my_jobs()' - Cancel all jobs. + * + * Note: Since ippeveprinter doesn't do spooling, this really just cancels the + * current job. + */ + +static void +ipp_cancel_my_jobs( + ippeve_client_t *client) /* I - Client */ +{ + ippeve_job_t *job; /* Job information */ + + + _cupsRWLockWrite(&client->printer->rwlock); + + if ((job = client->printer->active_job) != NULL) + { + /* + * See if the job is already completed, canceled, or aborted; if so, + * we can't cancel... + */ + + if (job->state < IPP_JSTATE_CANCELED) + { + /* + * Cancel the job... + */ + + if (job->state == IPP_JSTATE_PROCESSING || (job->state == IPP_JSTATE_HELD && job->fd >= 0)) + { + job->cancel = 1; + } + else + { + job->state = IPP_JSTATE_CANCELED; + job->completed = time(NULL); + } + } + } + + respond_ipp(client, IPP_STATUS_OK, NULL); + + _cupsRWUnlock(&client->printer->rwlock); +} + + /* * 'ipp_close_job()' - Close an open job. */ @@ -3190,25 +3318,23 @@ ipp_create_job(ippeve_client_t *client) /* I - Client */ /* - * Validate print job attributes... + * Do we have a file to print? */ - if (!valid_job_attributes(client)) + if (have_document_data(client)) { - httpFlush(client->http); + flush_document_data(client); + respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, + "Unexpected document data following request."); return; } /* - * Do we have a file to print? + * Validate print job attributes... */ - if (httpGetState(client->http) == HTTP_STATE_POST_RECV) - { - respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, - "Unexpected document data following request."); + if (!valid_job_attributes(client)) return; - } /* * Create the job... @@ -3477,6 +3603,29 @@ ipp_get_printer_attributes( if (!ra || cupsArrayFind(ra, "printer-current-time")) ippAddDate(client->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(time(NULL))); + if (!ra || cupsArrayFind(ra, "printer-icons")) + { + char uris[3][1024]; /* Buffers for URIs */ + const char *values[3]; /* Values for attribute */ + + httpAssembleURI(HTTP_URI_CODING_ALL, uris[0], sizeof(uris[0]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon-sm.png"); + httpAssembleURI(HTTP_URI_CODING_ALL, uris[1], sizeof(uris[1]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon.png"); + httpAssembleURI(HTTP_URI_CODING_ALL, uris[2], sizeof(uris[2]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon-lg.png"); + + values[0] = uris[0]; + values[1] = uris[1]; + values[2] = uris[2]; + + ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", 3, NULL, values); + } + + if (!ra || cupsArrayFind(ra, "printer-more-info")) + { + char uri[1024]; /* URI value */ + + httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/"); + ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, uri); + } if (!ra || cupsArrayFind(ra, "printer-state")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", (int)printer->state); @@ -3521,9 +3670,42 @@ ipp_get_printer_attributes( } } + if (!ra || cupsArrayFind(ra, "printer-strings-uri")) + { + char uri[1024]; /* URI value */ + + httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/en.strings"); + ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-strings-uri", NULL, uri); + } + + if (!ra || cupsArrayFind(ra, "printer-supply-info-uri")) + { + char uri[1024]; /* URI value */ + + httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/supplies"); + ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, uri); + } + if (!ra || cupsArrayFind(ra, "printer-up-time")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-up-time", (int)(time(NULL) - printer->start_time)); + if (!ra || cupsArrayFind(ra, "printer-uri-supported")) + { + char uris[2][1024]; /* Buffers for URIs */ + const char *values[2]; /* Values for attribute */ + int num_values = 0; /* Number of values */ + + httpAssembleURI(HTTP_URI_CODING_ALL, uris[0], sizeof(uris[0]), "ipp", NULL, client->host_field, client->host_port, "/ipp/print"); + values[num_values ++] = uris[0]; + +#ifdef HAVE_SSL + httpAssembleURI(HTTP_URI_CODING_ALL, uris[1], sizeof(uris[1]), "ipps", NULL, client->host_field, client->host_port, "/ipp/print"); + values[num_values ++] = uris[1]; +#endif /* HAVE_SSL */ + + ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", num_values, NULL, values); + } + if (!ra || cupsArrayFind(ra, "queued-job-count")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "queued-job-count", printer->active_job && printer->active_job->state < IPP_JSTATE_CANCELED); @@ -3550,8 +3732,21 @@ ipp_identify_printer( if (!actions || ippContainsString(actions, "sound")) { +#ifdef __APPLE__ + pid_t pid; /* Process ID for "afplay" utility */ + static const char * const afplay[3] = + { /* Arguments for "afplay" utility */ + "/usr/bin/afplay", + "/System/Library/Sounds/Ping.aiff", + NULL + }; + + posix_spawn(&pid, afplay[0], NULL, NULL, (char **)afplay, NULL); + +#else putchar(0x07); fflush(stdout); +#endif /* __APPLE__ */ } if (ippContainsString(actions, "display")) @@ -3577,7 +3772,7 @@ ipp_print_job(ippeve_client_t *client) /* I - Client */ if (!valid_job_attributes(client)) { - httpFlush(client->http); + flush_document_data(client); return; } @@ -3585,7 +3780,7 @@ ipp_print_job(ippeve_client_t *client) /* I - Client */ * Do we have a file to print? */ - if (httpGetState(client->http) == HTTP_STATE_POST_SEND) + if (!have_document_data(client)) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No file in request."); return; @@ -3625,7 +3820,7 @@ ipp_print_uri(ippeve_client_t *client) /* I - Client */ if (!valid_job_attributes(client)) { - httpFlush(client->http); + flush_document_data(client); return; } @@ -3658,6 +3853,7 @@ ipp_send_document( { ippeve_job_t *job; /* Job information */ ipp_attribute_t *attr; /* Current attribute */ + int have_data; /* Have document data? */ /* @@ -3666,26 +3862,28 @@ ipp_send_document( if ((job = find_job(client)) == NULL) { + flush_document_data(client); respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); - httpFlush(client->http); return; } /* * See if we already have a document for this job or the job has already - * in a non-pending state... + * in a terminating state... */ - if (job->state > IPP_JSTATE_HELD) + have_data = have_document_data(client); + + if ((job->filename || job->fd >= 0) && have_data) { - respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state."); - httpFlush(client->http); + flush_document_data(client); + respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported."); return; } - else if (job->filename || job->fd >= 0) + else if (job->state > IPP_JSTATE_HELD && have_data) { - respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported."); - httpFlush(client->http); + flush_document_data(client); + respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state."); return; } @@ -3695,20 +3893,20 @@ ipp_send_document( if ((attr = ippFindAttribute(client->request, "last-document", IPP_TAG_ZERO)) == NULL) { + flush_document_data(client); respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required last-document attribute."); - httpFlush(client->http); return; } else if (ippGetGroupTag(attr) != IPP_TAG_OPERATION) { + flush_document_data(client); respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The last-document attribute is not in the operation group."); - httpFlush(client->http); return; } - else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 || !ippGetBoolean(attr, 0)) + else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1) { + flush_document_data(client); respond_unsupported(client, attr); - httpFlush(client->http); return; } @@ -3716,12 +3914,15 @@ ipp_send_document( * Validate document attributes... */ - if (!valid_doc_attributes(client)) + if (have_data && !valid_doc_attributes(client)) { - httpFlush(client->http); + flush_document_data(client); return; } + if (!have_data && !job->filename) + job->state = IPP_JSTATE_ABORTED; + /* * Then finish getting the document data and process things... */ @@ -3739,7 +3940,8 @@ ipp_send_document( _cupsRWUnlock(&(client->printer->rwlock)); - finish_document_data(client, job); + if (have_data) + finish_document_data(client, job); } @@ -3762,44 +3964,39 @@ ipp_send_uri(ippeve_client_t *client) /* I - Client */ if ((job = find_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); - httpFlush(client->http); return; } /* * See if we already have a document for this job or the job has already - * in a non-pending state... + * in a non-terminating state... */ - if (job->state > IPP_JSTATE_HELD) + if (job->filename || job->fd >= 0) { - respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state."); - httpFlush(client->http); + respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported."); return; } - else if (job->filename || job->fd >= 0) + else if (job->state > IPP_JSTATE_HELD) { - respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported."); - httpFlush(client->http); + flush_document_data(client); + respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job is not in a pending state."); return; } if ((attr = ippFindAttribute(client->request, "last-document", IPP_TAG_ZERO)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required last-document attribute."); - httpFlush(client->http); return; } else if (ippGetGroupTag(attr) != IPP_TAG_OPERATION) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The last-document attribute is not in the operation group."); - httpFlush(client->http); return; } - else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 || !ippGetBoolean(attr, 0)) + else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1) { respond_unsupported(client, attr); - httpFlush(client->http); return; } @@ -3809,7 +4006,7 @@ ipp_send_uri(ippeve_client_t *client) /* I - Client */ if (!valid_doc_attributes(client)) { - httpFlush(client->http); + flush_document_data(client); return; } @@ -4359,9 +4556,36 @@ load_legacy_attributes( if (cupsArrayFind(docformats, (void *)"application/pdf")) ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 1023); + /* finishing-template-supported */ + ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template-supported", NULL, "none"); + + /* finishings-col-database */ + col = ippNew(); + ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none"); + ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-database", col); + ippDelete(col); + + /* finishings-col-default */ + col = ippNew(); + ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none"); + ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-default", col); + ippDelete(col); + + /* finishings-col-ready */ + col = ippNew(); + ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none"); + ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-ready", col); + ippDelete(col); + + /* finishings-col-supported */ + ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishings-col-supported", NULL, "finishing-template"); + /* finishings-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE); + /* finishings-ready */ + ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-ready", IPP_FINISHINGS_NONE); + /* finishings-supported */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-supported", IPP_FINISHINGS_NONE); @@ -5000,7 +5224,7 @@ load_ppd_attributes( } /* finishings-col-supported */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishings-col-supported", NULL, "finishing-template"); + ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishings-col-supported", NULL, "finishing-template"); /* finishings-default */ ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE); @@ -5623,8 +5847,9 @@ process_http(ippeve_client_t *client) /* I - Client connection */ ipp_state_t ipp_state; /* State of IPP transfer */ char scheme[32], /* Method/scheme */ userpass[128], /* Username:password */ - hostname[HTTP_MAX_HOST]; + hostname[HTTP_MAX_HOST], /* Hostname */ + *ptr; /* Pointer into value */ int port; /* Port number */ static const char * const http_states[] = { /* Strings for logging HTTP method */ @@ -5733,6 +5958,10 @@ process_http(ippeve_client_t *client) /* I - Client connection */ return (0); } + /* + * Validate the host header... + */ + if (!httpGetField(client->http, HTTP_FIELD_HOST)[0] && httpGetVersion(client->http) >= HTTP_VERSION_1_1) { @@ -5740,6 +5969,36 @@ process_http(ippeve_client_t *client) /* I - Client connection */ * HTTP/1.1 and higher require the "Host:" field... */ + fprintf(stderr, "%s Missing Host: header.\n", client->hostname); + respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); + return (0); + } + + strlcpy(client->host_field, httpGetField(client->http, HTTP_FIELD_HOST), sizeof(client->host_field)); + if ((ptr = strrchr(client->host_field, ':')) != NULL) + { + /* + * Grab port number from Host: header... + */ + + *ptr++ = '\0'; + client->host_port = atoi(ptr); + } + else + { + /* + * Use the default port number... + */ + + client->host_port = client->printer->port; + } + + ptr = strrchr(client->host_field, '.'); + + if (!isdigit(client->host_field[0] & 255) && client->host_field[0] != '[' && strcmp(client->host_field, client->printer->hostname) && strcmp(client->host_field, "localhost") && + (!ptr || (strcmp(ptr, ".local") && strcmp(ptr, ".local.")))) + { + fprintf(stderr, "%s Bad Host: header '%s'.\n", client->hostname, client->host_field); respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); } @@ -5787,7 +6046,9 @@ process_http(ippeve_client_t *client) /* I - Client connection */ return (respond_http(client, HTTP_STATUS_OK, NULL, NULL, 0)); case HTTP_STATE_HEAD : - if (!strcmp(client->uri, "/icon.png")) + if (!strcmp(client->uri, "/en.strings")) + return (respond_http(client, HTTP_STATUS_OK, NULL, "text/strings", 0)); + else if (!strcmp(client->uri, "/icon.png") || !strcmp(client->uri, "/icon-lg.png") || !strcmp(client->uri, "/icon-sm.png")) return (respond_http(client, HTTP_STATUS_OK, NULL, "image/png", 0)); else if (!strcmp(client->uri, "/") || !strcmp(client->uri, "/media") || !strcmp(client->uri, "/supplies")) return (respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0)); @@ -5795,22 +6056,54 @@ process_http(ippeve_client_t *client) /* I - Client connection */ return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0)); case HTTP_STATE_GET : - if (!strcmp(client->uri, "/icon.png")) + if (!strcmp(client->uri, "/en.strings")) { /* - * Send PNG icon file. + * Send strings file. */ - if (client->printer->icon) + if (client->printer->strings) { int fd; /* Icon file */ struct stat fileinfo; /* Icon file information */ char buffer[4096]; /* Copy buffer */ ssize_t bytes; /* Bytes */ - fprintf(stderr, "Icon file is \"%s\".\n", client->printer->icon); + if (!stat(client->printer->strings, &fileinfo) && (fd = open(client->printer->strings, O_RDONLY)) >= 0) + { + if (!respond_http(client, HTTP_STATUS_OK, NULL, "text/strings", (size_t)fileinfo.st_size)) + { + close(fd); + return (0); + } + + while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) + httpWrite2(client->http, buffer, (size_t)bytes); + + httpFlushWrite(client->http); - if (!stat(client->printer->icon, &fileinfo) && (fd = open(client->printer->icon, O_RDONLY)) >= 0) + close(fd); + } + else + return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0)); + } + else + return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0)); + } + else if (!strcmp(client->uri, "/icon.png")) + { + /* + * Send medium PNG icon file. + */ + + if (client->printer->icons[1]) + { + int fd; /* Icon file */ + struct stat fileinfo; /* Icon file information */ + char buffer[4096]; /* Copy buffer */ + ssize_t bytes; /* Bytes */ + + if (!stat(client->printer->icons[1], &fileinfo) && (fd = open(client->printer->icons[1], O_RDONLY)) >= 0) { if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) { @@ -5839,6 +6132,90 @@ process_http(ippeve_client_t *client) /* I - Client connection */ httpFlushWrite(client->http); } } + else if (!strcmp(client->uri, "/icon-lg.png")) + { + /* + * Send large PNG icon file. + */ + + if (client->printer->icons[2]) + { + int fd; /* Icon file */ + struct stat fileinfo; /* Icon file information */ + char buffer[4096]; /* Copy buffer */ + ssize_t bytes; /* Bytes */ + + if (!stat(client->printer->icons[2], &fileinfo) && (fd = open(client->printer->icons[2], O_RDONLY)) >= 0) + { + if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) + { + close(fd); + return (0); + } + + while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) + httpWrite2(client->http, buffer, (size_t)bytes); + + httpFlushWrite(client->http); + + close(fd); + } + else + return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0)); + } + else + { + fputs("Icon file is internal printer-lg.png.\n", stderr); + + if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_lg_png))) + return (0); + + httpWrite2(client->http, (const char *)printer_lg_png, sizeof(printer_lg_png)); + httpFlushWrite(client->http); + } + } + else if (!strcmp(client->uri, "/icon-sm.png")) + { + /* + * Send small PNG icon file. + */ + + if (client->printer->icons[0]) + { + int fd; /* Icon file */ + struct stat fileinfo; /* Icon file information */ + char buffer[4096]; /* Copy buffer */ + ssize_t bytes; /* Bytes */ + + if (!stat(client->printer->icons[0], &fileinfo) && (fd = open(client->printer->icons[0], O_RDONLY)) >= 0) + { + if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) + { + close(fd); + return (0); + } + + while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) + httpWrite2(client->http, buffer, (size_t)bytes); + + httpFlushWrite(client->http); + + close(fd); + } + else + return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0)); + } + else + { + fputs("Icon file is internal printer-sm.png.\n", stderr); + + if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_sm_png))) + return (0); + + httpWrite2(client->http, (const char *)printer_sm_png, sizeof(printer_sm_png)); + httpFlushWrite(client->http); + } + } else { /* @@ -6083,12 +6460,13 @@ process_ipp(ippeve_client_t *client) /* I - Client */ else if ((!strcmp(name, "job-uri") && strncmp(resource, "/ipp/print/", 11)) || (!strcmp(name, "printer-uri") && - strcmp(resource, "/ipp/print"))) + strcmp(resource, "/ipp/print") && + (strcmp(resource, "/") || ippGetOperation(client->request) != IPP_OP_GET_PRINTER_ATTRIBUTES))) respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "%s %s not found.", name, ippGetString(uri, 0, NULL)); else if (client->operation_id != IPP_OP_GET_PRINTER_ATTRIBUTES && (status = authenticate_request(client)) != HTTP_STATUS_CONTINUE) { - httpFlush(client->http); + flush_document_data(client); return (respond_http(client, status, NULL, NULL, 0)); } @@ -6118,7 +6496,7 @@ process_ipp(ippeve_client_t *client) /* I - Client */ if (!respond_http(client, HTTP_STATUS_EXPECTATION_FAILED, NULL, NULL, 0)) return (0); - httpFlush(client->http); + flush_document_data(client); return (1); } } @@ -6157,6 +6535,10 @@ process_ipp(ippeve_client_t *client) /* I - Client */ ipp_cancel_job(client); break; + case IPP_OP_CANCEL_MY_JOBS : + ipp_cancel_my_jobs(client); + break; + case IPP_OP_GET_JOB_ATTRIBUTES : ipp_get_job_attributes(client); break; @@ -6745,44 +7127,44 @@ process_state_message( /* - * 'register_printer()' - Register a printer object via Bonjour. + * 'register_printer()' - Register a printer object via DNS-SD. */ static int /* O - 1 on success, 0 on error */ register_printer( - ippeve_printer_t *printer, /* I - Printer */ - const char *subtypes) /* I - Service subtype(s) */ + ippeve_printer_t *printer) /* I - Printer */ { #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) - ippeve_txt_t ipp_txt; /* Bonjour IPP TXT record */ + ippeve_txt_t ipp_txt; /* DNS-SD IPP TXT record */ int i, /* Looping var */ count; /* Number of values */ ipp_attribute_t *color_supported, *document_format_supported, *printer_location, *printer_make_and_model, - *printer_more_info, *printer_uuid, *sides_supported, *urf_supported; /* Printer attributes */ const char *value; /* Value string */ - char formats[252], /* List of supported formats */ + char adminurl[247], /* adminurl value */ + formats[252], /* List of supported formats */ urf[252], /* List of supported URF values */ *ptr; /* Pointer into string */ - if (!strcmp(subtypes, "off")) + if (printer->dnssd_subtypes && !strcmp(printer->dnssd_subtypes, "off")) return (1); color_supported = ippFindAttribute(printer->attrs, "color-supported", IPP_TAG_BOOLEAN); document_format_supported = ippFindAttribute(printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE); printer_location = ippFindAttribute(printer->attrs, "printer-location", IPP_TAG_TEXT); printer_make_and_model = ippFindAttribute(printer->attrs, "printer-make-and-model", IPP_TAG_TEXT); - printer_more_info = ippFindAttribute(printer->attrs, "printer-more-info", IPP_TAG_URI); printer_uuid = ippFindAttribute(printer->attrs, "printer-uuid", IPP_TAG_URI); sides_supported = ippFindAttribute(printer->attrs, "sides-supported", IPP_TAG_KEYWORD); urf_supported = ippFindAttribute(printer->attrs, "urf-supported", IPP_TAG_KEYWORD); + httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), WEB_SCHEME, NULL, printer->hostname, printer->port, "/"); + for (i = 0, count = ippGetCount(document_format_supported), ptr = formats; i < count; i ++) { value = ippGetString(document_format_supported, i, NULL); @@ -6815,11 +7197,35 @@ register_printer( break; } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ + /* + * Rename the service as needed... + */ + + if (printer->dnssd_collision) + { + char new_dnssd_name[256]; /* New DNS-SD name */ + const char *uuid = ippGetString(printer_uuid, 0, NULL); + /* "printer-uuid" value */ + + _cupsRWLockWrite(&printer->rwlock); + + snprintf(new_dnssd_name, sizeof(new_dnssd_name), "%s (%c%c%c%c%c%c)", printer->dnssd_name, toupper(uuid[39]), toupper(uuid[40]), toupper(uuid[41]), toupper(uuid[42]), toupper(uuid[43]), toupper(uuid[44])); + + free(printer->dnssd_name); + printer->dnssd_name = strdup(new_dnssd_name); + + fprintf(stderr, "DNS-SD name collision, trying new DNS-SD service name '%s'.\n", printer->dnssd_name); + + _cupsRWUnlock(&printer->rwlock); + + printer->dnssd_collision = 0; + } +#endif /* HAVE_DNSSD || HAVE_AVAHI */ + #ifdef HAVE_DNSSD - DNSServiceErrorType error; /* Error from Bonjour */ - char regtype[256]; /* Bonjour service type */ - uint32_t interface; /* Interface index */ + DNSServiceErrorType error; /* Error from DNS-SD */ + char regtype[256]; /* DNS-SD service type */ + uint32_t ifindex; /* Interface index */ /* @@ -6830,8 +7236,7 @@ register_printer( TXTRecordSetValue(&ipp_txt, "rp", 9, "ipp/print"); if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL) TXTRecordSetValue(&ipp_txt, "ty", (uint8_t)strlen(value), value); - if ((value = ippGetString(printer_more_info, 0, NULL)) != NULL) - TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(value), value); + TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(adminurl), adminurl); if ((value = ippGetString(printer_location, 0, NULL)) != NULL) TXTRecordSetValue(&ipp_txt, "note", (uint8_t)strlen(value), value); TXTRecordSetValue(&ipp_txt, "pdl", (uint8_t)strlen(formats), formats); @@ -6852,11 +7257,14 @@ register_printer( * defend our service name but not actually support LPD... */ - interface = !strcmp(printer->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny; + ifindex = !strcmp(printer->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny; + + if (printer->printer_ref) + DNSServiceRefDeallocate(printer->printer_ref); printer->printer_ref = DNSSDMaster; - if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) + if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_printer._tcp", error); return (0); @@ -6867,14 +7275,17 @@ register_printer( * advertise our IPP printer... */ + if (printer->ipp_ref) + DNSServiceRefDeallocate(printer->ipp_ref); + printer->ipp_ref = DNSSDMaster; - if (subtypes && *subtypes) - snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", subtypes); + if (printer->dnssd_subtypes && *(printer->dnssd_subtypes)) + snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", printer->dnssd_subtypes); else strlcpy(regtype, "_ipp._tcp", sizeof(regtype)); - if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) + if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error); return (0); @@ -6886,14 +7297,17 @@ register_printer( * advertise our IPPS printer... */ + if (printer->ipps_ref) + DNSServiceRefDeallocate(printer->ipps_ref); + printer->ipps_ref = DNSSDMaster; - if (subtypes && *subtypes) - snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", subtypes); + if (printer->dnssd_subtypes && *(printer->dnssd_subtypes)) + snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", printer->dnssd_subtypes); else strlcpy(regtype, "_ipps._tcp", sizeof(regtype)); - if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) + if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error); return (0); @@ -6905,9 +7319,12 @@ register_printer( * real port number to advertise our IPP printer... */ + if (printer->http_ref) + DNSServiceRefDeallocate(printer->http_ref); + printer->http_ref = DNSSDMaster; - if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection, interface, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) + if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_http._tcp,_printer", error); return (0); @@ -6926,8 +7343,7 @@ register_printer( ipp_txt = avahi_string_list_add_printf(ipp_txt, "rp=ipp/print"); if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL) ipp_txt = avahi_string_list_add_printf(ipp_txt, "ty=%s", value); - if ((value = ippGetString(printer_more_info, 0, NULL)) != NULL) - ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", value); + ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", adminurl); if ((value = ippGetString(printer_location, 0, NULL)) != NULL) ipp_txt = avahi_string_list_add_printf(ipp_txt, "note=%s", value); ipp_txt = avahi_string_list_add_printf(ipp_txt, "pdl=%s", formats); @@ -6949,18 +7365,21 @@ register_printer( avahi_threaded_poll_lock(DNSSDMaster); - printer->ipp_ref = avahi_entry_group_new(DNSSDClient, dnssd_callback, NULL); + if (printer->dnssd_ref) + avahi_entry_group_free(printer->dnssd_ref); - avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_printer._tcp", NULL, NULL, 0, NULL); + printer->dnssd_ref = avahi_entry_group_new(DNSSDClient, dnssd_callback, printer); + + avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_printer._tcp", NULL, NULL, 0, NULL); /* * Then register the _ipp._tcp (IPP)... */ - avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, NULL, printer->port, ipp_txt); - if (subtypes && *subtypes) + avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, NULL, printer->port, ipp_txt); + if (printer->dnssd_subtypes && *(printer->dnssd_subtypes)) { - char *temptypes = strdup(subtypes), *start, *end; + char *temptypes = strdup(printer->dnssd_subtypes), *start, *end; for (start = temptypes; *start; start = end) { @@ -6970,7 +7389,7 @@ register_printer( end = start + strlen(start); snprintf(temp, sizeof(temp), "%s._sub._ipp._tcp", start); - avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp); + avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp); } free(temptypes); @@ -6981,10 +7400,10 @@ register_printer( * _ipps._tcp (IPPS) for secure printing... */ - avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, NULL, printer->port, ipp_txt); - if (subtypes && *subtypes) + avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, NULL, printer->port, ipp_txt); + if (printer->dnssd_subtypes && *(printer->dnssd_subtypes)) { - char *temptypes = strdup(subtypes), *start, *end; + char *temptypes = strdup(printer->dnssd_subtypes), *start, *end; for (start = temptypes; *start; start = end) { @@ -6994,7 +7413,7 @@ register_printer( end = start + strlen(start); snprintf(temp, sizeof(temp), "%s._sub._ipps._tcp", start); - avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp); + avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp); } free(temptypes); @@ -7005,14 +7424,14 @@ register_printer( * Finally _http.tcp (HTTP) for the web interface... */ - avahi_entry_group_add_service_strlst(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, NULL, printer->port, NULL); - avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, "_printer._sub._http._tcp"); + avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, NULL, printer->port, NULL); + avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, "_printer._sub._http._tcp"); /* * Commit it... */ - avahi_entry_group_commit(printer->ipp_ref); + avahi_entry_group_commit(printer->dnssd_ref); avahi_threaded_poll_unlock(DNSSDMaster); avahi_string_list_free(ipp_txt); @@ -7194,14 +7613,13 @@ respond_unsupported( static void run_printer(ippeve_printer_t *printer) /* I - Printer */ { - int num_fds; /* Number of file descriptors */ - struct pollfd polldata[3]; /* poll() data */ - int timeout; /* Timeout for poll() */ - ippeve_client_t *client; /* New client */ + int num_fds; /* Number of file descriptors */ + struct pollfd polldata[3]; /* poll() data */ + ippeve_client_t *client; /* New client */ /* - * Setup poll() data for the Bonjour service socket and IPv4/6 listeners... + * Setup poll() data for the DNS-SD service socket and IPv4/6 listeners... */ polldata[0].fd = printer->ipv4; @@ -7223,12 +7641,7 @@ run_printer(ippeve_printer_t *printer) /* I - Printer */ for (;;) { - if (cupsArrayCount(printer->jobs)) - timeout = 10; - else - timeout = -1; - - if (poll(polldata, (nfds_t)num_fds, timeout) < 0 && errno != EINTR) + if (poll(polldata, (nfds_t)num_fds, 1000) < 0 && errno != EINTR) { perror("poll() failed"); break; @@ -7270,11 +7683,20 @@ run_printer(ippeve_printer_t *printer) /* I - Printer */ } } + /* + * Process DNS-SD messages... + */ + #ifdef HAVE_DNSSD if (polldata[2].revents & POLLIN) DNSServiceProcessResult(DNSSDMaster); #endif /* HAVE_DNSSD */ +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if (printer->dnssd_collision) + register_printer(printer); +#endif /* HAVE_DNSSD || HAVE_AVAHI */ + /* * Clean out old jobs... */ @@ -7932,13 +8354,16 @@ usage(int status) /* O - Exit status */ _cupsLangPuts(stdout, _("-K keypath Set location of server X.509 certificates and keys.")); #endif /* HAVE_SSL */ _cupsLangPuts(stdout, _("-M manufacturer Set manufacturer name (default=Test)")); +#if !CUPS_LITE _cupsLangPuts(stdout, _("-P filename.ppd Load printer attributes from PPD file")); +#endif /* !CUPS_LITE */ + _cupsLangPuts(stdout, _("-S filename.strings Set strings file")); _cupsLangPuts(stdout, _("-V version Set default IPP version")); _cupsLangPuts(stdout, _("-a filename.conf Load printer attributes from conf file")); _cupsLangPuts(stdout, _("-c command Set print command")); _cupsLangPuts(stdout, _("-d spool-directory Set spool directory")); _cupsLangPuts(stdout, _("-f type/subtype[,...] Set supported file types")); - _cupsLangPuts(stdout, _("-i iconfile.png Set icon file")); + _cupsLangPuts(stdout, _("-i iconfile.png[,...] Set icon file(s)")); _cupsLangPuts(stdout, _("-k Keep job spool files")); _cupsLangPuts(stdout, _("-l location Set location of printer")); _cupsLangPuts(stdout, _("-m model Set model name (default=Printer)")); @@ -8056,6 +8481,7 @@ valid_doc_attributes( memset(header, 0, sizeof(header)); httpPeek(client->http, (char *)header, sizeof(header)); + fprintf(stderr, "%s %s Auto-type header: %02X%02X%02X%02X%02X%02X%02X%02X\n", client->hostname, op_name, header[0], header[1], header[2], header[3], header[4], header[5], header[6], header[7]); if (!memcmp(header, "%PDF", 4)) format = "application/pdf"; else if (!memcmp(header, "%!", 2)) @@ -8064,7 +8490,7 @@ valid_doc_attributes( format = "image/jpeg"; else if (!memcmp(header, "\211PNG", 4)) format = "image/png"; - else if (!memcmp(header, "RAS2", 4)) + else if (!memcmp(header, "RaS2PwgR", 8)) format = "image/pwg-raster"; else if (!memcmp(header, "UNIRAST", 8)) format = "image/urf"; diff --git a/tools/ippfind.c b/tools/ippfind.c index 246ab4dba..ae5af7d40 100644 --- a/tools/ippfind.c +++ b/tools/ippfind.c @@ -3,6 +3,8 @@ * commands such as IPP and Bonjour conformance tests. This tool is * inspired by the UNIX "find" command, thus its name. * + * Copyright © 2021 by OpenPrinting. + * Copyright © 2020 by the IEEE-ISTO Printer Working Group * Copyright © 2008-2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -159,7 +161,7 @@ static void browse_callback(AvahiServiceBrowser *browser, static void client_callback(AvahiClient *client, AvahiClientState state, void *context); -#endif /* HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ static int compare_services(ippfind_srv_t *a, ippfind_srv_t *b); static const char *dnssd_error_string(int error); @@ -1273,6 +1275,16 @@ main(int argc, /* I - Number of command-line args */ } #elif defined(HAVE_AVAHI) + char *subtype, /* Sub-type, if any */ + subtype_buf[256]; /* Sub-type buffer */ + + if ((subtype = strstr(regtype, ",_")) != NULL) + { + *subtype++ = '\0'; + snprintf(subtype_buf, sizeof(subtype_buf), "%s._sub.%s", subtype, regtype); + regtype = subtype_buf; + } + if (avahi_service_browser_new(avahi_client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, regtype, domain, 0, browse_callback, services)) @@ -2774,6 +2786,7 @@ show_usage(void) _cupsLangPuts(stderr, _("-h regex Match hostname to regular expression")); _cupsLangPuts(stderr, _("-l List attributes")); _cupsLangPuts(stderr, _("-n regex Match service name to regular expression")); + _cupsLangPuts(stderr, _("-N name Match service name to literal name value")); _cupsLangPuts(stderr, _("-p Print URI if true")); _cupsLangPuts(stderr, _("-q Quietly report match via exit code")); _cupsLangPuts(stderr, _("-r True if service is remote")); @@ -2786,8 +2799,9 @@ show_usage(void) _cupsLangPuts(stderr, _("--exec utility [argument ...] ;\n" " Execute program if true")); _cupsLangPuts(stderr, _("--host regex Match hostname to regular expression")); - _cupsLangPuts(stderr, _("--ls List attributes")); + _cupsLangPuts(stderr, _("--literal-name name Match service name to literal name value")); _cupsLangPuts(stderr, _("--local True if service is local")); + _cupsLangPuts(stderr, _("--ls List attributes")); _cupsLangPuts(stderr, _("--name regex Match service name to regular expression")); _cupsLangPuts(stderr, _("--path regex Match resource path to regular expression")); _cupsLangPuts(stderr, _("--port number[-number] Match port to number or range")); diff --git a/tools/ipptool.c b/tools/ipptool.c index a3a694d5f..0ebc016c0 100644 --- a/tools/ipptool.c +++ b/tools/ipptool.c @@ -1,7 +1,9 @@ /* * ipptool command for CUPS. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021 by OpenPrinting. + * Copyright © 2020 by The Printer Working Group. + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -33,34 +35,34 @@ * Types... */ -typedef enum _cups_transfer_e /**** How to send request data ****/ +typedef enum ipptool_transfer_e /**** How to send request data ****/ { - _CUPS_TRANSFER_AUTO, /* Chunk for files, length for static */ - _CUPS_TRANSFER_CHUNKED, /* Chunk always */ - _CUPS_TRANSFER_LENGTH /* Length always */ -} _cups_transfer_t; + IPPTOOL_TRANSFER_AUTO, /* Chunk for files, length for static */ + IPPTOOL_TRANSFER_CHUNKED, /* Chunk always */ + IPPTOOL_TRANSFER_LENGTH /* Length always */ +} ipptool_transfer_t; -typedef enum _cups_output_e /**** Output mode ****/ +typedef enum ipptool_output_e /**** Output mode ****/ { - _CUPS_OUTPUT_QUIET, /* No output */ - _CUPS_OUTPUT_TEST, /* Traditional CUPS test output */ - _CUPS_OUTPUT_PLIST, /* XML plist test output */ - _CUPS_OUTPUT_IPPSERVER, /* ippserver attribute file output */ - _CUPS_OUTPUT_LIST, /* Tabular list output */ - _CUPS_OUTPUT_CSV /* Comma-separated values output */ -} _cups_output_t; - -typedef enum _cups_with_e /**** WITH flags ****/ + IPPTOOL_OUTPUT_QUIET, /* No output */ + IPPTOOL_OUTPUT_TEST, /* Traditional CUPS test output */ + IPPTOOL_OUTPUT_PLIST, /* XML plist test output */ + IPPTOOL_OUTPUT_IPPSERVER, /* ippserver attribute file output */ + IPPTOOL_OUTPUT_LIST, /* Tabular list output */ + IPPTOOL_OUTPUT_CSV /* Comma-separated values output */ +} ipptool_output_t; + +typedef enum ipptool_with_e /**** WITH flags ****/ { - _CUPS_WITH_LITERAL = 0, /* Match string is a literal value */ - _CUPS_WITH_ALL = 1, /* Must match all values */ - _CUPS_WITH_REGEX = 2, /* Match string is a regular expression */ - _CUPS_WITH_HOSTNAME = 4, /* Match string is a URI hostname */ - _CUPS_WITH_RESOURCE = 8, /* Match string is a URI resource */ - _CUPS_WITH_SCHEME = 16 /* Match string is a URI scheme */ -} _cups_with_t; - -typedef struct _cups_expect_s /**** Expected attribute info ****/ + IPPTOOL_WITH_LITERAL = 0, /* Match string is a literal value */ + IPPTOOL_WITH_ALL = 1, /* Must match all values */ + IPPTOOL_WITH_REGEX = 2, /* Match string is a regular expression */ + IPPTOOL_WITH_HOSTNAME = 4, /* Match string is a URI hostname */ + IPPTOOL_WITH_RESOURCE = 8, /* Match string is a URI resource */ + IPPTOOL_WITH_SCHEME = 16 /* Match string is a URI scheme */ +} ipptool_with_t; + +typedef struct ipptool_expect_s /**** Expected attribute info ****/ { int optional, /* Optional attribute? */ not_expect, /* Don't expect attribute? */ @@ -78,12 +80,13 @@ typedef struct _cups_expect_s /**** Expected attribute info ****/ int repeat_limit, /* Maximum number of times to repeat */ repeat_match, /* Repeat test on match */ repeat_no_match, /* Repeat test on no match */ - with_flags, /* WITH flags */ + with_distinct, /* WITH-DISTINCT-VALUES? */ + with_flags, /* WITH flags */ count; /* Expected count if > 0 */ ipp_tag_t in_group; /* IN-GROUP value */ -} _cups_expect_t; +} ipptool_expect_t; -typedef struct _cups_status_s /**** Status info ****/ +typedef struct ipptool_status_s /**** Status info ****/ { ipp_status_t status; /* Expected status code */ char *if_defined, /* Only if variable is defined */ @@ -94,14 +97,16 @@ typedef struct _cups_status_s /**** Status info ****/ int repeat_limit, /* Maximum number of times to repeat */ repeat_match, /* Repeat the test when it does not match */ repeat_no_match; /* Repeat the test when it matches */ -} _cups_status_t; +} ipptool_status_t; -typedef struct _cups_testdata_s /**** Test Data ****/ +typedef struct ipptool_test_s /**** Test Data ****/ { /* Global Options */ + _ipp_vars_t *vars; /* Variables */ http_encryption_t encryption; /* Encryption for connection */ int family; /* Address family */ - _cups_output_t output; /* Output mode */ + ipptool_output_t output; /* Output mode */ + int repeat_on_busy; /* Repeat tests on server-error-busy */ int stop_after_include_error; /* Stop after include errors? */ double timeout; /* Timeout for connection */ @@ -110,7 +115,7 @@ typedef struct _cups_testdata_s /**** Test Data ****/ /* Test Defaults */ int def_ignore_errors; /* Default IGNORE-ERRORS value */ - _cups_transfer_t def_transfer; /* Default TRANSFER value */ + ipptool_transfer_t def_transfer; /* Default TRANSFER value */ int def_version; /* Default IPP version */ /* Global State */ @@ -133,24 +138,32 @@ typedef struct _cups_testdata_s /**** Test Data ****/ int num_displayed; /* Number of displayed attributes */ char *displayed[200]; /* Displayed attributes */ int num_expects; /* Number of expected attributes */ - _cups_expect_t expects[200], /* Expected attributes */ + ipptool_expect_t expects[200], /* Expected attributes */ *expect, /* Current expected attribute */ *last_expect; /* Last EXPECT (for predicates) */ char file[1024], /* Data filename */ file_id[1024]; /* File identifier */ int ignore_errors; /* Ignore test failures? */ char name[1024]; /* Test name */ + char pause[1024]; /* PAUSE value */ useconds_t repeat_interval; /* Repeat interval (delay) */ int request_id; /* Current request ID */ char resource[512]; /* Resource for request */ int skip_test, /* Skip this test? */ num_statuses; /* Number of valid status codes */ - _cups_status_t statuses[100], /* Valid status codes */ + ipptool_status_t statuses[100], /* Valid status codes */ *last_status; /* Last STATUS (for predicates) */ char test_id[1024]; /* Test identifier */ - _cups_transfer_t transfer; /* To chunk or not to chunk */ + ipptool_transfer_t transfer; /* To chunk or not to chunk */ int version; /* IPP version number to use */ -} _cups_testdata_t; + _cups_thread_t monitor_thread; /* Monitoring thread ID */ + int monitor_done; /* Set to 1 to stop monitor thread */ + char *monitor_uri; /* MONITOR-PRINTER-STATE URI */ + useconds_t monitor_delay, /* MONITOR-PRINTER-STATE DELAY value, if any */ + monitor_interval; /* MONITOR-PRINTER-STATE DELAY interval */ + int num_monitor_expects; /* Number MONITOR-PRINTER-STATE EXPECTs */ + ipptool_expect_t monitor_expects[10]; /* MONITOR-PRINTER-STATE EXPECTs */ +} ipptool_test_t; /* @@ -167,32 +180,35 @@ static int Cancel = 0; /* Cancel test? */ static void add_stringf(cups_array_t *a, const char *s, ...) _CUPS_FORMAT(2, 3); static int compare_uris(const char *a, const char *b); static void copy_hex_string(char *buffer, unsigned char *data, int datalen, size_t bufsize); -static int do_test(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data); -static int do_tests(const char *testfile, _ipp_vars_t *vars, _cups_testdata_t *data); -static int error_cb(_ipp_file_t *f, _cups_testdata_t *data, const char *error); -static int expect_matches(_cups_expect_t *expect, ipp_tag_t value_tag); +static void *do_monitor_printer_state(ipptool_test_t *data); +static int do_test(_ipp_file_t *f, ipptool_test_t *data); +static int do_tests(const char *testfile, ipptool_test_t *data); +static int error_cb(_ipp_file_t *f, ipptool_test_t *data, const char *error); +static int expect_matches(ipptool_expect_t *expect, ipp_attribute_t *attr); static char *get_filename(const char *testfile, char *dst, const char *src, size_t dstsize); static const char *get_string(ipp_attribute_t *attr, int element, int flags, char *buffer, size_t bufsize); -static void init_data(_cups_testdata_t *data); +static void init_data(ipptool_test_t *data); static char *iso_date(const ipp_uchar_t *date); +static int parse_monitor_printer_state(_ipp_file_t *f, ipptool_test_t *data); static void pause_message(const char *message); -static void print_attr(cups_file_t *outfile, _cups_output_t output, ipp_attribute_t *attr, ipp_tag_t *group); -static void print_csv(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); -static void print_fatal_error(_cups_testdata_t *data, const char *s, ...) _CUPS_FORMAT(2, 3); -static void print_ippserver_attr(_cups_testdata_t *data, ipp_attribute_t *attr, int indent); -static void print_ippserver_string(_cups_testdata_t *data, const char *s, size_t len); -static void print_line(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); -static void print_xml_header(_cups_testdata_t *data); +static void print_attr(cups_file_t *outfile, ipptool_output_t output, ipp_attribute_t *attr, ipp_tag_t *group); +static void print_csv(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); +static void print_fatal_error(ipptool_test_t *data, const char *s, ...) _CUPS_FORMAT(2, 3); +static void print_ippserver_attr(ipptool_test_t *data, ipp_attribute_t *attr, int indent); +static void print_ippserver_string(ipptool_test_t *data, const char *s, size_t len); +static void print_line(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); +static void print_xml_header(ipptool_test_t *data); static void print_xml_string(cups_file_t *outfile, const char *element, const char *s); -static void print_xml_trailer(_cups_testdata_t *data, int success, const char *message); +static void print_xml_trailer(ipptool_test_t *data, int success, const char *message); #ifndef _WIN32 static void sigterm_handler(int sig); #endif /* _WIN32 */ static int timeout_cb(http_t *http, void *user_data); -static int token_cb(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data, const char *token); +static int token_cb(_ipp_file_t *f, _ipp_vars_t *vars, ipptool_test_t *data, const char *token); static void usage(void) _CUPS_NORETURN; +static int with_distinct_values(cups_array_t *errors, ipp_attribute_t *attr); static const char *with_flags_string(int flags); -static int with_value(_cups_testdata_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); +static int with_value(ipptool_test_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); static int with_value_from(cups_array_t *errors, ipp_attribute_t *fromattr, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); @@ -215,8 +231,8 @@ main(int argc, /* I - Number of command-line args */ *testfile; /* Test file to use */ int interval, /* Test interval in microseconds */ repeat; /* Repeat count */ - _cups_testdata_t data; /* Test data */ _ipp_vars_t vars; /* Variables */ + ipptool_test_t data; /* Test data */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ @@ -239,8 +255,9 @@ main(int argc, /* I - Number of command-line args */ init_data(&data); _ippVarsInit(&vars, NULL, (_ipp_ferror_cb_t)error_cb, (_ipp_ftoken_cb_t)token_cb); + data.vars = &vars; - _ippVarsSet(&vars, "date-start", iso_date(ippTimeToDate(time(NULL)))); + _ippVarsSet(data.vars, "date-start", iso_date(ippTimeToDate(time(NULL)))); /* * We need at least: @@ -278,7 +295,7 @@ main(int argc, /* I - Number of command-line args */ exit(1); } - data.output = _CUPS_OUTPUT_IPPSERVER; + data.output = IPPTOOL_OUTPUT_IPPSERVER; } else if (!strcmp(argv[i], "--stop-after-include-error")) { @@ -306,7 +323,7 @@ main(int argc, /* I - Number of command-line args */ #endif /* AF_INET6 */ case 'C' : /* Enable HTTP chunking */ - data.def_transfer = _CUPS_TRANSFER_CHUNKED; + data.def_transfer = IPPTOOL_TRANSFER_CHUNKED; break; case 'E' : /* Encrypt with TLS */ @@ -323,7 +340,7 @@ main(int argc, /* I - Number of command-line args */ break; case 'L' : /* Disable HTTP chunking */ - data.def_transfer = _CUPS_TRANSFER_LENGTH; + data.def_transfer = IPPTOOL_TRANSFER_LENGTH; break; case 'P' : /* Output to plist file */ @@ -344,7 +361,7 @@ main(int argc, /* I - Number of command-line args */ exit(1); } - data.output = _CUPS_OUTPUT_PLIST; + data.output = IPPTOOL_OUTPUT_PLIST; if (interval || repeat) { @@ -353,12 +370,15 @@ main(int argc, /* I - Number of command-line args */ } break; + case 'R' : /* Repeat on server-error-busy */ + data.repeat_on_busy = 1; + break; + case 'S' : /* Encrypt with SSL */ #ifdef HAVE_SSL data.encryption = HTTP_ENCRYPT_ALWAYS; #else - _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), - argv[0]); + _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), "ipptool"); #endif /* HAVE_SSL */ break; @@ -367,9 +387,7 @@ main(int argc, /* I - Number of command-line args */ if (i >= argc) { - _cupsLangPrintf(stderr, - _("%s: Missing timeout for \"-T\"."), - "ipptool"); + _cupsLangPrintf(stderr, _("%s: Missing timeout for \"-T\"."), "ipptool"); usage(); } @@ -381,9 +399,7 @@ main(int argc, /* I - Number of command-line args */ if (i >= argc) { - _cupsLangPrintf(stderr, - _("%s: Missing version for \"-V\"."), - "ipptool"); + _cupsLangPrintf(stderr, _("%s: Missing version for \"-V\"."), "ipptool"); usage(); } @@ -415,7 +431,7 @@ main(int argc, /* I - Number of command-line args */ break; case 'X' : /* Produce XML output */ - data.output = _CUPS_OUTPUT_PLIST; + data.output = IPPTOOL_OUTPUT_PLIST; if (interval || repeat) { @@ -425,7 +441,7 @@ main(int argc, /* I - Number of command-line args */ break; case 'c' : /* CSV output */ - data.output = _CUPS_OUTPUT_CSV; + data.output = IPPTOOL_OUTPUT_CSV; break; case 'd' : /* Define a variable */ @@ -433,8 +449,7 @@ main(int argc, /* I - Number of command-line args */ if (i >= argc) { - _cupsLangPuts(stderr, - _("ipptool: Missing name=value for \"-d\".")); + _cupsLangPuts(stderr, _("ipptool: Missing name=value for \"-d\".")); usage(); } @@ -444,7 +459,7 @@ main(int argc, /* I - Number of command-line args */ else value = name + strlen(name); - _ippVarsSet(&vars, name, value); + _ippVarsSet(data.vars, name, value); break; case 'f' : /* Set the default test filename */ @@ -452,8 +467,7 @@ main(int argc, /* I - Number of command-line args */ if (i >= argc) { - _cupsLangPuts(stderr, - _("ipptool: Missing filename for \"-f\".")); + _cupsLangPuts(stderr, _("ipptool: Missing filename for \"-f\".")); usage(); } @@ -482,7 +496,7 @@ main(int argc, /* I - Number of command-line args */ else strlcpy(filename, argv[i], sizeof(filename)); - _ippVarsSet(&vars, "filename", filename); + _ippVarsSet(data.vars, "filename", filename); if ((ext = strrchr(filename, '.')) != NULL) { @@ -491,43 +505,43 @@ main(int argc, /* I - Number of command-line args */ */ if (!_cups_strcasecmp(ext, ".gif")) - _ippVarsSet(&vars, "filetype", "image/gif"); + _ippVarsSet(data.vars, "filetype", "image/gif"); else if (!_cups_strcasecmp(ext, ".htm") || !_cups_strcasecmp(ext, ".htm.gz") || !_cups_strcasecmp(ext, ".html") || !_cups_strcasecmp(ext, ".html.gz")) - _ippVarsSet(&vars, "filetype", "text/html"); + _ippVarsSet(data.vars, "filetype", "text/html"); else if (!_cups_strcasecmp(ext, ".jpg") || !_cups_strcasecmp(ext, ".jpeg")) - _ippVarsSet(&vars, "filetype", "image/jpeg"); + _ippVarsSet(data.vars, "filetype", "image/jpeg"); else if (!_cups_strcasecmp(ext, ".pcl") || !_cups_strcasecmp(ext, ".pcl.gz")) - _ippVarsSet(&vars, "filetype", "application/vnd.hp-PCL"); + _ippVarsSet(data.vars, "filetype", "application/vnd.hp-PCL"); else if (!_cups_strcasecmp(ext, ".pdf")) - _ippVarsSet(&vars, "filetype", "application/pdf"); + _ippVarsSet(data.vars, "filetype", "application/pdf"); else if (!_cups_strcasecmp(ext, ".png")) - _ippVarsSet(&vars, "filetype", "image/png"); + _ippVarsSet(data.vars, "filetype", "image/png"); else if (!_cups_strcasecmp(ext, ".ps") || !_cups_strcasecmp(ext, ".ps.gz")) - _ippVarsSet(&vars, "filetype", "application/postscript"); + _ippVarsSet(data.vars, "filetype", "application/postscript"); else if (!_cups_strcasecmp(ext, ".pwg") || !_cups_strcasecmp(ext, ".pwg.gz") || !_cups_strcasecmp(ext, ".ras") || !_cups_strcasecmp(ext, ".ras.gz")) - _ippVarsSet(&vars, "filetype", "image/pwg-raster"); + _ippVarsSet(data.vars, "filetype", "image/pwg-raster"); else if (!_cups_strcasecmp(ext, ".tif") || !_cups_strcasecmp(ext, ".tiff")) - _ippVarsSet(&vars, "filetype", "image/tiff"); + _ippVarsSet(data.vars, "filetype", "image/tiff"); else if (!_cups_strcasecmp(ext, ".txt") || !_cups_strcasecmp(ext, ".txt.gz")) - _ippVarsSet(&vars, "filetype", "text/plain"); + _ippVarsSet(data.vars, "filetype", "text/plain"); else if (!_cups_strcasecmp(ext, ".urf") || !_cups_strcasecmp(ext, ".urf.gz")) - _ippVarsSet(&vars, "filetype", "image/urf"); + _ippVarsSet(data.vars, "filetype", "image/urf"); else if (!_cups_strcasecmp(ext, ".xps")) - _ippVarsSet(&vars, "filetype", "application/openxps"); + _ippVarsSet(data.vars, "filetype", "application/openxps"); else - _ippVarsSet(&vars, "filetype", "application/octet-stream"); + _ippVarsSet(data.vars, "filetype", "application/octet-stream"); } else { @@ -535,7 +549,7 @@ main(int argc, /* I - Number of command-line args */ * Use the "auto-type" MIME media type... */ - _ippVarsSet(&vars, "filetype", "application/octet-stream"); + _ippVarsSet(data.vars, "filetype", "application/octet-stream"); } break; @@ -561,7 +575,7 @@ main(int argc, /* I - Number of command-line args */ } } - if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && interval) + if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && interval) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\".")); usage(); @@ -569,7 +583,7 @@ main(int argc, /* I - Number of command-line args */ break; case 'l' : /* List as a table */ - data.output = _CUPS_OUTPUT_LIST; + data.output = IPPTOOL_OUTPUT_LIST; break; case 'n' : /* Repeat count */ @@ -583,7 +597,7 @@ main(int argc, /* I - Number of command-line args */ else repeat = atoi(argv[i]); - if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && repeat) + if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && repeat) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\".")); usage(); @@ -591,11 +605,11 @@ main(int argc, /* I - Number of command-line args */ break; case 'q' : /* Be quiet */ - data.output = _CUPS_OUTPUT_QUIET; + data.output = IPPTOOL_OUTPUT_QUIET; break; case 't' : /* CUPS test output */ - data.output = _CUPS_OUTPUT_TEST; + data.output = IPPTOOL_OUTPUT_TEST; break; case 'v' : /* Be verbose */ @@ -618,7 +632,7 @@ main(int argc, /* I - Number of command-line args */ * Set URI... */ - if (vars.uri) + if (data.vars->uri) { _cupsLangPuts(stderr, _("ipptool: May only specify a single URI.")); usage(); @@ -629,14 +643,14 @@ main(int argc, /* I - Number of command-line args */ data.encryption = HTTP_ENCRYPT_ALWAYS; #endif /* HAVE_SSL */ - if (!_ippVarsSet(&vars, "uri", argv[i])) + if (!_ippVarsSet(data.vars, "uri", argv[i])) { _cupsLangPrintf(stderr, _("ipptool: Bad URI \"%s\"."), argv[i]); return (1); } - if (vars.username[0] && vars.password) - cupsSetPasswordCB2(_ippVarsPasswordCB, &vars); + if (data.vars->username[0] && data.vars->password) + cupsSetPasswordCB2(_ippVarsPasswordCB, data.vars); } else { @@ -644,7 +658,7 @@ main(int argc, /* I - Number of command-line args */ * Run test... */ - if (!vars.uri) + if (!data.vars->uri) { _cupsLangPuts(stderr, _("ipptool: URI required before test file.")); _cupsLangPuts(stderr, argv[i]); @@ -666,26 +680,26 @@ main(int argc, /* I - Number of command-line args */ else testfile = argv[i]; - if (!do_tests(testfile, &vars, &data)) + if (!do_tests(testfile, &data)) status = 1; } } - if (!vars.uri || !testfile) + if (!data.vars->uri || !testfile) usage(); /* * Loop if the interval is set... */ - if (data.output == _CUPS_OUTPUT_PLIST) + if (data.output == IPPTOOL_OUTPUT_PLIST) print_xml_trailer(&data, !status, NULL); else if (interval > 0 && repeat > 0) { while (repeat > 1) { usleep((useconds_t)interval); - do_tests(testfile, &vars, &data); + do_tests(testfile, &data); repeat --; } } @@ -694,11 +708,11 @@ main(int argc, /* I - Number of command-line args */ for (;;) { usleep((useconds_t)interval); - do_tests(testfile, &vars, &data); + do_tests(testfile, &data); } } - if ((data.output == _CUPS_OUTPUT_TEST || (data.output == _CUPS_OUTPUT_PLIST && data.outfile)) && data.test_count > 1) + if ((data.output == IPPTOOL_OUTPUT_TEST || (data.output == IPPTOOL_OUTPUT_PLIST && data.outfile)) && data.test_count > 1) { /* * Show a summary report if there were multiple tests... @@ -709,7 +723,7 @@ main(int argc, /* I - Number of command-line args */ cupsFileClose(data.outfile); -/* + /* * Exit... */ @@ -881,21 +895,277 @@ copy_hex_string(char *buffer, /* I - String buffer */ } +/* + * 'do_monitor_printer_state()' - Do the MONITOR-PRINTER-STATE tests in the background. + */ + +static void * // O - Thread exit status +do_monitor_printer_state( + ipptool_test_t *data) // I - Test data +{ + int i; // Looping var + char scheme[32], // URI scheme + userpass[32], // URI username:password + host[256], // URI hostname/IP address + resource[256]; // URI resource path + int port; // URI port number + http_encryption_t encryption; // Encryption to use + http_t *http; // Connection to printer + ipp_t *request, // IPP request + *response = NULL; // IPP response + http_status_t status; // Request status + ipp_attribute_t *found; // Found attribute + ipptool_expect_t *expect; // Current EXPECT test + char buffer[131072]; // Copy buffer + static const char *pattrs[] = // List of attributes we care about + { + "marker-change-time", // "marker-xxx" are a CUPS/AirPrint extension + "marker-colors", + "marker-high-levels", + "marker-levels", + "marker-low-levels", + "marker-message", + "marker-names", + "marker-types", + "printer-alert", + "printer-alert-description", + "printer-config-change-date-time", + "printer-config-change-time", + "printer-config-changes", + "printer-current-time", + "printer-finisher", + "printer-finisher-description", + "printer-finisher-supplies", + "printer-finisher-supplies-description", + "printer-impressions-completed", + "printer-impressions-completed-col", + "printer-input-tray", + "printer-is-accepting-jobs", + "printer-media-sheets-completed", + "printer-media-sheets-completed-col", + "printer-message-date-time", + "printer-message-from-operator", + "printer-message-time", + "printer-output-tray", + "printer-pages-completed", + "printer-pages-completed-col", + "printer-state", + "printer-state-change-date-time", + "printer-state-change-time", + "printer-state-reasons", + "printer-supply", + "printer-supply-description", + "printer-up-time", + "queued-job-count" + }; + + + // Connect to the printer... + if (httpSeparateURI(HTTP_URI_CODING_ALL, data->monitor_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) + { + print_fatal_error(data, "Bad printer URI \"%s\".", data->monitor_uri); + return (NULL); + } + + if (!_cups_strcasecmp(scheme, "https") || !_cups_strcasecmp(scheme, "ipps") || port == 443) + encryption = HTTP_ENCRYPTION_ALWAYS; + else + encryption = data->encryption; + + if ((http = httpConnect2(host, port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL) + { + print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", host, port, cupsLastErrorString()); + return (0); + } + +#ifdef HAVE_LIBZ + httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "deflate, gzip, identity"); +#else + httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "identity"); +#endif /* HAVE_LIBZ */ + + if (data->timeout > 0.0) + httpSetTimeout(http, data->timeout, timeout_cb, NULL); + + // Wait for the initial delay as needed... + if (data->monitor_delay) + usleep(data->monitor_delay); + + // Create a query request that we'll reuse... + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); + ippSetVersion(request, data->version / 10, data->version % 10); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, data->monitor_uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); + ippAddStrings(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs); + + // Loop until we need to stop... + while (!data->monitor_done && !Cancel) + { + // Poll the printer state... + if ((status = cupsSendRequest(http, request, resource, ippLength(request))) != HTTP_STATUS_ERROR) + { + response = cupsGetResponse(http, resource); + status = httpGetStatus(http); + } + + if (!data->monitor_done && !Cancel && status == HTTP_STATUS_ERROR && httpError(data->http) != EINVAL && +#ifdef _WIN32 + httpError(data->http) != WSAETIMEDOUT) +#else + httpError(data->http) != ETIMEDOUT) +#endif // _WIN32 + { + if (httpReconnect2(http, 30000, NULL)) + break; + } + else if (status == HTTP_STATUS_ERROR || status == HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED) + { + break; + } + else if (status != HTTP_STATUS_OK) + { + httpFlush(http); + + if (status == HTTP_STATUS_UNAUTHORIZED) + continue; + + break; + } + + for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++) + { + if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined)) + continue; + + if (expect->if_not_defined && _ippVarsGet(data->vars, expect->if_not_defined)) + continue; + + found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO); + + if ((found && expect->not_expect) || + (!found && !(expect->not_expect || expect->optional)) || + (found && !expect_matches(expect, found)) || + (expect->in_group && ippGetGroupTag(found) != expect->in_group) || + (expect->with_distinct && !with_distinct_values(NULL, found))) + { + if (expect->define_no_match) + { + _ippVarsSet(data->vars, expect->define_no_match, "1"); + data->monitor_done = 1; + } + break; + } + + if (found) + ippAttributeString(found, buffer, sizeof(buffer)); + + if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer))) + { + if (expect->define_no_match) + { + _ippVarsSet(data->vars, expect->define_no_match, "1"); + data->monitor_done = 1; + } + break; + } + + if (found && expect->count > 0 && ippGetCount(found) != expect->count) + { + if (expect->define_no_match) + { + _ippVarsSet(data->vars, expect->define_no_match, "1"); + data->monitor_done = 1; + } + break; + } + + if (found && expect->define_match) + { + _ippVarsSet(data->vars, expect->define_match, "1"); + data->monitor_done = 1; + } + + if (found && expect->define_value) + { + if (!expect->with_value) + { + int last = ippGetCount(found) - 1; + // Last element in attribute + + switch (ippGetValueTag(found)) + { + case IPP_TAG_ENUM : + case IPP_TAG_INTEGER : + snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(found, last)); + break; + + case IPP_TAG_BOOLEAN : + if (ippGetBoolean(found, last)) + strlcpy(buffer, "true", sizeof(buffer)); + else + strlcpy(buffer, "false", sizeof(buffer)); + break; + + case IPP_TAG_CHARSET : + case IPP_TAG_KEYWORD : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + case IPP_TAG_NAME : + case IPP_TAG_NAMELANG : + case IPP_TAG_TEXT : + case IPP_TAG_TEXTLANG : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + strlcpy(buffer, ippGetString(found, last, NULL), sizeof(buffer)); + break; + + default : + ippAttributeString(found, buffer, sizeof(buffer)); + break; + } + } + + _ippVarsSet(data->vars, expect->define_value, buffer); + data->monitor_done = 1; + } + } + + if (i == 0) + data->monitor_done = 1; // All tests passed + + ippDelete(response); + response = NULL; + + // Sleep between requests... + if (data->monitor_done || Cancel) + break; + + usleep(data->monitor_interval); + } + + // Close the connection to the printer and return... + httpClose(http); + ippDelete(request); + ippDelete(response); + + return (NULL); +} + + /* * 'do_test()' - Do a single test from the test file. */ static int /* O - 1 on success, 0 on failure */ -do_test(_ipp_file_t *f, /* I - IPP data file */ - _ipp_vars_t *vars, /* I - IPP variables */ - _cups_testdata_t *data) /* I - Test data */ +do_test(_ipp_file_t *f, /* I - IPP data file */ + ipptool_test_t *data) /* I - Test data */ { int i, /* Looping var */ status_ok, /* Did we get a matching status? */ repeat_count = 0, /* Repeat count */ repeat_test; /* Repeat the test? */ - _cups_expect_t *expect; /* Current expected attribute */ + ipptool_expect_t *expect; /* Current expected attribute */ ipp_t *request, /* IPP request */ *response; /* IPP response */ size_t length; /* Length of IPP request */ @@ -915,6 +1185,25 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (Cancel) return (0); + /* + * Show any PAUSE message, as needed... + */ + + if (data->pause[0]) + { + if (!data->skip_test) + pause_message(data->pause); + + data->pause[0] = '\0'; + } + + /* + * Start the background thread as needed... + */ + + if (data->monitor_uri) + data->monitor_thread = _cupsThreadCreate((_cups_thread_func_t)do_monitor_printer_state, data); + /* * Take over control of the attributes in the request... */ @@ -931,7 +1220,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ ippSetVersion(request, data->version / 10, data->version % 10); ippSetRequestId(request, data->request_id); - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "Name\n"); @@ -964,14 +1253,14 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ cupsFilePuts(data->outfile, "\n"); } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { if (data->verbosity) { cupsFilePrintf(cupsFileStdout(), " %s:\n", ippOpString(ippGetOperation(request))); for (attrptr = ippFirstAttribute(request); attrptr; attrptr = ippNextAttribute(request)) - print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL); + print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL); } cupsFilePrintf(cupsFileStdout(), " %-68.68s [", data->name); @@ -985,7 +1274,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ request = NULL; response = NULL; - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "Successful\n"); cupsFilePuts(data->outfile, "\n"); @@ -997,13 +1286,13 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ cupsFilePuts(data->outfile, "\n"); } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) cupsFilePuts(cupsFileStdout(), "SKIP]\n"); goto skip_error; } - vars->password_tries = 0; + data->vars->password_tries = 0; do { @@ -1015,7 +1304,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ status = HTTP_STATUS_OK; - if (data->transfer == _CUPS_TRANSFER_CHUNKED || (data->transfer == _CUPS_TRANSFER_AUTO && data->file[0])) + if (data->transfer == IPPTOOL_TRANSFER_CHUNKED || (data->transfer == IPPTOOL_TRANSFER_AUTO && data->file[0])) { /* * Send request using chunking - a 0 length means "chunk". @@ -1056,6 +1345,8 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ { while (!response && !Cancel && data->prev_pass) { + ippSetRequestId(request, ++ data->request_id); + status = cupsSendRequest(data->http, request, data->resource, length); #ifdef HAVE_LIBZ @@ -1185,16 +1476,16 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if ((attrptr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) != NULL) { snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0)); - _ippVarsSet(vars, "job-id", temp); + _ippVarsSet(data->vars, "job-id", temp); } if ((attrptr = ippFindAttribute(response, "job-uri", IPP_TAG_URI)) != NULL) - _ippVarsSet(vars, "job-uri", ippGetString(attrptr, 0, NULL)); + _ippVarsSet(data->vars, "job-uri", ippGetString(attrptr, 0, NULL)); if ((attrptr = ippFindAttribute(response, "notify-subscription-id", IPP_TAG_INTEGER)) != NULL) { snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0)); - _ippVarsSet(vars, "notify-subscription-id", temp); + _ippVarsSet(data->vars, "notify-subscription-id", temp); } /* @@ -1212,27 +1503,27 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ major = ippGetVersion(response, &minor); if (major != (data->version / 10) || minor != (data->version % 10)) - add_stringf(data->errors, "Bad version %d.%d in response - expected %d.%d (RFC 2911 section 3.1.8).", major, minor, data->version / 10, data->version % 10); + add_stringf(data->errors, "Bad version %d.%d in response - expected %d.%d (RFC 8011 section 4.1.8).", major, minor, data->version / 10, data->version % 10); } if (ippGetRequestId(response) != data->request_id) - add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 2911 section 3.1.1)", ippGetRequestId(response), data->request_id); + add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 8011 section 4.1.1)", ippGetRequestId(response), data->request_id); attrptr = ippFirstAttribute(response); if (!attrptr) { - add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4)."); + add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4)."); } else { if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_CHARSET || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 ||strcmp(ippGetName(attrptr), "attributes-charset")) - add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); + add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); attrptr = ippNextAttribute(response); if (!attrptr) - add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4)."); + add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 8011 section 4.1.4)."); else if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_LANGUAGE || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 || strcmp(ippGetName(attrptr), "attributes-natural-language")) - add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); + add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); } if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_ZERO)) != NULL) @@ -1241,13 +1532,13 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ /* String value */ if (ippGetValueTag(attrptr) != IPP_TAG_TEXT) - add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetValueTag(attrptr))); + add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetValueTag(attrptr))); if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION) - add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetGroupTag(attrptr))); + add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetGroupTag(attrptr))); if (ippGetCount(attrptr) != 1) - add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 2911 section 3.1.6.2).", ippGetCount(attrptr)); + add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 8011 section 4.1.6.2).", ippGetCount(attrptr)); if (status_message && strlen(status_message) > 255) - add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 2911 section 3.1.6.2).", (int)strlen(status_message)); + add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 8011 section 4.1.6.2).", (int)strlen(status_message)); } if ((attrptr = ippFindAttribute(response, "detailed-status-message", @@ -1257,25 +1548,13 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ /* String value */ if (ippGetValueTag(attrptr) != IPP_TAG_TEXT) - add_stringf(data->errors, - "detailed-status-message (text(MAX)) has wrong " - "value tag %s (RFC 2911 section 3.1.6.3).", - ippTagString(ippGetValueTag(attrptr))); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong value tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetValueTag(attrptr))); if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION) - add_stringf(data->errors, - "detailed-status-message (text(MAX)) has wrong " - "group tag %s (RFC 2911 section 3.1.6.3).", - ippTagString(ippGetGroupTag(attrptr))); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong group tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetGroupTag(attrptr))); if (ippGetCount(attrptr) != 1) - add_stringf(data->errors, - "detailed-status-message (text(MAX)) has %d values" - " (RFC 2911 section 3.1.6.3).", - ippGetCount(attrptr)); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has %d values (RFC 8011 section 4.1.6.3).", ippGetCount(attrptr)); if (detailed_status_message && strlen(detailed_status_message) > 1023) - add_stringf(data->errors, - "detailed-status-message (text(MAX)) has bad " - "length %d (RFC 2911 section 3.1.6.3).", - (int)strlen(detailed_status_message)); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has bad length %d (RFC 8011 section 4.1.6.3).", (int)strlen(detailed_status_message)); } a = cupsArrayNew((cups_array_func_t)strcmp, NULL); @@ -1321,9 +1600,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } if (out_of_order) - add_stringf(data->errors, "Attribute groups out of order (%s < %s)", - ippTagString(ippGetGroupTag(attrptr)), - ippTagString(group)); + add_stringf(data->errors, "Attribute groups out of order (%s < %s)", ippTagString(ippGetGroupTag(attrptr)), ippTagString(group)); if (ippGetGroupTag(attrptr) != IPP_TAG_ZERO) group = ippGetGroupTag(attrptr); @@ -1334,9 +1611,8 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (ippGetName(attrptr)) { - if (cupsArrayFind(a, (void *)ippGetName(attrptr)) && data->output < _CUPS_OUTPUT_LIST) - add_stringf(data->errors, "Duplicate \"%s\" attribute in %s group", - ippGetName(attrptr), ippTagString(group)); + if (cupsArrayFind(a, (void *)ippGetName(attrptr)) && data->output < IPPTOOL_OUTPUT_LIST) + add_stringf(data->errors, "Duplicate \"%s\" attribute in %s group", ippGetName(attrptr), ippTagString(group)); cupsArrayAdd(a, (void *)ippGetName(attrptr)); } @@ -1349,14 +1625,21 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ * values... */ + if (ippGetStatusCode(response) == IPP_STATUS_ERROR_BUSY && data->repeat_on_busy) + { + // Repeat on a server-error-busy status code... + status_ok = 1; + repeat_test = 1; + } + for (i = 0, status_ok = 0; i < data->num_statuses; i ++) { if (data->statuses[i].if_defined && - !_ippVarsGet(vars, data->statuses[i].if_defined)) + !_ippVarsGet(data->vars, data->statuses[i].if_defined)) continue; if (data->statuses[i].if_not_defined && - _ippVarsGet(vars, data->statuses[i].if_not_defined)) + _ippVarsGet(data->vars, data->statuses[i].if_not_defined)) continue; if (ippGetStatusCode(response) == data->statuses[i].status) @@ -1367,7 +1650,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ repeat_test = 1; if (data->statuses[i].define_match) - _ippVarsSet(vars, data->statuses[i].define_match, "1"); + _ippVarsSet(data->vars, data->statuses[i].define_match, "1"); } else { @@ -1376,7 +1659,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (data->statuses[i].define_no_match) { - _ippVarsSet(vars, data->statuses[i].define_no_match, "1"); + _ippVarsSet(data->vars, data->statuses[i].define_no_match, "1"); status_ok = 1; } } @@ -1387,21 +1670,18 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ for (i = 0; i < data->num_statuses; i ++) { if (data->statuses[i].if_defined && - !_ippVarsGet(vars, data->statuses[i].if_defined)) + !_ippVarsGet(data->vars, data->statuses[i].if_defined)) continue; if (data->statuses[i].if_not_defined && - _ippVarsGet(vars, data->statuses[i].if_not_defined)) + _ippVarsGet(data->vars, data->statuses[i].if_not_defined)) continue; if (!data->statuses[i].repeat_match || repeat_count >= data->statuses[i].repeat_limit) - add_stringf(data->errors, "EXPECTED: STATUS %s (got %s)", - ippErrorString(data->statuses[i].status), - ippErrorString(cupsLastError())); + add_stringf(data->errors, "EXPECTED: STATUS %s (got %s)", ippErrorString(data->statuses[i].status), ippErrorString(cupsLastError())); } - if ((attrptr = ippFindAttribute(response, "status-message", - IPP_TAG_TEXT)) != NULL) + if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT)) != NULL) add_stringf(data->errors, "status-message=\"%s\"", ippGetString(attrptr, 0, NULL)); } @@ -1409,11 +1689,11 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ { ipp_attribute_t *group_found; /* Found parent attribute for group tests */ - if (expect->if_defined && !_ippVarsGet(vars, expect->if_defined)) + if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined)) continue; if (expect->if_not_defined && - _ippVarsGet(vars, expect->if_not_defined)) + _ippVarsGet(data->vars, expect->if_not_defined)) continue; if ((found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL && expect->in_group && expect->in_group != ippGetGroupTag(found)) @@ -1441,11 +1721,12 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if ((found && expect->not_expect) || (!found && !(expect->not_expect || expect->optional)) || - (found && !expect_matches(expect, ippGetValueTag(found))) || - (group_found && expect->in_group && ippGetGroupTag(group_found) != expect->in_group)) + (found && !expect_matches(expect, found)) || + (group_found && expect->in_group && ippGetGroupTag(group_found) != expect->in_group) || + (expect->with_distinct && !with_distinct_values(NULL, found))) { if (expect->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value) { if (found && expect->not_expect && !expect->with_value && !expect->with_value_from) @@ -1454,7 +1735,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ add_stringf(data->errors, "EXPECTED: %s", expect->name); else if (found) { - if (!expect_matches(expect, ippGetValueTag(found))) + if (!expect_matches(expect, found)) add_stringf(data->errors, "EXPECTED: %s OF-TYPE %s (got %s)", expect->name, expect->of_type, ippTagString(ippGetValueTag(found))); @@ -1463,6 +1744,9 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ add_stringf(data->errors, "EXPECTED: %s IN-GROUP %s (got %s).", expect->name, ippTagString(expect->in_group), ippTagString(ippGetGroupTag(group_found))); + + if (expect->with_distinct) + with_distinct_values(data->errors, found); } } @@ -1477,7 +1761,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (found && expect->with_value_from && !with_value_from(NULL, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer))) { if (expect->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value && ((!expect->repeat_match && !expect->repeat_no_match) || repeat_count >= expect->repeat_limit)) { add_stringf(data->errors, "EXPECTED: %s WITH-VALUES-FROM %s", expect->name, expect->with_value_from); @@ -1493,11 +1777,11 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ else if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer))) { if (expect->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value && !expect->repeat_match && (!expect->repeat_no_match || repeat_count >= expect->repeat_limit)) { - if (expect->with_flags & _CUPS_WITH_REGEX) + if (expect->with_flags & IPPTOOL_WITH_REGEX) add_stringf(data->errors, "EXPECTED: %s %s /%s/", expect->name, with_flags_string(expect->with_flags), expect->with_value); else add_stringf(data->errors, "EXPECTED: %s %s \"%s\"", expect->name, with_flags_string(expect->with_flags), expect->with_value); @@ -1515,11 +1799,10 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (found && expect->count > 0 && ippGetCount(found) != expect->count) { if (expect->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value) { - add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name, - expect->count, ippGetCount(found)); + add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name, expect->count, ippGetCount(found)); } if (expect->repeat_no_match && @@ -1537,19 +1820,13 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (!attrptr || ippGetCount(attrptr) != ippGetCount(found)) { if (expect->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value) { if (!attrptr) - add_stringf(data->errors, - "EXPECTED: %s (%d values) SAME-COUNT-AS %s " - "(not returned)", expect->name, - ippGetCount(found), expect->same_count_as); + add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (not returned)", expect->name, ippGetCount(found), expect->same_count_as); else if (ippGetCount(attrptr) != ippGetCount(found)) - add_stringf(data->errors, - "EXPECTED: %s (%d values) SAME-COUNT-AS %s " - "(%d values)", expect->name, ippGetCount(found), - expect->same_count_as, ippGetCount(attrptr)); + add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (%d values)", expect->name, ippGetCount(found), expect->same_count_as, ippGetCount(attrptr)); } if (expect->repeat_no_match && @@ -1561,7 +1838,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } if (found && expect->define_match) - _ippVarsSet(vars, expect->define_match, "1"); + _ippVarsSet(data->vars, expect->define_match, "1"); if (found && expect->define_value) { @@ -1618,7 +1895,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } } - _ippVarsSet(vars, expect->define_value, buffer); + _ippVarsSet(data->vars, expect->define_value, buffer); } if (found && expect->repeat_match && @@ -1635,7 +1912,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (repeat_test) { - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { cupsFilePrintf(cupsFileStdout(), "%04d]\n", repeat_count); \ @@ -1650,7 +1927,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ { if (!strcmp(data->displayed[i], attrname)) { - print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL); + print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL); break; } } @@ -1659,7 +1936,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { cupsFilePrintf(cupsFileStdout(), " %-68.68s [", data->name); } @@ -1682,7 +1959,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ else data->fail_count ++; - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "Successful\n"); cupsFilePuts(data->outfile, data->prev_pass ? "\n" : "\n"); @@ -1698,7 +1975,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); } - else if (data->output == _CUPS_OUTPUT_IPPSERVER && response) + else if (data->output == IPPTOOL_OUTPUT_IPPSERVER && response) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) { @@ -1709,7 +1986,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { cupsFilePuts(cupsFileStdout(), data->prev_pass ? "PASS]\n" : "FAIL]\n"); @@ -1721,14 +1998,14 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (data->verbosity && response) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) - print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL); + print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL); } } } - else if (!data->prev_pass && data->output != _CUPS_OUTPUT_QUIET) + else if (!data->prev_pass && data->output != IPPTOOL_OUTPUT_QUIET) fprintf(stderr, "%s\n", cupsLastErrorString()); - if (data->prev_pass && data->output >= _CUPS_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0) + if (data->prev_pass && data->output >= IPPTOOL_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0) { size_t width; /* Length of value */ @@ -1746,7 +2023,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } } - if (data->output == _CUPS_OUTPUT_CSV) + if (data->output == IPPTOOL_OUTPUT_CSV) print_csv(data, NULL, NULL, data->num_displayed, data->displayed, widths); else print_line(data, NULL, NULL, data->num_displayed, data->displayed, widths); @@ -1760,7 +2037,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (attrptr) { - if (data->output == _CUPS_OUTPUT_CSV) + if (data->output == IPPTOOL_OUTPUT_CSV) print_csv(data, response, attrptr, data->num_displayed, data->displayed, widths); else print_line(data, response, attrptr, data->num_displayed, data->displayed, widths); @@ -1772,7 +2049,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } else if (!data->prev_pass) { - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "Errors\n"); cupsFilePuts(data->outfile, "\n"); @@ -1785,7 +2062,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ cupsFilePuts(data->outfile, "\n"); } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { for (error = (char *)cupsArrayFirst(data->errors); error; @@ -1794,7 +2071,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } } - if (data->num_displayed > 0 && !data->verbosity && response && (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))) + if (data->num_displayed > 0 && !data->verbosity && response && (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) { @@ -1814,7 +2091,13 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ skip_error: - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->monitor_thread) + { + data->monitor_done = 1; + _cupsThreadWait(data->monitor_thread); + } + + if (data->output == IPPTOOL_OUTPUT_PLIST) cupsFilePuts(data->outfile, "\n"); ippDelete(response); @@ -1859,6 +2142,31 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ free(data->displayed[i]); data->num_displayed = 0; + free(data->monitor_uri); + data->monitor_uri = NULL; + + for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++) + { + free(expect->name); + if (expect->of_type) + free(expect->of_type); + if (expect->same_count_as) + free(expect->same_count_as); + if (expect->if_defined) + free(expect->if_defined); + if (expect->if_not_defined) + free(expect->if_not_defined); + if (expect->with_value) + free(expect->with_value); + if (expect->define_match) + free(expect->define_match); + if (expect->define_no_match) + free(expect->define_no_match); + if (expect->define_value) + free(expect->define_value); + } + data->num_monitor_expects = 0; + return (data->ignore_errors || data->prev_pass); } @@ -1868,9 +2176,8 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ */ static int /* O - 1 on success, 0 on failure */ -do_tests(const char *testfile, /* I - Test file to use */ - _ipp_vars_t *vars, /* I - Variables */ - _cups_testdata_t *data) /* I - Test data */ +do_tests(const char *testfile, /* I - Test file to use */ + ipptool_test_t *data) /* I - Test data */ { http_encryption_t encryption; /* Encryption mode */ @@ -1879,14 +2186,14 @@ do_tests(const char *testfile, /* I - Test file to use */ * Connect to the printer/server... */ - if (!_cups_strcasecmp(vars->scheme, "https") || !_cups_strcasecmp(vars->scheme, "ipps")) + if (!_cups_strcasecmp(data->vars->scheme, "https") || !_cups_strcasecmp(data->vars->scheme, "ipps") || data->vars->port == 443) encryption = HTTP_ENCRYPTION_ALWAYS; else encryption = data->encryption; - if ((data->http = httpConnect2(vars->host, vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL) + if ((data->http = httpConnect2(data->vars->host, data->vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL) { - print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", vars->host, vars->port, cupsLastErrorString()); + print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", data->vars->host, data->vars->port, cupsLastErrorString()); return (0); } @@ -1903,7 +2210,7 @@ do_tests(const char *testfile, /* I - Test file to use */ * Run tests... */ - _ippFileParse(vars, testfile, (void *)data); + _ippFileParse(data->vars, testfile, (void *)data); /* * Close connection and return... @@ -1922,7 +2229,7 @@ do_tests(const char *testfile, /* I - Test file to use */ static int /* O - 1 to continue, 0 to stop */ error_cb(_ipp_file_t *f, /* I - IPP file data */ - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ const char *error) /* I - Error message */ { (void)f; @@ -1939,13 +2246,18 @@ error_cb(_ipp_file_t *f, /* I - IPP file data */ static int /* O - 1 if matches, 0 otherwise */ expect_matches( - _cups_expect_t *expect, /* I - Expected attribute */ - ipp_tag_t value_tag) /* I - Value tag for attribute */ + ipptool_expect_t *expect, /* I - Expected attribute */ + ipp_attribute_t *attr) /* I - Attribute */ { - int match; /* Match? */ - char *of_type, /* Type name to match */ - *next, /* Next name to match */ - sep; /* Separator character */ + int i, /* Looping var */ + count, /* Number of values */ + match; /* Match? */ + char *of_type, /* Type name to match */ + *paren, /* Pointer to opening parenthesis */ + *next, /* Next name to match */ + sep; /* Separator character */ + ipp_tag_t value_tag; /* Syntax/value tag */ + int lower, upper; /* Lower and upper bounds for syntax */ /* @@ -1960,6 +2272,9 @@ expect_matches( * types separated by "," or "|"... */ + value_tag = ippGetValueTag(attr); + count = ippGetCount(attr); + for (of_type = expect->of_type, match = 0; !match && *of_type; of_type = next) { /* @@ -1975,19 +2290,154 @@ expect_matches( * Support some meta-types to make it easier to write the test file. */ + if ((paren = strchr(of_type, '(')) != NULL) + { + char *ptr; // Pointer into syntax string + + *paren = '\0'; + + if (!strncmp(paren + 1, "MIN:", 4)) + { + lower = INT_MIN; + ptr = paren + 5; + } + else if ((ptr = strchr(paren + 1, ':')) != NULL) + { + lower = atoi(paren + 1); + } + else + { + lower = 0; + ptr = paren + 1; + } + + if (!strcmp(ptr, "MAX)")) + upper = INT_MAX; + else + upper = atoi(ptr); + } + else + { + lower = INT_MIN; + upper = INT_MAX; + } + if (!strcmp(of_type, "text")) - match = value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_TEXT; + { + if (upper == INT_MAX) + upper = 1023; + + if (value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_TEXT) + { + for (i = 0; i < count; i ++) + { + if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper) + break; + } + + match = (i == count); + } + } else if (!strcmp(of_type, "name")) - match = value_tag == IPP_TAG_NAMELANG || value_tag == IPP_TAG_NAME; + { + if (upper == INT_MAX) + upper = 255; + + if (value_tag == IPP_TAG_NAMELANG || value_tag == IPP_TAG_NAME) + { + for (i = 0; i < count; i ++) + { + if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper) + break; + } + + match = (i == count); + } + } else if (!strcmp(of_type, "collection")) + { match = value_tag == IPP_TAG_BEGIN_COLLECTION; - else - match = value_tag == ippTagValue(of_type); + } + else if (value_tag == ippTagValue(of_type)) + { + switch (value_tag) + { + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + if (upper == INT_MAX) + { + if (value_tag == IPP_TAG_KEYWORD) + upper = 255; + else + upper = 1023; + } + + for (i = 0; i < count; i ++) + { + if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper) + break; + } + + match = (i == count); + break; + + case IPP_TAG_STRING : + if (upper == INT_MAX) + upper = 1023; + + for (i = 0; i < count; i ++) + { + int datalen; // Length of octetString value + + ippGetOctetString(attr, i, &datalen); + + if (datalen > upper) + break; + } + + match = (i == count); + break; + + case IPP_TAG_INTEGER : + for (i = 0; i < count; i ++) + { + int value = ippGetInteger(attr, i); + // Integer value + + if (value < lower || value > upper) + break; + } + + match = (i == count); + break; + + case IPP_TAG_RANGE : + for (i = 0; i < count; i ++) + { + int vupper, vlower = ippGetRange(attr, i, &vupper); + // Range value + + if (vlower < lower || vlower > upper || vupper < lower || vupper > upper) + break; + } + + match = (i == count); + break; + + default : + // No other constraints, so this is a match + match = 1; + break; + } + } /* - * Restore the separator if we have one... + * Restore the separators if we have them... */ + if (paren) + *paren = '('; + if (sep) *next++ = sep; } @@ -2047,6 +2497,21 @@ get_filename(const char *testfile, /* I - Current test file */ dstptr = dst; /* Should never happen */ strlcpy(dstptr, src, dstsize - (size_t)(dstptr - dst)); + +#if _WIN32 + if (_access(dst, 0)) + { + /* + * Not available relative to the testfile, see if it can be found on the + * desktop... + */ + const char *userprofile = getenv("USERPROFILE"); + /* User home directory */ + + if (userprofile) + snprintf(dst, dstsize, "%s/Desktop/%s", userprofile, src); + } +#endif /* _WIN32 */ } return (dst); @@ -2075,7 +2540,7 @@ get_string(ipp_attribute_t *attr, /* I - IPP attribute */ value = ippGetString(attr, element, NULL); - if (flags & _CUPS_WITH_HOSTNAME) + if (flags & IPPTOOL_WITH_HOSTNAME) { if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), buffer, (int)bufsize, &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) buffer[0] = '\0'; @@ -2086,14 +2551,14 @@ get_string(ipp_attribute_t *attr, /* I - IPP attribute */ return (buffer); } - else if (flags & _CUPS_WITH_RESOURCE) + else if (flags & IPPTOOL_WITH_RESOURCE) { if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, buffer, (int)bufsize) < HTTP_URI_STATUS_OK) buffer[0] = '\0'; return (buffer); } - else if (flags & _CUPS_WITH_SCHEME) + else if (flags & IPPTOOL_WITH_SCHEME) { if (httpSeparateURI(HTTP_URI_CODING_ALL, value, buffer, (int)bufsize, userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) buffer[0] = '\0'; @@ -2104,76 +2569,492 @@ get_string(ipp_attribute_t *attr, /* I - IPP attribute */ { http_uri_status_t status = httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)); - if (status < HTTP_URI_STATUS_OK) + if (status < HTTP_URI_STATUS_OK) + { + /* + * Bad URI... + */ + + buffer[0] = '\0'; + } + else + { + /* + * Normalize URI with no trailing dot... + */ + + if ((ptr = hostname + strlen(hostname) - 1) >= hostname && *ptr == '.') + *ptr = '\0'; + + httpAssembleURI(HTTP_URI_CODING_ALL, buffer, (int)bufsize, scheme, userpass, hostname, port, resource); + } + + return (buffer); + } + else + return (value); +} + + +/* + * 'init_data()' - Initialize test data. + */ + +static void +init_data(ipptool_test_t *data) /* I - Data */ +{ + memset(data, 0, sizeof(ipptool_test_t)); + + data->output = IPPTOOL_OUTPUT_LIST; + data->outfile = cupsFileStdout(); + data->family = AF_UNSPEC; + data->def_transfer = IPPTOOL_TRANSFER_AUTO; + data->def_version = 11; + data->errors = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); + data->pass = 1; + data->prev_pass = 1; + data->request_id = (CUPS_RAND() % 1000) * 137; + data->show_header = 1; +} + + +/* + * 'iso_date()' - Return an ISO 8601 date/time string for the given IPP dateTime + * value. + */ + +static char * /* O - ISO 8601 date/time string */ +iso_date(const ipp_uchar_t *date) /* I - IPP (RFC 1903) date/time value */ +{ + time_t utctime; /* UTC time since 1970 */ + struct tm utcdate; /* UTC date/time */ + static char buffer[255]; /* String buffer */ + + + utctime = ippDateToTime(date); + gmtime_r(&utctime, &utcdate); + + snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02dZ", + utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday, + utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec); + + return (buffer); +} + + +/* + * 'parse_monitor_printer_state()' - Parse the MONITOR-PRINTER-STATE directive. + * + * MONITOR-PRINTER-STATE [printer-uri] { + * DELAY nnn + * EXPECT attribute-name ... + * } + */ + +static int /* O - 1 to continue, 0 to stop */ +parse_monitor_printer_state( + _ipp_file_t *f, /* I - IPP file data */ + ipptool_test_t *data) /* I - Test data */ +{ + char token[256], /* Token string */ + name[1024], /* Name string */ + temp[1024], /* Temporary string */ + value[1024], /* Value string */ + *ptr; /* Pointer into value */ + + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing printer URI on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (strcmp(temp, "{")) + { + // Got a printer URI so copy it... + data->monitor_uri = strdup(temp); + + // Then see if we have an opening brace... + if (!_ippFileReadToken(f, temp, sizeof(temp)) || strcmp(temp, "{")) + { + print_fatal_error(data, "Missing opening brace on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else + { + // Use the default printer URI... + data->monitor_uri = strdup(data->vars->uri); + } + + // Loop until we get a closing brace... + while (_ippFileReadToken(f, token, sizeof(token))) + { + if (_cups_strcasecmp(token, "COUNT") && + _cups_strcasecmp(token, "DEFINE-MATCH") && + _cups_strcasecmp(token, "DEFINE-NO-MATCH") && + _cups_strcasecmp(token, "DEFINE-VALUE") && + _cups_strcasecmp(token, "IF-DEFINED") && + _cups_strcasecmp(token, "IF-NOT-DEFINED") && + _cups_strcasecmp(token, "IN-GROUP") && + _cups_strcasecmp(token, "OF-TYPE") && + _cups_strcasecmp(token, "WITH-DISTINCT-VALUES") && + _cups_strcasecmp(token, "WITH-VALUE")) + data->last_expect = NULL; + + if (!strcmp(token, "}")) + return (1); + else if (!_cups_strcasecmp(token, "EXPECT")) + { + /* + * Expected attributes... + */ + + if (data->num_monitor_expects >= (int)(sizeof(data->monitor_expects) / sizeof(data->monitor_expects[0]))) + { + print_fatal_error(data, "Too many EXPECT's on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (!_ippFileReadToken(f, name, sizeof(name))) + { + print_fatal_error(data, "Missing EXPECT name on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + data->last_expect = data->monitor_expects + data->num_monitor_expects; + data->num_monitor_expects ++; + + memset(data->last_expect, 0, sizeof(ipptool_expect_t)); + data->last_expect->repeat_limit = 1000; + + if (name[0] == '!') + { + data->last_expect->not_expect = 1; + data->last_expect->name = strdup(name + 1); + } + else if (name[0] == '?') + { + data->last_expect->optional = 1; + data->last_expect->name = strdup(name + 1); + } + else + data->last_expect->name = strdup(name); + } + else if (!_cups_strcasecmp(token, "COUNT")) + { + int count; /* Count value */ + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing COUNT number on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if ((count = atoi(temp)) <= 0) + { + print_fatal_error(data, "Bad COUNT \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->count = count; + } + else + { + print_fatal_error(data, "COUNT without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "DEFINE-MATCH")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DEFINE-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->define_match = strdup(temp); + } + else + { + print_fatal_error(data, "DEFINE-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "DEFINE-NO-MATCH")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DEFINE-NO-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->define_no_match = strdup(temp); + } + else + { + print_fatal_error(data, "DEFINE-NO-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "DEFINE-VALUE")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DEFINE-VALUE variable on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->define_value = strdup(temp); + } + else + { + print_fatal_error(data, "DEFINE-VALUE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "DELAY")) + { + /* + * Delay before operation... + */ + + double dval; /* Delay value */ + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DELAY value on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + _ippVarsExpand(data->vars, value, temp, sizeof(value)); + + if ((dval = _cupsStrScand(value, &ptr, localeconv())) < 0.0 || (*ptr && *ptr != ',')) + { + print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); + return (0); + } + + data->monitor_delay = (useconds_t)(1000000.0 * dval); + + if (*ptr == ',') + { + if ((dval = _cupsStrScand(ptr + 1, &ptr, localeconv())) <= 0.0 || *ptr) + { + print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); + return (0); + } + + data->monitor_interval = (useconds_t)(1000000.0 * dval); + } + else + data->monitor_interval = data->monitor_delay; + } + else if (!_cups_strcasecmp(token, "OF-TYPE")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing OF-TYPE value tag(s) on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->of_type = strdup(temp); + } + else + { + print_fatal_error(data, "OF-TYPE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "IN-GROUP")) + { + ipp_tag_t in_group; /* IN-GROUP value */ + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing IN-GROUP group tag on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if ((in_group = ippTagValue(temp)) == IPP_TAG_ZERO || in_group >= IPP_TAG_UNSUPPORTED_VALUE) + { + print_fatal_error(data, "Bad IN-GROUP group tag \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); + return (0); + } + else if (data->last_expect) + { + data->last_expect->in_group = in_group; + } + else + { + print_fatal_error(data, "IN-GROUP without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "IF-DEFINED")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing IF-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->if_defined = strdup(temp); + } + else + { + print_fatal_error(data, "IF-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "IF-NOT-DEFINED")) { - /* - * Bad URI... - */ + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing IF-NOT-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } - buffer[0] = '\0'; + if (data->last_expect) + { + data->last_expect->if_not_defined = strdup(temp); + } + else + { + print_fatal_error(data, "IF-NOT-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } } - else + else if (!_cups_strcasecmp(token, "WITH-DISTINCT-VALUES")) + { + if (data->last_expect) + { + data->last_expect->with_distinct = 1; + } + else + { + print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "WITH-VALUE")) { + off_t lastpos; /* Last file position */ + int lastline; /* Last line number */ + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing %s value on line %d of \"%s\".", token, f->linenum, f->filename); + return (0); + } + /* - * Normalize URI with no trailing dot... + * Read additional comma-delimited values - needed since legacy test files + * will have unquoted WITH-VALUE values with commas... */ - if ((ptr = hostname + strlen(hostname) - 1) >= hostname && *ptr == '.') - *ptr = '\0'; + ptr = temp + strlen(temp); - httpAssembleURI(HTTP_URI_CODING_ALL, buffer, (int)bufsize, scheme, userpass, hostname, port, resource); - } + for (;;) + { + lastpos = cupsFileTell(f->fp); + lastline = f->linenum; + ptr += strlen(ptr); - return (buffer); - } - else - return (value); -} + if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) + break; + if (!strcmp(ptr, ",")) + { + /* + * Append a value... + */ -/* - * 'init_data()' - Initialize test data. - */ + ptr += strlen(ptr); -static void -init_data(_cups_testdata_t *data) /* I - Data */ -{ - memset(data, 0, sizeof(_cups_testdata_t)); + if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) + break; + } + else + { + /* + * Not another value, stop here... + */ - data->output = _CUPS_OUTPUT_LIST; - data->outfile = cupsFileStdout(); - data->family = AF_UNSPEC; - data->def_transfer = _CUPS_TRANSFER_AUTO; - data->def_version = 11; - data->errors = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); - data->pass = 1; - data->prev_pass = 1; - data->request_id = (CUPS_RAND() % 1000) * 137 + 1; - data->show_header = 1; -} + cupsFileSeek(f->fp, lastpos); + f->linenum = lastline; + *ptr = '\0'; + break; + } + } + if (data->last_expect) + { + /* + * Expand any variables in the value and then save it. + */ -/* - * 'iso_date()' - Return an ISO 8601 date/time string for the given IPP dateTime - * value. - */ + _ippVarsExpand(data->vars, value, temp, sizeof(value)); -static char * /* O - ISO 8601 date/time string */ -iso_date(const ipp_uchar_t *date) /* I - IPP (RFC 1903) date/time value */ -{ - time_t utctime; /* UTC time since 1970 */ - struct tm utcdate; /* UTC date/time */ - static char buffer[255]; /* String buffer */ + ptr = value + strlen(value) - 1; + if (value[0] == '/' && ptr > value && *ptr == '/') + { + /* + * WITH-VALUE is a POSIX extended regular expression. + */ - utctime = ippDateToTime(date); - gmtime_r(&utctime, &utcdate); + data->last_expect->with_value = calloc(1, (size_t)(ptr - value)); + data->last_expect->with_flags |= IPPTOOL_WITH_REGEX; - snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02dZ", - utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday, - utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec); + if (data->last_expect->with_value) + memcpy(data->last_expect->with_value, value + 1, (size_t)(ptr - value - 1)); + } + else + { + /* + * WITH-VALUE is a literal value... + */ - return (buffer); + for (ptr = value; *ptr; ptr ++) + { + if (*ptr == '\\' && ptr[1]) + { + /* + * Remove \ from \foo... + */ + + _cups_strcpy(ptr, ptr + 1); + } + } + + data->last_expect->with_value = strdup(value); + data->last_expect->with_flags |= IPPTOOL_WITH_LITERAL; + } + } + else + { + print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); + return (0); + } + } + } + + print_fatal_error(data, "Missing closing brace on line %d of \"%s\".", f->linenum, f->filename); + + return (0); } @@ -2282,7 +3163,7 @@ pause_message(const char *message) /* I - Message */ static void print_attr(cups_file_t *outfile, /* I - Output file */ - _cups_output_t output, /* I - Output format */ + ipptool_output_t output, /* I - Output format */ ipp_attribute_t *attr, /* I - Attribute to print */ ipp_tag_t *group) /* IO - Current group */ { @@ -2291,7 +3172,7 @@ print_attr(cups_file_t *outfile, /* I - Output file */ ipp_attribute_t *colattr; /* Collection attribute */ - if (output == _CUPS_OUTPUT_PLIST) + if (output == IPPTOOL_OUTPUT_PLIST) { if (!ippGetName(attr) || (group && *group != ippGetGroupTag(attr))) { @@ -2417,7 +3298,7 @@ print_attr(cups_file_t *outfile, /* I - Output file */ { char buffer[131072]; /* Value buffer */ - if (output == _CUPS_OUTPUT_TEST) + if (output == IPPTOOL_OUTPUT_TEST) { if (!ippGetName(attr)) { @@ -2440,7 +3321,7 @@ print_attr(cups_file_t *outfile, /* I - Output file */ static void print_csv( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ ipp_t *ipp, /* I - Response message */ ipp_attribute_t *attr, /* I - First attribute for line */ int num_displayed, /* I - Number of attributes to display */ @@ -2530,7 +3411,7 @@ print_csv( static void print_fatal_error( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ const char *s, /* I - Printf-style format string */ ...) /* I - Additional arguments as needed */ { @@ -2550,7 +3431,7 @@ print_fatal_error( * Then output it... */ - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { print_xml_header(data); print_xml_trailer(data, 0, buffer); @@ -2566,7 +3447,7 @@ print_fatal_error( static void print_ippserver_attr( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ ipp_attribute_t *attr, /* I - Attribute to print */ int indent) /* I - Indentation level */ { @@ -2677,7 +3558,7 @@ print_ippserver_attr( static void print_ippserver_string( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ const char *s, /* I - String to print */ size_t len) /* I - Length of string */ { @@ -2701,7 +3582,7 @@ print_ippserver_string( static void print_line( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ ipp_t *ipp, /* I - Response message */ ipp_attribute_t *attr, /* I - First attribute for line */ int num_displayed, /* I - Number of attributes to display */ @@ -2787,7 +3668,7 @@ print_line( */ static void -print_xml_header(_cups_testdata_t *data)/* I - Test data */ +print_xml_header(ipptool_test_t *data)/* I - Test data */ { if (!data->xml_header) { @@ -2798,7 +3679,7 @@ print_xml_header(_cups_testdata_t *data)/* I - Test data */ cupsFilePuts(data->outfile, "ipptoolVersion\n"); cupsFilePuts(data->outfile, "" CUPS_SVERSION "\n"); cupsFilePuts(data->outfile, "Transfer\n"); - cupsFilePrintf(data->outfile, "%s\n", data->transfer == _CUPS_TRANSFER_AUTO ? "auto" : data->transfer == _CUPS_TRANSFER_CHUNKED ? "chunked" : "length"); + cupsFilePrintf(data->outfile, "%s\n", data->transfer == IPPTOOL_TRANSFER_AUTO ? "auto" : data->transfer == IPPTOOL_TRANSFER_CHUNKED ? "chunked" : "length"); cupsFilePuts(data->outfile, "Tests\n"); cupsFilePuts(data->outfile, "\n"); @@ -2907,7 +3788,7 @@ print_xml_string(cups_file_t *outfile, /* I - Test data */ static void print_xml_trailer( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ int success, /* I - 1 on success, 0 on failure */ const char *message) /* I - Error message or NULL */ { @@ -2989,10 +3870,10 @@ timeout_cb(http_t *http, /* I - Connection to server */ */ static int /* O - 1 to continue, 0 to stop */ -token_cb(_ipp_file_t *f, /* I - IPP file data */ - _ipp_vars_t *vars, /* I - IPP variables */ - _cups_testdata_t *data, /* I - Test data */ - const char *token) /* I - Current token */ +token_cb(_ipp_file_t *f, /* I - IPP file data */ + _ipp_vars_t *vars, /* I - IPP variables */ + ipptool_test_t *data, /* I - Test data */ + const char *token) /* I - Current token */ { char name[1024], /* Name string */ temp[1024], /* Temporary string */ @@ -3030,6 +3911,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ _cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") && _cups_strcasecmp(token, "WITH-ALL-RESOURCES") && _cups_strcasecmp(token, "WITH-ALL-SCHEMES") && + _cups_strcasecmp(token, "WITH-DISTINCT-VALUES") && _cups_strcasecmp(token, "WITH-HOSTNAME") && _cups_strcasecmp(token, "WITH-RESOURCE") && _cups_strcasecmp(token, "WITH-SCHEME") && @@ -3048,7 +3930,17 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ if (!strcmp(token, "}")) { - return (do_test(f, vars, data)); + return (do_test(f, data)); + } + else if (!strcmp(token, "MONITOR-PRINTER-STATE")) + { + if (data->monitor_uri) + { + print_fatal_error(data, "Extra MONITOR-PRINTER-STATE seen on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + return (parse_monitor_printer_state(f, data)); } else if (!strcmp(token, "COMPRESSION")) { @@ -3132,7 +4024,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ if (_ippFileReadToken(f, temp, sizeof(temp))) { - pause_message(temp); + strlcpy(data->pause, temp, sizeof(data->pause)); } else { @@ -3151,11 +4043,11 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ { if (isdigit(temp[0] & 255)) { - data->request_id = atoi(temp); + data->request_id = atoi(temp) - 1; } else if (!_cups_strcasecmp(temp, "random")) { - data->request_id = (CUPS_RAND() % 1000) * 137 + 1; + data->request_id = (CUPS_RAND() % 1000) * 137; } else { @@ -3270,15 +4162,15 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ { if (!strcmp(temp, "auto")) { - data->transfer = _CUPS_TRANSFER_AUTO; + data->transfer = IPPTOOL_TRANSFER_AUTO; } else if (!strcmp(temp, "chunked")) { - data->transfer = _CUPS_TRANSFER_CHUNKED; + data->transfer = IPPTOOL_TRANSFER_CHUNKED; } else if (!strcmp(temp, "length")) { - data->transfer = _CUPS_TRANSFER_LENGTH; + data->transfer = IPPTOOL_TRANSFER_LENGTH; } else { @@ -3509,7 +4401,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ data->last_expect = data->expects + data->num_expects; data->num_expects ++; - memset(data->last_expect, 0, sizeof(_cups_expect_t)); + memset(data->last_expect, 0, sizeof(ipptool_expect_t)); data->last_expect->repeat_limit = 1000; data->last_expect->expect_all = expect_all; @@ -3778,6 +4670,18 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ return (0); } } + else if (!_cups_strcasecmp(token, "WITH-DISTINCT-VALUES")) + { + if (data->last_expect) + { + data->last_expect->with_distinct = 1; + } + else + { + print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); + return (0); + } + } else if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") || !_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") || !_cups_strcasecmp(token, "WITH-ALL-RESOURCES") || @@ -3793,14 +4697,14 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ if (data->last_expect) { if (!_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") || !_cups_strcasecmp(token, "WITH-HOSTNAME")) - data->last_expect->with_flags = _CUPS_WITH_HOSTNAME; + data->last_expect->with_flags = IPPTOOL_WITH_HOSTNAME; else if (!_cups_strcasecmp(token, "WITH-ALL-RESOURCES") || !_cups_strcasecmp(token, "WITH-RESOURCE")) - data->last_expect->with_flags = _CUPS_WITH_RESOURCE; + data->last_expect->with_flags = IPPTOOL_WITH_RESOURCE; else if (!_cups_strcasecmp(token, "WITH-ALL-SCHEMES") || !_cups_strcasecmp(token, "WITH-SCHEME")) - data->last_expect->with_flags = _CUPS_WITH_SCHEME; + data->last_expect->with_flags = IPPTOOL_WITH_SCHEME; if (!_cups_strncasecmp(token, "WITH-ALL-", 9)) - data->last_expect->with_flags |= _CUPS_WITH_ALL; + data->last_expect->with_flags |= IPPTOOL_WITH_ALL; } if (!_ippFileReadToken(f, temp, sizeof(temp))) @@ -3866,7 +4770,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ */ data->last_expect->with_value = calloc(1, (size_t)(ptr - value)); - data->last_expect->with_flags |= _CUPS_WITH_REGEX; + data->last_expect->with_flags |= IPPTOOL_WITH_REGEX; if (data->last_expect->with_value) memcpy(data->last_expect->with_value, value + 1, (size_t)(ptr - value - 1)); @@ -3890,7 +4794,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } data->last_expect->with_value = strdup(value); - data->last_expect->with_flags |= _CUPS_WITH_LITERAL; + data->last_expect->with_flags |= IPPTOOL_WITH_LITERAL; } } else @@ -3916,7 +4820,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ _ippVarsExpand(vars, value, temp, sizeof(value)); data->last_expect->with_value_from = strdup(value); - data->last_expect->with_flags = _CUPS_WITH_LITERAL; + data->last_expect->with_flags = IPPTOOL_WITH_LITERAL; } else { @@ -3965,10 +4869,10 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ if (data->show_header) { - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) print_xml_header(data); - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) cupsFilePrintf(cupsFileStdout(), "\"%s\":\n", f->filename); data->show_header = 0; @@ -3984,8 +4888,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ if ((ptr = strrchr(data->name, '.')) != NULL) *ptr = '\0'; data->repeat_interval = 5000000; - data->request_id ++; - strlcpy(data->resource, vars->resource, sizeof(data->resource)); + strlcpy(data->resource, data->vars->resource, sizeof(data->resource)); data->skip_previous = 0; data->skip_test = 0; data->num_statuses = 0; @@ -3994,6 +4897,12 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ data->transfer = data->def_transfer; data->version = data->def_version; + free(data->monitor_uri); + data->monitor_uri = NULL; + data->monitor_delay = 0; + data->monitor_interval = 5000000; + data->num_monitor_expects = 0; + _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); f->attrs = ippNew(); @@ -4085,7 +4994,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ * Map the filename to and then run the tests... */ - _cups_testdata_t inc_data; /* Data for included file */ + ipptool_test_t inc_data; /* Data for included file */ char filename[1024]; /* Mapped filename */ memcpy(&inc_data, data, sizeof(inc_data)); @@ -4094,7 +5003,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ inc_data.prev_pass = 1; inc_data.show_header = 1; - if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error) + if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error) { data->pass = data->prev_pass = 0; return (0); @@ -4121,7 +5030,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ * Map the filename to and then run the tests... */ - _cups_testdata_t inc_data; /* Data for included file */ + ipptool_test_t inc_data; /* Data for included file */ char filename[1024]; /* Mapped filename */ memcpy(&inc_data, data, sizeof(inc_data)); @@ -4130,7 +5039,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ inc_data.prev_pass = 1; inc_data.show_header = 1; - if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error) + if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error) { data->pass = data->prev_pass = 0; return (0); @@ -4157,7 +5066,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ * Map the filename to and then run the tests... */ - _cups_testdata_t inc_data; /* Data for included file */ + ipptool_test_t inc_data; /* Data for included file */ char filename[1024]; /* Mapped filename */ memcpy(&inc_data, data, sizeof(inc_data)); @@ -4166,7 +5075,7 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ inc_data.prev_pass = 1; inc_data.show_header = 1; - if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error) + if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error) { data->pass = data->prev_pass = 0; return (0); @@ -4242,11 +5151,11 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ if (_ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "auto")) - data->def_transfer = _CUPS_TRANSFER_AUTO; + data->def_transfer = IPPTOOL_TRANSFER_AUTO; else if (!strcmp(temp, "chunked")) - data->def_transfer = _CUPS_TRANSFER_CHUNKED; + data->def_transfer = IPPTOOL_TRANSFER_CHUNKED; else if (!strcmp(temp, "length")) - data->def_transfer = _CUPS_TRANSFER_LENGTH; + data->def_transfer = IPPTOOL_TRANSFER_LENGTH; else { print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); @@ -4316,6 +5225,7 @@ usage(void) _cupsLangPuts(stderr, _("-I Ignore errors")); _cupsLangPuts(stderr, _("-L Send requests using content-length")); _cupsLangPuts(stderr, _("-P filename.plist Produce XML plist to a file and test report to standard output")); + _cupsLangPuts(stderr, _("-R Repeat tests on server-error-busy")); _cupsLangPuts(stderr, _("-S Test with encryption using HTTPS")); _cupsLangPuts(stderr, _("-T seconds Set the receive/send timeout in seconds")); _cupsLangPuts(stderr, _("-V version Set default IPP version")); @@ -4335,30 +5245,131 @@ usage(void) } +/* + * 'with_distinct_values()' - Verify that an attribute contains unique values. + */ + +static int // O - 1 if distinct, 0 if duplicate +with_distinct_values( + cups_array_t *errors, // I - Array of errors + ipp_attribute_t *attr) // I - Attribute to test +{ + int i, // Looping var + count; // Number of values + ipp_tag_t value_tag; // Value syntax + const char *value; // Current value + char buffer[8192]; // Temporary buffer + cups_array_t *values; // Array of values as strings + + + // If there is only 1 value, it must be distinct + if ((count = ippGetCount(attr)) == 1) + return (1); + + // Only check integers, enums, rangeOfInteger, resolution, and nul-terminated + // strings... + switch (value_tag = ippGetValueTag(attr)) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + case IPP_TAG_RANGE : + case IPP_TAG_RESOLUTION : + case IPP_TAG_KEYWORD : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + break; + + default : + add_stringf(errors, "WITH-DISTINCT-VALUES %s not supported for 1setOf %s", ippGetName(attr), ippTagString(value_tag)); + return (0); + } + + // Collect values and determine they are all unique... + values = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); + + for (i = 0; i < count; i ++) + { + switch (value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(attr, i)); + value = buffer; + break; + case IPP_TAG_RANGE : + { + int upper, lower = ippGetRange(attr, i, &upper); + // Range values + + snprintf(buffer, sizeof(buffer), "%d-%d", lower, upper); + value = buffer; + } + break; + case IPP_TAG_RESOLUTION : + { + ipp_res_t units; // Resolution units + int yres, xres = ippGetResolution(attr, i, &yres, &units); + // Resolution values + + if (xres == yres) + snprintf(buffer, sizeof(buffer), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + else + snprintf(buffer, sizeof(buffer), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + value = buffer; + } + break; + case IPP_TAG_KEYWORD : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + value = ippGetString(attr, i, NULL); + break; + default : // Should never happen + value = "unsupported"; + break; + } + + if (cupsArrayFind(values, (void *)value)) + add_stringf(errors, "DUPLICATE: %s=%s", ippGetName(attr), value); + else + cupsArrayAdd(values, (void *)value); + } + + // Cleanup... + i = cupsArrayCount(values) == count; + cupsArrayDelete(values); + + return (i); +} + + /* * 'with_flags_string()' - Return the "WITH-xxx" predicate that corresponds to - the flags. + * the flags. */ static const char * /* O - WITH-xxx string */ with_flags_string(int flags) /* I - WITH flags */ { - if (flags & _CUPS_WITH_ALL) + if (flags & IPPTOOL_WITH_ALL) { - if (flags & _CUPS_WITH_HOSTNAME) + if (flags & IPPTOOL_WITH_HOSTNAME) return ("WITH-ALL-HOSTNAMES"); - else if (flags & _CUPS_WITH_RESOURCE) + else if (flags & IPPTOOL_WITH_RESOURCE) return ("WITH-ALL-RESOURCES"); - else if (flags & _CUPS_WITH_SCHEME) + else if (flags & IPPTOOL_WITH_SCHEME) return ("WITH-ALL-SCHEMES"); else return ("WITH-ALL-VALUES"); } - else if (flags & _CUPS_WITH_HOSTNAME) + else if (flags & IPPTOOL_WITH_HOSTNAME) return ("WITH-HOSTNAME"); - else if (flags & _CUPS_WITH_RESOURCE) + else if (flags & IPPTOOL_WITH_RESOURCE) return ("WITH-RESOURCE"); - else if (flags & _CUPS_WITH_SCHEME) + else if (flags & IPPTOOL_WITH_SCHEME) return ("WITH-SCHEME"); else return ("WITH-VALUE"); @@ -4370,7 +5381,7 @@ with_flags_string(int flags) /* I - WITH flags */ */ static int /* O - 1 on match, 0 on non-match */ -with_value(_cups_testdata_t *data, /* I - Test data */ +with_value(ipptool_test_t *data, /* I - Test data */ cups_array_t *errors, /* I - Errors array */ char *value, /* I - Value string */ int flags, /* I - Flags for match */ @@ -4387,7 +5398,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */ *matchbuf = '\0'; - match = (flags & _CUPS_WITH_ALL) ? 1 : 0; + match = (flags & IPPTOOL_WITH_ALL) ? 1 : 0; /* * NULL matches everything. @@ -4450,7 +5461,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */ } } - if (flags & _CUPS_WITH_ALL) + if (flags & IPPTOOL_WITH_ALL) { if (!valmatch) { @@ -4517,7 +5528,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */ } } - if (flags & _CUPS_WITH_ALL) + if (flags & IPPTOOL_WITH_ALL) { if (!valmatch) { @@ -4552,13 +5563,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */ if (!matchbuf[0]) strlcpy(matchbuf, value, matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4589,13 +5600,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */ if (!matchbuf[0]) strlcpy(matchbuf, value, matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4635,7 +5646,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */ case IPP_TAG_TEXTLANG : case IPP_TAG_URI : case IPP_TAG_URISCHEME : - if (flags & _CUPS_WITH_REGEX) + if (flags & IPPTOOL_WITH_REGEX) { /* * Value is an extended, case-sensitive POSIX regular expression... @@ -4663,13 +5674,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */ if (!matchbuf[0]) strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4678,7 +5689,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */ regfree(&re); } - else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME | _CUPS_WITH_RESOURCE))) + else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME | IPPTOOL_WITH_RESOURCE))) { /* * Value is a literal URI string, see if the value(s) match... @@ -4691,13 +5702,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */ if (!matchbuf[0]) strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4721,7 +5732,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */ * Some URI components are case-sensitive, some not... */ - if (flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME)) + if (flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME)) result = _cups_strcasecmp(value, get_string(attr, i, flags, temp, sizeof(temp))); else result = strcmp(value, get_string(attr, i, flags, temp, sizeof(temp))); @@ -4756,13 +5767,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */ if (!matchbuf[0]) strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4778,7 +5789,7 @@ with_value(_cups_testdata_t *data, /* I - Test data */ break; case IPP_TAG_STRING : - if (flags & _CUPS_WITH_REGEX) + if (flags & IPPTOOL_WITH_REGEX) { /* * Value is an extended, case-sensitive POSIX regular expression... @@ -4815,13 +5826,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */ if (!matchbuf[0]) strlcpy(matchbuf, temp, matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4912,13 +5923,13 @@ with_value(_cups_testdata_t *data, /* I - Test data */ if (!matchbuf[0]) copy_hex_string(matchbuf, adata, adatalen, matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; diff --git a/tools/printer-lg-png.h b/tools/printer-lg-png.h new file mode 100644 index 000000000..a7d328dd9 --- /dev/null +++ b/tools/printer-lg-png.h @@ -0,0 +1,1850 @@ +static const unsigned char printer_lg_png[] = +{ + 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52, + 0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x08,0x06,0x00,0x00,0x00,0xf4,0x78,0xd4, + 0xfa,0x00,0x00,0x04,0x19,0x69,0x43,0x43,0x50,0x6b,0x43,0x47,0x43,0x6f,0x6c,0x6f, + 0x72,0x53,0x70,0x61,0x63,0x65,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x52,0x47,0x42, + 0x00,0x00,0x38,0x8d,0x8d,0x55,0x5d,0x68,0x1c,0x55,0x14,0x3e,0xbb,0x73,0x67,0x23, + 0x24,0xce,0x53,0x6c,0x34,0x85,0x74,0xa8,0x3f,0x0d,0x25,0x0d,0x93,0x56,0x34,0xa1, + 0xb4,0xba,0x7f,0xdd,0xdd,0x36,0x6e,0x96,0x49,0x36,0xda,0x22,0xe8,0x64,0xf6,0xee, + 0xce,0x98,0xc9,0xce,0x38,0x33,0xbb,0xfd,0xa1,0x4f,0x45,0x50,0x7c,0x31,0xea,0x9b, + 0x14,0xc4,0xbf,0xb7,0x80,0x20,0x28,0xf5,0x0f,0xdb,0x3e,0xb4,0x2f,0x95,0x0a,0x25, + 0xda,0xd4,0x20,0x28,0x3e,0xb4,0xf8,0x83,0x50,0xe8,0x8b,0xa6,0xeb,0x99,0x3b,0x33, + 0x99,0x69,0xba,0xb1,0xde,0x65,0xee,0x7c,0xf3,0x9d,0xef,0x9e,0x7b,0xee,0xb9,0x67, + 0xef,0x05,0xe8,0xb9,0xaa,0x58,0x96,0x91,0x14,0x01,0x16,0x9a,0xae,0x2d,0x17,0x32, + 0xe2,0x73,0x87,0x8f,0x88,0x3d,0x2b,0x90,0x84,0x87,0xa0,0x17,0x06,0xa1,0x57,0x51, + 0x1d,0x2b,0x5d,0xa9,0x4c,0x02,0x36,0x4f,0x0b,0x77,0xb5,0x5b,0xdf,0x43,0xc2,0x7b, + 0x5f,0xd9,0xd5,0xdd,0xfe,0x9f,0xad,0xb7,0x46,0x1d,0x15,0x20,0x71,0x1f,0x62,0xb3, + 0xe6,0xa8,0x0b,0x88,0x8f,0x01,0xf0,0xa7,0x55,0xcb,0x76,0x01,0x7a,0xfa,0x91,0x1f, + 0x3f,0xea,0x5a,0x1e,0xf6,0x62,0xe8,0xb7,0x31,0x40,0xc4,0x2f,0x7a,0xb8,0xe1,0x63, + 0xd7,0xc3,0x73,0x3e,0x7e,0x8d,0x69,0x66,0xe4,0x2c,0xe2,0xd3,0x88,0x05,0x55,0x53, + 0x6a,0x88,0x97,0x10,0x8f,0xcc,0xc5,0xf8,0x46,0x0c,0xfb,0x31,0xb0,0xd6,0x5f,0xa0, + 0x4d,0x6a,0xeb,0xaa,0xe8,0xe5,0xa2,0x62,0x9b,0x75,0xdd,0xa0,0xb1,0x70,0xef,0x61, + 0xfe,0x9f,0x6d,0xc1,0x68,0x85,0xf3,0x6d,0xc3,0xa7,0xcf,0x99,0x9f,0x3e,0x84,0xef, + 0x61,0x5c,0xfb,0x2b,0x35,0x25,0xe7,0xe1,0x51,0xc4,0x4b,0xaa,0x92,0x9f,0x46,0xfc, + 0x08,0xe2,0x6b,0x6d,0x7d,0xb6,0x1c,0xe0,0xdb,0x96,0x9b,0x91,0x11,0x3f,0x06,0x90, + 0xdc,0xde,0x9a,0xaf,0xa6,0x11,0xef,0x44,0x5c,0xac,0xdb,0x07,0xaa,0xbe,0x9f,0xa4, + 0xad,0xb5,0x8a,0x21,0x7e,0xe7,0x84,0x36,0xf3,0x2c,0xe2,0x2d,0x88,0xcf,0x37,0xe7, + 0xca,0x53,0xc1,0xd8,0xab,0xaa,0x93,0xc5,0x9c,0xc1,0x76,0xc4,0xb7,0x35,0x5a,0xf2, + 0xf2,0x3b,0x04,0xc0,0x89,0xba,0x5b,0x9a,0xf1,0xc7,0x72,0xfb,0x6d,0x53,0x9e,0xf2, + 0xe7,0xe5,0xea,0x35,0x9a,0xcb,0x7b,0x79,0x44,0xfc,0xfa,0xbc,0x79,0x48,0xf6,0x7d, + 0x72,0x9f,0x39,0xed,0xe9,0x7c,0xe8,0xf3,0x84,0x96,0x2d,0x07,0xfc,0xa5,0x97,0x94, + 0x83,0x15,0xc4,0x83,0x88,0x7f,0xa1,0x46,0x41,0xf6,0xe7,0xe2,0xfe,0xb1,0xdc,0x4a, + 0x10,0x03,0x19,0x6a,0x1a,0xe5,0x49,0x7f,0x2e,0x92,0xa3,0x0e,0x5b,0x2f,0xe3,0x5d, + 0x6d,0xa6,0xe8,0xcf,0x4b,0x0c,0x17,0x37,0xd4,0x1f,0x4b,0x16,0xeb,0xfa,0x81,0x52, + 0xa0,0xff,0x44,0xb3,0x8b,0x72,0x80,0xaf,0x59,0x06,0xab,0x51,0x8c,0x8d,0x4f,0xda, + 0x2d,0xb9,0xea,0xeb,0xf9,0x51,0xc5,0xce,0x17,0x7c,0x9f,0x7c,0x85,0x36,0xab,0x81, + 0x7f,0xbe,0x0d,0xb3,0x09,0x05,0x28,0x98,0x30,0x87,0xbd,0x0a,0x4d,0x58,0x03,0x11, + 0x64,0x28,0x40,0x06,0xdf,0x16,0xd8,0x68,0xa9,0x83,0x0e,0x06,0x32,0x14,0xad,0x14, + 0x19,0x8a,0x5f,0xa1,0x66,0x17,0x1b,0xe7,0xc0,0x3c,0xf2,0x3a,0xb4,0x99,0xcd,0xc1, + 0xbe,0xc2,0x94,0xfe,0xc8,0xc8,0x5f,0x83,0xf9,0xb8,0xce,0xb4,0x2a,0x64,0x87,0x3e, + 0x82,0x16,0xb2,0x1a,0xfc,0x8e,0xac,0x16,0xd3,0x65,0xf1,0xab,0x85,0x5c,0x63,0x13, + 0x3f,0x7e,0x2c,0x37,0x02,0x3f,0x26,0x19,0x20,0x12,0xd9,0x83,0xcf,0x5e,0x32,0x49, + 0xf6,0x91,0x71,0x32,0x01,0x22,0x79,0x8a,0x3c,0x4d,0xf6,0x93,0x1c,0xb2,0x13,0x64, + 0xef,0xfa,0xd8,0x4a,0x6c,0x45,0x5e,0x3c,0x37,0xd6,0xfd,0xbc,0x8c,0x33,0x52,0xa6, + 0x9b,0x45,0xdd,0x39,0xb4,0xbb,0xa0,0x60,0xff,0x33,0x2a,0x4c,0x5c,0x53,0xd7,0xac, + 0x2c,0x0e,0xb6,0x86,0x23,0xcb,0x29,0xfb,0x05,0x5d,0xbd,0xfc,0xc6,0x5f,0xb1,0x5c, + 0xe9,0x2c,0x37,0x51,0xb6,0xe2,0x19,0x9d,0xba,0x57,0xce,0xf9,0x5f,0xf9,0xeb,0xfc, + 0x32,0xf6,0x2b,0xfc,0x6a,0xa4,0xe0,0x7f,0xe4,0x57,0xf1,0xb7,0x72,0xc7,0x5a,0xcc, + 0xbb,0xb2,0x4c,0xc3,0xec,0x6c,0x58,0x73,0x77,0x55,0x1a,0x6d,0x06,0xe3,0x16,0xf0, + 0xd1,0x99,0xc5,0x89,0xc5,0x1d,0xf3,0x71,0xf1,0xe4,0x57,0x0f,0x46,0x7e,0x96,0xc9, + 0x99,0xe7,0xaf,0xf4,0x5d,0x3c,0x59,0x6f,0x2e,0x0e,0x46,0xac,0x97,0x05,0xfa,0x6a, + 0xf9,0x56,0x19,0x4e,0x8d,0x44,0xac,0xf4,0x83,0xf4,0x87,0xb4,0x2c,0xbd,0x27,0x7d, + 0x28,0xfd,0xc6,0xbd,0xcd,0x7d,0xca,0x7d,0xcd,0x7d,0xce,0x7d,0xc1,0x5d,0x02,0x91, + 0x3b,0xcb,0x9d,0xe3,0xbe,0xe1,0x2e,0x70,0x1f,0x73,0x5f,0xc6,0xf6,0x6a,0xf3,0x1a, + 0x5a,0xdf,0x7b,0x16,0x79,0x18,0xb7,0x67,0xe9,0x96,0x6b,0xac,0x4a,0x21,0x23,0x6c, + 0x15,0x1e,0x16,0x72,0xc2,0x36,0xe1,0x51,0x61,0x32,0xf2,0x27,0x0c,0x08,0x63,0x42, + 0x51,0xd8,0x81,0x96,0xad,0xeb,0xfb,0x16,0x9f,0x2f,0x9e,0x3d,0x1d,0x0e,0x63,0x1f, + 0xe6,0xa7,0xfb,0x5c,0xbe,0x2e,0x56,0x01,0x89,0xfb,0xb1,0x02,0xf4,0x4d,0xfe,0x55, + 0x55,0x54,0xe9,0x70,0x94,0x29,0x1d,0x56,0x6f,0x4d,0x38,0xbe,0x41,0x13,0x8c,0x24, + 0x43,0x64,0x8c,0x94,0x36,0x54,0xf7,0xb8,0x57,0xf3,0xa1,0x22,0x95,0x4f,0xe5,0x52, + 0x69,0x10,0x53,0x3b,0x53,0x13,0xa9,0xb1,0xd4,0x41,0x0f,0x87,0xb3,0xa6,0x76,0xa0, + 0x6d,0x02,0xfb,0xfc,0x1d,0xd5,0xa9,0x6e,0xb2,0x52,0xea,0xd2,0x63,0xde,0x7d,0x02, + 0x59,0xd3,0x3a,0x6e,0xeb,0x0d,0xcd,0x15,0x77,0x4b,0xd2,0x93,0x62,0x1a,0xaf,0x36, + 0x2a,0x96,0x9a,0xea,0xe8,0x88,0xa8,0x18,0x86,0xc8,0x4c,0x8e,0x68,0x53,0x87,0xda, + 0x6d,0x5a,0x1b,0x05,0xef,0xde,0xf4,0x8f,0xf4,0x9b,0x32,0xbb,0x0f,0x13,0x5b,0x2e, + 0x47,0x9c,0xfb,0x0c,0xc0,0xbe,0x3f,0xf1,0xec,0xfb,0x2e,0xe2,0x8e,0xb4,0x00,0x96, + 0x1c,0x80,0x81,0xc7,0x23,0x6e,0x18,0xcf,0xca,0x07,0xde,0x05,0x38,0xf3,0x84,0xda, + 0xb2,0xdb,0xc1,0x1d,0x91,0x48,0x7c,0x0b,0xe0,0xd4,0xf7,0xec,0xf6,0xbf,0xfa,0x32, + 0x78,0x7e,0xfd,0xd4,0xe9,0xdc,0xc4,0x73,0xac,0xe7,0x2d,0x80,0xb5,0x37,0x3b,0x9d, + 0xbf,0xdf,0xef,0x74,0xd6,0x3e,0x40,0xff,0xab,0x00,0x67,0x8d,0x7f,0x01,0xa0,0x9f, + 0x7c,0x55,0x03,0x5c,0x0b,0xef,0x00,0x00,0x00,0x38,0x65,0x58,0x49,0x66,0x4d,0x4d, + 0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x01,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01, + 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x02,0x00,0x04,0x00,0x00, + 0x00,0x01,0x00,0x00,0x02,0x00,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00, + 0x02,0x00,0x00,0x00,0x00,0x00,0x28,0x30,0x97,0xbf,0x00,0x00,0x03,0x62,0x69,0x54, + 0x58,0x74,0x58,0x4d,0x4c,0x3a,0x63,0x6f,0x6d,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e, + 0x78,0x6d,0x70,0x00,0x00,0x00,0x00,0x00,0x3c,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65, + 0x74,0x61,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x78,0x3d,0x22,0x61,0x64,0x6f,0x62, + 0x65,0x3a,0x6e,0x73,0x3a,0x6d,0x65,0x74,0x61,0x2f,0x22,0x20,0x78,0x3a,0x78,0x6d, + 0x70,0x74,0x6b,0x3d,0x22,0x58,0x4d,0x50,0x20,0x43,0x6f,0x72,0x65,0x20,0x35,0x2e, + 0x34,0x2e,0x30,0x22,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x52,0x44, + 0x46,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x72,0x64,0x66,0x3d,0x22,0x68,0x74,0x74, + 0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31, + 0x39,0x39,0x39,0x2f,0x30,0x32,0x2f,0x32,0x32,0x2d,0x72,0x64,0x66,0x2d,0x73,0x79, + 0x6e,0x74,0x61,0x78,0x2d,0x6e,0x73,0x23,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x3c,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f, + 0x6e,0x20,0x72,0x64,0x66,0x3a,0x61,0x62,0x6f,0x75,0x74,0x3d,0x22,0x22,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73, + 0x3a,0x64,0x63,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,0x75,0x72,0x6c, + 0x2e,0x6f,0x72,0x67,0x2f,0x64,0x63,0x2f,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73, + 0x2f,0x31,0x2e,0x31,0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x49,0x70,0x74,0x63,0x34,0x78,0x6d, + 0x70,0x45,0x78,0x74,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x69,0x70,0x74, + 0x63,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x74,0x64,0x2f,0x49,0x70,0x74,0x63,0x34,0x78, + 0x6d,0x70,0x45,0x78,0x74,0x2f,0x32,0x30,0x30,0x38,0x2d,0x30,0x32,0x2d,0x32,0x39, + 0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78, + 0x6d,0x6c,0x6e,0x73,0x3a,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3d,0x22, + 0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6e,0x73,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e, + 0x63,0x6f,0x6d,0x2f,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x2f,0x31,0x2e, + 0x30,0x2f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64, + 0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x53,0x65,0x71,0x3e, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x4d,0x69,0x63,0x68,0x61,0x65,0x6c,0x20, + 0x53,0x77,0x65,0x65,0x74,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66, + 0x3a,0x53,0x65,0x71,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, + 0x2f,0x64,0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,0x74,0x73, + 0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72, + 0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x20,0x78, + 0x6d,0x6c,0x3a,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x78,0x2d,0x64,0x65,0x66,0x61,0x75, + 0x6c,0x74,0x22,0x3e,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30, + 0x31,0x30,0x20,0x41,0x70,0x70,0x6c,0x65,0x20,0x49,0x6e,0x63,0x2e,0x3c,0x2f,0x72, + 0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x63,0x3a,0x72,0x69,0x67,0x68, + 0x74,0x73,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x70, + 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69, + 0x6e,0x65,0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x49,0x70, + 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69, + 0x6e,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x68, + 0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65, + 0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x70,0x68,0x6f,0x74, + 0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,0x3e,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63, + 0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64, + 0x66,0x3a,0x52,0x44,0x46,0x3e,0x0a,0x3c,0x2f,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65, + 0x74,0x61,0x3e,0x0a,0xa0,0x50,0x98,0x64,0x00,0x00,0x6b,0x41,0x49,0x44,0x41,0x54, + 0x78,0xda,0xed,0x9d,0x07,0xfc,0x1c,0x55,0xb9,0xb0,0x4f,0x7a,0xef,0x40,0x0a,0x49, + 0x20,0x10,0x9a,0x54,0xe9,0x46,0x7a,0x13,0x14,0x2e,0x52,0x42,0x53,0x54,0x04,0x2f, + 0x28,0x02,0xf7,0x7e,0x82,0x15,0x51,0x51,0x11,0x14,0x6c,0x28,0xc2,0xfd,0x79,0x51, + 0x41,0x41,0xa4,0x37,0xf9,0x40,0x3a,0x48,0x07,0x29,0x86,0x96,0x90,0x00,0x09,0x24, + 0x90,0x46,0x7a,0xcf,0x7e,0xe7,0x1d,0x32,0xff,0x6f,0x72,0x72,0xce,0x9c,0x33,0xbb, + 0x33,0xbb,0xb3,0xbb,0xcf,0x93,0xdf,0xc9,0xee,0x7f,0x77,0x76,0x66,0xce,0xb4,0xb7, + 0x9c,0xf7,0x7d,0x4f,0x27,0x55,0x52,0x2a,0x95,0x4a,0x1f,0xfd,0xb2,0xad,0x6e,0xdb, + 0xe9,0x36,0x56,0xb7,0x31,0xba,0x8d,0xd4,0x6d,0x3d,0xdd,0x06,0xeb,0xd6,0x4b,0xb7, + 0xee,0xba,0x75,0x51,0x00,0x00,0x00,0xf5,0x67,0x95,0x6e,0xcb,0x75,0x5b,0xa2,0xdb, + 0x1c,0xdd,0x66,0xe9,0x36,0x4d,0xb7,0x29,0xba,0x4d,0xd2,0xed,0x45,0xdd,0x5e,0xea, + 0xd4,0xa9,0xd3,0xa2,0x32,0xee,0x7c,0xa7,0x12,0x09,0xfc,0x7e,0xfa,0x65,0x7f,0xdd, + 0x0e,0xd0,0x6d,0x8f,0x35,0xc2,0xbf,0x33,0xd7,0x17,0x00,0x00,0x34,0x31,0xab,0x45, + 0x09,0xd0,0xed,0x51,0xdd,0xee,0xd5,0xed,0x3e,0xad,0x10,0x2c,0x68,0x7b,0x05,0x40, + 0x0b,0xfd,0x41,0xfa,0xe5,0x08,0xdd,0x8e,0xd5,0x6d,0x5f,0xdd,0xba,0x71,0xad,0x00, + 0x00,0x40,0x0b,0xb3,0x42,0xb7,0x07,0x74,0xbb,0x4e,0xb7,0x9b,0xb5,0x32,0x30,0xb7, + 0xad,0x14,0x00,0x2d,0xf8,0xf7,0xd4,0x2f,0xa7,0xea,0x76,0xb4,0x6e,0x3d,0xb8,0x1e, + 0x00,0x00,0xa0,0x0d,0x59,0xaa,0xdb,0x8d,0xba,0x5d,0xa1,0x15,0x81,0x47,0x5a,0x56, + 0x01,0xd0,0x42,0x5f,0xdc,0xf9,0xe3,0x75,0x3b,0x5b,0xb7,0x9d,0x39,0xef,0x00,0x00, + 0x00,0x1d,0x3c,0xa3,0xdb,0xc5,0xba,0x5d,0xaf,0x95,0x81,0xd5,0x2d,0xa3,0x00,0x68, + 0xe1,0x7f,0xa4,0x7e,0x39,0x5f,0xb7,0xad,0x39,0xc7,0x00,0x00,0x00,0x4e,0x26,0xe8, + 0x76,0x9e,0x56,0x02,0x6e,0x6a,0x6a,0x05,0x40,0x0b,0xfe,0x2d,0xf5,0xcb,0x65,0xea, + 0xc3,0xf1,0x7d,0x00,0x00,0x00,0x08,0x43,0xe2,0x04,0xbe,0xa2,0x15,0x81,0x57,0x8b, + 0xda,0x40,0x21,0x51,0xf6,0x5a,0xf0,0xf7,0xd6,0xed,0x02,0xfd,0xf6,0x05,0x84,0x3f, + 0x00,0x00,0x40,0x66,0x44,0x76,0xbe,0x20,0xb2,0x54,0x64,0x6a,0x53,0x78,0x00,0xf4, + 0x8e,0xee,0xae,0x5f,0xae,0x51,0x1f,0xe6,0xed,0x03,0x00,0x00,0x40,0x6d,0x48,0x5d, + 0x81,0x13,0xb4,0x37,0xe0,0x89,0xd2,0x7a,0x00,0xb4,0xf0,0xff,0x9a,0x7e,0x79,0x18, + 0xe1,0x0f,0x00,0x00,0x90,0x1b,0x22,0x53,0x1f,0x5e,0x23,0x63,0xcb,0xe5,0x01,0xd0, + 0x3b,0x25,0x95,0xf9,0xfe,0xa8,0xdb,0x61,0x9c,0x27,0x00,0x00,0x80,0xc2,0xb8,0x5d, + 0xb7,0x2f,0x68,0x6f,0xc0,0x9c,0x86,0x2b,0x00,0x5a,0xf8,0x8b,0x66,0x72,0x8f,0xfa, + 0xb0,0x5c,0x2f,0x00,0x00,0x00,0x14,0x8b,0x94,0x19,0x3e,0x48,0x2b,0x01,0x53,0x6a, + 0x59,0x49,0x4d,0x43,0x00,0x5a,0xf8,0x6f,0xaf,0x5f,0x1e,0x43,0xf8,0x03,0x00,0x00, + 0xd4,0x0d,0x91,0xb9,0x8f,0xad,0x91,0xc1,0xf5,0x57,0x00,0xf4,0x86,0xf7,0xd6,0x2f, + 0x0f,0xe9,0x36,0x8c,0x73,0x01,0x00,0x00,0x50,0x57,0x44,0xf6,0x3e,0xb4,0x46,0x16, + 0x57,0x45,0x55,0x43,0x00,0x6b,0x36,0xf8,0x7f,0x75,0xeb,0xc9,0x39,0x00,0x00,0x00, + 0x68,0x18,0x52,0x4e,0xf8,0x60,0x3d,0x1c,0xf0,0x50,0xe1,0x0a,0xc0,0x1a,0x97,0x83, + 0x6c,0x68,0x00,0xc7,0x1d,0x00,0x00,0xa0,0xe1,0xcc,0xd3,0x6d,0x6f,0xad,0x04,0xbc, + 0x50,0x98,0x02,0xb0,0x26,0xe0,0x4f,0xc6,0xfc,0x71,0xfb,0x03,0x00,0x00,0x94,0x87, + 0x19,0xba,0x8d,0xcb,0x12,0x18,0x18,0xac,0x00,0xac,0x49,0xf5,0x7b,0x52,0x11,0xf0, + 0x07,0x00,0x00,0x50,0x46,0x24,0x3b,0x60,0xb7,0xd0,0x14,0xc1,0x2c,0x41,0x80,0x7f, + 0x44,0xf8,0x03,0x00,0x00,0x94,0x96,0xb1,0x6b,0x64,0x75,0x10,0x41,0x0a,0xc0,0x9a, + 0xea,0x43,0x14,0xf9,0x01,0x00,0x00,0x28,0x37,0x87,0x85,0x56,0x0c,0xf4,0x0e,0x01, + 0xac,0xa9,0xed,0x2f,0xe5,0x7d,0xbb,0x71,0x5c,0x01,0x00,0x00,0x4a,0xcf,0x0a,0xdd, + 0xf6,0xf2,0xcd,0x1d,0xd0,0xc9,0x23,0xfc,0x65,0x06,0xa2,0x7f,0x2b,0x6a,0xfb,0x03, + 0x00,0x00,0x34,0x13,0x12,0x0c,0xb8,0x8d,0x56,0x02,0x16,0xbb,0x16,0xf0,0x0d,0x01, + 0x9c,0x8b,0xf0,0x07,0x00,0x00,0x68,0x3a,0xc6,0xac,0x91,0xe1,0xd9,0x3d,0x00,0xda, + 0xfa,0xdf,0x52,0xbf,0x48,0x4e,0x61,0x77,0x8e,0x23,0x00,0x00,0x40,0xd3,0xb1,0x5c, + 0xb7,0xed,0xb5,0x17,0xe0,0xd5,0xac,0x0a,0xc0,0xfd,0xfa,0x65,0xdf,0x5a,0xb7,0xbe, + 0x72,0xe5,0x4a,0x35,0x77,0xee,0xdc,0xd4,0x65,0xba,0x75,0xeb,0xa6,0x06,0x0e,0x1c, + 0xc8,0xa9,0x02,0x00,0x00,0xc8,0x97,0x07,0xb4,0x02,0xb0,0x5f,0xb0,0x02,0xa0,0x85, + 0xff,0x51,0xfa,0xe5,0x86,0x3c,0xb6,0x7c,0xe9,0xa5,0x97,0xaa,0x33,0xcf,0x3c,0x33, + 0x75,0x99,0xee,0xdd,0xbb,0xab,0x65,0xcb,0x96,0x71,0x9a,0x00,0x00,0x00,0xf2,0xe7, + 0x68,0xad,0x04,0xdc,0x68,0x7e,0xd8,0xd9,0x22,0xfc,0xe5,0xb3,0x1f,0xe4,0xb5,0xd5, + 0xe5,0xcb,0x97,0xe7,0xb2,0x0c,0x00,0x00,0x00,0x54,0xc5,0x0f,0xd6,0xc8,0xf6,0x74, + 0x05,0x40,0x33,0x5e,0xb7,0xad,0x39,0x5e,0x00,0x00,0x00,0x2d,0xc1,0xd6,0x6b,0x64, + 0xbb,0x57,0x01,0x38,0x9b,0x63,0x05,0x00,0x00,0xd0,0x52,0x9c,0x9d,0xaa,0x00,0x68, + 0x17,0xc1,0x9e,0xfa,0x65,0x67,0x8e,0x13,0x00,0x00,0x40,0x4b,0xb1,0xf3,0x1a,0x19, + 0xef,0xf4,0x00,0x9c,0xca,0x31,0x02,0x00,0x00,0x68,0x49,0x4e,0xb5,0x2a,0x00,0x5a, + 0x33,0x18,0xa4,0x5f,0x8e,0xe2,0xf8,0x00,0x00,0x00,0xb4,0x24,0x47,0xad,0x91,0xf5, + 0xeb,0x78,0x00,0x8e,0xd0,0xad,0x27,0xc7,0x07,0x00,0x00,0xa0,0x25,0xe9,0xb9,0x46, + 0xd6,0xaf,0xa3,0x00,0x1c,0xcb,0xb1,0x01,0x00,0x00,0x68,0x69,0x3a,0x64,0x7d,0x57, + 0xf9,0x4f,0xbb,0x04,0xfa,0xa9,0x1c,0xaa,0xfe,0xd9,0x18,0x3f,0x7e,0xbc,0xda,0x60, + 0x83,0x0d,0x52,0x97,0xe9,0xdb,0xb7,0x2f,0xa7,0x04,0x00,0x00,0xa0,0x78,0xf6,0x15, + 0x99,0xaf,0x0b,0x03,0x2d,0xe8,0xb4,0x46,0x01,0x10,0x97,0xc0,0x4d,0x1c,0x17,0x00, + 0x00,0x80,0x96,0xe7,0x08,0xad,0x00,0xdc,0x12,0x0f,0x01,0xec,0xcf,0xf1,0x00,0x00, + 0x00,0x68,0x0b,0x0e,0x90,0xff,0x62,0x05,0x60,0x0f,0x8e,0x07,0x00,0x00,0x40,0x5b, + 0x10,0xc9,0xfc,0x4e,0xda,0xfd,0x2f,0x03,0xf0,0xf3,0x94,0xbd,0x2a,0x20,0x00,0x00, + 0x00,0xb4,0x16,0xab,0x75,0xeb,0x2f,0x42,0x7f,0x1b,0x84,0x3f,0x00,0x00,0x40,0xdb, + 0x20,0x32,0x7f,0x5b,0xf9,0x6f,0x3b,0x8e,0x05,0x00,0x00,0x40,0x5b,0xb1,0x9d,0xa4, + 0x01,0x8e,0xe5,0x38,0xb8,0x99,0x37,0x6f,0x9e,0x7a,0xf3,0xcd,0x37,0xa3,0xf6,0xd6, + 0x5b,0x6f,0xa9,0xd5,0xab,0x57,0xab,0xa1,0x43,0x87,0xaa,0xe1,0xc3,0x87,0xab,0x61, + 0xc3,0x86,0xa9,0x51,0xa3,0x46,0xa9,0x3e,0x7d,0xfa,0xd0,0xcf,0x12,0xb0,0x68,0xd1, + 0x22,0x35,0x75,0xea,0x54,0x35,0x7d,0xfa,0x74,0xf5,0xee,0xbb,0xef,0x46,0xaf,0x0b, + 0x17,0x2e,0x54,0x43,0x86,0x0c,0x89,0xfa,0x20,0x6d,0xc4,0x88,0x11,0x6a,0x93,0x4d, + 0x36,0x51,0x3a,0x02,0x96,0x8b,0x9b,0x73,0x01,0xd0,0xce,0x8c,0x15,0x05,0x60,0x4c, + 0x91,0x5b,0x98,0x32,0x65,0x8a,0x7a,0xe0,0x81,0x07,0x52,0x97,0x11,0xc1,0x72,0xec, + 0xb1,0xc7,0x96,0x62,0x3b,0x2b,0x57,0xae,0x54,0x37,0xde,0x78,0xa3,0xfa,0xdd,0xef, + 0x7e,0xa7,0x5e,0x78,0xe1,0x05,0xf5,0xc1,0x07,0x1f,0xa4,0x2e,0xdf,0xb5,0x6b,0x57, + 0xb5,0xef,0xbe,0xfb,0xaa,0xa3,0x8e,0x3a,0x4a,0x1d,0x71,0xc4,0x11,0xde,0x9a,0x07, + 0x65,0x39,0x9e,0x65,0xef,0x67,0x28,0xb3,0x67,0xcf,0x56,0xb7,0xde,0x7a,0xab,0xba, + 0xfe,0xfa,0xeb,0xd5,0x7d,0xf7,0xdd,0xa7,0x56,0xac,0x58,0xe1,0xfd,0x8d,0x28,0x33, + 0xd2,0x87,0x23,0x8f,0x3c,0x52,0xed,0xb1,0xc7,0x1e,0xaa,0x4b,0x97,0x2e,0x35,0xed, + 0xc3,0x8b,0x2f,0xbe,0xa8,0x9e,0x79,0xe6,0x99,0xd4,0x65,0x06,0x0c,0x18,0x10,0x1d, + 0xbb,0x7a,0x72,0xd7,0x5d,0x77,0x45,0x82,0xd7,0x45,0xe7,0xce,0x9d,0xd5,0xe7,0x3e, + 0xf7,0xb9,0xe8,0xb5,0x55,0xce,0x05,0x00,0x04,0x33,0x46,0x6a,0x00,0x3c,0x5e,0x29, + 0x90,0x8b,0x2f,0xbe,0xb8,0xa2,0x37,0xe4,0x6d,0x8d,0xde,0x8e,0x7e,0x78,0x55,0x7e, + 0xf2,0x93,0x9f,0x54,0x46,0x8e,0x1c,0x19,0xb4,0x1e,0x5b,0xd3,0x0f,0xd2,0xca,0xf1, + 0xc7,0x1f,0x5f,0xd1,0x0f,0xdd,0xd2,0x1e,0xcf,0x66,0xe9,0xa7,0x8f,0x89,0x13,0x27, + 0x56,0x0e,0x3f,0xfc,0xf0,0x8a,0x56,0x4c,0xaa,0xee,0x87,0xb4,0x8d,0x37,0xde,0xb8, + 0x72,0xc7,0x1d,0x77,0xd4,0xb4,0x2f,0xe7,0x9c,0x73,0x4e,0xd0,0x31,0x7b,0xfb,0xed, + 0xb7,0xeb,0x76,0x7c,0xb4,0x47,0xa7,0xd2,0xbb,0x77,0xef,0xd4,0x7d,0x92,0x63,0x37, + 0x73,0xe6,0xcc,0x96,0x3a,0x17,0x00,0x10,0xcc,0xe3,0x22,0x29,0x26,0xb6,0xbb,0x02, + 0x70,0xd3,0x4d,0x37,0x55,0xb4,0xd5,0x5c,0xd3,0xc3,0x2b,0xd9,0xb4,0xb5,0x57,0xb9, + 0xec,0xb2,0xcb,0x2a,0xab,0x56,0xad,0x2a,0xd5,0xf1,0x6c,0xa6,0x7e,0xba,0x58,0xba, + 0x74,0x69,0xe5,0x7b,0xdf,0xfb,0x5e,0xa5,0x47,0x8f,0x1e,0xb9,0xf5,0x43,0x9a,0xb6, + 0x40,0x2b,0xd3,0xa6,0x4d,0xab,0x6a,0x9f,0x9e,0x7b,0xee,0xb9,0xa0,0x6d,0x5c,0x70, + 0xc1,0x05,0x75,0x3b,0x4e,0x97,0x5f,0x7e,0xb9,0x77,0x7f,0x44,0x68,0xb7,0xda,0xb9, + 0x00,0x80,0x70,0xdd,0x5d,0x24,0xc5,0xec,0x76,0x56,0x00,0xe4,0x77,0x62,0x9d,0xe5, + 0xf9,0x00,0x8b,0xdb,0x21,0x87,0x1c,0x12,0x3d,0x24,0xcb,0x70,0x3c,0x9b,0xad,0x9f, + 0x36,0x9e,0x7d,0xf6,0xd9,0xca,0xd8,0xb1,0x63,0x0b,0xe9,0x83,0xb4,0xf5,0xd6,0x5b, + 0xaf,0xf2,0xd2,0x4b,0x2f,0x55,0xb5,0x6f,0xdb,0x6d,0xb7,0x9d,0x77,0xfd,0x5b,0x6e, + 0xb9,0x65,0xdd,0xee,0xec,0x5d,0x76,0xd9,0xc5,0xbb,0x3f,0xb5,0x58,0xdb,0x65,0x3e, + 0x17,0x00,0x10,0xc4,0x6c,0x19,0xfc,0xeb,0xd5,0x8e,0x83,0x1f,0x32,0x06,0x7e,0xda, + 0x69,0xa7,0xa9,0xb3,0xcf,0x3e,0x3b,0x0a,0x78,0x2b,0x6a,0x0c,0x56,0xc6,0x7d,0x97, + 0x2f,0x5f,0x4e,0x3f,0x6b,0xe4,0x89,0x27,0x9e,0x50,0xfb,0xed,0xb7,0x9f,0x9a,0x34, + 0x69,0x52,0x61,0xdb,0x98,0x35,0x6b,0x96,0x3a,0xe0,0x80,0x03,0xd4,0x6b,0xaf,0xbd, + 0x96,0xf9,0xb7,0x9f,0xff,0xfc,0xe7,0xbd,0xcb,0xbc,0xfa,0xea,0xab,0xea,0xa9,0xa7, + 0x9e,0x2a,0xfc,0x9c,0x4b,0x4c,0xc2,0xd3,0x4f,0x3f,0x9d,0xba,0x8c,0x1e,0x02,0x52, + 0x07,0x1f,0x7c,0x70,0x4b,0x9e,0x0b,0x00,0x08,0xa2,0x97,0x28,0x00,0xdd,0xdb,0xb1, + 0xe7,0x9f,0xfd,0xec,0x67,0xd5,0x15,0x57,0x5c,0x51,0xf8,0x76,0xee,0xbc,0xf3,0x4e, + 0x75,0xcc,0x31,0xc7,0x04,0x05,0x44,0xd1,0x4f,0x3b,0x0f,0x3f,0xfc,0xb0,0x3a,0xe8, + 0xa0,0x83,0xa2,0x4c,0x85,0xa2,0x79,0xef,0xbd,0xf7,0xd4,0xfe,0xfb,0xef,0x1f,0x65, + 0x43,0x64,0xe1,0x84,0x13,0x4e,0x88,0x02,0x25,0x7d,0xfc,0xe9,0x4f,0x7f,0x2a,0xbc, + 0x0f,0xff,0xfb,0xbf,0xff,0xeb,0x5d,0xe6,0x8b,0x5f,0xfc,0x62,0x55,0x01,0x77,0xcd, + 0x70,0x2e,0x00,0x20,0x88,0xee,0xa2,0x00,0xb4,0x5d,0xd8,0xed,0xd5,0x57,0x5f,0xad, + 0xae,0xbb,0xee,0xba,0xba,0x6d,0x4f,0x22,0xa3,0x7f,0xf4,0xa3,0x1f,0xd1,0xcf,0x2a, + 0x78,0xf4,0xd1,0x47,0x95,0x1e,0x62,0x50,0x0b,0x16,0x2c,0x08,0xfe,0x4d,0xb7,0x6e, + 0xdd,0xd4,0xe8,0xd1,0xa3,0xd5,0x8e,0x3b,0xee,0xa8,0xb6,0xde,0x7a,0xeb,0x28,0xf5, + 0x2c,0x0b,0xef,0xbc,0xf3,0x8e,0x3a,0xf9,0xe4,0x93,0x33,0xfd,0x46,0xd2,0xda,0x42, + 0x2c,0xea,0xbf,0xfe,0xf5,0xaf,0x85,0x7a,0x4a,0x96,0x2d,0x5b,0xa6,0xfe,0xfc,0xe7, + 0x3f,0xa7,0x2e,0x23,0x51,0xff,0x59,0xfb,0xd7,0x4c,0xe7,0x02,0x00,0x82,0xe8,0xa2, + 0x8a,0x1e,0x64,0x28,0x5b,0x0c,0x80,0xce,0x4d,0xae,0x0c,0x1c,0x38,0x30,0x73,0xd4, + 0xbb,0xaa,0x71,0x4c,0xb3,0x7b,0xf7,0xee,0x95,0x97,0x5f,0x7e,0x99,0x7e,0x66,0x40, + 0xa7,0x26,0x56,0x74,0x9a,0x58,0xd0,0x76,0x75,0x2e,0x79,0x45,0x5b,0xe1,0x15,0xad, + 0x84,0x54,0x74,0x0e,0xfa,0x3a,0xeb,0xd2,0xae,0xe4,0xca,0x4f,0x7f,0xfa,0xd3,0xca, + 0x86,0x1b,0x6e,0x18,0xdc,0x97,0x6b,0xae,0xb9,0x26,0xd3,0xfe,0xea,0xf4,0xb7,0xa0, + 0xf5,0xea,0xf4,0xcb,0xc2,0xee,0xb7,0x6b,0xaf,0xbd,0xd6,0xbb,0x7d,0xad,0xa8,0xb4, + 0xfc,0xb9,0x00,0x00,0x3f,0x6d,0xa7,0x00,0x68,0xf7,0xa5,0x77,0x19,0x79,0xd0,0x9d, + 0x7f,0xfe,0xf9,0x95,0x7f,0xfc,0xe3,0x1f,0x95,0xc9,0x93,0x27,0x57,0xf4,0x38,0x7a, + 0x47,0xd4,0xf3,0x2b,0xaf,0xbc,0x12,0x45,0x73,0x6f,0xb3,0xcd,0x36,0x99,0x85,0xe3, + 0x9e,0x7b,0xee,0x59,0xd1,0xe3,0xf0,0xf4,0x33,0x90,0x13,0x4f,0x3c,0x31,0x68,0x7b, + 0x3b,0xec,0xb0,0x43,0x45,0x8f,0x79,0x07,0xad,0x53,0x5b,0xaf,0x95,0x33,0xce,0x38, + 0x23,0x68,0xbd,0xba,0x08,0x52,0x94,0x4e,0x97,0x25,0x2a,0x7e,0xd0,0xa0,0x41,0x85, + 0x47,0xdf,0xa7,0xa1,0x5d,0xe6,0x85,0x28,0x20,0xcd,0x76,0x2e,0x00,0x00,0x05,0x20, + 0x53,0x3b,0xf0,0xc0,0x03,0x2b,0xb7,0xdc,0x72,0x4b,0x87,0x20,0xf4,0xa1,0x8b,0xe8, + 0x64,0x4e,0xab,0xd3,0x6e,0x79,0xfa,0x19,0xc0,0x0d,0x37,0xdc,0x10,0xb4,0x1d,0x5d, + 0x3c,0xa6,0x2a,0xc1,0xf0,0x9d,0xef,0x7c,0x27,0x68,0xfd,0xdf,0xff,0xfe,0xf7,0x33, + 0xad,0xf7,0xcb,0x5f,0xfe,0xb2,0x77,0x9d,0xda,0x2d,0x9e,0x4b,0xfe,0xbd,0xc9,0x1b, + 0x6f,0xbc,0x11,0x59,0xdf,0x69,0xdb,0xd6,0xd5,0x1d,0x2b,0x3a,0x4e,0xa3,0x2d,0xce, + 0x05,0x00,0xa0,0x00,0x78,0x9b,0x1e,0x97,0xac,0xda,0x2d,0xab,0x23,0xbb,0x2b,0xeb, + 0xaf,0xbf,0x7e,0xf0,0xb6,0x3e,0xf6,0xb1,0x8f,0xd1,0xcf,0x00,0xcb,0x50,0xd2,0xc0, + 0x7c,0xdb,0xd0,0x65,0x64,0xa3,0x65,0xab,0xe5,0xb0,0xc3,0x0e,0x0b,0xda,0x46,0x16, + 0x9e,0x7c,0xf2,0xc9,0xa0,0xe3,0xf3,0xeb,0x5f,0xff,0x3a,0xf7,0x7b,0xed,0xdc,0x73, + 0xcf,0xf5,0x6e,0xf7,0x9b,0xdf,0xfc,0x66,0xdb,0x9c,0x0b,0x00,0x40,0x01,0xf0,0x8e, + 0x87,0xea,0x5a,0xe5,0x35,0x6d,0xfb,0x9f,0xff,0xfc,0x67,0xa6,0x62,0x28,0xb5,0x8c, + 0x91,0xb7,0x43,0x3f,0x2f,0xbd,0xf4,0xd2,0xa0,0x71,0xe6,0x87,0x1e,0x7a,0xa8,0xa6, + 0xfe,0x48,0x05,0x3b,0x89,0x59,0xf0,0x6d,0x4b,0x07,0xbf,0x65,0x5a,0xaf,0xe4,0xfb, + 0xfb,0xd6,0xb9,0xd3,0x4e,0x3b,0xe5,0x7a,0x9f,0x89,0x37,0xc7,0x57,0xdd,0x51,0x8e, + 0x99,0x4e,0xdd,0x6b,0xab,0x73,0x01,0x00,0x6e,0xda,0x7a,0x1a,0xe0,0x8b,0x2e,0xba, + 0x28,0xca,0x61,0x97,0x09,0x6f,0x6a,0x61,0xdc,0xb8,0x71,0x4a,0xbb,0x27,0x83,0x97, + 0xbf,0xf2,0xca,0x2b,0xe9,0xa7,0x03,0x51,0x4a,0xb5,0x75,0xec,0x5d,0x4e,0xea,0xc7, + 0xef,0xb5,0xd7,0x5e,0x35,0xf5,0x47,0x17,0xb2,0x51,0xe3,0xc7,0x8f,0xf7,0x2e,0x77, + 0xd5,0x55,0x57,0x65,0x5a,0x6f,0x48,0x4d,0x00,0x5d,0x48,0x47,0x69,0x05,0x29,0xb7, + 0x73,0x7c,0xf7,0xdd,0x77,0x2b,0x5d,0x3d,0x2f,0x75,0x19,0x99,0xcb,0x61,0xd3,0x4d, + 0x37,0x6d,0xab,0x73,0x01,0x00,0xe9,0x37,0x79,0x5b,0x7a,0x00,0xf2,0x76,0xc1,0xea, + 0x99,0xce,0x2a,0x7a,0x82,0x9c,0xa0,0x6d,0xcb,0x38,0x6c,0xb5,0x41,0x72,0xad,0xde, + 0xcf,0xdb,0x6f,0xbf,0x3d,0x68,0xdd,0x7a,0x42,0xa4,0x5c,0xfa,0x73,0xdb,0x6d,0xb7, + 0x79,0xb7,0x35,0x78,0xf0,0xe0,0x4c,0xfd,0x90,0x0c,0x8c,0x90,0x8c,0x8a,0xaf,0x7f, + 0xfd,0xeb,0xb9,0x9d,0x17,0x2d,0x84,0xbd,0xdb,0x93,0x0c,0x81,0x76,0x3b,0x17,0x00, + 0x80,0x07,0x60,0x2d,0x7e,0xf3,0x9b,0xdf,0x28,0x1d,0x7d,0x9c,0xeb,0x3a,0x65,0x06, + 0xbe,0xaf,0x7d,0xed,0x6b,0x41,0xcb,0x4a,0x81,0x13,0x1d,0xb0,0x45,0x3f,0x2d,0x68, + 0x97,0xb3,0x77,0x99,0xcd,0x36,0xdb,0x4c,0xed,0xb3,0xcf,0x3e,0xb9,0xf4,0xe7,0x13, + 0x9f,0xf8,0x84,0xea,0xd9,0xb3,0x67,0xea,0x32,0x73,0xe6,0xcc,0x89,0x66,0x61,0x0c, + 0x45,0xaa,0xec,0x49,0x01,0x1b,0x1f,0x7f,0xf9,0xcb,0x5f,0x72,0xa9,0xce,0x28,0xc7, + 0x59,0x97,0xf5,0x4d,0x5d,0x46,0xf2,0xef,0xc5,0x52,0x6f,0xb7,0x73,0x01,0x00,0x6e, + 0xda,0x4e,0x01,0xd0,0x93,0xd7,0xa8,0xd3,0x4f,0x3f,0xbd,0x90,0x75,0x4b,0x25,0xbc, + 0x50,0x7c,0xd3,0xc7,0xb6,0x63,0x3f,0x75,0x1a,0x9d,0x7a,0xf0,0xc1,0x07,0xbd,0xcb, + 0xe9,0x2c,0x86,0xdc,0xfa,0xa2,0xc7,0x9d,0xd5,0x56,0x5b,0x6d,0xe5,0x5d,0xee,0xf9, + 0xe7,0x9f,0xcf,0xb4,0xde,0x2f,0x7c,0xe1,0x0b,0xde,0x65,0xa4,0xc8,0xcd,0xbd,0xf7, + 0xde,0x5b,0x73,0x1f,0xc4,0x2d,0xee,0xab,0xc0,0x28,0xd3,0xfe,0xea,0xf8,0x8d,0xb6, + 0x3c,0x17,0x00,0x80,0x02,0x10,0xa1,0xd3,0xb4,0x0a,0x5b,0xb7,0x9e,0xce,0x54,0xe9, + 0xbc,0xf9,0x52,0x28,0x00,0xcd,0xd8,0x4f,0xa9,0x5f,0x1f,0x52,0x25,0x2f,0xc4,0xba, + 0xce,0x42,0x48,0x5f,0xb2,0x0a,0x9d,0x4f,0x7f,0xfa,0xd3,0xaa,0x7f,0xff,0xfe,0x41, + 0xc2,0xbb,0x56,0x42,0x4a,0xff,0x7e,0xe9,0x4b,0x5f,0xca,0xb4,0xce,0x56,0x3a,0x17, + 0x00,0x80,0x02,0x50,0x17,0x42,0x27,0x58,0x29,0x5a,0x01,0x68,0xc6,0x7e,0x4a,0xa9, + 0xd9,0x10,0x76,0xdb,0x6d,0xb7,0x5c,0xfb,0x32,0x66,0xcc,0x98,0xdc,0x85,0x4e,0xef, + 0xde,0xbd,0x83,0x82,0xda,0x6e,0xbe,0xf9,0xe6,0x4c,0xa5,0x75,0x6d,0xc7,0xcc,0x37, + 0x61,0x8e,0xce,0xcf,0x0f,0xb2,0xac,0x5b,0xf5,0x5c,0x00,0x00,0x0a,0x40,0x5d,0x08, + 0xb5,0x8c,0x75,0xa5,0x3d,0xfa,0x59,0x85,0xd0,0x91,0x31,0xe2,0x11,0x23,0x46,0xe4, + 0xda,0x97,0x7e,0xfd,0xfa,0x79,0x97,0x79,0xfd,0xf5,0xd7,0x33,0xaf,0x37,0x24,0x1b, + 0x60,0xf1,0xe2,0xc5,0x4a,0x17,0xda,0xa9,0x7a,0xdf,0x7f,0xff,0xfb,0xdf,0xe7,0x6e, + 0xfd,0xb7,0xe2,0xb9,0x00,0x80,0x75,0xe9,0xca,0x21,0xc8,0x97,0x2d,0xb6,0xd8,0x22, + 0x68,0xb9,0xb9,0x73,0xe7,0xd2,0x4f,0x83,0x90,0xa9,0x72,0x57,0xad,0x5a,0x15,0xcd, + 0x48,0x97,0x27,0x13,0x26,0x4c,0xf0,0x2e,0x53,0xcd,0xec,0x77,0x62,0x79,0xeb,0xe2, + 0x35,0x4a,0x97,0x59,0x4e,0x5d,0x4e,0x66,0x08,0x3c,0xe9,0xa4,0x93,0x32,0xaf,0x7f, + 0xfe,0xfc,0xf9,0x4a,0xcf,0x3f,0x90,0xba,0xcc,0x80,0x01,0x03,0x82,0x3c,0x11,0xad, + 0x7e,0x2e,0xfe,0xfe,0xf7,0xbf,0xab,0xc7,0x1e,0x7b,0xac,0xb4,0xf7,0x93,0x78,0x3e, + 0x98,0xf4,0x08,0x50,0x00,0xda,0x44,0x01,0x90,0xa0,0xad,0x25,0x4b,0x96,0xa8,0x5e, + 0xbd,0x7a,0xd1,0x4f,0x8d,0x2e,0x64,0xa3,0x66,0xcf,0x9e,0x1d,0xb4,0xbe,0xbc,0xa2, + 0xce,0xb3,0x0a,0xdb,0xac,0xe8,0x02,0x39,0x51,0xf0,0x9d,0xaf,0x76,0x82,0x08,0x51, + 0x99,0xf2,0x56,0x62,0x2b,0xb2,0xa0,0xd3,0xfa,0x22,0x0f,0x42,0x1a,0x32,0x1d,0x74, + 0xd6,0x6b,0xac,0x15,0xcf,0x85,0xcc,0x90,0x28,0xc7,0xab,0xac,0xc8,0x10,0x0d,0x0a, + 0x00,0xd4,0x1b,0x86,0x00,0x72,0x46,0x4f,0x06,0x13,0x1c,0x6d,0x5d,0x8f,0x39,0xd5, + 0x9b,0xa5,0x9f,0x7a,0xb6,0xb9,0xa8,0xf0,0x4c,0x59,0x11,0x41,0x2b,0x16,0x6f,0x56, + 0xf4,0x24,0x3a,0x91,0x22,0x90,0x86,0xf4,0x5b,0xa6,0x6e,0xce,0x4a,0x11,0xc1,0x7f, + 0xad,0x7c,0x2e,0x00,0x00,0x05,0xa0,0x70,0x24,0x57,0x3e,0xf4,0x41,0x4b,0x3f,0x3f, + 0x24,0xc4,0xe2,0x6c,0x34,0xd5,0x58,0x9e,0x32,0x04,0x10,0x52,0x25,0x2f,0xab,0x02, + 0xf0,0xe2,0x8b,0x2f,0x46,0x91,0xfa,0x69,0xec,0xb2,0xcb,0x2e,0x6a,0xfb,0xed,0xb7, + 0xcf,0xbc,0xcf,0xad,0x7a,0x2e,0x00,0x00,0x05,0xa0,0x34,0x82,0xb1,0x96,0xe8,0xef, + 0x56,0xeb,0xa7,0x14,0x78,0x29,0x3b,0xd5,0x9e,0xaf,0x90,0x60,0x40,0x5d,0x0b,0x3f, + 0xd3,0x18,0x75,0x51,0xd6,0x7f,0xab,0x9f,0x0b,0x00,0x40,0x01,0x28,0x14,0x49,0x01, + 0x0b,0xa1,0x6b,0xd7,0xae,0xf4,0x73,0x0d,0xcd,0x10,0x14,0x59,0x6d,0xd5,0xbe,0xa3, + 0x8f,0x3e,0x3a,0xe8,0x58,0x85,0xd6,0x04,0x58,0xb6,0x6c,0x59,0x34,0xa6,0x9d,0x46, + 0xdf,0xbe,0x7d,0xd5,0xf1,0xc7,0x1f,0x5f,0xd5,0xfe,0xb6,0xf2,0xb9,0x00,0x00,0x14, + 0x80,0x42,0xf1,0x55,0x65,0x8b,0x91,0x08,0x6d,0xfa,0xd9,0x3c,0x0f,0xf4,0x6a,0x15, + 0x36,0x49,0x6d,0x3b,0xf2,0xc8,0x23,0xbd,0xcb,0x5d,0x77,0xdd,0x75,0x91,0x70,0xf7, + 0x71,0xd3,0x4d,0x37,0x79,0xad,0x74,0x11,0xfe,0xa2,0x04,0xb4,0xaa,0x70,0x6d,0x76, + 0xe5,0x19,0xa0,0x14,0xf7,0x11,0x87,0x20,0x7f,0x16,0x2d,0x5a,0x14,0xb4,0xdc,0xc0, + 0x81,0x03,0xe9,0xe7,0x1a,0xf4,0x24,0x2f,0x2d,0x2d,0x74,0xa4,0x34,0xb0,0xcf,0x6a, + 0x97,0x58,0x09,0x3d,0x21,0x8e,0x37,0x6d,0xaf,0x48,0xf7,0x7f,0xab,0x9e,0x8b,0xdd, + 0x77,0xdf,0x5d,0xcd,0x9a,0x35,0xab,0xb4,0xfd,0xc9,0x5a,0xa8,0x09,0x00,0x05,0xa0, + 0xc9,0x05,0x63,0xb3,0x7b,0x00,0xf2,0xec,0xe7,0x7a,0xeb,0xad,0x17,0xb4,0xae,0xef, + 0x7d,0xef,0x7b,0x99,0xa6,0x24,0x2e,0x0b,0x32,0x15,0xef,0xa8,0x51,0xa3,0x94,0x9e, + 0x29,0x30,0x75,0x39,0xa9,0x09,0x90,0xa6,0x00,0x48,0x4d,0x81,0xfb,0xef,0xbf,0x3f, + 0x75,0x1d,0x12,0xf8,0x27,0x01,0x80,0xd5,0xd2,0x8a,0xe7,0xe2,0xcc,0x33,0xcf,0x8c, + 0x1a,0x00,0xfc,0x7f,0x18,0x02,0x28,0x00,0x5f,0x6e,0xb6,0x20,0x6e,0xe1,0x2e,0x5d, + 0xba,0xd0,0xcf,0x8c,0x42,0x27,0xa4,0x50,0x4c,0x29,0x6f,0xb4,0xce,0x9d,0xa3,0x94, + 0x40,0x1f,0x77,0xdf,0x7d,0xb7,0x7a,0xff,0xfd,0xf7,0x9d,0xdf,0xff,0xe1,0x0f,0x7f, + 0xf0,0xa6,0xe8,0xd5,0x62,0xfd,0xb7,0xc3,0xb9,0x00,0x00,0x14,0x80,0x42,0x90,0xa9, + 0x59,0x43,0xc6,0x50,0x9b,0xdd,0xfd,0x9f,0x77,0x3f,0xa5,0xae,0x40,0x88,0xa2,0xd0, + 0xcc,0x42,0x47,0x8a,0x02,0xf9,0x90,0x22,0x3c,0x32,0x4d,0xb0,0x0d,0xc9,0x7d,0x17, + 0x05,0x20,0x0d,0x29,0xfa,0xf3,0x99,0xcf,0x7c,0xa6,0xa6,0xfd,0x6c,0x87,0x73,0x01, + 0x00,0x28,0x00,0xb9,0xe3,0x9b,0x98,0x25,0x66,0xf3,0xcd,0x37,0xa7,0x9f,0x09,0xa4, + 0x58,0x8e,0xcc,0x59,0xef,0x43,0xd2,0xe5,0x42,0x87,0x1e,0xca,0x86,0x54,0x4f,0x94, + 0xb1,0x68,0x1f,0xae,0x6c,0x00,0xf1,0x0e,0xc8,0x14,0xc2,0x69,0xc8,0xf0,0x41,0xad, + 0xca,0x65,0x3b,0x9c,0x0b,0x00,0x40,0x01,0x68,0x98,0x60,0xac,0x65,0x8c,0xb6,0x55, + 0xfb,0xb9,0xd3,0x4e,0x3b,0x05,0x59,0xc8,0x22,0x08,0x9b,0x15,0x09,0x06,0xf4,0x21, + 0xb3,0xdd,0x49,0xa1,0x1f,0x93,0xa2,0x26,0xfe,0x69,0xd7,0x73,0x01,0x80,0x02,0x00, + 0x28,0x00,0x25,0xe9,0x67,0xe8,0xdc,0xf2,0xb7,0xdc,0x72,0x4b,0xd3,0x1e,0xb7,0x63, + 0x8e,0x39,0x26,0xa8,0x84,0xb2,0xe9,0x05,0x90,0x21,0x97,0x3b,0xee,0xb8,0x23,0xf5, + 0x37,0x12,0x49,0x2e,0x13,0x10,0xe5,0x41,0x3b,0x9c,0x0b,0x00,0x14,0x00,0xc8,0x95, + 0xd0,0x79,0xd4,0x9b,0x5d,0x01,0x28,0xa2,0x9f,0xfb,0xed,0xb7,0x5f,0xd0,0x72,0x77, + 0xde,0x79,0x67,0x64,0x7d,0x36,0x23,0x32,0xbe,0x7e,0xf8,0xe1,0x87,0x7b,0x97,0x93, + 0x38,0x80,0x64,0xbd,0x7b,0x51,0x08,0x7c,0x75,0x17,0xf2,0xb2,0xfe,0xdb,0xe5,0x5c, + 0x00,0xa0,0x00,0x40,0x6e,0x48,0xf4,0xb6,0xaf,0x3e,0xbb,0x30,0x74,0xe8,0xd0,0x28, + 0x25,0x8c,0x7e,0xae,0x8d,0xa4,0xaf,0x85,0x8c,0x3d,0x4b,0x11,0x9c,0xbf,0xfd,0xed, + 0x6f,0x4d,0x7b,0xfc,0x42,0x4a,0x03,0xcf,0x98,0x31,0x43,0xdd,0x73,0xcf,0x3d,0x1d, + 0x7f,0xfb,0x72,0xff,0xc5,0xab,0x10,0x12,0x64,0xc8,0xb9,0x00,0x00,0x14,0x80,0x02, + 0x90,0x39,0xc7,0x43,0x22,0xe3,0x0f,0x39,0xe4,0x10,0xfa,0x69,0xbb,0x18,0x75,0xaa, + 0x5c,0xa8,0xe5,0x79,0xfe,0xf9,0xe7,0x37,0xed,0x8c,0x70,0x07,0x1d,0x74,0x90,0x1a, + 0x36,0x6c,0x98,0x77,0x39,0xa9,0x09,0x20,0x88,0xb7,0xc5,0x37,0xe4,0x72,0xc4,0x11, + 0x47,0x04,0x09,0x6c,0xce,0x05,0x00,0xa0,0x00,0x14,0x80,0x2b,0x7d,0xcb,0xe4,0x94, + 0x53,0x4e,0xa1,0x9f,0x0e,0xce,0x38,0xe3,0x8c,0xa0,0xe5,0x44,0x20,0x5e,0x73,0xcd, + 0x35,0x4d,0x79,0xfc,0xa4,0x8a,0x5d,0x48,0xaa,0xde,0xad,0xb7,0xde,0x1a,0x4d,0xa5, + 0x5c,0xcf,0xe0,0xbf,0x76,0x3b,0x17,0x00,0x28,0x00,0x6d,0xc4,0xd2,0xa5,0x4b,0x0b, + 0x59,0xaf,0x58,0x69,0xf7,0xde,0x7b,0xaf,0x77,0xb9,0x2d,0xb7,0xdc,0x52,0x7d,0xfc, + 0xe3,0x1f,0xa7,0x9f,0x0e,0xf6,0xdc,0x73,0x4f,0xb5,0xf7,0xde,0x7b,0x07,0x2d,0x7b, + 0xce,0x39,0xe7,0xa8,0x77,0xdf,0x7d,0xb7,0x29,0xaf,0xc3,0x10,0x77,0xbd,0x9c,0x43, + 0x11,0xfe,0xd7,0x5f,0x7f,0x7d,0xea,0x72,0x9b,0x6e,0xba,0x69,0x54,0x69,0x30,0x6f, + 0xda,0xe5,0x5c,0x00,0xa0,0x00,0xb4,0x09,0x22,0x94,0xde,0x7a,0xeb,0xad,0xdc,0xd7, + 0x7b,0xde,0x79,0xe7,0x05,0x2d,0x77,0xf2,0xc9,0x27,0xd3,0x4f,0x0f,0xe7,0x9e,0x7b, + 0x6e,0xd0,0x72,0x12,0x19,0x2f,0x33,0xed,0x2d,0x5f,0xbe,0xbc,0xe9,0xae,0xc3,0xed, + 0xb6,0xdb,0x4e,0xed,0xb8,0xe3,0x8e,0xde,0xe5,0xce,0x3e,0xfb,0x6c,0x6f,0xc5,0x45, + 0xf1,0xb4,0x48,0xee,0x7e,0x11,0xb4,0xc3,0xb9,0x00,0x40,0x01,0x68,0x13,0x9e,0x7b, + 0xee,0xb9,0x28,0xc7,0x39,0xc4,0x8a,0x0d,0xe5,0xb2,0xcb,0x2e,0x53,0x0f,0x3c,0xf0, + 0x80,0x77,0xb9,0x9e,0x3d,0x7b,0xe6,0x1a,0xa8,0xd5,0xaa,0xfd,0x3c,0xe0,0x80,0x03, + 0xd4,0x6e,0xbb,0xed,0x16,0xb4,0xec,0xe3,0x8f,0x3f,0x1e,0x09,0xc0,0xd0,0x99,0x09, + 0xcb,0x44,0x48,0x30,0xa0,0x0f,0x19,0x4e,0x08,0xa9,0x2d,0xc0,0xb9,0x00,0x80,0xb6, + 0x57,0x00,0x84,0xd9,0xb3,0x67,0xab,0x83,0x0f,0x3e,0x38,0x9a,0xc8,0xa4,0x56,0x57, + 0xb9,0x44,0x6a,0x9f,0x75,0xd6,0x59,0xc1,0xd6,0xd4,0x06,0x1b,0x6c,0x40,0x3f,0x03, + 0xb8,0xf4,0xd2,0x4b,0x55,0xf7,0xee,0xdd,0x83,0x96,0xbd,0xfa,0xea,0xab,0x23,0x41, + 0x35,0x73,0xe6,0xcc,0x42,0x8e,0xa3,0x04,0xb8,0xf9,0xa6,0xdf,0xad,0x06,0x99,0xb2, + 0xb7,0x5b,0xb7,0x6e,0x35,0xad,0xe3,0xb0,0xc3,0x0e,0x0b,0x0a,0x28,0xe4,0x5c,0x00, + 0xc0,0x3a,0x54,0x0a,0xe6,0xe2,0x8b,0x2f,0x96,0x99,0x4b,0xbc,0xad,0x5e,0xdb,0x31, + 0xdb,0x46,0x1b,0x6d,0x54,0xd1,0x63,0xac,0x55,0x6d,0x53,0xd7,0x65,0xaf,0xe8,0x39, + 0xd7,0x83,0xb6,0xf3,0x91,0x8f,0x7c,0xa4,0xa2,0xdd,0xa3,0xf4,0x33,0x03,0xda,0xe3, + 0x90,0xa9,0x8f,0xa3,0x47,0x8f,0xae,0xe8,0x60,0xb4,0x8a,0x16,0x12,0x35,0x6f,0x5b, + 0x4f,0xcd,0x5b,0xb9,0xee,0xba,0xeb,0x2a,0x9f,0xfd,0xec,0x67,0x2b,0x3a,0xba,0xbe, + 0xb2,0xe1,0x86,0x1b,0x16,0x72,0x7f,0xe8,0x9a,0x00,0x55,0x9d,0xcf,0xb8,0xdd,0x75, + 0xd7,0x5d,0x95,0x7a,0xd0,0x0e,0xe7,0x02,0xa0,0xdd,0x68,0x7b,0x05,0x20,0x6e,0xba, + 0x82,0x5a,0x45,0xcf,0xd7,0x5e,0x59,0xb8,0x70,0xa1,0x77,0x5b,0x2f,0xbf,0xfc,0x72, + 0x45,0xa7,0x5d,0x05,0xaf,0x5b,0x8f,0xcf,0x56,0x1e,0x79,0xe4,0x91,0xba,0x1e,0xcf, + 0x66,0xef,0x67,0x8c,0x9e,0x41,0x2f,0x73,0x1f,0x75,0xcd,0xfd,0x48,0x69,0xd1,0x56, + 0x68,0xa6,0x6d,0x4d,0x9a,0x34,0xa9,0xf2,0x8b,0x5f,0xfc,0xa2,0xa2,0xab,0xe0,0x55, + 0xb4,0x65,0xbe,0xd6,0x3a,0x75,0x4d,0x83,0x42,0xee,0x8f,0x9b,0x6f,0xbe,0xb9,0xea, + 0x73,0x29,0x42,0x36,0x0f,0x01,0xcb,0xb9,0x00,0x68,0x4f,0xba,0xe2,0x03,0xf9,0x10, + 0x89,0x6e,0x97,0xd6,0xa7,0x4f,0x9f,0xa8,0x52,0x9b,0x8c,0x7b,0x6a,0xab,0x59,0x69, + 0x6b,0x23,0x72,0x9f,0x4b,0x84,0xb3,0x7e,0x28,0x45,0x11,0xd9,0x52,0xab,0x3d,0x0b, + 0xa7,0x9e,0x7a,0x6a,0x6e,0x25,0x5a,0xdb,0xad,0x9f,0x97,0x5f,0x7e,0x79,0xb4,0x1f, + 0x2f,0xbd,0xf4,0x52,0xf0,0x6f,0x24,0x2d,0xed,0xa4,0x93,0x4e,0x8a,0x02,0xe3,0x24, + 0xd8,0x6e,0x9f,0x7d,0xf6,0x51,0x9b,0x6c,0xb2,0x49,0x94,0x27,0xdf,0xbb,0x77,0xef, + 0x68,0x02,0x9b,0xb9,0x73,0xe7,0x46,0x41,0x92,0xd2,0xde,0x7e,0xfb,0xed,0xe8,0x55, + 0x02,0xd9,0xea,0xcd,0x27,0x3f,0xf9,0xc9,0x68,0xfa,0xdd,0x59,0xb3,0x66,0x65,0xfe, + 0xad,0x04,0x5a,0x4a,0xbe,0x7e,0xbd,0x68,0xf5,0x73,0x01,0xc0,0x10,0x40,0x9b,0x7a, + 0x00,0x8a,0x6a,0x87,0x1e,0x7a,0x68,0x6e,0x2e,0xf1,0x76,0xea,0x67,0x12,0x5d,0x15, + 0xaf,0xb2,0xeb,0xae,0xbb,0x36,0xb4,0x7f,0x45,0x5a,0x9d,0x3a,0xdf,0x3e,0xf3,0xfe, + 0xe8,0xe9,0x7a,0x2b,0x53,0xa7,0x4e,0xad,0xbb,0xc5,0xd0,0xea,0xe7,0x02,0xa0,0x9d, + 0x68,0xbb,0x20,0xc0,0x6f,0x7f,0xfb,0xdb,0x75,0xdb,0x96,0x54,0x52,0x13,0x4b,0xba, + 0xd6,0x40,0xaf,0x76,0xef,0xa7,0x94,0x14,0x7e,0xf0,0xc1,0x07,0xd5,0x51,0x47,0x1d, + 0xd5,0x92,0xd7,0x64,0x35,0xd9,0x00,0x12,0xdc,0x39,0x72,0xe4,0xc8,0xba,0xef,0x6b, + 0xab,0x9f,0x0b,0x80,0x76,0xa2,0xed,0x14,0x80,0x1f,0xff,0xf8,0xc7,0xea,0x82,0x0b, + 0x2e,0x28,0x7c,0x3b,0xe3,0xc6,0x8d,0x53,0xb7,0xdd,0x76,0x5b,0x94,0x12,0x47,0x3f, + 0x6b,0xa7,0x57,0xaf,0x5e,0x91,0x92,0x21,0x05,0x67,0x5a,0x0d,0x49,0xd7,0xdc,0x7a, + 0xeb,0xad,0x33,0xfd,0xa6,0x88,0xca,0x7f,0x9c,0x0b,0x00,0x14,0x80,0x96,0xe7,0x5b, + 0xdf,0xfa,0x96,0xd2,0x81,0x49,0xd1,0xcc,0x6c,0x79,0xa3,0x5d,0xb3,0xea,0x1b,0xdf, + 0xf8,0x86,0xba,0xef,0xbe,0xfb,0xa2,0x71,0x76,0xfa,0x99,0x1f,0x32,0x8e,0xfc,0xd3, + 0x9f,0xfe,0x54,0xe9,0xc8,0xf7,0x68,0x3c,0xb9,0x95,0xc8,0x92,0xcb,0x3f,0x7c,0xf8, + 0x70,0xf5,0xa9,0x4f,0x7d,0xaa,0xa1,0xfb,0xdb,0xca,0xe7,0x02,0x00,0x05,0xa0,0xc5, + 0x91,0x07,0xae,0x04,0x28,0xc9,0x6b,0x5e,0x55,0xd4,0xb6,0xdd,0x76,0x5b,0xf5,0xe4, + 0x93,0x4f,0xaa,0x0b,0x2f,0xbc,0xb0,0x61,0x96,0x7f,0x3b,0xf4,0x53,0xdc,0xdf,0xff, + 0xfa,0xd7,0xbf,0xa2,0x29,0x72,0x25,0x80,0xb1,0x48,0x64,0x58,0x43,0xbc,0x1c,0xa7, + 0x9f,0x7e,0x7a,0xa1,0xdb,0x39,0xe1,0x84,0x13,0x22,0xa5,0x2a,0x04,0x09,0xaa,0x93, + 0x02,0x40,0x65,0xa0,0x15,0xcf,0x05,0x40,0xdb,0x50,0x74,0x90,0x81,0x8e,0x1c,0xf6, + 0x06,0xf5,0x68,0x0b,0xb2,0xa1,0xc1,0x86,0x3a,0x2a,0xbe,0x32,0x7e,0xfc,0xf8,0x68, + 0x3f,0x54,0xc6,0x80,0x24,0x1d,0x85,0x5d,0xd1,0x63,0xe0,0x15,0x5d,0xb3,0xbd,0xb0, + 0x20,0xb8,0x76,0xec,0x67,0x28,0x3a,0x73,0xa1,0x72,0xe5,0x95,0x57,0x46,0xe9,0x8a, + 0xfd,0xfa,0xf5,0xab,0x39,0xc0,0x4c,0x2b,0x34,0x15,0x5d,0xff,0xbe,0xa2,0x4b,0x1e, + 0x57,0x74,0x15,0xc5,0x8a,0x8e,0x52,0xaf,0x5b,0x5f,0xf4,0xec,0x89,0x41,0xa9,0x96, + 0x93,0x27,0x4f,0x2e,0x65,0x40,0x51,0x2b,0x9d,0x0b,0x80,0x76,0xa0,0x93,0xfc,0xd7, + 0x0a,0x8a,0xcc,0x25,0x97,0x5c,0x12,0xd5,0x4d,0x0f,0x50,0x78,0x9c,0xdf,0x2d,0x59, + 0xb2,0x24,0x72,0x69,0xea,0xdc,0xec,0xc8,0x6a,0x96,0x94,0x38,0x49,0x47,0x5a,0xb9, + 0x72,0x65,0x34,0xdf,0xba,0x94,0x38,0x95,0x0a,0x77,0x23,0x46,0x8c,0x88,0x02,0xb0, + 0x24,0xf8,0xed,0x98,0x63,0x8e,0x89,0x5c,0xb2,0xf4,0xb3,0xf1,0xc8,0x7e,0xeb,0x3a, + 0x04,0xd1,0x74,0xc5,0x92,0xaa,0xf6,0xfe,0xfb,0xef,0x47,0x4d,0xaa,0xd2,0xc9,0x77, + 0xd2,0xb7,0x65,0xcb,0x96,0x29,0x2d,0x9c,0xa2,0xbe,0x48,0x05,0x3d,0x79,0x95,0x26, + 0x69,0x90,0x92,0x12,0xa9,0x23,0xdc,0xa3,0xe5,0x80,0x73,0x01,0xd0,0xea,0xa0,0x00, + 0x78,0x90,0x79,0xef,0x25,0x4f,0x59,0x5c,0xae,0x32,0xd6,0xdd,0x68,0xd7,0x6b,0xbb, + 0xf4,0x33,0x67,0x2f,0x57,0xd4,0x37,0x71,0xb1,0xc7,0xfd,0x03,0xce,0x05,0x40,0xbb, + 0x43,0x21,0x20,0x0f,0x52,0x68,0x45,0x8a,0x96,0xd0,0xcf,0x26,0xd6,0x72,0x75,0xec, + 0xc3,0xe0,0xc1,0x83,0xb9,0x98,0x39,0x17,0x00,0x90,0x7c,0xee,0x73,0x08,0x00,0x00, + 0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00, + 0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00, + 0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00, + 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00, + 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x20,0x23,0x2d,0x33,0x1d,0xf0,0x56,0x5b, + 0x6d,0xa5,0xf6,0xdd,0x77,0xdf,0xd4,0x65,0xfa,0xf6,0xed,0x4b,0x3f,0x01,0x00,0x00, + 0x34,0x9d,0x2a,0x1a,0x0e,0x03,0x00,0x00,0x40,0x7b,0xc1,0x10,0x00,0x00,0x00,0x00, + 0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00, + 0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00, + 0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, + 0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00, + 0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00, + 0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x0a,0x00,0x00, + 0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00, + 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00, + 0x00,0x00,0x00,0x94,0x8a,0xae,0x1c,0x02,0x00,0x28,0x33,0x2b,0x57,0xae,0x54,0x73, + 0xe7,0xce,0x4d,0x5d,0xa6,0x5b,0xb7,0x6e,0x6a,0xe0,0xc0,0x81,0x1c,0x2c,0x00,0x14, + 0x00,0x00,0x68,0x15,0x7e,0xf7,0xbb,0xdf,0xa9,0x33,0xcf,0x3c,0x33,0x75,0x99,0xee, + 0xdd,0xbb,0xab,0x65,0xcb,0x96,0x71,0xb0,0x00,0x32,0xc0,0x10,0x00,0x00,0x94,0x9a, + 0xe5,0xcb,0x97,0xe7,0xb2,0x0c,0x00,0xa0,0x00,0x00,0x00,0x00,0xa0,0x00,0x70,0x08, + 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x50,0x00, + 0x00,0x00,0x00,0xa0,0x25,0x20,0x0d,0x10,0x00,0xa0,0x4d,0x59,0xb0,0x60,0x81,0x7a, + 0xf3,0xcd,0x37,0xa3,0x36,0x65,0xca,0x94,0xe8,0x75,0xda,0xb4,0x69,0xea,0xdc,0x73, + 0xcf,0x55,0xdb,0x6d,0xb7,0x1d,0x07,0x08,0x05,0x00,0x00,0x00,0x5a,0x81,0xf9,0xf3, + 0xe7,0xab,0x93,0x4f,0x3e,0xb9,0x43,0xe0,0xcf,0x9e,0x3d,0xdb,0xba,0xdc,0xe1,0x87, + 0x1f,0x8e,0x02,0x80,0x02,0x00,0x00,0xd0,0x58,0xc6,0x8f,0x1f,0xaf,0x36,0xd8,0x60, + 0x83,0xd4,0x65,0xfa,0xf6,0xed,0xcb,0x81,0x0a,0x60,0xc9,0x92,0x25,0xea,0x86,0x1b, + 0x6e,0xe0,0x40,0x00,0x0a,0x00,0x00,0x94,0x9f,0xd1,0xa3,0x47,0xab,0x13,0x4f,0x3c, + 0x91,0x03,0x01,0x90,0x33,0x04,0x01,0x02,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00, + 0x0a,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00, + 0x34,0x29,0x64,0x01,0x00,0x34,0x88,0x79,0xf3,0xe6,0x75,0x14,0x61,0x79,0xeb,0xad, + 0xb7,0xd4,0xea,0xd5,0xab,0xd5,0xd0,0xa1,0x43,0xd5,0xf0,0xe1,0xc3,0xd5,0xb0,0x61, + 0xc3,0xd4,0xa8,0x51,0xa3,0x54,0x9f,0x3e,0x7d,0x9a,0xba,0x8f,0x92,0x76,0x36,0x79, + 0xf2,0xe4,0xa8,0x49,0xde,0xf9,0xaa,0x55,0xab,0xd4,0x7a,0xeb,0xad,0x17,0xb5,0xfd, + 0xf7,0xdf,0x5f,0x75,0xef,0xde,0xbd,0x6d,0xce,0x75,0x7c,0x1c,0xde,0x7e,0xfb,0x6d, + 0xd5,0xb9,0x73,0x67,0xb5,0xfe,0xfa,0xeb,0x47,0xe9,0x8d,0x5b,0x6c,0xb1,0x45,0x74, + 0xae,0xc1,0xcf,0xa2,0x45,0x8b,0xd4,0xd4,0xa9,0x53,0xd5,0xf4,0xe9,0xd3,0xd5,0xbb, + 0xef,0xbe,0x1b,0xbd,0x2e,0x5c,0xb8,0x50,0x0d,0x19,0x32,0x24,0xba,0x67,0xa4,0x8d, + 0x18,0x31,0x42,0x6d,0xb2,0xc9,0x26,0xaa,0x53,0xa7,0x4e,0xdc,0x3b,0x28,0x00,0x00, + 0xb5,0x21,0x37,0xdf,0x03,0x0f,0x3c,0x90,0xba,0x8c,0x08,0xea,0x63,0x8f,0x3d,0x36, + 0x75,0x99,0x95,0x2b,0x57,0xaa,0x1b,0x6f,0xbc,0x51,0xfd,0xee,0x77,0xbf,0x53,0x2f, + 0xbc,0xf0,0x82,0xfa,0xe0,0x83,0x0f,0xd2,0x6f,0xce,0xae,0x5d,0xd5,0xbe,0xfb,0xee, + 0xab,0x8e,0x3a,0xea,0x28,0x75,0xc4,0x11,0x47,0x78,0x73,0xe1,0xcb,0xd2,0xcf,0xd7, + 0x5f,0x7f,0x5d,0xfd,0xec,0x67,0x3f,0x53,0x7f,0xff,0xfb,0xdf,0xa3,0x07,0x74,0xa5, + 0x52,0xb1,0x2e,0xf7,0xce,0x3b,0xef,0x44,0x0f,0xeb,0x7a,0xed,0x57,0x3d,0xb7,0x23, + 0x0f,0xeb,0xdb,0x6e,0xbb,0x4d,0x5d,0x76,0xd9,0x65,0xea,0xd9,0x67,0x9f,0x55,0x73, + 0xe7,0xce,0x4d,0x5d,0x7e,0xab,0xad,0xb6,0x52,0x07,0x1f,0x7c,0xb0,0xfa,0xea,0x57, + 0xbf,0x1a,0x09,0xaf,0x3c,0x84,0xc7,0x5f,0xff,0xfa,0xd7,0x75,0x8e,0xfd,0xcc,0x99, + 0x33,0x83,0x7e,0x7f,0xe7,0x9d,0x77,0xaa,0x65,0xcb,0x96,0x65,0xda,0xe6,0xae,0xbb, + 0xee,0xaa,0xb6,0xd9,0x66,0x9b,0xdc,0xaf,0x4b,0x29,0x56,0x74,0xeb,0xad,0xb7,0xaa, + 0xeb,0xaf,0xbf,0x5e,0xdd,0x77,0xdf,0x7d,0x6a,0xc5,0x8a,0x15,0xde,0xdf,0x88,0x42, + 0x25,0xf7,0xcc,0x91,0x47,0x1e,0xa9,0xf6,0xd8,0x63,0x0f,0xd5,0xa5,0x4b,0x97,0xb6, + 0xbc,0x77,0xbc,0x54,0x00,0x20,0x95,0x8b,0x2f,0xbe,0x58,0xee,0x42,0x6f,0x73,0xa1, + 0x1f,0x60,0x95,0x9f,0xfc,0xe4,0x27,0x95,0x91,0x23,0x47,0x06,0xad,0xc7,0xd6,0xb4, + 0xc5,0x58,0x39,0xfe,0xf8,0xe3,0x2b,0xfa,0xa1,0x50,0xda,0x7e,0x3e,0xf5,0xd4,0x53, + 0x15,0xad,0xac,0x44,0xfb,0x1a,0xb2,0x1e,0xfd,0x10,0xab,0xcb,0x7e,0xd5,0xab,0xff, + 0xf1,0xb9,0xbe,0xe8,0xa2,0x8b,0x2a,0x1b,0x6d,0xb4,0x51,0x55,0xe7,0xb9,0x5b,0xb7, + 0x6e,0x95,0xaf,0x7c,0xe5,0x2b,0x15,0x2d,0xa8,0x6b,0xea,0xcb,0x33,0xcf,0x3c,0x53, + 0xf5,0xb5,0x56,0x6d,0x3b,0xeb,0xac,0xb3,0x72,0xbd,0x1e,0x27,0x4e,0x9c,0x58,0xd1, + 0x15,0x09,0x2b,0x5a,0x11,0xae,0x69,0xbf,0x36,0xde,0x78,0xe3,0xca,0x1d,0x77,0xdc, + 0x51,0xea,0x67,0x44,0x51,0xf7,0x8e,0x0f,0x62,0x00,0x00,0x0a,0xe4,0xe6,0x9b,0x6f, + 0x8e,0x0a,0xd9,0x7c,0xeb,0x5b,0xdf,0x8a,0x6a,0xac,0x57,0x8b,0x0c,0x0f,0x5c,0x7b, + 0xed,0xb5,0x6a,0xcb,0x2d,0xb7,0x8c,0x3c,0x08,0xf2,0x77,0x59,0x90,0x7d,0x39,0xfd, + 0xf4,0xd3,0x23,0x0b,0x50,0x3c,0x1c,0x65,0xda,0xb7,0x7a,0xf2,0xe7,0x3f,0xff,0x39, + 0x3a,0xd7,0xdf,0xf8,0xc6,0x37,0xa2,0x21,0x9d,0x6a,0x10,0xeb,0x56,0xbc,0x06,0xbb, + 0xec,0xb2,0x8b,0x7a,0xf9,0xe5,0x97,0xdb,0xf2,0x38,0x8a,0xe7,0xe1,0xfb,0xdf,0xff, + 0x7e,0xe4,0x4d,0x10,0xcb,0x5f,0x3c,0x67,0xb5,0x20,0x43,0x6c,0x87,0x1e,0x7a,0x68, + 0xe4,0x49,0x13,0xcb,0xb9,0x4c,0x34,0xfa,0xde,0x41,0x01,0x00,0x28,0x88,0x4b,0x2e, + 0xb9,0x44,0x1d,0x7d,0xf4,0xd1,0xd1,0xb8,0x65,0x5e,0xc8,0x58,0xb2,0xb6,0x10,0xa3, + 0x07,0x5a,0x56,0x17,0x6d,0x51,0x0f,0x6b,0x71,0x6b,0x8a,0xd0,0x6a,0x57,0x44,0x68, + 0x8b,0xeb,0x5e,0xaa,0x15,0xe6,0x75,0xae,0x45,0x68,0x8d,0x1b,0x37,0x4e,0x3d,0xfe, + 0xf8,0xe3,0x6d,0x75,0x2c,0x9f,0x7b,0xee,0xb9,0x48,0xf0,0xff,0xe0,0x07,0x3f,0xc8, + 0xfd,0xfa,0xbe,0xe9,0xa6,0x9b,0xd4,0x0e,0x3b,0xec,0xa0,0xfe,0xfd,0xef,0x7f,0x97, + 0x46,0xd1,0x69,0xf4,0xbd,0x83,0x02,0x00,0x90,0x33,0x62,0xb1,0x9c,0x76,0xda,0x69, + 0xea,0xec,0xb3,0xcf,0x2e,0x4c,0xa3,0xbf,0xeb,0xae,0xbb,0x22,0x8b,0x66,0xf9,0xf2, + 0xe5,0x0d,0xeb,0xa7,0x4c,0x2c,0x73,0xc8,0x21,0x87,0xb4,0x75,0x6d,0x79,0xb1,0x28, + 0xf7,0xde,0x7b,0x6f,0xf5,0xdb,0xdf,0xfe,0x36,0xf7,0x75,0x8b,0xb2,0x27,0x0a,0x64, + 0xe8,0xb8,0x7d,0xb3,0xf3,0xc4,0x13,0x4f,0xa8,0xfd,0xf6,0xdb,0x4f,0x4d,0x9a,0x34, + 0xa9,0xb0,0x6d,0xcc,0x9a,0x35,0x4b,0x1d,0x70,0xc0,0x01,0xea,0xb5,0xd7,0x5e,0x6b, + 0x68,0x5f,0xcb,0x72,0xef,0xa0,0x00,0x00,0xe4,0xcc,0x67,0x3f,0xfb,0x59,0x75,0xc5, + 0x15,0x57,0x14,0xbe,0x1d,0x09,0xd4,0x3a,0xe6,0x98,0x63,0x82,0x82,0xa2,0xf2,0x46, + 0x82,0xdc,0x24,0x68,0xcd,0x17,0xf8,0xd4,0xca,0xbc,0xf1,0xc6,0x1b,0x6a,0xa7,0x9d, + 0x76,0x2a,0xd4,0x4a,0x97,0x48,0x77,0xb9,0x9e,0x5a,0x9d,0x87,0x1f,0x7e,0x58,0x1d, + 0x74,0xd0,0x41,0x91,0xd2,0x53,0x34,0xef,0xbd,0xf7,0x5e,0x14,0x45,0x2f,0x5e,0x96, + 0x46,0x50,0xa6,0x7b,0x07,0x05,0x00,0x20,0x47,0xae,0xbe,0xfa,0x6a,0x75,0xdd,0x75, + 0xd7,0xd5,0x6d,0x7b,0x32,0x46,0xfa,0xa3,0x1f,0xfd,0xa8,0xee,0xfd,0xfc,0xf9,0xcf, + 0x7f,0xde,0x76,0xee,0x69,0xd3,0x82,0x3b,0xec,0xb0,0xc3,0x22,0x61,0x52,0x34,0xf7, + 0xdc,0x73,0x8f,0xfa,0xc7,0x3f,0xfe,0xd1,0xb2,0xc7,0xf2,0xd1,0x47,0x1f,0x8d,0xac, + 0xe1,0x05,0x0b,0x16,0x04,0xff,0x46,0x07,0x4b,0x46,0xf1,0x16,0x3b,0xee,0xb8,0xa3, + 0xda,0x7a,0xeb,0xad,0xa3,0x34,0xc0,0x2c,0x88,0xe7,0x46,0xa6,0x45,0x6e,0x04,0x65, + 0xba,0x77,0x48,0x03,0x04,0xc8,0x09,0x09,0xf2,0x3b,0xf3,0xcc,0x33,0xb3,0x69,0xe0, + 0x3a,0x1f,0xbc,0xd6,0x61,0x82,0x0b,0x2f,0xbc,0x50,0x1d,0x77,0xdc,0x71,0x51,0x2a, + 0x59,0x3d,0xd0,0xd1,0xd9,0xea,0xbc,0xf3,0xce,0xcb,0xf4,0x1b,0xc9,0x59,0x6e,0xe4, + 0x70,0x45,0x9e,0xc8,0xf9,0xd2,0x19,0x19,0xea,0x95,0x57,0x5e,0xc9,0xf4,0x3b,0xc9, + 0xfb,0x97,0xdf,0x4a,0x5a,0x5b,0x35,0xe7,0xf8,0xc0,0x03,0x0f,0x0c,0x5e,0x7e,0xd0, + 0xa0,0x41,0x6a,0xec,0xd8,0xb1,0xeb,0xa4,0x91,0x2d,0x5e,0xbc,0x38,0x4a,0x2f,0xf3, + 0xd1,0xbb,0x77,0xef,0xa8,0x1e,0x45,0x16,0x74,0xe6,0x43,0xe6,0x7e,0x89,0xc5,0x7f, + 0xc2,0x09,0x27,0x44,0xfb,0xe5,0x43,0xf2,0xfa,0xe5,0xb8,0xcb,0xb8,0xb9,0xb8,0xf1, + 0x65,0x1f,0x93,0x48,0x0a,0x9d,0x28,0xc4,0xbf,0xfa,0xd5,0xaf,0x82,0x82,0xfd,0xee, + 0xbf,0xff,0xfe,0x28,0xb0,0x56,0xd6,0x59,0x2f,0x4a,0x77,0xef,0x90,0xe4,0x05,0x90, + 0x4f,0x8a,0x8f,0x76,0x61,0x7a,0x97,0xd1,0xf9,0xc9,0x95,0xf3,0xcf,0x3f,0xbf,0xa2, + 0x2d,0xba,0x8a,0x2e,0xf0,0x51,0xd1,0xf1,0x02,0xd1,0x36,0x96,0x2e,0x5d,0x5a,0xd1, + 0x02,0xa5,0x72,0xc1,0x05,0x17,0x54,0x74,0x10,0x54,0xe6,0x54,0xa7,0x3d,0xf7,0xdc, + 0xb3,0xa2,0x85,0x4b,0x5d,0xfa,0x29,0xdb,0xf2,0x2d,0xb3,0xd7,0x5e,0x7b,0x55,0xf4, + 0xb8,0x78,0x45,0xe7,0x6d,0x77,0xa4,0x2c,0xe9,0x5c,0xf8,0xca,0x83,0x0f,0x3e,0x58, + 0xf9,0xc5,0x2f,0x7e,0x51,0x39,0xe7,0x9c,0x73,0x2a,0xfa,0xa1,0xdf,0x94,0x69,0x80, + 0x3a,0xb6,0x23,0x68,0x39,0x9d,0xb1,0x51,0xb9,0xf4,0xd2,0x4b,0x2b,0xda,0xbd,0x5d, + 0xd1,0x63,0xcf,0x1d,0xdb,0xd1,0x6e,0xfd,0x8a,0xce,0xf3,0xae,0x6c,0xbf,0xfd,0xf6, + 0x99,0xce,0xb1,0x16,0x70,0x35,0xf7,0x71,0xc6,0x8c,0x19,0x41,0xdb,0xd2,0x19,0x0d, + 0x75,0xb9,0xb7,0x74,0xe0,0x64,0xd0,0xfe,0xe8,0xe0,0xbd,0xca,0xd3,0x4f,0x3f,0x1d, + 0xb4,0x4e,0xed,0x49,0xa8,0x9c,0x71,0xc6,0x19,0x41,0xeb,0xd5,0x4a,0x4e,0x45,0x2b, + 0x21,0x75,0xbb,0x76,0xea,0x7d,0xef,0xf8,0x40,0x01,0x00,0xc8,0xe9,0xe6,0x4e,0x6b, + 0xda,0x7a,0xab,0xdc,0x72,0xcb,0x2d,0x1d,0x02,0xdf,0x87,0x4e,0xf5,0xab,0xe8,0xc2, + 0x21,0x99,0xb6,0xa1,0x87,0x1f,0x1a,0xde,0x4f,0x1d,0xb9,0x5e,0xb9,0xf7,0xde,0x7b, + 0x4b,0x95,0x63,0x5d,0xcf,0xfe,0x4b,0xd3,0x85,0x7c,0x2a,0x7f,0xfa,0xd3,0x9f,0xbc, + 0xe7,0x5a,0x57,0xb0,0x8b,0x72,0xbf,0x43,0xd7,0xab,0xe3,0x4a,0x5a,0x4a,0x01,0xd0, + 0x01,0x70,0x41,0xfb,0xa2,0x0b,0xf9,0x54,0x25,0xa4,0xbf,0xf3,0x9d,0xef,0x04,0xad, + 0x5f,0xa7,0x1c,0x96,0xe2,0xda,0x29,0xe2,0xde,0xa1,0x0e,0x00,0x40,0x03,0x91,0xb1, + 0x49,0xc9,0xef,0x95,0x71,0x5c,0x5d,0xd4,0x24,0xb8,0x22,0x99,0x64,0x11,0x48,0x05, + 0x39,0x71,0x1b,0x87,0xd2,0xc8,0x74,0xa2,0xfe,0xfd,0xfb,0x47,0x95,0xef,0xfe,0xf9, + 0xcf,0x7f,0x46,0x01,0x56,0xed,0x88,0x8c,0x4b,0xff,0xfa,0xd7,0xbf,0x8e,0x22,0xcc, + 0x3f,0xf7,0xb9,0xcf,0x79,0xcf,0xb5,0x54,0x86,0x93,0xea,0x76,0x52,0xdb,0x21,0x84, + 0x87,0x1e,0x7a,0xa8,0x65,0x8e,0x95,0x94,0xef,0x95,0x6b,0xdc,0x87,0x54,0x45,0x94, + 0x8c,0x17,0xb9,0xbe,0xb2,0x22,0xb1,0x31,0x12,0xa7,0xe1,0xe3,0xaa,0xab,0xae,0x6a, + 0xe8,0xb1,0x68,0xe4,0xbd,0x83,0x02,0x00,0x50,0x10,0x12,0xe9,0xfb,0xd2,0x4b,0x2f, + 0x45,0xe5,0x48,0xab,0x41,0x6a,0xc4,0x6b,0xaf,0x81,0xea,0xd1,0xa3,0x47,0xd0,0xf2, + 0x12,0x58,0x94,0x75,0x5c,0x3a,0x0f,0xa4,0x36,0xb9,0x44,0x34,0x87,0x3c,0x6c,0x5b, + 0x95,0x7e,0xfd,0xfa,0x45,0x59,0x19,0xda,0xf5,0x1c,0x95,0x70,0x0e,0x45,0xc6,0xb5, + 0xbf,0xf8,0xc5,0x2f,0x06,0x2d,0x2b,0xe5,0xa3,0x5b,0x85,0x3f,0xfe,0xf1,0x8f,0x51, + 0x4a,0x9e,0xef,0xd8,0xfc,0xe1,0x0f,0x7f,0x50,0x7d,0xfb,0xf6,0xad,0x7a,0x3b,0x12, + 0x70,0xe7,0xab,0x99,0x2f,0xb5,0xf6,0x45,0xf8,0x36,0x82,0x46,0xdf,0x3b,0x28,0x00, + 0x00,0x05,0xa0,0xcb,0xc1,0x46,0x96,0x4b,0xd6,0x40,0x2a,0x13,0x29,0x06,0x23,0x55, + 0xd1,0x42,0xb9,0xf2,0xca,0x2b,0xeb,0xda,0x4f,0x5d,0xde,0x58,0x3d,0xf2,0xc8,0x23, + 0x51,0x34,0x76,0xbb,0x22,0x35,0xd9,0xe5,0x18,0x64,0x09,0xd2,0x4b,0x22,0xde,0x82, + 0x10,0xa5,0xa1,0x9a,0xe0,0xc1,0x32,0x22,0x43,0xcf,0xe2,0x29,0xf1,0x21,0xb5,0xfc, + 0xf5,0x78,0x78,0x4d,0xdb,0x92,0x40,0xc8,0xf1,0xe3,0xc7,0x97,0xd2,0x0b,0x50,0x86, + 0x7b,0x07,0x05,0x00,0x20,0x67,0xe4,0xe1,0xf6,0xf5,0xaf,0x7f,0x3d,0xb7,0xf5,0x89, + 0x55,0x19,0x3a,0x11,0x90,0xa4,0x21,0x56,0x1c,0x13,0x88,0xe4,0x8d,0xcc,0xbc,0x26, + 0x96,0x53,0xa8,0x0b,0xbb,0x15,0x91,0xbe,0x4b,0x01,0x1b,0x1d,0xd0,0x57,0xf5,0x3a, + 0x64,0x06,0xc8,0x10,0x21,0x30,0x67,0xce,0x9c,0x96,0x38,0x66,0xe2,0x29,0x91,0x68, + 0xf8,0x90,0xeb,0x3e,0x0f,0x42,0x26,0x6f,0x92,0x82,0x3c,0xf5,0xba,0x6f,0xca,0x74, + 0xef,0xa0,0x00,0x00,0xe4,0xc8,0x6f,0x7e,0xf3,0x9b,0xdc,0x1e,0x5c,0x31,0x32,0x56, + 0xfc,0xb5,0xaf,0x7d,0x2d,0x68,0x59,0xc9,0x4b,0x97,0x02,0x35,0xf5,0xe0,0xf7,0xbf, + 0xff,0x7d,0x94,0x8b,0xdd,0xae,0x0c,0x1c,0x38,0x50,0xe9,0x49,0x66,0x72,0x99,0xca, + 0x57,0x04,0x82,0x0f,0x49,0x05,0x93,0x59,0xfe,0x9a,0x1d,0x9d,0x19,0xe1,0x5d,0x66, + 0xb3,0xcd,0x36,0x53,0xfb,0xec,0xb3,0x4f,0x2e,0xdb,0xfb,0xc4,0x27,0x3e,0xa1,0x7a, + 0xf6,0xec,0xe9,0x55,0xae,0x64,0x46,0xbf,0x7a,0x51,0x96,0x7b,0x07,0x05,0x00,0x20, + 0x27,0x24,0x08,0x4f,0x26,0xf6,0x28,0x02,0xa9,0xf8,0x17,0x8a,0x9e,0x09,0xae,0xf0, + 0xbe,0x9e,0x72,0xca,0x29,0xea,0x53,0x9f,0xfa,0x54,0xdb,0x9e,0x6b,0x19,0x9f,0x96, + 0xc9,0x7f,0x36,0xdd,0x74,0xd3,0x5c,0xd6,0x17,0x1a,0xec,0x59,0x4f,0x2b,0xb5,0x08, + 0x74,0xba,0xab,0xd2,0xe9,0x6c,0xde,0xe5,0xaa,0x1d,0x4e,0xb1,0x21,0x31,0x00,0x21, + 0x35,0x32,0x9e,0x7f,0xfe,0xf9,0xba,0x1c,0x83,0x32,0xdd,0x3b,0x28,0x00,0x00,0x39, + 0xf1,0xe5,0x2f,0x7f,0xb9,0xb0,0x75,0xeb,0x29,0x4d,0x83,0xe7,0x5a,0x2f,0x5a,0x01, + 0x18,0x33,0x66,0x8c,0xd2,0xf9,0xc8,0x6d,0x7d,0xae,0xbf,0xfb,0xdd,0xef,0xe6,0xfa, + 0x10,0x0f,0x1d,0xe2,0x69,0x76,0x74,0x2e,0x7f,0x50,0x51,0x9b,0xbc,0xa3,0xe1,0x43, + 0xee,0x9d,0x7a,0x28,0x00,0x65,0xbb,0x77,0x50,0x00,0x00,0x9a,0x04,0xc9,0x2a,0x28, + 0x83,0x02,0xa0,0x73,0xdc,0x6b,0x8a,0xcc,0x6e,0x76,0xa4,0x6c,0xed,0xf7,0xbe,0xf7, + 0xbd,0x5c,0xd7,0xd9,0x2e,0x0a,0x80,0x94,0xfd,0x0d,0x61,0xb7,0xdd,0x76,0xcb,0x5d, + 0xf0,0x96,0x41,0x01,0x28,0xdb,0xbd,0x83,0x02,0x00,0xd0,0x24,0x84,0x7a,0x00,0x8a, + 0x4e,0x05,0xd4,0xd5,0xcc,0xda,0xfa,0x3c,0xfc,0xe5,0x2f,0x7f,0x89,0x4a,0x38,0xe7, + 0x89,0x6f,0x8c,0xba,0x9d,0x14,0x00,0x39,0x16,0x92,0x59,0x91,0x27,0x92,0xa6,0xe9, + 0x43,0x4a,0x09,0x17,0x4d,0xd9,0xee,0x1d,0xe6,0x02,0x00,0x68,0x12,0xa4,0x2e,0x40, + 0x08,0xba,0x6c,0x28,0x07,0xab,0x40,0xa4,0xce,0x3e,0x54,0xc7,0x53,0x4f,0x3d,0xe5, + 0x5d,0x46,0x66,0xcb,0x93,0xd9,0x01,0xf3,0x64,0xc2,0x84,0x09,0xde,0x65,0xea,0x31, + 0x13,0x61,0xd9,0x40,0x01,0x00,0x68,0x31,0x05,0x40,0xa6,0x07,0x96,0x68,0xf1,0x5e, + 0xbd,0x7a,0x71,0xd0,0xa0,0x34,0xe8,0xd2,0xc8,0x41,0xb5,0x0c,0xe4,0xfa,0xcd,0x2b, + 0x03,0x20,0x0b,0x32,0xc3,0x63,0xbb,0xc1,0x10,0x00,0x40,0x13,0x59,0x9e,0xa1,0x55, + 0x01,0xdb,0xd1,0x9a,0x81,0x72,0xf3,0xc1,0x07,0x1f,0x94,0x3a,0x8b,0x41,0x66,0x24, + 0x14,0xef,0x03,0x0a,0x00,0x00,0x94,0x12,0xa9,0x09,0x10,0xfa,0xb0,0x05,0x28,0x13, + 0xcd,0x50,0xc9,0xb0,0xdd,0xbc,0x00,0x28,0x00,0x00,0x2d,0xa8,0x00,0xe8,0x29,0x51, + 0x39,0x58,0x50,0x2a,0x9a,0xa1,0x92,0x61,0xbb,0xdd,0x37,0x28,0x00,0x00,0x4d,0x44, + 0xef,0xde,0xbd,0x83,0x96,0xcb,0x32,0x21,0x0d,0x40,0x3d,0x68,0x86,0xe0,0xd4,0xd5, + 0xab,0x57,0xa3,0x00,0x00,0x40,0x39,0x91,0x00,0xa9,0x10,0x06,0x0c,0x18,0xc0,0xc1, + 0x02,0x84,0x6b,0x46,0xda,0x4d,0x71,0x46,0x01,0x00,0x68,0x22,0x16,0x2d,0x5a,0x14, + 0xb4,0x9c,0xd4,0xa9,0x07,0x28,0x13,0x83,0x07,0x0f,0x46,0x01,0x40,0x01,0x00,0x80, + 0xa2,0x15,0x00,0x3c,0x00,0x50,0x36,0xd6,0x5b,0x6f,0xbd,0xa0,0xe5,0xa4,0xca,0xa2, + 0x64,0x0b,0x34,0xa2,0x85,0x4c,0xca,0x84,0x02,0x00,0x00,0x0d,0x41,0x52,0x95,0x7c, + 0x48,0xd5,0xb3,0x2e,0x5d,0xba,0x70,0xb0,0xa0,0x29,0x15,0x80,0x90,0xa2,0x3d,0x80, + 0x02,0x00,0xd0,0x56,0xc8,0x54,0xbf,0x21,0xe3,0xa8,0xb8,0xff,0xa1,0x8c,0x48,0x1d, + 0x8b,0x10,0xc5,0x14,0x05,0x00,0x05,0x00,0x00,0x0c,0x5e,0x7b,0xed,0xb5,0xa0,0xe5, + 0x36,0xdf,0x7c,0x73,0x0e,0x16,0x94,0x0e,0x99,0x42,0x79,0xc8,0x90,0x21,0xde,0xe5, + 0x26,0x4e,0x9c,0x18,0x3c,0xd4,0x05,0x28,0x00,0x00,0x28,0x00,0x09,0x76,0xd9,0x65, + 0x17,0x0e,0x16,0x94,0x92,0x9d,0x76,0xda,0xc9,0xbb,0x8c,0x94,0x0c,0xbe,0xfb,0xee, + 0xbb,0x39,0x58,0x28,0x00,0x00,0x80,0x02,0x00,0xad,0xc2,0xfe,0xfb,0xef,0x1f,0xb4, + 0xdc,0x2d,0xb7,0xdc,0xc2,0xc1,0x42,0x01,0x00,0x80,0x98,0xd0,0xb9,0xd4,0x51,0x00, + 0xa0,0xac,0xec,0xb7,0xdf,0x7e,0x41,0xcb,0xdd,0x79,0xe7,0x9d,0x91,0x27,0x00,0x50, + 0x00,0x00,0xda,0x9e,0xf7,0xdf,0x7f,0x5f,0x3d,0xfd,0xf4,0xd3,0xde,0xe5,0x86,0x0e, + 0x1d,0xaa,0x46,0x8d,0x1a,0xc5,0x01,0x83,0x9a,0x58,0xb6,0x6c,0x59,0x21,0xeb,0xdd, + 0x7e,0xfb,0xed,0x83,0xe2,0x00,0xa4,0x6c,0xf0,0xdf,0xfe,0xf6,0x37,0x4e,0x04,0x0a, + 0x00,0x00,0xfc,0xfd,0xef,0x7f,0x0f,0xca,0x00,0x38,0xe4,0x90,0x43,0x38,0x58,0x50, + 0x33,0xef,0xbe,0xfb,0x6e,0x31,0x02,0xa7,0x73,0xe7,0x60,0x2f,0xc0,0xf9,0xe7,0x9f, + 0xdf,0x76,0xb3,0xf3,0xa1,0x00,0x00,0xc0,0x3a,0xfc,0xe5,0x2f,0x7f,0x09,0x5a,0xee, + 0x94,0x53,0x4e,0xe1,0x60,0x81,0x93,0xd0,0xfa,0x10,0xd3,0xa6,0x4d,0x2b,0x6c,0x1f, + 0xce,0x38,0xe3,0x8c,0xa0,0xe5,0x24,0xe6,0xe5,0x9a,0x6b,0xae,0xe1,0xa4,0xa1,0x00, + 0x00,0x94,0x9f,0xa5,0x4b,0x97,0x16,0xb2,0x5e,0x19,0xfb,0xbf,0xf7,0xde,0x7b,0xbd, + 0xcb,0x6d,0xb9,0xe5,0x96,0xea,0xe3,0x1f,0xff,0x38,0x27,0x02,0x9c,0x48,0x8d,0x08, + 0x49,0xc7,0xf3,0xf1,0xce,0x3b,0xef,0x14,0xb6,0x0f,0x7b,0xee,0xb9,0xa7,0xda,0x7b, + 0xef,0xbd,0x83,0x96,0x3d,0xe7,0x9c,0x73,0x0a,0xf3,0x46,0x00,0x0a,0x00,0x40,0x6e, + 0x88,0xf0,0x7d,0xeb,0xad,0xb7,0x72,0x5f,0xef,0x79,0xe7,0x9d,0x17,0xb4,0xdc,0xc9, + 0x27,0x9f,0xcc,0x49,0x80,0x54,0xa4,0xd6,0xbd,0x14,0xe4,0xf1,0xf1,0xe6,0x9b,0x6f, + 0x16,0xba,0x1f,0xe7,0x9e,0x7b,0x6e,0xd0,0x72,0x52,0xfc,0xea,0xe8,0xa3,0x8f,0x56, + 0xcb,0x97,0x2f,0xe7,0xe4,0xa1,0x00,0x00,0x94,0x97,0xe7,0x9e,0x7b,0x2e,0xca,0x73, + 0x0e,0xb1,0xd6,0x43,0xb9,0xec,0xb2,0xcb,0xd4,0x03,0x0f,0x3c,0xe0,0x5d,0xae,0x67, + 0xcf,0x9e,0xea,0x73,0x9f,0xfb,0x1c,0x27,0x01,0xbc,0xac,0xbf,0xfe,0xfa,0xde,0x65, + 0xfe,0xfd,0xef,0x7f,0xab,0x27,0x9f,0x7c,0xb2,0xb0,0x7d,0x38,0xe0,0x80,0x03,0xd4, + 0x6e,0xbb,0xed,0x16,0xb4,0xec,0xe3,0x8f,0x3f,0x1e,0x0d,0x6d,0x85,0xce,0x84,0x09, + 0x28,0x00,0x00,0x0d,0x61,0xf6,0xec,0xd9,0xea,0xe0,0x83,0x0f,0x56,0xdf,0xff,0xfe, + 0xf7,0x6b,0x1e,0x12,0xb8,0xe7,0x9e,0x7b,0xd4,0x59,0x67,0x9d,0x15,0x6c,0x51,0x6d, + 0xb0,0xc1,0x06,0x9c,0x00,0xf0,0xb2,0xd9,0x66,0x9b,0x05,0x2d,0xf7,0xa3,0x1f,0xfd, + 0xa8,0xd0,0xfd,0xb8,0xf4,0xd2,0x4b,0x55,0xf7,0xee,0xdd,0x83,0x96,0xbd,0xfa,0xea, + 0xab,0x23,0xa5,0x61,0xe6,0xcc,0x99,0x85,0xec,0x8b,0x04,0x1b,0x4a,0xe6,0x01,0x0a, + 0x00,0x00,0xd4,0xfc,0x30,0xf9,0xc1,0x0f,0x7e,0x10,0x8d,0xc9,0xdf,0x70,0xc3,0x0d, + 0x55,0xad,0xe3,0x8f,0x7f,0xfc,0xa3,0x3a,0xea,0xa8,0xa3,0x82,0x72,0xa1,0x3f,0xf2, + 0x91,0x8f,0xa8,0xaf,0x7f,0xfd,0xeb,0x1c,0x78,0x08,0x22,0x34,0x53,0xe4,0x8e,0x3b, + 0xee,0x50,0xf7,0xdf,0x7f,0x7f,0x61,0xfb,0x21,0xf5,0x2a,0x7e,0xf9,0xcb,0x5f,0x06, + 0x2f,0xff,0xf0,0xc3,0x0f,0xab,0x9d,0x77,0xde,0x59,0x5d,0x7b,0xed,0xb5,0x41,0x19, + 0x31,0x3e,0xe6,0xcd,0x9b,0x17,0xa5,0x1a,0x9e,0x78,0xe2,0x89,0x51,0xfa,0xec,0x76, + 0xdb,0x6d,0xd7,0x76,0xd7,0x42,0x57,0x6e,0x87,0xe6,0x44,0xdc,0x73,0x7f,0xfd,0xeb, + 0x5f,0xd5,0xeb,0xaf,0xbf,0xae,0xfa,0xf4,0xe9,0xa3,0x7a,0xf7,0xee,0xad,0x7a,0xf5, + 0xea,0x15,0xbd,0x97,0x57,0xf9,0x3b,0xd9,0x42,0xbe,0x93,0x14,0x1d,0xc8,0x0f,0x89, + 0x07,0x18,0x3f,0x7e,0xbc,0xda,0x63,0x8f,0x3d,0xd4,0x69,0xa7,0x9d,0xa6,0x3e,0xfd, + 0xe9,0x4f,0x47,0xc7,0x39,0x8d,0x57,0x5e,0x79,0x45,0x7d,0xe7,0x3b,0xdf,0x51,0x37, + 0xdf,0x7c,0x73,0xd0,0x36,0x24,0xa0,0xeb,0x8a,0x2b,0xae,0x50,0xdd,0xba,0x75,0xe3, + 0x80,0x43,0x10,0x9f,0xfc,0xe4,0x27,0x83,0x97,0x3d,0xf0,0xc0,0x03,0xa3,0xa8,0xfd, + 0x1f,0xff,0xf8,0xc7,0xde,0x6b,0xb7,0x1a,0xbe,0xfc,0xe5,0x2f,0x47,0x2e,0x7e,0xb1, + 0xf0,0x43,0x78,0xfb,0xed,0xb7,0xd5,0x09,0x27,0x9c,0x10,0x29,0xd8,0xdf,0xfc,0xe6, + 0x37,0xd5,0xa1,0x87,0x1e,0x1a,0x3c,0xcb,0xa0,0xf0,0xc6,0x1b,0x6f,0xa8,0xdb,0x6f, + 0xbf,0x3d,0x52,0x6e,0x44,0xa1,0x48,0x0e,0x2b,0x88,0x12,0x80,0x02,0x00,0xa5,0x45, + 0xb4,0x5e,0x19,0x0f,0xbe,0xee,0xba,0xeb,0xd4,0x94,0x29,0x53,0xa2,0x87,0xbf,0xcc, + 0x61,0x2d,0x17,0xf1,0x07,0x1f,0x7c,0x10,0xbd,0x8f,0x3f,0x8b,0x85,0x43,0xfc,0x59, + 0x08,0xb2,0xac,0x6c,0x43,0xac,0x4e,0xb1,0x62,0xa5,0xc9,0xba,0xe3,0x57,0x69,0xb1, + 0x45,0x2a,0xcb,0xc5,0xdb,0x49,0x6e,0x43,0xd2,0x8c,0x7a,0xf4,0xe8,0x11,0xb9,0xf6, + 0x64,0x5c,0x3a,0x56,0x38,0x62,0x25,0x45,0xa6,0xaa,0xed,0xdb,0xb7,0x6f,0xf4,0x2a, + 0x4d,0xe6,0xad,0x8f,0x9b,0x44,0x28,0x4b,0x80,0x92,0x34,0xf9,0x2e,0x74,0xbf,0xcb, + 0x8e,0x44,0xf1,0x4b,0x93,0x63,0x70,0xf8,0xe1,0x87,0x47,0x63,0x9f,0x1b,0x6d,0xb4, + 0x91,0xda,0x70,0xc3,0x0d,0xa3,0x61,0x02,0x89,0x72,0x9e,0x34,0x69,0x92,0xba,0xfe, + 0xfa,0xeb,0xd5,0xf3,0xcf,0x3f,0x9f,0x69,0xdd,0xa7,0x9e,0x7a,0x6a,0xa4,0x60,0x00, + 0x84,0xb2,0xf1,0xc6,0x1b,0x47,0xd6,0x77,0x48,0x61,0x29,0xb9,0xcf,0x7f,0xf5,0xab, + 0x5f,0x45,0x0a,0xe9,0x41,0x07,0x1d,0x14,0x79,0xb5,0xb6,0xd8,0x62,0x8b,0x68,0x1d, + 0xe2,0x8e,0x7f,0xf9,0xe5,0x97,0x23,0xa5,0x55,0x84,0xe7,0x77,0xbf,0xfb,0xdd,0xaa, + 0xf6,0xe7,0xf2,0xcb,0x2f,0x8f,0xae,0xfb,0x97,0x5e,0x7a,0x29,0xf8,0x37,0x92,0x22, + 0x78,0xd2,0x49,0x27,0x45,0xcf,0x08,0xb1,0xdc,0xf7,0xd9,0x67,0x1f,0xb5,0xc9,0x26, + 0x9b,0x44,0x45,0x86,0xe4,0x39,0x23,0x93,0x09,0xcd,0x9d,0x3b,0x37,0x52,0xc2,0xa5, + 0x89,0xe2,0x20,0xaf,0x12,0x54,0x08,0x28,0x00,0x4d,0x41,0x2c,0x60,0xa5,0x2a,0x97, + 0x4c,0x8e,0x21,0xee,0x64,0xa9,0x08,0x97,0x14,0xb8,0x49,0x21,0x29,0x16,0xbc,0x7c, + 0x17,0x5b,0xf2,0xf1,0xfb,0x78,0x3d,0x3e,0x64,0x59,0x59,0x9f,0x44,0x0a,0x27,0x05, + 0x7b,0xa8,0x42,0x91,0x5c,0x5e,0x9a,0x28,0x0b,0xd2,0xe4,0x46,0x94,0x87,0x85,0x28, + 0x12,0xf1,0x67,0xf1,0x7b,0xf3,0xb3,0x58,0xe1,0x90,0xdf,0xf7,0xef,0xdf,0xbf,0x43, + 0x29,0x10,0x2d,0x5f,0x9a,0x04,0x30,0x49,0x93,0x07,0x8e,0x8c,0x79,0xcb,0xeb,0xb0, + 0x61,0xc3,0xa2,0xef,0xca,0xee,0xc1,0x90,0x87,0x92,0xe4,0x35,0xe7,0x95,0xdb,0x2c, + 0xd6,0xcf,0xaf,0x7f,0xfd,0x6b,0x6e,0x14,0xc8,0xcc,0x25,0x97,0x5c,0xa2,0xf6,0xda, + 0x6b,0xaf,0xe0,0xe5,0x45,0x80,0xfe,0xfe,0xf7,0xbf,0x77,0x7e,0x2f,0xca,0x6c,0xb5, + 0x0a,0x80,0x08,0xec,0x7f,0xfc,0xe3,0x1f,0xea,0x3f,0xfe,0xe3,0x3f,0xd4,0x53,0x4f, + 0x3d,0x95,0xf9,0x19,0xf9,0xc2,0x0b,0x2f,0x44,0x0d,0x50,0x00,0x5a,0x4a,0xf0,0x2f, + 0x58,0xb0,0x40,0xdd,0x7a,0xeb,0xad,0x91,0xf6,0x9d,0x9c,0x1e,0x33,0xcd,0x32,0x4e, + 0x7e,0x67,0x53,0x12,0x7c,0xf8,0x7e,0x1f,0xb2,0x6d,0x79,0x95,0x26,0x5e,0x80,0xd0, + 0x20,0x1f,0xdf,0xf1,0x98,0x3f,0x7f,0x7e,0x14,0xa4,0x23,0xd6,0x46,0xac,0x30,0x24, + 0x15,0x08,0xb1,0x54,0xc4,0xdb,0x20,0x9e,0x03,0x51,0x1a,0xc4,0x12,0x10,0x05,0x61, + 0xc4,0x88,0x11,0x6a,0xf4,0xe8,0xd1,0x91,0xc5,0x3d,0x76,0xec,0xd8,0xe8,0xbb,0xa2, + 0xf8,0xf6,0xb7,0xbf,0xad,0x2e,0xb8,0xe0,0x82,0xba,0x5c,0x23,0x52,0x4d,0x4d,0x3c, + 0x06,0xb8,0xfe,0xa1,0x1a,0x24,0x17,0xff,0xd8,0x63,0x8f,0x8d,0xbc,0x89,0x65,0x40, + 0x14,0xf9,0x07,0x1f,0x7c,0x30,0x1a,0x8f,0xbf,0xf1,0xc6,0x1b,0x39,0x41,0x28,0x00, + 0xed,0x29,0xf4,0x45,0xa0,0x89,0x36,0x2c,0xd6,0xbe,0x54,0xe3,0x4a,0x5a,0xe0,0x36, + 0x81,0x9b,0xb4,0xc8,0x4d,0x8b,0x3d,0xeb,0xf2,0xd5,0x0c,0x19,0xd4,0xf2,0xfb,0xd0, + 0xf5,0x0b,0x22,0xe8,0x4c,0x61,0xe7,0xea,0x8f,0x78,0x11,0x66,0xcc,0x98,0x11,0xb5, + 0x17,0x5f,0x7c,0x31,0xfa,0x4e,0x14,0x08,0x19,0x92,0x88,0x83,0x9a,0x8a,0x18,0x5e, + 0x90,0x71,0x52,0x19,0xde,0x10,0x45,0xa0,0x48,0xc6,0x8d,0x1b,0xa7,0x6e,0xbb,0xed, + 0xb6,0xa8,0x3f,0x00,0xd5,0x22,0x51,0xf8,0x13,0x26,0x4c,0x88,0x52,0xfe,0xca,0x80, + 0x28,0xf0,0xa2,0xd4,0x7e,0xe3,0x1b,0xdf,0x50,0x3f,0xfb,0xd9,0xcf,0x38,0x41,0x75, + 0x80,0xa8,0xaf,0x12,0x08,0xfe,0x25,0x4b,0x96,0x44,0x17,0xfe,0x71,0xc7,0x1d,0xa7, + 0x3e,0xf6,0xb1,0x8f,0x45,0x91,0xb1,0x52,0x89,0x2b,0x76,0x69,0xcb,0x6b,0xec,0x9e, + 0x8f,0x5f,0x5d,0x43,0x00,0xb5,0x2c,0x9f,0xfc,0xcc,0x66,0xd1,0x67,0xfd,0x7d,0xcd, + 0x17,0x67,0x0e,0xfd,0x17,0x2f,0xca,0xc2,0x85,0x0b,0xd5,0xc8,0x91,0x23,0x23,0xaf, + 0x40,0x32,0x6e,0x21,0x6e,0x79,0xf2,0xad,0x6f,0x7d,0x4b,0xfd,0xe1,0x0f,0x7f,0x08, + 0x2a,0xb6,0x92,0x15,0x89,0xaf,0x90,0x87,0xe3,0x7d,0xf7,0xdd,0x57,0x48,0x40,0x16, + 0xb4,0x17,0x32,0x94,0x26,0x0a,0xf1,0xb6,0xdb,0x6e,0x5b,0x9a,0x7d,0x92,0x7b,0xf6, + 0xa7,0x3f,0xfd,0xa9,0xba,0xeb,0xae,0xbb,0xda,0x32,0x2a,0x1f,0x05,0xa0,0x4d,0x84, + 0xbe,0xb4,0x7f,0xfe,0xf3,0x9f,0xea,0x8b,0x5f,0xfc,0xa2,0xda,0x7c,0xf3,0xcd,0xd5, + 0x45,0x17,0x5d,0x14,0x59,0xa9,0xf1,0x58,0x76,0x9a,0xfb,0x3d,0x16,0x80,0x66,0xcb, + 0x7b,0xf9,0x5a,0xbf,0xaf,0xb5,0xd5,0xd2,0x1f,0x09,0x8a,0x94,0x21,0x83,0xe1,0xc3, + 0x87,0x47,0xc3,0x00,0xe6,0xb1,0x4f,0x0a,0xfe,0xbc,0x95,0x80,0x2f,0x7c,0xe1,0x0b, + 0x51,0x90,0x92,0xbc,0xe6,0xe5,0x69,0x90,0x87,0xb4,0x64,0x7e,0x5c,0x78,0xe1,0x85, + 0x58,0xfe,0x90,0xab,0x12,0x20,0x81,0xc5,0x5f,0xf9,0xca,0x57,0x72,0x19,0xae,0xcb, + 0x0b,0xa9,0xa5,0xf1,0xaf,0x7f,0xfd,0x4b,0x5d,0x75,0xd5,0x55,0xd1,0xf0,0x5d,0x91, + 0x88,0x67,0x51,0xbc,0x6a,0xa7,0x9f,0x7e,0x3a,0x0a,0x00,0x14,0x2b,0xf4,0xc5,0xc5, + 0x2f,0xb9,0xa7,0x62,0xe9,0x1f,0x79,0xe4,0x91,0xea,0xd5,0x57,0x5f,0x8d,0x1e,0xee, + 0x32,0x06,0x66,0x0a,0xb4,0xa4,0xd5,0x6b,0xb3,0x80,0xf3,0x6e,0xb5,0x6e,0x2f,0xef, + 0xfd,0xad,0x66,0x7d,0x12,0x70,0x38,0x7d,0xfa,0xf4,0x68,0xfc,0x5f,0xc6,0xfe,0x93, + 0x41,0x89,0xf1,0x79,0x88,0x33,0x18,0xcc,0xcf,0xf3,0x54,0x04,0xe4,0xc1,0x2a,0x9e, + 0x80,0x47,0x1e,0x79,0x24,0x4a,0x05,0xac,0xc6,0x62,0x8f,0x67,0x4e,0x93,0xe0,0xab, + 0x67,0x9f,0x7d,0x36,0xaa,0x32,0x58,0x24,0x32,0x7c,0xe1,0xa3,0x11,0x9e,0x87,0x7a, + 0xed,0x57,0x23,0xfb,0x1f,0xb2,0x5e,0x51,0xfc,0x42,0x27,0xf3,0xc9,0x82,0x78,0xc6, + 0x7e,0xfb,0xdb,0xdf,0x46,0x29,0xc5,0x62,0x90,0x14,0xb1,0x8d,0x6a,0x3d,0x80,0x12, + 0x13,0x20,0xca,0xf4,0x95,0x57,0x5e,0xa9,0x8e,0x38,0xe2,0x88,0x28,0xc6,0xa7,0x56, + 0xe4,0x38,0xca,0x5c,0x04,0x52,0x62,0x5b,0xaa,0x76,0x8a,0xb1,0x20,0xc6,0x58,0xb5, + 0x41,0x8c,0x65,0xbe,0x77,0xbc,0x1e,0x97,0x4a,0xde,0xe6,0x0f,0xac,0x23,0xf8,0x63, + 0x64,0x6c,0x5f,0x5c,0xc4,0x92,0x8a,0xb2,0xe9,0xa6,0x9b,0x06,0x5d,0x34,0xf5,0xde, + 0xd7,0x6a,0xa3,0xfe,0x43,0x96,0x2f,0x12,0xb1,0xf6,0xc5,0x83,0x22,0xd6,0x42,0x7c, + 0xa3,0xd9,0x62,0x22,0x24,0x02,0xdf,0xe6,0x35,0x48,0x0b,0x74,0x94,0x88,0xe9,0xb3, + 0xcf,0x3e,0x3b,0xd3,0xb9,0x36,0x91,0x61,0x1e,0x71,0x6b,0x4a,0x40,0xa7,0x3c,0xd0, + 0x24,0xf5,0x4f,0xae,0x03,0x09,0x60,0x94,0xb4,0x49,0x89,0x5b,0x88,0x83,0x16,0x65, + 0xb8,0x42,0x04,0xff,0x31,0xc7,0x1c,0x13,0x79,0x30,0x00,0xea,0xc9,0xc4,0x89,0x13, + 0xa3,0x40,0x3c,0xc9,0x99,0x97,0xf4,0x54,0x69,0x32,0x24,0x29,0x1e,0x02,0xc9,0x48, + 0x12,0x05,0x61,0xf0,0xe0,0xc1,0x6a,0xcc,0x98,0x31,0x51,0x61,0x1e,0x49,0x43,0x95, + 0x34,0xbc,0x7a,0x5c,0xab,0x72,0x9f,0x88,0x52,0x2d,0xd3,0x63,0x4b,0xda,0xa0,0x64, + 0x45,0x49,0x93,0x2c,0x23,0xf9,0x4e,0xee,0x25,0xd9,0x47,0x51,0x14,0x64,0x7f,0x24, + 0x43,0x48,0x5e,0xa5,0x49,0xa6,0x82,0xa4,0xe0,0xee,0xba,0xeb,0xae,0xd1,0x72,0x80, + 0x02,0x50,0x17,0xc1,0x2f,0x0f,0xfa,0xaf,0x7e,0xf5,0xab,0x91,0x15,0x27,0xb9,0xaa, + 0xb1,0x0b,0xb7,0xd6,0xa0,0x3c,0xdf,0xf2,0x59,0x83,0x02,0x6b,0x5d,0x7f,0xbd,0x83, + 0x12,0xe5,0xbb,0x38,0xc5,0x50,0xf2,0x92,0xa5,0x96,0x80,0x0f,0x29,0x38,0x92,0xe6, + 0x45,0x28,0x4a,0x01,0xb0,0x21,0x9e,0x08,0xd9,0x7f,0x49,0xbb,0x14,0xa5,0x25,0x4e, + 0xbf,0x04,0x28,0x1b,0x52,0xaf,0x42,0x04,0xab,0x5c,0xb3,0xa1,0x33,0x0a,0xd6,0xfb, + 0x79,0x2b,0xf7,0x92,0x28,0x27,0xf1,0xfd,0x04,0x7e,0x78,0xe2,0x14,0x28,0xf8,0xe5, + 0xfd,0x2d,0xb7,0xdc,0xa2,0x7e,0xf8,0xc3,0x1f,0x46,0xd6,0xdd,0x36,0xdb,0x6c,0xb3, + 0x8e,0xc0,0x4b,0xe6,0xe9,0x9b,0x02,0xc8,0x7c,0xb5,0x09,0xc8,0xb4,0x57,0x9b,0x30, + 0xb3,0x09,0x61,0xdf,0x77,0xae,0xf5,0x65,0xfd,0xde,0x26,0xf0,0xab,0xed,0xbf,0x58, + 0xfc,0x62,0x95,0x88,0x9b,0x7f,0xfb,0xed,0xb7,0xcf,0x24,0x74,0xe3,0x75,0xda,0x02, + 0x16,0xeb,0xe9,0xc5,0x90,0xed,0x8b,0xfb,0x15,0xa0,0xec,0x88,0xd1,0x52,0xe6,0xd8, + 0x13,0xb9,0x5f,0xc5,0x2b,0x01,0x28,0x00,0xa5,0x10,0xfc,0x62,0x95,0x4a,0x49,0x57, + 0x71,0xf5,0x8a,0x4b,0x37,0x54,0xe0,0x9a,0xc2,0x27,0x4b,0x5e,0x7f,0xde,0x16,0x7b, + 0x11,0x69,0x81,0xb5,0xf6,0x5f,0x04,0xbf,0x54,0xf4,0x12,0x57,0xb9,0x54,0x33,0x33, + 0x8f,0xbb,0xaf,0x7f,0x71,0x91,0x21,0x33,0x6b,0xc1,0x3c,0x06,0x00,0x00,0x28,0x00, + 0x10,0x2c,0xfc,0xe5,0x55,0x2a,0x66,0xdd,0x74,0xd3,0x4d,0x51,0x51,0x0b,0x41,0x5c, + 0x52,0xd5,0x16,0xee,0xa9,0x46,0x20,0x9b,0xdf,0xf9,0x2c,0xf2,0x5a,0x3c,0x08,0xd5, + 0x78,0x24,0xaa,0xed,0xbf,0x08,0xfe,0xc9,0x93,0x27,0x47,0x9e,0x14,0x11,0xfc,0x49, + 0xcf,0x41,0x16,0x85,0x46,0xc6,0xdc,0xcd,0x20,0x27,0x9b,0x17,0x02,0x45,0x00,0x00, + 0x50,0x00,0x20,0x48,0xf0,0x4b,0x60,0x97,0x08,0xfe,0xb8,0x94,0x65,0x2c,0x78,0xd2, + 0x4a,0xf1,0xd6,0xea,0x62,0x0f,0x59,0x9f,0x8f,0x5a,0x84,0x5c,0x56,0x17,0x7f,0x35, + 0xfd,0x97,0xe9,0x75,0x25,0x08,0x49,0xc6,0x1d,0x45,0xf0,0x27,0x8b,0x01,0x85,0xc4, + 0x1c,0x98,0xdb,0xb6,0xcd,0xae,0x67,0xfe,0x06,0xc1,0x0f,0x00,0x28,0x00,0x90,0x2a, + 0xf8,0x85,0x67,0x9e,0x79,0x26,0x12,0xfc,0x32,0x29,0x46,0x1e,0x02,0x39,0xeb,0x7e, + 0x14,0xe9,0xd2,0xaf,0x45,0x29,0xa8,0xb5,0xff,0x22,0xf8,0x45,0xa9,0x92,0x3a,0xe1, + 0x92,0xfe,0x26,0x55,0xc2,0xd2,0x14,0x30,0xdb,0xb9,0xb1,0x1d,0x0f,0x51,0x00,0xcc, + 0xe8,0x7f,0x89,0x0b,0x70,0x29,0x31,0x00,0x00,0x28,0x00,0xd0,0x21,0x5c,0x44,0x60, + 0xc8,0x54,0x92,0x92,0xd2,0x25,0xe3,0xd1,0x59,0x2c,0x52,0x9f,0xf0,0xcc,0x1a,0x45, + 0x9f,0x66,0x41,0xfb,0x26,0x07,0xaa,0x75,0x7f,0x6b,0xdd,0x7f,0xdb,0xef,0x67,0xcd, + 0x9a,0x15,0x09,0x7e,0x71,0xd3,0x4b,0x70,0x5f,0x48,0x64,0x7f,0x88,0x87,0x26,0xe9, + 0x01,0xb0,0x15,0x14,0x92,0x73,0x2a,0xdb,0x44,0xf8,0x03,0x00,0x0a,0x00,0xac,0x23, + 0x48,0x96,0x2f,0x5f,0x1e,0xe5,0xf2,0x4b,0x1d,0x76,0x09,0xf2,0xb3,0xb9,0xb8,0x8b, + 0x9e,0x8c,0x27,0xab,0xc0,0xad,0x25,0x6a,0xbf,0x88,0xed,0xa5,0x59,0xfc,0x52,0x14, + 0x49,0x04,0xb4,0x64,0x4b,0xc8,0x58,0x7f,0x11,0xc8,0xfa,0x93,0x45,0x85,0x62,0xeb, + 0x1f,0xcb,0x1f,0x00,0x50,0x00,0x60,0x1d,0xab,0x51,0xea,0xc9,0x4b,0xe1,0x09,0x29, + 0xe4,0x32,0x6f,0xde,0xbc,0x60,0x01,0x19,0xb2,0x8d,0x5a,0x5d,0xf4,0x59,0xa3,0xea, + 0xb3,0x1e,0x83,0x5a,0x3c,0x18,0x21,0xeb,0x8f,0x67,0xf8,0x5b,0xbc,0x78,0xb1,0xda, + 0x7a,0xeb,0xad,0xa3,0x8c,0x89,0x22,0xb3,0x12,0x92,0x0a,0x80,0x58,0xfc,0xa2,0x00, + 0xc4,0x4a,0x9c,0x59,0x1d,0x10,0x65,0x00,0x00,0x50,0x00,0xda,0x54,0xf0,0x8b,0x3b, + 0xfa,0xf6,0xdb,0x6f,0x8f,0xac,0x7e,0x29,0x84,0xe1,0x2a,0x18,0x93,0x25,0xe8,0x2d, + 0xcf,0x34,0x3f,0x13,0x9f,0xcb,0xbf,0x1a,0x01,0x9e,0x25,0x8b,0x20,0x4b,0xff,0xe5, + 0xd8,0x8a,0xc5,0x2f,0x0a,0xd5,0x16,0x5b,0x6c,0x11,0x55,0x46,0x34,0xf3,0xf2,0x7d, + 0x1e,0x8b,0x6a,0x14,0x04,0x49,0x03,0x94,0x26,0xc2,0x5f,0x5e,0x63,0x2f,0x40,0x96, + 0xe3,0x04,0x00,0x80,0x02,0xd0,0xa2,0x82,0x7f,0xea,0xd4,0xa9,0xea,0xd6,0x5b,0x6f, + 0x8d,0xc6,0xf9,0x45,0x48,0x84,0x08,0xe7,0xac,0xcb,0x84,0x08,0xb8,0x22,0xd6,0x9f, + 0xc5,0xa3,0x50,0xc4,0xfe,0xc5,0xae,0x7e,0xb1,0xfc,0xa5,0x2a,0xe2,0xee,0xbb,0xef, + 0xde,0x51,0x01,0x2f,0xab,0x00,0xce,0x9a,0x05,0x10,0x07,0x01,0xc6,0xc2,0x3f,0x1e, + 0xf3,0x37,0xe7,0x04,0x00,0x00,0x40,0x01,0x68,0x33,0xc1,0x2f,0x82,0x49,0x2a,0xf7, + 0x49,0xc9,0xde,0x32,0xb8,0x81,0x8b,0xae,0xcd,0x5f,0xcf,0x2c,0x01,0xb1,0xf8,0xc5, + 0xd5,0x2f,0xaf,0xa3,0x46,0x8d,0x52,0x07,0x1e,0x78,0x60,0x14,0xe1,0x5f,0x4b,0xa1, + 0xa2,0xb4,0x2c,0x00,0x89,0xd7,0x88,0x67,0x57,0x4c,0x2a,0x0c,0xb1,0x07,0x20,0x9e, + 0x10,0xc8,0x35,0x31,0x10,0x31,0x01,0x00,0x80,0x02,0xd0,0x06,0x82,0x5f,0x04,0xbe, + 0x08,0x7e,0x51,0x00,0x42,0x2c,0xdd,0x7a,0x91,0x87,0x05,0x9e,0xe7,0xf2,0xd5,0x0a, + 0x7e,0x49,0x91,0x94,0xa0,0x49,0x09,0xec,0x93,0x49,0x6e,0xfa,0xf7,0xef,0xef,0x15, + 0xe0,0x21,0xdf,0xdb,0xfa,0x23,0x13,0x82,0xc8,0xb0,0xc2,0xa2,0x45,0x8b,0xd6,0x0a, + 0xee,0x8b,0x7f,0x1b,0x0b,0xff,0xb8,0xe5,0x3d,0x0b,0x20,0x00,0x00,0x0a,0x40,0xc9, + 0x05,0xbf,0x3c,0xfc,0x1f,0x7d,0xf4,0xd1,0xc8,0xd5,0x2f,0xd5,0xfb,0xaa,0xb1,0x80, + 0xeb,0x9d,0x67,0x9f,0x77,0x50,0x9c,0x4d,0x80,0xe6,0xd5,0xff,0x58,0xf0,0xcb,0x4c, + 0x5d,0x52,0xc4,0x47,0x66,0x0c,0x13,0x6b,0xbc,0xa8,0xe3,0x25,0x82,0x5d,0x2c,0x7e, + 0x09,0xd8,0x4c,0x4e,0x01,0x6c,0xf6,0xd5,0x26,0xfc,0x6d,0x01,0x80,0x00,0x00,0x28, + 0x00,0x2d,0x26,0xf8,0x65,0x5a,0xd6,0xeb,0xaf,0xbf,0x3e,0x2a,0xd5,0xbb,0x70,0xe1, + 0x42,0xab,0x25,0x5c,0x6d,0x1e,0x7e,0xd6,0xdf,0x87,0x78,0x00,0x7c,0xb5,0xf4,0xab, + 0x19,0xdf,0x4f,0xcb,0x62,0xa8,0xb5,0xff,0x49,0xc1,0x2f,0x2e,0x7e,0x99,0x2e,0x54, + 0x5c,0xfe,0xb6,0xdf,0xe5,0x31,0x5b,0xa0,0x08,0x7e,0x11,0xfa,0x62,0xf1,0xbb,0x84, + 0x7a,0x72,0x7d,0xc9,0x65,0xf0,0x00,0x00,0x00,0x0a,0x40,0x0b,0x0b,0x7d,0x79,0xc8, + 0xbf,0xf8,0xe2,0x8b,0xea,0xf1,0xc7,0x1f,0x8f,0xca,0xf4,0x8a,0xd0,0x37,0x27,0x80, + 0x71,0x09,0xd4,0x5a,0xa3,0xf2,0xf3,0xa8,0x04,0x98,0x57,0x65,0xbd,0x22,0xb6,0x97, + 0xec,0x7f,0x52,0xf0,0xcb,0xbc,0xe1,0x92,0xcb,0x2f,0x91,0xfd,0xb5,0x44,0xed,0xa7, + 0x05,0xf5,0xc9,0x79,0x15,0xa1,0x2f,0xe7,0x33,0x2e,0xef,0x1b,0x9f,0xef,0xe4,0x72, + 0xb6,0xdf,0xc7,0x82,0x3f,0xb9,0x9c,0xa9,0x08,0x30,0xfe,0x0f,0x00,0x28,0x00,0x4d, + 0x28,0xf4,0x25,0x00,0xec,0xa1,0x87,0x1e,0x52,0x0f,0x3c,0xf0,0x80,0x7a,0xf2,0xc9, + 0x27,0xa3,0x68,0xef,0x78,0x0e,0xeb,0x64,0xaa,0x59,0x1e,0x41,0x72,0x59,0x26,0xf3, + 0xa9,0xc6,0xc2,0xad,0x65,0xff,0x6a,0x75,0xf9,0x87,0xec,0x8f,0x08,0xfe,0x09,0x13, + 0x26,0x44,0x82,0x5f,0x8e,0xf3,0x66,0x9b,0x6d,0xa6,0x36,0xdf,0x7c,0xf3,0xb5,0x6a, + 0xf6,0xe7,0x55,0xaa,0x38,0xb6,0xe0,0xa5,0x66,0x80,0x8c,0xf3,0x8b,0xf5,0x9f,0x74, + 0xf7,0x9b,0x0a,0x42,0xf2,0xef,0xa4,0x90,0xf7,0x45,0xfe,0x9b,0xfb,0xb0,0xd5,0x56, + 0x5b,0xa9,0x7d,0xf7,0xdd,0x37,0xf5,0xba,0xeb,0xdb,0xb7,0x2f,0x4f,0x13,0x00,0x40, + 0x01,0x68,0x84,0xd0,0x17,0x9e,0x7f,0xfe,0xf9,0xa8,0x3c,0xef,0xfd,0xf7,0xdf,0x1f, + 0x05,0x83,0xc9,0xfc,0xd0,0xeb,0xaf,0xbf,0x7e,0xb0,0xc5,0x6b,0xe2,0xcb,0xab,0x0f, + 0x29,0xb5,0x6b,0xbe,0xa6,0x4d,0x96,0x93,0x75,0x48,0xa1,0xd6,0xd9,0xfc,0x6a,0xe9, + 0xbf,0x08,0x61,0x49,0xe9,0x13,0xcf,0x8a,0xac,0x63,0xf4,0xe8,0xd1,0x91,0xa0,0xb4, + 0xd5,0xec,0x37,0xcf,0x53,0xb5,0x41,0x7f,0x62,0xf1,0xcb,0x38,0xbf,0x9c,0xdb,0xa4, + 0xe0,0x77,0x59,0xf4,0x2e,0x85,0xc7,0x54,0x06,0x6c,0xfb,0x98,0xe4,0x93,0x9f,0xfc, + 0x64,0xd4,0x00,0x00,0x50,0x00,0x4a,0x24,0xf4,0xe5,0xe1,0x7f,0xef,0xbd,0xf7,0xaa, + 0xab,0xaf,0xbe,0x3a,0xb2,0x44,0x45,0x00,0x0d,0x19,0x32,0x44,0xf5,0xe9,0xd3,0xa7, + 0x2a,0x8b,0x36,0x4d,0x40,0x56,0x13,0x65,0xef,0x1b,0xc3,0xcf,0xb2,0x7c,0x9e,0xd3, + 0xeb,0x56,0xdb,0x7f,0x11,0xfc,0x62,0xf5,0x4b,0x2c,0x85,0x20,0x91,0xfd,0x52,0xc1, + 0xcf,0x56,0xb3,0x3f,0xaf,0x20,0x49,0x29,0xc2,0x24,0x16,0xbf,0xb8,0xfa,0xd3,0x82, + 0xf7,0x62,0x65,0x20,0xf6,0x14,0x98,0xa4,0x8d,0xf9,0x13,0x07,0x00,0x00,0x28,0x00, + 0x4d,0x22,0xf8,0x05,0xb1,0x3e,0x7f,0xf5,0xab,0x5f,0xa9,0xd7,0x5f,0x7f,0xbd,0xe3, + 0x33,0x11,0x4c,0xd3,0xa6,0x4d,0xe3,0xcc,0xd6,0x89,0x71,0xe3,0xc6,0x79,0x95,0x87, + 0x6a,0x2b,0xf9,0x2d,0x5b,0xb6,0x2c,0x12,0xfc,0x32,0xa4,0x63,0x0a,0xf1,0xa4,0x90, + 0xb7,0x8d,0xfd,0xbb,0x3c,0x00,0x00,0x00,0xd0,0x64,0x0a,0x40,0xf2,0x81,0x2e,0xae, + 0xe7,0x0b,0x2f,0xbc,0x50,0xdd,0x77,0xdf,0x7d,0x9c,0xc1,0x12,0x9c,0x97,0x6a,0x63, + 0x0e,0x5c,0x1e,0x8a,0xb8,0x88,0x8f,0x28,0x00,0xb6,0x31,0x7d,0x9b,0xb5,0x1f,0xbf, + 0x4f,0x7e,0x67,0x5e,0x37,0x28,0x00,0x00,0x00,0x4d,0xa4,0x00,0x98,0xe3,0xc1,0x92, + 0xbb,0x7f,0xde,0x79,0xe7,0x45,0x96,0x21,0x94,0x9b,0xac,0x41,0x89,0x71,0x2e,0xbf, + 0x78,0x71,0x4c,0x57,0xbe,0x29,0xf8,0x93,0x9f,0x99,0x55,0xfd,0xd2,0x66,0x28,0x04, + 0x00,0x80,0x92,0x2b,0x00,0xb6,0x40,0xb0,0x2b,0xae,0xb8,0x42,0xfd,0xcf,0xff,0xfc, + 0x0f,0x67,0xad,0x84,0x42,0x3e,0x44,0xe0,0xbb,0xbe,0x97,0xb1,0x7d,0x49,0xe7,0x93, + 0x20,0xbf,0xd8,0xda,0xb7,0x09,0xfa,0xf8,0xbd,0x4d,0x39,0x30,0x3d,0x00,0x71,0xd5, + 0x3f,0xf3,0x5a,0x02,0x00,0x80,0x12,0x2b,0x00,0xe6,0x38,0xae,0x3c,0xc8,0x7f,0xf8, + 0xc3,0x1f,0x46,0x33,0xf3,0x41,0xf9,0x15,0xb5,0xd0,0xd2,0xbd,0xc9,0x5c,0x7e,0x9b, + 0x90,0x37,0xd7,0xe9,0x1a,0xe7,0x4f,0x0b,0x0a,0x4c,0x7a,0x00,0x50,0x04,0x00,0x00, + 0x4a,0xac,0x00,0x98,0x0f,0x75,0xb1,0x0e,0xbf,0xfb,0xdd,0xef,0x46,0x53,0xf2,0x42, + 0x6b,0x28,0x0b,0xa2,0xd0,0x25,0x05,0x7f,0xd2,0xa2,0x4f,0xcb,0xe7,0xb7,0xb9,0xfe, + 0x6d,0xd5,0xfd,0x5c,0xb5,0x01,0x00,0x00,0xa0,0x84,0x0a,0x80,0xab,0x60,0xcb,0x45, + 0x17,0x5d,0x84,0xf0,0x6f,0x22,0x01,0xef,0x73,0xf9,0x4b,0x1a,0xa1,0x08,0xfe,0x78, + 0x52,0x1e,0x57,0xe0,0x9e,0xcd,0xda,0x4f,0x2a,0x05,0xbe,0x3a,0x00,0x71,0x60,0x20, + 0x00,0x00,0x94,0x58,0x01,0x70,0xb9,0x74,0xaf,0xbd,0xf6,0xda,0xa8,0xb0,0x0f,0x34, + 0x07,0x69,0x75,0x07,0x24,0xb0,0x2f,0x59,0xb6,0xd7,0x96,0xcf,0xef,0xf2,0x04,0xb8, + 0x14,0x04,0xd7,0xf0,0x80,0xd9,0x18,0x02,0x00,0x09,0x2e,0x9d,0x31,0x63,0x46,0xd4, + 0xde,0x7b,0xef,0xbd,0x8e,0xf7,0x71,0x93,0xcc,0x93,0xe3,0x8f,0x3f,0x5e,0x1d,0x77, + 0xdc,0x71,0xd1,0x1c,0x16,0x00,0x28,0x00,0x0d,0x12,0xfe,0xf2,0x30,0x7f,0xec,0xb1, + 0xc7,0xd4,0x2f,0x7f,0xf9,0x4b,0xce,0x50,0x93,0x7b,0x00,0x44,0xf0,0x8b,0xbb,0x3f, + 0xce,0xe5,0x4f,0x5a,0xef,0xf1,0xfb,0xb8,0xa4,0x6f,0x52,0x80,0xbb,0xb2,0x00,0x4c, + 0x21,0x9f,0x54,0x26,0x4c,0x0f,0x80,0x29,0xf0,0xc9,0x06,0x68,0x2d,0xe4,0x9a,0x32, + 0x05,0xb9,0xab,0xc5,0x85,0xab,0x4c,0x06,0x0d,0x1a,0xa4,0xfe,0xcf,0xff,0xf9,0x3f, + 0xea,0xcc,0x33,0xcf,0x54,0xfd,0xfa,0xf5,0xe3,0x1a,0x01,0x14,0x80,0x46,0x08,0xff, + 0x64,0x93,0xb9,0xe3,0x65,0xdc,0x1f,0x17,0x6e,0x73,0x08,0x7d,0xdb,0xdf,0xf2,0x70, + 0x16,0x8b,0x5f,0xca,0xf6,0x26,0xdd,0xf1,0xb6,0x68,0x7d,0x53,0x60,0xbb,0xaa,0xfd, + 0x99,0xc3,0x02,0xbe,0x21,0x83,0xe4,0xb6,0xa0,0x39,0x90,0x73,0x26,0x95,0x26,0x43, + 0x84,0xfa,0xdc,0xb9,0x73,0xab,0xde,0x8e,0x08,0xfe,0xff,0xfe,0xef,0xff,0x5e,0x47, + 0xf0,0x93,0x3e,0x0a,0x28,0x00,0x0d,0x14,0xfe,0xf2,0x00,0x90,0x88,0x7f,0x99,0xe2, + 0x15,0x9a,0x03,0xd3,0xe5,0x2f,0xe7,0x70,0xce,0x9c,0x39,0xce,0x40,0x3c,0x9b,0x80, + 0x77,0x09,0x74,0xdb,0xb0,0x80,0x29,0xd8,0x6d,0xf1,0x01,0xb1,0xd2,0xc1,0x10,0x40, + 0x39,0x48,0xba,0xe0,0xd3,0x9a,0x4c,0x2a,0x15,0xa7,0x6f,0x16,0x41,0x2c,0xf8,0xbf, + 0xfa,0xd5,0xaf,0xaa,0xfe,0xfd,0xfb,0xaf,0xf3,0x3c,0xb2,0x55,0xaa,0x04,0x40,0x01, + 0x28,0x48,0xf8,0x27,0x1f,0xe0,0xf2,0xc0,0x96,0xea,0x7e,0x4f,0x3c,0xf1,0x04,0x67, + 0xa6,0x49,0xbd,0x00,0xbe,0x4a,0x7d,0x49,0xc1,0x6e,0x73,0xf3,0x9b,0x02,0xdd,0xe7, + 0x11,0xf0,0xa5,0x04,0x22,0xf8,0x8b,0x23,0x0f,0x17,0x7c,0xbd,0x10,0xc1,0xff,0x5f, + 0xff,0xf5,0x5f,0xea,0xf4,0xd3,0x4f,0xef,0x10,0xfc,0x69,0xd7,0x85,0xa9,0xd4,0x02, + 0xa0,0x00,0x14,0xe8,0x01,0x90,0x87,0xb9,0x3c,0x24,0x18,0xf7,0x6f,0x5e,0x05,0x20, + 0x39,0xb6,0x6f,0x56,0xe7,0xf3,0xa5,0xe9,0xb9,0x82,0xf7,0x42,0x32,0x03,0xd2,0xd6, + 0x05,0xd9,0xa8,0x97,0x0b,0xbe,0xde,0x82,0xff,0xb4,0xd3,0x4e,0xeb,0x10,0xfc,0xc9, + 0x6b,0x30,0xf9,0x6a,0xfb,0x0c,0x25,0x00,0x50,0x00,0x0a,0xb4,0x16,0x63,0x61,0x21, + 0xed,0xa6,0x9b,0x6e,0x8a,0xc6,0xff,0xa1,0xb9,0x30,0x1f,0x94,0xe2,0xc2,0xb5,0x59, + 0xe8,0x36,0xeb,0xdd,0x54,0x0a,0x6c,0x31,0x02,0xae,0xc0,0xc0,0xb4,0xba,0x01,0xb6, + 0x99,0xff,0xda,0xf9,0x21,0x5e,0x16,0x17,0x7c,0xe8,0xf5,0x24,0xd3,0x4e,0xbb,0x9a, + 0x7c,0x2f,0x33,0x44,0x26,0xe7,0x8a,0xb0,0x09,0xfe,0xb3,0xce,0x3a,0x4b,0x9d,0x7a, + 0xea,0xa9,0xaa,0x6f,0xdf,0xbe,0x6b,0x05,0x9b,0xc6,0x2d,0xde,0x96,0x39,0x59,0x95, + 0x4d,0x09,0x00,0x40,0x01,0xc8,0xd9,0xea,0x4f,0x36,0xb9,0xa1,0xff,0xfc,0xe7,0x3f, + 0x73,0x46,0x5a,0x40,0x11,0xb0,0x09,0x77,0x5b,0x10,0xa0,0x2b,0x9f,0xdf,0x15,0x1f, + 0x10,0x62,0xed,0xb7,0x53,0x10,0x60,0x33,0xb9,0xe0,0x85,0x58,0x80,0x77,0xe9,0xd2, + 0x65,0x1d,0xa1,0x2e,0x9f,0xc5,0x82,0xdf,0x14,0xba,0xc9,0x6b,0x44,0xea,0x48,0x48, + 0x4b,0x13,0xfc,0x12,0xd8,0x77,0xca,0x29,0xa7,0x38,0x05,0xbf,0xa9,0x04,0xd8,0xae, + 0x63,0x53,0xf8,0xa3,0x0c,0x00,0x0a,0x40,0x4e,0x4a,0x40,0xf2,0x81,0x2f,0x4d,0x6e, + 0xd0,0x7b,0xee,0xb9,0xa7,0x29,0x5c,0x8a,0xe0,0xf6,0xe8,0xc4,0xc4,0x45,0x7e,0x4c, + 0x45,0x20,0x79,0xfe,0x5d,0x13,0xf8,0xd8,0xd2,0xfe,0xd2,0x84,0xbd,0x2b,0x33,0x20, + 0xb9,0xed,0x66,0x0a,0x02,0x6c,0x36,0x17,0xbc,0x29,0xc4,0x6d,0x7f,0xcb,0xf1,0x97, + 0xf7,0xae,0x02,0x51,0xb6,0x6b,0xca,0x0c,0xf2,0x94,0x54,0x52,0x9f,0xe0,0x3f,0xe3, + 0x8c,0x33,0xd4,0x49,0x27,0x9d,0xa4,0xfa,0xf4,0xe9,0xd3,0x31,0xc7,0x84,0x4b,0xf0, + 0xc7,0xfb,0x15,0xbf,0xf7,0x79,0xb5,0x00,0x50,0x00,0x72,0x12,0x14,0x36,0x25,0x80, + 0x82,0x3f,0xad,0xe1,0x01,0xc8,0x9a,0xba,0x67,0xfb,0x4d,0xda,0xf2,0x49,0x2f,0x82, + 0x99,0x19,0x60,0x7a,0x18,0x7c,0xb3,0x0f,0xd6,0x93,0x66,0x73,0xc1,0x27,0x85,0xb9, + 0xeb,0x7d,0x52,0x88,0x86,0x4c,0x02,0x15,0x0b,0xda,0xf8,0x7d,0xda,0xb4,0xd1,0x49, + 0xc1,0x2f,0x2d,0x4d,0xf0,0x4b,0x60,0xdf,0x89,0x27,0x9e,0x18,0x59,0xfc,0x42,0x5c, + 0x6c,0x2a,0x4d,0xe0,0xc7,0xfb,0x20,0x4d,0xae,0x99,0xa4,0x12,0x80,0xf0,0x07,0x14, + 0x80,0x3a,0x59,0xff,0xd2,0x26,0x4f,0x9e,0xac,0x5e,0x7b,0xed,0x35,0xce,0x46,0x8b, + 0x78,0x03,0xe4,0x01,0x9c,0xf4,0x00,0x98,0x82,0xd9,0xb4,0xd0,0x6d,0x4a,0x81,0x4d, + 0x71,0x08,0xcd,0x02,0xb0,0x0d,0x17,0x14,0x41,0x33,0xb9,0xe0,0x63,0xc1,0x17,0x0b, + 0x70,0x79,0x75,0xbd,0x77,0xb9,0xe0,0x43,0xa7,0x75,0xce,0xe3,0x3a,0x92,0x34,0x60, + 0x69,0x69,0x82,0xff,0x2b,0x5f,0xf9,0x8a,0x3a,0xe1,0x84,0x13,0x3a,0x2a,0xf7,0x49, + 0xcd,0x09,0x53,0xf0,0xc7,0xfd,0x8e,0x85,0x7c,0x2c,0xe8,0x93,0x7d,0x4c,0x2a,0x23, + 0xa6,0xe2,0x02,0x80,0x02,0x90,0xa3,0xe0,0x37,0x1f,0xe0,0x62,0xed,0x3c,0xfc,0xf0, + 0xc3,0x9c,0x89,0x16,0x22,0x1e,0x02,0xf0,0x95,0xe8,0x75,0x55,0xef,0x73,0x95,0x05, + 0x0e,0x59,0x97,0x4d,0x29,0xc8,0x7a,0xad,0x8a,0x15,0x2e,0xc1,0xa8,0x52,0x32,0xd6, + 0x56,0x36,0xb6,0x6c,0x2e,0xf8,0x58,0x80,0xc7,0x42,0xbc,0x6b,0xd7,0xae,0xd6,0xcf, + 0x6b,0xb9,0x7f,0x93,0x42,0x32,0x69,0x41,0xe7,0x89,0x9c,0x3b,0x11,0xfa,0xe2,0x2d, + 0x49,0x13,0xfc,0x12,0xd1,0x7f,0xcc,0x31,0xc7,0x74,0x08,0x7e,0x51,0xc4,0x92,0x63, + 0xfa,0xa6,0xb5,0x1f,0x0b,0xff,0xe4,0xb5,0x12,0x0f,0x49,0x98,0x59,0x27,0x21,0x43, + 0x13,0x00,0x28,0x00,0x35,0x2a,0x03,0x49,0x0f,0xc0,0xa3,0x8f,0x3e,0xca,0x99,0x68, + 0x01,0xcb,0x3f,0x7e,0x80,0xda,0xb2,0x00,0x7c,0x56,0x7e,0x5a,0xb3,0xb9,0xfe,0x4d, + 0x61,0x6f,0x0b,0x2e,0x4c,0x56,0x92,0x14,0xeb,0x50,0x02,0x4d,0x27,0x4e,0x9c,0x18, + 0x55,0x28,0xfc,0xe0,0x83,0x0f,0xa2,0x62,0x45,0x32,0xde,0x2e,0x02,0x3f,0x16,0xf6, + 0x65,0x70,0xc1,0xc7,0x96,0xaa,0x08,0x72,0x9f,0x50,0xaf,0x87,0x40,0x32,0xe7,0x78, + 0xc8,0xdb,0x3a,0x96,0xf3,0x24,0x42,0x5f,0x84,0xbf,0xab,0xfa,0xa7,0x08,0xfe,0xff, + 0xfc,0xcf,0xff,0x54,0x47,0x1e,0x79,0xa4,0xea,0xd5,0xab,0x57,0x87,0xe0,0xb7,0x59, + 0xfc,0xc9,0x2c,0x02,0x59,0x9f,0x1c,0x2b,0xb3,0x3f,0xae,0xe1,0x27,0x02,0x00,0x01, + 0x05,0xa0,0x00,0xe1,0xe0,0x0a,0xfe,0x93,0x07,0xf1,0xeb,0xaf,0xbf,0xce,0x99,0x68, + 0x62,0x4c,0xd7,0x70,0x5c,0xfe,0xd7,0x67,0xe5,0xa7,0x05,0xf5,0xa5,0xcd,0x01,0xe0, + 0xca,0x24,0x48,0x2e,0x23,0x81,0x60,0xa3,0x46,0x8d,0x52,0xaf,0xbe,0xfa,0xaa,0x7a, + 0xeb,0xad,0xb7,0x3a,0x84,0xc5,0x83,0x0f,0x3e,0xd8,0xb0,0x63,0x94,0x14,0xde,0x66, + 0x4b,0x0a,0xf8,0xd8,0x5a,0x6d,0x94,0xd0,0x09,0x99,0xd5,0x31,0xed,0xfb,0x2c,0x82, + 0x7f,0xde,0xbc,0x79,0x91,0xf0,0x4f,0x13,0xfc,0x5f,0xfa,0xd2,0x97,0xd4,0x61,0x87, + 0x1d,0xa6,0x7a,0xf6,0xec,0x19,0x24,0xf8,0x93,0x0a,0x80,0x4d,0xf8,0x53,0x2b,0x02, + 0xa0,0x8e,0x1e,0x80,0x34,0x25,0xe0,0x95,0x57,0x5e,0xe1,0x2c,0x34,0xb9,0xf5,0x6f, + 0x5a,0x88,0xb1,0x07,0xc0,0x1c,0x8f,0xb7,0x59,0xfb,0xa6,0x65,0xef,0x8a,0x15,0x48, + 0x2e,0x17,0xbf,0xb7,0x15,0x19,0xea,0xd6,0xad,0x9b,0x1a,0x3e,0x7c,0x78,0x24,0x54, + 0x9e,0x7d,0xf6,0xd9,0xc2,0x1f,0xf0,0x36,0x41,0x6e,0x7e,0x26,0xfb,0x94,0x74,0x51, + 0x87,0x8c,0xa1,0x67,0x11,0xa6,0x79,0x8f,0xd1,0xfb,0x2c,0xfe,0xac,0x1e,0x01,0x73, + 0xff,0xe4,0xfa,0x10,0xc1,0x2f,0x2d,0x4d,0xf0,0x9f,0x7c,0xf2,0xc9,0xea,0x90,0x43, + 0x0e,0x51,0x3d,0x7a,0xf4,0x58,0x47,0xf0,0xc7,0xaf,0x49,0x81,0x9f,0x14,0xfc,0xb6, + 0x7d,0xb5,0x15,0xa0,0x4a,0xbe,0xe6,0x71,0x2e,0x00,0x50,0x00,0x02,0x04,0x7f,0xec, + 0x01,0x98,0x34,0x69,0x12,0x67,0xa1,0xc5,0x94,0x81,0x38,0x08,0x30,0xc4,0xca,0x4f, + 0x2b,0xfa,0x13,0xe2,0x01,0x48,0x5a,0xa1,0x43,0x86,0x0c,0x89,0xdc,0xc8,0x2f,0xbf, + 0xfc,0x72,0x4d,0xfd,0x88,0x2d,0xc7,0xa4,0x30,0x37,0xdf,0xc7,0x6e,0xf9,0x10,0xe1, + 0x60,0x0a,0xe4,0xbc,0xc7,0xd0,0xcd,0x31,0x7a,0x53,0x40,0x67,0x4d,0xbb,0xcb,0xdb, + 0xe2,0x8f,0xf7,0x2f,0xf6,0xf8,0xf9,0x04,0xbf,0xa4,0xf2,0x1d,0x70,0xc0,0x01,0x1d, + 0x82,0x5f,0x0a,0xfe,0x98,0xc5,0x7b,0x6c,0x82,0x3f,0x69,0xed,0x27,0x05,0x7e,0x16, + 0x45,0x07,0x45,0x00,0x50,0x00,0xea,0xa0,0x04,0xc8,0xc3,0x40,0xda,0xdb,0x6f,0xbf, + 0xcd,0x59,0x68,0x01,0xc1,0x9f,0x7c,0x2f,0x0a,0x40,0x5a,0x0c,0x40,0x68,0xb3,0x29, + 0x0c,0xb6,0x6b,0x49,0x66,0x73,0x13,0x8b,0xff,0xcd,0x37,0xdf,0x4c,0x7d,0x78,0x27, + 0x05,0x79,0xda,0x6b,0xde,0x0f,0xfa,0xa2,0xc7,0xd0,0x7d,0x02,0x3f,0x34,0xed,0x2e, + 0x2f,0x8b,0xdf,0x44,0xce,0x91,0x08,0x7e,0x09,0x9a,0x4c,0x13,0xfc,0x9f,0xff,0xfc, + 0xe7,0xd5,0x3e,0xfb,0xec,0xa3,0xba,0x77,0xef,0xbe,0x8e,0xc5,0xef,0x1a,0xe3,0x4f, + 0x2a,0x52,0x66,0xff,0x43,0x5c,0xfc,0xb6,0x8a,0x80,0x08,0x7a,0x40,0x01,0xc8,0x59, + 0x40,0x98,0xd6,0x7f,0xac,0x04,0x4c,0x9f,0x3e,0x9d,0xb3,0xd0,0x62,0x24,0x3d,0x00, + 0x69,0x2e,0xfd,0xac,0xb9,0xfe,0xe6,0xb5,0x24,0x82,0x42,0x72,0xc4,0x25,0x22,0xdf, + 0x85,0xb8,0xdf,0x45,0xb8,0x48,0x1d,0xf8,0xd8,0x42,0xcc,0x6b,0x0c,0xbb,0x5a,0x0b, + 0xda,0x26,0x84,0xf2,0x1c,0xf3,0xf7,0x45,0xed,0xe7,0x39,0x86,0x2f,0xe7,0x5a,0x9a, + 0xdc,0xcb,0xf1,0x6b,0xfc,0x3e,0xf9,0x79,0x5a,0x54,0xbf,0xe4,0xf0,0xef,0xb1,0xc7, + 0x1e,0xd1,0xb9,0x92,0xe5,0x5c,0x82,0x3f,0x69,0xed,0x9b,0x25,0x9e,0x6d,0x65,0x9f, + 0xb3,0x34,0xac,0x7c,0x40,0x01,0x28,0xd8,0xf2,0x37,0x03,0x00,0xa5,0x49,0x14,0x36, + 0xb4,0x96,0x37,0x20,0x8e,0xa2,0x77,0x4d,0x02,0x64,0xcb,0x02,0xb0,0x59,0xf7,0xae, + 0xef,0x44,0x00,0x88,0x5b,0x58,0x84,0xbf,0x0b,0x49,0x11,0x13,0xe1,0x12,0x97,0x83, + 0x2d,0xd2,0x22,0xaf,0xc6,0x82,0x4e,0x53,0x00,0x1a,0x39,0x86,0x1f,0x0b,0x75,0x9b, + 0x10,0x37,0xdf,0xd7,0x12,0x5f,0x21,0xe7,0xe6,0x33,0x9f,0xf9,0x8c,0xda,0x7d,0xf7, + 0xdd,0x3b,0x04,0x7f,0x5a,0x1e,0x7f,0xac,0xbc,0x98,0xe9,0x7c,0x36,0x81,0x6f,0xa6, + 0x01,0xa6,0xcd,0x2d,0x60,0x53,0x04,0x7c,0xa5,0x82,0x01,0x50,0x00,0x32,0x28,0x01, + 0x69,0x5e,0x00,0x19,0xb3,0x85,0xe6,0x16,0xf8,0xc9,0x07,0x65,0x32,0x05,0x30,0x69, + 0xc9,0x87,0xb8,0xfa,0xcd,0xc0,0xc0,0xe4,0xe7,0xf1,0x67,0x62,0x1d,0xa6,0x09,0x9f, + 0x01,0x03,0x06,0xa8,0xc1,0x83,0x07,0x77,0xa4,0x8a,0x55,0x63,0xf1,0xd6,0xdb,0x43, + 0x90,0x55,0x61,0xc8,0x4a,0xac,0x6c,0x8b,0x80,0x35,0xad,0xf5,0x58,0x98,0xe7,0x21, + 0xd4,0x43,0x05,0xbf,0x14,0xef,0xd9,0x79,0xe7,0x9d,0xa3,0xe1,0x16,0x97,0xe0,0x4f, + 0x0a,0x6e,0x53,0x51,0x72,0x59,0xf8,0xb6,0xf9,0x05,0x5c,0x73,0x0f,0xd8,0x84,0xbf, + 0x4d,0xe8,0x33,0x2c,0x00,0x28,0x00,0x35,0x0a,0x08,0x33,0x22,0x3c,0x7e,0x20,0x49, + 0x8b,0xdd,0x7d,0xd0,0x1a,0xb8,0x02,0x00,0x4d,0x97,0xbe,0xaf,0x78,0x8f,0xe9,0x01, + 0x10,0x21,0x21,0xcd,0x26,0xa0,0xe4,0x01,0x2f,0x82,0x45,0x04,0xbf,0x58,0x93,0x26, + 0x36,0x17,0x78,0x2d,0x63,0xe2,0xb5,0x5a,0xe4,0x79,0x58,0xfc,0xa6,0xab,0x3d,0xad, + 0x95,0x21,0xd5,0x4d,0xce,0xcd,0xb1,0xc7,0x1e,0xab,0x3e,0xfa,0xd1,0x8f,0xae,0x25, + 0xf8,0x5d,0x6e,0xfe,0xf8,0xbc,0xd9,0x8e,0xa1,0x29,0xec,0x5d,0x69,0x95,0xae,0x94, + 0xcb,0x50,0x65,0x00,0x00,0x05,0x20,0x27,0xe1,0xef,0xca,0x02,0x68,0x74,0xd1,0x15, + 0xc8,0xd7,0xd3,0x93,0x54,0x00,0x92,0x1e,0x80,0xf8,0xbd,0x39,0xf9,0x4f,0x52,0xc8, + 0x27,0xd7,0x15,0xff,0x4e,0x14,0x44,0x69,0x36,0x21,0x26,0x31,0x00,0xeb,0xad,0xb7, + 0x5e,0x24,0xfc,0x93,0xc2,0xc2,0x66,0x71,0xa7,0xbd,0xd6,0xea,0x21,0xb0,0x09,0x7c, + 0x9f,0x80,0xb7,0x29,0x17,0xb1,0x50,0xf4,0x09,0x76,0x97,0x22,0x54,0x6f,0xe4,0x98, + 0x4b,0xa4,0xbe,0xe4,0xe7,0x9b,0xaf,0xf1,0xfb,0xf8,0x6f,0x39,0x57,0x52,0x64,0xe9, + 0xee,0xbb,0xef,0x6e,0xb8,0xb7,0xaa,0x9e,0x9e,0x9d,0x32,0x7a,0xeb,0xe8,0x7f,0xfd, + 0xfb,0x3f,0x62,0xc4,0x88,0x48,0x29,0xfd,0xf9,0xcf,0x7f,0xde,0xfa,0x0a,0x80,0x6d, + 0x26,0x37,0xd3,0xf5,0x1f,0x2b,0x00,0xd0,0xfc,0x24,0x05,0x98,0x2d,0xf8,0x2f,0x64, + 0x82,0x20,0x53,0xf0,0x8b,0xa0,0x13,0xc1,0x6f,0x8b,0x1a,0x97,0x22,0x3f,0xeb,0xaf, + 0xbf,0x7e,0x14,0xfd,0x6f,0xbb,0xd9,0xaa,0xc9,0x53,0xaf,0x75,0x79,0xd7,0x32,0x36, + 0x61,0x1e,0xbb,0xe2,0xcb,0x2c,0xd4,0x6d,0x82,0xdd,0xfc,0x3c,0x8e,0xd6,0x0f,0xc1, + 0x76,0x1e,0xeb,0x91,0x7e,0x68,0xfe,0x3e,0xa9,0x90,0xd6,0x52,0x32,0xda,0xa6,0xfc, + 0x66,0x5d,0x1f,0xfd,0x6f,0xfd,0xfe,0x4b,0x6a,0xb2,0xb4,0x97,0x5e,0x7a,0xc9,0x1a, + 0xb7,0xd2,0x76,0x1e,0x80,0x64,0x1a,0xa0,0x2b,0x25,0x08,0x9a,0xd7,0x03,0x10,0x0b, + 0x32,0x9b,0xeb,0xdf,0x25,0xec,0xcd,0xe5,0xe3,0x71,0x7e,0x13,0xb1,0xf4,0x45,0xf0, + 0xc7,0x35,0xe0,0xeb,0x65,0x89,0x98,0xeb,0x4f,0x0a,0xf5,0xd8,0x62,0x4f,0x0a,0xf5, + 0xf8,0x7d,0x99,0x84,0xba,0x08,0xeb,0xd8,0x12,0x37,0x05,0x7a,0xdc,0xe4,0x3b,0x69, + 0xa1,0x9e,0x8d,0xd8,0x85,0x1f,0xda,0xc7,0x7a,0x5b,0x9c,0x8d,0xf0,0xec,0xd0,0x7f, + 0xfa,0x1f,0xdf,0x1b,0x52,0xef,0x42,0x26,0x01,0x7b,0xf7,0xdd,0x77,0x9d,0xfb,0xd2, + 0x68,0x65,0xa0,0xae,0x31,0x00,0xa6,0x85,0x88,0x02,0xd0,0x1a,0xc2,0x3f,0x79,0xf1, + 0x26,0x67,0x02,0x4c,0x9e,0x7f,0x9f,0x47,0x20,0x4e,0xff,0x32,0xc7,0xac,0x65,0xcc, + 0x56,0x84,0xbe,0xb8,0xfa,0xe3,0xc2,0x30,0xb5,0xa6,0xdd,0xd9,0x6e,0xec,0x38,0x28, + 0x4e,0x6e,0x5c,0xd9,0x8f,0x38,0x3e,0x25,0x29,0xd4,0x63,0xc1,0x5e,0x86,0xeb,0x36, + 0x16,0xea,0xa6,0x00,0x77,0x09,0xf5,0xd0,0x07,0x62,0x5a,0xdf,0x6c,0x16,0x4e,0x16, + 0x05,0xc7,0x36,0x47,0x43,0x96,0x07,0xac,0x69,0xc1,0x85,0xac,0x2f,0x6d,0x79,0x57, + 0xdd,0x7f,0xfa,0x4f,0xff,0xab,0xed,0x7f,0x5c,0xf3,0x42,0xbc,0x93,0x62,0xb0,0x98, + 0xbf,0x33,0x97,0x6f,0xf4,0xd4,0xd3,0x85,0xa7,0x01,0x9a,0x42,0xc0,0x6c,0xd0,0xdc, + 0x98,0x17,0x6d,0x2c,0xc0,0x5d,0xd1,0xfc,0xb6,0x80,0x3f,0x11,0xb4,0xa6,0xb5,0x2c, + 0xc2,0x6b,0xe8,0xd0,0xa1,0x91,0xfb,0xcc,0x56,0xcf,0xdd,0xdc,0xb6,0x2b,0xa5,0x2d, + 0x29,0xb8,0x6d,0xef,0xcb,0x2a,0xd4,0xcd,0xd7,0xb8,0x49,0x90,0xa3,0x58,0xf0,0xb6, + 0x60,0x47,0x9f,0xfb,0xbd,0x56,0x8b,0xad,0x56,0x0b,0xc9,0x7c,0x20,0xd7,0x2a,0x20, + 0xb2,0x3e,0xb0,0xe9,0x3f,0xfd,0x2f,0xb2,0xff,0x22,0xf8,0xc5,0x3b,0x39,0x70,0xe0, + 0xc0,0x75,0xac,0x7c,0x33,0x05,0x3a,0x6f,0xef,0x48,0xa9,0x87,0x00,0x4c,0x4f,0x80, + 0x39,0x55,0x2c,0xb4,0x86,0xfb,0x3f,0x16,0xe6,0xa6,0x07,0xc0,0x2c,0xe8,0x13,0x5f, + 0x07,0xb1,0x00,0x4e,0x5e,0x07,0xa2,0x39,0x0f,0x1b,0x36,0x2c,0xba,0x89,0x6c,0x37, + 0x5e,0xec,0x7e,0x8f,0xad,0xf3,0xa4,0x20,0x37,0x5b,0x99,0xdc,0xef,0x49,0x6b,0x3c, + 0x29,0xd8,0x63,0x81,0x2e,0x7f,0xc7,0x55,0x08,0x43,0x3c,0x1b,0x21,0xf1,0x33,0xb5, + 0x8e,0xa9,0xda,0x2c,0x26,0x73,0x0c,0xd5,0xb7,0xbe,0xe4,0x39,0xf0,0x59,0x60,0xbe, + 0xf5,0xf9,0x04,0x04,0xfd,0xa7,0xff,0x8d,0xe8,0xbf,0x54,0x21,0x95,0xfb,0x37,0xb6, + 0xf8,0x93,0x9e,0x4e,0xb3,0x48,0x55,0xfc,0x7b,0xb3,0xee,0x44,0xc8,0x74,0xd4,0x4d, + 0x39,0x04,0x60,0x1b,0x06,0x60,0x08,0xa0,0x35,0xbd,0x00,0xc9,0xa9,0x80,0xd3,0xa6, + 0xe9,0x8d,0xdd,0xec,0xc9,0xf3,0x2f,0x05,0x7b,0xc4,0xda,0x97,0x1b,0x49,0xbe,0x97, + 0x71,0x33,0x53,0xa0,0xbb,0xb2,0x01,0x1a,0x25,0xd4,0xa5,0x89,0x00,0x4f,0x0a,0x77, + 0xb3,0x89,0x50,0x0f,0x7d,0x20,0xc5,0xc7,0x2e,0x4f,0x8b,0x2b,0xcf,0x31,0xdb,0xbc, + 0x2b,0x1e,0x96,0x6d,0x7d,0xf4,0x9f,0xfe,0x67,0x59,0xbf,0x8c,0xef,0x0b,0xb1,0xc5, + 0xef,0xf2,0x7e,0xdb,0x94,0x0a,0x57,0x8d,0x8b,0x7a,0x2b,0x01,0x85,0x65,0x01,0x98, + 0x82,0xdf,0xa6,0x08,0xa0,0x00,0xb4,0x9e,0x17,0x20,0xad,0x0e,0x40,0x5a,0x80,0xdf, + 0xc2,0x85,0x0b,0xa3,0xd6,0x48,0xa1,0x2e,0xc2,0xdc,0x14,0xe0,0xb6,0xcf,0x92,0x42, + 0x3d,0xd4,0xfd,0x5e,0xc4,0x03,0x29,0xab,0x45,0x54,0xab,0x8b,0x33,0x0f,0x45,0x91, + 0xfe,0xd3,0xff,0x66,0xef,0x7f,0x3c,0x64,0x29,0x71,0x49,0xe6,0xba,0xcc,0xe7,0xa2, + 0x29,0xc8,0x45,0xc9,0x4f,0xd6,0xba,0x48,0x2a,0x02,0x2d,0x1b,0x03,0xe0,0xf2,0x02, + 0x30,0x17,0x77,0x6b,0xb1,0x74,0xe9,0xd2,0x8e,0xb9,0xdd,0x4d,0xa5,0x4f,0x4a,0xf7, + 0xd6,0xbb,0x28,0x4d,0x52,0xa8,0x27,0x05,0xb9,0x29,0xd4,0xe5,0xef,0xa4,0xfb,0xdd, + 0xf7,0x40,0x08,0x75,0x61,0x16,0xfd,0x40,0xf2,0xb9,0x64,0xab,0xd9,0x7e,0x96,0xf5, + 0xd1,0x7f,0xfa,0xdf,0x4e,0xfd,0x97,0xe7,0x97,0x3c,0xe3,0x24,0x28,0x59,0xe2,0x92, + 0x7c,0xc1,0x90,0xb6,0x00,0x3f,0x59,0x47,0x5c,0x8c,0x2a,0x7e,0x46,0xd9,0x02,0x03, + 0xeb,0xe5,0x05,0xa8,0x6b,0x16,0x80,0x4d,0x11,0x80,0xe6,0xb7,0xfe,0xa5,0x9c,0xf3, + 0x94,0x29,0x53,0x22,0xb7,0x7d,0x5c,0x7b,0x3f,0x3e,0xb7,0x22,0xf8,0xf3,0x1c,0x8f, + 0x8f,0x85,0xba,0x29,0xd8,0x6d,0xaf,0xd5,0x5a,0xea,0x45,0x51,0x6f,0x8b,0xab,0x6c, + 0xd0,0x7f,0xfa,0xdf,0x8c,0xfd,0x97,0xfd,0x93,0x79,0x47,0xc4,0xe2,0x97,0x52,0xe3, + 0x2e,0x81,0x6f,0xeb,0x53,0x72,0x5a,0x6a,0x79,0x4d,0xce,0x93,0x62,0x3e,0xd7,0x5a, + 0xc2,0x03,0x90,0xa6,0x15,0xe1,0x01,0x68,0x2d,0xc1,0x2f,0xd6,0xbe,0x4c,0xe7,0x3c, + 0x67,0xce,0x9c,0x75,0xbe,0x8b,0xdd,0x64,0x21,0x82,0x35,0x2e,0x3e,0x63,0x4b,0x6b, + 0x13,0x8d,0x5b,0xd6,0x13,0x97,0xf9,0xcd,0x22,0xd4,0x6d,0x43,0x0d,0x00,0x00,0xa1, + 0x88,0xe0,0x97,0xd8,0xa4,0xe1,0xc3,0x87,0x07,0x3d,0x13,0x5d,0x55,0x46,0x63,0x25, + 0x20,0xf6,0x82,0xc6,0x1e,0x47,0xd7,0xd4,0xd5,0x4d,0x1d,0x03,0x90,0xc5,0x0b,0x00, + 0xcd,0x85,0x08,0x74,0x11,0xf8,0x33,0x67,0xce,0x8c,0xac,0x7b,0x9b,0xd0,0x8d,0x3f, + 0x77,0x09,0x75,0xf3,0xbd,0x4d,0xa8,0x4b,0x4a,0x8d,0x78,0x16,0x92,0xe3,0x6c,0x66, + 0x1a,0x61,0xbd,0x27,0xf5,0x09,0x7d,0x00,0xd4,0xab,0x20,0x11,0xfd,0xa7,0xff,0xf4, + 0xbf,0x98,0xfe,0x4b,0x80,0x9f,0x4c,0x21,0x3e,0x72,0xe4,0xc8,0x54,0x41,0x9f,0x26, + 0xf4,0x6d,0x1e,0x8e,0xd8,0x28,0xf1,0xcd,0x0f,0xd2,0xb4,0x1e,0x80,0x34,0x8f,0x00, + 0xc2,0xbf,0x79,0x11,0x2b,0x7c,0xf6,0xec,0xd9,0x51,0x75,0x2b,0xb9,0x48,0x45,0x70, + 0x8b,0xbb,0x5f,0x52,0x5f,0x92,0xa9,0x6d,0x71,0x8e,0x7a,0x48,0x9e,0xba,0xcd,0x25, + 0x28,0x37,0x9e,0x6c,0x43,0xc6,0xc9,0x64,0x5d,0xa6,0x07,0x21,0x6b,0xe9,0xd1,0x5a, + 0x4a,0x95,0xe6,0xe5,0x01,0xcb,0x73,0x7b,0xf4,0x9f,0xfe,0xd3,0xff,0xe2,0xfa,0x2f, + 0xc6,0x8b,0xcc,0x24,0x6a,0x13,0xfc,0x69,0xbf,0xf5,0xd5,0x27,0x48,0xc6,0x00,0x24, + 0xd3,0x00,0x6d,0x05,0xd2,0x5a,0x2e,0x0d,0x30,0x54,0x39,0x80,0xf2,0x22,0x02,0x59, + 0xf2,0xf3,0xa5,0x25,0x49,0x73,0x8d,0xf9,0xc6,0xfc,0x92,0xaf,0x32,0x64,0x20,0x59, + 0x00,0x72,0x43,0xb8,0xdc,0xfc,0x8c,0xa1,0xd2,0x7f,0xfa,0x4f,0xff,0x8b,0xe8,0x7f, + 0x5c,0xd6,0x7a,0xc3,0x0d,0x37,0xb4,0x0a,0x72,0x57,0x8d,0x03,0x9b,0xa5,0x6f,0xfb, + 0x2c,0x19,0x48,0x98,0x4c,0x03,0x94,0xe7,0x5d,0x1c,0x08,0x68,0x2e,0xdb,0xb4,0x41, + 0x80,0x36,0x0b,0x1f,0xcb,0xbf,0xb9,0x49,0xe6,0xac,0x66,0x55,0xf0,0x5c,0xaf,0x71, + 0x09,0xde,0x38,0x43,0x20,0x9e,0x9a,0xd5,0x76,0x83,0x95,0xe1,0x81,0x51,0xf4,0xfa, + 0x5c,0x56,0x05,0xfd,0xa7,0xff,0xf4,0xbf,0x98,0xfd,0x8d,0x4b,0x7e,0x8b,0x61,0x63, + 0x7b,0xf6,0xb8,0x66,0xed,0x0c,0x11,0xce,0x36,0x2f,0x40,0xf2,0x39,0x17,0xb7,0x58, + 0x09,0xc8,0xb2,0xee,0xa6,0xf0,0x00,0xa4,0xb9,0x4b,0x50,0x06,0xda,0x8f,0xe4,0x78, + 0x97,0x5c,0xf4,0x22,0xf8,0xcd,0xe2,0x3e,0xc9,0x1b,0x34,0xd6,0x8c,0x5d,0xca,0x47, + 0xc8,0x18,0x9f,0xed,0x7d,0x2d,0x63,0x86,0x69,0xeb,0xab,0x66,0xcc,0xd1,0x65,0x51, + 0xd0,0x7f,0xfa,0x4f,0xff,0x8b,0xeb,0xbf,0x2c,0xb7,0x78,0xf1,0xe2,0x28,0xa5,0x2f, + 0x1e,0xae,0x34,0xc7,0xf3,0x5d,0x0a,0x88,0x69,0xd9,0x9b,0xcb,0xb8,0x9e,0x67,0x71, + 0x10,0xa0,0x78,0x53,0xa5,0x25,0xa7,0x47,0x6f,0x94,0x3c,0xac,0x5b,0x10,0x20,0xb4, + 0x2e,0x59,0x83,0x72,0xc4,0xdd,0x26,0xc2,0xdf,0xa6,0x65,0x9b,0xcb,0x27,0xf3,0x64, + 0x6b,0x2d,0xed,0xe9,0xb3,0x28,0x7c,0x0f,0x1c,0xdf,0xfa,0xcc,0xdf,0xfb,0xf6,0x3f, + 0x64,0xfd,0xf4,0x9f,0xfe,0xd3,0xff,0x7c,0xfb,0x2f,0xc1,0xc5,0x92,0x55,0x14,0x57, + 0xf0,0xb3,0x3d,0x87,0x5c,0x55,0xf9,0xd2,0x94,0x01,0x73,0x9a,0x61,0xdb,0xf2,0xe2, + 0x71,0x88,0x5b,0x5c,0x4b,0xc0,0xd6,0xea,0x15,0x14,0xd8,0x15,0xf1,0x05,0xb5,0x0a, + 0xff,0x2c,0xb5,0xbc,0x45,0xf0,0x27,0x0b,0xe9,0x84,0x7a,0x0c,0x42,0x2d,0x9a,0x10, + 0x6b,0x23,0xd4,0x22,0xc9,0xe2,0xd1,0xc8,0x63,0xff,0xe8,0x3f,0xfd,0xa7,0xff,0xc5, + 0xad,0x5f,0x2c,0x7e,0x09,0xf0,0x1b,0x31,0x62,0x84,0xd7,0x8b,0x60,0x13,0xf0,0xb6, + 0xdf,0x84,0xce,0x8c,0x98,0xac,0x03,0x20,0xcd,0x56,0x2d,0xb5,0x11,0xa0,0x00,0x40, + 0xcd,0x6e,0x7d,0x9f,0x86,0x1e,0xcf,0xca,0x17,0x47,0xbc,0x9a,0xb3,0xfb,0x99,0xeb, + 0x2a,0x4b,0xed,0xf2,0x46,0x1d,0x4b,0xfa,0x4f,0xff,0xe9,0x7f,0x7e,0xfd,0x97,0x5c, + 0x7e,0x79,0xe6,0xc8,0xec,0xa2,0xa6,0xd1,0x62,0xfe,0xd6,0x25,0xdc,0xcd,0x67,0x5d, + 0x5a,0xaa,0x9f,0x4d,0xf0,0xc7,0xdb,0x8b,0x85,0x7f,0xb2,0x35,0x52,0x11,0x40,0x01, + 0x80,0x9a,0x3d,0x00,0xe6,0xfb,0xe4,0x67,0xc9,0x62,0x40,0xa6,0x6b,0xd1,0xf6,0x80, + 0xf2,0x69,0xfc,0x3e,0x17,0x5f,0xd2,0x65,0xe8,0x73,0x49,0x66,0x75,0x79,0x16,0xe5, + 0x3d,0xa1,0xff,0xf4,0x9f,0xfe,0xe7,0xdf,0xff,0x78,0x02,0x31,0x29,0xe4,0x13,0x62, + 0xf1,0xa7,0x79,0x02,0x6c,0x16,0x7e,0x48,0x5a,0xa1,0xcd,0x18,0x2a,0x53,0x41,0x3c, + 0x14,0x00,0x28,0x04,0xb9,0xd0,0x45,0xdb,0x4d,0x1b,0xe3,0x0f,0x19,0x33,0xcc,0xf2, + 0x40,0xa8,0xc6,0xe2,0xc9,0x73,0x8c,0x2d,0xab,0x05,0x43,0xff,0xe9,0x3f,0xfd,0xcf, + 0xbf,0xff,0x22,0xf8,0xe3,0x0a,0x7e,0xae,0xe7,0x4f,0x9a,0x80,0x77,0xd5,0xf5,0x0f, + 0x71,0xf1,0xbb,0xde,0x27,0xff,0x4e,0x2a,0x01,0xf1,0x67,0x21,0x13,0x09,0xa1,0x00, + 0x40,0x29,0x3d,0x00,0x66,0x90,0x8c,0x69,0xf1,0x67,0x19,0x73,0xcc,0xd3,0xe2,0x71, + 0x3d,0x3c,0x8a,0xbc,0xb1,0xb2,0x6e,0x8f,0xfe,0xd3,0x7f,0xfa,0x9f,0x4f,0xff,0x65, + 0x39,0x29,0x22,0x26,0xc1,0x7d,0x32,0xd6,0x1f,0x52,0x99,0xaf,0x16,0xeb,0x3f,0x4d, + 0xe0,0x9b,0x25,0x80,0x93,0x53,0xa2,0xbb,0xac,0x7f,0x73,0x78,0x01,0x0f,0x00,0x94, + 0x16,0x29,0xd6,0xd3,0xa7,0x4f,0x1f,0xeb,0x0d,0xec,0x1a,0xe3,0xaf,0x37,0x14,0x4e, + 0xa1,0xff,0xf4,0xbf,0x3d,0xfa,0x3f,0x77,0xee,0x5c,0xd5,0xbb,0x77,0xef,0x75,0x4a, + 0x87,0x9b,0xc7,0xc1,0xf5,0x59,0x68,0x30,0x5f,0x9a,0xa2,0x63,0x4b,0x23,0x74,0x6d, + 0xcb,0x65,0xfd,0x13,0x03,0x00,0xa5,0x46,0x72,0x66,0xa5,0x04,0xb0,0x94,0xe9,0x8d, + 0xc7,0xb4,0xcc,0x22,0x16,0x79,0xd5,0xea,0xce,0xe3,0xfb,0x34,0x97,0x62,0xad,0x69, + 0x53,0x79,0xa7,0x65,0xd1,0x7f,0xfa,0x4f,0xff,0xb3,0xf5,0x4f,0x26,0x24,0x93,0x3e, + 0x4a,0x5a,0x9f,0x6f,0x3c,0xdd,0x66,0xe1,0xfb,0xac,0xfe,0x2c,0xfb,0x1e,0x32,0x4c, + 0xe0,0xb3,0xfe,0xeb,0x6e,0xc8,0x21,0xd2,0x20,0x0b,0x32,0xbe,0x26,0xda,0x36,0x00, + 0x40,0xa3,0x89,0x4b,0x91,0xbb,0x02,0x0a,0x93,0x82,0xd6,0x15,0xdd,0xef,0x12,0xc0, + 0x21,0x63,0xfa,0x69,0x93,0x02,0xd9,0xb6,0x5f,0x36,0x3a,0x73,0x09,0x01,0x00,0x40, + 0xb3,0x62,0x0b,0xde,0xb3,0x09,0x5e,0xdf,0xb8,0xbe,0xb9,0x2e,0x9f,0x77,0xc0,0x15, + 0x34,0x68,0x5a,0xf8,0xae,0xed,0xa3,0x00,0x00,0x00,0x00,0xd4,0x28,0xfc,0xd3,0x8a, + 0x01,0xa5,0x0d,0x61,0x98,0xcb,0x25,0xad,0x78,0xdf,0x04,0x3f,0x69,0xef,0x43,0xb6, + 0x8f,0x02,0x00,0x00,0x00,0x90,0x93,0x22,0x10,0x62,0xe9,0xa7,0xd5,0xed,0x37,0xbd, + 0x00,0xa1,0xc3,0x06,0x65,0x18,0xcf,0x47,0x01,0x00,0x00,0x00,0x70,0x58,0xfa,0x69, + 0x15,0xfb,0xd2,0xfe,0xb6,0xb9,0xf1,0xd3,0x52,0x18,0x51,0x00,0x00,0x00,0x00,0x1a, + 0xe4,0x09,0x30,0x3f,0xb3,0x15,0xe5,0xb1,0xa5,0xe8,0xd9,0x52,0xf9,0xd2,0x3c,0x05, + 0xc9,0xed,0xf8,0xb6,0x8f,0x02,0x00,0x00,0x00,0x50,0xb0,0x22,0xe0,0x4a,0x7f,0x0c, + 0x15,0xc4,0xa1,0xde,0x82,0x50,0x4f,0x01,0x59,0x00,0x00,0x00,0x00,0x39,0x5b,0xfc, + 0x36,0xeb,0xdd,0x54,0x06,0xcc,0xc9,0x7e,0x4c,0x2f,0x80,0x4d,0xc0,0xa7,0xd5,0x01, + 0x48,0xfb,0xcc,0xdc,0x46,0xa3,0x6b,0xfe,0xa3,0x00,0x00,0x00,0x40,0x4b,0x61,0x96, + 0xdd,0x4d,0x0a,0x63,0xb3,0x70,0x50,0x48,0x3a,0x60,0x35,0x11,0xfc,0xb6,0xe8,0x7f, + 0x5b,0x49,0x60,0x3c,0x00,0x00,0x00,0x00,0x39,0x7a,0x00,0xcc,0x48,0xfd,0x34,0x4b, + 0xbc,0x1a,0xcb,0xde,0xf4,0x34,0x98,0xca,0x84,0x2b,0x7b,0x20,0xb9,0x7d,0x3c,0x00, + 0x00,0x00,0x00,0x05,0x79,0x02,0x6c,0x02,0xd9,0x25,0xf4,0x43,0x2d,0x7b,0x5b,0x1c, + 0x41,0xc8,0xac,0x80,0xe6,0x90,0x43,0x9a,0xd2,0x81,0x02,0x00,0x00,0x00,0x50,0x85, + 0xe0,0x37,0x05,0xad,0xab,0x86,0x7f,0x56,0x0b,0xdc,0xcc,0x18,0xb0,0x09,0xf8,0x90, + 0xed,0x93,0x05,0x00,0x00,0x00,0x50,0x20,0xb5,0x14,0xe3,0xf1,0x15,0xf5,0x31,0x2d, + 0x7f,0x9f,0x82,0xe1,0xaa,0x23,0x50,0x36,0xda,0x76,0x32,0xa0,0x85,0x0b,0x17,0xaa, + 0x19,0x33,0x66,0x70,0xd7,0x00,0x00,0x14,0x44,0x8f,0x1e,0x3d,0xd4,0xa8,0x51,0xa3, + 0x0a,0x17,0xfa,0xae,0xb2,0xbc,0xe6,0xb2,0x69,0x13,0xfc,0x98,0x16,0x7e,0xb2,0x1c, + 0xb0,0x6b,0x08,0x20,0x74,0xfb,0x65,0xad,0x0e,0xd8,0x16,0x0a,0x80,0xcc,0x5d,0x3f, + 0x70,0xe0,0xc0,0xb5,0x3e,0x93,0x79,0xa3,0x37,0xde,0x78,0x63,0xe7,0x6f,0x1a,0x3d, + 0x97,0x76,0xad,0x53,0x75,0xe6,0xbd,0x7d,0xfa,0x4f,0xff,0xe9,0x3f,0xfd,0xaf,0x66, + 0x7b,0x32,0x83,0xe8,0xbc,0x79,0xf3,0x0a,0xdd,0xcf,0x10,0xeb,0xdf,0x95,0x31,0xe0, + 0x9a,0xd1,0x2f,0x6d,0x1e,0x80,0x6a,0xb6,0x8f,0x02,0xd0,0x20,0x7a,0xf7,0xee,0x5d, + 0x95,0x0b,0x26,0xed,0x37,0xbe,0x1b,0x34,0xaf,0x8b,0xdb,0xf7,0x5d,0x23,0xb7,0x4f, + 0xff,0xe9,0x3f,0xfd,0xa7,0xff,0x3e,0x96,0x2d,0x5b,0x56,0xb8,0x07,0x20,0xd4,0xca, + 0x77,0x29,0x34,0xe6,0xe4,0x3f,0xa1,0xde,0x86,0x90,0x80,0x40,0x14,0x80,0x06,0x5b, + 0xff,0x3d,0x7b,0xf6,0xcc,0xac,0xe1,0x86,0x68,0xe0,0x9d,0x3b,0x77,0xce,0xb4,0x7c, + 0xd6,0xf5,0xa7,0x5d,0x90,0xb5,0x6a,0xe8,0xf4,0x9f,0xfe,0xd3,0x7f,0xfa,0x5f,0x74, + 0xff,0xe5,0xb3,0x22,0x15,0x80,0x34,0xa5,0x25,0x2d,0x55,0xcf,0xd5,0x7f,0xdb,0x6f, + 0xcd,0xdf,0x64,0x39,0xc6,0x65,0x57,0x04,0x5a,0x5e,0x01,0xe8,0xd3,0xa7,0x8f,0xf3, + 0xe0,0xdb,0x4e,0x78,0xda,0xb4,0x92,0x3e,0x0d,0x3c,0xcf,0xe5,0xe3,0x9b,0x4b,0x5e, + 0x5d,0x37,0x78,0xf2,0xf7,0x21,0xcb,0xd3,0x7f,0xfa,0x4f,0xff,0xe9,0x7f,0x3d,0xfb, + 0xbf,0x64,0xc9,0x92,0xc2,0x5d,0xe2,0x3e,0x45,0x26,0x74,0x1c,0xdf,0xe5,0x59,0xc8, + 0x22,0xf8,0x43,0xb6,0x8f,0x02,0x50,0x27,0xba,0x74,0xe9,0xa2,0x7a,0xf5,0xea,0xd5, + 0xb4,0xfb,0x9f,0xbc,0x60,0x44,0x8b,0x5e,0xb4,0x68,0x51,0x74,0x43,0x2d,0x5f,0xbe, + 0x5c,0xad,0x5e,0xbd,0xba,0xe1,0x63,0x4d,0xf2,0xb0,0xe9,0xde,0xbd,0xbb,0xea,0xdb, + 0xb7,0xaf,0xea,0xdf,0xbf,0x7f,0x74,0xbc,0x8b,0xd6,0xe6,0x43,0x1e,0x4a,0xf5,0x72, + 0x91,0x36,0xc2,0x9a,0xa1,0xff,0xf4,0xbf,0x99,0xfa,0x2f,0xcf,0xab,0x7a,0xe1,0x9a, + 0xb0,0xc7,0x14,0xc2,0xbe,0xc0,0xbd,0x10,0x05,0xc1,0xa7,0x88,0xb8,0xb6,0x8f,0x02, + 0x50,0x47,0x44,0x30,0x55,0xeb,0x92,0xab,0xd5,0x65,0x97,0xd7,0xf2,0x0b,0x16,0x2c, + 0x50,0x73,0xe7,0xce,0xb5,0xba,0xd1,0x5c,0xa5,0x27,0xf3,0xd8,0x7e,0xc8,0xfa,0x62, + 0xf7,0x9e,0xb4,0x0f,0x3e,0xf8,0x40,0x0d,0x1b,0x36,0xac,0x43,0xe1,0xca,0xfb,0x78, + 0x55,0xa3,0x79,0x17,0xdd,0xff,0x7a,0x9c,0x7f,0xfa,0x4f,0xff,0x9b,0xb5,0xff,0xf2, + 0x5c,0x58,0xb9,0x72,0x65,0xdd,0xac,0xff,0xb4,0x59,0xfe,0x7c,0x0a,0x43,0x16,0x81, + 0xef,0x1a,0x3a,0xc8,0xba,0x7d,0x14,0x80,0x82,0xad,0x7f,0x09,0xfe,0xcb,0xe2,0x62, + 0x4b,0x8e,0x69,0xf9,0xbe,0x77,0xd5,0x99,0x4e,0x5e,0x04,0xbe,0x31,0xb2,0x34,0x8d, + 0x7d,0xe9,0xd2,0xa5,0x6a,0xe6,0xcc,0x99,0x6b,0x34,0x68,0xad,0x41,0x76,0x1e,0xa0, + 0xbf,0x13,0x85,0xa6,0x97,0x6e,0x5d,0xa3,0xcf,0x72,0xbc,0x8d,0xd6,0xac,0x2f,0xbe, + 0x50,0x3b,0x25,0x3e,0x73,0x2d,0x2f,0x1e,0x88,0x65,0xda,0x13,0x31,0x4f,0x55,0x74, + 0x5b,0xb5,0x6a,0x95,0x9a,0x3e,0x7d,0x7a,0x94,0xf2,0x23,0xa9,0x3f,0xb5,0xf6,0x3f, + 0xeb,0x03,0xc8,0x77,0xfc,0x9b,0xed,0xfc,0xd3,0x7f,0xfa,0xdf,0xec,0xfd,0x5f,0xbc, + 0x78,0x71,0x5d,0xad,0xff,0xb4,0x4a,0x7f,0x59,0xc7,0xef,0x43,0xbc,0x0c,0x59,0xb7, + 0x8f,0x02,0x50,0x47,0xfa,0xf5,0xeb,0xd7,0x71,0xf1,0x56,0xeb,0x32,0x2b,0x72,0x8c, + 0xcc,0x76,0xe3,0xc4,0x17,0x91,0xa4,0xcc,0xbc,0xf7,0xde,0x7b,0x4a,0xae,0xa1,0x2e, + 0x5d,0xd7,0x53,0x9d,0xbb,0x0c,0xd1,0xa2,0xb8,0x6b,0x87,0x80,0x36,0xc5,0xf5,0x3a, + 0xdb,0x36,0xc4,0xb7,0x7f,0x79,0x7d,0x63,0xeb,0x7f,0x9d,0xd6,0xd4,0x85,0x8a,0xdf, + 0x57,0x1c,0xbf,0xd0,0xea,0x88,0xfe,0xa6,0xb3,0xfe,0xd7,0x55,0x2b,0x5a,0x7d,0xb4, + 0x12,0x30,0x40,0xad,0x5a,0x39,0x35,0xda,0xff,0xd9,0xb3,0x67,0xab,0x0d,0x37,0xdc, + 0xb0,0xa6,0xfe,0xdb,0x1e,0x80,0x59,0x6f,0xa2,0x3c,0x5c,0xa6,0x8d,0x3a,0xff,0xf4, + 0x9f,0xfe,0x37,0x7b,0xff,0xeb,0x15,0xfc,0x97,0xe6,0xda,0x4f,0x9b,0x07,0x20,0xab, + 0x20,0x77,0x79,0x40,0xab,0xd9,0x3e,0x0a,0x40,0xc1,0x88,0xe0,0x4f,0x0b,0xfe,0x2b, + 0x83,0xcb,0xce,0x75,0x31,0x8b,0xd5,0x3f,0x67,0xce,0x1c,0xdd,0x87,0x1e,0xaa,0x5b, + 0x8f,0xd1,0xfa,0xb5,0xa7,0xea,0xd6,0xbd,0x97,0x1a,0x32,0x64,0x13,0xd5,0xb7,0xff, + 0x50,0x6d,0x5d,0xf7,0xd5,0x42,0xb7,0x5b,0x6d,0xdb,0xce,0x6a,0xf0,0x1b,0xac,0x5a, + 0xb5,0x42,0x2d,0x59,0x3c,0x57,0xbd,0x37,0xe3,0x15,0xb5,0x68,0xe1,0x2c,0xd5,0x45, + 0x89,0x77,0x42,0xbb,0xfb,0x56,0xbc,0x17,0x69,0xfd,0xe2,0x0d,0x90,0xec,0x8b,0x6a, + 0xfa,0x9f,0xe5,0x01,0x96,0x87,0xc5,0x50,0xb6,0xf3,0x4f,0xff,0xe9,0x7f,0x2b,0xf4, + 0x5f,0xe2,0x95,0xea,0x29,0xf4,0x7c,0x81,0x7c,0x21,0x9f,0xdb,0x3c,0x30,0xbe,0xac, + 0x82,0x6a,0xbc,0x05,0x28,0x00,0x75,0xb0,0xfe,0xcd,0x13,0x54,0x6f,0x97,0x5d,0x9a, + 0xa6,0xea,0xba,0xa1,0x44,0xf8,0xcb,0x78,0x7f,0x97,0xae,0xfd,0x54,0xf7,0x9e,0x1b, + 0xe9,0xfd,0xe9,0xa6,0x86,0x0d,0xdf,0x5a,0xad,0x3f,0x74,0x33,0xfd,0x7d,0x9e,0x55, + 0x9b,0x3d,0x3e,0x02,0x8f,0x82,0xd0,0xa5,0x6b,0x17,0xd5,0xbd,0xc7,0x70,0xd5,0x7f, + 0xe0,0x30,0x35,0x79,0xd2,0x23,0x6a,0xc1,0xfc,0xf7,0x54,0xd7,0xee,0x43,0xb4,0x17, + 0xe0,0xfd,0xa8,0x3f,0x12,0xa4,0x68,0x2a,0x00,0x45,0x8f,0xb1,0x66,0x3d,0xfe,0x65, + 0x3c,0xff,0xf4,0x9f,0xfe,0xb7,0x4a,0xff,0xeb,0xe5,0xfe,0xb7,0xf5,0x3b,0x4b,0xb4, + 0x7e,0x9a,0xa5,0xef,0x2b,0xfe,0x13,0xb2,0x7d,0x62,0x00,0xea,0x8c,0x1c,0x70,0x57, + 0xf0,0x5f,0xd6,0xb4,0x9b,0xac,0x63,0x62,0x69,0x2e,0x3d,0xdb,0xf6,0x93,0x7f,0x8b, + 0xdb,0x5f,0x2c,0xff,0x2e,0x5d,0xfb,0xaa,0xee,0xbd,0xc6,0xa8,0x6e,0xdd,0x7a,0xab, + 0x4d,0x37,0xdb,0x53,0xf5,0xee,0x33,0xd8,0x2b,0x91,0x65,0x35,0xb2,0x1b,0xf1,0xea, + 0xe2,0xf7,0xa1,0xd7,0x9d,0xef,0xf7,0x69,0xea,0xc2,0x88,0x91,0xdb,0xaa,0x89,0xaf, + 0xce,0xd4,0xef,0xba,0xeb,0x0f,0xbb,0xea,0xcf,0x57,0xae,0x75,0xbc,0x42,0xfb,0x1f, + 0x32,0x06,0x9a,0xf6,0x1a,0x62,0x2d,0x95,0xf9,0xfc,0xd3,0x7f,0xfa,0xdf,0x2a,0xfd, + 0x97,0xf8,0xa5,0xa2,0x83,0xff,0xf2,0xb4,0xb4,0x6d,0xe7,0xc9,0x54,0x02,0x5c,0xdb, + 0xb2,0x0d,0xd3,0x34,0x53,0x55,0xc0,0x96,0x53,0x00,0xc4,0xf5,0x5f,0x6d,0x3a,0x9a, + 0x6f,0x8c,0x2e,0xcf,0x1b,0x2e,0xb9,0x3e,0x19,0x2b,0x7b,0xff,0xfd,0xf7,0x75,0xa0, + 0x5f,0x37,0xd5,0xa3,0xf7,0x87,0xc2,0x7f,0xf3,0x8f,0xec,0xaf,0x23,0xea,0x07,0x04, + 0x5a,0x0f,0x1e,0x01,0x5e,0x6b,0xd1,0x90,0x14,0x05,0xa0,0x4f,0xbf,0xc1,0x3a,0x46, + 0xa1,0xf3,0x5a,0xdb,0x8c,0xad,0xff,0x3c,0xc7,0x48,0xeb,0xe1,0x32,0x6d,0xd4,0xf9, + 0xa7,0xff,0xf4,0xbf,0x95,0xfa,0x2f,0x99,0x4b,0x65,0xc3,0x56,0xe3,0x3f,0xcd,0xb3, + 0x92,0x66,0xc1,0x9b,0xb3,0x00,0x86,0x0e,0x3b,0x50,0x07,0xa0,0x0e,0x48,0x3e,0x7a, + 0x11,0xc5,0x17,0xaa,0xd1,0xf8,0x43,0x5d,0x78,0xe2,0xfa,0x97,0xf7,0xbd,0xfb,0x8d, + 0xd1,0xae,0xf4,0x1e,0x6a,0xd3,0x2d,0x3e,0xae,0x06,0x0e,0xde,0xc0,0x69,0x81,0x7b, + 0xa3,0xfc,0x8c,0xef,0xd7,0x55,0x08,0xd6,0x56,0x18,0xd6,0xdd,0xd9,0xf4,0xf5,0x25, + 0xbf,0xef,0xb4,0x6c,0x55,0x34,0x24,0x50,0x59,0xbd,0x4a,0xff,0xbd,0xaa,0xa3,0xf6, + 0x82,0xad,0x22,0x58,0x9e,0x69,0x47,0x59,0x5d,0xa4,0x65,0x3e,0xff,0xf4,0x9f,0xfe, + 0xb7,0x4a,0xff,0x25,0xfe,0x47,0x3c,0x00,0x8d,0x16,0xf4,0xe6,0xdf,0xbe,0xf3,0xe4, + 0x9a,0xe2,0x37,0xcd,0xf5,0x1f,0xe2,0xe6,0xb7,0xc5,0x12,0xa0,0x00,0x14,0x84,0x08, + 0x1e,0x29,0x4c,0x13,0xe2,0x52,0xab,0x56,0x3b,0x4e,0x8b,0xda,0xad,0x26,0xed,0x46, + 0x66,0x25,0x94,0x80,0x99,0x6e,0xdd,0xfb,0xab,0x6e,0x3d,0x07,0xaa,0x01,0x03,0x86, + 0xe9,0x31,0xff,0x31,0x1e,0x81,0xed,0x93,0xf0,0x3e,0x05,0x21,0x9b,0xcf,0x3f,0xed, + 0xeb,0x45,0x73,0x66,0x69,0xcf,0x45,0x67,0xb5,0x72,0xf9,0xdc,0xd4,0xe1,0x97,0x5a, + 0x5d,0x8c,0xb6,0xf3,0x91,0xe7,0x18,0x6d,0xa3,0xce,0x3f,0xfd,0xa7,0xff,0xad,0xd4, + 0x7f,0xc9,0x02,0x6a,0x24,0x2e,0xc1,0x6e,0x73,0xed,0xbb,0xbe,0x77,0x1d,0xab,0x3c, + 0x82,0x0a,0x51,0x00,0xea,0x60,0xfd,0xe7,0xe1,0x22,0xcb,0x9a,0x96,0xe3,0x5b,0xbf, + 0xcb,0x85,0x26,0xe3,0xfe,0xf2,0xda,0xa3,0xcf,0x88,0xe8,0x06,0x1a,0xb9,0xf1,0xf6, + 0xaa,0x6b,0xb7,0xae,0x3e,0x35,0x37,0xd5,0xa4,0x5f,0x47,0xfe,0x9b,0xfb,0xee,0x75, + 0x01,0x84,0x33,0x67,0xf6,0x9b,0xaa,0xb3,0x5e,0xcf,0x8a,0xe5,0x1f,0xde,0xf8,0x32, + 0xeb,0x62,0x5a,0xfc,0x45,0xb5,0x63,0xa2,0x45,0xaf,0xaf,0x51,0xe7,0x9f,0xfe,0xd3, + 0xff,0x56,0xe9,0xbf,0x7c,0x27,0x41,0xcc,0x32,0x04,0x58,0x6f,0x61,0x17,0x3a,0xd5, + 0xaf,0xcf,0xb5,0xef,0x12,0xea,0x21,0x13,0x05,0x85,0x4c,0x42,0x84,0x02,0x50,0x10, + 0xe2,0x7a,0x96,0xf1,0xff,0xa2,0xb4,0x49,0xdf,0x0d,0x14,0xe2,0x82,0x33,0xdf,0x4b, + 0xb4,0xbc,0x44,0xcb,0x76,0xe9,0xda,0x53,0x47,0xfd,0x0f,0xd4,0x1e,0x8c,0xfe,0x6a, + 0xc8,0x06,0xeb,0xce,0x9d,0xbd,0x6e,0x96,0xde,0xda,0x9f,0x7c,0x98,0xb7,0xdf,0xc9, + 0x99,0xb7,0x9f,0xfd,0x6e,0x5a,0xdb,0x63,0xb0,0x8e,0xc3,0x60,0xcd,0xd7,0x8b,0x17, + 0xcf,0x57,0xf3,0xe7,0xcd,0xd0,0xdf,0x2d,0xd7,0x1e,0x80,0xf9,0x1d,0x65,0x81,0xab, + 0xb1,0x50,0x8a,0x3e,0x3f,0x65,0x3c,0xff,0xf4,0x9f,0xfe,0xb7,0x52,0xff,0x65,0xec, + 0x5f,0xa6,0xfe,0x15,0x43,0x26,0xef,0xb2,0xe0,0x59,0x85,0xbf,0xad,0x04,0xb0,0x4d, + 0x90,0x87,0x94,0x02,0x8e,0x97,0x0b,0x55,0x32,0x5c,0xdb,0xa7,0x14,0x70,0x81,0xc4, + 0xae,0xe7,0x22,0xf3,0x74,0xf3,0xbe,0x61,0xa4,0x7c,0xae,0xbc,0xf6,0xea,0x33,0x3c, + 0xd2,0x9a,0x47,0x8d,0xd9,0x56,0xf5,0xe8,0xd9,0xc3,0x27,0x8f,0xbd,0x31,0x01,0xbe, + 0x11,0x01,0xef,0xfa,0x4d,0x07,0x81,0x23,0x4b,0x70,0xea,0xdb,0x93,0x55,0x67,0x3d, + 0xfe,0xbf,0x64,0xd1,0xcc,0xe8,0xf3,0xc1,0x83,0x07,0xa7,0x06,0x0d,0x65,0x7d,0x60, + 0x56,0xf3,0x10,0x68,0xa6,0xf3,0x4f,0xff,0xe9,0x7f,0x2b,0xf5,0x5f,0xbc,0x99,0x82, + 0x64,0x00,0xd4,0x53,0x01,0xb0,0x29,0x02,0x2e,0x81,0xee,0x1a,0x0e,0x08,0x89,0xdc, + 0xb7,0x05,0x11,0x26,0xcf,0xb1,0x6f,0xfb,0x0c,0x01,0x14,0x48,0x32,0xf8,0x2f,0xe4, + 0xa0,0xe7,0xad,0x95,0x65,0x1d,0xc3,0x93,0xcf,0x25,0xf5,0xaf,0x73,0xe7,0xae,0xaa, + 0x57,0xbf,0xa1,0xda,0x0b,0xd0,0x4d,0x8d,0x18,0xbd,0x95,0xea,0xa2,0xdd,0xff,0x99, + 0x03,0x86,0x3c,0x02,0xde,0x94,0xe8,0x59,0x7f,0x6f,0x53,0x40,0x56,0xad,0x5a,0xa9, + 0x66,0xce,0x98,0xa4,0xd7,0xa3,0xf3,0xfe,0x17,0xcf,0x8a,0x14,0x98,0x41,0x83,0x06, + 0x75,0xdc,0xf8,0x21,0x63,0x98,0x3e,0x17,0x66,0x35,0x0f,0xdf,0x66,0x39,0xff,0xf4, + 0x9f,0xfe,0xb7,0x52,0xff,0xc5,0xf2,0x97,0x58,0x26,0x41,0x26,0x2a,0xab,0xa7,0xd0, + 0x4f,0xfb,0xdb,0xf7,0xbb,0x50,0xb7,0x7e,0x88,0xc2,0x15,0xb2,0x3e,0x14,0x80,0x22, + 0x3a,0xa1,0x85,0x4f,0xcf,0x9e,0x3d,0x53,0x35,0xf2,0x90,0x1b,0xb0,0x9e,0x16,0x80, + 0xb8,0xcb,0x24,0x62,0xb6,0x67,0x1f,0x11,0xfe,0xdd,0xd5,0xf0,0x91,0x9b,0xab,0x9e, + 0xbd,0x7a,0xdb,0x4d,0xfa,0x8c,0x95,0xfa,0x2c,0x57,0x5e,0x7a,0x61,0x00,0x5f,0x4c, + 0x80,0x25,0xe6,0xe0,0x7d,0x2d,0xfc,0x57,0xad,0x5a,0xae,0x96,0x2f,0x9d,0xad,0x3f, + 0x5e,0xa9,0x83,0x17,0x07,0xae,0x55,0xfc,0xa7,0x0c,0xb3,0x91,0x95,0xf9,0xfc,0xd3, + 0x7f,0xfa,0xdf,0x4a,0xfd,0x9f,0x35,0x6b,0xd6,0x5a,0x82,0x4e,0x94,0x00,0x5f,0x29, + 0xf6,0x3c,0xfb,0x99,0x16,0xdc,0x57,0x6b,0xe0,0x63,0x5a,0xd6,0x80,0xcb,0xf5,0x6f, + 0x53,0x32,0xf0,0x00,0x14,0x84,0xad,0xf2,0x5f,0x51,0xee,0xa5,0xbc,0x2a,0x77,0xc5, + 0xee,0xb2,0x3e,0x03,0x46,0x44,0x51,0xf4,0xa3,0x36,0xd9,0x36,0xb2,0xfe,0x83,0x4c, + 0xf0,0x75,0xae,0x54,0x95,0x29,0x2d,0x30,0x8e,0x17,0xe8,0xe4,0x8a,0x21,0x08,0x48, + 0x03,0x9c,0xfe,0xce,0xab,0xd1,0x7e,0x2f,0x5d,0x38,0x23,0xfa,0x68,0xc8,0x90,0x21, + 0x35,0xcd,0x4e,0x58,0x76,0xca,0x58,0x3a,0x96,0xfe,0xd3,0xff,0x32,0xf4,0x5f,0x84, + 0xbd,0x04,0xff,0x25,0xa9,0x97,0x02,0xe0,0x12,0xf4,0x21,0x69,0x7a,0x2e,0xa1,0x6d, + 0xf6,0xd3,0x57,0x10,0xc8,0xdc,0x7e,0x51,0x13,0x11,0xa1,0x00,0x38,0x88,0x03,0xcf, + 0x42,0x35,0xb4,0x6a,0x6f,0xc8,0xbc,0xa2,0x74,0x65,0x86,0x3f,0xc9,0x95,0xed,0xde, + 0xb3,0xbf,0xea,0xd9,0x7b,0xa0,0xea,0x3f,0x68,0x03,0xb5,0xfe,0xb0,0x51,0x89,0x20, + 0x3e,0xa3,0xd2,0x5f,0x36,0xf9,0xee,0xbf,0x99,0x55,0x70,0x9a,0xbf,0xf5,0xfb,0x0f, + 0xe6,0xea,0x9a,0xff,0x0b,0x67,0xab,0xd5,0xab,0x16,0xeb,0xe0,0xbf,0x85,0xd1,0xac, + 0x8b,0xe6,0xcc,0x8b,0xd5,0x4c,0x1e,0x52,0x4b,0x29,0xd5,0x66,0x3a,0xff,0xf4,0x9f, + 0xfe,0xb7,0x52,0xff,0x25,0x96,0x49,0xbc,0x99,0x66,0x7f,0xea,0xa5,0x98,0xa4,0x09, + 0xf9,0xb4,0x7d,0xb1,0xa5,0x4a,0xda,0xac,0xff,0x10,0x2f,0x43,0x5a,0x10,0x21,0xa5, + 0x80,0x0b,0x24,0x9e,0xf8,0xc7,0x76,0xe0,0x6b,0x99,0xcd,0xaa,0xd6,0x1b,0x3a,0x8d, + 0xd8,0xfa,0xef,0x3b,0x68,0x64,0x64,0x45,0x6f,0x3c,0x76,0x87,0xa8,0x98,0x8e,0x5b, + 0x40,0xa7,0x5b,0xec,0xd9,0x67,0xff,0xab,0x6d,0x7d,0xd3,0xdf,0x7e,0x39,0xda,0xef, + 0xc5,0xf3,0xdf,0xb5,0x5a,0xff,0xb5,0xb8,0xdb,0x42,0x2b,0x9f,0xd9,0xc6,0x5c,0x9b, + 0xe5,0xfc,0xd3,0x7f,0xfa,0xdf,0x4a,0xfd,0x4f,0xba,0xff,0x93,0x1e,0x80,0x7a,0x7b, + 0x28,0x42,0x2c,0xfc,0xe4,0xe7,0xe6,0x7b,0x97,0x3b,0xdf,0x65,0xbd,0xbb,0x84,0x7c, + 0x33,0x4c,0x02,0xd4,0x32,0x0a,0x80,0x59,0x75,0xae,0x2c,0xb3,0x67,0xb9,0x10,0x4d, + 0x79,0xfe,0xfc,0xf9,0xfa,0xc6,0xd5,0x69,0x8b,0xfd,0x87,0xe9,0x71,0x73,0x3d,0xfe, + 0xbf,0xd1,0x16,0x5a,0x01,0xe8,0x9a,0x10,0xc0,0x6b,0x0b,0xe8,0xec,0x4f,0x93,0x8c, + 0x1a,0x41,0x06,0x9f,0xc2,0xd2,0xc5,0x0b,0xd4,0xf4,0x77,0x27,0xea,0xca,0x7f,0xcb, + 0xd5,0x92,0x05,0xef,0x45,0xa9,0x7f,0xae,0xdc,0xff,0x7a,0xb8,0xff,0xb2,0x3c,0x40, + 0xcb,0x70,0xfe,0xe9,0x3f,0xfd,0x6f,0xa5,0xfe,0x4b,0xe0,0x9f,0x6d,0xe2,0x9f,0x7a, + 0x2b,0x00,0xa1,0x4a,0x4b,0xd6,0x69,0x80,0x4d,0x8f,0x4a,0xda,0xd0,0x42,0xd9,0x27, + 0xfe,0x69,0x49,0x05,0x20,0x76,0x3d,0x17,0x3d,0xdb,0x96,0xef,0x86,0x0b,0x8d,0xdc, + 0x97,0xca,0x7f,0x72,0x73,0xf4,0xec,0x33,0x44,0xd7,0xd0,0xef,0xaa,0x06,0x0e,0x19, + 0xa6,0x03,0x18,0x7b,0xa7,0xbb,0xef,0x7c,0x63,0xf4,0xb5,0xdf,0x29,0xc1,0xb3,0x09, + 0xbd,0x36,0xe1,0x51,0xb9,0xbd,0xd5,0xfc,0xd9,0x53,0xa2,0x1d,0x18,0x3a,0x74,0x68, + 0x14,0xf9,0x9f,0xf7,0x6c,0x65,0x79,0xbb,0x48,0xcb,0x72,0xfe,0xe9,0x3f,0xfd,0x6f, + 0xa5,0xfe,0x4f,0x9f,0x3e,0xdd,0xb9,0xbe,0x7a,0x06,0x02,0xfa,0x04,0x79,0x9a,0x27, + 0x20,0xad,0xef,0x69,0xa5,0x7f,0x7d,0xb5,0x02,0x6c,0xdb,0x47,0x01,0x28,0x40,0x01, + 0x88,0x2f,0x32,0xdf,0x0d,0x9a,0xa5,0x54,0xa7,0x4d,0x9b,0x4e,0xfb,0x3b,0x74,0xb6, + 0xac,0xb8,0x4e,0x76,0xf7,0x9e,0x7d,0xa2,0x8a,0x7f,0x3d,0x7b,0xeb,0xf2,0xc5,0x3a, + 0xf7,0x3f,0x7d,0xf6,0xbe,0xb5,0x25,0xfe,0xba,0x0a,0x42,0xb6,0x98,0x80,0x75,0xe4, + 0xbb,0x27,0xe9,0x20,0x5e,0x7e,0xd2,0x2b,0x4f,0xab,0xf7,0xa7,0x4f,0x56,0xcb,0x16, + 0xcf,0x56,0x8b,0xe6,0xbd,0x1b,0x0d,0xbd,0x48,0xea,0x5f,0x96,0xfe,0x87,0x96,0x52, + 0x0d,0x79,0x00,0x65,0x7d,0x40,0x97,0xe1,0xfc,0xd3,0x7f,0xfa,0xdf,0x2a,0xfd,0x17, + 0x4f,0xa6,0xb4,0x2c,0x6e,0xf9,0x7a,0x0f,0x09,0xf8,0xf2,0xf5,0xb3,0x0e,0x2b,0x84, + 0xf6,0x2b,0x6d,0xfb,0x28,0x00,0x39,0xd2,0xa3,0x47,0x8f,0xaa,0xdc,0x41,0x59,0x6b, + 0x79,0xe7,0x35,0x3b,0x97,0x14,0xc9,0x88,0x22,0x4b,0xf5,0xb6,0x3a,0x75,0xd6,0x1e, + 0x81,0x05,0x73,0xa2,0xf1,0xff,0x0f,0x17,0x0b,0xf3,0xd9,0x67,0x4e,0x0a,0xf0,0xcd, + 0x0e,0xe8,0xf1,0x30,0xc8,0x62,0x13,0x27,0x3c,0xa5,0x5e,0x79,0xe1,0x21,0x1d,0xf4, + 0xb7,0x40,0xcd,0x7e,0xe7,0xdf,0x51,0xca,0xdf,0xe8,0xd1,0xa3,0x9d,0x0f,0x8c,0x3c, + 0x8e,0x57,0x91,0x63,0x98,0x8d,0x3a,0xff,0xf4,0x9f,0xfe,0xb7,0x42,0xff,0xc5,0xba, + 0x7f,0xfb,0xed,0xb7,0x53,0xb7,0x29,0xcb,0x14,0x5d,0x10,0x28,0xab,0xf5,0x6e,0x5a, + 0xe3,0x36,0xcf,0x4a,0xa8,0x80,0x77,0x79,0x5d,0x6c,0xdb,0x60,0x08,0xa0,0xa0,0x31, + 0x1e,0x19,0x83,0x0e,0xd5,0xe6,0xb2,0xce,0xaf,0x9d,0xd7,0x85,0x98,0x44,0x6e,0x08, + 0xf9,0x6c,0xc5,0xd2,0x85,0xfa,0x55,0xa7,0xd1,0x2d,0x59,0xa4,0xa6,0x4e,0x7e,0x49, + 0x6d,0xbc,0xf9,0x0e,0xa5,0x4c,0x29,0x5a,0xb2,0x68,0xbe,0x7a,0xf1,0xe9,0x7b,0xd5, + 0xbb,0x6f,0xbf,0xa6,0xf7,0x79,0x81,0x9a,0x31,0xe5,0x99,0x48,0x55,0xd8,0x64,0x93, + 0x4d,0xd6,0xaa,0xbd,0x90,0xb7,0xcb,0xb1,0x1e,0x95,0xd2,0x1a,0x71,0xfe,0xe9,0x3f, + 0xfd,0x6f,0x85,0xfe,0xbf,0xf5,0xd6,0x5b,0xd1,0x34,0xe6,0x3e,0x05,0xa0,0x1e,0x32, + 0xc0,0xe6,0x09,0xb1,0xb9,0xf7,0x43,0xa6,0xf0,0xcd,0xea,0xaa,0x77,0x55,0x07,0x74, + 0x05,0x20,0xa2,0x00,0xe4,0x48,0x2c,0x4c,0x43,0x6e,0xa0,0xac,0x95,0xba,0x7c,0x17, + 0x5a,0xb5,0xeb,0x8f,0x85,0xe6,0xd2,0x45,0x73,0xd4,0xaa,0x15,0x8b,0xf5,0x0c,0x80, + 0x7d,0xd5,0x8b,0xcf,0xfc,0x43,0x2d,0x5e,0x32,0x5f,0x8d,0xd9,0x6c,0x3b,0xd5,0xa7, + 0xef,0x20,0x1d,0x1b,0xd0,0xc5,0x67,0xd3,0x67,0xf2,0x10,0xac,0x1b,0x54,0xb8,0xf6, + 0x12,0xe6,0xf2,0xcb,0x97,0x2e,0x56,0x73,0x67,0xcf,0x50,0xef,0xbc,0xf9,0x8a,0x56, + 0x4e,0x26,0x44,0x55,0xff,0x16,0xcc,0x9d,0xa6,0x66,0x4d,0x9d,0xa0,0xfb,0xd4,0x49, + 0x8d,0xd1,0xc2,0x5f,0xdc,0xff,0xb5,0x1c,0x5f,0x9f,0x45,0xe3,0x73,0x49,0x66,0x7d, + 0x80,0x96,0xe5,0xfc,0xd3,0x7f,0xfa,0xdf,0xec,0xfd,0x7f,0xff,0xfd,0xf7,0xa3,0xe6, + 0xa3,0x1e,0x0a,0x40,0x5a,0x6a,0x5e,0x9a,0x25,0x9e,0x56,0x1b,0x20,0xc4,0xe2,0xf7, + 0x29,0x6a,0xd5,0x2a,0x14,0x28,0x00,0x19,0xb5,0xbf,0x50,0x97,0x59,0x88,0x8b,0xad, + 0xd6,0xd9,0xbf,0x42,0xd2,0x74,0x64,0xcc,0x5c,0x02,0x67,0xe4,0xe6,0x78,0xef,0xad, + 0x7f,0xa9,0x91,0x9b,0x8f,0x8b,0x2a,0x01,0x4e,0x7e,0xf5,0x69,0x35,0x45,0xb7,0x10, + 0x17,0x7f,0xee,0xc7,0x31,0x45,0xbd,0x58,0xb6,0x78,0x9e,0x9a,0x39,0x6d,0x82,0x4e, + 0xf9,0x9b,0x15,0x29,0x2f,0x63,0xc6,0x8c,0x59,0x6b,0xd8,0x25,0x6b,0xff,0xb3,0x3c, + 0x70,0x92,0xaf,0x3e,0x0b,0xa6,0x59,0xce,0x3f,0xfd,0xa7,0xff,0xcd,0xdc,0x7f,0xc9, + 0xf9,0x7f,0xe3,0x8d,0x37,0x82,0xbd,0xae,0xf5,0xb2,0x80,0x6d,0x53,0xf9,0xfa,0x5c, + 0xff,0x2e,0x21,0x6f,0x2a,0x03,0x21,0x25,0xe6,0x43,0xb7,0x8f,0x02,0x50,0x80,0xf6, + 0x97,0xe5,0x22,0xc9,0xba,0x6c,0xde,0xb3,0x75,0x75,0xeb,0xd6,0x4d,0x0d,0x1f,0x3e, + 0x5c,0xbd,0xfb,0xee,0xbb,0x6a,0xf9,0x92,0x05,0xea,0xad,0x09,0x0f,0xa8,0xc1,0xc3, + 0xc7,0xaa,0x3e,0x03,0x87,0xa9,0x6e,0x3d,0x7a,0x47,0xe9,0x81,0x9d,0x12,0x82,0xb9, + 0x6e,0xca,0xd4,0x9a,0xd7,0x55,0x2b,0x57,0xa8,0x95,0x2b,0x96,0xa8,0xc5,0xf3,0x66, + 0x6a,0xab,0x7f,0xba,0x4e,0xf5,0x9b,0x1d,0xed,0xfb,0x06,0x1b,0x6c,0xa0,0x86,0x0d, + 0x1b,0x96,0x69,0x4c,0xaf,0xd6,0x34,0x25,0xdf,0xf8,0x69,0x33,0x9e,0x7f,0xfa,0x4f, + 0xff,0x9b,0xb5,0xff,0x92,0xc1,0xf4,0xec,0xb3,0xcf,0x66,0x9a,0x75,0xb5,0xe8,0x38, + 0x00,0x9b,0xf5,0xed,0x52,0xb6,0x7c,0xca,0x97,0x2b,0xe8,0x31,0x6b,0x31,0xa0,0x6a, + 0xb7,0x8f,0x02,0x90,0x91,0xb8,0xfa,0x94,0x2f,0x95,0xa3,0x1a,0x17,0x5c,0x91,0x48, + 0xea,0x5c,0xe4,0x01,0x78,0xef,0x3d,0x2d,0x70,0x97,0xab,0x99,0x53,0x5f,0x8e,0x5a, + 0x19,0x3d,0x2c,0x32,0xc3,0x9f,0x08,0x7f,0xa9,0xb7,0x50,0x86,0xfd,0xc9,0x62,0x21, + 0x95,0xf5,0xfc,0xd3,0x7f,0xfa,0xdf,0x6c,0xfd,0x97,0x5c,0xff,0xc7,0x1e,0x7b,0xcc, + 0x3a,0xe7,0x4a,0x23,0x15,0x00,0x97,0x80,0xcd,0x2a,0x6c,0x43,0xa7,0xfa,0xb5,0x29, + 0x1e,0x21,0xdb,0x27,0x0d,0xb0,0xa0,0x13,0x2e,0x81,0x28,0xc9,0x62,0x40,0xb5,0xb8, + 0xb8,0xaa,0xd1,0x3c,0xab,0x5d,0xdf,0x86,0x1b,0x6e,0x18,0x15,0xd0,0x91,0xaa,0x80, + 0x92,0x4a,0xb3,0x7c,0xf9,0xf2,0x86,0x5f,0x20,0xb2,0xff,0xe2,0xa1,0x90,0xe3,0x29, + 0xf3,0x2b,0xc8,0xfe,0xc9,0xdf,0x45,0xf4,0xbf,0x9a,0x3c,0x69,0xdf,0xf9,0x6d,0xa6, + 0xf3,0x4f,0xff,0xe9,0x7f,0xb3,0xf4,0x7f,0xf6,0xec,0xd9,0xea,0xc9,0x27,0x9f,0xec, + 0x78,0x3e,0x64,0x55,0x00,0xea,0x21,0xf4,0xd3,0xc6,0xe1,0xb3,0x0a,0x79,0x73,0xac, + 0xdf,0x15,0xdd,0x9f,0x65,0xfb,0xcc,0x05,0x50,0x10,0xe2,0x96,0x32,0xeb,0xd0,0x17, + 0xe5,0x92,0xcb,0x7b,0x7d,0xe2,0x4a,0xcb,0xe2,0x4e,0x6b,0x26,0x8b,0xa4,0x11,0xe7, + 0xa3,0xd9,0xce,0x3f,0xfd,0xa7,0xff,0x65,0xef,0xff,0x9b,0x6f,0xbe,0xa9,0xfe,0xf5, + 0xaf,0x7f,0x45,0xb1,0x0c,0x71,0xcd,0x8f,0x32,0x29,0x00,0x59,0xac,0x7f,0x57,0xc4, + 0xbe,0x4d,0x41,0xf0,0xa5,0x16,0x9a,0xeb,0x0c,0xdd,0x3e,0x0a,0x40,0xce,0xcc,0x9c, + 0x39,0x33,0x72,0xa9,0xe7,0x71,0x01,0x15,0x99,0x96,0x53,0xf6,0xd9,0xc1,0xe8,0x3f, + 0xfd,0xa7,0xff,0xf4,0x3f,0xde,0x3f,0xa9,0x57,0xf2,0xfc,0xf3,0xcf,0x77,0xe4,0xfa, + 0xf7,0xef,0xdf,0xbf,0xaa,0xaa,0x7e,0x45,0x07,0x02,0x86,0xd6,0xf9,0x4f,0xab,0x02, + 0xe8,0x52,0x24,0x42,0xbc,0x0d,0xbe,0xe5,0xcb,0x3e,0xac,0xd4,0xf4,0x0a,0x80,0x0c, + 0x01,0x48,0x4e,0xea,0x46,0x1b,0x6d,0x54,0x93,0x0b,0xce,0xa7,0x21,0xfb,0x2a,0x6b, + 0x85,0xdc,0xd0,0x59,0x34,0xf0,0xbc,0x67,0x07,0xa3,0xff,0xf4,0x9f,0xfe,0xd3,0xff, + 0x90,0xfe,0x8b,0xd5,0x3f,0x61,0xc2,0x84,0x8e,0xaa,0xa5,0x32,0xdb,0x6a,0x56,0xd7, + 0xbf,0xe9,0x05,0x28,0x2a,0x0e,0x20,0xad,0x5a,0x61,0xa8,0xf0,0xf7,0x05,0xf7,0xd9, + 0x82,0xfc,0xb2,0xec,0x5b,0x99,0x15,0x81,0x96,0x98,0x0e,0x78,0xd2,0xa4,0x49,0x51, + 0x6a,0x9a,0x44,0xd7,0x67,0x49,0xbb,0xa9,0xa5,0xd2,0x56,0xde,0x79,0xbf,0x21,0xeb, + 0x4f,0x4b,0x4b,0xaa,0x26,0xed,0x88,0xfe,0xd3,0x7f,0xfa,0x4f,0xff,0x63,0xa6,0x4e, + 0x9d,0xaa,0x5e,0x79,0xe5,0x15,0xb5,0x60,0xc1,0x82,0x8e,0xdf,0x49,0x3c,0x50,0xe8, + 0x10,0x6b,0x23,0x14,0x00,0x97,0xa5,0x6f,0xa6,0xf0,0xf9,0xdc,0xfb,0xa6,0x35,0x1f, + 0x5a,0xfb,0x3f,0xc4,0x53,0x54,0xe6,0x82,0x40,0x2d,0xa1,0x00,0xc8,0x81,0x7d,0xea, + 0xa9,0xa7,0xd4,0xa6,0x9b,0x6e,0xaa,0xb6,0xdc,0x72,0xcb,0xb5,0xaa,0x03,0x16,0x55, + 0x59,0x2b,0xab,0x46,0x5f,0x8d,0x8b,0xd0,0x67,0x81,0xd4,0xba,0x3c,0xfd,0xa7,0xff, + 0xf4,0xbf,0xbd,0xfb,0x2f,0x79,0xfd,0xd3,0xa6,0x4d,0x8b,0xac,0xfe,0xd8,0xe2,0x8f, + 0xbf,0x17,0xa3,0x4a,0xac,0xff,0x5a,0x69,0x44,0x1c,0x80,0x4b,0xd0,0xfb,0x52,0xf8, + 0xcc,0xf7,0x69,0x6e,0x7e,0xf3,0x5c,0xa7,0x4d,0x2d,0x4c,0x16,0x40,0x91,0x9d,0xd0, + 0x75,0xe9,0xe5,0x00,0x4f,0x9e,0x3c,0x39,0x1a,0x0e,0x18,0x31,0x62,0x44,0x94,0xba, + 0x26,0x91,0xec,0x12,0x64,0x27,0xdf,0x9b,0x13,0x06,0xf9,0x5c,0x78,0xb5,0xce,0xee, + 0x95,0xd5,0x65,0x97,0xb5,0xf2,0x57,0xc8,0xe4,0x23,0xb6,0x0b,0x92,0xfe,0xd3,0x7f, + 0xfa,0xdf,0x7e,0xfd,0x97,0x94,0x69,0x19,0x2e,0x95,0xa0,0x69,0xc9,0x3a,0x92,0xc8, + 0xfe,0x59,0xb3,0x66,0x59,0xa7,0xf2,0x15,0xc4,0x88,0x92,0xe7,0x67,0x1e,0x56,0x6b, + 0x91,0x0a,0x80,0xcf,0x0a,0x4f,0x73,0xdb,0xbb,0x84,0xbc,0x39,0x4f,0x40,0x88,0xc7, + 0xc1,0xa5,0x6c,0x51,0x09,0xb0,0x0e,0x24,0x2b,0xd3,0xc9,0x85,0x2e,0xae,0x2c,0x69, + 0x69,0x48,0x90,0x4b,0xb3,0xcd,0xdd,0x0c,0x00,0x50,0x34,0xe2,0xf6,0x8f,0x4b,0x7d, + 0xe7,0x25,0xa4,0xeb,0xed,0x02,0x0f,0x89,0xd6,0xcf,0xe2,0xe1,0xf1,0x79,0x03,0x5c, + 0x55,0x04,0x6d,0xde,0x88,0x32,0xd1,0xb9,0x15,0x2e,0x58,0xb1,0xf0,0xa5,0x55,0xeb, + 0xbe,0x03,0x00,0x68,0x77,0xe4,0x99,0x28,0x56,0xbf,0xb8,0xfd,0xf3,0x7e,0x3e,0x16, + 0xe5,0x05,0xb0,0x59,0xfa,0x36,0x41,0x1c,0x2a,0x7c,0xd3,0xf2,0xf7,0x4d,0x77,0xbe, + 0xcb,0xd3,0xd0,0x4c,0x33,0x02,0x76,0x6d,0x95,0x8b,0x57,0x2e,0xdc,0xb9,0x73,0xe7, + 0x86,0x6b,0x3e,0x6b,0xdc,0x65,0x65,0x4f,0xcf,0xa9,0x87,0xa6,0x4c,0xff,0xe9,0x3f, + 0xfd,0x6f,0xef,0xfe,0x4b,0x90,0x9e,0x3c,0x43,0xb3,0x1a,0x52,0x65,0xea,0x47,0x11, + 0xc7,0x25,0x2d,0xab,0xc0,0x17,0x27,0xd0,0x0c,0x1e,0xe6,0x96,0x51,0x00,0xc4,0x6d, + 0xb5,0x64,0xc9,0x92,0x68,0x9c,0x2b,0xcb,0x0d,0xdc,0x8c,0x25,0x41,0xf3,0xd6,0xa0, + 0xe9,0x3f,0xfd,0xa7,0xff,0xed,0xd9,0x7f,0x31,0x84,0x24,0xca,0x5f,0x4a,0xfc,0x36, + 0x63,0xbf,0x43,0x85,0xb1,0xeb,0x77,0xe6,0x6f,0x5c,0x53,0x08,0xdb,0xbc,0x0e,0x21, + 0xdb,0x27,0x06,0xa0,0x8e,0x48,0xe9,0x5a,0xf1,0x02,0x48,0x59,0xdd,0x90,0x1b,0x5f, + 0x2e,0xfe,0x7a,0x45,0xa8,0x02,0x00,0x94,0x49,0xf1,0x11,0xa3,0x49,0x04,0x7f,0x35, + 0x05,0x7e,0x5a,0xc9,0xfa,0xb7,0xd5,0x43,0xb0,0x05,0x17,0xc6,0xcb,0xa6,0x15,0x0f, + 0xaa,0x46,0x19,0x41,0x01,0xc8,0x51,0x9b,0x95,0xc9,0x6b,0x16,0x2d,0x5a,0x14,0x45, + 0xbb,0xfa,0x0e,0x7e,0x72,0x18,0x00,0x00,0xa0,0xd5,0x91,0x82,0x3e,0x12,0x34,0x2d, + 0xad,0x9e,0x16,0x7f,0xa3,0x95,0x0c,0x5b,0x8d,0x7f,0x9b,0x05,0x6f,0xab,0xb5,0x60, + 0x93,0x0f,0x69,0xf3,0x0d,0x84,0x28,0x19,0x28,0x00,0x05,0x6a,0xb6,0x12,0xc4,0x22, + 0x6e,0x2d,0x19,0x0e,0x90,0x26,0x11,0xff,0x92,0x1d,0x60,0x0a,0xfb,0xd8,0x0b,0x10, + 0xcf,0x2a,0x08,0x00,0xd0,0x2a,0xcf,0x41,0x79,0xb6,0xc9,0xd8,0xbe,0x34,0x19,0xdb, + 0x17,0xe1,0xdf,0x08,0x41,0xec,0xaa,0xbd,0x5f,0x94,0x27,0xc0,0x36,0x8d,0xaf,0x19, + 0x98,0x67,0xab,0x20,0x68,0xc6,0x84,0xf9,0x5c,0xff,0x3e,0x65,0x20,0x29,0xf8,0xa9, + 0x04,0xd8,0x00,0x6f,0x80,0xb8,0xb8,0x42,0xa6,0xb1,0x15,0x25,0xa1,0x0c,0x4a,0x00, + 0x9e,0x88,0xda,0x1e,0x32,0x00,0x50,0x3e,0xea,0x35,0x1d,0xb0,0xab,0x2c,0x70,0xd6, + 0x62,0x40,0xa1,0xf3,0x04,0x84,0x56,0x5b,0x34,0x15,0x13,0x14,0x80,0x92,0x21,0x45, + 0x2f,0x44,0x09,0x68,0x74,0x3c,0x00,0x42,0x0c,0x00,0x5a,0x8d,0x7a,0x64,0x16,0x98, + 0xc5,0x79,0x6c,0xd6,0xbe,0xcf,0x6a,0xcf,0x3a,0x76,0x5f,0xcd,0x24,0x44,0xa5,0x33, + 0x94,0xb9,0x3c,0xff,0x7f,0xd9,0x4b,0x04,0x30,0x00,0x40,0xbe,0xd6,0x7f,0xd1,0xc3, + 0x0e,0x3e,0xe1,0x9b,0x56,0xd7,0x3f,0x8b,0xd7,0xd5,0x54,0x10,0x6c,0x15,0x03,0x43, + 0x26,0x15,0x42,0x01,0x40,0x09,0x00,0x00,0x68,0x79,0x6a,0x99,0x45,0xb0,0x16,0x45, + 0xc0,0x25,0x90,0x6d,0xe3,0xfa,0x59,0x64,0x84,0xcd,0x9d,0xef,0x2a,0x0b,0x6c,0x2b, + 0x16,0x84,0x02,0x50,0x62,0x44,0x53,0x95,0xb4,0x98,0x7a,0x8d,0x59,0x01,0x00,0xb4, + 0x2a,0x32,0xb4,0x5a,0x0f,0xeb,0xdf,0xfc,0x3b,0x4b,0x66,0x57,0xe8,0x30,0x40,0xda, + 0xf8,0xbf,0xcd,0x33,0xd0,0x2c,0x85,0x81,0x50,0x00,0x2c,0x5a,0x9e,0x5c,0xb8,0xf5, + 0xd4,0x5c,0x01,0x00,0x5a,0x4d,0xf8,0xd7,0xab,0xaa,0xa0,0xcd,0xc2,0x4e,0xab,0xcb, + 0xef,0x5b,0x57,0x9a,0x65,0x6f,0xf3,0x2a,0xd8,0x26,0x9e,0x72,0x15,0x19,0x42,0x01, + 0x68,0x12,0x25,0x40,0x14,0x00,0xbc,0x01,0x00,0x00,0xd9,0x9e,0x9d,0x32,0x94,0x5a, + 0x6f,0xe1,0x9f,0x66,0xb1,0xbb,0x04,0x6f,0xda,0xef,0x92,0x56,0x7c,0x5a,0x6d,0x00, + 0xdb,0xf6,0x6d,0xe9,0xe6,0x65,0xf5,0x00,0x90,0x05,0x90,0xa6,0x1d,0x69,0xf7,0x95, + 0x5c,0xcc,0x92,0x1d,0xb0,0x62,0xc5,0x0a,0xea,0x05,0x00,0x00,0xb8,0x84,0xc9,0x9a, + 0x5a,0x03,0x8d,0x98,0xf5,0xcf,0x97,0x8b,0xef,0xb3,0xf6,0x6d,0xcb,0xb9,0xac,0xfc, + 0xb4,0x14,0x42,0xdb,0xbe,0x50,0x0a,0xb8,0x45,0x14,0x01,0x39,0x91,0xa2,0x04,0x88, + 0x42,0x20,0x8d,0x2a,0x82,0x00,0xd0,0xce,0xcf,0xc5,0x78,0x22,0x21,0x69,0x8d,0x74, + 0x71,0xbb,0xc6,0xdc,0x5d,0xe5,0x7c,0x6d,0x41,0x82,0xae,0xcf,0x42,0xc6,0xf4,0x5d, + 0x5e,0x84,0xb2,0x07,0x95,0xa3,0x00,0x64,0x40,0x4e,0x66,0xb3,0xce,0x96,0x05,0x00, + 0xd0,0x6e,0xcf,0x6b,0xd3,0xd2,0xaf,0x36,0x38,0x30,0x4d,0x11,0xf0,0x6d,0xbf,0xd4, + 0x4a,0x1c,0x97,0x09,0x00,0x00,0x34,0x2b,0xbe,0x68,0x7d,0xd3,0x22,0xf7,0x59,0xfa, + 0x66,0x2a,0x9f,0xb9,0xde,0x34,0xc1,0xee,0xdb,0x3e,0x1e,0x00,0x00,0x00,0x80,0x9c, + 0x2d,0x7d,0x9b,0x20,0x0e,0x89,0xea,0x77,0x09,0xe7,0xac,0x31,0x05,0xa1,0xdb,0xc7, + 0x03,0x00,0x00,0x00,0x90,0x93,0xf5,0x9f,0x56,0x74,0x27,0x99,0x9b,0x6f,0x2b,0x0c, + 0x14,0xa2,0x0c,0xa4,0x6d,0x37,0xf9,0x99,0x6b,0xd8,0xa1,0xac,0xf1,0x62,0x28,0x00, + 0x00,0x00,0xd0,0xb4,0xd6,0xbf,0xe9,0xda,0x37,0xdd,0xfa,0xb6,0xea,0x80,0xd5,0x5a, + 0xff,0xae,0xed,0xdb,0x84,0xbe,0x6b,0xfb,0x28,0x00,0x00,0x00,0x00,0x39,0x78,0x00, + 0xd2,0xea,0xfb,0x57,0x33,0x8e,0x6f,0xfb,0xde,0x5c,0x87,0x2d,0x8e,0x20,0xcb,0xf6, + 0x51,0x00,0x00,0x00,0x00,0x72,0xf2,0x04,0x24,0x05,0x72,0xfc,0xde,0x25,0xf4,0x43, + 0xac,0x7e,0xb3,0x18,0x90,0x29,0xd0,0x6b,0xd9,0x3e,0x0a,0x00,0x00,0x00,0x40,0x0e, + 0x5e,0x80,0x90,0x29,0x78,0x7d,0xae,0x7f,0xf3,0x37,0xf1,0xb0,0x82,0x2d,0x93,0xc0, + 0x8c,0x27,0xa8,0x66,0xfb,0x28,0x00,0x00,0x00,0x00,0x35,0x5a,0xfe,0xa6,0x80,0x0d, + 0x11,0xb6,0xb6,0x40,0x3d,0xdb,0xfb,0xa4,0x22,0x10,0x2a,0xe0,0x6b,0x99,0x75,0x10, + 0x05,0x00,0x00,0x00,0x20,0xc0,0xfa,0xaf,0x66,0xd9,0x34,0x21,0x6f,0xa6,0xee,0xa5, + 0xd5,0xf5,0x0f,0x4d,0xf7,0x23,0x0b,0x00,0x00,0x00,0xa0,0x81,0xde,0x82,0xa4,0xc0, + 0xb6,0x05,0xfa,0x99,0x63,0xfd,0xb6,0xb4,0x41,0x9b,0x65,0x1f,0xe2,0x7d,0x20,0x06, + 0x00,0x00,0x00,0xa0,0x20,0x0f,0x80,0xaf,0x3e,0xbf,0xf9,0xb7,0x2b,0xf0,0xaf,0xda, + 0x92,0xc1,0xcd,0x32,0x09,0x10,0x0a,0x00,0x00,0x00,0x34,0xbd,0x55,0x9f,0x14,0xb6, + 0x21,0x95,0xff,0x5c,0xb3,0xfa,0xb9,0xdc,0xf8,0xd5,0xd6,0xff,0x2f,0xf3,0x34,0xc0, + 0x28,0x00,0x00,0x00,0xd0,0x12,0x5e,0x00,0xdb,0xd8,0xbc,0x6b,0x7a,0x5e,0xd7,0xd4, + 0xbd,0x2e,0xeb,0xdd,0xe5,0xba,0x4f,0xfb,0x5d,0xda,0xf6,0xcb,0x04,0x73,0x01,0x00, + 0x00,0x40,0x4b,0x28,0x02,0xa6,0x35,0x6e,0xb3,0xf2,0x6d,0x82,0x39,0x4d,0x48,0x87, + 0x8e,0xe9,0xa7,0x05,0x0b,0x96,0x55,0x09,0xc0,0x03,0x00,0x00,0x00,0x4d,0x6d,0xfd, + 0xdb,0x22,0xf9,0x6d,0x9e,0x01,0x97,0xc0,0x4e,0xfb,0xde,0x37,0xce,0x6f,0xdb,0xbe, + 0xcb,0x33,0x81,0x02,0x00,0x00,0x00,0x50,0xa0,0x17,0x20,0x24,0x5a,0xdf,0x87,0x6b, + 0x62,0x9f,0x6a,0xbd,0x11,0x28,0x00,0x00,0x00,0x00,0x05,0x79,0x01,0x5c,0x02,0x3b, + 0x4d,0x70,0xfb,0xb2,0x05,0x5c,0xf5,0x02,0x4c,0xeb,0xdf,0xac,0x08,0x58,0xf6,0x79, + 0x00,0x50,0x00,0x00,0x00,0xa0,0x69,0xc9,0xc3,0xc5,0x9e,0x56,0xb8,0xc7,0x9c,0x65, + 0x30,0xa9,0x08,0xa4,0x59,0xfc,0x65,0x16,0xfa,0x28,0x00,0x00,0x00,0xd0,0x32,0xd6, + 0x7f,0x88,0xe0,0x75,0x45,0xeb,0x9b,0x02,0xdf,0x96,0x36,0x98,0x6c,0xbe,0xb2,0xc0, + 0xcd,0x20,0xf8,0x51,0x00,0x00,0x00,0xa0,0x25,0x94,0x80,0x90,0xcf,0x6c,0x96,0xbe, + 0x19,0xc0,0x97,0xfc,0xcc,0x14,0xf0,0x2e,0x6f,0x43,0xd9,0x67,0xfc,0x4b,0x83,0x34, + 0x40,0x00,0x00,0x68,0x29,0x5c,0x65,0x7e,0xb3,0xa4,0x00,0xba,0xea,0xfe,0xa7,0xfd, + 0x26,0xcd,0xfb,0x40,0x29,0x60,0x00,0x00,0x80,0x82,0x3c,0x01,0xae,0x09,0x7f,0x6c, + 0x11,0xfd,0xbe,0xf7,0x69,0x25,0x81,0x43,0x84,0xbf,0x6d,0xfb,0x78,0x00,0x00,0x00, + 0x00,0x72,0x14,0xfc,0xb6,0xc9,0x7d,0x5c,0xc5,0x78,0x7c,0x9e,0x00,0x73,0x19,0xdf, + 0x76,0x5d,0x5e,0x87,0xb4,0x32,0xc5,0x78,0x00,0x00,0x00,0x00,0x6a,0x24,0x29,0xb8, + 0x4d,0xcb,0xdb,0x57,0xa0,0xc7,0x65,0xc1,0x87,0x04,0xf2,0xb9,0xea,0x03,0xf8,0xb6, + 0x8f,0x02,0x00,0x00,0x00,0x90,0xb3,0x07,0xc0,0xac,0xbe,0x67,0x9b,0x07,0x20,0x29, + 0xb0,0xb3,0x08,0x65,0x9f,0x90,0x77,0x79,0x05,0x98,0x0c,0x08,0x00,0x00,0xa0,0x0e, + 0x8a,0x40,0x9a,0xa0,0xaf,0xa5,0x42,0x9f,0xab,0xd8,0x90,0x4d,0xf8,0xdb,0xbc,0x12, + 0x0c,0x01,0x00,0x00,0x00,0xe4,0x28,0xf4,0xcd,0xbf,0xcd,0xe0,0xbd,0x34,0xc1,0xbb, + 0x7a,0xf5,0xea,0x54,0x2b,0x3f,0x6d,0x3b,0xa6,0x90,0xf7,0x6d,0x9f,0x21,0x00,0x00, + 0x00,0x80,0x1c,0xb1,0x15,0xef,0x09,0xad,0xdf,0xef,0x0a,0xdc,0x73,0x59,0xf6,0xa6, + 0xf0,0xcf,0xb2,0x7d,0x3c,0x00,0x00,0x00,0x00,0x39,0x0b,0x7f,0x9f,0xc5,0x9e,0xe6, + 0x3d,0x70,0x55,0x08,0x74,0xd5,0x09,0x70,0x65,0x11,0xb8,0xb6,0x8f,0x07,0x00,0x00, + 0x00,0x20,0x67,0xf2,0x9c,0x03,0xc0,0x16,0x1f,0xe0,0x9a,0xf4,0xc7,0xa6,0x08,0x84, + 0xae,0x17,0x05,0x00,0x00,0x00,0xa0,0x0e,0xca,0x81,0xab,0x74,0xaf,0x4d,0xb8,0x9b, + 0x82,0x3e,0xcd,0x7a,0xf7,0xc5,0x0b,0x94,0x7d,0x26,0x40,0x14,0x00,0x00,0x00,0x68, + 0x49,0x6c,0xd5,0xff,0x42,0x83,0x03,0x5d,0xd9,0x02,0x59,0x84,0xb9,0x6d,0xfb,0x65, + 0x83,0x4a,0x80,0x00,0x00,0xd0,0xd4,0x96,0x7e,0x5a,0xc0,0x5e,0x9a,0x20,0xb7,0xb9, + 0xf6,0x93,0xcb,0x66,0xb5,0xe2,0x5d,0xdb,0x2f,0x6b,0x3d,0x00,0x14,0x00,0x00,0x00, + 0x68,0x7a,0x4b,0xdf,0x66,0xc1,0xbb,0xa6,0xf7,0x35,0x05,0xb2,0x2d,0xc8,0xaf,0x16, + 0x81,0x1d,0x12,0x1b,0x50,0x06,0x18,0x02,0x00,0x00,0x80,0xa6,0xb5,0xfe,0xe3,0xd7, + 0xb4,0xa2,0x3b,0xc9,0xfc,0x7c,0x5f,0x59,0xe0,0x6a,0x32,0x08,0x6c,0xf1,0x04,0xb6, + 0x6d,0xa3,0x00,0x00,0x00,0x00,0xe4,0x64,0xfd,0x27,0x03,0xf8,0xd2,0xea,0xfe,0xbb, + 0xc6,0xf1,0xb3,0x4c,0xeb,0xeb,0xdb,0xbe,0xf9,0x99,0x6d,0xfb,0x65,0x82,0x21,0x00, + 0x00,0x00,0x68,0x5a,0x0f,0x80,0x2f,0x35,0xcf,0x36,0x8e,0xef,0x1b,0x93,0xf7,0x8d, + 0xe3,0xbb,0xe6,0x1b,0x48,0xab,0x19,0x80,0x07,0x00,0x00,0x00,0xa0,0x00,0x4f,0x80, + 0x69,0xf1,0xa7,0xb9,0xdd,0x5d,0x56,0xbf,0xad,0xac,0xaf,0x69,0xdd,0x57,0xbb,0x7d, + 0x3c,0x00,0x00,0x00,0x00,0x39,0x7b,0x01,0x92,0xd6,0x76,0xb5,0x11,0xfb,0xae,0xb2, + 0xc0,0xbe,0x8c,0x01,0xdb,0xf6,0x6d,0x1e,0x06,0x3c,0x00,0x00,0x00,0x00,0x39,0x5b, + 0xfe,0x69,0x56,0x7d,0xe8,0x6f,0x5d,0x01,0x85,0x49,0xe1,0x6e,0x2a,0x0e,0xae,0xed, + 0x97,0xb9,0xf8,0x0f,0x0a,0x00,0x00,0x00,0xb4,0x8c,0xf5,0x9f,0x26,0xe4,0x5d,0xb5, + 0xfa,0x4d,0x81,0xee,0x9b,0xd4,0xc7,0xe6,0x15,0xc8,0x32,0xd1,0x0f,0x1e,0x00,0x00, + 0x00,0x80,0x06,0x78,0x09,0x5c,0xb5,0xfb,0x93,0x02,0xda,0x5c,0x36,0xb4,0xac,0x6f, + 0x88,0x70,0xa7,0x0e,0x00,0x00,0x00,0x40,0x41,0x1e,0x00,0x5f,0x7d,0x7e,0x53,0xd8, + 0xdb,0x3e,0xcf,0x12,0xbc,0x57,0xed,0xf6,0x51,0x00,0x00,0x00,0x00,0x72,0xb0,0xee, + 0xd3,0x2a,0xef,0xf9,0x2a,0x01,0xfa,0x5c,0xff,0xa1,0x71,0x04,0xa1,0xdb,0x47,0x01, + 0x00,0x00,0x00,0xc8,0xc9,0x0b,0x60,0x1b,0x9b,0x0f,0xc9,0xcd,0x4f,0x8b,0x11,0xf0, + 0x79,0x00,0xd2,0x7e,0x97,0xb6,0xfd,0x32,0x41,0x1a,0x20,0x00,0x00,0xb4,0x84,0x22, + 0x60,0x5a,0xe3,0x69,0x82,0x3e,0xad,0x80,0x4f,0xda,0x7a,0x5d,0x8a,0x81,0x4d,0x69, + 0x28,0xbb,0x12,0x80,0x07,0x00,0x00,0x00,0x9a,0xda,0xfa,0xb7,0x45,0xf2,0xdb,0x3c, + 0x03,0x59,0xd2,0xf6,0x5c,0x81,0x7f,0xe6,0xef,0x6c,0xdb,0x77,0x79,0x26,0x50,0x00, + 0x00,0x00,0x00,0x0a,0xf4,0x02,0xf8,0xa6,0x01,0x0e,0xc1,0x97,0xeb,0x5f,0xcd,0xf6, + 0xcb,0x06,0x43,0x00,0x00,0x00,0xd0,0x12,0x5e,0x80,0x50,0x81,0x6c,0xfb,0xbd,0xf9, + 0x3e,0x44,0x91,0xb0,0x55,0x07,0xb4,0x7d,0x46,0x0c,0x00,0x00,0x00,0x40,0x8e,0xd8, + 0xca,0xff,0x66,0x1d,0x6f,0x77,0xd5,0x04,0x48,0xfb,0xce,0x55,0x0e,0xd8,0xb6,0x8e, + 0x32,0xc3,0x10,0x00,0x00,0x00,0x34,0xb5,0xf5,0x1f,0x22,0x78,0x5d,0xd1,0xfa,0xf1, + 0xab,0x2d,0x76,0x20,0xf9,0x9d,0xad,0xce,0x7f,0xb5,0xdb,0x47,0x01,0x00,0x00,0x00, + 0xc8,0x41,0x09,0x08,0xf9,0xcc,0x66,0xcd,0x9b,0x01,0x7c,0xa6,0x07,0xc1,0x56,0xf7, + 0x3f,0x2d,0x28,0x30,0x6d,0xac,0x9f,0xd9,0x00,0x01,0x00,0x00,0x0a,0xc6,0x66,0x95, + 0xbb,0xd2,0xfe,0x5c,0x43,0x06,0xae,0xba,0xff,0x59,0x95,0x11,0x97,0xa7,0x00,0x05, + 0x20,0xc1,0xca,0x95,0x2b,0xb9,0x6a,0x01,0x00,0x20,0x98,0xb9,0x73,0xe7,0x46,0xaf, + 0x83,0x06,0x0d,0x4a,0x2d,0xfc,0x63,0x5a,0xfc,0x21,0xef,0xb3,0xba,0xec,0x5d,0x01, + 0x84,0x49,0xef,0x02,0x0a,0x00,0x00,0x00,0x40,0x81,0x56,0x7f,0x5a,0xbe,0xbf,0x2b, + 0x80,0x2f,0x29,0xf8,0x43,0x02,0x09,0x6d,0x35,0x00,0xd2,0x3c,0x08,0x4c,0x06,0x04, + 0x00,0x00,0x90,0x33,0xe6,0xcc,0x7d,0x69,0x55,0xff,0x6c,0xe3,0xfa,0x36,0x45,0x21, + 0x54,0xe1,0xb0,0x29,0x14,0xae,0xa9,0x86,0x51,0x00,0x00,0x00,0x00,0x72,0xb6,0xfe, + 0x6d,0xd5,0xff,0x7c,0x56,0x79,0x16,0xa1,0xec,0x13,0xf2,0xb6,0x6d,0x96,0x79,0x1e, + 0x00,0xa1,0x34,0x43,0x00,0x5d,0xbb,0x32,0x1a,0x01,0x00,0x00,0xe1,0xf4,0xeb,0xd7, + 0x6f,0x1d,0x41,0x9c,0x7c,0xb5,0xa5,0xfb,0xd5,0xa2,0x64,0xa4,0x59,0xf4,0xb6,0xed, + 0x9b,0xdf,0xe1,0x01,0x00,0x00,0x00,0xc8,0x01,0x57,0x4a,0x5e,0x68,0x6a,0x9e,0xaf, + 0xce,0x7f,0xda,0x72,0x2e,0x25,0xc0,0xb5,0x7d,0x86,0x00,0x00,0x00,0x00,0x72,0xc4, + 0x56,0xbc,0x27,0xb4,0x7e,0x7f,0x5a,0xa0,0x9e,0x19,0x14,0xe8,0x12,0xfe,0xa1,0xdb, + 0x27,0x0d,0x10,0x00,0x00,0xa0,0x00,0x2f,0x40,0x48,0x10,0x9f,0x4f,0x78,0xdb,0xbe, + 0xb7,0x59,0xf4,0x69,0xd3,0x0c,0xbb,0xb6,0x5f,0x46,0x0f,0x00,0x0a,0x00,0x00,0x00, + 0xb4,0x8d,0xb7,0xc0,0x65,0x8d,0xdb,0x26,0xfe,0x09,0x99,0xf4,0xa7,0x99,0x61,0x08, + 0x00,0x00,0x00,0x9a,0xda,0xfa,0xf7,0x79,0x06,0x5c,0xf3,0x00,0xd8,0x72,0xf9,0xf3, + 0x9a,0xec,0xa7,0xec,0x33,0x01,0xa2,0x00,0x00,0x00,0x40,0xd3,0x5b,0xf4,0x3e,0x6b, + 0xdf,0xe5,0xca,0xf7,0x09,0x6f,0xdf,0x3c,0x00,0xd5,0x7a,0x1b,0xca,0x02,0x43,0x00, + 0x00,0x00,0xd0,0xd4,0x5e,0x00,0x57,0x1e,0xbe,0xcd,0xad,0x6f,0x0a,0xf8,0xb4,0xca, + 0x7f,0x69,0x56,0xbc,0x6b,0x26,0xc0,0xd0,0x00,0x44,0x14,0x00,0x00,0x00,0x80,0x9c, + 0xbd,0x00,0x69,0x11,0xfa,0x79,0x05,0xe8,0x85,0x7a,0x10,0xca,0x5a,0x03,0x40,0x60, + 0x08,0x00,0x00,0x00,0x9a,0xd6,0xfa,0x8f,0x5f,0x6d,0x95,0xf9,0x92,0xcb,0xa5,0xa5, + 0xf4,0xd5,0xb2,0xdd,0xe4,0xfa,0x5d,0x02,0xbf,0x9a,0xc9,0x85,0x50,0x00,0x00,0x00, + 0x00,0x52,0xac,0x70,0x73,0xd6,0x3d,0x5f,0xdd,0xff,0xb4,0xe2,0x3f,0x59,0x3d,0x02, + 0xb6,0xc9,0x80,0x42,0xe6,0x1d,0x28,0x0b,0x0c,0x01,0x00,0x00,0x40,0xd3,0x7a,0x00, + 0x5c,0xd3,0xf7,0xd6,0x52,0xf7,0xdf,0x55,0xc8,0x27,0xeb,0xfb,0x6a,0xb7,0x8f,0x07, + 0x00,0x00,0x00,0x20,0xa3,0xc0,0x4e,0x0a,0xee,0xac,0x93,0xfd,0xd8,0x26,0xfc,0x31, + 0xad,0x7b,0xdb,0x36,0x6d,0x41,0x88,0x65,0x75,0xfb,0xe3,0x01,0x00,0x00,0x80,0x96, + 0xf1,0x02,0x98,0xd6,0x77,0x16,0xef,0x81,0x4b,0x89,0x08,0xcd,0x18,0x30,0xbf,0x6f, + 0xa6,0xe2,0x40,0x78,0x00,0x00,0x00,0xa0,0x65,0x14,0x01,0xdf,0x67,0x36,0x81,0x6f, + 0x06,0x11,0x9a,0x6e,0xfb,0x90,0x71,0xfd,0x66,0xac,0x0a,0x88,0x02,0x00,0x00,0x00, + 0x2d,0x49,0x5a,0xad,0x7e,0x53,0xa0,0xbb,0xe6,0x05,0x48,0xf3,0x0a,0x64,0xf5,0x38, + 0xa0,0x00,0x00,0x00,0x00,0xd4,0x51,0x09,0x30,0x95,0x01,0x57,0x9a,0x9e,0x2b,0x63, + 0xa0,0xd6,0x40,0xbe,0xb2,0xd6,0x02,0x40,0x01,0x00,0x00,0x80,0xa6,0xc4,0x96,0xd2, + 0x17,0x32,0x3b,0x5f,0xda,0xac,0x7f,0x59,0xc6,0xf1,0xd3,0x52,0x0a,0xcd,0x7d,0x59, + 0xbd,0x7a,0x35,0x0a,0x00,0x00,0x00,0x40,0x9e,0xd6,0xbd,0x59,0x0b,0x20,0x69,0xf1, + 0xbb,0x8a,0xff,0xa4,0x55,0xeb,0x0b,0xb5,0xd6,0x7d,0xb3,0x0a,0x96,0x55,0xf0,0xc7, + 0x90,0x05,0x00,0x00,0x00,0x4d,0xed,0x05,0x30,0xc7,0xed,0x5d,0xb9,0xf8,0x49,0x81, + 0x6f,0xbe,0xf7,0xcd,0xfe,0xe7,0xda,0xae,0xf9,0x3b,0xf9,0x4c,0x84,0x7e,0x72,0xbf, + 0xe4,0x6f,0x0a,0x01,0x01,0x00,0x00,0x14,0xa4,0x08,0x98,0xd6,0x79,0x9a,0xa0,0x77, + 0x7d,0x1f,0xba,0x1d,0xd3,0xc3,0x60,0x1b,0x3a,0xc8,0xaa,0x54,0xd4,0x1b,0x86,0x00, + 0x00,0x00,0xa0,0xa9,0xad,0x7f,0x57,0xae,0xbe,0x6d,0x88,0x20,0x54,0x38,0x9b,0x69, + 0x81,0xa6,0x02,0x21,0x56,0x7d,0xec,0xde,0x4f,0xfe,0x3e,0xb6,0xfe,0xe3,0xd7,0xac, + 0x71,0x05,0x78,0x00,0x00,0x00,0x00,0x32,0xe0,0x72,0xe7,0xa7,0x79,0x09,0x42,0xbd, + 0x09,0xa6,0x70,0x37,0x97,0x35,0x15,0x11,0x9b,0x72,0x81,0x02,0x00,0x00,0x00,0x50, + 0xa0,0x17,0x20,0x54,0xe0,0x9b,0x9e,0x02,0x9b,0x17,0x21,0x19,0xc0,0xe7,0x2b,0xf3, + 0x6b,0xfb,0xcc,0xfc,0x3d,0x0a,0x00,0x00,0x00,0x40,0x8e,0x56,0x7f,0x35,0xc2,0xd5, + 0x36,0x1c,0x60,0x9b,0xde,0xd7,0xf6,0xb9,0x4b,0xc9,0x30,0xe3,0x01,0x5c,0xd3,0x03, + 0xa3,0x00,0x00,0x00,0x00,0xd4,0x68,0xfd,0x67,0xf5,0x10,0xd8,0xca,0xfa,0x26,0x05, + 0xb6,0x39,0xae,0x9f,0x65,0xfa,0x60,0xd7,0x70,0x40,0x59,0x63,0x00,0x08,0x02,0x04, + 0x00,0x80,0x96,0x55,0x0c,0x4c,0x37,0xbf,0x29,0x8c,0x6d,0x6e,0xfa,0xb4,0x57,0x73, + 0x1d,0xb6,0xb8,0x00,0x5b,0x70,0x20,0x1e,0x00,0x00,0x00,0x80,0x3a,0x92,0x14,0xc6, + 0xa6,0x85,0x1e,0xe7,0xe7,0xbb,0x2c,0x74,0xd7,0x04,0x41,0xb6,0xdf,0xd8,0x0a,0xfe, + 0x94,0x3d,0x0d,0x10,0x05,0x00,0x00,0x00,0x5a,0xc6,0xea,0x4f,0x13,0xe8,0x66,0x60, + 0x9f,0xcd,0xca,0x77,0x09,0x6f,0x5b,0x51,0xa1,0xd0,0x54,0x42,0x3c,0x00,0x00,0x00, + 0x00,0x05,0x08,0xfd,0x50,0x21,0xec,0x9b,0xdc,0xc7,0x55,0x4f,0x20,0x2d,0x66,0xc0, + 0x37,0xe7,0x00,0x0a,0x00,0x00,0x00,0x40,0x81,0x4a,0x80,0x2b,0x75,0xcf,0xb6,0x7c, + 0x68,0xce,0x7e,0xb2,0x84,0xaf,0x6b,0x38,0xc0,0xa5,0x00,0x54,0x5b,0x69,0x10,0x05, + 0x00,0x00,0x00,0x20,0x40,0xf8,0xbb,0xd2,0xf5,0xd2,0x84,0x72,0x9a,0x7b,0xdf,0x14, + 0xd6,0xc9,0x18,0x02,0xd7,0x30,0x40,0x9a,0x27,0x20,0xa9,0x4c,0xa0,0x00,0x00,0x00, + 0x00,0xe4,0x6c,0xfd,0x87,0x4c,0xff,0xeb,0xf2,0x0e,0xd8,0x4a,0xfd,0xfa,0xaa,0xf9, + 0xd9,0x3c,0x09,0xc9,0xbf,0xcb,0x5e,0x04,0x08,0x05,0x00,0x00,0x00,0x9a,0x16,0x9b, + 0x8b,0x3e,0x8b,0xd5,0x6f,0xce,0xd2,0x17,0x32,0x9e,0x9f,0xfc,0x9d,0x99,0x02,0x98, + 0x26,0xf4,0x19,0x02,0x00,0x00,0x00,0x28,0xc0,0x0b,0xe0,0x12,0xba,0x3e,0xd7,0xbc, + 0xed,0x33,0x9b,0x52,0xe1,0xf2,0x14,0x84,0x2a,0x22,0x9f,0xf9,0xcc,0x67,0x50,0x00, + 0x00,0x00,0x00,0x8a,0x52,0x00,0x92,0xae,0xfe,0x58,0x28,0x27,0xf3,0xfd,0x43,0x14, + 0x88,0xb4,0xd8,0x02,0x73,0xfd,0xbe,0xcc,0x02,0xe1,0xd8,0x63,0x8f,0x55,0xbb,0xec, + 0xb2,0x4b,0xe9,0x8e,0x1d,0x95,0x00,0x01,0x00,0xa0,0x69,0x85,0xbf,0x59,0x91,0xcf, + 0x35,0x69,0x8f,0x2f,0x8a,0xdf,0x35,0xe5,0x6f,0x48,0x6c,0x80,0x6b,0x5d,0xf2,0xfb, + 0xa3,0x8f,0x3e,0x5a,0x7d,0xf4,0xa3,0x1f,0x2d,0xe5,0x7c,0x00,0x78,0x00,0x00,0x00, + 0xa0,0x29,0xb1,0x59,0xf6,0xc9,0xf1,0x79,0xd3,0x82,0x77,0x59,0xec,0x49,0xa5,0xc1, + 0x5c,0xa7,0xf9,0x77,0x9a,0x17,0x21,0xb9,0x5d,0xf9,0xec,0xa8,0xa3,0x8e,0x52,0xdb, + 0x6c,0xb3,0x4d,0xc7,0x72,0xf2,0x79,0xdc,0x92,0xc4,0x7f,0xd7,0x5b,0x49,0x40,0x01, + 0x00,0x00,0x80,0x96,0xf0,0x02,0xb8,0x2c,0xf3,0xe4,0x72,0x69,0x69,0x83,0xbe,0x39, + 0x00,0x6c,0xdb,0x76,0xcd,0x35,0xb0,0xf7,0xde,0x7b,0xab,0x2d,0xb7,0xdc,0x32,0x55, + 0xe8,0xa7,0x29,0x03,0x28,0x00,0x00,0x00,0x00,0x29,0xc2,0xdf,0xf6,0x3e,0xe9,0x0d, + 0x30,0xbf,0xb3,0xcd,0xfe,0x67,0xce,0x0d,0x90,0xb6,0x7e,0x33,0x06,0x20,0x7e,0x9f, + 0xcc,0x00,0x18,0x31,0x62,0x84,0xda,0x75,0xd7,0x5d,0xd7,0x12,0xf2,0x66,0x33,0x49, + 0x7e,0x56,0x2f,0x25,0x00,0x05,0x00,0x00,0x00,0x5a,0x46,0x09,0x48,0x2b,0xd5,0x6b, + 0x0a,0xea,0x90,0x71,0x7d,0x53,0x20,0x27,0x87,0x18,0x5c,0xeb,0x91,0x71,0xff,0xce, + 0x9d,0x3b,0xa7,0x2a,0x00,0x3e,0x85,0xa0,0x1e,0x10,0x04,0x08,0x00,0x00,0x4d,0x89, + 0x6d,0xa6,0x3f,0xdb,0x67,0xf1,0xe7,0xb6,0x80,0x41,0x73,0x7a,0x5f,0xdb,0xdf,0xb2, + 0x7c,0xdc,0x92,0xdb,0x35,0xd7,0x33,0x7f,0xfe,0x7c,0x75,0xf2,0xc9,0x27,0xab,0xae, + 0x5d,0xbb,0x5a,0x85,0xbc,0x4d,0x29,0x68,0x24,0x0d,0x57,0x00,0xe4,0x40,0x01,0x00, + 0x00,0x54,0x23,0xfc,0xcd,0x62,0x3c,0xa6,0x62,0x60,0xbe,0xda,0x04,0xbd,0x2b,0x86, + 0xc0,0x35,0xee,0x6f,0xcb,0x3e,0x98,0x33,0x67,0x8e,0xfa,0xc2,0x17,0xbe,0xa0,0xfa, + 0xf4,0xe9,0xd3,0x21,0xec,0xcd,0xe6,0x52,0x02,0x1a,0xa5,0x10,0x34,0x5c,0x01,0xe8, + 0xdb,0xb7,0x2f,0x57,0x32,0x00,0x00,0x64,0x56,0x00,0x92,0x6e,0xf8,0xa4,0x35,0xee, + 0xb2,0xe4,0xd3,0xd2,0xfe,0xe2,0xdf,0xbb,0xbc,0x0a,0xa6,0x17,0x21,0xf9,0xfb,0xd9, + 0xb3,0x67,0x47,0x85,0x7e,0x86,0x0f,0x1f,0x1e,0x09,0xf8,0x2e,0x5d,0xba,0x74,0xbc, + 0xc6,0xcd,0x54,0x02,0x4c,0x45,0x20,0xa6,0x9e,0x19,0x01,0x0d,0x57,0x00,0x7a,0xf5, + 0xea,0xc5,0x95,0x0c,0x00,0x00,0x99,0x58,0xb5,0x6a,0x95,0xd5,0x92,0x77,0xb5,0xa4, + 0x05,0x6f,0x0a,0x79,0xdb,0xe7,0xb1,0x82,0xe1,0xab,0x06,0x28,0x96,0xbf,0x14,0xfa, + 0xd9,0x78,0xe3,0x8d,0xd7,0x11,0xfe,0x49,0xeb,0xdf,0x54,0x06,0x4c,0xe1,0xdf,0x96, + 0x1e,0x80,0x81,0x03,0x07,0x72,0x25,0x03,0x00,0x40,0x4d,0x0a,0x40,0x88,0x32,0x60, + 0x0a,0x78,0xf3,0xf7,0x69,0x7f,0xdb,0x94,0x85,0x79,0xf3,0xe6,0xa9,0xcf,0x7f,0xfe, + 0xf3,0x6a,0xec,0xd8,0xb1,0xeb,0x08,0x79,0x69,0x32,0xc4,0x2d,0xcd,0xf4,0x02,0x98, + 0xc3,0x02,0x8d,0x8a,0x07,0x68,0xb8,0x02,0xb0,0xe1,0x86,0x1b,0x72,0x25,0x03,0x00, + 0x40,0x26,0x42,0x2c,0xfe,0xb4,0x21,0x80,0xf8,0x33,0xc1,0x15,0x14,0x98,0xf6,0xfb, + 0xa5,0x4b,0x97,0xaa,0x2f,0x7d,0xe9,0x4b,0x6b,0xb9,0xfd,0x5d,0x82,0x3f,0xf9,0xde, + 0x36,0x1c,0x60,0xba,0xfd,0xdb,0x26,0x0d,0x70,0x83,0x0d,0x36,0xe0,0x4a,0x06,0x00, + 0x80,0x4c,0xd6,0x7f,0xf7,0xee,0xdd,0xd7,0x49,0xf7,0x33,0x0b,0xf3,0x98,0x42,0xde, + 0x95,0xef,0x9f,0x5c,0xce,0xf5,0x3e,0xb9,0x1e,0x09,0xf4,0x93,0x80,0xbf,0x1e,0x3d, + 0x7a,0x58,0x05,0xbf,0xad,0xb9,0xbc,0x00,0xb6,0xa1,0x80,0x7a,0xd1,0x70,0x05,0x60, + 0xe8,0xd0,0xa1,0x5c,0xcd,0x00,0x00,0x10,0x2c,0xfc,0x63,0x8b,0x3d,0x6d,0x32,0x9e, + 0x90,0x7c,0x7f,0x73,0xaa,0x60,0x57,0xc9,0xdf,0xe4,0x3a,0xb7,0xda,0x6a,0x2b,0xb5, + 0xe7,0x9e,0x7b,0xae,0x35,0xd6,0xef,0x12,0xfa,0xdd,0xba,0x75,0xf3,0x2a,0x02,0x8d, + 0xcc,0x02,0x28,0x85,0x07,0x40,0x0e,0x46,0x3c,0x9e,0x03,0x00,0x00,0x90,0x26,0xfc, + 0x93,0xc5,0x78,0x42,0xa6,0xe5,0xf5,0x59,0xf5,0xf1,0x7b,0x9b,0x17,0x21,0xb9,0xcc, + 0xc1,0x07,0x1f,0xac,0x46,0x8f,0x1e,0x6d,0xb5,0xf8,0x45,0xd8,0xbb,0x9a,0x29,0xfc, + 0x93,0x81,0x80,0x49,0x45,0xa0,0xde,0xd4,0x25,0x06,0xc0,0xd5,0x31,0xf9,0x5c,0x0e, + 0x8e,0xd4,0x4b,0x06,0x00,0x00,0x48,0x13,0xfe,0x2b,0x57,0xae,0xb4,0x96,0xf7,0x75, + 0xa5,0xe7,0xb9,0xc6,0xf1,0x4d,0xcb,0xdf,0x57,0x37,0x40,0xda,0xa7,0x3f,0xfd,0xe9, + 0xb5,0x84,0x7f,0x52,0x01,0x48,0x0a,0x7b,0x19,0x9a,0x88,0x9b,0x4d,0x09,0x90,0x96, + 0xcc,0x12,0x68,0x64,0x26,0x40,0xa1,0x0a,0x80,0xab,0xde,0xb1,0xd9,0xc9,0xad,0xb7, + 0xde,0x9a,0xab,0x1b,0x00,0x00,0xac,0x88,0xe0,0x97,0x96,0x14,0xd8,0xb6,0xbc,0x7f, + 0x9b,0xd0,0xb7,0x7d,0x66,0x56,0x05,0x34,0x97,0x31,0x97,0x17,0xe1,0xbf,0xfe,0xfa, + 0xeb,0x7b,0x85,0xbf,0xcf,0x03,0xe0,0x1b,0x02,0xf0,0x19,0xcd,0x79,0x53,0xc8,0x10, + 0x40,0xda,0xcc,0x47,0xb6,0x65,0x37,0xdb,0x6c,0x33,0xae,0x70,0x00,0x00,0x70,0x0a, + 0xff,0xa4,0x30,0x37,0x05,0xbb,0xe9,0xaa,0x37,0x95,0x02,0x73,0xd2,0x1f,0xdf,0x94, + 0xc0,0xc9,0x75,0x1d,0x71,0xc4,0x11,0x1d,0x43,0xd5,0x49,0xe1,0x6f,0x13,0xf4,0x36, + 0xeb,0xdf,0x14,0xfe,0xb6,0xca,0x80,0x8d,0xb0,0xfe,0x0b,0xf7,0x00,0x84,0x7a,0x01, + 0xa4,0x18,0xd0,0x76,0xdb,0x6d,0xc7,0x95,0x0e,0x00,0x00,0x6b,0x09,0xff,0x15,0x2b, + 0x56,0xac,0x25,0xa4,0x6d,0x29,0x7b,0x2e,0x8b,0x3e,0x7e,0x75,0xe5,0xff,0xbb,0xaa, + 0x07,0xc6,0xef,0x45,0xf8,0x4b,0xa0,0x7a,0x9a,0xf0,0x4f,0x0a,0xfd,0xa4,0xf0,0xb7, + 0x0d,0x01,0xb8,0x52,0x01,0x1b,0x61,0xfd,0x17,0xe6,0x01,0x70,0x29,0x01,0x69,0x9e, + 0x01,0x99,0x3a,0xf1,0xc5,0x17,0x5f,0xe4,0x8a,0x07,0x00,0x80,0x48,0xf0,0xc7,0x96, + 0xbf,0xad,0x5e,0xbf,0x29,0xe4,0x93,0xd6,0xbd,0x6b,0x26,0xc0,0xb4,0x38,0x81,0x78, + 0xf9,0xfe,0xfd,0xfb,0xab,0x71,0xe3,0xc6,0x75,0x8c,0xf7,0x27,0x23,0xfd,0xe5,0xd5, + 0x27,0xfc,0x5d,0xe3,0xff,0x69,0x95,0x00,0x1b,0x55,0x08,0xa8,0x6e,0x59,0x00,0xa6, + 0x86,0x63,0x36,0x29,0xa6,0x30,0x72,0xe4,0x48,0x35,0x6d,0xda,0x34,0xae,0x7c,0x00, + 0x80,0x36,0x17,0xfe,0xb1,0xe5,0x6f,0x0a,0xef,0xe4,0x54,0xbc,0x49,0xd7,0x7e,0x32, + 0xed,0x2f,0x29,0xd8,0x4d,0x65,0xc0,0x1c,0x06,0x88,0x3f,0xfb,0xe8,0x47,0x3f,0x1a, + 0xc5,0xa3,0xf5,0xee,0xdd,0x3b,0xfa,0xcc,0x55,0xdc,0xc7,0x25,0xfc,0xa5,0x26,0x80, + 0x4d,0x09,0xf0,0x0d,0x01,0x34,0xaa,0x06,0x40,0x21,0x0a,0x80,0x79,0xa0,0x6d,0xd6, + 0xbe,0xab,0xed,0xb7,0xdf,0x7e,0xea,0xaa,0xab,0xae,0xe2,0xea,0x07,0x00,0x68,0x73, + 0xe1,0x6f,0x0a,0xe8,0x18,0xd3,0xc5,0xef,0xca,0xdd,0x37,0x2d,0x7e,0x9b,0xe5,0x2f, + 0x95,0x68,0xc5,0xfb,0x2c,0x01,0x7e,0x49,0x19,0x95,0xac,0xdf,0x9f,0xb4,0xfc,0x63, + 0x05,0x20,0x4d,0xf8,0xdb,0x02,0x00,0x7d,0xf3,0x00,0x34,0x8a,0xc2,0x3d,0x00,0xae, + 0x09,0x0f,0x6c,0xf3,0x24,0x0f,0x1b,0x36,0x4c,0x6d,0xb2,0xc9,0x26,0x6a,0xf2,0xe4, + 0xc9,0xdc,0x05,0x00,0x00,0x6d,0xc6,0xf2,0xe5,0xcb,0xad,0x96,0xbf,0x59,0xac,0x27, + 0x69,0xf5,0xbb,0x02,0x00,0x6d,0x7f,0xcb,0xfb,0x9e,0x3d,0x7b,0xaa,0xdd,0x76,0xdb, + 0x4d,0x6d,0xba,0xe9,0xa6,0x91,0x40,0x8e,0x89,0x05,0xb3,0x39,0x93,0x9f,0x2f,0xd5, + 0xaf,0x1a,0xcb,0xbf,0x0c,0xd6,0x7f,0xa1,0x0a,0x40,0x88,0xf5,0x6f,0x1e,0x04,0x39, + 0x48,0x07,0x1d,0x74,0x90,0xba,0xfc,0xf2,0xcb,0xb9,0x13,0x00,0x00,0xda,0xd0,0xf2, + 0x8f,0x05,0xb5,0x6d,0x0c,0xdf,0x66,0xd5,0x27,0x5d,0xff,0xae,0xdf,0x08,0x9b,0x6f, + 0xbe,0x79,0xe4,0xe6,0x97,0x31,0xfe,0x58,0x71,0x30,0x65,0x51,0x56,0xe1,0x5f,0xcd, + 0xd8,0x7f,0x59,0x84,0x7f,0x61,0x0a,0x40,0xb2,0x8a,0x92,0xaf,0x99,0x1a,0x91,0xd4, + 0x58,0x96,0xa1,0x80,0xfb,0xef,0xbf,0x9f,0x3b,0x02,0x00,0xa0,0x4d,0x2c,0x7f,0x69, + 0xa6,0xf0,0xb7,0xb9,0xf0,0x6d,0xa9,0x7a,0x36,0x17,0xbf,0x2c,0x27,0xc2,0xfe,0x63, + 0x1f,0xfb,0x58,0x14,0x5f,0x96,0x5c,0x36,0x29,0x84,0x4d,0xcb,0x3c,0xe9,0xf6,0xb7, + 0x09,0xff,0xf8,0xd5,0x74,0xfb,0x9b,0xc2,0xdf,0x9c,0x19,0xd0,0x55,0xf6,0xb7,0x91, + 0xc3,0x00,0x0d,0xc9,0x02,0xb0,0x1d,0xf4,0xe4,0x67,0x12,0x88,0x31,0x71,0xe2,0x44, + 0x35,0x75,0xea,0x54,0xee,0x0c,0x00,0x80,0x36,0x10,0xfe,0xb6,0x2a,0x7d,0x36,0x81, + 0x6f,0xab,0xe7,0x9f,0xfc,0x3c,0x19,0xd0,0x27,0x42,0xda,0x26,0x83,0xcc,0x99,0xf8, + 0x5c,0x96,0xbf,0x19,0xf4,0x97,0x96,0xf6,0x67,0x0a,0x7f,0xd3,0xf5,0x6f,0x7a,0xbd, + 0x1b,0x2d,0xfc,0x0b,0x55,0x00,0x7c,0xd6,0xbe,0x4d,0xeb,0x4a,0xfe,0x2d,0x35,0x97, + 0xaf,0xbe,0xfa,0xea,0x68,0xca,0x45,0x00,0x00,0x68,0x4d,0xe1,0x2f,0xcf,0xf8,0xa4, + 0x40,0xf4,0x05,0xf2,0x99,0xc2,0x3f,0x1e,0x02,0x18,0x31,0x62,0x44,0x34,0xb6,0xbf, + 0xde,0x7a,0xeb,0xad,0xa5,0x0c,0xa4,0xc9,0xa2,0x50,0xe1,0xef,0x52,0x00,0x92,0x9f, + 0x27,0x27,0xff,0x49,0x5a,0xfd,0xf2,0x5a,0x46,0xe1,0x1f,0x2b,0x00,0x32,0x0b,0x4f, + 0x97,0xa2,0xad,0xff,0x34,0x97,0x8b,0xa9,0x04,0xc8,0xab,0x1c,0xd4,0xa3,0x8e,0x3a, + 0x4a,0x5d,0x73,0xcd,0x35,0xce,0x31,0x1d,0x00,0x00,0x68,0x4e,0x96,0x2d,0x5b,0xd6, + 0xe1,0xf6,0x77,0x4d,0xe2,0x63,0x8b,0xf4,0x4f,0x0a,0x4e,0x91,0x13,0xbb,0xef,0xbe, + 0x7b,0x14,0x3c,0x2e,0x82,0x37,0x5e,0x26,0x59,0x5d,0xcf,0x74,0xbd,0xdb,0xe4,0x4e, + 0x48,0x89,0x5f,0x53,0xe0,0xbb,0x6a,0xfd,0xdb,0xc6,0xfb,0xcd,0xc9,0x7e,0xca,0x20, + 0xfc,0x45,0xf6,0x8b,0x02,0x20,0x67,0xa0,0x57,0x91,0x5b,0xf1,0x79,0x01,0x4c,0x6d, + 0x29,0xfe,0xbc,0x6f,0xdf,0xbe,0xea,0xc8,0x23,0x8f,0x54,0x37,0xde,0x78,0x23,0x77, + 0x0b,0x00,0x40,0x8b,0x20,0x56,0x7f,0x72,0xcc,0xdf,0x25,0xf8,0xcd,0xef,0x63,0x8b, + 0x7f,0x8b,0x2d,0xb6,0xe8,0x08,0xe8,0x4b,0x0e,0x03,0xd8,0x84,0xbd,0x4f,0xf6,0xc8, + 0x6b,0x72,0xcc,0xdf,0xa7,0x00,0x98,0xef,0x6d,0x75,0xfe,0xcd,0xd9,0xfe,0xca,0x64, + 0xf5,0x27,0x1d,0x30,0xa2,0x00,0x2c,0x29,0x4a,0x01,0x70,0x45,0xfd,0xbb,0x34,0x2f, + 0xd3,0x15,0x23,0xef,0x07,0x0d,0x1a,0xa4,0x0e,0x3d,0xf4,0x50,0x75,0xc7,0x1d,0x77, + 0x70,0xd7,0x00,0x00,0xb4,0x80,0xe5,0x2f,0xcd,0xb4,0xec,0xcd,0xbf,0xcd,0x98,0x80, + 0x01,0x03,0x06,0x44,0x01,0x7d,0xa3,0x46,0x8d,0x5a,0x6b,0x7d,0xae,0xaa,0x7a,0xa6, + 0xbc,0x09,0xb5,0xfc,0x43,0x14,0x00,0x97,0xcb,0x3f,0x44,0xf8,0x97,0x48,0x09,0x58, + 0xd2,0x49,0x1f,0xd8,0x89,0xfa,0xcd,0xd8,0xbc,0xd7,0x1c,0xd7,0x59,0x8e,0x5b,0x3c, + 0x95,0x63,0x9c,0xea,0x11,0x5f,0x04,0xd2,0x44,0x1b,0x34,0x5b,0xfc,0x5d,0x9c,0x17, + 0x3a,0x6f,0xde,0x3c,0x75,0xf3,0xcd,0x37,0x33,0x1c,0x00,0x00,0xd0,0xc4,0x96,0xbf, + 0x3c,0xd7,0x6d,0x81,0x7c,0xb6,0xb2,0xbe,0xf2,0xba,0xe3,0x8e,0x3b,0xa6,0x06,0xf4, + 0xb9,0x02,0xfb,0x42,0x05,0xbf,0x2d,0xea,0x3f,0xa9,0x00,0xd8,0x94,0x01,0x53,0x59, + 0x30,0x3d,0xd8,0x4d,0x20,0xfc,0x85,0x49,0xe2,0x01,0x98,0x55,0x84,0x02,0x60,0x3b, + 0x41,0x3e,0xeb,0xdf,0xd5,0x44,0x81,0xe8,0xd7,0xaf,0x9f,0x1a,0x3f,0x7e,0xbc,0xba, + 0xed,0xb6,0xdb,0x08,0x0c,0x04,0x00,0x68,0x42,0xe1,0x9f,0x7c,0x76,0xbb,0x66,0xea, + 0x13,0xa4,0x34,0xbc,0x8c,0xed,0x87,0x06,0xf4,0xf9,0x04,0xbf,0xe9,0x5d,0x76,0x09, + 0xff,0xa4,0xf5,0x6f,0x53,0x02,0x6c,0x82,0xdf,0x37,0xe6,0x5f,0x52,0xe1,0x2f,0xcc, + 0x12,0x05,0xa0,0xd0,0xe2,0xfb,0x21,0xc1,0x17,0xe6,0x41,0x95,0x26,0x1e,0x03,0x69, + 0x49,0x2f,0x82,0x54,0x70,0x3a,0xfa,0xe8,0xa3,0xd5,0x43,0x0f,0x3d,0x44,0x8a,0x20, + 0x00,0x40,0x93,0x09,0x7f,0x33,0x72,0x3f,0xf9,0x5e,0x5c,0xec,0x12,0xc5,0x3f,0x76, + 0xec,0xd8,0xcc,0x01,0x7d,0xa6,0x7c,0x49,0x0a,0x64,0xdb,0xf0,0x72,0x9a,0xf0,0x37, + 0x95,0x00,0xf3,0x7d,0xf2,0x77,0x65,0xad,0xf0,0x17,0xc8,0x34,0x51,0x00,0xa6,0x14, + 0x29,0xfc,0x6d,0x05,0x81,0x42,0xc6,0x5f,0x62,0x05,0x40,0x5a,0xec,0x05,0x88,0xc7, + 0x84,0xf6,0xda,0x6b,0xaf,0x68,0xd2,0x20,0x51,0x04,0x00,0x00,0xa0,0xbc,0x2c,0x59, + 0xb2,0x24,0x72,0xfb,0xbb,0xca,0xf6,0xca,0x74,0xbb,0xfb,0xee,0xbb,0x6f,0x47,0x40, + 0x5f,0x4c,0x48,0x40,0x9f,0xe9,0x55,0x0e,0xb1,0xf8,0x6d,0xc2,0xdf,0xa5,0x04,0xd8, + 0x84,0xbe,0xcf,0xe5,0xdf,0x24,0xc2,0x5f,0x98,0x22,0x0a,0xc0,0xa4,0xa2,0x85,0x7f, + 0xfc,0xea,0xaa,0xb8,0x14,0x0b,0xfa,0x58,0xd3,0x4a,0x0a,0xff,0xd8,0x0b,0x60,0xce, + 0xfb,0x2c,0x39,0x9f,0xc7,0x1d,0x77,0x9c,0x7a,0xf2,0xc9,0x27,0xd5,0x94,0x29,0x53, + 0xb8,0xcb,0x00,0x00,0x4a,0x28,0xfc,0xa5,0x25,0x05,0x7e,0x5c,0x89,0x4f,0x82,0xf9, + 0x0e,0x38,0xe0,0x00,0x6b,0x3d,0xfe,0xac,0x01,0x7d,0xa1,0x42,0x3f,0x44,0x01,0x70, + 0x7d,0xe7,0xca,0x56,0x2b,0x63,0x85,0xbf,0x40,0xa2,0x18,0x80,0x17,0x8b,0xde,0x8a, + 0x2b,0x06,0x40,0x84,0x79,0x52,0x09,0x88,0x85,0x7f,0xfc,0x1a,0xbb,0xfe,0x4d,0xe1, + 0x1f,0x5f,0x48,0xf2,0xf7,0x2e,0xbb,0xec,0xa2,0x76,0xd8,0x61,0x07,0xf5,0xd4,0x53, + 0x4f,0xa9,0x77,0xde,0x79,0x87,0x3b,0x0e,0x00,0xa0,0xa4,0xc2,0x5f,0x9e,0xed,0x5b, + 0x6d,0xb5,0x55,0x14,0xcd,0x9f,0x4c,0xdf,0xab,0x25,0xa0,0xcf,0x14,0xfa,0xe6,0xf0, + 0x72,0x9a,0xf0,0x4f,0x7b,0xef,0xb2,0xf6,0xd3,0xac,0xfe,0x26,0x12,0xfe,0xc2,0x8b, + 0x92,0x05,0xd0,0x57,0xbf,0x99,0x27,0xca,0x57,0xde,0x6b,0x37,0x85,0x75,0x9c,0x0d, + 0x60,0x66,0x04,0xc4,0xa5,0x20,0x93,0x59,0x01,0xc9,0x2c,0x81,0x64,0x36,0x40,0xdc, + 0xe2,0x75,0x24,0xd7,0x2b,0xdb,0x79,0xf5,0xd5,0x57,0xd5,0x84,0x09,0x13,0xb8,0xfb, + 0x00,0x00,0x1a,0x2c,0xfc,0x63,0x21,0x2f,0xee,0xfd,0x71,0xe3,0xc6,0xa9,0x8d,0x36, + 0xda,0x68,0x9d,0x89,0x78,0xd2,0xaa,0xf4,0x85,0x08,0x7d,0x5f,0x70,0x5f,0xe8,0xe7, + 0xae,0x66,0x6e,0xd7,0x54,0x4c,0x92,0x0a,0x4c,0x13,0x09,0x7f,0x09,0xbc,0xe8,0xdf, + 0x55,0xef,0xec,0x42,0x7d,0x92,0x5e,0xd2,0x7f,0x6c,0x5f,0x84,0xe5,0x6f,0x46,0x70, + 0xca,0x01,0x8b,0x5d,0x40,0xb1,0x17,0x40,0x4e,0x48,0x2c,0xc4,0x93,0xaf,0xa6,0x07, + 0xc0,0x9c,0x16,0x52,0x90,0x65,0x93,0x0a,0x87,0x68,0x97,0xdb,0x6c,0xb3,0x8d,0x9a, + 0x3f,0x7f,0xbe,0x7a,0xf3,0xcd,0x37,0xd5,0xeb,0xaf,0xbf,0xbe,0xd6,0x32,0x00,0x00, + 0x50,0x1c,0x8b,0x17,0x2f,0x8e,0x8c,0x38,0x99,0xd8,0x6d,0xfb,0xed,0xb7,0x8f,0x9e, + 0xc9,0xb1,0xa0,0x34,0x27,0xe2,0xa9,0x36,0x8a,0x3f,0x74,0x7c,0xdf,0xf5,0xb9,0xaf, + 0x0e,0x8d,0xcd,0xcd,0x1f,0x32,0xd6,0xdf,0x24,0xc2,0x5f,0x78,0x49,0xef,0xeb,0xa2, + 0x78,0x2e,0x80,0x47,0x8b,0x50,0x00,0x92,0x8a,0x80,0xa9,0x04,0x24,0x15,0x80,0xa4, + 0x12,0x20,0x4d,0xa2,0x41,0xd3,0x84,0xbe,0xa9,0x71,0xc5,0x7f,0xc7,0xd1,0xa4,0xf2, + 0x2a,0x17,0xdf,0x47,0x3e,0xf2,0x91,0x28,0x7f,0x54,0x7e,0x2b,0xda,0xa8,0xd4,0x12, + 0x98,0x39,0x73,0x66,0xa4,0x1c,0xc8,0xdf,0x8b,0x16,0x2d,0x8a,0xbc,0x08,0x00,0x00, + 0x90,0x1d,0xc9,0xcd,0x17,0xeb,0x5e,0xd2,0xb4,0xa5,0x50,0x4f,0x3c,0xac,0x3b,0x66, + 0xcc,0x98,0x75,0x02,0xc0,0xe3,0xe7,0xb4,0x2f,0x98,0xcf,0x26,0xf4,0x43,0xc7,0xf6, + 0xb3,0x58,0xf7,0xa6,0x42,0x91,0x45,0xe8,0x9b,0xfd,0x6a,0x32,0xe1,0x1f,0xcb,0xfc, + 0x8e,0xc9,0x80,0xee,0xd5,0xed,0xf4,0xa2,0x84,0xbf,0x2d,0x8f,0x33,0xf6,0x04,0xc8, + 0x01,0x4f,0x8e,0xf1,0xc7,0x16,0xbf,0x69,0xfd,0xc7,0xda,0xa3,0x4b,0xa9,0x88,0x3d, + 0x07,0xf1,0xf6,0x92,0xbf,0x95,0xcf,0x7a,0xf5,0xea,0x15,0x35,0x89,0x38,0x4d,0x42, + 0x61,0x21,0x00,0x80,0xda,0x8c,0x3b,0xd7,0x73,0x39,0xeb,0xd8,0x7e,0x35,0x42,0x3f, + 0x8b,0xf0,0xf7,0x59,0xf8,0xb6,0xc0,0x3e,0xdf,0x38,0x7f,0x93,0x09,0x7e,0x95,0x90, + 0xf9,0x1d,0x0a,0xc0,0x7d,0xba,0xad,0xd0,0xad,0x5b,0x3d,0xbd,0x00,0x49,0x05,0x20, + 0xf6,0x02,0xd8,0xac,0xfe,0x34,0xc1,0x2f,0x16,0xbc,0xbc,0xc6,0xc2,0x3f,0x56,0x1c, + 0x64,0xfd,0xe6,0xf0,0x81,0xb9,0xae,0x64,0x10,0x0a,0x00,0x00,0xd4,0xa6,0x04,0xa4, + 0x29,0x00,0x45,0x8d,0xeb,0xa7,0x09,0xfe,0xb4,0xb9,0x66,0xd2,0x2c,0xfd,0x34,0xa1, + 0xdf,0xc4,0x56,0x7f,0xcc,0x8a,0x35,0x32,0xff,0x43,0x05,0x40,0x77,0x62,0x81,0x16, + 0x86,0x0f,0xe8,0xb7,0x07,0xd5,0xc3,0x0b,0x90,0x1c,0x0f,0x32,0xbd,0x00,0x3e,0x05, + 0xc0,0x54,0x22,0x4c,0x57,0x52,0x32,0x7e,0xc0,0x54,0x02,0x92,0xdb,0xc4,0x03,0x00, + 0x00,0x90,0xbf,0xe0,0xf7,0x3d,0xa3,0xab,0x4d,0xdd,0x0b,0x15,0xfe,0x79,0x0a,0x7d, + 0x97,0xb5,0xdf,0xe4,0x86,0xe3,0x03,0x22,0xf3,0x93,0x1e,0x00,0xe1,0xba,0xa2,0x14, + 0x00,0xd7,0x05,0x13,0x2b,0x02,0x49,0xc1,0xec,0x1a,0xf7,0xf7,0x69,0x94,0x71,0x56, + 0x40,0x2c,0xf4,0xd3,0x82,0x08,0x6d,0x9e,0x00,0x00,0x00,0xc8,0xd7,0xf2,0x4f,0xab, + 0xd2,0xe7,0xab,0xce,0x17,0xf2,0x99,0xed,0xf7,0xa1,0xee,0xfd,0xb4,0x71,0x7d,0x57, + 0x54,0x7f,0x8b,0x78,0x8c,0xaf,0x8b,0xdf,0x24,0x15,0x80,0x9b,0x75,0xfb,0xad,0x6e, + 0x3d,0x8b,0xf6,0x02,0x24,0x15,0x80,0x64,0x46,0x80,0x2d,0xd8,0xcf,0xb6,0x1e,0xdb, + 0x05,0x15,0x0b,0x7f,0x5b,0x09,0x61,0x33,0x26,0x20,0x29,0xf4,0x6d,0xdb,0x43,0x21, + 0x00,0x00,0x70,0x0b,0x7c,0x9f,0xe0,0x0f,0x99,0xfe,0x3d,0xc4,0xd2,0x0f,0x0d,0xea, + 0x73,0x55,0x02,0x34,0x15,0x90,0x90,0x80,0xbe,0x16,0x16,0xfc,0xc2,0xd2,0x35,0xb2, + 0x7e,0x6d,0x05,0x40,0x77,0x70,0xae,0x16,0x7c,0x37,0xea,0xb7,0x9f,0xa9,0xe7,0x45, + 0x94,0x1c,0x0e,0x48,0x56,0x84,0xb2,0x09,0xfd,0x34,0x8d,0x32,0x6e,0x66,0x05,0x41, + 0x5b,0x31,0xa1,0xa4,0xc7,0x01,0xa1,0x0f,0x00,0x50,0x9b,0xf5,0x1f,0x22,0xfc,0x43, + 0x2d,0xfe,0x50,0x05,0x20,0x34,0x65,0xcf,0x15,0xd0,0x67,0xee,0xbb,0x4d,0x3e,0xb5, + 0x60,0x8c,0xd8,0x8d,0x22,0xeb,0x6d,0x1e,0x00,0xe1,0x8a,0x22,0x15,0x80,0x64,0x59, + 0x60,0x53,0x01,0x08,0xb1,0xfa,0x4d,0x05,0x20,0xbe,0x10,0xa4,0x30,0x50,0x7c,0xb1, + 0x88,0x27,0x20,0xa9,0x00,0xc4,0x05,0x82,0x4c,0x4f,0x80,0xcb,0x0b,0x80,0x22,0x00, + 0x00,0x10,0x26,0xf8,0x93,0xcf,0xe7,0xf8,0x79,0x6e,0x7b,0x4e,0xa7,0x59,0xfe,0x21, + 0x95,0xf8,0xb2,0x8c,0xed,0xdb,0x04,0x7f,0x9b,0x5a,0xfb,0x36,0xae,0x48,0xfe,0xd1, + 0xd5,0x38,0xb9,0x8f,0x68,0x01,0xf8,0x8c,0x7e,0xbb,0x73,0x3d,0x95,0x00,0x33,0x1e, + 0x20,0x4d,0x01,0x48,0x5e,0x54,0x22,0xf8,0x93,0x43,0x00,0xd2,0x92,0x4a,0x80,0x19, + 0x0b,0x10,0x12,0x0f,0x80,0x22,0x00,0x00,0xa0,0x52,0x2d,0x61,0x5f,0xd0,0x5f,0x16, + 0xb7,0xbf,0xad,0xde,0x7e,0x88,0x9b,0xbf,0xd6,0x28,0xfe,0x36,0x12,0xfa,0x31,0xcf, + 0x88,0x8c,0x77,0x2a,0x00,0x6b,0xb8,0x58,0xb7,0xbf,0x16,0x7d,0x31,0x25,0x95,0x80, + 0x38,0x70,0xcf,0xa6,0x04,0xa4,0xb9,0x95,0xe2,0x0b,0x23,0x16,0xfe,0xb1,0xe0,0x4f, + 0x2a,0x00,0xe6,0x9c,0x02,0xc4,0x02,0x00,0x00,0x54,0x2f,0xfc,0x6d,0x82,0xdf,0xe6, + 0xa5,0xb5,0x4d,0xc9,0x9b,0xc5,0xfd,0x6f,0x2b,0xd4,0x53,0x6d,0x40,0x5f,0x9b,0x5a, + 0xfb,0x36,0xd9,0xbe,0xf6,0x79,0xb4,0x08,0x3d,0x91,0xc2,0x32,0x41,0xd0,0xd6,0x45, + 0xee,0x89,0x4d,0x00,0x27,0x85,0x74,0x52,0x80,0x27,0x85,0x7a,0x52,0xd8,0xdb,0x9a, + 0x6d,0x26,0x41,0xdf,0x30,0x80,0x29,0xe8,0x11,0xfc,0x00,0x00,0x6e,0x45,0xc0,0xa7, + 0x00,0x84,0xa6,0xfa,0xb9,0xac,0x7e,0x57,0x50,0x1f,0x01,0x7d,0x55,0x23,0x13,0xe4, + 0x6c,0xa7,0xfb,0xbe,0x3a,0xd5,0x03,0x20,0x0b,0x68,0x01,0xf8,0x3d,0xfd,0xf6,0x86, + 0x7a,0x79,0x01,0x92,0xd3,0x05,0x27,0x3d,0x01,0x3e,0xf7,0x92,0x79,0x21,0xb9,0x14, + 0x80,0x90,0x79,0x05,0xd2,0x84,0x3e,0x0a,0x01,0x00,0x60,0xf9,0xfb,0x3d,0x00,0x69, + 0x41,0xda,0x21,0x19,0x00,0xa1,0x82,0x9f,0x80,0xbe,0xcc,0x9c,0x67,0x0a,0x7f,0xab, + 0x07,0x20,0x21,0xf4,0xee,0xd7,0x2f,0xfb,0x16,0xbd,0x57,0x36,0x4f,0x40,0xb2,0x14, + 0x70,0xb2,0x99,0xc2,0xdd,0xf4,0x0e,0xf8,0x84,0x7f,0xa8,0x02,0x80,0xc0,0x07,0x00, + 0xc8,0xc7,0x03,0x10,0x32,0x6d,0xaf,0x4d,0xf0,0x63,0xed,0xe7,0x86,0x14,0xfe,0xd9, + 0xcf,0x7a,0x4e,0x53,0x04,0xf3,0x96,0xfa,0xe5,0x05,0xdd,0xba,0x37,0x4a,0x09,0xf0, + 0x29,0x02,0x2e,0xa5,0xc0,0x36,0xa3,0xa0,0x2d,0x06,0x00,0xe1,0x0f,0x00,0x50,0xbd, + 0x12,0x90,0x25,0x08,0x30,0xed,0x35,0x6b,0x3d,0x7e,0xdb,0xf6,0x11,0xfa,0x56,0x96, + 0xeb,0xb6,0xbd,0x3e,0x26,0xaf,0xda,0xbe,0xec,0x9a,0x72,0xa2,0x5f,0xd5,0xc2,0xf0, + 0x12,0xfd,0xf6,0x5b,0xf5,0xb8,0xa8,0x5c,0x75,0xf9,0x5d,0x5a,0x5f,0x72,0xb8,0x20, + 0xce,0xff,0x77,0x09,0xfe,0x34,0xeb,0x1f,0xe1,0x0f,0x00,0x50,0x9b,0x12,0x10,0x5a, + 0xf3,0x3f,0x8f,0x2a,0x7d,0x58,0xfb,0x99,0xb8,0xc4,0x25,0xfc,0x53,0x3d,0x00,0x6b, + 0x04,0x62,0x6f,0xfd,0xf2,0x6f,0xdd,0xc6,0xd4,0x6b,0x6f,0x6d,0xc1,0x79,0xa6,0xe5, + 0xee,0x12,0xf0,0x69,0x82,0x1f,0xf7,0x3f,0x00,0x40,0xbe,0xc2,0x3f,0xab,0x12,0xe0, + 0x52,0x0c,0xd2,0x52,0xf8,0xb0,0xf6,0xab,0x66,0x8a,0x6e,0xdb,0xe8,0x63,0xb4,0xb8, + 0x2a,0x05,0x60,0x8d,0x40,0xdc,0x5d,0xbf,0x3c,0xac,0x0a,0x9c,0x29,0x30,0x4d,0x09, + 0x48,0x2a,0x03,0xe6,0xd0,0x80,0x6b,0x0a,0x61,0x53,0xe8,0x23,0xfc,0x01,0x00,0x1a, + 0xa7,0x04,0xd8,0xc6,0xf3,0xb3,0x58,0xfb,0x04,0xf4,0x65,0x46,0x66,0xfc,0xdb,0x4b, + 0x1f,0xa7,0x27,0x52,0xcf,0x65,0xa0,0x40,0xfe,0x9a,0xb2,0xe4,0x10,0xd6,0x43,0x09, + 0x08,0x55,0x04,0x5c,0x02,0xdf,0x57,0xfc,0x27,0x24,0x0b,0x00,0x00,0x00,0x94,0x55, + 0xf0,0xdb,0x2c,0x74,0x9b,0x60,0x77,0x09,0x7c,0x57,0x34,0x3f,0xd6,0x7e,0x4d,0x9c, + 0xad,0x8f,0xd7,0x25,0xde,0xf3,0x98,0x41,0x20,0xdf,0xa6,0x5f,0x0e,0xab,0x77,0x2f, + 0x4c,0x45,0x20,0x4d,0x19,0x70,0x29,0x07,0xb6,0xe5,0x6d,0x42,0x1f,0x25,0x00,0x00, + 0xa0,0x3a,0x0f,0x80,0xcb,0x13,0x10,0xda,0x6c,0xeb,0x43,0xf0,0x57,0xc5,0xed,0xfa, + 0x98,0xfd,0x47,0xd0,0xb9,0xcc,0x20,0x88,0x07,0xeb,0x97,0x27,0x75,0x1b,0xdb,0x88, + 0x1e,0xf9,0x3c,0x02,0x2e,0xa5,0xc0,0xb5,0x5c,0x9a,0xd0,0x47,0x11,0x00,0x00,0x70, + 0x0b,0x7e,0x97,0x32,0x90,0x96,0x93,0x4f,0x69,0xde,0xba,0x30,0x49,0xb7,0xdd,0xf4, + 0xf1,0x9b,0x93,0xab,0x02,0xb0,0x46,0x30,0x4a,0x30,0xe0,0x63,0xba,0x0d,0x6b,0x54, + 0xef,0x5c,0x8a,0x80,0xcd,0x43,0x90,0xf6,0x19,0x02,0x1f,0x00,0x20,0x3f,0x85,0x20, + 0x64,0x58,0xc0,0xb5,0x1c,0x82,0x3f,0x17,0x66,0xe8,0x36,0x4e,0x1f,0xc3,0x29,0xc1, + 0xe7,0xb0,0x0a,0x01,0xbc,0xbd,0x7e,0x79,0x48,0xb7,0x01,0x8d,0xec,0xa9,0x4b,0x88, + 0xa7,0x59,0xf9,0xa1,0x01,0x7f,0x28,0x04,0x00,0x00,0x7e,0x0f,0x80,0xcb,0x13,0xe0, + 0x13,0xf0,0x04,0xf5,0xe5,0xce,0x3c,0xdd,0xf6,0xd6,0xc7,0xf1,0x85,0x4c,0xe7,0xb4, + 0x4a,0xe1,0xbb,0xb7,0x7e,0xf9,0xbf,0xba,0xf5,0x2c,0x43,0xcf,0x7d,0x16,0x7d,0x88, + 0xe0,0x47,0xe8,0x03,0x00,0xd4,0xa6,0x0c,0xa4,0x59,0xf3,0x08,0xfd,0xc2,0x58,0xaa, + 0xdb,0xc1,0xfa,0x78,0x3e,0x94,0xf9,0x3c,0xd6,0x20,0x74,0x45,0x09,0xb8,0xb5,0xd1, + 0x9e,0x80,0x2c,0xc2,0x3c,0x54,0xc8,0xa3,0x0c,0x00,0x00,0x84,0x7b,0x00,0xb2,0x2a, + 0x07,0x90,0xab,0xe5,0x7f,0x78,0x35,0xc2,0xbf,0x26,0x05,0x60,0x8d,0xa0,0xdc,0x7e, + 0x8d,0x27,0x60,0x58,0x33,0x1d,0x31,0x04,0x3c,0x00,0x40,0x63,0x14,0x04,0xc8,0x8d, + 0x19,0x6b,0x2c,0xff,0x17,0xaa,0x3e,0x67,0x39,0x08,0x53,0x09,0x0c,0xbc,0x47,0x35, + 0x28,0x3b,0x00,0x00,0x00,0xa0,0xcd,0x90,0x68,0xff,0x83,0xb2,0x04,0xfc,0xd9,0xe8, + 0x9c,0x83,0xd6,0x27,0x3b,0xb0,0x9b,0x6e,0xb7,0x73,0x4e,0x00,0x00,0x00,0x0a,0x45, + 0x64,0xed,0x6e,0xb5,0x0a,0xff,0x5c,0x14,0x80,0x35,0x4a,0xc0,0x9c,0x35,0x85,0x07, + 0xce,0x56,0x1f,0x96,0x20,0x04,0x00,0x00,0x80,0xfc,0x10,0xd9,0x2a,0x15,0xfe,0xfe, + 0x23,0x34,0xcf,0xdf,0x2b,0xbb,0xf3,0xde,0xc3,0x35,0x73,0x07,0x5c,0xa3,0xea,0x38, + 0x81,0x10,0x00,0x00,0x40,0x0b,0x23,0xd6,0xfe,0x09,0xbe,0xda,0xfe,0x0d,0xf1,0x00, + 0x18,0xde,0x00,0xd9,0xc1,0x6d,0x74,0xfb,0x89,0xfa,0x70,0x2e,0x62,0x00,0x00,0x00, + 0xc8,0xce,0xf2,0x35,0xb2,0x74,0x9b,0xbc,0x85,0x7f,0x21,0x1e,0x00,0xc3,0x1b,0xb0, + 0xa5,0x7e,0xb9,0x4c,0xb7,0x7d,0x39,0x8f,0x00,0x00,0x00,0xc1,0x3c,0xa0,0xdb,0x57, + 0xb4,0xe0,0x7f,0xb5,0xa8,0x0d,0x74,0x2e,0x72,0xef,0x65,0xc7,0x75,0xdb,0x4f,0xbf, + 0x3d,0x5a,0xb7,0x09,0x9c,0x4f,0x00,0x00,0x80,0x54,0x44,0x56,0x1e,0x2d,0xb2,0xb3, + 0x48,0xe1,0x5f,0xb8,0x07,0xc0,0xf0,0x06,0x88,0xb2,0x31,0x5e,0x7d,0x18,0x28,0xb8, + 0x33,0xe7,0x18,0x00,0x00,0xa0,0x83,0x67,0x74,0xbb,0x58,0xb7,0xeb,0xb5,0xe0,0x5f, + 0x5d,0x8f,0x0d,0x36,0xa4,0x72,0x83,0x56,0x06,0xf6,0xd4,0x2f,0xa7,0xea,0x76,0x94, + 0x2a,0x49,0x39,0x61,0x00,0x00,0x80,0x3a,0x23,0x65,0x7c,0x6f,0xd4,0xed,0x0a,0x2d, + 0xf4,0x1f,0xa9,0xf7,0xc6,0x1b,0x5a,0xba,0x49,0x2b,0x02,0x83,0xf4,0xcb,0x11,0xba, + 0x1d,0xab,0x3e,0x8c,0x13,0xe8,0xc6,0xf5,0x00,0x00,0x00,0x2d,0x8c,0xa4,0xf3,0xc9, + 0xf8,0xfe,0x75,0xba,0xdd,0xac,0x05,0xff,0xdc,0x46,0xed,0x48,0x69,0x6a,0x37,0x6a, + 0x65,0xa0,0x9f,0x7e,0x39,0x40,0xb7,0xfd,0x75,0xdb,0x43,0xb7,0x6d,0x55,0xc1,0x31, + 0x0a,0x00,0x00,0x00,0x05,0x23,0xee,0xfc,0x97,0x74,0x7b,0x54,0xb7,0xfb,0x74,0xbb, + 0x57,0x0b,0xfd,0x05,0x65,0xd8,0xb1,0xd2,0x16,0x6f,0xd6,0x0a,0x41,0x5f,0xf5,0x61, + 0x3a,0xe1,0x76,0xea,0xc3,0x32,0xc3,0x52,0x57,0x60,0xa4,0x6e,0xeb,0xe9,0x36,0x58, + 0xb7,0x5e,0xba,0x75,0xd7,0xad,0x0b,0xd7,0x17,0x00,0x00,0x34,0x80,0x55,0xea,0xc3, + 0x54,0xbd,0x25,0xba,0x49,0x71,0x9e,0x59,0xba,0x4d,0x53,0x1f,0xe6,0xed,0x4b,0xb9, + 0xde,0x17,0x45,0xf8,0x6b,0x81,0xbf,0xa8,0x8c,0x3b,0xff,0xff,0x00,0xa9,0xd9,0x66, + 0x33,0x79,0x3c,0x5d,0x0d,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60, + 0x82, + +}; diff --git a/tools/printer-lg.png b/tools/printer-lg.png new file mode 100644 index 0000000000000000000000000000000000000000..439c59c731af79c999fdd9c424eac52ad5877d0e GIT binary patch literal 29521 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 jpXQ!x5bo>S8x#tVJ?tRwr)%-nm(zZX5hRZ0kA> literal 0 Hc-jL100001 diff --git a/tools/printer-png.h b/tools/printer-png.h index 95c42c5c9..192b1fd6b 100644 --- a/tools/printer-png.h +++ b/tools/printer-png.h @@ -2,304 +2,450 @@ static const unsigned char printer_png[] = { 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52, 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x08,0x06,0x00,0x00,0x00,0xc3,0x3e,0x61, - 0xcb,0x00,0x00,0x12,0x8c,0x49,0x44,0x41,0x54,0x78,0x01,0xec,0xd5,0x01,0x44,0x2c, - 0x51,0x14,0xc6,0xf1,0xcf,0x06,0x10,0x25,0x45,0xa9,0x01,0x12,0x48,0x02,0x01,0x10, - 0x64,0x42,0x28,0x28,0x03,0xa1,0x24,0x01,0xc5,0x14,0x04,0x29,0x50,0x29,0x54,0x01, - 0x50,0x51,0xa0,0xc8,0xc0,0x50,0xa1,0x28,0x80,0x0a,0x02,0x01,0xad,0x10,0xb2,0xc4, - 0x32,0xbb,0xcb,0xff,0xed,0xbb,0x76,0xc7,0x1a,0xdb,0xbe,0x17,0xc0,0x6d,0x7e,0x1c, - 0xec,0x39,0xe3,0x0c,0xf7,0xdb,0xbb,0xab,0x46,0x00,0x07,0xf0,0x81,0x10,0xc8,0x02, - 0x11,0x16,0xb0,0x5c,0x54,0xc9,0x2a,0xac,0x64,0xe7,0xe8,0xa7,0x80,0x6e,0xe0,0x18, - 0x28,0x61,0x3b,0xfb,0x95,0x2a,0x59,0x76,0xff,0x6f,0xf8,0x2e,0x90,0xc3,0x36,0xa9, - 0x1c,0xe0,0xaa,0x11,0x60,0xce,0xea,0x5b,0x9f,0x2a,0x01,0x73,0x8d,0x6e,0x7e,0x09, - 0xdb,0xa5,0x4a,0x80,0x5b,0xef,0x3f,0x3f,0xc7,0x6f,0x91,0xca,0x01,0xdd,0xaa,0x02, - 0x8e,0x49,0x18,0x1c,0x1c,0xa4,0xa7,0xa7,0x87,0xf5,0xf5,0x75,0xac,0x94,0x3a,0x56, - 0x59,0x06,0x70,0x24,0x79,0x4a,0xc8,0x66,0xb3,0xa6,0x3e,0x3f,0x3f,0x65,0xa5,0x94, - 0x67,0xb2,0x07,0x7c,0xea,0x58,0x5e,0x5e,0x66,0x7e,0x7e,0x9e,0xf3,0xf3,0x73,0x52, - 0xd6,0xf2,0x05,0x84,0xa4,0x7e,0xab,0x30,0x23,0xa9,0x5f,0x75,0x1c,0x1c,0x1c,0x68, - 0x73,0x73,0x53,0xb7,0xb7,0xb7,0xaa,0xf5,0xfc,0xfc,0x6c,0xfa,0x5b,0x5b,0x5b,0x2a, - 0x16,0x8b,0xfa,0xf8,0xf8,0xd0,0xc9,0xc9,0x89,0xa6,0xa7,0xa7,0x35,0x35,0x35,0xa5, - 0xed,0xed,0x6d,0xbd,0xbf,0xbf,0xeb,0x5f,0x3b,0x01,0x3d,0x3c,0x3c,0x68,0x6d,0x6d, - 0x4d,0x63,0x63,0x63,0x5a,0x5a,0x5a,0x52,0x10,0x04,0x6a,0xe4,0xed,0xed,0x4d,0xbb, - 0xbb,0xbb,0xf2,0x3c,0x4f,0x13,0x13,0x13,0xda,0xd8,0xd8,0xd0,0xeb,0xeb,0xab,0x6a, - 0xed,0xed,0xed,0x99,0x77,0x5c,0x5d,0x5d,0xe9,0x3b,0x37,0x37,0x37,0xe6,0x99,0xa3, - 0xa3,0x23,0x25,0x5d,0x5e,0x5e,0xca,0xf7,0x7d,0x8d,0x8e,0x8e,0x6a,0x61,0x61,0x41, - 0xa7,0xa7,0xa7,0x02,0x64,0xa9,0x7e,0x01,0x11,0x75,0xb4,0xb7,0xb7,0x23,0x89,0xc5, - 0xc5,0x45,0x6a,0xed,0xef,0xef,0x23,0xc9,0xd4,0xd3,0xd3,0x13,0x9d,0x9d,0x9d,0x48, - 0xaa,0x2d,0xd3,0x2b,0x87,0xdb,0x70,0xe7,0xca,0xca,0x0a,0x92,0x48,0xd6,0xec,0xec, - 0x2c,0x85,0x42,0x81,0xa4,0x30,0x0c,0x69,0x6b,0x6b,0x23,0xf9,0x7c,0x4b,0x4b,0x8b, - 0x99,0x55,0xb9,0xae,0x6b,0xfa,0xbd,0xbd,0xbd,0x7c,0xa7,0xaf,0xaf,0x0f,0x49,0x94, - 0x03,0xa6,0xea,0xeb,0xeb,0x8b,0xc9,0xc9,0x49,0xd3,0x4f,0xd6,0xf8,0xf8,0x38,0xf9, - 0x7c,0x1e,0x0b,0x45,0x22,0xf6,0xf3,0x2f,0x40,0x57,0x57,0x17,0x99,0x4c,0x86,0xa1, - 0xa1,0x21,0x73,0x98,0xc3,0xc3,0xc3,0xf1,0xcc,0x71,0x1c,0xa2,0x28,0xaa,0xbb,0xb3, - 0xb5,0xb5,0x15,0x49,0x7f,0x3f,0x9b,0x43,0x9f,0x99,0x99,0xa9,0xce,0x4c,0x1d,0x1e, - 0x1e,0x52,0xeb,0xe5,0xe5,0x85,0xa6,0xa6,0x26,0x33,0x1b,0x19,0x19,0x21,0x08,0x02, - 0x2e,0x2e,0x2e,0x18,0x18,0x18,0x30,0xbd,0x8e,0x8e,0x8e,0x38,0xa0,0xb3,0xb3,0xb3, - 0x78,0xcf,0xfd,0xfd,0x3d,0x49,0x77,0x77,0x77,0xf1,0xfc,0xf1,0xf1,0x91,0x2a,0xcf, - 0xf3,0x4c,0xaf,0xb9,0xb9,0x99,0x9d,0x9d,0x1d,0xae,0xaf,0xaf,0x59,0x5d,0x5d,0x8d, - 0xdf,0x5b,0xfe,0xc5,0xc3,0x46,0x7f,0xd8,0x33,0x03,0x8f,0xda,0x82,0x20,0x8c,0x7f, - 0x3d,0xb7,0xaa,0x22,0x88,0x50,0x54,0x49,0x52,0x10,0x08,0x55,0x55,0x10,0x08,0x22, - 0x80,0x0a,0xa8,0xa0,0x84,0x82,0x42,0xe8,0x9f,0xa8,0x92,0x84,0x90,0x00,0xa9,0x28, - 0x54,0x14,0x92,0x84,0x40,0x44,0x29,0x52,0xa9,0x54,0x29,0x85,0x6a,0xde,0x67,0x98, - 0x63,0x9d,0xb7,0x75,0xea,0x7a,0x91,0xea,0xc7,0x70,0xdf,0xee,0xdb,0xdd,0x75,0x76, - 0x76,0x67,0xbe,0x29,0x6e,0x07,0xb0,0xdb,0xb7,0xb8,0xb8,0x28,0x0e,0xea,0x08,0xd6, - 0x3f,0x3a,0x3a,0xea,0x9b,0x53,0xad,0xb9,0xb9,0x59,0xee,0xef,0xef,0xc5,0xd8,0xdb, - 0xdb,0x93,0x8c,0x8c,0x8c,0xc0,0x79,0x18,0x5e,0xc4,0x68,0x6c,0x6c,0xd4,0xf6,0xd2, - 0xd2,0x52,0x79,0x7a,0x7a,0x12,0x83,0xa1,0x46,0x92,0x92,0x92,0xb4,0x8f,0xe1,0x45, - 0xdb,0x1e,0x1e,0x1e,0x74,0x5f,0x00,0xa4,0xb3,0xb3,0x53,0xc2,0x30,0x54,0x69,0x5f, - 0x79,0x79,0xb9,0x18,0x9b,0x9b,0x9b,0x92,0x90,0x90,0x20,0x00,0xd4,0x81,0x5c,0xba, - 0xba,0xba,0xcc,0xd9,0x6d,0x4f,0xc6,0xaf,0x03,0x6c,0x6f,0x6f,0x4b,0x98,0xe3,0xe3, - 0xe3,0xe0,0xd6,0xb4,0xb4,0xb4,0x78,0xe7,0x6c,0x6a,0x6a,0x92,0x97,0x97,0x17,0x09, - 0xa1,0xaa,0xc3,0xe6,0x66,0x6c,0xd7,0xb6,0xf3,0xf3,0xf3,0xa0,0x8d,0xf9,0x85,0x84, - 0xa9,0xaa,0xaa,0xd2,0xbe,0xb6,0xb6,0x36,0x31,0x3a,0x3a,0x3a,0x82,0x97,0xe6,0xf1, - 0xf1,0x51,0x8c,0x9b,0x9b,0x1b,0x49,0x4b,0x4b,0xd3,0xbe,0xb1,0xb1,0xb1,0xf0,0x21, - 0xab,0x03,0x86,0xf7,0xc5,0x5c,0x22,0x58,0x7f,0x7f,0x7f,0xdf,0xe9,0xf9,0x75,0x00, - 0xfd,0xa0,0x3e,0x72,0x73,0x73,0xb5,0x9f,0x87,0x13,0x39,0xa7,0xcb,0xc4,0xc4,0x84, - 0xcd,0xad,0x1f,0x9e,0xe8,0x33,0x6e,0x6d,0x65,0x65,0x65,0xc2,0xe4,0xcf,0x35,0xc9, - 0xcc,0xcc,0xd4,0xbe,0xfa,0xfa,0x7a,0x31,0xdc,0x31,0x33,0x33,0x33,0x62,0x8c,0x8c, - 0x8c,0xd8,0x33,0xaf,0x31,0xdf,0x68,0x68,0x68,0xd0,0xf6,0xc4,0xc4,0xc4,0x7f,0xe6, - 0xaf,0xae,0xae,0x0e,0xe6,0x5a,0x5d,0x5d,0x15,0x63,0x7a,0x7a,0x5a,0xd7,0x8c,0xb2, - 0x9e,0x9e,0x1e,0xf9,0xca,0xfc,0xc1,0x27,0xc0,0x83,0x06,0xc1,0xc5,0xc5,0x45,0x5c, - 0xe3,0xdc,0xb1,0xbc,0x75,0xae,0x02,0x01,0x63,0xbf,0x6b,0xb8,0xbc,0xbc,0x04,0x51, - 0x35,0x62,0x54,0x56,0x56,0xa2,0xa8,0xa8,0x08,0xc4,0xcd,0xf4,0x31,0x3e,0x3e,0x0e, - 0xa2,0x6a,0x85,0x4e,0x00,0xe2,0xae,0xa1,0xaa,0x26,0x3c,0xff,0xfa,0xfa,0x3a,0x0c, - 0x77,0x8d,0x83,0x83,0x03,0xd0,0x21,0x22,0x6d,0x6b,0x6b,0x0b,0x5f,0x99,0x4f,0x71, - 0x80,0xdb,0xdb,0x5b,0x10,0xb0,0x94,0x1c,0xd7,0x38,0x77,0x2c,0x13,0x3c,0x18,0x94, - 0x8c,0x58,0x59,0x59,0xf1,0xda,0xe4,0xe4,0x24,0x5c,0x18,0x12,0x40,0xc0,0x1c,0x05, - 0x67,0x67,0x67,0xea,0x3c,0x76,0x18,0xed,0xed,0xed,0x30,0xdc,0x35,0x0a,0x0a,0x0a, - 0xbc,0x73,0x9b,0xf1,0x46,0x83,0xd8,0x1c,0x3a,0x67,0x84,0xa9,0x44,0xfe,0xca,0xc4, - 0xf0,0x9f,0x61,0x92,0x86,0x93,0x93,0x93,0xe0,0x83,0x7e,0x84,0xa3,0xa3,0x23,0x18, - 0x36,0x96,0x89,0x1f,0x0c,0x11,0xb1,0x43,0x88,0xa4,0xb5,0xb5,0x15,0x83,0x83,0x83, - 0xba,0x1f,0x6a,0x79,0xbd,0xb1,0x04,0x54,0x0e,0xa0,0x6a,0x81,0x61,0x6b,0x6c,0x6c, - 0x6c,0xe8,0xbe,0x2b,0x2a,0x2a,0x90,0x9c,0x9c,0x8c,0x28,0x18,0x7a,0xd4,0xe2,0xe0, - 0xfb,0xbc,0x00,0xd4,0xeb,0x08,0x33,0x3f,0x3f,0x0f,0x66,0xf7,0x20,0x60,0x0e,0x10, - 0x3d,0xce,0x81,0xf1,0x3a,0x38,0xfc,0xec,0xec,0x6c,0x80,0x50,0x11,0x20,0x3f,0x3f, - 0x1f,0x20,0xc3,0xc3,0xc3,0xb8,0xbe,0xbe,0xc6,0x7b,0xc8,0xcb,0xcb,0x03,0x65,0x29, - 0x40,0x98,0xf0,0x61,0x6a,0x6a,0xca,0x77,0xfb,0x95,0x9a,0x9a,0x1a,0x80,0x30,0x61, - 0x04,0x25,0x20,0xe2,0xe0,0x67,0x3a,0x40,0x6d,0x6d,0xad,0x1b,0xe3,0xb4,0x52,0xc7, - 0x02,0x0f,0x88,0x1e,0x1a,0x55,0x00,0x7c,0x30,0x19,0x43,0x7f,0x7f,0xbf,0xeb,0x08, - 0x5a,0x99,0x63,0x61,0x09,0x20,0x03,0x03,0x03,0xa0,0x2c,0x83,0x5b,0xdd,0x23,0xfa, - 0x94,0xb3,0x28,0x83,0xc3,0xc3,0x43,0x18,0xcf,0xcf,0xcf,0x3a,0x6e,0x69,0x69,0x09, - 0x61,0x28,0xf9,0x00,0xb2,0xbb,0xbb,0x8b,0xab,0xab,0x2b,0xa4,0xa6,0xa6,0xfa,0xf6, - 0xa4,0xe1,0x82,0xb2,0x10,0x20,0x43,0x43,0x43,0xea,0x30,0x22,0x02,0x83,0x4a,0x04, - 0x73,0x73,0x73,0xfa,0x42,0x7c,0x3b,0xe2,0x55,0x01,0xae,0x15,0x17,0x17,0x0b,0x6f, - 0x91,0xa4,0xa7,0xa7,0xeb,0xbf,0xf9,0x84,0xca,0xec,0xec,0xec,0x6b,0x73,0x9a,0x69, - 0x36,0x5e,0x57,0x57,0xa7,0x55,0x3b,0x6b,0xa3,0x53,0x79,0x2b,0x81,0xdd,0xdd,0xdd, - 0xc1,0xff,0xa1,0xf6,0x57,0x45,0xc0,0xa7,0xdc,0xd6,0xd4,0xdf,0x61,0xee,0xee,0xee, - 0x74,0x0d,0x00,0x8e,0x54,0xf4,0xb3,0xb3,0xb3,0x23,0x39,0x39,0x39,0x6e,0x91,0x4b, - 0x55,0x4c,0x61,0x61,0x61,0xd0,0xb6,0xb0,0xb0,0xf0,0x73,0x64,0x60,0x56,0x56,0x96, - 0x00,0x90,0xde,0xde,0xde,0x57,0x1d,0x60,0x79,0x79,0x59,0x4a,0x4a,0x4a,0xdc,0x43, - 0xd5,0x0f,0xc6,0xcc,0xf9,0x2d,0xa7,0x52,0xdd,0xdd,0xd7,0xd7,0x27,0x29,0x29,0x29, - 0xc1,0x38,0xfe,0x16,0x3e,0xcf,0x56,0x3d,0xf4,0xc2,0x3a,0xbd,0xeb,0x2c,0x6a,0xb1, - 0x58,0x4c,0x0b,0x44,0x7c,0x79,0x44,0xf1,0x17,0x7e,0xd4,0xd6,0xd6,0xd6,0xe4,0x2d, - 0xf8,0xa7,0x6f,0xad,0x5d,0x58,0xad,0xc0,0x8c,0xb1,0x5e,0x25,0x1d,0x93,0xba,0x6f, - 0xea,0x00,0x1f,0xc0,0x57,0x07,0x38,0x3d,0x3d,0xd5,0x43,0xe7,0x13,0x29,0xca,0x3b, - 0x5f,0x15,0xde,0x74,0x2d,0xc7,0xd2,0xf4,0xf7,0x7b,0x61,0x1e,0x20,0x4c,0xda,0x74, - 0xdc,0x5f,0x76,0xce,0x40,0x23,0xde,0x26,0x0a,0xe3,0x07,0xdd,0x40,0xd7,0x51,0xa1, - 0x44,0x00,0x54,0x20,0x29,0x50,0x04,0xd0,0x05,0xa4,0x1b,0x88,0x80,0x82,0xa8,0x00, - 0xba,0x82,0x84,0x2e,0x23,0x21,0x20,0x52,0x74,0x2d,0xf3,0xfd,0x3c,0x3c,0x2c,0x8d, - 0xf5,0x1d,0xbb,0xfd,0x8d,0xed,0xfc,0x18,0x6f,0x6f,0xb3,0xdb,0xf6,0xce,0x9c,0x9d, - 0x99,0x39,0xe7,0x3c,0x23,0x47,0xcf,0x9c,0x61,0x5a,0x69,0x9f,0x9f,0x9f,0x0d,0x83, - 0x91,0xb7,0x71,0x3a,0x65,0x00,0xd3,0x48,0x39,0x82,0x8a,0xa1,0x1d,0x41,0x45,0xed, - 0x02,0x8a,0x32,0x00,0x56,0xed,0x71,0x7b,0x7b,0x1b,0x77,0x77,0x77,0xc1,0x62,0x29, - 0x32,0x5c,0x5d,0x5d,0xe9,0xbd,0xf8,0xd8,0xa3,0x18,0x84,0x56,0xfc,0x69,0xa2,0xf5, - 0x29,0xca,0x00,0x8a,0x32,0x80,0xa2,0x0c,0xa0,0x28,0x03,0x28,0xca,0x11,0x54,0xac, - 0xaf,0xaf,0x2b,0x34,0x8d,0x16,0xe1,0x2f,0xfa,0x01,0x8a,0xdf,0xd4,0x4a,0x92,0x88, - 0x3a,0xba,0x01,0x14,0xa7,0xa7,0xa7,0x41,0xd6,0x72,0x90,0x24,0x1a,0x73,0x42,0x0e, - 0xb1,0xe5,0xe5,0x65,0xe5,0x2d,0xfc,0x41,0x47,0x50,0xb1,0xb2,0xb2,0xd2,0x22,0x42, - 0xa2,0x94,0x24,0xb5,0x06,0x98,0x5d,0x77,0xd8,0xd7,0x3a,0x32,0xcc,0x2b,0xf5,0x0c, - 0xe1,0x8a,0x32,0x97,0xb2,0x5a,0x49,0x84,0x29,0xca,0x1e,0x3a,0x3b,0x3b,0x8b,0xc3, - 0xc3,0xc3,0x40,0x5d,0xe4,0xcc,0x65,0xe1,0x0c,0x25,0xde,0xa3,0x0c,0xa7,0x80,0xf7, - 0xf7,0xf7,0xe0,0x5e,0xe5,0xfe,0xfe,0x3e,0xaf,0x89,0xcc,0x3f,0xcf,0xe2,0x8d,0x00, - 0x39,0xdd,0x61,0x3f,0xbc,0x4d,0x8e,0x81,0x65,0x6b,0xd6,0x0e,0xa6,0x32,0xa4,0x48, - 0x3c,0x6d,0x9b,0x9b,0x9b,0xbe,0x9f,0xcc,0x2e,0x92,0xc0,0xc5,0x90,0x9f,0xd8,0xfd, - 0xff,0x9c,0x25,0x95,0xd7,0x44,0xe6,0x9f,0xc7,0x2c,0x9c,0x01,0x24,0x75,0x87,0x6e, - 0x30,0x6b,0x0c,0x2d,0x40,0x51,0x63,0xd1,0x51,0x09,0x03,0x90,0x20,0xd5,0x1d,0x2e, - 0x63,0x5b,0x5d,0x5d,0x75,0x9d,0x32,0xa0,0xcc,0xc7,0xc7,0x47,0xbb,0xbe,0xbe,0xf6, - 0xdf,0x6c,0x6b,0x6b,0x6b,0xba,0xa7,0x34,0x82,0x65,0x69,0x4d,0x64,0xe2,0x79,0x16, - 0xdb,0x00,0x12,0xba,0xc3,0x5e,0x83,0x49,0xe8,0xfa,0xfc,0xfc,0x3c,0x53,0x8e,0x24, - 0xd3,0x8d,0x32,0x8a,0x40,0x57,0xe7,0x24,0x92,0xa1,0x9c,0x5e,0x03,0x24,0x34,0x91, - 0x89,0xe7,0x59,0x70,0x3f,0x00,0xba,0xc3,0x78,0x7a,0x7a,0x72,0xa8,0x5a,0xf0,0xcd, - 0xd4,0xfc,0xe9,0xf9,0x54,0x59,0xc5,0x1d,0x98,0x37,0xf5,0xfe,0x59,0x76,0x0a,0x37, - 0x37,0x37,0x41,0xc3,0x07,0xe8,0xba,0xb1,0xb1,0x11,0xa0,0x75,0x40,0x06,0x94,0x51, - 0x4a,0xb1,0xf7,0xdf,0x65,0x24,0x08,0xc3,0x08,0xe3,0x2c,0xe6,0x78,0x7d,0x7d,0x0d, - 0x48,0x3c,0xcf,0x82,0x6f,0x03,0xd1,0x14,0x38,0xa5,0xdc,0x08,0x8b,0x41,0x2c,0xeb, - 0xea,0xc1,0xb0,0x1d,0x33,0xa0,0xce,0x37,0x86,0xb3,0x12,0x22,0x0d,0x7c,0x7d,0x7d, - 0x85,0x41,0x5d,0xa4,0x45,0xdc,0x64,0x61,0x21,0xf9,0x43,0x4c,0x93,0x7e,0x1e,0x58, - 0x8a,0x45,0x23,0xa1,0x3b,0x9c,0x37,0xfa,0xe6,0xcf,0x4e,0x4f,0x13,0xa9,0xd2,0x43, - 0x7a,0xc5,0x72,0x04,0xe5,0x75,0x87,0xa3,0x93,0xd3,0x44,0x4e,0xa1,0x46,0x80,0xbe, - 0xee,0x70,0x24,0xac,0x42,0x32,0x79,0x4d,0x64,0x8d,0x00,0x69,0xdd,0xe1,0x08,0x78, - 0x61,0xf7,0xfd,0xfd,0x1d,0x06,0xf2,0x9a,0xc8,0x32,0x80,0xbc,0xee,0x70,0x00,0xb4, - 0x3b,0x09,0x78,0x7b,0x7b,0xeb,0xcc,0xe5,0x09,0x4d,0xe4,0xe0,0x06,0xa0,0x68,0xd7, - 0xe3,0xe3,0xa3,0x24,0xdb,0x7b,0x7b,0x7b,0xe1,0xc2,0x89,0x5e,0x81,0x83,0x23,0x76, - 0x76,0x76,0x54,0x76,0x77,0x77,0x55,0xf8,0x9d,0x5c,0xb8,0x47,0x47,0x47,0x0a,0x94, - 0x70,0xca,0x46,0x5c,0x5e,0x5e,0x06,0x7b,0xdc,0x60,0x5f,0x1b,0x34,0x98,0xc4,0x9e, - 0x1d,0xd4,0x30,0x38,0x54,0x24,0xdd,0x66,0xd8,0xd4,0x41,0x11,0x78,0x06,0x2d,0x66, - 0xd5,0xdf,0x1b,0x04,0x3d,0xa3,0xff,0x67,0x9c,0x46,0xc1,0xbd,0x5c,0xc8,0x66,0x7f, - 0x7f,0x3f,0xd0,0x44,0x06,0xe8,0xb0,0x09,0x4e,0x37,0x0b,0x8e,0xf0,0x8d,0xad,0xad, - 0xad,0xc0,0x13,0xa8,0x10,0xf5,0xc5,0xc5,0xc5,0x98,0xc1,0x20,0x3a,0xbd,0xe1,0x37, - 0x97,0x53,0x86,0x8e,0x68,0x9c,0xbb,0xa7,0x42,0xa7,0xfb,0xda,0x2d,0xae,0x9b,0xf6, - 0x7a,0x4e,0x00,0x91,0x63,0x85,0x86,0xd3,0xe7,0xcc,0xa0,0x3b,0x94,0x67,0xd0,0xaf, - 0x63,0xa1,0xd8,0xfe,0x97,0x56,0x32,0xf1,0xfe,0x93,0x93,0x13,0xd5,0xd1,0x71,0xad, - 0x07,0x1d,0x68,0x51,0xaa,0x0a,0x9d,0x9b,0xd6,0x44,0xe6,0x9f,0x47,0x88,0xf8,0x8d, - 0x8e,0xe7,0xdb,0xd9,0x8e,0x8f,0x8f,0x1b,0xdf,0x6a,0x79,0xb3,0x26,0x0b,0x56,0xed, - 0xeb,0xe4,0xcf,0xbd,0xfa,0x1f,0x85,0x50,0xac,0x3a,0x1f,0xa3,0x52,0x21,0xf0,0x22, - 0x0f,0x19,0x9f,0x99,0xd0,0x1d,0x8e,0x86,0xda,0x4c,0xea,0x64,0x8e,0xb0,0x93,0x40, - 0x35,0xaf,0x89,0x1c,0x23,0x25,0x4c,0x5a,0x41,0x9c,0x16,0x8d,0x28,0x58,0x3b,0x38, - 0x38,0x98,0x57,0x51,0xc7,0xe3,0xf9,0xd2,0xe9,0x62,0x93,0x07,0x38,0xb1,0x9f,0x57, - 0x43,0x30,0x12,0xe4,0x75,0x87,0xa2,0x58,0x8a,0x39,0x40,0xa4,0x4b,0xe1,0x56,0x0e, - 0x57,0x0c,0x3a,0x64,0x5e,0x0e,0x11,0x39,0x6c,0xd0,0xf8,0x6b,0xdf,0xce,0x09,0x5e, - 0x61,0x0c,0x75,0x3a,0xce,0x85,0xe1,0x30,0x8a,0x7f,0xeb,0x07,0xd0,0xc2,0xe5,0xe5, - 0xe5,0x45,0xb1,0x6f,0x5c,0xab,0xba,0xf7,0xd6,0xa6,0xb5,0xd6,0x5d,0x69,0x83,0xeb, - 0x74,0x05,0xff,0xac,0xab,0xeb,0xf1,0x9b,0xcb,0xa8,0xd8,0x0a,0x69,0x31,0xe7,0xd7, - 0xf8,0x24,0x2f,0x46,0x1a,0x79,0xf6,0x98,0x02,0x82,0x29,0x40,0x75,0x22,0x4f,0x91, - 0x9d,0xab,0x58,0x81,0xb7,0xf3,0xf3,0x73,0x0d,0xc7,0x84,0x5b,0x7f,0x14,0xe6,0x7e, - 0x5f,0xbb,0xc5,0x75,0xbd,0xd7,0x33,0xcf,0xeb,0x1c,0xdf,0xed,0xed,0xed,0xc6,0xb6, - 0x47,0x9f,0xe1,0x2b,0x53,0x81,0x16,0x93,0x04,0x57,0x14,0xde,0xe4,0x77,0x9a,0x37, - 0x31,0x16,0x45,0xf7,0x1e,0x1e,0x1e,0x14,0x4a,0xfd,0xaf,0xbd,0x73,0x80,0xb5,0x2d, - 0x87,0xc2,0x70,0xc7,0x7c,0xf6,0xbb,0x1a,0xdb,0xb6,0xad,0x60,0x3c,0xc1,0xd8,0x88, - 0x86,0xe1,0x8d,0xed,0x0c,0xc3,0x61,0xcc,0xb1,0x1d,0x8c,0x6d,0xdb,0xf3,0x6c,0xf5, - 0x7b,0xc9,0x9f,0xa4,0x3b,0xdd,0x39,0x7d,0xa7,0xe9,0x3e,0xf7,0xec,0xbb,0xfe,0x64, - 0xa5,0x3d,0xdd,0x3c,0xfd,0x57,0xd7,0xaa,0x76,0xcb,0x37,0xfd,0x05,0x60,0x2e,0x00, - 0xd3,0xce,0x4c,0x14,0x46,0xa8,0x0a,0x42,0x3d,0x60,0x28,0xa6,0x9a,0x90,0x98,0x7a, - 0x4a,0x3d,0xa5,0x1f,0x4b,0x83,0x70,0x5c,0x92,0x31,0x90,0x63,0xd8,0x38,0xc1,0x42, - 0x40,0x3e,0xed,0xd3,0xd2,0xe4,0x83,0x80,0x58,0x3f,0xd9,0xc1,0xb1,0xf4,0x3c,0x75, - 0x01,0xde,0xc1,0x37,0xe3,0x1c,0x1d,0x3c,0x84,0xbd,0x06,0x4a,0xe8,0x57,0x46,0x71, - 0x7e,0x25,0x91,0xf6,0xd6,0x01,0x20,0x81,0x3f,0xca,0xa7,0xe0,0x6f,0xbf,0xfd,0x76, - 0x63,0xfd,0xe2,0x90,0x4c,0x89,0x87,0x68,0x9e,0x4f,0x88,0x25,0x20,0x8e,0xcf,0x27, - 0x2c,0x05,0xba,0x5c,0x21,0x56,0xc2,0xca,0x60,0x28,0x21,0xbd,0x70,0xcc,0xaf,0xa3, - 0x57,0x8e,0xa9,0xe1,0xbc,0x07,0x56,0xc7,0xef,0xac,0xa2,0x3a,0x4c,0xfb,0x14,0x80, - 0x4c,0xf7,0xb3,0x69,0xe8,0xc5,0x6b,0x74,0x60,0x84,0x6e,0x51,0x9e,0x2d,0xb2,0x31, - 0xfd,0x8a,0x13,0x72,0x0c,0x49,0x04,0xd6,0x23,0x20,0x54,0x71,0x48,0x65,0x82,0x08, - 0x69,0x58,0x19,0xc8,0xa7,0x05,0xc3,0x72,0x72,0x6a,0x59,0xe8,0xf9,0x00,0xc5,0xe4, - 0xfd,0x98,0xa0,0x01,0xf1,0x4c,0xcc,0xa0,0xd2,0xcb,0xbb,0x70,0x1d,0x4a,0xd0,0x1a, - 0x05,0x10,0x01,0x74,0xbd,0x36,0x5d,0xcb,0x26,0xa3,0xe5,0xeb,0x45,0x3c,0x69,0x22, - 0x5f,0x35,0x7f,0x08,0xc3,0x52,0x30,0xd4,0x8b,0xd2,0x40,0x2a,0x84,0x32,0xf2,0x47, - 0xa9,0x25,0x8d,0xd2,0x0a,0x81,0xcc,0x10,0xf2,0xd3,0xa8,0x20,0x4a,0x56,0x86,0x38, - 0x04,0x22,0x34,0x33,0x99,0xbc,0x11,0x90,0x28,0x05,0x40,0x81,0x68,0x71,0xd0,0x95, - 0xcd,0xb7,0x01,0x0c,0xd5,0x72,0x2f,0xd2,0x7c,0x2f,0x23,0xd7,0xa8,0xe9,0xdb,0x2a, - 0x05,0xc0,0xf4,0xf6,0x64,0xb1,0x63,0x99,0x7e,0x44,0xa4,0x4b,0x01,0xc8,0x78,0x32, - 0xdd,0xaf,0xd9,0xc7,0x78,0x38,0x71,0xc8,0x83,0xd4,0xa0,0x29,0x8a,0x50,0x8a,0x21, - 0x95,0x78,0x2a,0x20,0x53,0xf7,0x62,0xc5,0x53,0x2a,0xa0,0xbe,0x85,0xe2,0xce,0x3b, - 0xef,0x3c,0xe7,0x27,0x9c,0xf2,0x2e,0x28,0x9c,0xf3,0xeb,0x13,0x42,0x3a,0xef,0xd3, - 0xbe,0x3a,0x80,0x32,0x00,0x0d,0xf7,0xeb,0xff,0x37,0xdd,0x2c,0x0d,0x2c,0x80,0x94, - 0x00,0x62,0x10,0x4a,0x3d,0x5f,0xd3,0x30,0xc8,0x03,0xc1,0x9d,0xfa,0x15,0xaa,0xf7, - 0xd6,0xfd,0x24,0x58,0x07,0x14,0x84,0xf3,0x65,0x5d,0x28,0xf1,0xa4,0x33,0x18,0xe5, - 0x97,0x92,0x67,0x65,0x71,0x8e,0x51,0x29,0x85,0x78,0x07,0xa4,0x60,0xfd,0x6a,0xfa, - 0x85,0x8d,0x68,0x0b,0xc6,0x4a,0x3f,0xe4,0xe3,0x17,0x99,0x54,0xd8,0x24,0x18,0xab, - 0xf7,0x1b,0x51,0x88,0x0c,0x85,0x10,0x87,0xe9,0x85,0x7c,0x99,0x5b,0x91,0x1a,0x90, - 0xa9,0x50,0xd7,0xe8,0xb7,0xd2,0x20,0x8d,0xde,0x43,0x59,0x12,0x84,0xdf,0x31,0xa9, - 0x27,0x36,0xde,0x81,0xa5,0xb4,0xfa,0xf3,0xd3,0x3a,0xc8,0x72,0x81,0xd5,0xe2,0xff, - 0xfa,0xb1,0x05,0xee,0xd9,0x9d,0x05,0x20,0xb3,0x7a,0xd5,0xdc,0xc2,0x02,0xc8,0xec, - 0x53,0x1a,0xfd,0x87,0x11,0xf8,0x70,0x7d,0xe9,0x12,0x25,0x15,0x42,0x25,0x90,0xc7, - 0xf9,0x8a,0x13,0x4a,0xc8,0x90,0x14,0x2b,0xc4,0x7f,0xcf,0x21,0x38,0x83,0xd0,0x6e, - 0x15,0x48,0xf9,0x45,0xef,0x29,0x8a,0xcd,0x6f,0xf2,0x46,0x2e,0x30,0xdd,0x02,0x90, - 0xa9,0x7e,0x47,0x0d,0x2a,0x52,0x5a,0x5c,0xb9,0x09,0xf0,0xf2,0xf8,0x5d,0x2c,0x0f, - 0xa5,0x57,0x04,0xe2,0xe3,0x51,0x08,0xe2,0xf2,0xf9,0x1c,0x23,0x44,0xc8,0x94,0x08, - 0x01,0xe9,0xae,0xa1,0xfc,0xf9,0x65,0x15,0x48,0x95,0x64,0x2c,0xa4,0xf2,0x02,0x3c, - 0xfa,0xe8,0xa3,0x2a,0x08,0xa4,0xa5,0x5b,0x00,0xbd,0x00,0x99,0xde,0x14,0x78,0x16, - 0xcf,0xc4,0xb7,0xfb,0x0f,0x26,0xe4,0x93,0x35,0xf1,0x03,0xb3,0x9f,0xff,0x69,0x75, - 0x79,0xc2,0x1b,0xaf,0x2f,0xe1,0xaa,0xfd,0x5c,0x05,0x0a,0x42,0x90,0x2e,0x57,0x40, - 0x7a,0xdc,0x0a,0x24,0x28,0x00,0xd2,0x14,0xd4,0xfe,0xa6,0x94,0xf3,0x5c,0x2c,0x10, - 0x69,0x94,0x78,0x90,0x5b,0xc2,0x0b,0x12,0x5a,0xbe,0xc4,0x47,0xce,0xa7,0x25,0x42, - 0xab,0x84,0x3a,0x51,0xec,0x3a,0xf5,0xa4,0x4e,0x98,0x30,0x81,0x78,0x5f,0xcc,0x0a, - 0x46,0x53,0x71,0x03,0x68,0x2d,0xca,0x90,0x91,0x81,0x79,0xc7,0x13,0x90,0xa7,0x90, - 0x19,0xef,0x43,0xc1,0x20,0x7f,0x66,0xcd,0x9a,0x15,0xdc,0x2b,0xf6,0x7e,0xaa,0x4b, - 0xf5,0xcd,0xb4,0x70,0xea,0x1e,0x32,0xf9,0x06,0x21,0xf9,0x4b,0xa3,0xaa,0x32,0x49, - 0x5a,0x3a,0x2b,0xd8,0x20,0x72,0x43,0xa2,0x23,0xbf,0x4d,0x01,0x5a,0x48,0x3c,0xa2, - 0xb8,0x10,0x4b,0x2b,0xa6,0x00,0x34,0x2d,0x68,0x76,0x98,0x94,0x11,0xa6,0x7d,0x47, - 0x50,0x5b,0xd2,0xc3,0xb0,0xec,0x94,0x30,0x7c,0x0c,0x2f,0x48,0x65,0x24,0xb5,0x62, - 0x44,0x73,0x05,0xe9,0xf8,0x82,0x54,0xfe,0x68,0xbb,0xf6,0x15,0x0a,0x74,0x06,0x31, - 0xc8,0x15,0x83,0xee,0x59,0x7d,0x66,0xfc,0x78,0x21,0x0b,0x00,0x41,0x34,0xcf,0x34, - 0x9a,0x46,0x88,0xf0,0x60,0x85,0x8a,0x83,0xbf,0xfe,0x5e,0xe4,0x96,0x2c,0x1f,0x70, - 0xdb,0x4c,0x3a,0xc1,0xcb,0x89,0x0e,0xd9,0x76,0xb2,0x42,0xc4,0x8b,0x8f,0x6f,0xb9, - 0xed,0x91,0xfe,0xdc,0x95,0xea,0x9f,0xaf,0x4a,0xf5,0x79,0x41,0x5a,0x81,0xf3,0x25, - 0x75,0xd7,0xa7,0xfc,0x7f,0xc2,0xe4,0xe7,0x4b,0xf8,0xff,0xd4,0xe0,0x37,0xd4,0xff, - 0x57,0x95,0xaf,0x98,0x05,0xf0,0xab,0x6d,0x24,0x0f,0x7f,0xfe,0xfd,0xcf,0x02,0x37, - 0x77,0xe4,0x14,0x37,0x77,0x70,0x5f,0xe7,0x5f,0xd5,0xf9,0xac,0x71,0x80,0xc0,0xff, - 0x24,0x0c,0xb0,0x62,0xf9,0x6f,0x2c,0xa7,0xc0,0xfd,0xfb,0xb7,0x04,0xe7,0x7f,0xc9, - 0x9c,0x40,0x7e,0x7d,0x9a,0xe2,0x45,0x14,0x80,0x92,0xcf,0x88,0x58,0x0a,0xd0,0xe4, - 0xb5,0x9b,0x4c,0x75,0xbb,0xec,0x75,0xa4,0xdb,0xa8,0x23,0xa1,0x90,0xbf,0xc4,0xad, - 0x5e,0x33,0x0f,0x05,0x23,0xe3,0x73,0x08,0xeb,0x5b,0x97,0x41,0x3b,0x9f,0xee,0xf0, - 0xf8,0x54,0xf7,0xfa,0x52,0xae,0x74,0x42,0xc5,0x4b,0x28,0x00,0x3d,0x4b,0x98,0xa9, - 0xa4,0xce,0x8c,0xff,0xe7,0xcd,0x77,0x7b,0x1d,0x74,0xa1,0x9b,0x39,0x94,0xb6,0x4a, - 0xc6,0xd7,0x9f,0xbe,0xe9,0x26,0x6c,0xbd,0x9a,0xfb,0xa7,0x76,0xa6,0x60,0x29,0x82, - 0xe7,0x2b,0x2c,0xdf,0x59,0x53,0xe4,0x7e,0x9a,0x0d,0x95,0x66,0x01,0xe2,0xc7,0x8a, - 0xba,0x00,0x4a,0x3f,0x95,0xbf,0xa4,0x3f,0xb8,0x6a,0xed,0x96,0x6e,0xbb,0xdd,0xf6, - 0x71,0x13,0xa6,0x4c,0x8c,0xa9,0x3f,0x17,0x10,0x3a,0xb0,0x64,0xd1,0x3c,0xf7,0xc3, - 0x97,0x2f,0xb9,0x99,0x33,0xa6,0xa7,0x29,0x58,0x01,0xf4,0xb8,0x7b,0x19,0xd3,0x4f, - 0xe9,0x97,0xfb,0x4b,0xb7,0x00,0x21,0xf9,0x65,0x15,0x40,0x93,0x20,0x92,0xb0,0x66, - 0x99,0xfb,0xfa,0x93,0x57,0xdd,0xc0,0x0e,0x7b,0x05,0x99,0x53,0xad,0x02,0x2c,0x5e, - 0xf0,0x8f,0xfb,0xf2,0x83,0x17,0xdc,0xa4,0xad,0x56,0x78,0xe5,0xda,0xba,0xbc,0xc9, - 0x2f,0x74,0xbf,0x9c,0xe7,0x51,0xea,0x7f,0xf8,0xe1,0x07,0x92,0x89,0xeb,0x58,0xf2, - 0xb0,0x70,0x24,0xad,0x8c,0x02,0xa0,0xa1,0xb8,0x81,0x14,0x0c,0x0d,0xcc,0x72,0x7f, - 0x7d,0xf3,0xb2,0xfb,0xe3,0xab,0x17,0x6b,0x4b,0x88,0xfa,0x14,0x66,0xae,0x9f,0xe8, - 0x31,0xa1,0xe9,0x01,0x9b,0xc0,0x85,0x28,0x4e,0x98,0x8f,0xf4,0xe7,0x21,0xfe,0x83, - 0x4f,0xea,0x4c,0x1d,0x09,0xcd,0xef,0x00,0xca,0x54,0x00,0x96,0x28,0xc5,0x05,0xf0, - 0x69,0x16,0xa6,0x5a,0xa4,0x44,0x10,0x0c,0xea,0x44,0x50,0x74,0x00,0xa7,0xbc,0xcf, - 0xce,0x9f,0x05,0xc4,0xa4,0x13,0x26,0xb2,0xb2,0xe2,0x57,0x75,0xc8,0x56,0x33,0x8d, - 0x53,0xfa,0xfd,0xeb,0xd3,0x0b,0x35,0x03,0xd9,0x6b,0x1f,0x68,0xae,0x7e,0xea,0xc3, - 0x9a,0xaf,0x64,0x35,0x72,0x7e,0xce,0xff,0x87,0x78,0x5a,0x3d,0x01,0xf9,0xca,0xdb, - 0x84,0x0a,0x20,0xe7,0x05,0xef,0xa1,0x78,0xa9,0x3a,0x00,0x9d,0x40,0x9a,0x30,0x9a, - 0xdc,0xec,0x50,0x66,0x25,0xa7,0xe7,0xfb,0xda,0x84,0x4a,0x53,0xde,0x00,0x4c,0xee, - 0x71,0x08,0xd7,0x9c,0x44,0xde,0x2f,0x3f,0x5f,0x9a,0xa9,0x04,0xf2,0x62,0x68,0x2c, - 0x12,0x4c,0x1f,0xcf,0xce,0x5c,0x83,0x20,0x05,0x49,0xb1,0x42,0x4a,0x8b,0x59,0xce, - 0x66,0x46,0x03,0x35,0x6b,0x07,0x53,0xc6,0x43,0x0d,0xf9,0xf9,0xc9,0xac,0xa8,0x14, - 0xff,0x1f,0x49,0xcf,0xe8,0x07,0xc8,0x34,0xb9,0x45,0x3f,0x90,0x30,0xa4,0x5a,0x83, - 0x8c,0xe1,0xe0,0xd6,0xc0,0xe6,0x03,0x80,0xd6,0x29,0x80,0x21,0x7d,0x3e,0x80,0x59, - 0x80,0xf6,0x2b,0x80,0xc2,0x68,0x85,0xb0,0xfd,0x16,0xc0,0x90,0x3e,0x1f,0xc0,0x14, - 0xa0,0xa5,0xe4,0x27,0xa4,0xb5,0x4d,0x01,0x0c,0xa1,0xe9,0x4f,0xa8,0x03,0xb4,0x60, - 0xb9,0x78,0x43,0xde,0x7c,0x80,0xf6,0x5b,0x00,0x6b,0x05,0x44,0x49,0x6f,0x9f,0x02, - 0x18,0xa2,0xa6,0x3f,0x85,0x70,0x73,0x01,0xed,0xaf,0x00,0x8e,0xe3,0x8e,0x20,0xeb, - 0x0d,0x14,0xac,0x23,0x68,0x1c,0x12,0xaf,0x79,0x03,0x4a,0xb3,0x7e,0x80,0x71,0xaa, - 0x14,0xe5,0x46,0x03,0xf9,0x64,0xbb,0x3f,0x60,0x23,0x80,0xa4,0x87,0xf1,0x7c,0x05, - 0xe8,0x93,0xb5,0xf8,0xad,0x22,0x68,0xcd,0x40,0x1b,0x18,0x1a,0x17,0xeb,0x03,0x18, - 0x6c,0x3e,0x80,0x91,0x2f,0xd8,0x58,0x80,0x55,0x02,0x15,0x0f,0xd6,0x0c,0x54,0xfa, - 0xf8,0x50,0x00,0x53,0x04,0x48,0x8f,0xc5,0xcd,0x05,0xb4,0x14,0xfa,0x96,0x50,0x02, - 0xe9,0x92,0x60,0x6d,0xe5,0xf6,0x29,0x80,0x41,0x24,0x8b,0x68,0x91,0x1d,0x84,0xed, - 0x55,0x00,0x43,0x95,0xf8,0x5a,0x61,0xff,0xe5,0xf6,0x29,0x80,0x21,0x20,0xbe,0xae, - 0xf4,0x8f,0x8c,0x8c,0xb8,0xa3,0x8f,0x3e,0x5a,0x6b,0x14,0x65,0x29,0xc0,0x18,0x5b, - 0xb1,0xcb,0xcc,0xbf,0x56,0x06,0xaf,0xf3,0xfb,0x2c,0xad,0xef,0xb7,0xd5,0xd5,0x2a, - 0xeb,0xfa,0x82,0xbb,0x7b,0x05,0x60,0x4d,0x5a,0xc3,0xd8,0x40,0xb5,0xa4,0x57,0xdd, - 0x81,0xdf,0x61,0xdc,0x5d,0x72,0xc9,0x25,0xac,0xdf,0x80,0x68,0xf3,0xab,0xee,0x14, - 0x80,0x8b,0x90,0xbd,0xf7,0xde,0xdb,0xf5,0x1c,0x06,0x11,0x0e,0xd1,0x0a,0x83,0xb4, - 0x53,0x4f,0x3d,0x15,0xbf,0xcf,0x0a,0xe2,0x6c,0x18,0xc1,0x2a,0xe2,0x5a,0xce,0xa7, - 0x7b,0x05,0xc0,0x7c,0xb0,0x93,0x27,0x61,0xef,0x60,0xd0,0x3e,0x46,0xd5,0x5a,0x3e, - 0x04,0xb3,0xa7,0xd1,0xd5,0x57,0x5f,0xed,0x76,0xdd,0x75,0x57,0xcc,0x3f,0x7b,0x07, - 0x60,0xb5,0x51,0x00,0x2c,0x40,0x77,0x2e,0x40,0xe4,0x63,0x3e,0xb8,0xd1,0x69,0xa7, - 0x9d,0xe6,0x7a,0x02,0x83,0xb6,0x81,0x09,0x9a,0x7f,0xfb,0xed,0xb7,0x1f,0x5b,0xd8, - 0xb9,0x8b,0x2f,0xbe,0xd8,0xed,0xb8,0xe3,0x8e,0x70,0xc4,0x8a,0x2d,0xac,0x24,0x8e, - 0x10,0xc7,0x05,0x68,0x9b,0xbc,0x8e,0x3d,0x81,0x2b,0x58,0xa6,0x27,0xa6,0x00,0x54, - 0x24,0xd0,0xa2,0xdd,0x76,0xdb,0x8d,0xe5,0xcb,0x1a,0xda,0x3d,0xd4,0x20,0x68,0xbb, - 0x5c,0xd5,0xc5,0x0e,0x3b,0xec,0x30,0x42,0xed,0x73,0xc8,0x67,0xf9,0x54,0xd2,0x59, - 0xab,0x81,0xd2,0x0f,0xf1,0x84,0x90,0x0f,0x77,0x1d,0x4b,0x3f,0xdc,0xa3,0x1e,0x7f, - 0xc7,0x2c,0x00,0xa5,0x1f,0xf2,0xb9,0x19,0x0f,0x38,0xf0,0xc0,0x03,0xf1,0x31,0xe6, - 0x0e,0x1a,0x24,0x1f,0xa1,0x84,0x5f,0x76,0xd9,0x65,0xec,0xde,0xc6,0x76,0xfa,0x6c, - 0x61,0x07,0xc9,0x28,0x02,0x3b,0xac,0x91,0xe6,0x86,0x87,0x87,0xdd,0xc0,0xc0,0x00, - 0x8b,0x4c,0xc3,0x55,0x2a,0xf9,0xe0,0x6f,0x36,0x8d,0x7a,0xc6,0x47,0x4e,0x8d,0xf9, - 0x1d,0xb6,0x1c,0x61,0x2f,0x7f,0xf6,0x0e,0xd4,0x26,0xce,0xa4,0x61,0x0d,0xbe,0xfa, - 0xea,0x2b,0xf6,0xf8,0xe7,0xb7,0xcb,0x87,0x41,0x80,0x60,0x0a,0x1e,0x15,0xb9,0x7d, - 0xf6,0xd9,0x47,0x3b,0xa2,0x51,0xda,0x49,0xc7,0xef,0x73,0x4e,0x20,0xa4,0x71,0x8c, - 0x73,0x36,0x70,0x2f,0xc3,0x67,0x71,0x01,0x2f,0xc6,0x14,0x40,0x2e,0x00,0x0b,0x80, - 0x69,0x41,0x21,0x00,0x3b,0x7a,0x70,0x8c,0x34,0x6d,0xe3,0x0e,0x08,0x0d,0xf9,0xeb, - 0x1a,0x11,0x42,0xa0,0x88,0x17,0xe9,0xf0,0x00,0xd9,0x84,0xfc,0xc6,0xf4,0x73,0x4c, - 0xdb,0xe2,0x89,0x78,0x24,0x15,0x70,0xbf,0xc9,0xe8,0xe8,0xe8,0xcf,0x3e,0x72,0x0b, - 0x15,0xc2,0x48,0x33,0x10,0xb2,0x03,0xe1,0x41,0xda,0xae,0x4d,0xdb,0xba,0x21,0x68, - 0x9f,0x49,0xd7,0xa2,0x3c,0x0c,0x08,0x97,0x5f,0xc7,0xdc,0x53,0xbb,0xc7,0xc4,0x63, - 0x19,0x58,0xaa,0x9f,0xe3,0x28,0x41,0xa4,0xc3,0x27,0x15,0x0c,0x16,0x5c,0xbd,0xb1, - 0xbf,0x08,0x05,0x78,0xcc,0x45,0xa0,0xbd,0x71,0x65,0x05,0xf0,0x33,0xf8,0x1b,0x09, - 0xfe,0x67,0x70,0x70,0x10,0xe1,0x58,0x86,0x98,0x28,0x1f,0x11,0xf2,0x95,0xee,0x5c, - 0x09,0x69,0xec,0x54,0x8e,0x02,0xd0,0xce,0x57,0x27,0x4f,0x97,0xc4,0x0b,0x8f,0xc1, - 0xbd,0xe6,0x03,0xdc,0xe5,0xe5,0x1c,0x2f,0x93,0xaa,0x56,0x40,0x4a,0xa0,0x10,0xad, - 0xa3,0xd9,0x41,0xed,0x94,0x95,0x2d,0xb5,0xac,0xa9,0x21,0x1f,0xca,0x6f,0xb9,0x5f, - 0x44,0xd6,0x41,0x64,0xcb,0xbf,0x67,0x62,0x3e,0x9c,0x13,0xd1,0x9d,0x20,0x91,0xc6, - 0xfe,0x13,0xb8,0xff,0x9a,0x31,0xe8,0xea,0x20,0x44,0xc1,0x3a,0x80,0xd5,0x01,0xe4, - 0x6e,0x09,0x11,0xd2,0x91,0x4c,0xc8,0xf4,0x9f,0xe5,0xef,0xf5,0x8c,0x14,0x40,0x80, - 0xc4,0x6b,0x7c,0x70,0x4f,0x8d,0x12,0xe8,0x9c,0x40,0x0c,0x45,0x94,0x21,0x90,0x00, - 0xf9,0xe4,0xdf,0xe0,0xef,0xf9,0x80,0xab,0x03,0x96,0xc0,0xcb,0xbc,0xb5,0x6d,0x83, - 0x61,0x1e,0xdc,0xa6,0x4e,0x39,0x1a,0xf0,0xf2,0x90,0x97,0x55,0x96,0x6f,0x7d,0x0f, - 0x38,0x84,0xcb,0x81,0x6e,0xe6,0x9e,0x0d,0x79,0xb9,0x8d,0xce,0x22,0x2f,0xbf,0x78, - 0x59,0x6e,0xf9,0x39,0xe6,0xb1,0x1c,0xae,0xe0,0x0c,0xee,0xe0,0xd0,0xd5,0xc3,0xad, - 0x03,0x63,0x75,0xc1,0xae,0xdd,0xd9,0xb0,0x20,0x00,0x00,0x00,0x00,0x49,0x45,0x4e, - 0x44,0xae,0x42,0x60,0x82, + 0xcb,0x00,0x00,0x04,0x19,0x69,0x43,0x43,0x50,0x6b,0x43,0x47,0x43,0x6f,0x6c,0x6f, + 0x72,0x53,0x70,0x61,0x63,0x65,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x52,0x47,0x42, + 0x00,0x00,0x38,0x8d,0x8d,0x55,0x5d,0x68,0x1c,0x55,0x14,0x3e,0xbb,0x73,0x67,0x23, + 0x24,0xce,0x53,0x6c,0x34,0x85,0x74,0xa8,0x3f,0x0d,0x25,0x0d,0x93,0x56,0x34,0xa1, + 0xb4,0xba,0x7f,0xdd,0xdd,0x36,0x6e,0x96,0x49,0x36,0xda,0x22,0xe8,0x64,0xf6,0xee, + 0xce,0x98,0xc9,0xce,0x38,0x33,0xbb,0xfd,0xa1,0x4f,0x45,0x50,0x7c,0x31,0xea,0x9b, + 0x14,0xc4,0xbf,0xb7,0x80,0x20,0x28,0xf5,0x0f,0xdb,0x3e,0xb4,0x2f,0x95,0x0a,0x25, + 0xda,0xd4,0x20,0x28,0x3e,0xb4,0xf8,0x83,0x50,0xe8,0x8b,0xa6,0xeb,0x99,0x3b,0x33, + 0x99,0x69,0xba,0xb1,0xde,0x65,0xee,0x7c,0xf3,0x9d,0xef,0x9e,0x7b,0xee,0xb9,0x67, + 0xef,0x05,0xe8,0xb9,0xaa,0x58,0x96,0x91,0x14,0x01,0x16,0x9a,0xae,0x2d,0x17,0x32, + 0xe2,0x73,0x87,0x8f,0x88,0x3d,0x2b,0x90,0x84,0x87,0xa0,0x17,0x06,0xa1,0x57,0x51, + 0x1d,0x2b,0x5d,0xa9,0x4c,0x02,0x36,0x4f,0x0b,0x77,0xb5,0x5b,0xdf,0x43,0xc2,0x7b, + 0x5f,0xd9,0xd5,0xdd,0xfe,0x9f,0xad,0xb7,0x46,0x1d,0x15,0x20,0x71,0x1f,0x62,0xb3, + 0xe6,0xa8,0x0b,0x88,0x8f,0x01,0xf0,0xa7,0x55,0xcb,0x76,0x01,0x7a,0xfa,0x91,0x1f, + 0x3f,0xea,0x5a,0x1e,0xf6,0x62,0xe8,0xb7,0x31,0x40,0xc4,0x2f,0x7a,0xb8,0xe1,0x63, + 0xd7,0xc3,0x73,0x3e,0x7e,0x8d,0x69,0x66,0xe4,0x2c,0xe2,0xd3,0x88,0x05,0x55,0x53, + 0x6a,0x88,0x97,0x10,0x8f,0xcc,0xc5,0xf8,0x46,0x0c,0xfb,0x31,0xb0,0xd6,0x5f,0xa0, + 0x4d,0x6a,0xeb,0xaa,0xe8,0xe5,0xa2,0x62,0x9b,0x75,0xdd,0xa0,0xb1,0x70,0xef,0x61, + 0xfe,0x9f,0x6d,0xc1,0x68,0x85,0xf3,0x6d,0xc3,0xa7,0xcf,0x99,0x9f,0x3e,0x84,0xef, + 0x61,0x5c,0xfb,0x2b,0x35,0x25,0xe7,0xe1,0x51,0xc4,0x4b,0xaa,0x92,0x9f,0x46,0xfc, + 0x08,0xe2,0x6b,0x6d,0x7d,0xb6,0x1c,0xe0,0xdb,0x96,0x9b,0x91,0x11,0x3f,0x06,0x90, + 0xdc,0xde,0x9a,0xaf,0xa6,0x11,0xef,0x44,0x5c,0xac,0xdb,0x07,0xaa,0xbe,0x9f,0xa4, + 0xad,0xb5,0x8a,0x21,0x7e,0xe7,0x84,0x36,0xf3,0x2c,0xe2,0x2d,0x88,0xcf,0x37,0xe7, + 0xca,0x53,0xc1,0xd8,0xab,0xaa,0x93,0xc5,0x9c,0xc1,0x76,0xc4,0xb7,0x35,0x5a,0xf2, + 0xf2,0x3b,0x04,0xc0,0x89,0xba,0x5b,0x9a,0xf1,0xc7,0x72,0xfb,0x6d,0x53,0x9e,0xf2, + 0xe7,0xe5,0xea,0x35,0x9a,0xcb,0x7b,0x79,0x44,0xfc,0xfa,0xbc,0x79,0x48,0xf6,0x7d, + 0x72,0x9f,0x39,0xed,0xe9,0x7c,0xe8,0xf3,0x84,0x96,0x2d,0x07,0xfc,0xa5,0x97,0x94, + 0x83,0x15,0xc4,0x83,0x88,0x7f,0xa1,0x46,0x41,0xf6,0xe7,0xe2,0xfe,0xb1,0xdc,0x4a, + 0x10,0x03,0x19,0x6a,0x1a,0xe5,0x49,0x7f,0x2e,0x92,0xa3,0x0e,0x5b,0x2f,0xe3,0x5d, + 0x6d,0xa6,0xe8,0xcf,0x4b,0x0c,0x17,0x37,0xd4,0x1f,0x4b,0x16,0xeb,0xfa,0x81,0x52, + 0xa0,0xff,0x44,0xb3,0x8b,0x72,0x80,0xaf,0x59,0x06,0xab,0x51,0x8c,0x8d,0x4f,0xda, + 0x2d,0xb9,0xea,0xeb,0xf9,0x51,0xc5,0xce,0x17,0x7c,0x9f,0x7c,0x85,0x36,0xab,0x81, + 0x7f,0xbe,0x0d,0xb3,0x09,0x05,0x28,0x98,0x30,0x87,0xbd,0x0a,0x4d,0x58,0x03,0x11, + 0x64,0x28,0x40,0x06,0xdf,0x16,0xd8,0x68,0xa9,0x83,0x0e,0x06,0x32,0x14,0xad,0x14, + 0x19,0x8a,0x5f,0xa1,0x66,0x17,0x1b,0xe7,0xc0,0x3c,0xf2,0x3a,0xb4,0x99,0xcd,0xc1, + 0xbe,0xc2,0x94,0xfe,0xc8,0xc8,0x5f,0x83,0xf9,0xb8,0xce,0xb4,0x2a,0x64,0x87,0x3e, + 0x82,0x16,0xb2,0x1a,0xfc,0x8e,0xac,0x16,0xd3,0x65,0xf1,0xab,0x85,0x5c,0x63,0x13, + 0x3f,0x7e,0x2c,0x37,0x02,0x3f,0x26,0x19,0x20,0x12,0xd9,0x83,0xcf,0x5e,0x32,0x49, + 0xf6,0x91,0x71,0x32,0x01,0x22,0x79,0x8a,0x3c,0x4d,0xf6,0x93,0x1c,0xb2,0x13,0x64, + 0xef,0xfa,0xd8,0x4a,0x6c,0x45,0x5e,0x3c,0x37,0xd6,0xfd,0xbc,0x8c,0x33,0x52,0xa6, + 0x9b,0x45,0xdd,0x39,0xb4,0xbb,0xa0,0x60,0xff,0x33,0x2a,0x4c,0x5c,0x53,0xd7,0xac, + 0x2c,0x0e,0xb6,0x86,0x23,0xcb,0x29,0xfb,0x05,0x5d,0xbd,0xfc,0xc6,0x5f,0xb1,0x5c, + 0xe9,0x2c,0x37,0x51,0xb6,0xe2,0x19,0x9d,0xba,0x57,0xce,0xf9,0x5f,0xf9,0xeb,0xfc, + 0x32,0xf6,0x2b,0xfc,0x6a,0xa4,0xe0,0x7f,0xe4,0x57,0xf1,0xb7,0x72,0xc7,0x5a,0xcc, + 0xbb,0xb2,0x4c,0xc3,0xec,0x6c,0x58,0x73,0x77,0x55,0x1a,0x6d,0x06,0xe3,0x16,0xf0, + 0xd1,0x99,0xc5,0x89,0xc5,0x1d,0xf3,0x71,0xf1,0xe4,0x57,0x0f,0x46,0x7e,0x96,0xc9, + 0x99,0xe7,0xaf,0xf4,0x5d,0x3c,0x59,0x6f,0x2e,0x0e,0x46,0xac,0x97,0x05,0xfa,0x6a, + 0xf9,0x56,0x19,0x4e,0x8d,0x44,0xac,0xf4,0x83,0xf4,0x87,0xb4,0x2c,0xbd,0x27,0x7d, + 0x28,0xfd,0xc6,0xbd,0xcd,0x7d,0xca,0x7d,0xcd,0x7d,0xce,0x7d,0xc1,0x5d,0x02,0x91, + 0x3b,0xcb,0x9d,0xe3,0xbe,0xe1,0x2e,0x70,0x1f,0x73,0x5f,0xc6,0xf6,0x6a,0xf3,0x1a, + 0x5a,0xdf,0x7b,0x16,0x79,0x18,0xb7,0x67,0xe9,0x96,0x6b,0xac,0x4a,0x21,0x23,0x6c, + 0x15,0x1e,0x16,0x72,0xc2,0x36,0xe1,0x51,0x61,0x32,0xf2,0x27,0x0c,0x08,0x63,0x42, + 0x51,0xd8,0x81,0x96,0xad,0xeb,0xfb,0x16,0x9f,0x2f,0x9e,0x3d,0x1d,0x0e,0x63,0x1f, + 0xe6,0xa7,0xfb,0x5c,0xbe,0x2e,0x56,0x01,0x89,0xfb,0xb1,0x02,0xf4,0x4d,0xfe,0x55, + 0x55,0x54,0xe9,0x70,0x94,0x29,0x1d,0x56,0x6f,0x4d,0x38,0xbe,0x41,0x13,0x8c,0x24, + 0x43,0x64,0x8c,0x94,0x36,0x54,0xf7,0xb8,0x57,0xf3,0xa1,0x22,0x95,0x4f,0xe5,0x52, + 0x69,0x10,0x53,0x3b,0x53,0x13,0xa9,0xb1,0xd4,0x41,0x0f,0x87,0xb3,0xa6,0x76,0xa0, + 0x6d,0x02,0xfb,0xfc,0x1d,0xd5,0xa9,0x6e,0xb2,0x52,0xea,0xd2,0x63,0xde,0x7d,0x02, + 0x59,0xd3,0x3a,0x6e,0xeb,0x0d,0xcd,0x15,0x77,0x4b,0xd2,0x93,0x62,0x1a,0xaf,0x36, + 0x2a,0x96,0x9a,0xea,0xe8,0x88,0xa8,0x18,0x86,0xc8,0x4c,0x8e,0x68,0x53,0x87,0xda, + 0x6d,0x5a,0x1b,0x05,0xef,0xde,0xf4,0x8f,0xf4,0x9b,0x32,0xbb,0x0f,0x13,0x5b,0x2e, + 0x47,0x9c,0xfb,0x0c,0xc0,0xbe,0x3f,0xf1,0xec,0xfb,0x2e,0xe2,0x8e,0xb4,0x00,0x96, + 0x1c,0x80,0x81,0xc7,0x23,0x6e,0x18,0xcf,0xca,0x07,0xde,0x05,0x38,0xf3,0x84,0xda, + 0xb2,0xdb,0xc1,0x1d,0x91,0x48,0x7c,0x0b,0xe0,0xd4,0xf7,0xec,0xf6,0xbf,0xfa,0x32, + 0x78,0x7e,0xfd,0xd4,0xe9,0xdc,0xc4,0x73,0xac,0xe7,0x2d,0x80,0xb5,0x37,0x3b,0x9d, + 0xbf,0xdf,0xef,0x74,0xd6,0x3e,0x40,0xff,0xab,0x00,0x67,0x8d,0x7f,0x01,0xa0,0x9f, + 0x7c,0x55,0x03,0x5c,0x0b,0xef,0x00,0x00,0x00,0x38,0x65,0x58,0x49,0x66,0x4d,0x4d, + 0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x01,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01, + 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x02,0x00,0x04,0x00,0x00, + 0x00,0x01,0x00,0x00,0x00,0x80,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00, + 0x00,0x80,0x00,0x00,0x00,0x00,0x6b,0x46,0x26,0x4d,0x00,0x00,0x03,0x62,0x69,0x54, + 0x58,0x74,0x58,0x4d,0x4c,0x3a,0x63,0x6f,0x6d,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e, + 0x78,0x6d,0x70,0x00,0x00,0x00,0x00,0x00,0x3c,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65, + 0x74,0x61,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x78,0x3d,0x22,0x61,0x64,0x6f,0x62, + 0x65,0x3a,0x6e,0x73,0x3a,0x6d,0x65,0x74,0x61,0x2f,0x22,0x20,0x78,0x3a,0x78,0x6d, + 0x70,0x74,0x6b,0x3d,0x22,0x58,0x4d,0x50,0x20,0x43,0x6f,0x72,0x65,0x20,0x35,0x2e, + 0x34,0x2e,0x30,0x22,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x52,0x44, + 0x46,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x72,0x64,0x66,0x3d,0x22,0x68,0x74,0x74, + 0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31, + 0x39,0x39,0x39,0x2f,0x30,0x32,0x2f,0x32,0x32,0x2d,0x72,0x64,0x66,0x2d,0x73,0x79, + 0x6e,0x74,0x61,0x78,0x2d,0x6e,0x73,0x23,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x3c,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f, + 0x6e,0x20,0x72,0x64,0x66,0x3a,0x61,0x62,0x6f,0x75,0x74,0x3d,0x22,0x22,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73, + 0x3a,0x64,0x63,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,0x75,0x72,0x6c, + 0x2e,0x6f,0x72,0x67,0x2f,0x64,0x63,0x2f,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73, + 0x2f,0x31,0x2e,0x31,0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x49,0x70,0x74,0x63,0x34,0x78,0x6d, + 0x70,0x45,0x78,0x74,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x69,0x70,0x74, + 0x63,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x74,0x64,0x2f,0x49,0x70,0x74,0x63,0x34,0x78, + 0x6d,0x70,0x45,0x78,0x74,0x2f,0x32,0x30,0x30,0x38,0x2d,0x30,0x32,0x2d,0x32,0x39, + 0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78, + 0x6d,0x6c,0x6e,0x73,0x3a,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3d,0x22, + 0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6e,0x73,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e, + 0x63,0x6f,0x6d,0x2f,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x2f,0x31,0x2e, + 0x30,0x2f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64, + 0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x53,0x65,0x71,0x3e, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x4d,0x69,0x63,0x68,0x61,0x65,0x6c,0x20, + 0x53,0x77,0x65,0x65,0x74,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66, + 0x3a,0x53,0x65,0x71,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, + 0x2f,0x64,0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,0x74,0x73, + 0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72, + 0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x20,0x78, + 0x6d,0x6c,0x3a,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x78,0x2d,0x64,0x65,0x66,0x61,0x75, + 0x6c,0x74,0x22,0x3e,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30, + 0x31,0x30,0x20,0x41,0x70,0x70,0x6c,0x65,0x20,0x49,0x6e,0x63,0x2e,0x3c,0x2f,0x72, + 0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x63,0x3a,0x72,0x69,0x67,0x68, + 0x74,0x73,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x70, + 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69, + 0x6e,0x65,0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x49,0x70, + 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69, + 0x6e,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x68, + 0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65, + 0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x70,0x68,0x6f,0x74, + 0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,0x3e,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63, + 0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64, + 0x66,0x3a,0x52,0x44,0x46,0x3e,0x0a,0x3c,0x2f,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65, + 0x74,0x61,0x3e,0x0a,0xa0,0x50,0x98,0x64,0x00,0x00,0x13,0xdb,0x49,0x44,0x41,0x54, + 0x78,0xda,0xed,0x9d,0x07,0x90,0x55,0x35,0x17,0xc7,0xd7,0x5e,0xc7,0xde,0xd7,0x55, + 0xec,0xbd,0x0b,0x0a,0x28,0x88,0x88,0xae,0x05,0x7b,0xd7,0xc1,0xbe,0x2a,0x28,0x22, + 0xba,0xe8,0x88,0x8d,0xcf,0x82,0x34,0xa5,0x0a,0xa2,0x28,0xae,0xa8,0x58,0x41,0x71, + 0x64,0x11,0x07,0xc5,0x2e,0xa2,0xa0,0xa8,0xe8,0x88,0xd8,0x16,0x15,0xb0,0x20,0x56, + 0x14,0xcd,0xb7,0xbf,0xb8,0xe7,0x9a,0xcd,0xe6,0xbe,0x77,0xef,0x6b,0xbb,0xdc,0x97, + 0xcc,0xfc,0x27,0xf7,0xdd,0x92,0x77,0x6f,0xce,0x3f,0x27,0x27,0xc9,0x49,0x52,0x52, + 0x92,0x22,0x28,0xa5,0xca,0x6a,0x51,0x59,0x8b,0xea,0x5a,0xd4,0xd4,0x62,0x89,0xf2, + 0xa1,0xa9,0x87,0x25,0x75,0xb2,0xaa,0xae,0x93,0x5d,0x59,0x49,0xdc,0x50,0xfb,0x50, + 0x69,0x2d,0xaa,0x6a,0xb1,0xd4,0xe7,0xe7,0x32,0x1f,0x96,0xd6,0xc9,0xb2,0x34,0xaa, + 0xf0,0xcb,0x6b,0xb1,0xc8,0xe7,0x5b,0xe2,0x02,0x32,0x2d,0x4f,0x27,0xfc,0x0a,0x5f, + 0xea,0x13,0xaf,0x0d,0x2a,0x52,0x95,0x7c,0x2f,0xfc,0xe2,0x20,0x41,0xb9,0xab,0xce, + 0xf7,0x6a,0xbf,0xb8,0xaa,0x83,0x52,0x93,0x00,0x55,0xf6,0x1d,0x7b,0xee,0xb9,0xa7, + 0xda,0x7c,0xf3,0xcd,0xd5,0x4d,0x37,0xdd,0xe4,0xb3,0x2b,0x99,0xa1,0xca,0x6c,0xea, + 0x35,0x50,0xfd,0x1b,0x6c,0xb0,0x81,0xe2,0xf2,0xe5,0x97,0x5f,0xee,0xb3,0x2a,0xb9, + 0x55,0x41,0x59,0x49,0x5d,0x5b,0xb1,0x41,0xe8,0xd1,0xa3,0x87,0xba,0xe8,0xa2,0x8b, + 0xd4,0x13,0x4f,0x3c,0xe1,0xb3,0x2a,0xb9,0xa1,0xb2,0xa4,0xae,0xc3,0xc0,0x87,0xe2, + 0x0c,0xd5,0x10,0xa0,0xc6,0x75,0x65,0xe8,0xd0,0xa1,0xaa,0x4f,0x9f,0x3e,0xea,0xc5, + 0x17,0x5f,0xac,0x77,0x7e,0xe6,0xcc,0x99,0xfa,0x7c,0xdf,0xbe,0x7d,0xd5,0x9f,0x7f, + 0xfe,0xa9,0xe6,0xcf,0x9f,0xaf,0xaa,0xaa,0xaa,0x54,0xa7,0x4e,0x9d,0xd4,0x29,0xa7, + 0x9c,0xa2,0xfa,0xf5,0xeb,0xa7,0xe6,0xcd,0x9b,0xa7,0xd2,0xa5,0xf9,0xcf,0x3f,0xff, + 0xa8,0x57,0x5f,0x7d,0x55,0xdd,0x78,0xe3,0x8d,0xea,0xa8,0xa3,0x8e,0xd2,0x55,0xcd, + 0xd3,0x4f,0x3f,0x9d,0xf2,0x6d,0xbf,0xfc,0xf2,0x4b,0x75,0xfb,0xed,0xb7,0xab,0xd3, + 0x4e,0x3b,0x4d,0x1d,0x77,0xdc,0x71,0xda,0x3e,0xf9,0xe4,0x93,0x4f,0xea,0xdd,0x33, + 0x78,0xf0,0x60,0xfd,0x1f,0xcf,0x3d,0xf7,0x5c,0x68,0x3a,0xcf,0x3f,0xff,0xbc,0xbe, + 0x67,0xf4,0xe8,0xd1,0x0d,0xae,0x8d,0x1f,0x3f,0x5e,0x5d,0x79,0xe5,0x95,0xaa,0xbc, + 0xbc,0x5c,0x5d,0x7c,0xf1,0xc5,0xea,0xc1,0x07,0x1f,0xd4,0xef,0x9a,0xd0,0x50,0x03, + 0x01,0x9c,0xdd,0xbb,0x61,0x36,0x00,0x42,0xe4,0x3c,0x80,0x0c,0x9b,0x6c,0xb2,0x49, + 0xf0,0x5b,0xc0,0xb9,0xd7,0x5e,0x7b,0x2d,0x65,0x9a,0x57,0x5d,0x75,0x55,0x83,0xe7, + 0xc0,0xf9,0xe7,0x9f,0xaf,0x89,0xd5,0x80,0xaa,0xd5,0xd5,0x6a,0xbd,0xf5,0xd6,0x6b, + 0x70,0xff,0xda,0x6b,0xaf,0xad,0xaf,0x49,0x40,0x70,0x9c,0xdf,0x76,0xdb,0x6d,0x43, + 0xbf,0x7a,0xfb,0xed,0xb7,0xd7,0xf7,0x74,0xee,0xdc,0x39,0x38,0xf7,0xf3,0xcf,0x3f, + 0x6b,0x02,0xbb,0xde,0x09,0xb2,0xfd,0xf6,0xdb,0x6f,0x49,0x24,0xc0,0x92,0x92,0xb0, + 0x2b,0x51,0x08,0xb0,0xe9,0xa6,0x9b,0xaa,0xe5,0x97,0x5f,0x5e,0xb5,0x68,0xd1,0x42, + 0x67,0x66,0xbb,0x76,0xed,0x82,0x6b,0x65,0x65,0x65,0x6a,0xc9,0x92,0x25,0xce,0x34, + 0xd7,0x59,0x67,0x1d,0x1d,0xf3,0x9b,0x4c,0x3f,0xef,0xbc,0xf3,0x82,0x6b,0xe0,0xce, + 0x3b,0xef,0xac,0xf7,0xdc,0x87,0x1f,0x7e,0xa8,0x56,0x58,0x61,0x05,0x7d,0xed,0xd0, + 0x43,0x0f,0x55,0x13,0x26,0x4c,0x50,0x4f,0x3e,0xf9,0xa4,0xda,0x7d,0xf7,0xdd,0xf5, + 0xb9,0x0d,0x37,0xdc,0x30,0x10,0xd0,0xc3,0x0f,0x3f,0x1c,0xa4,0x83,0x86,0xb1,0xc3, + 0x4b,0x2f,0xbd,0x14,0x5c,0x9f,0x31,0x63,0x46,0x70,0xfe,0xf4,0xd3,0x4f,0xd7,0xe7, + 0xd6,0x5c,0x73,0x4d,0xad,0x65,0xd0,0x12,0xd7,0x5e,0x7b,0x6d,0xf0,0xbf,0x68,0xb6, + 0x24,0x86,0xac,0x08,0x40,0xe9,0x9b,0x34,0x69,0x52,0xbd,0xeb,0x10,0x41,0xae,0xdf, + 0x75,0xd7,0x5d,0xce,0x34,0xc1,0x09,0x27,0x9c,0xa0,0x7e,0xfd,0xf5,0xd7,0xe0,0x1a, + 0xaa,0x7c,0xad,0xb5,0xd6,0x0a,0xc8,0xf3,0xd7,0x5f,0x7f,0x05,0xd7,0x8e,0x3c,0xf2, + 0x48,0x7d,0x7e,0xe7,0x9d,0x77,0x56,0x4b,0x97,0xfe,0xd7,0x60,0xf9,0xfa,0xeb,0xaf, + 0xd5,0xca,0x2b,0xaf,0xac,0xaf,0x0d,0x1b,0x36,0x4c,0x9f,0xfb,0xfd,0xf7,0xdf,0xf5, + 0x7b,0x71,0xee,0xc2,0x0b,0x2f,0x6c,0xf0,0x5d,0x67,0x9d,0x75,0x96,0xbe,0xd6,0xbc, + 0x79,0xf3,0xe0,0xdc,0xb4,0x69,0xd3,0xd4,0x72,0xcb,0x2d,0xa7,0xcf,0x43,0x20,0x33, + 0x5c,0x72,0xc9,0x25,0x01,0xd9,0xcd,0x77,0xf2,0x04,0xa8,0xc5,0x3b,0xef,0xbc,0xd3, + 0xe0,0x39,0xea,0x7f,0x29,0x35,0x67,0x9e,0x79,0xa6,0x33,0xcd,0x63,0x8f,0x3d,0xd6, + 0x59,0xaf,0xd2,0xea,0x90,0xb4,0xe7,0xcc,0x99,0xa3,0xcf,0x2d,0x5c,0xb8,0x30,0x38, + 0xd7,0xbf,0x7f,0xff,0x06,0xcf,0xb4,0x6e,0xdd,0x5a,0x5f,0xc3,0x06,0x91,0x50,0x51, + 0x51,0x11,0x68,0x9a,0x3f,0xfe,0xf8,0x23,0x38,0xff,0xd3,0x4f,0x3f,0xa9,0xd5,0x57, + 0x5f,0x5d,0x5f,0x1b,0x39,0x72,0x64,0x03,0x21,0x43,0x40,0xfb,0xbd,0x26,0x4f,0x9e, + 0x1c,0xfc,0xff,0xdc,0xb9,0x73,0x3d,0x01,0x4c,0x02,0x90,0xa1,0xae,0xb0,0xc5,0x16, + 0x5b,0xe8,0xeb,0x08,0x27,0x4e,0xdf,0xc2,0xbd,0xf7,0xde,0x1b,0xa4,0x4d,0xc6,0x13, + 0x50,0xe3,0x72,0x6e,0x8f,0x3d,0xf6,0x50,0xc7,0x1f,0x7f,0x7c,0x3d,0xac,0xbf,0xfe, + 0xfa,0xfa,0xda,0x41,0x07,0x1d,0x14,0xa4,0x63,0x3e,0xf3,0xe8,0xa3,0x8f,0x06,0xe7, + 0x47,0x8c,0x18,0x11,0xa8,0x79,0xea,0x7c,0x09,0x1d,0x3a,0x74,0xd0,0xe7,0x57,0x5a, + 0x69,0xa5,0x06,0xe9,0x1f,0x70,0xc0,0x01,0x41,0x5a,0xa6,0x41,0x3c,0x76,0xec,0x58, + 0xfd,0x9f,0xe9,0x70,0xd9,0x65,0x97,0x15,0x1f,0x01,0xf6,0xde,0x7b,0x6f,0x7d,0x7d, + 0x87,0x1d,0x76,0x88,0x45,0x00,0x5a,0x01,0x92,0xb6,0xa8,0xe2,0x07,0x1e,0x78,0xc0, + 0x69,0x98,0xd9,0xa0,0x7a,0x30,0xc3,0x76,0xdb,0x6d,0xa7,0xcf,0x53,0x7d,0x48,0xd8, + 0x77,0xdf,0x7d,0x03,0x43,0xd3,0x0c,0xdb,0x6c,0xb3,0x4d,0xa4,0xff,0x30,0xc9,0xd4, + 0xbb,0x77,0xef,0x48,0xcf,0xd8,0x85,0xa0,0x28,0x08,0x80,0x05,0xce,0xf5,0xf6,0xed, + 0xdb,0xc7,0x22,0xc0,0x98,0x31,0x63,0x82,0xb4,0x5f,0x7e,0xf9,0xe5,0xc0,0xfa,0x97, + 0x73,0xbd,0x7a,0xf5,0x52,0x2f,0xbc,0xf0,0x82,0x13,0xd4,0xe3,0x66,0xa0,0x89,0xc8, + 0x33,0x2b,0xae,0xb8,0xa2,0xfa,0xf6,0xdb,0x6f,0x75,0x8b,0x45,0xd2,0x79,0xf3,0xcd, + 0x37,0xeb,0xdd,0xbb,0xff,0xfe,0xfb,0xeb,0xf3,0x5b,0x6d,0xb5,0x55,0x68,0xfa,0x60, + 0xc1,0x82,0x05,0xc1,0x33,0xdf,0x7d,0xf7,0x9d,0x7a,0xf7,0xdd,0x77,0xd3,0xa2,0xa9, + 0x57,0x1b,0x39,0x27,0x00,0x86,0xd2,0x1a,0x6b,0xac,0xe1,0x2c,0x69,0xe9,0x08,0x70, + 0xeb,0xad,0xb7,0x06,0x69,0xd7,0xd4,0xd4,0x04,0x6d,0x7f,0x39,0x47,0x9f,0x41,0xd4, + 0xf0,0xf9,0xe7,0x9f,0x07,0x86,0x1d,0x56,0xfd,0xa5,0x97,0x5e,0xaa,0x8f,0x69,0x39, + 0xd8,0xe1,0xdc,0x73,0xcf,0xd5,0xd7,0x56,0x5d,0x75,0xd5,0x7a,0x36,0x43,0x31,0x84, + 0xac,0x08,0x80,0x81,0xe6,0xea,0x48,0x91,0xeb,0xf7,0xdd,0x77,0x9f,0x33,0xcd,0x2e, + 0x5d,0xba,0x38,0xff,0x93,0x01,0x28,0x29,0x89,0xa6,0x31,0xd6,0xac,0x59,0x33,0x7d, + 0x7e,0xe3,0x8d,0x37,0x56,0x3f,0xfe,0xf8,0x63,0xe4,0x8f,0x3b,0xf8,0xe0,0x83,0xf5, + 0x73,0x3b,0xee,0xb8,0xa3,0x5a,0x77,0xdd,0x75,0xf5,0xf1,0x90,0x21,0x43,0x1a,0xdc, + 0xc7,0x7b,0xca,0x3b,0x43,0x42,0x4f,0x80,0x88,0x04,0xd8,0x69,0xa7,0x9d,0xd4,0x5b, + 0x6f,0xbd,0x55,0xaf,0xa7,0x8e,0x7a,0x9f,0x6b,0x08,0xcd,0x6e,0x36,0x49,0x9a,0xb4, + 0x12,0xae,0xbe,0xfa,0xea,0x7a,0xfd,0x04,0xf4,0xcc,0x49,0xba,0x77,0xdf,0x7d,0x77, + 0xbd,0xe7,0x68,0xf7,0xcb,0x35,0x0c,0x2b,0x4a,0xb7,0x04,0x9a,0x85,0xb4,0xe7,0xed, + 0xe6,0x28,0xe1,0xfe,0xfb,0xef,0xaf,0x57,0x1f,0xaf,0xb6,0xda,0x6a,0x4e,0x02,0xfd, + 0xfd,0xf7,0xdf,0xba,0x59,0x28,0x5a,0x80,0xe6,0xab,0x49,0x40,0x54,0x3f,0xef,0x40, + 0xb3,0xd3,0x13,0xc0,0x20,0x80,0x00,0xa1,0x1f,0x78,0xe0,0x81,0x81,0xea,0x5f,0x65, + 0x95,0x55,0x9c,0xdd,0xba,0x66,0x3f,0x80,0x58,0xe3,0x6d,0xdb,0xb6,0x0d,0x6c,0x06, + 0xd0,0xa6,0x4d,0x1b,0x67,0x4f,0xa0,0xa8,0x70,0x40,0xdb,0x9f,0x16,0x01,0x1d,0x50, + 0xf2,0x9f,0x1c,0xdb,0xe1,0x97,0x5f,0x7e,0xd1,0xff,0x21,0xcf,0x99,0x4d,0x45,0x3b, + 0xbc,0xf7,0xde,0x7b,0xaa,0xb4,0xb4,0xb4,0x5e,0x27,0x17,0x06,0x9c,0x69,0x20,0x3e, + 0xfb,0xec,0xb3,0xc5,0x43,0x80,0x8d,0x36,0xda,0x48,0x7f,0xf4,0x15,0x57,0x5c,0x11, + 0x4a,0x80,0x29,0x53,0xa6,0x68,0x2d,0x60,0x0a,0x95,0x0c,0x7b,0xe5,0x95,0x57,0x52, + 0x92,0x8a,0x76,0x37,0xfd,0xed,0x94,0x36,0x79,0x8e,0xe3,0x0b,0x2e,0xb8,0xa0,0x41, + 0xef,0xa1,0x19,0x9e,0x7a,0xea,0xa9,0x7a,0x64,0x11,0x23,0x8f,0x16,0x00,0x5d,0xcb, + 0xae,0x20,0x1d,0x3f,0xa6,0x61,0x19,0x16,0x7e,0xf8,0xe1,0x07,0xdd,0x77,0x21,0x7d, + 0x05,0x02,0x9a,0x9a,0x68,0x1e,0x8c,0xba,0xa2,0x21,0x40,0x58,0x70,0x19,0x81,0x58, + 0xd9,0x08,0xfd,0x9b,0x6f,0xbe,0x49,0xf9,0xac,0xad,0x55,0x28,0xe9,0xa8,0x6f,0xe0, + 0x2a,0xf5,0x61,0x61,0xd1,0xa2,0x45,0xea,0x8d,0x37,0xde,0xd0,0xcf,0xe5,0xc3,0x68, + 0xa3,0x4a,0xf8,0xf8,0xe3,0x8f,0x35,0x61,0x92,0xa8,0xf6,0x73,0x4e,0x80,0xa8,0xc1, + 0x3b,0x99,0x78,0x02,0x78,0x02,0x78,0x02,0x78,0x02,0x2c,0xd3,0x04,0x98,0x35,0x6b, + 0x96,0x1a,0x38,0x70,0xa0,0x1a,0x34,0x68,0x50,0xec,0xd1,0x31,0x9a,0x77,0x3c,0x9b, + 0xce,0x18,0xf3,0xa1,0x09,0x13,0xc0,0x07,0x4f,0x00,0x1f,0x3c,0x01,0x7c,0xf0,0x04, + 0xf0,0xc1,0x13,0xc0,0x07,0x4f,0x00,0x1f,0x3c,0x01,0x8a,0x23,0x24,0x75,0xae,0xa4, + 0x27,0x40,0xc4,0x90,0xcf,0x4e,0x2c,0xc6,0x1e,0x3c,0x01,0x9a,0x78,0xc8,0xc7,0x5c, + 0x49,0x26,0x9c,0xe0,0xb9,0x6c,0x7b,0x4f,0x7b,0x02,0x14,0x49,0xd8,0x65,0x97,0x5d, + 0xb4,0x56,0x61,0x52,0x8a,0x27,0x40,0x96,0x21,0xd3,0x79,0x87,0xf6,0x5c,0xc7,0xaf, + 0xbe,0xfa,0x4a,0xcf,0x4c,0xc2,0x25,0x7c,0xf8,0xf0,0xe1,0xce,0xf4,0x53,0x3d,0xcf, + 0x0c,0x25,0xbc,0x87,0x70,0x60,0x39,0xfa,0xe8,0xa3,0x55,0xcf,0x9e,0x3d,0xb5,0x03, + 0xa9,0x19,0x66,0xcf,0x9e,0xad,0x9f,0x91,0x6a,0x05,0x3f,0x45,0x7e,0x03,0xba,0xd8, + 0xed,0x10,0x65,0x4e,0x64,0xdc,0xef,0x49,0x1c,0x01,0x32,0x9d,0x77,0x68,0x0e,0x6e, + 0xe1,0x63,0x20,0xd3,0xd6,0xec,0xb9,0x83,0x51,0x3c,0xa4,0x3e,0xfb,0xec,0xb3,0xc0, + 0xf5,0xdc,0x04,0xde,0x45,0xa6,0xff,0xa4,0xe9,0xfd,0x6c,0x03,0x0f,0x26,0x33,0x44, + 0x9d,0x13,0x19,0xf7,0x7b,0x12,0x4b,0x80,0xb8,0xf3,0x0e,0xcd,0x0c,0x63,0x8e,0xa1, + 0x4c,0x40,0x21,0xb3,0x10,0x54,0x1c,0x02,0x88,0xb7,0x12,0x02,0x87,0x6c,0xbb,0xee, + 0xba,0x6b,0x70,0x0d,0x0f,0x28,0x53,0x03,0xdc,0x76,0xdb,0x6d,0x41,0x9a,0xbb,0xed, + 0xb6,0x9b,0xfe,0x0d,0x18,0x2c,0x93,0x10,0x67,0x4e,0x64,0xdc,0xef,0x49,0x2c,0x01, + 0xe2,0xce,0x3b,0x34,0x33,0x8c,0x89,0xae,0xe3,0xc6,0x8d,0x8b,0xd5,0x0a,0xb0,0x7d, + 0x24,0xbb,0x77,0xef,0x1e,0x58,0xf5,0xc4,0xe2,0x93,0xc8,0xc4,0xd9,0xb8,0x36,0x40, + 0x9c,0x39,0x91,0x71,0xbf,0x27,0xb1,0x04,0x88,0x33,0xef,0xd0,0xce,0xb0,0x01,0x03, + 0x06,0xc4,0x6e,0x06,0x9a,0xcf,0x33,0xbf,0xc0,0x0e,0x38,0xb9,0x86,0xcd,0x47,0x48, + 0x45,0x80,0x4c,0xe6,0x44,0xc6,0xf9,0x9e,0x44,0xdb,0x00,0xae,0xe0,0x9a,0x77,0x68, + 0x67,0x58,0x2a,0x07,0x97,0x28,0x04,0x70,0xb9,0x9c,0x9f,0x7c,0xf2,0xc9,0x19,0x11, + 0x20,0x93,0x39,0x91,0x71,0xbe,0xa7,0xe8,0x08,0xe0,0x9a,0x77,0x98,0x6b,0x02,0xb8, + 0x9e,0xcf,0x94,0x00,0x99,0xce,0x89,0xf4,0x04,0x88,0x31,0xef,0xb0,0x29,0x13,0x20, + 0xd3,0x39,0x91,0x9e,0x00,0x31,0xe6,0x1d,0x36,0x15,0x02,0xd0,0xbe,0x77,0xb5,0xfd, + 0x33,0x99,0x13,0x59,0xf4,0x04,0x88,0x3b,0xef,0xb0,0x31,0x09,0x20,0xcd,0x39,0xd7, + 0xac,0x26,0x42,0x26,0x73,0x22,0x8b,0x9e,0x00,0x71,0xe7,0x1d,0x36,0x26,0x01,0x30, + 0xe6,0xe4,0x9d,0x59,0x6d,0xcd,0x0e,0x99,0xcc,0x89,0x6c,0x92,0x04,0xa0,0x3d,0xcc, + 0x8a,0x1a,0x0c,0x7a,0x1c,0x7e,0xf8,0xe1,0x01,0x0e,0x3b,0xec,0x30,0xbd,0x3a,0x07, + 0xb3,0x78,0x01,0xeb,0x09,0x00,0xce,0xd1,0x85,0x7b,0xe2,0x89,0x27,0xea,0x66,0x4e, + 0xd7,0xae,0x5d,0xd5,0x0d,0x37,0xdc,0xa0,0x67,0xf6,0xd2,0x11,0x32,0x7d,0xfa,0x74, + 0x3d,0x8d,0x2b,0xac,0x1f,0x20,0xce,0xbc,0xc3,0xc6,0x24,0x80,0x39,0x2b,0x99,0x4e, + 0x1b,0xbe,0x99,0x2e,0x64,0x33,0xc4,0x9d,0x13,0xd9,0x64,0x08,0x80,0x9a,0x9d,0x3a, + 0x75,0xaa,0xee,0x94,0x81,0xbd,0x22,0x74,0x96,0x71,0x93,0xd8,0x05,0xf3,0x9e,0xb0, + 0xfb,0x5b,0xb5,0x6a,0xa5,0x3b,0x56,0x20,0x96,0xa8,0xf3,0x4c,0xe7,0x1d,0xd2,0x33, + 0x28,0xf7,0x2d,0x5e,0xbc,0x38,0xf4,0x7b,0xc2,0xe6,0x4a,0xa6,0x7b,0x9e,0xfa,0x9d, + 0x6b,0x54,0x41,0xae,0x70,0xdd,0x75,0xd7,0xd5,0x9b,0x94,0xba,0xdf,0x7e,0xfb,0x35, + 0xb8,0x27,0xce,0x9c,0xc8,0xa8,0xdf,0x93,0x37,0x02,0x20,0x10,0xea,0x2b,0x98,0x4f, + 0x69,0xa6,0x37,0xcb,0x04,0x2c,0x97,0xd8,0x3c,0x0e,0xbb,0x6e,0x82,0xf5,0x7a,0x10, + 0x3e,0xa4,0x02,0xac,0x08,0x86,0x2a,0xe4,0x3f,0x73,0x35,0xef,0xb0,0x31,0x02,0xef, + 0xcf,0xec,0x64,0x96,0xb0,0xb3,0x35,0x9b,0x19,0xf2,0x31,0x27,0x32,0xa7,0x04,0x40, + 0xe5,0xd0,0x7e,0x3d,0xe6,0x98,0x63,0xf4,0x48,0x58,0xae,0x80,0xe0,0x99,0xbf,0x4f, + 0x2f,0x9f,0xd9,0x19,0xc2,0x28,0x1b,0x19,0x81,0x26,0xf0,0xb3,0x8e,0x1a,0x91,0x00, + 0x2c,0xa0,0x30,0x6a,0xd4,0xa8,0x60,0xb8,0x32,0x57,0x60,0xcd,0x81,0xbd,0xf6,0xda, + 0x4b,0x75,0xec,0xd8,0xb1,0x41,0x4f,0x18,0xc0,0x28,0x62,0xb5,0x2f,0xb4,0x80,0x27, + 0x40,0x81,0x09,0x40,0xa6,0xd3,0xa1,0x42,0x1d,0x84,0xba,0x17,0xb5,0x8c,0xe1,0x26, + 0xb1,0x0b,0xe6,0x3d,0xae,0xfb,0xc5,0x66,0xa0,0x8d,0x4c,0x7d,0x4f,0xa9,0x37,0x49, + 0x41,0x55,0x00,0x31,0x38,0x66,0x54,0x8d,0xea,0x86,0xc1,0x1d,0x4f,0x80,0x02,0x10, + 0x80,0xba,0xea,0xed,0xb7,0xdf,0x56,0xdd,0xba,0x75,0xd3,0x82,0x61,0xb8,0xd5,0x06, + 0x64,0x90,0xd8,0x05,0xf3,0x1e,0xfb,0x7e,0x84,0xcb,0x3a,0xbe,0xb4,0x08,0x10,0xb0, + 0x08,0x9f,0x98,0xaa,0x00,0x62,0xb0,0x04,0x1d,0x96,0x30,0xe7,0xa8,0x37,0xbf,0xff, + 0xfe,0x7b,0x4d,0x00,0x3f,0xef,0x30,0xcf,0x04,0xc0,0xe0,0xc2,0xbb,0x05,0x6b,0x36, + 0x9f,0x40,0xb0,0x26,0xb0,0x27,0x30,0x26,0x71,0xb4,0x40,0xf0,0x8c,0xb1,0xb3,0x2a, + 0x09,0xe7,0x59,0xb1,0x03,0x3b,0x20,0x89,0x4b,0xb8,0x36,0x19,0x02,0x50,0xea,0x11, + 0x3e,0xcd,0xa8,0x7c,0x0b,0x1f,0x20,0x58,0x01,0x4e,0x10,0x18,0x7f,0x22,0x78,0x56, + 0xfb,0x42,0x43,0x6c,0xbd,0xf5,0xd6,0x8d,0x4e,0x00,0xaa,0x40,0x56,0x44,0xf9,0xe8, + 0xa3,0x8f,0x92,0x4b,0x00,0x84,0x4f,0xe6,0xe2,0xa9,0x52,0x08,0xe1,0x03,0x54,0x3d, + 0x75,0x7f,0xcb,0x96,0x2d,0x03,0x75,0x2f,0x82,0x67,0xfd,0xa1,0x2d,0xb7,0xdc,0x52, + 0xfb,0xe7,0xe7,0x8b,0x00,0xd8,0x14,0xd8,0x16,0x0c,0xb4,0x30,0x6a,0x88,0x2f,0x1e, + 0xfd,0x0a,0x27,0x9d,0x74,0x92,0x7e,0x27,0xc8,0x87,0xd7,0x11,0x1d,0x4d,0x54,0x85, + 0x38,0x67,0x2c,0xcb,0xfb,0x09,0x94,0xa4,0x63,0x39,0x6e,0x49,0x58,0xe2,0x85,0x22, + 0x00,0x16,0x3f,0x82,0xe7,0x58,0xd4,0xbd,0x29,0x78,0xf6,0x22,0xa0,0x53,0x86,0xfb, + 0xa2,0x12,0x00,0x0d,0x86,0xbf,0xde,0xeb,0xaf,0xbf,0xae,0x7b,0x12,0xe9,0x2c,0xb9, + 0xfe,0xfa,0xeb,0xf5,0x02,0x52,0xd8,0x1b,0xfc,0x07,0x3d,0x71,0xac,0x15,0xcc,0x0a, + 0x67,0x08,0x18,0xa3,0x12,0xb0,0xbe,0x20,0xc2,0x06,0xf4,0xc4,0x71,0x0f,0xab,0x90, + 0x7f,0xfa,0xe9,0xa7,0xda,0x1d,0x8b,0xce,0x25,0xe9,0x8b,0x48,0x14,0x01,0x68,0x5b, + 0xd3,0xc6,0xbe,0xe5,0x96,0x5b,0x0a,0x26,0x7c,0x21,0x80,0x08,0x5e,0xd4,0x3d,0xc2, + 0xc7,0xcf,0x0e,0x21,0xe1,0x08,0x81,0x43,0x24,0x06,0x23,0x3d,0x8d,0x74,0x9e,0x3c, + 0xf3,0xcc,0x33,0xda,0xe1,0x83,0x11,0x3f,0x76,0xf9,0xa0,0x23,0x09,0xd2,0xd2,0xc3, + 0xc6,0xda,0x80,0xf4,0x9a,0xe1,0x12,0x86,0x40,0x21,0x0f,0xe9,0x90,0x06,0xc2,0xe5, + 0x1c,0x83,0x2d,0x9b,0x6d,0xb6,0x99,0x76,0x17,0x63,0xa1,0x6b,0x13,0xa4,0xc1,0x7f, + 0xb2,0x72,0x18,0xfe,0x85,0xac,0x8b,0x48,0xf3,0x93,0x92,0x8f,0x01,0x8a,0xeb,0x19, + 0x1d,0x4d,0x89,0x23,0x00,0xa5,0x8a,0x8e,0x1d,0xac,0xf0,0x42,0x13,0x80,0x85,0x9e, + 0x45,0xf0,0x08,0x00,0xe1,0x8b,0xe0,0x11,0x1e,0x02,0xc3,0xdf,0x8d,0xfe,0x70,0xce, + 0xa3,0x15,0x38,0x27,0xa5,0x56,0x04,0x8a,0x00,0x19,0xfd,0xa3,0x1b,0x35,0x2a,0xf8, + 0x6f,0x62,0x9e,0x83,0x2c,0x08,0xfe,0xec,0xb3,0xcf,0xd6,0x24,0x63,0x25,0x34,0xd6, + 0x19,0xa6,0xf5,0x81,0x06,0x60,0x75,0x34,0xfa,0x21,0x12,0x47,0x00,0x3e,0x86,0xd2, + 0xcf,0x07,0x32,0xd8,0x50,0x48,0x02,0x50,0xb2,0x45,0xdd,0x23,0x78,0x84,0x80,0x5b, + 0x34,0x82,0x46,0x35,0xa3,0x82,0x39,0xc7,0xe2,0x94,0xf4,0x15,0xd0,0x1f,0x2e,0xb1, + 0x79,0x4c,0x6c,0x83,0xf3,0x3c,0x27,0x55,0x0a,0xe4,0x22,0x2d,0xfe,0x07,0xc2,0x40, + 0x24,0x08,0x84,0xba,0xa7,0x2a,0x60,0xf0,0x8a,0xd5,0x46,0x99,0x0d,0x84,0x47,0x11, + 0xfb,0x10,0xe1,0xaa,0x05,0x01,0xd0,0x02,0x54,0x3f,0x68,0x00,0x0a,0x4b,0xa2,0x08, + 0x80,0xfa,0x67,0x95,0x4d,0x3e,0xb2,0x90,0xc2,0x07,0x47,0x1c,0x71,0x44,0x50,0xcf, + 0x23,0x78,0x31,0xb8,0x50,0xe5,0x94,0x68,0x8c,0x42,0xd4,0xbb,0x40,0x6c,0x05,0x0c, + 0x45,0x11,0x2c,0xc2,0xe4,0x79,0xd1,0x1a,0x94,0x62,0x88,0xc3,0xe2,0xd1,0xc4,0xa4, + 0x47,0xda,0xdc,0x87,0xa6,0xa1,0xba,0x21,0x1d,0x06,0x62,0x18,0x31,0x94,0xd1,0x48, + 0xb4,0x51,0x18,0x30,0x56,0x25,0x36,0x8f,0xa3,0xde,0x6f,0x23,0xdd,0xf3,0x71,0xc0, + 0x40,0x19,0xdd,0xe7,0x51,0x48,0x59,0x12,0x66,0xfc,0x31,0xf0,0xc0,0x62,0x89,0x8d, + 0x41,0x00,0x11,0x3c,0x82,0x43,0xd5,0x53,0x2a,0x11,0xbe,0x59,0x15,0xd8,0x42,0xa5, + 0x3a,0xa0,0x4e,0x47,0xfd,0x73,0x2f,0x6a,0x9c,0x12,0x0f,0x49,0x10,0x2c,0xbd,0x87, + 0xf4,0x27,0x1c,0x72,0xc8,0x21,0x91,0x00,0x09,0x24,0x36,0x8f,0x73,0x75,0x7f,0x5c, + 0xd8,0xe9,0xdb,0xe0,0x1a,0xe4,0x45,0x63,0xcb,0x48,0x2a,0x5a,0xdc,0x74,0x27,0x8f, + 0x4c,0x00,0x54,0x1a,0xa3,0x52,0xef,0xbf,0xff,0x7e,0x41,0x85,0x4f,0x29,0xc6,0x10, + 0xa3,0xb4,0x63,0x71,0x53,0x52,0xa5,0x8e,0xa7,0x44,0x73,0x8d,0x3a,0x1a,0xc1,0x72, + 0x3f,0x7d,0x04,0x8c,0x0e,0xe2,0x22,0x0d,0xe3,0x25,0x36,0x8f,0x89,0x5d,0xd7,0x6d, + 0x14,0xfa,0x7e,0x1b,0xe9,0xde,0x3f,0x15,0xd8,0xef,0x80,0x96,0x13,0xfe,0x15,0xe6, + 0x50,0x3a,0x32,0x84,0x04,0xa9,0x34,0x41,0x28,0x01,0xb0,0x70,0xa9,0xeb,0x0a,0x25, + 0x7c,0x1c,0x26,0xa8,0x9f,0x69,0x96,0xc9,0x47,0xf0,0x41,0x30,0x1a,0xf0,0x91,0xb9, + 0x04,0x5a,0x41,0x62,0xf3,0x38,0x57,0xf7,0x17,0x02,0xfc,0x3f,0xf9,0x46,0xe9,0x37, + 0x1d,0x6d,0xc4,0x6f,0x02,0xbf,0x42,0x19,0x2c,0x8b,0x4d,0x00,0xd9,0x11,0xa3,0xd0, + 0x55,0x80,0x7c,0x00,0xec,0x47,0xa5,0x09,0xf0,0xee,0x91,0xd8,0x3c,0x0e,0xbb,0x9e, + 0x0e,0xd9,0x3e,0x1f,0x37,0x7d,0x1b,0xe9,0xbe,0x27,0xdd,0xfd,0x54,0x6d,0xd4,0xf5, + 0x61,0x0e,0x36,0x14,0x1e,0x7a,0x29,0x65,0xb0,0x6c,0x99,0x20,0x00,0xfd,0xfd,0x7c, + 0x14,0x5d,0xc0,0xd4,0x6b,0x12,0xbb,0x60,0xde,0xe3,0xba,0x3f,0xdb,0xeb,0xe9,0x10, + 0x37,0x7d,0x1b,0x99,0xbe,0x0f,0x25,0x1f,0x7b,0x26,0xcc,0xa3,0xca,0x84,0x39,0x58, + 0xb6,0xcc,0x68,0x00,0x8f,0xd4,0x48,0x25,0x70,0x4a,0xbd,0xd8,0x01,0xc4,0x51,0x7a, + 0x4a,0x3d,0x01,0x96,0x61,0x02,0x98,0xc2,0xb6,0x81,0xf6,0xf0,0x04,0x48,0x28,0x01, + 0x5c,0x02,0x17,0xa1,0x4b,0x9c,0x77,0x02,0x60,0x99,0x47,0xad,0x2f,0x3d,0xe2,0x03, + 0x43,0xcf,0x95,0xef,0xb6,0xc0,0x6d,0xa1,0x9b,0xc8,0x1b,0x01,0xb0,0x40,0x79,0x49, + 0x3a,0x6d,0x4c,0x30,0x08,0x23,0xb1,0x79,0x4c,0x8c,0x71,0x67,0x36,0xa3,0xc2,0x80, + 0xd7,0x8f,0x9d,0xee,0xb2,0x82,0x54,0xdf,0x1f,0x17,0x61,0x5d,0xf0,0x22,0x70,0x57, + 0x89,0xb7,0x0d,0xc9,0xbc,0x11,0x80,0xce,0x07,0xba,0x1c,0xa5,0xbb,0xd4,0xe5,0xc2, + 0x6d,0xba,0x7d,0xef,0xdb,0xbc,0x8d,0xda,0xaf,0xd5,0x99,0xaa,0xfd,0x61,0xd7,0xa8, + 0x83,0x0f,0xfd,0x17,0x72,0x4c,0xac,0x51,0x7b,0xdc,0xb6,0x7d,0x77,0xb5,0xf3,0x2e, + 0xad,0xf5,0x47,0xb8,0xba,0x38,0xed,0xff,0x33,0xcf,0xe5,0xe3,0x7e,0x1b,0xf6,0xf3, + 0x51,0xbe,0x3f,0xd5,0xf3,0x61,0xe0,0xfb,0xc3,0x34,0x6f,0x2a,0xa1,0xdb,0xad,0x88, + 0xbc,0x11,0x80,0x76,0xa7,0xe9,0xb9,0x93,0x0a,0xad,0x5a,0xb7,0x53,0x47,0x9f,0x78, + 0xb3,0xba,0xa8,0xdb,0x04,0x75,0x61,0xb7,0xa7,0x75,0xac,0x71,0xb9,0x11,0x1b,0x68, + 0x79,0xc0,0xa9,0xfa,0xe5,0xa3,0xa6,0x9f,0x4b,0x88,0x0b,0x9a,0xe9,0x8e,0x26,0x71, + 0x21,0x81,0x26,0x4c,0x45,0x00,0x57,0x93,0xd2,0x6e,0x4e,0xe6,0x8d,0x00,0xa8,0xf1, + 0x30,0x8f,0x5f,0x1b,0x7c,0x4c,0xcb,0x36,0x27,0xa8,0x2b,0x6f,0x7c,0x41,0x55,0xfe, + 0x6f,0x6a,0x5a,0x5c,0xd6,0x73,0xa2,0x6a,0xd1,0xaa,0x3c,0xa5,0x57,0xb1,0x09,0xbc, + 0x74,0x24,0x36,0x8f,0xa3,0xbe,0x5f,0x63,0xc3,0xf5,0xfe,0x94,0x6e,0x06,0xb7,0xc2, + 0x08,0x60,0x97,0x72,0x7b,0xec,0xc1,0x3c,0xce,0x0b,0x01,0x48,0x38,0xcc,0x03,0xd8, + 0xf6,0xf8,0x6d,0x7f,0x48,0x07,0x75,0x41,0xf7,0x7b,0x54,0xdf,0x51,0xb3,0x23,0x81, + 0x7b,0x79,0x26,0x2c,0xbd,0x5c,0x7a,0x20,0x67,0x92,0x7e,0x21,0xd2,0xc3,0xbe,0x92, + 0xb1,0x8e,0x30,0x02,0x84,0x0d,0x06,0xd9,0x83,0x4f,0x79,0x21,0x00,0x2a,0x91,0x71, + 0x72,0x17,0xce,0x38,0xe3,0x8c,0x20,0x06,0x6d,0xdb,0x77,0x54,0xb7,0x8c,0x9c,0xa6, + 0x86,0x3f,0x39,0xaf,0x21,0xc6,0x7d,0xfd,0x5f,0x5c,0x8b,0x01,0x0f,0x7c,0xa8,0x3a, + 0x1c,0x79,0xba,0x9e,0x5c,0x12,0x96,0x9e,0x79,0x2e,0x1f,0xc8,0xf6,0xff,0xb2,0x7d, + 0x9e,0xe1,0x60,0xbc,0xa0,0x18,0x14,0x0b,0x23,0x80,0x5d,0xd2,0xc3,0xc0,0xc8,0x67, + 0x5e,0x08,0x20,0x33,0x76,0xa3,0xa0,0x6d,0xbb,0x0e,0xea,0xec,0xae,0xfd,0x54,0xcf, + 0x81,0x13,0xd5,0x35,0x77,0x3c,0x1b,0xc4,0xfa,0xd8,0x88,0xbb,0xf5,0xaa,0x52,0x87, + 0x1f,0xd7,0x29,0x6d,0xda,0xf8,0xf0,0x49,0x6c,0x1e,0x47,0x7d,0x9f,0x7c,0xa7,0x97, + 0xcd,0xff,0x41,0x00,0x06,0x76,0x20,0x00,0xc0,0xef,0x21,0x4c,0x03,0xb8,0x4a,0xbb, + 0x3d,0xd4,0x9d,0x37,0x02,0x60,0x00,0x9e,0x73,0xce,0x39,0x91,0xc0,0x47,0xd1,0xa4, + 0x09,0xeb,0xb9,0x92,0xf3,0x30,0x9f,0x8c,0xb0,0x9f,0xc7,0x15,0x4b,0x62,0xf3,0x38, + 0xea,0xff,0xa7,0x43,0xbe,0xd3,0x8f,0xfa,0x7f,0x10,0x00,0x8f,0x25,0x11,0x3e,0x80, + 0x0c,0x61,0x1a,0xc0,0x55,0xda,0x5d,0xc8,0x0b,0x01,0x18,0x8f,0x47,0x60,0x2c,0x89, + 0xc6,0x5c,0x81,0x8a,0x8a,0x0a,0x1d,0xbb,0x20,0xd7,0x88,0x5d,0xb0,0x9f,0xb7,0xef, + 0x8f,0x7b,0x3d,0xdd,0xff,0xa7,0x4b,0x2f,0xdb,0xf7,0x8b,0xfb,0xfd,0x90,0x9e,0x82, + 0x80,0x17,0x13,0xde,0x4c,0x26,0x01,0xc2,0x0c,0x41,0x5b,0xe8,0x36,0x01,0xcc,0xb5, + 0x16,0xf2,0x46,0x00,0x9c,0x33,0x80,0xb8,0x4d,0xe3,0xc1,0x93,0x09,0xe4,0x59,0x62, + 0xf3,0x38,0xea,0xf5,0xb8,0xe9,0x15,0xfa,0xfe,0x28,0xdf,0x8f,0x93,0xab,0x2d,0x7c, + 0x10,0x66,0x08,0xda,0xa5,0x5c,0x84,0x6d,0x2e,0xb0,0x21,0x24,0xc8,0x0b,0x01,0xa8, + 0x9b,0xf0,0xa3,0xc3,0x3d,0x0b,0xf7,0x2b,0x3c,0x76,0xc4,0x69,0x33,0x15,0xc4,0x63, + 0xd7,0x06,0x19,0x90,0x6b,0x08,0x41,0xc5,0x05,0xdc,0x3c,0xce,0x16,0x61,0xdf,0x21, + 0x48,0x97,0x0f,0x22,0x7c,0xd2,0x12,0x0f,0x27,0x5b,0xf8,0x80,0x2a,0x21,0x2e,0x01, + 0x4c,0xd0,0xf3,0x5a,0x90,0xc1,0x20,0xf1,0xe4,0x71,0x7d,0x84,0x47,0xe6,0x08,0xb3, + 0x01,0x52,0x09,0xdc,0x3e,0x2e,0xd8,0x68,0x20,0x5a,0x41,0x5c,0xae,0xbd,0xf0,0xb2, + 0x03,0x4d,0x40,0x16,0x8f,0x0e,0xcb,0x6b,0x5b,0xf0,0xa6,0xd0,0x6d,0xf8,0xe1,0xe0, + 0x04,0xc2,0x55,0xea,0x6d,0xc1,0x33,0xa0,0x06,0x3c,0x01,0x12,0x4a,0x00,0x57,0x69, + 0x17,0xc1,0x7b,0x02,0x24,0x1c,0xae,0x92,0x6e,0x1e,0x03,0x7c,0x09,0x3c,0x01,0x12, + 0x0a,0x5b,0xe0,0x2e,0xe1,0x7b,0x02,0x14,0x01,0x01,0x44,0xc8,0x66,0x89,0x37,0x63, + 0xe0,0x09,0x90,0x50,0x02,0x98,0xc2,0x36,0x05,0xee,0x09,0x50,0x04,0x08,0x13,0xbc, + 0x6b,0x92,0x89,0x27,0x40,0x42,0x09,0x10,0x75,0x26,0x92,0x27,0x40,0x02,0x61,0x97, + 0xf4,0x30,0x30,0x7b,0xc8,0x13,0x20,0xa1,0x1a,0x20,0x4c,0xe0,0x9e,0x00,0x45,0xa2, + 0x01,0x5c,0xc2,0x77,0xc1,0x13,0x20,0xc1,0x04,0x10,0x21,0xdb,0x04,0x90,0xf5,0x05, + 0x3c,0x01,0x12,0x0a,0xbb,0x94,0x8b,0xb0,0x25,0x36,0x49,0xe0,0x09,0x50,0x24,0x04, + 0x08,0x5b,0x91,0x24,0x27,0x04,0xc0,0x35,0xc9,0xa3,0xe9,0xc0,0x2c,0xf1,0xae,0x25, + 0x68,0xcc,0x63,0xaf,0x01,0x12,0x88,0x54,0x25,0xde,0x86,0x27,0x40,0xc2,0x09,0x10, + 0xb6,0x90,0x14,0x0b,0x67,0x01,0x4f,0x80,0x84,0x12,0x20,0x6c,0xb5,0x30,0x59,0x31, + 0xcd,0x13,0x20,0xc1,0x70,0x95,0x74,0xf3,0x18,0xb0,0xaa,0xb9,0x27,0x40,0x42,0x61, + 0x0b,0xdc,0x16,0xbe,0xb9,0x8c,0x9d,0x27,0x40,0x82,0x09,0x20,0xa5,0x5c,0x84,0x2e, + 0x8b,0x6f,0xb0,0xd2,0x1a,0x0b,0x68,0x12,0x7b,0x02,0x24,0x94,0x00,0xa6,0xd0,0x81, + 0x29,0x74,0x56,0x0c,0x95,0x75,0x94,0x3d,0x01,0x12,0x08,0x11,0xbc,0x08,0x1c,0x98, + 0x8b,0x67,0x33,0x9f,0x00,0xb7,0x72,0x62,0x4f,0x80,0x04,0x42,0x04,0x6f,0x0b,0x5d, + 0x20,0xcb,0xe2,0xb3,0xcd,0x8d,0x27,0x40,0x02,0xe1,0x2a,0xe9,0xe6,0x3e,0x09,0x4c, + 0xce,0x61,0x06,0x37,0xfb,0x0d,0xcf,0x9a,0x35,0x2b,0xfb,0x95,0x42,0xa9,0x6f,0x7c, + 0xc6,0x37,0x0d,0x88,0xc0,0xcd,0x0d,0x30,0x88,0x99,0x4d,0x84,0xe0,0x01,0xc6,0x21, + 0x7b,0x28,0x56,0x57,0x57,0xeb,0xb5,0x82,0x59,0xf6,0x3f,0xab,0xc5,0xa2,0x0b,0xbd, + 0x65,0x8c,0x47,0x38,0xd8,0xd8,0x02,0x81,0x8b,0xb0,0x45,0xf0,0xb2,0xdd,0x0d,0x2b, + 0xb2,0x0d,0x19,0x32,0x44,0x8d,0x1d,0x3b,0x56,0xef,0x6c,0xf2,0xc5,0x17,0x5f,0xe8, + 0x8d,0x3f,0xd8,0x00,0x24,0xe3,0xe5,0xe2,0xd9,0x5d,0xcb,0x67,0x7e,0xe3,0x83,0x81, + 0x20,0x11,0xba,0xec,0x6b,0x24,0x7b,0x1c,0xb1,0xbf,0x51,0x97,0x2e,0x5d,0xd4,0xa0, + 0x41,0x83,0xf4,0xe6,0xdd,0x93,0x27,0x4f,0xd6,0xbb,0xbd,0x51,0x88,0xd9,0xd5,0x2c, + 0xa3,0xfd,0x02,0xd8,0x6c,0xe0,0x83,0x0f,0x3e,0xd0,0x6c,0xda,0x67,0x9f,0x7d,0xbc, + 0x10,0x1a,0x59,0xf8,0xe6,0xc6,0x56,0x08,0x1c,0x30,0x29,0xb7,0x73,0xe7,0xce,0x7a, + 0xb7,0xb4,0xc1,0x83,0x07,0x6b,0xe1,0x4f,0x9a,0x34,0x49,0x17,0x5c,0x36,0xb5,0x64, + 0x3f,0xa3,0x8c,0x76,0x0c,0xe1,0x21,0x76,0x0c,0x63,0xcb,0x18,0x12,0x2c,0xc4,0x96, + 0xb1,0x1e,0x6e,0x50,0xcf,0x8b,0xd0,0x59,0x97,0x01,0x50,0x2d,0xa3,0x99,0xd9,0xd0, + 0x73,0xc0,0x80,0x01,0x6a,0xf8,0xf0,0xe1,0xea,0xa1,0x87,0x1e,0xd2,0x25,0x9f,0x6a, + 0x9b,0x2d,0xed,0x50,0xfd,0x51,0x36,0xb3,0x82,0x00,0x4b,0x52,0x6d,0x1a,0xc5,0xbe, + 0x7c,0x30,0xab,0x50,0x5b,0xc7,0x7a,0xd4,0xdf,0x42,0x47,0x4a,0x3b,0x6d,0x7f,0x76, + 0x2a,0xed,0xdd,0xbb,0xb7,0xea,0xdb,0xb7,0xaf,0xba,0xe3,0x8e,0x3b,0xb4,0xe0,0xd9, + 0xd5,0x6c,0xdc,0xb8,0x71,0x7a,0x0f,0x45,0x34,0x36,0x25,0x3f,0xaa,0xf0,0x91,0x3d, + 0x04,0xa8,0x09,0xdb,0x36,0x6e,0xfe,0xfc,0xf9,0x6a,0xc6,0x8c,0x19,0xba,0x49,0x31, + 0x62,0xc4,0x08,0xd5,0xa3,0x47,0x0f,0x5f,0x1d,0x14,0x50,0xf8,0xcd,0x9a,0x35,0xd3, + 0x6b,0x00,0xf5,0xea,0xd5,0x2b,0x28,0xed,0x18,0x79,0xf7,0xdc,0x73,0x8f,0x2e,0xf1, + 0xc8,0x65,0xca,0x94,0x29,0x7a,0x47,0xf7,0x39,0x73,0xe6,0xa8,0x05,0x0b,0x16,0xc4, + 0xdd,0xc6,0xae,0x06,0x02,0x54,0xa7,0xda,0x38,0x72,0xee,0xdc,0xb9,0x7a,0x4b,0xf6, + 0x47,0x1e,0x79,0x44,0x0d,0x1b,0x36,0x4c,0xf5,0xeb,0xd7,0x4f,0x55,0x56,0x56,0xfe, + 0xbb,0x0c,0xac,0x6f,0x22,0xe6,0x65,0xb8,0x97,0x25,0xe0,0x4e,0x3d,0xf5,0x54,0x5d, + 0xb7,0x53,0xda,0x07,0x0e,0x1c,0xa8,0x0b,0x20,0xa5,0xfd,0xf1,0xc7,0x1f,0xd7,0x4d, + 0x3c,0x36,0xb1,0x9c,0x39,0x73,0xa6,0x16,0x3c,0xa5,0x9e,0xe6,0x9e,0xec,0x12,0x16, + 0x63,0x0f,0xc3,0x6a,0x08,0x50,0x99,0x6a,0xf3,0xc8,0x85,0x0b,0x17,0x06,0x9b,0x29, + 0x43,0x02,0x5e,0x84,0x0d,0x95,0xfb,0xf4,0xe9,0xa3,0x5f,0x90,0xad,0x65,0xc1,0xcd, + 0x37,0xdf,0xec,0x91,0x05,0x24,0x1f,0xc9,0x53,0x4a,0x7b,0xff,0xfe,0xfd,0xb5,0x61, + 0x47,0x9b,0x9e,0xd2,0x3e,0x61,0xc2,0x04,0x2d,0x83,0xe9,0xd3,0xa7,0x6b,0x79,0xd0, + 0xc4,0xa3,0xc4,0x53,0x48,0xd9,0x1b,0x99,0x02,0x9b,0xaa,0xb9,0x17,0x12,0x2a,0x21, + 0x40,0x19,0x76,0x5f,0x98,0x31,0xc8,0x06,0xc9,0x54,0x05,0xfc,0x29,0x9a,0x00,0xb5, + 0x33,0x66,0xcc,0x18,0xfd,0x62,0x6c,0xc2,0x3c,0x74,0xe8,0x50,0xad,0x96,0x3c,0xb2, + 0x07,0x79,0x49,0x9e,0x8e,0x1c,0x39,0x52,0x8d,0x1e,0x3d,0x5a,0x3d,0xf6,0xd8,0x63, + 0x6a,0xe2,0xc4,0x89,0xc1,0x6e,0xa5,0x6c,0x57,0x4b,0x69,0xa7,0x85,0x46,0x3d,0x9f, + 0xe5,0xc6,0xd5,0xc8,0xbc,0xac,0x84,0x50,0x7b,0x50,0x15,0xa6,0x05,0x84,0x04,0x68, + 0x02,0xaa,0x03,0x6c,0x02,0x0c,0x43,0x5a,0x07,0xb0,0x72,0xfc,0xf8,0xf1,0xda,0x08, + 0x61,0x57,0x6e,0x8f,0xcc,0x41,0x1e,0x92,0x97,0x6c,0x51,0x8b,0xd0,0x29,0xed,0xd3, + 0xa6,0x4d,0xd3,0xed,0x79,0x4a,0x3b,0xf9,0xbf,0x78,0xf1,0xe2,0x7a,0xa5,0x3d,0xcb, + 0xed,0x6a,0xab,0x4a,0x24,0xd4,0xfe,0x28,0xad,0xc5,0xa2,0x54,0x24,0xa0,0x3a,0x40, + 0xdd,0xb0,0x9f,0x30,0xad,0x03,0x9a,0x88,0x6c,0x2c,0x09,0x33,0x69,0x7a,0x78,0x64, + 0x0f,0xf2,0x92,0x3c,0x45,0xdb,0x52,0xd8,0xe6,0xcd,0x9b,0xa7,0x3b,0xe4,0x72,0x50, + 0xda,0xed,0x80,0xac,0x4b,0x4b,0xcc,0x50,0x7b,0xa2,0x3c,0xac,0x2a,0x10,0x22,0xc0, + 0x3c,0x88,0xc0,0x0b,0x41,0x06,0x54,0x11,0x2f,0x08,0xe8,0x75,0xf2,0xc8,0x1c,0x92, + 0x8f,0xe4,0x29,0x06,0x1d,0x1b,0x3e,0x52,0xda,0xd9,0x99,0x3c,0x07,0xa5,0xdd,0x56, + 0xfd,0xe5,0x25,0xae,0x50,0x7b,0xa1,0x22,0x15,0x09,0x84,0x08,0xbc,0x10,0x6c,0x84, + 0x10,0x1e,0xb9,0x07,0x79,0x9b,0x63,0xa1,0x9b,0xc2,0xaf,0x28,0x49,0x15,0xea,0x34, + 0xc1,0x22,0xe5,0x43,0xd2,0xc2,0xa2,0xd0,0x92,0xef,0x20,0x41,0x69,0x9d,0x61,0xb8, + 0xd4,0xe7,0xdb,0x32,0x1f,0x96,0xd6,0xc9,0xb2,0xb4,0x24,0x6e,0xa8,0x6b,0x22,0x56, + 0xd6,0x75,0x16,0xd5,0xb8,0xba,0x8d,0x7d,0x68,0x72,0x61,0x49,0x9d,0xac,0xaa,0xeb, + 0x64,0x57,0x96,0x4a,0xc6,0xff,0x07,0x09,0xd2,0xdd,0xcf,0xb2,0x57,0xe1,0x2d,0x00, + 0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, }; diff --git a/tools/printer-sm-png.h b/tools/printer-sm-png.h new file mode 100644 index 000000000..033ccc887 --- /dev/null +++ b/tools/printer-sm-png.h @@ -0,0 +1,235 @@ +static const unsigned char printer_sm_png[] = +{ + 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52, + 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x08,0x03,0x00,0x00,0x00,0x60,0xdc,0x09, + 0xb5,0x00,0x00,0x04,0x19,0x69,0x43,0x43,0x50,0x6b,0x43,0x47,0x43,0x6f,0x6c,0x6f, + 0x72,0x53,0x70,0x61,0x63,0x65,0x47,0x65,0x6e,0x65,0x72,0x69,0x63,0x52,0x47,0x42, + 0x00,0x00,0x38,0x8d,0x8d,0x55,0x5d,0x68,0x1c,0x55,0x14,0x3e,0xbb,0x73,0x67,0x23, + 0x24,0xce,0x53,0x6c,0x34,0x85,0x74,0xa8,0x3f,0x0d,0x25,0x0d,0x93,0x56,0x34,0xa1, + 0xb4,0xba,0x7f,0xdd,0xdd,0x36,0x6e,0x96,0x49,0x36,0xda,0x22,0xe8,0x64,0xf6,0xee, + 0xce,0x98,0xc9,0xce,0x38,0x33,0xbb,0xfd,0xa1,0x4f,0x45,0x50,0x7c,0x31,0xea,0x9b, + 0x14,0xc4,0xbf,0xb7,0x80,0x20,0x28,0xf5,0x0f,0xdb,0x3e,0xb4,0x2f,0x95,0x0a,0x25, + 0xda,0xd4,0x20,0x28,0x3e,0xb4,0xf8,0x83,0x50,0xe8,0x8b,0xa6,0xeb,0x99,0x3b,0x33, + 0x99,0x69,0xba,0xb1,0xde,0x65,0xee,0x7c,0xf3,0x9d,0xef,0x9e,0x7b,0xee,0xb9,0x67, + 0xef,0x05,0xe8,0xb9,0xaa,0x58,0x96,0x91,0x14,0x01,0x16,0x9a,0xae,0x2d,0x17,0x32, + 0xe2,0x73,0x87,0x8f,0x88,0x3d,0x2b,0x90,0x84,0x87,0xa0,0x17,0x06,0xa1,0x57,0x51, + 0x1d,0x2b,0x5d,0xa9,0x4c,0x02,0x36,0x4f,0x0b,0x77,0xb5,0x5b,0xdf,0x43,0xc2,0x7b, + 0x5f,0xd9,0xd5,0xdd,0xfe,0x9f,0xad,0xb7,0x46,0x1d,0x15,0x20,0x71,0x1f,0x62,0xb3, + 0xe6,0xa8,0x0b,0x88,0x8f,0x01,0xf0,0xa7,0x55,0xcb,0x76,0x01,0x7a,0xfa,0x91,0x1f, + 0x3f,0xea,0x5a,0x1e,0xf6,0x62,0xe8,0xb7,0x31,0x40,0xc4,0x2f,0x7a,0xb8,0xe1,0x63, + 0xd7,0xc3,0x73,0x3e,0x7e,0x8d,0x69,0x66,0xe4,0x2c,0xe2,0xd3,0x88,0x05,0x55,0x53, + 0x6a,0x88,0x97,0x10,0x8f,0xcc,0xc5,0xf8,0x46,0x0c,0xfb,0x31,0xb0,0xd6,0x5f,0xa0, + 0x4d,0x6a,0xeb,0xaa,0xe8,0xe5,0xa2,0x62,0x9b,0x75,0xdd,0xa0,0xb1,0x70,0xef,0x61, + 0xfe,0x9f,0x6d,0xc1,0x68,0x85,0xf3,0x6d,0xc3,0xa7,0xcf,0x99,0x9f,0x3e,0x84,0xef, + 0x61,0x5c,0xfb,0x2b,0x35,0x25,0xe7,0xe1,0x51,0xc4,0x4b,0xaa,0x92,0x9f,0x46,0xfc, + 0x08,0xe2,0x6b,0x6d,0x7d,0xb6,0x1c,0xe0,0xdb,0x96,0x9b,0x91,0x11,0x3f,0x06,0x90, + 0xdc,0xde,0x9a,0xaf,0xa6,0x11,0xef,0x44,0x5c,0xac,0xdb,0x07,0xaa,0xbe,0x9f,0xa4, + 0xad,0xb5,0x8a,0x21,0x7e,0xe7,0x84,0x36,0xf3,0x2c,0xe2,0x2d,0x88,0xcf,0x37,0xe7, + 0xca,0x53,0xc1,0xd8,0xab,0xaa,0x93,0xc5,0x9c,0xc1,0x76,0xc4,0xb7,0x35,0x5a,0xf2, + 0xf2,0x3b,0x04,0xc0,0x89,0xba,0x5b,0x9a,0xf1,0xc7,0x72,0xfb,0x6d,0x53,0x9e,0xf2, + 0xe7,0xe5,0xea,0x35,0x9a,0xcb,0x7b,0x79,0x44,0xfc,0xfa,0xbc,0x79,0x48,0xf6,0x7d, + 0x72,0x9f,0x39,0xed,0xe9,0x7c,0xe8,0xf3,0x84,0x96,0x2d,0x07,0xfc,0xa5,0x97,0x94, + 0x83,0x15,0xc4,0x83,0x88,0x7f,0xa1,0x46,0x41,0xf6,0xe7,0xe2,0xfe,0xb1,0xdc,0x4a, + 0x10,0x03,0x19,0x6a,0x1a,0xe5,0x49,0x7f,0x2e,0x92,0xa3,0x0e,0x5b,0x2f,0xe3,0x5d, + 0x6d,0xa6,0xe8,0xcf,0x4b,0x0c,0x17,0x37,0xd4,0x1f,0x4b,0x16,0xeb,0xfa,0x81,0x52, + 0xa0,0xff,0x44,0xb3,0x8b,0x72,0x80,0xaf,0x59,0x06,0xab,0x51,0x8c,0x8d,0x4f,0xda, + 0x2d,0xb9,0xea,0xeb,0xf9,0x51,0xc5,0xce,0x17,0x7c,0x9f,0x7c,0x85,0x36,0xab,0x81, + 0x7f,0xbe,0x0d,0xb3,0x09,0x05,0x28,0x98,0x30,0x87,0xbd,0x0a,0x4d,0x58,0x03,0x11, + 0x64,0x28,0x40,0x06,0xdf,0x16,0xd8,0x68,0xa9,0x83,0x0e,0x06,0x32,0x14,0xad,0x14, + 0x19,0x8a,0x5f,0xa1,0x66,0x17,0x1b,0xe7,0xc0,0x3c,0xf2,0x3a,0xb4,0x99,0xcd,0xc1, + 0xbe,0xc2,0x94,0xfe,0xc8,0xc8,0x5f,0x83,0xf9,0xb8,0xce,0xb4,0x2a,0x64,0x87,0x3e, + 0x82,0x16,0xb2,0x1a,0xfc,0x8e,0xac,0x16,0xd3,0x65,0xf1,0xab,0x85,0x5c,0x63,0x13, + 0x3f,0x7e,0x2c,0x37,0x02,0x3f,0x26,0x19,0x20,0x12,0xd9,0x83,0xcf,0x5e,0x32,0x49, + 0xf6,0x91,0x71,0x32,0x01,0x22,0x79,0x8a,0x3c,0x4d,0xf6,0x93,0x1c,0xb2,0x13,0x64, + 0xef,0xfa,0xd8,0x4a,0x6c,0x45,0x5e,0x3c,0x37,0xd6,0xfd,0xbc,0x8c,0x33,0x52,0xa6, + 0x9b,0x45,0xdd,0x39,0xb4,0xbb,0xa0,0x60,0xff,0x33,0x2a,0x4c,0x5c,0x53,0xd7,0xac, + 0x2c,0x0e,0xb6,0x86,0x23,0xcb,0x29,0xfb,0x05,0x5d,0xbd,0xfc,0xc6,0x5f,0xb1,0x5c, + 0xe9,0x2c,0x37,0x51,0xb6,0xe2,0x19,0x9d,0xba,0x57,0xce,0xf9,0x5f,0xf9,0xeb,0xfc, + 0x32,0xf6,0x2b,0xfc,0x6a,0xa4,0xe0,0x7f,0xe4,0x57,0xf1,0xb7,0x72,0xc7,0x5a,0xcc, + 0xbb,0xb2,0x4c,0xc3,0xec,0x6c,0x58,0x73,0x77,0x55,0x1a,0x6d,0x06,0xe3,0x16,0xf0, + 0xd1,0x99,0xc5,0x89,0xc5,0x1d,0xf3,0x71,0xf1,0xe4,0x57,0x0f,0x46,0x7e,0x96,0xc9, + 0x99,0xe7,0xaf,0xf4,0x5d,0x3c,0x59,0x6f,0x2e,0x0e,0x46,0xac,0x97,0x05,0xfa,0x6a, + 0xf9,0x56,0x19,0x4e,0x8d,0x44,0xac,0xf4,0x83,0xf4,0x87,0xb4,0x2c,0xbd,0x27,0x7d, + 0x28,0xfd,0xc6,0xbd,0xcd,0x7d,0xca,0x7d,0xcd,0x7d,0xce,0x7d,0xc1,0x5d,0x02,0x91, + 0x3b,0xcb,0x9d,0xe3,0xbe,0xe1,0x2e,0x70,0x1f,0x73,0x5f,0xc6,0xf6,0x6a,0xf3,0x1a, + 0x5a,0xdf,0x7b,0x16,0x79,0x18,0xb7,0x67,0xe9,0x96,0x6b,0xac,0x4a,0x21,0x23,0x6c, + 0x15,0x1e,0x16,0x72,0xc2,0x36,0xe1,0x51,0x61,0x32,0xf2,0x27,0x0c,0x08,0x63,0x42, + 0x51,0xd8,0x81,0x96,0xad,0xeb,0xfb,0x16,0x9f,0x2f,0x9e,0x3d,0x1d,0x0e,0x63,0x1f, + 0xe6,0xa7,0xfb,0x5c,0xbe,0x2e,0x56,0x01,0x89,0xfb,0xb1,0x02,0xf4,0x4d,0xfe,0x55, + 0x55,0x54,0xe9,0x70,0x94,0x29,0x1d,0x56,0x6f,0x4d,0x38,0xbe,0x41,0x13,0x8c,0x24, + 0x43,0x64,0x8c,0x94,0x36,0x54,0xf7,0xb8,0x57,0xf3,0xa1,0x22,0x95,0x4f,0xe5,0x52, + 0x69,0x10,0x53,0x3b,0x53,0x13,0xa9,0xb1,0xd4,0x41,0x0f,0x87,0xb3,0xa6,0x76,0xa0, + 0x6d,0x02,0xfb,0xfc,0x1d,0xd5,0xa9,0x6e,0xb2,0x52,0xea,0xd2,0x63,0xde,0x7d,0x02, + 0x59,0xd3,0x3a,0x6e,0xeb,0x0d,0xcd,0x15,0x77,0x4b,0xd2,0x93,0x62,0x1a,0xaf,0x36, + 0x2a,0x96,0x9a,0xea,0xe8,0x88,0xa8,0x18,0x86,0xc8,0x4c,0x8e,0x68,0x53,0x87,0xda, + 0x6d,0x5a,0x1b,0x05,0xef,0xde,0xf4,0x8f,0xf4,0x9b,0x32,0xbb,0x0f,0x13,0x5b,0x2e, + 0x47,0x9c,0xfb,0x0c,0xc0,0xbe,0x3f,0xf1,0xec,0xfb,0x2e,0xe2,0x8e,0xb4,0x00,0x96, + 0x1c,0x80,0x81,0xc7,0x23,0x6e,0x18,0xcf,0xca,0x07,0xde,0x05,0x38,0xf3,0x84,0xda, + 0xb2,0xdb,0xc1,0x1d,0x91,0x48,0x7c,0x0b,0xe0,0xd4,0xf7,0xec,0xf6,0xbf,0xfa,0x32, + 0x78,0x7e,0xfd,0xd4,0xe9,0xdc,0xc4,0x73,0xac,0xe7,0x2d,0x80,0xb5,0x37,0x3b,0x9d, + 0xbf,0xdf,0xef,0x74,0xd6,0x3e,0x40,0xff,0xab,0x00,0x67,0x8d,0x7f,0x01,0xa0,0x9f, + 0x7c,0x55,0x03,0x5c,0x0b,0xef,0x00,0x00,0x00,0x38,0x65,0x58,0x49,0x66,0x4d,0x4d, + 0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x01,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01, + 0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x00,0x02,0xa0,0x02,0x00,0x04,0x00,0x00, + 0x00,0x01,0x00,0x00,0x00,0x30,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00, + 0x00,0x30,0x00,0x00,0x00,0x00,0xf8,0xff,0x4e,0x36,0x00,0x00,0x03,0x62,0x69,0x54, + 0x58,0x74,0x58,0x4d,0x4c,0x3a,0x63,0x6f,0x6d,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e, + 0x78,0x6d,0x70,0x00,0x00,0x00,0x00,0x00,0x3c,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65, + 0x74,0x61,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x78,0x3d,0x22,0x61,0x64,0x6f,0x62, + 0x65,0x3a,0x6e,0x73,0x3a,0x6d,0x65,0x74,0x61,0x2f,0x22,0x20,0x78,0x3a,0x78,0x6d, + 0x70,0x74,0x6b,0x3d,0x22,0x58,0x4d,0x50,0x20,0x43,0x6f,0x72,0x65,0x20,0x35,0x2e, + 0x34,0x2e,0x30,0x22,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x52,0x44, + 0x46,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x72,0x64,0x66,0x3d,0x22,0x68,0x74,0x74, + 0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x77,0x33,0x2e,0x6f,0x72,0x67,0x2f,0x31, + 0x39,0x39,0x39,0x2f,0x30,0x32,0x2f,0x32,0x32,0x2d,0x72,0x64,0x66,0x2d,0x73,0x79, + 0x6e,0x74,0x61,0x78,0x2d,0x6e,0x73,0x23,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x3c,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f, + 0x6e,0x20,0x72,0x64,0x66,0x3a,0x61,0x62,0x6f,0x75,0x74,0x3d,0x22,0x22,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73, + 0x3a,0x64,0x63,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x70,0x75,0x72,0x6c, + 0x2e,0x6f,0x72,0x67,0x2f,0x64,0x63,0x2f,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73, + 0x2f,0x31,0x2e,0x31,0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x78,0x6d,0x6c,0x6e,0x73,0x3a,0x49,0x70,0x74,0x63,0x34,0x78,0x6d, + 0x70,0x45,0x78,0x74,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x69,0x70,0x74, + 0x63,0x2e,0x6f,0x72,0x67,0x2f,0x73,0x74,0x64,0x2f,0x49,0x70,0x74,0x63,0x34,0x78, + 0x6d,0x70,0x45,0x78,0x74,0x2f,0x32,0x30,0x30,0x38,0x2d,0x30,0x32,0x2d,0x32,0x39, + 0x2f,0x22,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78, + 0x6d,0x6c,0x6e,0x73,0x3a,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3d,0x22, + 0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6e,0x73,0x2e,0x61,0x64,0x6f,0x62,0x65,0x2e, + 0x63,0x6f,0x6d,0x2f,0x70,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x2f,0x31,0x2e, + 0x30,0x2f,0x22,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64, + 0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x53,0x65,0x71,0x3e, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x4d,0x69,0x63,0x68,0x61,0x65,0x6c,0x20, + 0x53,0x77,0x65,0x65,0x74,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66, + 0x3a,0x53,0x65,0x71,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c, + 0x2f,0x64,0x63,0x3a,0x63,0x72,0x65,0x61,0x74,0x6f,0x72,0x3e,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x64,0x63,0x3a,0x72,0x69,0x67,0x68,0x74,0x73, + 0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72, + 0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x72,0x64,0x66,0x3a,0x6c,0x69,0x20,0x78, + 0x6d,0x6c,0x3a,0x6c,0x61,0x6e,0x67,0x3d,0x22,0x78,0x2d,0x64,0x65,0x66,0x61,0x75, + 0x6c,0x74,0x22,0x3e,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30, + 0x31,0x30,0x20,0x41,0x70,0x70,0x6c,0x65,0x20,0x49,0x6e,0x63,0x2e,0x3c,0x2f,0x72, + 0x64,0x66,0x3a,0x6c,0x69,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x41,0x6c,0x74,0x3e,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x64,0x63,0x3a,0x72,0x69,0x67,0x68, + 0x74,0x73,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x49,0x70, + 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69, + 0x6e,0x65,0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x49,0x70, + 0x74,0x63,0x34,0x78,0x6d,0x70,0x45,0x78,0x74,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69, + 0x6e,0x65,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x68, + 0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65, + 0x3e,0x4e,0x65,0x77,0x20,0x49,0x6d,0x61,0x67,0x65,0x3c,0x2f,0x70,0x68,0x6f,0x74, + 0x6f,0x73,0x68,0x6f,0x70,0x3a,0x48,0x65,0x61,0x64,0x6c,0x69,0x6e,0x65,0x3e,0x0a, + 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64,0x66,0x3a,0x44,0x65,0x73,0x63, + 0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x3e,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x72,0x64, + 0x66,0x3a,0x52,0x44,0x46,0x3e,0x0a,0x3c,0x2f,0x78,0x3a,0x78,0x6d,0x70,0x6d,0x65, + 0x74,0x61,0x3e,0x0a,0xa0,0x50,0x98,0x64,0x00,0x00,0x02,0xa0,0x50,0x4c,0x54,0x45, + 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff, + 0xff,0xff,0xfc,0xfc,0xfc,0xff,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x02, + 0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07, + 0x08,0x08,0x08,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d, + 0x0d,0x0d,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x13, + 0x13,0x14,0x14,0x14,0x15,0x15,0x15,0x16,0x16,0x16,0x18,0x18,0x18,0x19,0x19,0x19, + 0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21, + 0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,0x26,0x26, + 0x26,0x27,0x27,0x27,0x28,0x28,0x28,0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2c,0x2c,0x2c, + 0x2d,0x2d,0x2d,0x2d,0x2e,0x39,0x2e,0x2e,0x2e,0x2e,0x2e,0x39,0x2e,0x2f,0x35,0x2f, + 0x2f,0x2f,0x2f,0x2f,0x3a,0x30,0x30,0x30,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33, + 0x33,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38, + 0x38,0x3c,0x55,0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3a,0x3a,0x3c,0x3b,0x3b,0x3b,0x3c, + 0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3e,0x43,0x60,0x3f,0x3f,0x3f,0x40,0x40, + 0x40,0x41,0x41,0x41,0x41,0x42,0x45,0x41,0x44,0x4c,0x42,0x42,0x42,0x43,0x43,0x43, + 0x44,0x44,0x44,0x45,0x45,0x45,0x46,0x46,0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49, + 0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e, + 0x4e,0x4f,0x4f,0x4f,0x50,0x50,0x50,0x51,0x51,0x51,0x52,0x52,0x52,0x53,0x53,0x53, + 0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,0x57,0x58,0x58,0x58,0x59, + 0x59,0x59,0x5a,0x5a,0x5a,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5e,0x5e,0x5e,0x5f,0x5f, + 0x5f,0x5f,0x6e,0x90,0x60,0x60,0x60,0x60,0x69,0xa2,0x61,0x61,0x61,0x62,0x62,0x62, + 0x63,0x63,0x63,0x65,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68,0x6a, + 0x6a,0x6a,0x6a,0x7a,0xa0,0x6b,0x6b,0x6b,0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x71,0x71, + 0x71,0x71,0x82,0xab,0x71,0x83,0xac,0x72,0x72,0x72,0x74,0x74,0x74,0x76,0x76,0x76, + 0x77,0x77,0x77,0x79,0x79,0x79,0x7c,0x7c,0x7c,0x7d,0x7d,0x7d,0x7f,0x7f,0x7f,0x80, + 0x80,0x80,0x81,0x81,0x81,0x82,0x82,0x82,0x83,0x83,0x83,0x84,0x84,0x84,0x85,0x85, + 0x85,0x86,0x86,0x86,0x87,0x87,0x87,0x8a,0x8a,0x8a,0x8c,0x8c,0x8c,0x8d,0x8d,0x8d, + 0x8e,0x8e,0x8e,0x90,0x90,0x90,0x91,0x91,0x91,0x92,0x92,0x92,0x93,0x93,0x93,0x96, + 0x96,0x96,0x98,0x98,0x98,0x9b,0x9b,0x9b,0x9d,0x9d,0x9d,0x9f,0x9f,0x9f,0xa0,0xa0, + 0xa0,0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa6,0xa6,0xa6,0xa7,0xa7,0xa7,0xa8,0xa8,0xa8, + 0xaa,0xaa,0xaa,0xab,0xab,0xab,0xad,0xad,0xad,0xae,0xae,0xae,0xaf,0xaf,0xaf,0xb0, + 0xb0,0xb0,0xb2,0xb2,0xb2,0xb4,0xb4,0xb4,0xb7,0xb7,0xb7,0xb9,0xb9,0xb9,0xba,0xba, + 0xba,0xbb,0xbb,0xbb,0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe,0xbe,0xc0,0xc0,0xc0, + 0xc2,0xc2,0xc2,0xc3,0xc3,0xc3,0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6,0xc6,0xc7, + 0xc7,0xc7,0xc9,0xc9,0xc9,0xca,0xca,0xca,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce,0xce, + 0xce,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0xd4,0xd4,0xd4,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9, + 0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xdf, + 0xdf,0xdf,0xe0,0xe0,0xe0,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe5,0xe5,0xe5,0xe6,0xe6, + 0xe6,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xed,0xed,0xed,0xee,0xee,0xee, + 0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf4, + 0xf4,0xf4,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xfa,0xfa, + 0xfa,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff, + 0x96,0xb7,0x1b,0xef,0x00,0x00,0x00,0x08,0x74,0x52,0x4e,0x53,0x00,0x08,0x7f,0xc4, + 0xdc,0xdc,0xfc,0xfc,0x86,0xfa,0x37,0x3a,0x00,0x00,0x03,0x97,0x49,0x44,0x41,0x54, + 0x18,0x19,0x95,0xc1,0x6f,0x68,0xd4,0x75,0x1c,0xc0,0xf1,0xf7,0xe7,0xfb,0xfb,0xfe, + 0xee,0xcf,0xe6,0xb1,0x73,0x53,0xdb,0xfa,0xc3,0xc2,0x1d,0x35,0xcc,0x1c,0x4a,0x60, + 0x89,0x3e,0x50,0xfa,0x43,0x52,0x4a,0x52,0x94,0x48,0x33,0x0c,0x1f,0x84,0x21,0x3d, + 0xe8,0x0f,0xe1,0xa3,0x20,0x0c,0x83,0x11,0x42,0x04,0xd2,0x1f,0xb0,0x7a,0x12,0x14, + 0x66,0xd1,0x13,0x35,0x08,0x4b,0x4b,0x54,0xc4,0xd4,0x5c,0x63,0x78,0xe8,0x6a,0x59, + 0x6a,0xdb,0xed,0x76,0xdb,0xfd,0xee,0xee,0xf7,0xfd,0xf4,0xbb,0x6d,0xa2,0x79,0x3a, + 0xcf,0xd7,0x4b,0x10,0xf1,0x4c,0x2f,0xf5,0xe8,0x74,0xa1,0xaa,0x88,0xe9,0xa7,0x7e, + 0x19,0x67,0xe4,0xf0,0xaf,0xd4,0xaf,0x5f,0x8c,0x37,0x36,0xc0,0x2d,0xf0,0xac,0xa9, + 0x8c,0xd1,0x73,0xcf,0x2f,0xab,0x16,0x1f,0xb8,0x74,0xac,0x7d,0xf5,0xcc,0x93,0xbb, + 0x16,0x3c,0xf1,0xc1,0x86,0xc6,0x3d,0x6d,0xb3,0x76,0xf9,0x6b,0x5a,0xa8,0x61,0x4c, + 0x6f,0xe1,0x08,0x9f,0x8d,0x3c,0xf7,0x6a,0xe9,0xfc,0xce,0x55,0x43,0x7b,0x83,0x2d, + 0x2f,0x1d,0x3f,0x65,0x0e,0xba,0xf7,0xdb,0x7b,0x96,0xb7,0xed,0xa3,0x56,0xaf,0x25, + 0x92,0x5c,0x47,0x7b,0x96,0x75,0x0b,0x83,0xdd,0x99,0x0b,0xef,0x5c,0x1c,0x5c,0xbe, + 0xa3,0x69,0x59,0x7c,0xaf,0x16,0xe6,0x0d,0xf6,0xc0,0x83,0xcf,0xf0,0x3f,0x96,0x88, + 0x2b,0xc6,0x06,0xdb,0x4f,0x16,0xf9,0xa7,0xab,0x63,0xc6,0x36,0x0b,0xd9,0x1d,0xaf, + 0xc4,0xbb,0x36,0xcd,0x85,0x1e,0x6a,0x58,0x22,0xe1,0xd6,0x73,0x9b,0x13,0x7c,0x7d, + 0xac,0xfc,0x7a,0xd3,0xcb,0x2f,0xb6,0x3e,0xf2,0x70,0xf7,0xa7,0xf7,0xb3,0x79,0x5b, + 0x3a,0xb3,0x91,0x5a,0x92,0x05,0x1e,0xfa,0xb9,0x98,0xe0,0x2b,0x59,0x99,0x00,0x2a, + 0xe5,0x24,0x93,0xf2,0x29,0xae,0xc3,0x12,0x79,0x96,0x04,0xb4,0x49,0x82,0x88,0xb5, + 0x4c,0x49,0x71,0x3d,0x92,0xe5,0xd6,0x18,0x6e,0x91,0xe1,0xc6,0x8e,0x0f,0x53,0xcb, + 0x70,0x63,0x03,0xe3,0x4c,0xf8,0x84,0xab,0x58,0x6a,0x7c,0x91,0xda,0xbf,0xec,0xf1, + 0x81,0x1f,0x87,0x17,0x15,0x2a,0x67,0x0f,0x94,0xb2,0x1b,0xb2,0xef,0x9d,0x5b,0x9f, + 0xd8,0xe5,0xaf,0x69,0xe9,0xe9,0x18,0x5f,0x8b,0xa1,0xc6,0xe1,0x43,0x2f,0x7c,0x7e, + 0xaa,0xb0,0x7d,0xc9,0xc2,0xc3,0x85,0xc2,0xbb,0x99,0xfb,0xbe,0x5f,0xd2,0xf8,0x5a, + 0x7b,0xcf,0xf2,0xb6,0x7d,0xec,0xf4,0x56,0x82,0x65,0x8a,0x73,0x0a,0x82,0x88,0xb0, + 0xb6,0xf3,0xd1,0xfe,0x7b,0x57,0x2c,0x22,0xf2,0xd8,0xd2,0x83,0x87,0x62,0xd2,0x18, + 0xec,0xd5,0xc2,0x3c,0x1a,0x9f,0x04,0x2c,0x13,0xb4,0xd2,0xff,0xe5,0x88,0xb1,0x5e, + 0x43,0x73,0x6b,0xa7,0x16,0x39,0xf3,0x34,0x57,0xf1,0x82,0x78,0xd7,0xa6,0xb9,0x4c, + 0xb2,0x44,0x34,0x1c,0xf9,0xb6,0x8f,0x18,0x12,0x8e,0xe6,0x8e,0xfc,0xe0,0x3e,0x72, + 0xed,0xf3,0x7f,0xe7,0x8a,0xe7,0xdf,0x7c,0x63,0xf3,0xb6,0x74,0x66,0xa3,0x10,0x91, + 0x2c,0x1a,0x9e,0xf9,0x69,0x80,0x2a,0x1d,0x1d,0x6b,0xca,0xcd,0xba,0xb8,0xa9,0x23, + 0x01,0xaa,0xea,0xb4,0x70,0x62,0xe6,0x7c,0x81,0xe1,0x34,0xe4,0x53,0x4c,0xb0,0x50, + 0xd9,0xff,0x21,0x53,0x32,0x7a,0x36,0xd7,0xfc,0x40,0xd2,0x2f,0xeb,0xd8,0xf1,0xd3, + 0x47,0x7f,0xcb,0xb9,0xa7,0xb6,0xa8,0x40,0x1a,0x48,0x31,0xc9,0xe2,0x8a,0xdf,0x71, + 0x99,0xeb,0x1b,0xaf,0x54,0x5a,0xf7,0x1c,0x3d,0x9d,0xab,0x58,0x5f,0xc6,0x1a,0xb6, + 0x76,0x71,0x2d,0x8b,0x2b,0x0e,0x72,0x99,0x1b,0x2d,0xbb,0x6f,0x76,0x83,0xe7,0x25, + 0x5c,0xe0,0x56,0x74,0xb7,0x18,0x57,0x12,0x2e,0x13,0xf1,0x0c,0x16,0x57,0x62,0x4a, + 0x30,0x32,0x98,0x0f,0xed,0x0c,0xdf,0x7a,0x7e,0xcc,0x4b,0xfa,0x7e,0xe9,0x63,0x15, + 0xae,0x08,0x0b,0xa9,0xed,0x09,0x63,0xa1,0xc2,0xa4,0x20,0x48,0xde,0x19,0x36,0x59, + 0xae,0x6f,0xd8,0xcd,0x69,0xd6,0x51,0xdf,0x58,0x54,0x99,0x14,0x8f,0x13,0x70,0x89, + 0x1b,0xb8,0x0b,0x55,0x2d,0x2a,0x96,0x2a,0xef,0x76,0x95,0xa1,0x7c,0xd9,0xc8,0x1d, + 0x56,0x14,0x51,0xe1,0x1a,0xa5,0xbf,0x55,0x41,0x9d,0x62,0x89,0xd8,0xbb,0x8d,0x14, + 0xfc,0xc5,0x70,0x22,0x96,0x04,0x54,0x94,0x2a,0x51,0x41,0x45,0x89,0x5c,0xc0,0x89, + 0x52,0x65,0x89,0xa4,0x1b,0xe0,0xdf,0x8e,0x26,0x2d,0xa7,0xd2,0x5c,0x45,0x54,0x50, + 0x51,0x60,0x30,0xef,0x2b,0x4a,0x95,0x25,0x92,0x68,0x74,0x6e,0xf6,0x5f,0x7f,0x3a, + 0x3b,0xdb,0x29,0xaa,0xa2,0xa2,0x22,0x88,0x08,0x46,0xc4,0x9a,0x7c,0xdf,0x25,0xdf, + 0xc7,0x81,0x02,0x96,0xc8,0x1f,0xd9,0xc0,0xa9,0xa2,0x0a,0x28,0x53,0x04,0x04,0x41, + 0x04,0x35,0x80,0x03,0x42,0xc0,0x52,0xe5,0x7b,0x65,0xa6,0x63,0x7c,0x20,0x54,0x01, + 0x2c,0x13,0x4c,0x9c,0x9b,0x08,0x15,0x71,0x80,0xa5,0x4e,0xaa,0x28,0x11,0x4b,0x9d, + 0xd4,0xa1,0x02,0x18,0xea,0xe4,0x50,0x14,0xb0,0x40,0x91,0x3a,0x9c,0xbf,0x4d,0x95, + 0x88,0x05,0x12,0xd4,0x21,0xe5,0x84,0x2a,0x4b,0xbd,0x1c,0x04,0x80,0xa5,0x4e,0x61, + 0x09,0x19,0x17,0xb0,0xd4,0x29,0x07,0x41,0xe8,0x09,0x16,0x31,0x4d,0x39,0x6e,0x2e, + 0x20,0xf0,0xde,0x8a,0x1b,0x4c,0xa7,0xd8,0xa5,0xdc,0xdc,0x50,0xb9,0x65,0xfd,0xdb, + 0xad,0x0d,0x5e,0xa7,0x75,0x26,0xbe,0x40,0x0f,0xe4,0x98,0x5e,0xbe,0xb9,0x7b,0x56, + 0x3a,0x95,0x4a,0x88,0xb3,0xa1,0x69,0x98,0xb3,0x28,0x53,0x72,0x4c,0x47,0x6c,0x43, + 0x7a,0x46,0x32,0xee,0x1b,0x42,0x11,0xd3,0x17,0x8c,0x05,0x65,0x65,0x3a,0x62,0x63, + 0xc9,0x98,0x35,0x90,0x71,0x82,0x88,0x31,0x27,0x55,0x99,0x96,0x18,0x4f,0xe8,0x74, + 0xa1,0xea,0x7f,0x66,0xc2,0x6f,0x17,0x59,0xdf,0xbf,0x1b,0x00,0x00,0x00,0x00,0x49, + 0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + +}; diff --git a/tools/printer-sm.png b/tools/printer-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..e87527e71ecb96a6a72edca5d820fde4e510aad0 GIT binary patch literal 3687 zc-nnd2Ut_t5~hn3krukdAc_bHgeD<`-a`!?6hjCQNF#|93DTu3pnzsUmZi803MdE& z0*Xkp0xPmgZ%UWWf>d8n*XMrgd;j;{bLXC!`De~KGxy#kI~y~89!VY+78ZUBb7KeQ zU1k5`W@nD)1`pn2Vd0R#85!9H8krf9@FWU~jK*NiutY2chjB17WMMg-n(B1MU)o6o z(LnW+JJyN9tH;xB>ha6-XF97FRM$ri4QUb?7MlH_X`l6l&a7vhr_~yE3v5m7=&G|h zBCU^Vqksy32@D{rA=h~1`+I;2i0Y5AcGEu<&1LJTW#j7a4r3SStGSE6hA-6lEpkrR zmAEp}MOXpX?{$B0pLxL4nwLwk9* zYfWWDfkCp~Rg*V)6ECwa6+68MX1%bLE~_`|eq`Nyx>i-c6>{PJ80KvY6>%{Y=lfo1 z{BeklJgc@e#rM|kWXze;E+?#j+X z#4Vydw@+!vPmS5PT9stvneK3p2NEJ`q(=uBIq8CWTvrB%ua_4IE*g854IC(G%=_*3 zz2u`8r{XkMmBy75yR@dBqaOE`mSnd5@;JD)R>OT|MTes)sovxI@)OE70rl(3)WodD z^%vn`#yeXN!pzqrD0$lRGxX`zIEM0po!@`H8Y|iwn;2POYOp>vzIS)f@-VwZfaHWl zBsk;7ArHvAGlZh)E-OAUtsYq`z}!}}L;fe@s-GxP~h{mON-bDQ>UonrJn zdc0<7bYvrc)j>{$ER}?ZJl3x4f<6lRTqA&9|68$#xS%4pMI@5F3Vg++rkda@uqjGrB zBLGUX=9oPix^jY#8)InS8_l>qw++aH{HiN+2qQaLyzSWtc4kf5zRR{|z31fQI77aA zQpTBNeY(*=IOUj;Ps&wI$Bp|gs|BEIwi6Dx!zdk;@U6Q&1_B9HMZx(5w(T96KW`B$ z9cH^R!x3z5uVKVF{tnR)tL{v1$#P9a#`W3h#GB%mo+8uyQ3?G7cPY-r;kCdNC_H2Auf3yV+ zy|~*mGuTQkn^KOtr=^qoXk?N02BH6{l*KPKk~Ke%?!@lNyU2W3oW{CZ_*z@DC^BVk z7S;qD3kOqTWnPjj`(Vpw`!=JJ&;DO|U-|KqjV22VyEo3!mF8-VgkeYoFxrRYjRl7i z$e-Qep)jUMz|zpbPy(Jvg@x*ZK3l+;^8Pdg1pI753)BUyR zKp>pr;|p^zHvQ_(e9{H^(`aNE1QHSw0uE6FlPG==Rc&o;hzb+}g(@>Gl&N7v8ah;& zNR|6S@;8q$mWrX^$TS>@2;6^0dy~%7bU~o6Hec{1kPqft9P)Vz{&N%`3GABIO0{d7U0%05_M^m#lD zgfJqJ!#=YCp(?5>Km#%vj|Ex~G2s7~=Rc!-&huXx!M{5bm^l{hgU1oE2pen&(1L*W z!@?my)PLvy?IeEa{R1t}_bGl?m0wC8^0np>JaEXj{z35M+hzIeH>4fX(S+GrpZ><) z-X3$@+1X)^``yXP%ErdV&d$!k!NJMN$;HKW;J^WHZtjBz5AyKv@bdEV@$vEV^9u+F z96o$lP*6}vNJv;%SVTlbR8$lI0Eml=OGrpaOH0eh$Q(IxL{?UonbOgtM?oNvoSfXT zW5?v><&Pgfe&WOl1qFqZCr>IWDk>={DKi1q2Jb@~4AFq>1E!*)qN=J2g+kTT)YR40 zH8eCdH8r)gv`#YtcVf0IY#(qP9UV9vuB)qyV8ZB}o}Qk*zPD3@8IBoLZKWT9i5z< zoSmIrTwGjTUESQ=+}+(hJUl!-J%|1|$~h)*g=jR|+uIw1!CVPkii(Pkj*f|m ziH(hoi;IhokH2*3QbIyPa&mG?N=j;KYFb*_l`B`$)6+9DGBPtW84N~NR#r|Ev>DsZEbDs?d?yVJbCu)+4JYmU%q_V(b3V_ z+4;vGf4qA2s;8%?x3{;iudlzqe_&u>aBy&FXlQtNcw}T`baZrleEi+JcM}s6larG( zGc&WZvvYHE^Yily3k!>ji%UyO%gf6vD=Vw3t7~g(>+9bHC>HL>*1^G@ol9FS3? z_ZGS)?^00%TP@8p8ZV_S&m|%3wu~Gs9j=gLS>NI=qa8{54H0C`p_tz9`}MeyO~t z+$%*(vq^cW>{iMvY8RvwAbX!y7V+21%mx5_`SGQ8T|!mxW}y2`G?FyNotFyV2$lct3#0q(%c%v%J16Gyp zp22x!t1fHwlv_57;>5Acm6LZ`gu)mc)fO>{_mCDrx)~F1#EI!+?P&t27i0|kJLJc> zQr7@_djF#j%h9q4Vxo$E0#_@gDi?D-@_HxAaWgaGUOyGIj~PMe7fUK4o;A0`H#cN& zH+pq{bPw-ZsfqZo<{X1frt-ujR@AJ%+6#A407oQOI^L%C2N9%lz%#Ph>|U(+&~JBos#z)b*9ydy9j}W zm-zrL-j*uREP;8xkqZ}JT5VmN!HC}B=Djt45L3|n8_;}MLeuRIska07#(u=rFac~%LXhg9aHaSd$V~a3!pd+i2F!GliZqcBq-)%}11g&y=3fRPF-`j~) z=%>Sed1QSpkyEJW=tP{N)kA3xrVaX_gjhw-$pZ${2LY|Nk~>l$3z zKcJdYsu6ic#xpqr;a95p83|j9E8NUbkjQXqtei!D3*O7#$qD+_;IKoq)=*-emUI=! zkXa_gD8A?wofxBd^J!FcE+cWCnE~5Po7XxZX?=3PTB|v=&LG=~(U}YE+qye!^bijY zyXuu<@|Z;6Zjni!FEH>Vi9>nAlKs$btxim(TO_c40WsF)r4*Xr^x&)D;&2R+iIH-QzRv=*jI0BA9IGTMoI4p zE(*oqWLEz$>KK1hlJfpVhi`YCl;w{f3WV*kjaHf8KX{&^jdFghE^kO>_5}spK09d+ z&^!$B#L8{22e0i#r3sOo6{M#|(sxJ3gyr2)JzQP9sGPn_O~B;LysQ-_oSc8fN@U3f zUATtRreKsA;m~H-JP9|CQ2I@HSSw{U zDG~p3(dZU3U2_5&dwvz-Ifik^*O6C<#jn1-%JkSa?*SvrYCH6Yd`(7wM{8&5MQ^Wd zt2|c7_Ymh-e5Cz)0J&i zrHkiQvyV@eHa@C1+sos6roU|HL~W#CMEAOKM3pMKy3jWl4LUtz8-49sWw_z2wK59XZF4)`UzAiX-vAsE!hpHhU=sps@*VuMLKbPR^*~n_Ab=l(0l;V{03m(^ z#GlN7Uk4}`^fv{QOYr~4znCs}cy$2)0y`&Tb8mB99eIQsS{QEcW``8^N4x)4hx*Io zhiIfX9O92gxq8X_D{}pokjIaIkwv&5zeT)V6uHcGVGuPpPb5T2SW;M&ONk5ufj~X& zAIKZtzVnwl{!Wq0(c9ZyUPQ#t&rjG-LfFmIK}1YWPEJHrTtr-42rnVz72xU(_ZM>Y zy8b7~e{gOiy%3&G?%qyru8?2%a6302Z$&PyzhwSA{xoEd_}h-Vk0feMZ|9aFK>I1e+Y<(i;Bt$iHZw}%l#{syQ7=8 zo0p@T``<{eUVr5mpJ|c5*?4C}MgETTSFrX7d4wkt?(OEO^k2BYvtWeu_;2ce7$_$t zT_=Pi9EpM$`5}?sP?5i=|BWH?KS7`(|7!7Sp-TN>*X0p{nPR1V-Q$`dt*3l}!&(*jVlYonmEFgQy zUsi0c>S0eq@?Q95Zt+^oI0JnJ#Pn)^U0eNXX8%g7-;PVubo!?=zN49BKeqv8KE97y zhK9*p`~`nF8(73`SdNU?#s0{99nIrYRZ^B>W1%$-JB2w3l{i<9tgec4q<#5VC0VlD z=Th0bYPARw7t-fDBeUJ0E2k7Nd=@Nnwg^#ecr$S1+*V%_X_x{qIb_4H2Z|1B`H zD0=bognIr|5??d*rP&*^sEn_)c# zT{gdIk4dHDuPOQ)GZOy0_s=0+yeZG&ft@1b=_O z(Lus7vXeOoBLKdbX@W}wZheJfD6&vhTDw;54P*C$gpiqLHa;eitL?|D*z(v>Ov&h| zbIZXO7x&9am-4seS}N`@=6t8nYHfjdH^z>xEe*_;lT?b^LtG;X#w{c7zKOiFE#$%rhW4X5qlbwwI-&ywkiF;W9s`KYo>TcqWxHC7C9 z$Nge|SbuEwi?x^TTjU@uJ_ht|o8vp~N2Oqu^(;vz!>GR6K-z;0Oy=EN#0uIhj-?VY~VYp|rP_pGdr_5r2)QIA9}~luh1yaMjGx zsepK$!@V7-YFVfX_1!W*$F93iAk*nNfQPd|ZXqGjY`!t-083!cK>##=M%Ys zqFwmX7vYRTG{^nsLI~7`DW*`>y00!pKaMo{?P%i0ALjCdF+>9ghuc#hxZ0nKAtGvQ zLywo+Ptv_w0uKyDns+1UMwTAr#`a3wEUSNcf^Qd}IQ5}`y?&X^nWoE&)6G3AbghZw z$^DK9q7I3xiAkMn(wHVR9N+)sbC% zzmhy+Gd(XzzgLpzBsab=?S&g1Gqv#<4U|?Biz)?U!dEsllQ!{iSc!gNn?~8o6d?bN z*g~-{r4|w)p-TxeruYINz9uUCoR2*4QutP%Z|OJVbMXBsryBG0hoC<>lcKnJw~jFLVa@9H z3je~z=}x&BNBO%+XFbq4zNZ>3_$@IjZ?sg5m3LIChw0iO7(gC}|9p7(hAr}$$%~oB z2g(@pCG^xgN)+*6p)QMqer~b5$`qCX$Oij?Wu00`w+;P#$%)I*Raa;}nhh$csj0cg z$4LCb38HkmRsCKKlOR2*8MaSvW=(S!bHk|6QRqI|Gm4<)XJ&@Uk9}p%w^OA9o-C0I z*XOG4=mC% z_fwpnU=KSKnCaj9!CH&=#e4%QNIwX4RcjoXZc}3lH+;;elEyh45PfL5SD zC-~>?!oa?fB94NmIokcc+{s$L2`)#mmf$th165NQB?^(&X{2h)VJ>V=oD*3VG{RJ;^@@kGQVu|Dg-x0sG}!7_doGbdXMtxb>{N)6Li**#N_lVbdU3_& z06bRNqG#aOk> zea2^OG%K}nF7#BYo^RkqZ}D7;3BpsU@ zWiKgwh@c(ZmVH`9wNw_<4>3ORB0`nr!BEAO=ZJkx^D@kQMw`9}c7myspM@!$cenZp za}q!>SJZi=_H5fjXa8i}R;k;XHQH_kX@e90_ z1 zpN2;D$+y;ksVl(P=OqBU3PQFt(bZy^w#$nkU4ZhAD2}jwzO#wQMH;J8!CS#6%Ii_1 zvKwDnEkL?zQAwZxiPf%`W&*)BXq5VkgULA{=0H8_Yhhgerl+^mQ26(Ff*znm#q{ULY`5^a<-r6C&^tiEud26RMjwJY8Ll1B_oCXP~GNb&e5XKPThM z_D&Av>x~|xVbe8!DC;2DcS@T23L)pJWxn{33&5Zpv1&fja>M_SE7$1J=}TGw<)gOQ z&GNRgAlh}ohKrNU1CZf3%NdEHM=AX$G6(RreAM85%V}0*yuq9p@Vybm&JVaNoD1M^HE!bTiV5C1(7jI*lM9hF%D%_B*GY$l zx_Txt`-*AlR+7!L32vIP(lP81Q{zk0?4#q zf-xr!&vcclo_3OGuzK8v;ja6O)x(xk9pi6}G^wD7DAZ{LJHG~eW=^$>>012U{YqnU zI=V2gk&}(s?wVNYXU!UeYoew+(uw)AZr5k_Jla*5W>yU}EodK{iS4%A#U`i%XrK{l zqecQWtrqm-w+iHQ^)$}CM4VsHQfW~OwnXpqv3mA$CILvfr4zk;!mP*Fr{3(2D$2Z@)Ieyd zYPTnAcEkueQ$D`4F2jcIb_2EDViJtg1x(Q751L?t0b3dcq`Tjee$DZmD-%i_G9fJM zt$Z`*#^{j)_!a4^?149s6{rjd;QT!Js!jWd3vJW=*`-G1sm*n2ylh4*6%R)c@2C7f zqU6lqeR2dOj%f0@-)$KOb{hoVRRpHNLC-tig&*z`YVrfEL5z9YFZ@9FGc?|cC@vDH z;hychYe(m0^|AmfR06c*(K@2w>-aLqdpJnvcVfm8v%ghE7|(Gq!fkfB+|6R^C_gsS zUn~m}oj;dA3(P7>o4xUM&u_IwbRArzx)RrQg72q$25ogf2gre%vY!aX4}YS=G)a6^ zkAjTn463h(2LLoIN4uw$^b#s^DUI)_}$wYudD&0AY^a!^^6WoQ3<%x!10eU&q)Cb+z|8 z+yg@-eDibBO;E;|}131g2hhsUwB-tHm!12leapCl~y4i79V{f~g;X zCkw2j(83j*+;}6!S-bgNisVN(p}yTt67=1OF=D2tE@0L7MAOg#2KXGOW;zvD@DME( zpVd!{0H-ieXK>H*X$R!{SC5b=jTLY;(2#UmNqF25VyS9f*0NhgpsT`=c%{$9YPWC@ z{c~ZSu+wA%-64@n3O8N0ACB91OqVZA$UXCsh$h3#MrXvp$b=kiY`!Jni%`gtrLY$Za5fi`D%Jc-I#M z)>o8Bbq3(XGN+WdOsSiv&u+bT3+|DjjA`$u6phKyjhYAca0c<4nwf3ZMpzswzj^sUVyjexbBz`-AO~G^r^#lKLzm}jp4&Yu|UYxM$a|m6E42RG( zZn3?ZzF^HKM70f>ejicrxsgwp$lMdLBW@=`OpDR74 zU{=u^bzZ9jfps+O5x{ay2^2Vhn3N`Z+qp0b6k3cGQNogMClHDXl!eY`XY1fOhW9OcDrbaC>yKeAk zz6O;o+f~@l{!FQ17r?>B=uQ6ZYXL{oUWvlrdy#*n-U!q<0CXN#5rLDl69hGjVK^*$tLB+j~_2D%qT`RsImJ>T}}TVzMS z%-mKI5jV$2qq{+u7w5HbjjWs@C3q*HP~`e>kxRf}cYe2#<^)RyD66D_kye0Hg~`|U zxmYjpM`NP18<~Jwi3gvqo!g;0q26n-w`tHSk^rroC#-UY3G9lNiihI}=f&>W4%Y&d znYL5W!#j%D<(|>r=F%uw5RAT%D2mV#R6>9PQK(sxRCu2K{5}bWo4F=_Qe{t0M;XKo z-q;>4)E(XqxT|p7=Kp;$ut2eI+xg91?vV@rx9?vXbLYyd%v4}S-x6fTpae-JoC5vr zseU9w)u#-{f9(h|4sZ;{FY-KqkPNf;a)q^GBc z_4ReElsZ;f25=;KO2}rjranJEWu=s7vIl(XSYBRcetw?w^K(+x@&$yXeycDesb6&* z92{tKb5pmsx2pC0{A~JLTU#m?i~9KZ(8#J(*?d_R&TwPu1J2y8s=9#0TBPCs4 zUds16pBseSK9+i>T~ z$_kQ5*6i#og+hU(FbrvHYa{u5OG}HHRk^Nf`n|oqe5bFk4@r~*rt0hKi^<7J(@)m; z_&E7|9t%Yx_VX`5S63IAOopMMA#<3+!^82+aU7y3s=KqbwG~N!Kbu3JnVG51OdTE` zQtRdAg{Gz^GaDHhAqWC4E-n}t7%;t#j*d8>v$L~!&;9*9Nq2X5@%-`ekt)ygOs~1Q znVp>-uCK3IU0sdeTmHqvMt|5d1CQE*AdG)Kx2htDP*h1$5C~OO5C|fG3aFrjfxVR_| z>Il|9Iy&l`Q?0qVS?=%e#n{{1lZ=dvzel9H0NkKskz z9v&WaUjU@Dvs1z_RB2y%dAS&yo12o5kRSlmfn2(}y3E;aPsXnUY;SK%nB(K);MTOX zw0P%iYHE^~mlp}4s>9}HY}dB)^YfsM`Gth3s;bhywzf7gIyyRnm*(;DQH-0L8%aw` z)4s8>vG5_Q1BUm-Tq0P1e}CWU`E>yOpgwYQbG4s`6FH~L#KeTntskD~Gj45VWo5$T z&o#-+%+$X6`g$?kF*7qWVvLN8*fXy&-)LxP(DuZ{#DC_muC5N|T3uZgV|sd8*Nn2B zo*wzi{J|%{g9gFH#YJ4>+_AiMt^xsLziYU>yaZ7-VpLXEqNu0{#Le_EK0XejYK2Y! z;;x~pCOrT8`Z^4Eje~;&&>b{OsL?J(Rm3JMCmbDQx-gV-E8XN0Ll{>sGgpJ9@QlarI+gMNgg zqazqLmWdw>5wSyvq_wpbgM)**A8L8Mu>@2OplX3(Yiw+6=)Nl|Dv+FzDER=gySt04t1G0Yruz1z;exUdAVWh#>M$Y# zgGvN*b94Gad^_S*0j?Dn7YlEZq^GCrzxjm9?Ck7obDC*3URPJARXb~=Q+X?a-QC^6 z|DpC*MZl-r*3{o&?(Xh%4FHZ*^s}?GBRM%aZjnn>OkrVR(6+F!@N;BfR#uh(klxObbMOc|`FS ze$>|1*5obtr*ExYSgpW}v0fz|le%x}03X0t2RJ=F)kEhKDat!v72b3$$I|rodtn|R zOxkqZUv|zwBi<$o;|JY9*HNKF08}6;Pz2Bgq#KBUf~Wwxf`l$3As|w8E%W_6JS>g% z9lQOF?fe*TZ?oI>&YYc@Ip;hhN6(yLT4|r3pACbNw{bdU0Mkf0f{LLXK}GEXiZTFJ z?Qwg18+Uhi!D1;gTwPu1z4+Lp7=%{*X`=Nh$^eQofT9ebC<7?U5mc8;Ia*!k%b3zWW<>h7NE&M@8P_eSI(jr2llq9tVm|b_+*E%xH zEAxUV};K z`uzMnQ;sCljWUWrSLY;>p`2a=Bs7tU=UH$+0J_6?dU|rGTJX)({OS2rS;ZZgH}(Em zb_zE)H$lS(=(@475ukNI29!}svG?C)BnZO@<1FTQeSHl`JkNq}1JM*XrQ8UMK`iU) z!LS`Opw2gjvl1c=e0_a|L0zOp++<-P`9n;TejZqgMI)g*oHzRB&rVMhsnSDw#c~AY zb%&#q(?m|8Mu5KVa3rikGI>p8jR0xg;RtwP_x=4H2J)K7GJw49Z~(MB33z*Z>&)c| zP2}JPplH|Qq1gVH zRx|;=iAwikB=MQYI(CJ3s&vx+ze*sMrc=G3VF#Brir9dG?qBf+;|CB2ST>t5|`z z^Ye2J$Anvd6y|5M0SJ$d`%QyW6U@idD&P)_Ws0ut^gML|-oZEH934D_y#`9?S4MGuC6V^l0U&`t%BSFOzx{S&{o;^J ziHB&OPlzQTj?X771-e`zR>I0)C?UOY%&((Yj;Z0i2Uf@LtfD$h`xJmo_p@o}#cOn6 zglDwv=!1VTHv16HjM5Idr$apf{ui3|V zIC02>)SxMfP>Laycq$-M_hQ9UDxkiF;?6toJm)8z@-8Tx^Xn5rI`7lII)E|&4fpH+ zH{C1^EP#{%Vh~C_U(+zi1Hqm86{`2v{Ulfi6om6-T`2LSGZ^KUl4oUcj!`Lvcn73l z{c8G!jc5zTN>T?)#Cs9u?6ngodqDXdez**0?6!B8vTb6_;7vc5+xNvC6LGYiW5r6 zkQ6J#f6pN}gV1gjNclzYDT>W+@8_#t`DGPIm1HcW@&Y{i=%XqKq@`N`y#Sfs6nGZT#JBqoCghVf@dLA; z|7mr3!W*wI;i~;y1qwotE>}Q$+zKQp0MZoH{-%`kTr3c2lz5O^!V3~wzQjk)rzJwG zggQ~|I`yPZm@t8OU(5i!!yY>|dbOtfV6@%_seP;Z4AqxOOG|x1eMu_lWg^Gi}{$Avk zEFW;&Ogh2Ki4NIzvO>g*k8io{k^bD3>YuMl^?5;Bf%7GG*Qfk{!sO>m`2W=4H`M=E zm9Llu@T+Yk4}bps&jL4h~*Bus3W0}zr?LxGYTbDsQpYHJZRQLK)u5?1h zODF(6OPHyo&W!)(&3AhpbfKF$l(tI7*Pp)WCTzW$`=@rMU@3yU`*07^fVzob97YVDS8yWRG26Q)dzsXrGGIsa!za3rma0-&L|ffNi4%yNHy^RoNns~2lai24*}uAk^Jq3Hpez=bGI zn2+@5A^w9;>P#I8&F=upQ~;JJ#Rc$b7N%OHL=X(>L{M}9r@YV3p9RFE6DG2<;#YOZ zRx^!L`u*$E3pE4TYaeK?e(J-TuVgiHe$M}gcv?LH`O4db3LxhN@1c09IslzOnlPH& z>`-PUr|0|Hgi2H108H+22-loM-Y-92nyCcxVrVQ9OdrqAT!SD5NwGpoi&@TQMgui# z2UEsF4f*-Wtf&ob@q7j7lePG*B52J(8yFfF>jM~U zK7f%g*jRv70u>L|3{?8~PykZ|NRP$M1+*0UmQVuel3;D+_9=itB#UT~9fa*w07I4d zT4Dd?_9=iNAil2jkBp4CqmMpXYZPTEz!+Px%gn!42Cwt`EUoXi)zvEN`hvTA1z=5D z!`MKzq*vX6-(lQca>*sE-+*ZItL_wli;%td-rMyY1`!U?3WKy$PdydC&kEvf7{Myy zTF$3?1;Bi;lP6*CV9-8B)mlCTv!~J3S6}UR-E~*YKYIsYwNU^pKzA-c)x{1w>@Y&@bI51;RMJ_ifzl80gpdz+9ZNslqaJ_9EC8h+^0^rg zIPky&@iFEO8YCZ~gkN^qW$fO@cKU2#2gxV`JFJoBhKGmUz`y{DOv6z`F=;-LrK5`2c!bmd^vIF5k+OAF8x*=$vN!Ox03<#HB$J|r9$HZe9SgN1nC_$vd zClw49T)nZs2nBe|MWDTLWd-mv_!|lSXK-*3;aG;4C?65>mF`>#Y3x*v0?^J^Cr_8e z3y;CQ<^$a236hMH)YkY7|jS}dbKnz8cA&>z1uFTZ$MZuvRpu^g`8 f4DR62)x)g=V|Br<-Py1p00000NkvXXu0mjf%Em