pax_global_header00006660000000000000000000000064145615155670014531gustar00rootroot0000000000000052 comment=a34bfb9e41af200dc48b4714ba8c720770c17531 lprint-1.3.1/000077500000000000000000000000001456151556700130435ustar00rootroot00000000000000lprint-1.3.1/CHANGES.md000066400000000000000000000102421456151556700144340ustar00rootroot00000000000000LPrint Change History ===================== v1.3.1 - February 9, 2024 ------------------------- - Updated "print-speed" support in TSPL driver (Issue #120 and #121) - Fixed lprint-modify man page (Issue #122 and #126) - Fixed snap documentation for connecting LPrint to Avahi. v1.3.0 - January 31, 2024 ------------------------- - Added new dithering algorithm to better support barcode printing with shaded content. - Added experimental Brother printer support (Issue #15) - Added basic TSPL printer support (Issue #54) - Added basic SEIKO printer support (Issue #58) - Added experimental Zebra CPCL printer support. - Added support for configuration files in "/etc", "/usr/local/etc", or "/Library/Application Support" (macOS). - Updated ZPL driver to report 'media-needed' reason when out of labels during a job. - Fixed copies support for ZPL printers (Issue #100) - Fixed darkness calculations for EPL and ZPL printers (Issue #104) v1.2.0 - December 31, 2022 -------------------------- - Documentation corrections (Issue #53, Issue #76) - Added snap server configuration. - Added `--with-systemd` configure option and install to `$prefix/lib/systemd/system` by default (Issue #50) - Added EPL2 and ZPL auto-typing support (Issue #64) - Changed the default log level for systemd to info (Issue #82) - Fixed macOS installer to start LPrint server (Issue #48) - Fixed configure script not using warning/preprocessor options in build (Issue #60) - Fixed printer renaming algorithm to not truncate the name (Issue #60) - Fixed missing "print-color-mode=bi-level" for bar code printing (Issue #76) - Fixed label mode support in EPL and ZPL drivers (Issue #79) - Fixed driver names for EPL printers (Issue #52) v1.1.0 - December 23, 2021 -------------------------- - Switched to PAPPL (Issue #20, #35) - Fixed `lprint default` and `lprint delete` not working (Issue #17, Issue #40) - Fixed server crashes on `SIGINT` (Issue #18) - Fixed the reported date and time information when no printers were added (Issue #26) - Fixed a startup bug on macOS (Issue #34) - Now support auto-detection of printer drivers and auto-add USB printers the first time LPrint is run. - Added the missing macOS binary package (Issue #33) - Added launchd and systemd service files for running lprint as a service. - Added support for Zebra/Eltron EPL2 printers (Issue #38) - Added support for 600dpi ZPL thermal transfer printers. - Added support for ZPL status/ready media updates. - Added support for test pages. - Temporarily removed support for DYMO LabelWriter Wireless printer (Issue #23) v1.0 - February 17, 2020 ------------------------ - First production release. v1.0rc1 - February 10, 2020 --------------------------- - Updated media documentation (Issue #13) - The `lprint options` command now reports both English and metric dimensions for all supported sizes (Issue #14) - Now support setting the default media source, top offset, tracking, and type values. - Now save and load next job-id value for each printer, along with the printer-config-change-[date-]time and printer-impressions-completed values. - Fixed some small memory leaks. v1.0b2 - January 26, 2020 ------------------------- - Added support for authentication of remote administrative requests (Issue #1) - Added support for managing printers via web browser (Issue #1) - The `add`, `default`, `delete`, and `modify` sub-commands now support the "-u" option (Issue #1) - Fixed an ASLR issue with some Linux compilers (Issue #5) - Added code to detach the Linux usblp kernel driver since apparently there are still Linux distributions shipping the old (and broken) usblp kernel driver (Issue #7) - Device errors are now logged to stderr (for `lprint devices`) or the server log (for `lprint server`) so that it is possible to see permission and other access errors (Issue #8) - Job attributes are now validated properly against the driver attributes (Issue #9) - Fixed an issue in server mode - a failed IPv6 listener would prevent the server from starting (Issue #12) - Added a "spool-directory" option for the `server` sub-command. - Added a spec file for building RPMs. v1.0b1 - January 15, 2020 ------------------------- - First public release. lprint-1.3.1/CODE_OF_CONDUCT.md000066400000000000000000000007471456151556700156520ustar00rootroot00000000000000Code of Conduct =============== My goal is to provide quality open source software that everyone can use. While I may not be able to address every request or accept every contribution to this project, I will do my best to develop and maintain it for the common good. As part of the open source community, I expect everyone to: - Be friendly and patient. - Be respectful, even if we disagree. - Be honest. - Be accepting of all people. - Fully explain your concerns, issues, or ideas. lprint-1.3.1/CONTRIBUTING.md000066400000000000000000000007541456151556700153020ustar00rootroot00000000000000Contributing to LPrint ====================== I'm happy to accept changes into LPrint. For new drivers, I ask that contributors provide me with a printer and supplies that would allow me to debug any issues *and/or* commit to providing assistance on any issues that are reported on Github. Contributions should be submitted as pull requests on the [LPrint Github project](https://github.com/michaelrsweet/lprint). New code MUST be supplied under the existing LPrint license (Apache 2.0). lprint-1.3.1/DOCUMENTATION.md000066400000000000000000000335641456151556700154110ustar00rootroot00000000000000LPrint Documentation ==================== LPrint v1.3.1 - Month DD, YYYY Copyright 2019-2024 by Michael R Sweet LPrint is licensed under the Apache License Version 2.0. See the files "LICENSE" and "NOTICE" for more information. Table of Contents ----------------- - [Overview](#overview) - [Installation](#installation) - [Basic Usage](#basic-usage) - [Adding Printers](#adding-printers) - [Printing Options](#printing-options) - [Setting Default Options](#setting-default-options) - [Running a Server](#running-a-server) - [Server Web Interface](#server-web-interface) - [Resources](#resources) Overview -------- LPrint is a label printer application for macOS® and Linux®. I wrote it in response to criticism that coming changes in CUPS will leave users of label printers in the cold - see [Apple CUPS Github issue #5271][APPLE5271]. [APPLE5271]: https://github.com/apple/cups/issues/5271 Basically, LPrint is a print spooler optimized for label printing. It accepts "raw" print data as well as PNG images (like those used for shipping labels by most shippers' current web APIs) and has built-in "drivers" to send the print data to USB and network-connected label printers. The spooler also tries to keep the labels moving by merging jobs over a single connection to the printer rather than starting and stopping like CUPS does to support a wider variety of printers. LPrint supports the full range of options and features supported by the embedded drivers - currently most DYMO, Seiko, TSPL, and Zebra EPL2/ZPL label printers. Whenever possible, LPrint will auto-detect the make and model of your printer and its installed capabilities. And you can configure the default values of all options as well as manually configure the media that is loaded in each printer. LPrint also offers a simple network server mode that makes your label printers appear as IPP Everywhere™/AirPrint™/Mopria™ printers on your network. Thus, any Android™, Chrome OS™, iOS®, Linux®, macOS®, or Windows® 10/11 client can use any label printer supported by LPrint. And you can, of course, send jobs from LPrint to an LPrint server on the network. Finally, LPrint offers command-line and web-based monitoring of printer and job status. Installation ------------ LPrint is published as a snap for Linux. Run the following commands to install it and start the server: sudo snap install core (if you haven't already done so) sudo snap install avahi sudo snap install lprint sudo snap connect lprint:raw-usb sudo snap connect lprint:avahi-control avahi:avahi-control sudo snap start lprint.lprint-server A package file is included with all source releases on Github for use on macOS 11 and higher for both Intel and Apple Silicon. If you need to install LPrint from source, you'll need a "make" program, a C99 compiler (Clang and GCC work), the CUPS developer files, and the PAPPL developer files. Once the prerequisites are installed on your system, use the following commands to install LPrint to "/usr/local/bin": ./configure make sudo make install The "configure" script supports the usual autoconf options - run: ./configure --help to get a list of configuration options. Basic Usage ----------- LPrint uses a single executable to perform all functions. The normal syntax is: lprint SUB-COMMAND [OPTIONS] [FILES] where "SUB-COMMAND" is one of the following: - "add": Add a printer - "cancel": Cancel one or more jobs - "default": Get or set the default printer - "delete": Delete a printer - "devices": List available printers - "drivers": List available drivers - "jobs": List queued jobs - "modify": Modify a printer - "options": Lists the supported options and values - "printers": List added printer queues - "server": Run in server mode - "shutdown": Shutdown a running server - "status": Show server or printer status - "submit": Submit one or more files for printing You can omit the sub-command if you just want to print something, for example: lprint labels.zpl The options vary based on the sub-command, but most commands support "-d" to specify a printer and "-o" to specify a named option with a value, for example: - `lprint -d myprinter labels.zpl`: Print a file to the printer named "myprinter". - `lprint -o media=na_index-4x6_4x6in label.png`: Print a shipping label image to a 4x6 label. - `lprint default -d myprinter`: Set "myprinter" as the default printer. You can find our more about each sub-command by reading its included man page, for example the following command will explain all of the supported options for the "submit" sub-command: man lprint-submit Adding Printers --------------- The "add" sub-command adds a new printer: lprint add -d PRINTER -v DEVICE-URI -m DRIVER-NAME "PRINTER" is the name you want to give the print queue. Printer names can contain spaces and special characters, but if you do any printing from scripts you probably want to limit yourself to ASCII letters, numbers, and punctuation. "DEVICE-URI" is a "usb:", "snmp:", or "socket:" URI for the printer. For USB-connected label printers, use the "devices" sub-command to discover the URI to use: lprint devices For network-connected printers, print the configuration summary on your label printer to discover its IP address. The device URI will then be "socket://" followed by the IP address. For example, a printer at address 192.168.0.42 will use the device URI "socket://192.168.0.42". Many network-connected label printers also support discovery via SNMP - use the "devices" sub-command to discover these printers' device URIs. Finally, the "DRIVER-NAME" is the name of the internal LPrint driver for the printer. Use the "drivers" sub-command to list the available drivers: lprint drivers For example, the common 4-inch Zebra printer uses the "zpl_4inch-203dpi-dt" driver: lprint add -d myprinter -v socket://192.168.0.42 -m zpl_4inch-203dpi-dt Printing Options ---------------- The following options are supported by the "submit" sub-command: - "-n NNN": Specifies the number of copies to produce. - "-o media=SIZE-NAME": Specifies the media size name using the PWG media size self-describing name (see below). - "-o media-source=ROLL-NAME": Specifies the roll to use such as 'main-roll' or 'alternate-roll'. - "-o media-top-offset=NNNin" or "-o media-top-offset=NNNmm": Specifies a printing offset from the top of the label. - "-o media-type=TYPE-NAME": Specifies a media type name such as 'labels', 'labels-continuous', or 'continuous'. - "-o orientation-requested=none": Prints in portrait or landscape orientation automatically. - "-o orientation-requested=portrait": Prints in portrait orientation. - "-o orientation-requested=landscape": Prints in landscape (90 degrees counter- clockwise) orientation. - "-o orientation-requested=reverse-portrait": Prints in reverse portrait (upside down) orientation. - "-o orientation-requested=reverse-landscape": Prints in reverse landscape (90 degrees clockwise) orientation. - "-o print-color-mode=bi-level": Prints black-and-white output with no shading. - "-o print-color-mode=monochrome": Prints grayscale output with shading as needed. - "-o print-content-optimize=auto": Automatically optimize printing based on content. - "-o print-content-optimize=graphic": Automatically optimize printing for graphics like lines and barcodes. - "-o print-content-optimize=photo": Automatically optimize printing for photos or other shaded images. - "-o print-content-optimize=text": Automatically optimize printing for text. - "-o print-content-optimize=text-and-graphic": Automatically optimize printing for text and graphics. - "-o print-darkness=NNN": Specifies a relative darkness from -100 (lightest) to 100 (darkest). - "-o print-quality=draft": Print using the lowest quality and fastest speed. - "-o print-quality=normal": Print using good quality and speed. - "-o print-quality=high": Print using the best quality and slowest speed. - "-o print-speed=NNNin" or "-o print-speed=NNNmm": Specifies the print speed in inches or millimeters per second. - "-o printer-resolution=NNNdpi": Specifies the print resolution in dots per inch. - "-t TITLE": Specifies the title of the job that appears in the list produced by the "jobs" sub-command. Media sizes use the PWG self-describing name format which looks like this: CLASS_NAME_WIDTHxLENGTHin CLASS_NAME_WIDTHxLENGTHmm "CLASS" is "na" for North American media sizes, "oe" for other cut label sizes in inches, "om" for other cut label sizes in millimeters, or "roll" for continuous roll sizes in inches or millimeters. "NAME" is a string of letters, numbers, dots ("."), and dashes ("-") describing the size. "WIDTH" and "LENGTH" are the width and length of the label or receipt you want to print. The trailing "in" or "mm" specifies the units in inches or millimeters, respectively. For example, a 4x6" shipping label uses the size name `na_4x6-index_4x6in` while a 1.25x3.5" address label uses `oe_address-label_1.25x3.5in` and a 50x200mm receipt uses `roll_receipt_50x200mm`. 2-up labels (where two labels are placed side-by-side) use the combined sizes of both labels. For example, a 2-up 0.5x1" multipurpose label uses the size name `oe_square-multipurpose-label_1x1in`. You can get a list of supported values for these options using the "options" sub-command: lprint options lprint options -d PRINTER Setting Default Options ----------------------- You can set the default values for each option with the "add" or "modify" sub-commands: lprint add -d PRINTER -v DEVICE-URI -m DRIVER-NAME -o OPTION=VALUE ... lprint modify -d PRINTER -o OPTION=VALUE ... In addition, you can configure the installed media and other printer settings using other "-o" options. For example, the following command configures the labels that are installed in a Dymo LabelWriter 450 Twin Turbo printer: lprint modify -d Dymo450TT \ -o media-ready=oe_address-label_1.25x3.5in,oe_shipping-label_2.125x4in Use the "options" sub-command to see which settings are supported for a particular printer. Running a Server ---------------- The "server" sub-command runs a standalone spooler. The following options control the server operation: - "-o admin-group=GROUP": Specifies a group to use for remote authentication. - "-o auth-service=SERVICE": Specifies a PAM service for remote authentication. - "-o listen-hostname=HOSTNAME": Sets the network hostname to resolve for listen addresses - "*" for the wildcard addresses, "localhost" to only listen for local print requests. - "-o log-file=FILENAME": Specifies a log file. - "-o log-file=-": Specifies that log entries are written to the standard error. - "-o log-file=syslog": Specifies that log entries are sent to the system log. - "-o log-level=LEVEL": Specifies the log level - "debug", "info", "warn", "error", or "fatal". - "-o server-hostname=HOSTNAME": Sets the network hostname to advertise. - "-o server-name=DNS-SD-NAME": Sets the DNS-SD name to advertise. - "-o server-options=OPTION[,...,OPTION]": Sets server options: - 'none': No options - 'dnssd-host': Use the hostname in printer DNS-SD names - 'no-multi-queue': Don't allow multiple queues - 'raw-socket': Enable raw socket (JetDirect) support for all printers - 'usb-printer': Enable the IPP-USB gadget for the default printer (Raspberry Pi) - 'no-web-interface': Disable the web interface - 'web-log': Enable web access of the log - 'web-network': Enable web-based network configuration - 'web-remote': Enable remote access for the web interface - 'web-security': Enable web-based security configuration - 'no-tls': Disable TLS (encryption) support - "-o server-port=NNN": Sets the network port number; the default is randomly assigned starting at 8000. - "-o spool-directory=DIRECTORY": Specifies the directory to store print files. When using the LPrint snap you can set these options using the `snap set` command, for example: sudo snap set lprint auth-service=other When using the LPrint package for macOS, you can set these options by creating the "/Library/Application Support/lprint.conf" file and listing the options one per line, for example: sudo vi "/Library/Application Support/lprint.conf" i auth-service=other listen-hostname=localhost :wq Other operating systems will look for the "lprint.conf" file in the "/etc" and "/usr/local/etc" directories. After changing these options you'll need to restart the server. On macOS the `launchctl` command is used: sudo launchctl stop org.msweet.lprint sudo launchctl start org.msweet.lprint Similarly, on Linux the `systemctl` command is used: sudo systemctl restart lprint.service If you've run the server by hand, just use the "shutdown" sub-command and then run the server again: sudo lprint shutdown sudo lprint server > *Note:* When you install the LPrint snap on Linux or the package on macOS, the > server is automatically run as root. When you install from source, a > `launchd` (macOS) or `systemd` (all others) service file is installed but not > activated - they can be used to automatically start LPrint when the system > boots. Server Web Interface -------------------- When you run a standalone spooler on a network hostname, a web interface can be enabled that allows you to add, modify, and delete printers, as well as setting the default printer. To require authentication for the various web interface operations, you set the PAM authentication service with the `-o auth-service=SERVICE` option. For example, to use the "cups" PAM service with LPrint, run: lprint server -o server-name=HOSTNAME -o server-port=NNN -o auth-service=cups By default, any user can authenticate web interface operations. To restrict access to a particular UNIX group, use the `-o admin-group=GROUP` option as well. Resources --------- The following additional resources are available: - LPrint home page: - LPrint Github project: lprint-1.3.1/LICENSE000066400000000000000000000261351456151556700140570ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. lprint-1.3.1/Makefile.in000066400000000000000000000137241456151556700151170ustar00rootroot00000000000000# # Makefile for LPrint, a Label Printer Application # # Copyright © 2019-2024 by Michael R Sweet # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Be silent... .SILENT: # Version number... LPRINT_VERSION = @LPRINT_VERSION@ # Languages we have localized messages for... LANGUAGES = de en es fr it # Programs and options... AR = @AR@ ARFLAGS = @ARFLAGS@ ASAN_OPTIONS = leak_check_at_exit=false CC = @CC@ CFLAGS = -I.. @CFLAGS@ $(CPPFLAGS) $(OPTIM) $(WARNINGS) CPPFLAGS = @CPPFLAGS@ CSFLAGS = -s "$${CODESIGN_IDENTITY:=-}" --timestamp @CSFLAGS@ INSTALL = @INSTALL@ LDFLAGS = @LDFLAGS@ $(OPTIM) LIBS = @LIBS@ -lm MKDIR = @MKDIR@ -p OPTIM = @OPTIM@ RANLIB = @RANLIB@ RM = @RM@ -f RMDIR = @RMDIR@ SHELL = /bin/sh WARNINGS = @WARNINGS@ # Directories... bindir = @bindir@ datadir = @datadir@ datarootdir = @datarootdir@ exec_prefix = @exec_prefix@ includedir = @includedir@ infodir = @infodir@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ privateinclude = @privateinclude@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ top_srcdir = @top_srcdir@ unitdir = @unitdir@ BUILDROOT = $(DSTROOT)$(RPM_BUILD_ROOT)$(DESTDIR) # Build commands... .c.o: echo Compiling $<... $(CC) $(CFLAGS) -c -o $@ $< # Targets... MAN1 = \ man/lprint-add.1 \ man/lprint-cancel.1 \ man/lprint-default.1 \ man/lprint-delete.1 \ man/lprint-devices.1 \ man/lprint-drivers.1 \ man/lprint-jobs.1 \ man/lprint-modify.1 \ man/lprint-options.1 \ man/lprint-printers.1 \ man/lprint-server.1 \ man/lprint-shutdown.1 \ man/lprint-status.1 \ man/lprint-submit.1 \ man/lprint.1 MAN5 = \ man/lprint.conf.5 OBJS = \ lprint.o \ lprint-brother.o \ lprint-common.o \ lprint-cpcl.o \ lprint-dymo.o \ lprint-epl2.o \ lprint-sii.o \ lprint-testpage.o \ lprint-tspl.o \ lprint-zpl.o TARGETS = \ lprint TESTOBJS = \ lprint-common.o \ testdither.o TESTTARGETS = \ testdither # Make everything... all: $(TARGETS) # Clean everything... clean: $(RM) $(TARGETS) $(OBJS) $(TESTTARGETS) $(TESTOBJS) # Clean everything and generated files distclean: clean $(RM) -r autom4te.cache $(RM) config.h config.log config.status $(RM) Makefile # Install everything... install: all echo "Installing lprint to $(BUILDROOT)$(bindir)..." $(INSTALL) -d -m 755 $(BUILDROOT)$(bindir) $(INSTALL) -c -m 755 lprint $(BUILDROOT)$(bindir) echo "Installing man pages to $(BUILDROOT)$(mandir)..." $(INSTALL) -d -m 755 $(BUILDROOT)$(mandir)/man1 for file in $(MAN1); do \ $(INSTALL) -c -m 644 $$file $(BUILDROOT)$(mandir)/man1; \ done $(INSTALL) -d -m 755 $(BUILDROOT)$(mandir)/man5 for file in $(MAN5); do \ $(INSTALL) -c -m 644 $$file $(BUILDROOT)$(mandir)/man5; \ done if test `uname` = Darwin; then \ echo "Installing launchd service to $(BUILDROOT)/Library/LaunchDaemons..."; \ $(INSTALL) -d -m 755 $(BUILDROOT)/Library/LaunchDaemons; \ $(INSTALL) -c -m 644 org.msweet.lprint.plist $(BUILDROOT)/Library/LaunchDaemons; \ elif test "x$(unitdir)" != x; then \ echo "Installing systemd service to $(BUILDROOT)$(unitdir)..."; \ $(INSTALL) -d -m 755 $(BUILDROOT)$(unitdir); \ $(INSTALL) -c -m 644 lprint.service $(BUILDROOT)$(unitdir); \ fi # Test everything... test: $(TARGETS) $(TESTTARGETS) # LPrint program... lprint: $(OBJS) echo Linking $@... $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) if test `uname` = Darwin; then \ echo "Code-signing $@..."; \ codesign $(CSFLAGS) -i org.msweet.lprint $@; \ fi # Dither test program... testdither: $(TESTOBJS) echo Linking $@... $(CC) $(LDFLAGS) -o $@ $(TESTOBJS) $(LIBS) if test `uname` = Darwin; then \ echo "Code-signing $@..."; \ codesign $(CSFLAGS) -i org.msweet.testdither $@; \ fi # Generate resource headers from the corresponding files in the resource # directory... resheaders: for file in lprint lprint-large lprint-small; do \ echo "Generating $$file-png.h from $$file.png..."; \ pappl-makeresheader static-resources/$$file.png >static-resources/$$file-png.h; \ done echo "Generating lprint-css.h from lprint.css..." pappl-makeresheader static-resources/lprint.css >static-resources/lprint-css.h for lang in $(LANGUAGES); do \ echo "Generating lprint-$$lang-strings.h from lprint-$$lang.strings..."; \ pappl-makeresheader static-resources/lprint-$$lang.strings >static-resources/lprint-$$lang-strings.h; \ done # Dependencies... $(OBJS) $(TESTOBJS): config.h lprint.h Makefile lprint.o: \ lprint-brother.h \ lprint-cpcl.h \ lprint-dymo.h \ lprint-epl2.h \ lprint-sii.h \ lprint-tspl.h \ lprint-zpl.h \ static-resources/lprint-css.h \ static-resources/lprint-png.h \ static-resources/lprint-large-png.h \ static-resources/lprint-small-png.h \ static-resources/lprint-de-strings.h \ static-resources/lprint-en-strings.h \ static-resources/lprint-es-strings.h \ static-resources/lprint-fr-strings.h \ static-resources/lprint-it-strings.h # Notarize the lprint executable and make the macOS package... # # Set the APPLEID, CODESIGN_IDENTITY, PKGSIGN_IDENTITY, and TEAMID environment # variables from the Apple developer pages. macos: echo "Creating archive for notarization..." rm -f lprint.zip zip -v9 lprint.zip lprint echo Notarizing application xcrun notarytool submit lprint.zip \ --apple-id "$${APPLEID}" \ --keychain-profile "AC_$${TEAMID}" \ --team-id "$${TEAMID}" \ --wait rm -f lprint.zip echo "Creating the macOS package..." rm -rf /private/tmp/lprint-$(LPRINT_VERSION) make BUILDROOT="/private/tmp/lprint-$(LPRINT_VERSION)" install pkgbuild --root /private/tmp/lprint-$(LPRINT_VERSION) \ --identifier org.msweet.lprint \ --version $(LPRINT_VERSION) \ --scripts macos-scripts \ --min-os-version 11.0 \ --sign "$${PKGSIGN_IDENTITY}" --timestamp \ lprint-$(LPRINT_VERSION)-macos.pkg lprint-1.3.1/NOTICE000066400000000000000000000001201456151556700137400ustar00rootroot00000000000000LPrint - A Label Printer Application Copyright © 2019-2024 by Michael R Sweet lprint-1.3.1/README.md000066400000000000000000000050441456151556700143250ustar00rootroot00000000000000LPrint - A Label Printer Application ==================================== LPrint implements printing for a variety of common label and receipt printers connected via network or USB. Features include: - A single executable handles spooling, status, and server functionality. - Multiple printer support. - Each printer implements an IPP Everywhere™ print service and is compatible with the driverless printing support in Android™, Chrome OS™, iOS®, Linux®, macOS®, and Windows® 10/11 clients. - Each printer can support options such as label modes, tear-off offsets, media tracking, media offset, print darkness, resolution, roll selection, and speed. - Each printer can directly print "raw", Apple/PWG Raster, and/or PNG files. - Each printer automatically recovers from out-of-media, power loss, and disconnected/bad cable issues. For more information, see the file "DOCUMENTATION.md", the man pages in the "man" directory, and/or the LPrint project page at . > Note: Please use the Github issue tracker to report issues or request > features/improvements in LPrint: > > Requirements ------------ LPrint depends on: - A POSIX-compliant "make" program (both GNU and BSD make are known to work), - A C99 compiler (both Clang and GCC are known to work), - [PAPPL](https://www.msweet.org/pappl) 1.2 or later. - [CUPS](https://openprinting.github.io/cups) 2.4 or later or [libcups](https://github.com/OpenPrinting/libcups) 3.0 or later. Supported Printers ------------------ The following printers are currently supported: - DYMO LabelWriter printers - Seiko Instruments SLP printers - TSPL/TSPL2 printers such as the Rollo X1038 - Zebra/Eltron EPL2 printers - Zebra ZPL printers Additional drivers for Brother PT/QL and Zebra CPCL printers can be enabled using the `--enable-experimental` configure option, however they are untested and/or not fully functional. Other label printers will be added as time and access to printers permits. Standards --------- Through PAPPL, LPrint implements PWG 5100.14-2020: IPP Everywhere™ and the IPP Label Printing Extensions v1.0 for each printer, and has a partial implementation of PWG 5100.22-2019: IPP System Service v1.0 for managing the print queues and default printer. Legal Stuff ----------- LPrint is Copyright © 2019-2024 by Michael R Sweet. LPrint is licensed under the Apache License Version 2.0. See the files "LICENSE" and "NOTICE" for more information. LPrint is based loosely on the "rastertolabel.c" code from CUPS. lprint-1.3.1/SECURITY.md000066400000000000000000000134051456151556700146370ustar00rootroot00000000000000Security Policy =============== This file describes how security issues are reported and handled, and what the expectations are for security issues reported to this project. Reporting a Security Bug ------------------------ For the purposes of this project, a security bug is a software defect that allows a *local or remote user* to gain unauthorized access or privileges on the host computer or to cause the software to crash. Such defects should be reported to the project security advisory page at . Alternately, security bugs can be reported to "security AT msweet.org" using the PGP public key below. Expect a response within 5 business days. Any proposed embargo date should be at least 30 days and no more than 90 days in the future. > *Note:* If you've found a software defect that allows a *program* to gain > unauthorized access or privileges on the host computer or causes the program > to crash, that defect should be reported as an ordinary project issue at > . Responsible Disclosure ---------------------- With *responsible disclosure*, a security issue (and its fix) is disclosed only after a mutually-agreed period of time (the "embargo date"). The issue and fix are shared amongst and reviewed by the key stakeholders (Linux distributions, OS vendors, etc.) and the CERT/CC. Fixes are released to the public on the agreed-upon date. > Responsible disclosure applies only to production releases. A security > vulnerability that only affects unreleased code can be fixed immediately > without coordination. Vendors *should not* package and release unstable > snapshots, beta releases, or release candidates of this software. Supported Versions ------------------ All production releases of this software are subject to this security policy. A production release is tagged and given a semantic version number of the form: MAJOR.MINOR.PATCH where "MAJOR" is an integer starting at 1 and "MINOR" and "PATCH" are integers starting at 0. A feature release has a "PATCH" value of 0, for example: 1.0.0 1.1.0 2.0.0 Beta releases and release candidates are *not* prodution releases and use semantic version numbers of the form: MAJOR.MINORbNUMBER MAJOR.MINORrcNUMBER where "MAJOR" and "MINOR" identify the new feature release version number and "NUMBER" identifies a beta or release candidate number starting at 1, for example: 1.0b1 1.0b2 1.0rc1 PGP Public Key -------------- The following PGP public key can be used for signing security messages. ``` -----BEGIN PGP PUBLIC KEY BLOCK----- Comment: GPGTools - https://gpgtools.org mQINBF6L0RgBEAC8FTqc/1Al+pWW+ULE0OB2qdbiA2NBjEm0X0WhvpjkqihS1Oih ij3fzFxKJ+DgutQyDb4QFD8tCFL0f0rtNL1Iz8TtiAJjvlhL4kG5cdq5HYEchO10 qFeZ1DqvnHXB4pbKouEQ7Q/FqB1PG+m6y2q1ntgW+VPKm/nFUWBCmhTQicY3FOEG q9r90enc8vhQGOX4p01KR0+izI/g+97pWgMMj5N4zHuXV/GrPhlVgo3Wn1OfEuX4 9vmv7GX4G17Me3E3LOo0c6fmPHJsrRG5oifLpvEJXVZW/RhJR3/pKMPSI5gW8Sal lKAkNeV7aZG3U0DCiIVL6E4FrqXP4PPj1KBixtxOHqzQW8EJwuqbszNN3vp9w6jM GvGtl8w5Qrw/BwnGC6Dmw+Qv04p9JRY2lygzZYcKuwZbLzBdC2CYy7P2shoKiymX ARv+i+bUl6OmtDe2aYaqRkNDgJkpuVInBlMHwOyLP6fN2o7ETXQZ+0a1vQsgjmD+ Mngkc44HRnzsIJ3Ga4WwW8ggnAwUzJ/DgJFYOSbRUF/djBT4/EFoU+/kjXRqq8/d c8HjZtz2L27njmMw68/bYmY1TliLp50PXGzJA/KeY90stwKtTI0ufwAyi9i9BaYq cGbdq5jnfSNMDdKW2kLCNTQeUWSSytMTsdU0Av3Jrv5KQF8x5GaXcpCOTwARAQAB tExNaWNoYWVsIFN3ZWV0IChzZWN1cml0eUBtc3dlZXQub3JnKSAoU2VjdXJpdHkg UEdQIEtleSkgPHNlY3VyaXR5QG1zd2VldC5vcmc+iQJUBBMBCgA+FiEEOElfSXYU h91AF0sBpZiItz2feQIFAl6L0RgCGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQAC HgECF4AACgkQpZiItz2feQIhjhAAqZHuQJkPBsAKUvJtPiyunpR6JENTUIDxnVXG nue+Zev+B7PzQ7C4CAx7vXwuWTt/BXoyQFKRUrm+YGiBTvLYQ8fPqudDnycSaf/A n01Ushdlhyg1wmCBGHTgt29IkEZphNj6BebRd675RTOSD5y14jrqUb+gxRNuNDa5 ZiZBlBE4A8TV6nvlCyLP5oXyTvKQRFCh4dEiL5ZvpoxnhNvJpSe1ohL8iJ9aeAd5 JdakOKi8MmidRPYC5IldXwduW7VC7dtqSiPqT5aSN0GJ8nIhSpn/ZkOEAPHAtxxa 0VgjltXwUDktu74MUUghdg2vC1df2Z+PqHLsGEqOmxoBIJYXroIqSEpO3Ma7hz0r Xg1AWHMR/xxiLXLxgaZRvTp7AlaNjbqww8JDG8g+nDIeGsgIwWN/6uPczledvDQa HtlMfN97i+rt6sCu13UMZHpBKOGg7eAGRhgpOwpUqmlW1b+ojRHGkmZ8oJSE7sFT gzSGNkmfVgA1ILl0mi8OBVZ4jlUg6EgVsiPlzolH92iscK7g50PdjzpQe0m3gmcL dpOmSL8Fti05dPfamJzIvJd28kMZ6yMnACKj9rq/VpfgYBLK8dbNUjEOQ2oq7PyR Ye/LE1OmAJwfZQkyQNI8yAFXoRJ8u3/bRb3SPvGGWquGBDKHv2K1XiCW65uyLe5B RNJWmme5Ag0EXovRGAEQAJZMFeIMt/ocLskrp89ZyBTTiavFKn9+QW7C2Mb36A73 J2g9vRFBSRizb+t8lSzP/T1GbKS0cEmfEpQppWImTbOMV6ZgxrM0IUy1Yd7Kyc0K oNMZvykRYwVMzxB5hiQ88kCLfqTNCveIvu1xcB9pWkf+cuDmGCxA3I+yc3Eh/SOP urDsHObt7fyEmJpSxCXlMFHRCuWyGXhMNvhR186t9mANW0PyxKJ8efr+2Vhm1+pA Vk9JESac/lREvx9PVFmlPdqgqRkQ0TQB5+ROo9Wy77cxQr5+rvSZZff630I1YgZf Ph6xOV1/q6vJ3RBNA2nPSTjPeeWQ7pTn7PZGJwCjIUjhMbO+EJVKUJNOAEg033mG tLfbFUYdhA/dRgFuKz90loCMfsnf3e4o/TFydSHUuwBUtOWkL1BBWEbk95M/Zr00 w5fD9knas1u5Lc4ogXzTFPnvJ6hM1RAFJEd+FYzJZIvzwrIx4Ag1DOKViVBpeLTu HWj+xckEgvxEBglplALzfSIJ0CLQSNL8iMFbzCnPeUoQfPkqu37KHrB9syAA06Tb qw1Ax0qBqKInGIgBd0w6dFLF3s04xVcPAXWyJ0w4I7h2bs+aD6YwwK6xxCtXxtN5 Q1LQM8s3tKNXER3mZ8zfwgwjsdLVwhXhysFi6Dlkvk/Vrbn1QDfJnzq+F9LsGRGb ABEBAAGJAjwEGAEKACYWIQQ4SV9JdhSH3UAXSwGlmIi3PZ95AgUCXovRGAIbDAUJ B4YfgAAKCRClmIi3PZ95AhDZD/40fShzDS/smZZL0oXN4GgZ62FrXWBdLjontkXo d8hDh1wJZwqsLVbtO2Gu0CPeH9GclQ3bYsR19sGMM4FDgjMu57O/TU6GZl2Ywcjh ayhRTHyAq/BKZn71AM0N7LS8MdNTaLbTbzEu5oGbAmOVv5f0SUnQoGxbeF8ih5bo hR3ZcORujWMgnymL3+cerNyIDQAtfMAUTfpVcwem4CvquA9Wjtur8YN1t+N7I3o2 eMTNSyNUL9Yx3NxbyJ0yrrMvASo+ZVRaPW5+ET9Iqd68ILSY04Gnar3URJssggX8 +cuyEbP9bAG8qYqcr2aSC2dW84mL/RnZGR//1dfS0Ugk6Osj0LSF5i+mz0CbIjYQ PKgLlgpycuGZBC5kG3RWWfanM0HxPDx10a7vEWA1A5Q+csx4yi3CW/giC1zAdhUO cJ1l4Uj/oxpGeLN7BnT/2NzU/px2fpbaG+xU4HlwjzFM2cIOUIohHFhdvFZbFIIA mePqTBnEB3HtXYRTgMoYDXLWhlOXjyVnMR45WDfvEA3KqbAz6sNMtaOJ6rHBWnR1 1YbpvDWUeaGSLXBoGyo3RgTrN9jON8lE/oUxFobnEdfZGD+uwIniylc5rw3+VkBU +QGZDfgPgxjSmKsWq1cK6rNfBacGYrdyqf90VemEsvR8r0Ump0RPzBMlAAq0Xkup WkiKlA== =0GzT -----END PGP PUBLIC KEY BLOCK----- ``` lprint-1.3.1/config.guess000077500000000000000000001412021456151556700153630ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-05-25' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # Just in case it came from the environment. GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case $UNAME_VERSION in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; sun4*:SunOS:*:*) case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case `/bin/arch` in sun3) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if test -x /usr/bin/lslpp ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if test "$HP_ARCH" = hppa2.0w then set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then ABI=64 sed 's/^ //' << EOF > "$dummy.c" #ifdef __i386__ ABI=x86 #else #ifdef __ILP32__ ABI=x32 #endif #endif EOF cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` eval "$cc_set_abi" case $ABI in x86) CPU=i686 ;; x32) LIBCABI=${LIBC}x32 ;; esac fi GUESS=$CPU-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. GUESS=i386-sequent-sysv4 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; ppc:Haiku:*:*) # Haiku running on Apple PowerPC GUESS=powerpc-apple-haiku ;; *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) GUESS=$UNAME_MACHINE-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "${cputype-}" = 386; then UNAME_MACHINE=i386 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) #include #if defined (BSD) #if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); #else #if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); #else printf ("vax-dec-bsd\n"); exit (0); #endif #endif #else printf ("vax-dec-bsd\n"); exit (0); #endif #else #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: lprint-1.3.1/config.h.in000066400000000000000000000006361456151556700150730ustar00rootroot00000000000000// // Configuration header file for LPrint, a Label Printer Utility // // Copyright © 2019-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // // Version number #define LPRINT_VERSION "" #define LPRINT_MAJOR_VERSION 1 #define LPRINT_MINOR_VERSION 3 #define LPRINT_PATCH_VERSION 0 // Enable experimental drivers? #define LPRINT_EXPERIMENTAL 0 lprint-1.3.1/config.sub000077500000000000000000001051161456151556700150320ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x$basic_os != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read kernel os <&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os in linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ | linux-musl* | linux-relibc* | linux-uclibc* ) ;; uclinux-uclibc* ) ;; -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 exit 1 ;; kfreebsd*-gnu* | kopensolaris*-gnu*) ;; vxworks-simlinux | vxworks-simwindows | vxworks-spe) ;; nto-qnx*) ;; os2-emx) ;; *-eabi* | *-gnueabi*) ;; -*) # Blank kernel with real OS is always fine. ;; *-*) echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: lprint-1.3.1/configure000077500000000000000000004516511456151556700147660ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for lprint 1.3.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="as_nop=: if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: https://github.com/michaelrsweet/lprint/issues about $0: your system, including any error possibly output before $0: this message. Then install a modern shell, or manually $0: run the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='lprint' PACKAGE_TARNAME='lprint' PACKAGE_VERSION='1.3.1' PACKAGE_STRING='lprint 1.3.1' PACKAGE_BUGREPORT='https://github.com/michaelrsweet/lprint/issues' PACKAGE_URL='https://michaelrsweet.github.io/lprint' ac_subst_vars='LTLIBOBJS LIBOBJS WARNINGS OPTIM CSFLAGS unitdir CUPSCONFIG PKGCONFIG INSTALL ARFLAGS RM MKDIR AR RANLIB OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build LPRINT_VERSION target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_systemd enable_experimental enable_debug enable_maintainer enable_sanitizer with_ldflags ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures lprint 1.3.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/lprint] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of lprint 1.3.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-experimental turn on experimental drivers, default=no --enable-debug turn on debugging, default=no --enable-maintainer turn on maintainer mode, default=no --enable-sanitizer build with AddressSanitizer, default=no Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-systemd=PATH install systemd service file, default=auto --with-ldflags=... Specify additional LDFLAGS Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . lprint home page: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF lprint configure 1.3.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac 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 lprint $as_me 1.3.1, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' // Does the compiler advertise C99 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' // Does the compiler advertise C11 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " # Auxiliary files required by this configure script. ac_aux_files="config.guess config.sub" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" LPRINT_VERSION="1.3.1" printf "%s\n" "#define LPRINT_VERSION \"$LPRINT_VERSION\"" >>confdefs.h LPRINT_MAJOR_VERSION="$(echo 1.3.1 | awk -F. '{print $1}')" LPRINT_MINOR_VERSION="$(echo 1.3.1 | awk -F. '{print $2}')" LPRINT_PATCH_VERSION="$(echo 1.3.1 | awk -F. '{print $3}')" printf "%s\n" "#define LPRINT_MAJOR_VERSION $LPRINT_MAJOR_VERSION" >>confdefs.h printf "%s\n" "#define LPRINT_MINOR_VERSION $LPRINT_MINOR_VERSION" >>confdefs.h printf "%s\n" "#define LPRINT_PATCH_VERSION $LPRINT_PATCH_VERSION" >>confdefs.h # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac host_os_name=$(echo $host_os | sed -e '1,$s/[0-9.]*$//g') host_os_version=$(echo $host_os | sed -e '1,$s/^[^0-9.]*//g' | awk -F. '{print $1 $2}') # Linux often does not yield an OS version we can use... if test "x$host_os_version" = x then : host_os_version="0" fi CFLAGS="${CFLAGS:=}" CXXFLAGS="${CXXFLAGS:=}" LDFLAGS="${LDFLAGS:=}" LIBS="${LIBS:=}" if test $prefix = NONE then : prefix=$ac_default_prefix fi if test "$exec_prefix" = "NONE" then : exec_prefix="$prefix" fi if test "$bindir" = "\${exec_prefix}/bin" then : bindir="$exec_prefix/bin" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else $as_nop ac_file='' fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_AR+y} then : printf %s "(cached) " >&6 else $as_nop case $AR in [\\/]* | ?:[\\/]*) ac_cv_path_AR="$AR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_AR="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi AR=$ac_cv_path_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "mkdir", so it can be a program name with args. set dummy mkdir; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_MKDIR+y} then : printf %s "(cached) " >&6 else $as_nop case $MKDIR in [\\/]* | ?:[\\/]*) ac_cv_path_MKDIR="$MKDIR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_MKDIR="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MKDIR=$ac_cv_path_MKDIR if test -n "$MKDIR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR" >&5 printf "%s\n" "$MKDIR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_RM+y} then : printf %s "(cached) " >&6 else $as_nop case $RM in [\\/]* | ?:[\\/]*) ac_cv_path_RM="$RM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_RM="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi RM=$ac_cv_path_RM if test -n "$RM"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 printf "%s\n" "$RM" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "$ac_cv_prog_ranlib" = ":" then : ARFLAGS="crs" else $as_nop ARFLAGS="cr" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for install-sh script" >&5 printf %s "checking for install-sh script... " >&6; } INSTALL="$(pwd)/install-sh" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using $INSTALL" >&5 printf "%s\n" "using $INSTALL" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PKGCONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $PKGCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_PKGCONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKGCONFIG=$ac_cv_path_PKGCONFIG if test -n "$PKGCONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 printf "%s\n" "$PKGCONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_path_PKGCONFIG"; then ac_pt_PKGCONFIG=$PKGCONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_ac_pt_PKGCONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $ac_pt_PKGCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKGCONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG if test -n "$ac_pt_PKGCONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5 printf "%s\n" "$ac_pt_PKGCONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_pt_PKGCONFIG" = x; then PKGCONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKGCONFIG=$ac_pt_PKGCONFIG fi else PKGCONFIG="$ac_cv_path_PKGCONFIG" fi if $PKGCONFIG --exists pappl --atleast-version=1.2 then : CFLAGS="$CFLAGS $($PKGCONFIG --cflags pappl)" LIBS="$LIBS $($PKGCONFIG --libs pappl)" else $as_nop as_fn_error $? "PAPPL 1.2 or later is required for LPrint." "$LINENO" 5 fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cups-config", so it can be a program name with args. set dummy ${ac_tool_prefix}cups-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_CUPSCONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $CUPSCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_CUPSCONFIG="$CUPSCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_CUPSCONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CUPSCONFIG=$ac_cv_path_CUPSCONFIG if test -n "$CUPSCONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUPSCONFIG" >&5 printf "%s\n" "$CUPSCONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_path_CUPSCONFIG"; then ac_pt_CUPSCONFIG=$CUPSCONFIG # Extract the first word of "cups-config", so it can be a program name with args. set dummy cups-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_ac_pt_CUPSCONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $ac_pt_CUPSCONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_CUPSCONFIG="$ac_pt_CUPSCONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_CUPSCONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_CUPSCONFIG=$ac_cv_path_ac_pt_CUPSCONFIG if test -n "$ac_pt_CUPSCONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CUPSCONFIG" >&5 printf "%s\n" "$ac_pt_CUPSCONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_pt_CUPSCONFIG" = x; then CUPSCONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CUPSCONFIG=$ac_pt_CUPSCONFIG fi else CUPSCONFIG="$ac_cv_path_CUPSCONFIG" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CUPS library v2.4 or higher" >&5 printf %s "checking for CUPS library v2.4 or higher... " >&6; } if $PKGCONFIG --exists cups3 then : CUPS_VERSION="$($PKGCONFIG --modversion cups3)" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, v$CUPS_VERSION" >&5 printf "%s\n" "yes, v$CUPS_VERSION" >&6; } CFLAGS="$CFLAGS $($PKGCONFIG --cflags cups3)" LIBS="$LIBS $($PKGCONFIG --libs cups3)" elif $PKGCONFIG --exists cups then : CUPS_VERSION="$($PKGCONFIG --modversion cups)" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, v$CUPS_VERSION" >&5 printf "%s\n" "yes, v$CUPS_VERSION" >&6; } CFLAGS="$CFLAGS $($PKGCONFIG --cflags cups)" LIBS="$LIBS $($PKGCONFIG --libs cups)" elif test "x$CUPSCONFIG" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } as_fn_error $? "CUPS 2.4 or later is required for LPrint." "$LINENO" 5 else $as_nop CUPS_VERSION="$($CUPSCONFIG --version)" case "$CUPS_VERSION" in #( 1.* | 2.0* | 2.1* | 2.2* | 2.3*) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } as_fn_error $? "CUPS 2.4 or later is required for LPrint." "$LINENO" 5 ;; #( *) : ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, v$CUPS_VERSION" >&5 printf "%s\n" "yes, v$CUPS_VERSION" >&6; } CFLAGS="$CFLAGS $($CUPSCONFIG --cflags)" LDFLAGS="$LDFLAGSS $($CUPSCONFIG --ldflags)" LIBS="$LIBS $($CUPSCONFIG --image --libs)" fi unitdir="" # Check whether --with-systemd was given. if test ${with_systemd+y} then : withval=$with_systemd; case $withval in #( yes) : with_systemd=yes unitdir="\$(prefix)/lib/systemd/system" ;; #( no) : with_systemd=no ;; #( *) : with_systemd=yes unitdir="$withval" ;; esac else $as_nop if test $host_os_name != darwin then : with_systemd=yes unitdir="\$(prefix)/lib/systemd/system" fi fi # Check whether --enable-experimental was given. if test ${enable_experimental+y} then : enableval=$enable_experimental; fi if test x$enable_experimental = xyes then : printf "%s\n" "#define LPRINT_EXPERIMENTAL 1" >>confdefs.h fi # Check whether --enable-debug was given. if test ${enable_debug+y} then : enableval=$enable_debug; fi # Check whether --enable-maintainer was given. if test ${enable_maintainer+y} then : enableval=$enable_maintainer; fi # Check whether --enable-sanitizer was given. if test ${enable_sanitizer+y} then : enableval=$enable_sanitizer; fi if test x$enable_debug = xyes then : OPTIM="-g" CSFLAGS="" else $as_nop OPTIM="-g -Os" CSFLAGS="-o runtime" fi WARNINGS="" if test -n "$GCC" then : if test x$enable_sanitizer = xyes then : # Use -fsanitize=address with debugging... OPTIM="-g -fsanitize=address" else $as_nop # Otherwise use the Fortify enhancements to catch any unbounded # string operations... CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=2" fi WARNINGS="-Wall -Wunused" for warning in char-subscripts format-truncation format-y2k switch unused-result; do { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-$warning" >&5 printf %s "checking whether compiler supports -Wno-$warning... " >&6; } OLDCFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wno-$warning -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } WARNINGS="$WARNINGS -Wno-$warning" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$OLDCFLAGS" done if test x$enable_maintainer = xyes then : WARNINGS="$WARNINGS -Werror" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fPIE" >&5 printf %s "checking whether compiler supports -fPIE... " >&6; } OLDCFLAGS="$CFLAGS" case "$host_os_name" in #( darwin*) : CFLAGS="$CFLAGS -fPIC -fPIE -Wl,-pie" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : OLDCFLAGS="-fPIC $OLDCFLAGS" LDFLAGS="-fPIE -Wl,-pie $LDFLAGS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; #( *) : CFLAGS="$CFLAGS -fPIC -fPIE -pie" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : OLDCFLAGS="-fPIC $OLDCFLAGS" LDFLAGS="-fPIE -pie $LDFLAGS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; #( *) : ;; esac CFLAGS="$OLDCFLAGS" case "$host_os_name" in #( linux*) : CPPFLAGS="$CPPFLAGS -D__USE_MISC -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64" ;; #( darwin*) : if test "$host_os_version" -ge 200 -a x$enable_debug != xyes then : # macOS 11.0 and higher support the Apple Silicon (arm64) CPUs OPTIM="$OPTIM -mmacosx-version-min=11.0 -arch x86_64 -arch arm64" elif test x$enable_debug != xyes then : OPTIM="$OPTIM -mmacosx-version-min=11.0 -arch x86_64" fi ;; #( *) : ;; esac fi # Check whether --with-ldflags was given. if test ${with_ldflags+y} then : withval=$with_ldflags; LDFLAGS="$withval $LDFLAGS" fi ac_config_files="$ac_config_files Makefile lprint.service" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by lprint $as_me 1.3.1, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to . lprint home page: ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ lprint config.status 1.3.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "lprint.service") CONFIG_FILES="$CONFIG_FILES lprint.service" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi lprint-1.3.1/configure.ac000066400000000000000000000170501456151556700153340ustar00rootroot00000000000000dnl dnl Configuration script for LPrint, a Label Printer Application dnl dnl Copyright © 2019-2024 by Michael R Sweet dnl dnl Licensed under Apache License v2.0. See the file "LICENSE" for more dnl information. dnl dnl We need at least autoconf 2.60... AC_PREREQ(2.60) dnl Package name and version... AC_INIT([lprint], [1.3.1], [https://github.com/michaelrsweet/lprint/issues], [lprint], [https://michaelrsweet.github.io/lprint]) AC_CONFIG_HEADERS([config.h]) LPRINT_VERSION="AC_PACKAGE_VERSION" AC_SUBST([LPRINT_VERSION]) AC_DEFINE_UNQUOTED([LPRINT_VERSION], "$LPRINT_VERSION", [Version number]) LPRINT_MAJOR_VERSION="$(echo AC_PACKAGE_VERSION | awk -F. '{print $1}')" LPRINT_MINOR_VERSION="$(echo AC_PACKAGE_VERSION | awk -F. '{print $2}')" LPRINT_PATCH_VERSION="$(echo AC_PACKAGE_VERSION | awk -F. '{print $3}')" AC_DEFINE_UNQUOTED([LPRINT_MAJOR_VERSION], $LPRINT_MAJOR_VERSION, [Major version number]) AC_DEFINE_UNQUOTED([LPRINT_MINOR_VERSION], $LPRINT_MINOR_VERSION, [Minor version number]) AC_DEFINE_UNQUOTED([LPRINT_PATCH_VERSION], $LPRINT_PATCH_VERSION, [Patch version number]) dnl This line is provided to ensure that you don't run the autoheader program dnl against this project. Doing so is completely unsupported and WILL cause dnl problems! AH_TOP([#error "Somebody ran autoheader on this project which is unsupported and WILL cause problems."]) dnl Get the build and host platforms and split the host_os value AC_CANONICAL_BUILD AC_CANONICAL_HOST [host_os_name=$(echo $host_os | sed -e '1,$s/[0-9.]*$//g')] [host_os_version=$(echo $host_os | sed -e '1,$s/^[^0-9.]*//g' | awk -F. '{print $1 $2}')] # Linux often does not yield an OS version we can use... AS_IF([test "x$host_os_version" = x], [ host_os_version="0" ]) dnl Compiler options... CFLAGS="${CFLAGS:=}" CXXFLAGS="${CXXFLAGS:=}" LDFLAGS="${LDFLAGS:=}" LIBS="${LIBS:=}" dnl Figure out prefix - needed for systemd unit dir AS_IF([test $prefix = NONE], [ prefix=$ac_default_prefix ], []) dnl Fix "exec_prefix" variable if it hasn't been specified... AS_IF([test "$exec_prefix" = "NONE"], [ exec_prefix="$prefix" ]) dnl Fix "bindir" variable... AS_IF([test "$bindir" = "\${exec_prefix}/bin"], [ bindir="$exec_prefix/bin" ]) dnl Standard programs... AC_PROG_CC AC_PROG_RANLIB AC_PATH_PROG([AR], [ar]) AC_PATH_PROG([MKDIR], [mkdir]) AC_PATH_PROG([RM], [rm]) dnl Figure out the correct "ar" command flags... AS_IF([test "$ac_cv_prog_ranlib" = ":"], [ ARFLAGS="crs" ], [ ARFLAGS="cr" ]) AC_SUBST([ARFLAGS]) dnl install-sh AC_MSG_CHECKING([for install-sh script]) INSTALL="$(pwd)/install-sh" AC_SUBST([INSTALL]) AC_MSG_RESULT([using $INSTALL]) dnl Check for pkg-config, which is used for some other tests later on... AC_PATH_TOOL([PKGCONFIG], [pkg-config]) dnl PAPPL library... AS_IF([$PKGCONFIG --exists pappl --atleast-version=1.2], [ CFLAGS="$CFLAGS $($PKGCONFIG --cflags pappl)" LIBS="$LIBS $($PKGCONFIG --libs pappl)" ], [ AC_MSG_ERROR([PAPPL 1.2 or later is required for LPrint.]) ]) dnl CUPS library... AC_PATH_TOOL([CUPSCONFIG], [cups-config]) AC_MSG_CHECKING([for CUPS library v2.4 or higher]) AS_IF([$PKGCONFIG --exists cups3], [ CUPS_VERSION="$($PKGCONFIG --modversion cups3)" AC_MSG_RESULT([yes, v$CUPS_VERSION]) CFLAGS="$CFLAGS $($PKGCONFIG --cflags cups3)" LIBS="$LIBS $($PKGCONFIG --libs cups3)" ], [$PKGCONFIG --exists cups], [ CUPS_VERSION="$($PKGCONFIG --modversion cups)" AC_MSG_RESULT([yes, v$CUPS_VERSION]) CFLAGS="$CFLAGS $($PKGCONFIG --cflags cups)" LIBS="$LIBS $($PKGCONFIG --libs cups)" ], [test "x$CUPSCONFIG" = x], [ AC_MSG_RESULT([no]) AC_MSG_ERROR([CUPS 2.4 or later is required for LPrint.]) ], [ CUPS_VERSION="$($CUPSCONFIG --version)" AS_CASE(["$CUPS_VERSION"], [1.* | 2.0* | 2.1* | 2.2* | 2.3*], [ AC_MSG_RESULT(no) AC_MSG_ERROR([CUPS 2.4 or later is required for LPrint.]) ]) AC_MSG_RESULT([yes, v$CUPS_VERSION]) CFLAGS="$CFLAGS $($CUPSCONFIG --cflags)" LDFLAGS="$LDFLAGSS $($CUPSCONFIG --ldflags)" LIBS="$LIBS $($CUPSCONFIG --image --libs)" ]) dnl systemd support... unitdir="" AC_SUBST([unitdir]) AC_ARG_WITH([systemd], AS_HELP_STRING([--with-systemd[=PATH]], [install systemd service file, default=auto]), [ AS_CASE([$withval], [yes], [ with_systemd=yes unitdir="\$(prefix)/lib/systemd/system" ], [no], [ with_systemd=no ], [ with_systemd=yes unitdir="$withval" ]) ], [ AS_IF([test $host_os_name != darwin], [ with_systemd=yes unitdir="\$(prefix)/lib/systemd/system" ]) ]) dnl Support for experimental drivers... AC_ARG_ENABLE([experimental], AS_HELP_STRING([--enable-experimental], [turn on experimental drivers, default=no])) AS_IF([test x$enable_experimental = xyes], [ AC_DEFINE([LPRINT_EXPERIMENTAL]) ]) dnl Extra compiler options... AC_ARG_ENABLE([debug], AS_HELP_STRING([--enable-debug], [turn on debugging, default=no])) AC_ARG_ENABLE([maintainer], AS_HELP_STRING([--enable-maintainer], [turn on maintainer mode, default=no])) AC_ARG_ENABLE([sanitizer], AS_HELP_STRING([--enable-sanitizer], [build with AddressSanitizer, default=no])) AS_IF([test x$enable_debug = xyes], [ OPTIM="-g" CSFLAGS="" ], [ OPTIM="-g -Os" CSFLAGS="-o runtime" ]) AC_SUBST([CSFLAGS]) AC_SUBST([OPTIM]) WARNINGS="" AC_SUBST([WARNINGS]) AS_IF([test -n "$GCC"], [ AS_IF([test x$enable_sanitizer = xyes], [ # Use -fsanitize=address with debugging... OPTIM="-g -fsanitize=address" ], [ # Otherwise use the Fortify enhancements to catch any unbounded # string operations... CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=2" ]) dnl Show all standard warnings + unused variables when compiling... WARNINGS="-Wall -Wunused" dnl Drop some not-useful/unreliable warnings... for warning in char-subscripts format-truncation format-y2k switch unused-result; do AC_MSG_CHECKING([whether compiler supports -Wno-$warning]) OLDCFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wno-$warning -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [ AC_MSG_RESULT(yes) WARNINGS="$WARNINGS -Wno-$warning" ], [ AC_MSG_RESULT(no) ]) CFLAGS="$OLDCFLAGS" done dnl Maintainer mode enables -Werror... AS_IF([test x$enable_maintainer = xyes], [ WARNINGS="$WARNINGS -Werror" ]) dnl See if PIE options are supported... AC_MSG_CHECKING(whether compiler supports -fPIE) OLDCFLAGS="$CFLAGS" AS_CASE(["$host_os_name"], [darwin*], [ CFLAGS="$CFLAGS -fPIC -fPIE -Wl,-pie" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[ OLDCFLAGS="-fPIC $OLDCFLAGS" LDFLAGS="-fPIE -Wl,-pie $LDFLAGS" AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no) ]) ], [*], [ CFLAGS="$CFLAGS -fPIC -fPIE -pie" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[ OLDCFLAGS="-fPIC $OLDCFLAGS" LDFLAGS="-fPIE -pie $LDFLAGS" AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no) ]) ]) CFLAGS="$OLDCFLAGS" dnl OS-specific compiler options... AS_CASE(["$host_os_name"], [linux*], [ CPPFLAGS="$CPPFLAGS -D__USE_MISC -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64" ], [darwin*], [ AS_IF([test "$host_os_version" -ge 200 -a x$enable_debug != xyes], [ # macOS 11.0 and higher support the Apple Silicon (arm64) CPUs OPTIM="$OPTIM -mmacosx-version-min=11.0 -arch x86_64 -arch arm64" ], [test x$enable_debug != xyes], [ OPTIM="$OPTIM -mmacosx-version-min=11.0 -arch x86_64" ]) ]) ]) dnl Extra linker options... AC_ARG_WITH(ldflags, AS_HELP_STRING([--with-ldflags=...], [Specify additional LDFLAGS]), [ LDFLAGS="$withval $LDFLAGS" ]) dnl Generate the Makefile... AC_CONFIG_FILES([ Makefile lprint.service ]) AC_OUTPUT lprint-1.3.1/devdocs/000077500000000000000000000000001456151556700144725ustar00rootroot00000000000000lprint-1.3.1/devdocs/BROTHER.md000066400000000000000000000140721456151556700161250ustar00rootroot00000000000000Brother Combined Command Reference ================================== Last Updated: November 27, 2023 QL-Series Printers ------------------ - 300x300dpi: All - 300x600dpi: QL-570/580N/700/8xx PT-Series Printers ------------------ - 180dpi: All Commands -------- - Invalidate Print Data: NUL (400 bytes for QL-series, 100 bytes for PT-series) - Status Information Request: ESC i S (see below for 32-byte response) - Initialize (reset): ESC @ - Set Margin (between labels, 0 for cut labels): ESC i d {nLSB} {nMSB} - Set Raster Mode: ESC i a ^A - Set Print Information: ESC i z {k} {media-type} {media-width} {media-length} {countLSB} {count} {count} {countMSB} {page} ^@ - k=2: media-type specified - k=4: media-width specified - k=8: media-length specified? - k=64: prefer print quality - k=128: print recovery always on - media-type is as reported by status info request - media-width and media-length are millimeters - count=num-colors * (width-bytes + 3) * number-non-zero-rows + number-zero-rows - page=0 for first page, 1 for remaining pages - Set Automatic Status Notification Mode: ESC i ! {n} - n=0: Notify (default) - n=1: Do not notify - Send Monochrome Raster Graphics (PT-series): g {nLSB} {nMSB} {d1 ... dN} - n=number of data bytes - Send Monochrome Raster Graphics (QL-series): g ^@ {n} {d1 ... dN} - n=number of data bytes - Send Two-Color Raster Graphics: w {c} {n} {d1 ... dN} - c=1: First color (high energy) - c=2: Second color (low energy) - n=number of data bytes - Zero Raster Graphics: Z - Not supported by QL-800 - Print Command: FF - Print Command w/Feed: ^Z - Set Compression Mode: M {n} - n=0: No compression - n=2: TIFF PackBits compression - Set Number of Pages: ESC i A {n} - n=1-255 (number of pages) - Set Darkness: ESC i D {darkness} - darkness=1-5 (1 is lightest, 5 is darkest) - Set Modes: ESC i M {n} - n=0: no auto-cut - n=64: auto-cut - n=128: mirror print - Set Expanded Modes: ESC i K {n} - n=0: normal resolution printing - n=1: draft resolution printing - n=8: cut at end - n=64: higher resolution printing Status Information Response --------------------------- | Byte(s) | Name | Value(s) | | :-----: | --------------- | -------------------- | | 0 | Print Head Mark | 0x80 | | 1 | Size | 32 (size of this) | | 2 | Reserved | 0x42 ("B") | | 3 | Series Code | See below | | 4-5 | Model Code | See below | | 6 | Reserved | 0x30 ("0") | | 7 | Reserved | 0x00 | | 8 | Error Info 1 | See below | | 9 | Error Info 2 | See below | | 10 | Media Width | Millimeters | | 11 | Media Type | See below | | 12 | Reserved | 0x00 | | 13 | Reserved | 0x00 | | 14 | Reserved | Not set | | 15 | Mode | Various mode or 0x00 | | 16 | Reserved | 0x00 | | 17 | Media Length | Millimeters or 0 | | 18 | Status Type | See below | | 19 | Phase Type | See below | | 20-21 | Phase Number | See below | | 22 | Notification # | See below | | 23 | Reserved | 0x00 | | 24 | Tape Color | See below | | 25 | Text Color | See below | | 26-29 | Hardware Info | 0x00 | | 30-31 | Reserved | 0x00 | Series Codes ------------ - 0x30 ("0"): PT-series - 0x34 ("4"): QL-series Model Codes ----------- - 0x304F ("0O"): QL-500/550 - 0x3051 ("0Q"): QL-650TD - 0x3050 ("0P"): QL-1050 - 0x3431 ("41"): QL-560 - 0x3432 ("42"): QL-570 - 0x3433 ("43"): QL-580N - 0x3435 ("45"): QL-700 - 0x3434 ("44"): QL-1060N - 0x3630 ("60"): QL-710W - 0x3730 ("70"): QL-720NW - 0x3830 ("80"): QL-800 - 0x3930 ("90"): QL-810W - 0x4130 ("A0"): QL-820NWB - 0x4330 ("C0"): QL-1100 - 0x4430 ("D0"): QL-1110NWB - 0x4530 ("E0"): QL-1115NWB - 0x4730 ("G0"): QL-600 - 0x6430 ("d0"): PT-H500 - 0x6530 ("e0"): PT-E500 - 0x6730 ("g0"): PT-P700 Error Info 1 ------------ - 0x01: media-empty - 0x02: end-of-media - 0x04: cutter-jam? - 0x08: low battery - 0x10: printer in use - 0x20: printer turned off (powered-off?) - 0x40: high-voltage adapter - 0x80: fan motor error Error Info 2 ------------ - 0x01: replace/wrong media (media-needed?) - 0x02: expansion buffer full - 0x04: communication error - 0x08: communication buffer full - 0x10: cover-open - 0x20: cancel key (QL-series)/overheating error (PT-series) - 0x40: media cannot be fed - 0x80: system error Media Types ----------- - 0x00: No media - 0x01: Laminated tape - 0x03: Non-laminated tape - 0x11: Heat-shrink tube (2:1) - 0x17: Heat-shrink tube (3:1) - 0x0A/0x4A: Continuous paper/film - 0x0B/0x4B: Die-cut labels - 0xFF: Incompatible tape Media Lengths ------------- - 0 means "continuous tape/paper" Status Types ------------ - 0x00: reply to status request - 0x01: printing completed - 0x02: error occurred - 0x04: turned off - 0x05: notification - 0x06: phase change Phase Types/Numbers ------------------- - 0x00+0x00+0x00: Receiving state - 0x01+0x00+0x00: Printing state Notification Numbers -------------------- - 0x00: Not available - 0x01: Cover open - 0x02: Cover closed - 0x03: Cooling (started) - 0x04: Cooling (finished) Tape/Text Colors ---------------- - 0x00: All QL-series - 0x01: white - 0x02: other - 0x03: clear - 0x04: red - 0x05: blue - 0x06: yellow - 0x07: green - 0x08: black - 0x09: clear (white text) - 0x0A: gold - 0x20: matte white - 0x21: matte clear - 0x22: matte silver - 0x23: satin gold - 0x24: satin silver - 0x30: blue - 0x31: red - 0x40: fluorescent orange - 0x41: fluorescent yellow - 0x50: berry pink - 0x51: light gray - 0x52: lime green - 0x60: yellow - 0x61: pink - 0x62: blue - 0x70: white heat-shrink tube - 0x90: white flexible ID - 0x91: yellow flexible ID - 0xf0: clearning - 0xf1: stencil - 0xff: incompatible Hardware Info ------------- lprint-1.3.1/install-sh000077500000000000000000000127041456151556700150530ustar00rootroot00000000000000#!/bin/sh # # Install a program, script, or datafile. # # Copyright 2008-2012 by Apple Inc. # # This script is not compatible with BSD (or any other) install program, as it # allows owner and group changes to fail with a warning and makes sure that the # destination directory permissions are as specified - BSD install and the # original X11 install script did not change permissions of existing # directories. It also does not support the transform options since CUPS does # not use them... # # Original script from X11R5 (mit/util/scripts/install.sh) # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # Force umask to 022... umask 022 # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" gzipprog="${GZIPPROG-gzip}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" gzipcp() { # gzipcp from to $gzipprog -9 <"$1" >"$2" } while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue ;; -d) dir_arg=true shift continue ;; -m) chmodcmd="$chmodprog $2" shift shift continue ;; -o) chowncmd="$chownprog $2" shift shift continue ;; -g) chgrpcmd="$chgrpprog $2" shift shift continue ;; -s) stripcmd="$stripprog" shift continue ;; -z) instcmd="gzipcp" shift continue ;; *) if [ x"$src" = x ]; then src="$1" else dst="$1" fi shift continue ;; esac done if [ x"$src" = x ]; then echo "install-sh: No input file specified" exit 1 fi if [ x"$dir_arg" != x ]; then dst="$src" src="" if [ -d "$dst" ]; then instcmd=: else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ ! -f "$src" -a ! -d "$src" ]; then echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ]; then echo "install: No destination specified" exit 1 fi # If destination is a directory, append the input filename. if [ -d "$dst" ]; then dst="$dst/`basename $src`" fi fi ## this sed command emulates the dirname command dstdir="`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`" # Make sure that the destination directory exists. # This part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ]; then $doit $mkdirprog "${pathcomp}"; fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ]; then # Make a directory... $doit $instcmd $dst || exit 1 # Allow chown/chgrp to fail, but log a warning if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst || echo "warning: Unable to change owner of $dst!"; fi if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst || echo "warning: Unable to change group of $dst!"; fi if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst || exit 1; fi else # Install a file... dstfile="`basename $dst`" # Check the destination file - for libraries just use the "-x" option # to strip... case "$dstfile" in *.a | *.dylib | *.sl | *.sl.* | *.so | *.so.*) stripopt="-x" ;; *) stripopt="" ;; esac # Make a temp file name in the proper directory. dsttmp="$dstdir/#inst.$$#" # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp || exit 1 # Update permissions and strip as needed, then move to the final name. # If the chmod, strip, rm, or mv commands fail, remove the installed # file... if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripopt "$dsttmp" || echo "warning: Unable to strip $dst!"; fi if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp" || echo "warning: Unable to change owner of $dst!"; fi if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp" || echo "warning: Unable to change group of $dst!"; fi trap "rm -f ${dsttmp}" 0 && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; fi && $doit $rmcmd -f "$dstdir/$dstfile" && $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" fi exit 0 lprint-1.3.1/lprint-brother.c000066400000000000000000000434071456151556700161720ustar00rootroot00000000000000// // Experimental Brother driver for LPrint, a Label Printer Application // // Copyright © 2023-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" #ifdef LPRINT_EXPERIMENTAL // // Local types... // typedef struct lprint_brother_s // Brother driver data { bool is_pt_series; // Is this a PT-series printer? bool is_ql_800; // Is this the QL-800 printer? lprint_dither_t dither; // Dither buffer int count; // Output count for print info size_t alloc_bytes, // Allocated bytes for output buffer num_bytes; // Number of bytes in output buffer unsigned char *buffer; // Output buffer } lprint_brother_t; // // Local globals... // static const char * const lprint_brother_ql_media[] = { // Supported QL-* media sizes "oe_dk1219-round_0.47x0.47in", "oe_dk1204-multi-purpose_0.66x2.1in", "oe_dk1203-file-folder_0.66x3.4in", "oe_dk1209-small-address_1.1x2.4in", "oe_dk1201-address_1.1x3.5in", "oe_dk1208-large-address_1.4x3.5in", "oe_dk1240-large-multi-purpose_1.9x4in", "oe_dk1207-cd-dvd_2.2x2.2in", "oe_dk1202-shipping_2.4x3.9in", "na_index-4x6_4x6in", // DK1241/1247 "roll_dk2113-continuous-film_2.4x600in", // Black/Clear "roll_dk2205-continuous_2.4x1200in", // Black on White "roll_dk2210-continuous_1.1x1200in", "roll_dk2211-continuous-film_1.1x600in", "roll_dk2212-continuous-film_2.4x600in", "roll_dk2214-continuous_0.47x1200in", "roll_dk2243-continuous_4x1200in", // Black on White "roll_dk2246-continuous_4.07x1200in", // Black on White "roll_dk2251-continuous_2.4x600in", // Black/Red on White "roll_dk2606-continuous-film_2.4x600in", // Black/Yellow "roll_dk4205-continuous-removable_2.4x1200in",// Black on White "roll_dk4605-continuous-removable_2.4x1200in",// Black/Yellow on White "roll_max_2.5x3600in", "roll_min_0.25x1in" }; static const char * const lprint_brother_pt_media[] = { // Supported PT-* media sizes "oe_thin-1in-tape_0.25x1in", "oe_thinner-1in-tape_0.375x1in", "oe_medium-1in-tape_0.5x1in", "oe_wider-1in-tape_0.75x1in", "oe_wide-1in-tape_1x1in", "oe_thin-2in-tape_0.25x2in", "oe_thinner-2in-tape_0.375x2in", "oe_medium-2in-tape_0.5x2in", "oe_wider-2in-tape_0.75x2in", "oe_wide-2in-tape_1x2in", "oe_thin-3in-tape_0.25x3in", "oe_thinner-3in-tape_0.375x3in", "oe_medium-3in-tape_0.5x3in", "oe_wider-3in-tape_0.75x3in", "oe_wide-3in-tape_1x3in", "roll_max_1x3600in", "roll_min_0.25x1in" }; // // Local functions... // static bool lprint_brother_get_status(pappl_printer_t *printer, pappl_device_t *device); static bool lprint_brother_printfile(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_brother_rendjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_brother_rendpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_brother_rstartjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_brother_rstartpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_brother_rwriteline(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned y, const unsigned char *line); static bool lprint_brother_status(pappl_printer_t *printer); // // 'lprintBrother()' - Initialize the Brother driver. // bool // O - `true` on success, `false` on error lprintBrother( pappl_system_t *system, // I - System const char *driver_name,// I - Driver name const char *device_uri, // I - Device URI const char *device_id, // I - 1284 device ID pappl_pr_driver_data_t *data, // I - Pointer to driver data ipp_t **attrs, // O - Pointer to driver attributes void *cbdata) // I - Callback data (not used) { // Print callbacks... data->printfile_cb = lprint_brother_printfile; data->rendjob_cb = lprint_brother_rendjob; data->rendpage_cb = lprint_brother_rendpage; data->rstartjob_cb = lprint_brother_rstartjob; data->rstartpage_cb = lprint_brother_rstartpage; data->rwriteline_cb = lprint_brother_rwriteline; data->status_cb = lprint_brother_status; // Vendor-specific format... data->format = LPRINT_BROTHER_PT_CBP_MIMETYPE; if (!strncmp(driver_name, "brother_ql-", 11)) { // QL-series... // Set resolution... // TODO: Add support for 300x600dpi mode for QL-570/580N/700/8xx data->num_resolution = 1; data->x_resolution[0] = data->y_resolution[0] = 300; data->x_default = data->y_default = data->x_resolution[0]; // Basically borderless... data->left_right = 1; data->bottom_top = 1; // Supported media... data->num_media = (int)(sizeof(lprint_brother_ql_media) / sizeof(lprint_brother_ql_media[0])); memcpy(data->media, lprint_brother_ql_media, sizeof(lprint_brother_ql_media)); papplCopyString(data->media_ready[0].size_name, "roll_dk2205-continuous_2.4x3.9in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "continuous", sizeof(data->media_ready[0].type)); data->num_type = 2; data->type[0] = "labels"; data->type[1] = "continuous"; } else { // PT-series... // Set resolution... data->num_resolution = 1; data->x_resolution[0] = data->y_resolution[0] = 180; data->x_default = data->y_default = data->x_resolution[0]; // Basically borderless... data->left_right = 1; data->bottom_top = 1; // Supported media... data->num_media = (int)(sizeof(lprint_brother_pt_media) / sizeof(lprint_brother_pt_media[0])); memcpy(data->media, lprint_brother_pt_media, sizeof(lprint_brother_pt_media)); data->num_source = 1; data->source[0] = "main-roll"; papplCopyString(data->media_ready[0].size_name, "oe_wide-2in-tape_1x2in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); data->num_type = 2; data->type[0] = "continuous"; data->type[1] = "continuous-film"; data->type[2] = "continuous-removable"; } data->num_source = 1; data->source[0] = "main-roll"; // 5 darkness/density settings data->darkness_configured = 50; data->darkness_supported = 5; return (true); } // // 'lprint_brother_get_status()' - Query the printer status information... // static bool // O - `true` on success, `false` on failure lprint_brother_get_status( pappl_printer_t *printer, // I - Printer pappl_device_t *device) // I - Device { unsigned char buffer[32]; // Status buffer pappl_preason_t preasons; // "printer-state-reasons" values const char *media; // "media-ready" value // Request status... if (!papplDevicePuts(device, "\033iS")) return (false); // Read status buffer... if (papplDeviceRead(device, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer)) return (false); LPRINT_DEBUG("lprint_brother_get_status: Print Head Mark = %02x\n", buffer[0]); LPRINT_DEBUG("lprint_brother_get_status: Size = %02x\n", buffer[1]); LPRINT_DEBUG("lprint_brother_get_status: Reserved = %02x\n", buffer[2]); LPRINT_DEBUG("lprint_brother_get_status: Series Code = %02x\n", buffer[3]); LPRINT_DEBUG("lprint_brother_get_status: Model Code = %02x %02x\n", buffer[4], buffer[5]); LPRINT_DEBUG("lprint_brother_get_status: Reserved = %02x\n", buffer[6]); LPRINT_DEBUG("lprint_brother_get_status: Reserved = %02x\n", buffer[7]); LPRINT_DEBUG("lprint_brother_get_status: Error Info 1 = %02x\n", buffer[8]); LPRINT_DEBUG("lprint_brother_get_status: Error Info 2 = %02x\n", buffer[9]); LPRINT_DEBUG("lprint_brother_get_status: Media Width = %02x\n", buffer[10]); LPRINT_DEBUG("lprint_brother_get_status: Media Type = %02x\n", buffer[11]); LPRINT_DEBUG("lprint_brother_get_status: Reserved = %02x\n", buffer[12]); LPRINT_DEBUG("lprint_brother_get_status: Reserved = %02x\n", buffer[13]); LPRINT_DEBUG("lprint_brother_get_status: Reserved = %02x\n", buffer[14]); LPRINT_DEBUG("lprint_brother_get_status: Mode = %02x\n", buffer[15]); LPRINT_DEBUG("lprint_brother_get_status: Reserved = %02x\n", buffer[16]); LPRINT_DEBUG("lprint_brother_get_status: Media Length = %02x\n", buffer[17]); LPRINT_DEBUG("lprint_brother_get_status: Status Type = %02x\n", buffer[18]); LPRINT_DEBUG("lprint_brother_get_status: Phase Type = %02x\n", buffer[19]); LPRINT_DEBUG("lprint_brother_get_status: Phase Number = %02x %02x\n", buffer[20], buffer[21]); LPRINT_DEBUG("lprint_brother_get_status: Notification # = %02x\n", buffer[22]); LPRINT_DEBUG("lprint_brother_get_status: Reserved = %02x\n", buffer[23]); LPRINT_DEBUG("lprint_brother_get_status: Tape Color = %02x\n", buffer[24]); LPRINT_DEBUG("lprint_brother_get_status: Text Color = %02x\n", buffer[25]); LPRINT_DEBUG("lprint_brother_get_status: Hardware Info = %02x %02x %02x %02x\n", buffer[26], buffer[27], buffer[28], buffer[29]); LPRINT_DEBUG("lprint_brother_get_status: Reserved = %02x %02x\n", buffer[30], buffer[31]); // Match ready media... if ((media = lprintMediaMatch(printer, 0, 100 * buffer[10], 100 * buffer[17])) != NULL) papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "Detected media is '%s'.", media); // Convert error info to "printer-state-reasons" bits... preasons = PAPPL_PREASON_NONE; if (buffer[8] & 0x03) preasons |= PAPPL_PREASON_MEDIA_EMPTY; if (buffer[8] & 0xfc) preasons |= PAPPL_PREASON_OTHER; if (buffer[9] & 0x01) preasons |= PAPPL_PREASON_MEDIA_NEEDED; if (buffer[9] & 0x10) preasons |= PAPPL_PREASON_COVER_OPEN; if (buffer[9] & 0x40) preasons |= PAPPL_PREASON_MEDIA_JAM; if (buffer[9] & 0xae) preasons |= PAPPL_PREASON_OTHER; papplPrinterSetReasons(printer, preasons, ~preasons); return (true); } // // 'lprint_brother_printfile()' - Print a file. // static bool // O - `true` on success, `false` on failure lprint_brother_printfile( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { int fd; // Input file ssize_t bytes; // Bytes read/written char buffer[65536]; // Read/write buffer // lprint_brother_t brother; // Driver data // Reset the printer... lprint_brother_rstartjob(job, options, device); // Copy the raw file... papplJobSetImpressions(job, 1); if ((fd = open(papplJobGetFilename(job), O_RDONLY)) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to open print file '%s': %s", papplJobGetFilename(job), strerror(errno)); return (false); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) { if (papplDeviceWrite(device, buffer, (size_t)bytes) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to send %d bytes to printer.", (int)bytes); close(fd); return (false); } } close(fd); lprint_brother_rstartjob(job, options, device); papplJobSetImpressionsCompleted(job, 1); return (true); } // // 'lprint_brother_rend()' - End a job. // static bool // O - `true` on success, `false` on failure lprint_brother_rendjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_brother_t *brother = (lprint_brother_t *)papplJobGetData(job); // Brother driver data (void)options; free(brother->buffer); free(brother); papplJobSetData(job, NULL); return (true); } // // 'lprint_brother_rendpage()' - End a page. // static bool // O - `true` on success, `false` on failure lprint_brother_rendpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_brother_t *brother = (lprint_brother_t *)papplJobGetData(job); // Brother driver data unsigned char buffer[13]; // Print Information command buffer // Write last line lprint_brother_rwriteline(job, options, device, options->header.cupsHeight, NULL); // Send print information... buffer[ 0] = 0x1b; buffer[ 1] = 'i'; buffer[ 2] = 'z'; buffer[ 3] = !strcmp(options->media.type, "continuous") ? 0x04 : 0x0c; buffer[ 4] = 0; buffer[ 5] = options->media.size_width / 100; buffer[ 6] = options->media.size_length / 100; #if 1 buffer[ 7] = options->header.cupsHeight & 255; buffer[ 8] = (options->header.cupsHeight >> 8) & 255; buffer[ 9] = (options->header.cupsHeight >> 16) & 255; buffer[10] = (options->header.cupsHeight >> 24) & 255; #else buffer[ 7] = brother->count & 255; buffer[ 8] = (brother->count >> 8) & 255; buffer[ 9] = (brother->count >> 16) & 255; buffer[10] = (brother->count >> 24) & 255; #endif // 1 buffer[11] = page == 0 ? 0 : 1; buffer[12] = 0; if (!papplDeviceWrite(device, buffer, sizeof(buffer))) return (false); // Send label data... if (brother->num_bytes > 0 && !papplDeviceWrite(device, brother->buffer, brother->num_bytes)) return (false); // Eject/cut papplDevicePrintf(device, "\033iM%c\014", !strcmp(options->media.type, "continuous") ? 64 : 0); papplDeviceFlush(device); // Free memory and return... lprintDitherFree(&brother->dither); return (true); } // // 'lprint_brother_rstartjob()' - Start a job. // static bool // O - `true` on success, `false` on failure lprint_brother_rstartjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_brother_t *brother = (lprint_brother_t *)calloc(1, sizeof(lprint_brother_t)); // Brother driver data const char *driver_name = papplPrinterGetDriverName(papplJobGetPrinter(job)); // Driver name char buffer[400]; // Reset buffer int darkness; // Combined darkness (void)options; // Save driver data... papplJobSetData(job, brother); // Reset the printer... memset(buffer, 0, sizeof(buffer)); if (driver_name && !strncmp(driver_name, "brother_pt-", 11)) { // Send short reset sequence for PT-series tape printers papplDeviceWrite(device, buffer, 100); brother->is_pt_series = true; } else { // Send long reset sequence for QL-series label printers papplDeviceWrite(device, buffer, sizeof(buffer)); brother->is_ql_800 = driver_name && !strcmp(driver_name, "brother_ql-800"); } // Get status information... lprint_brother_get_status(papplJobGetPrinter(job), device); // if (!lprint_brother_get_status(papplJobGetPrinter(job), device)) // return (false); // Reset and set raster mode... if (!papplDevicePuts(device, "\033@\033ia\001")) return (false); // print-darkness / printer-darkness-configured if ((darkness = options->print_darkness + options->darkness_configured) < 0) darkness = 0; else if (darkness > 100) darkness = 100; return (papplDevicePrintf(device, "\033iD%c", 4 * darkness / 100 + 1)); } // // 'lprint_brother_rstartpage()' - Start a page. // static bool // O - `true` on success, `false` on failure lprint_brother_rstartpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_brother_t *brother = (lprint_brother_t *)papplJobGetData(job); // Brother driver data (void)page; if (!lprintDitherAlloc(&brother->dither, job, options, CUPS_CSPACE_K, options->header.HWResolution[0] == 300 ? 1.2 : 1.0)) return (false); brother->count = 0; brother->num_bytes = 0; return (true); } // // 'lprint_brother_rwriteline()' - Write a raster line. // static bool // O - `true` on success, `false` on failure lprint_brother_rwriteline( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned y, // I - Line number const unsigned char *line) // I - Line { lprint_brother_t *brother = (lprint_brother_t *)papplJobGetData(job); // Brother driver data unsigned char *bufptr; // Pointer into page buffer if (!lprintDitherLine(&brother->dither, y, line)) return (true); if ((brother->alloc_bytes - brother->num_bytes) < (3 + brother->dither.out_width)) { size_t temp_alloc = brother->alloc_bytes + brother->dither.out_width + 4096; // New allocated size unsigned char *temp = realloc(brother->buffer, temp_alloc); // New buffer if (!temp) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to allocate %lu bytes of memory memory.", (unsigned long)temp_alloc); return (false); } brother->alloc_bytes = temp_alloc; brother->buffer = temp; } bufptr = brother->buffer + brother->num_bytes; if (brother->is_ql_800 || brother->dither.output[0] || memcmp(brother->dither.output, brother->dither.output + 1, brother->dither.out_width - 1)) { // Non-blank line... // TODO: Add PackBits compression support brother->count += 3 + brother->dither.out_width; *bufptr++ = 'g'; if (brother->is_pt_series) { *bufptr++ = brother->dither.out_width & 255; *bufptr++ = (brother->dither.out_width >> 8) & 255; } else { *bufptr++ = 0; *bufptr++ = brother->dither.out_width; } memcpy(bufptr, brother->dither.output, brother->dither.out_width); brother->num_bytes += 3 + brother->dither.out_width; } else { // Blank line brother->count ++; *bufptr = 'Z'; brother->num_bytes ++; } return (true); } // // 'lprint_brother_status()' - Get current printer status. // static bool // O - `true` on success, `false` on failure lprint_brother_status( pappl_printer_t *printer) // I - Printer { (void)printer; return (true); } #endif // LPRINT_EXPERIMENTAL lprint-1.3.1/lprint-brother.h000066400000000000000000000035751456151556700162010ustar00rootroot00000000000000// // Experimental Brother driver table for LPrint, a Label Printer Application // // Copyright © 2023-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // { "brother_ql-500", "Brother QL-500", "MFG:Brother;CMD:PT-CBP;MDL:QL-500;", NULL }, { "brother_ql-550", "Brother QL-550", "MFG:Brother;CMD:PT-CBP;MDL:QL-550;", NULL }, { "brother_ql-560", "Brother QL-560", "MFG:Brother;CMD:PT-CBP;MDL:QL-560;", NULL }, { "brother_ql-570", "Brother QL-570", "MFG:Brother;CMD:PT-CBP;MDL:QL-570;", NULL }, { "brother_ql-580n", "Brother QL-580N", "MFG:Brother;CMD:PT-CBP;MDL:QL-580N;", NULL }, { "brother_ql-600", "Brother QL-600", "MFG:Brother;CMD:PT-CBP;MDL:QL-600;", NULL }, { "brother_ql-650td", "Brother QL-650TD", "MFG:Brother;CMD:PT-CBP;MDL:QL-650TD;", NULL }, { "brother_ql-700", "Brother QL-700", "MFG:Brother;CMD:PT-CBP;MDL:QL-700;", NULL }, { "brother_ql-710w", "Brother QL-710W", "MFG:Brother;CMD:PT-CBP;MDL:QL-710W;", NULL }, { "brother_ql-720nw", "Brother QL-720NW", "MFG:Brother;CMD:PT-CBP;MDL:QL-720NW;", NULL }, { "brother_ql-800", "Brother QL-800", "MFG:Brother;CMD:PT-CBP;MDL:QL-800;", NULL }, { "brother_ql-810w", "Brother QL-810W", "MFG:Brother;CMD:PT-CBP;MDL:QL-810W;", NULL }, { "brother_ql-820nwb", "Brother QL-820NWB", "MFG:Brother;CMD:PT-CBP;MDL:QL-820NWB;", NULL }, { "brother_ql-1050", "Brother QL-1050", "MFG:Brother;CMD:PT-CBP;MDL:QL-1050;", NULL }, { "brother_ql-1060n", "Brother QL-1060N", "MFG:Brother;CMD:PT-CBP;MDL:QL-1060N;", NULL }, { "brother_ql-1100", "Brother QL-1100", "MFG:Brother;CMD:PT-CBP;MDL:QL-1100;", NULL }, { "brother_ql-1110nwb", "Brother QL-1110NWB", "MFG:Brother;CMD:PT-CBP;MDL:QL-1110NWB;", NULL }, { "brother_ql-1115nwb", "Brother QL-1115NWB", "MFG:Brother;CMD:PT-CBP;MDL:QL-1115NWB;", NULL }, //{ "brother_pt-", "Brother PT-", // "MFG:Brother;CMD:???;MDL:PT-;", NULL }, lprint-1.3.1/lprint-common.c000066400000000000000000000747511456151556700160230ustar00rootroot00000000000000// // Common driver code for LPrint, a Label Printer Application // // Copyright © 2019-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" // // Constants... // #define LPRINT_WHITE 56 #define LPRINT_BLACK 199 #define LPRINT_TRASH "" // // Local functions... // static void free_cmedia(pappl_printer_t *printer, pappl_pr_driver_data_t *data); static char *localize_keyword(pappl_client_t *client, const char *attrname, const char *keyword, char *buffer, size_t bufsize); static void media_chooser(pappl_client_t *client, pappl_pr_driver_data_t *driver_data, const char *title, const char *name, pappl_media_col_t *media); // // 'lprintDitherAlloc()' - Allocate memory for a dither buffer. // bool // O - `true` on success, `false` on error lprintDitherAlloc( lprint_dither_t *dither, // I - Dither buffer pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Print options cups_cspace_t out_cspace, // I - Output color space double out_gamma) // I - Output gamma correction { int i, j; // Looping vars unsigned right; // Right margin // Adjust dithering array and compress to a range of 16 to 239 for (i = 0; i < 16; i ++) { for (j = 0; j < 16; j ++) { dither->dither[i][j] = (unsigned char)((LPRINT_BLACK - LPRINT_WHITE) * pow(options->dither[i][j] / 255.0, out_gamma) + LPRINT_WHITE); } } // Calculate margins and dimensions... if (!options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxBottom] || !options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxLeft] || !options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxRight] || !options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxTop]) { options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxLeft] = options->header.HWResolution[0] * (unsigned)options->media.left_margin / 2540; options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxTop] = options->header.HWResolution[1] * (unsigned)options->media.top_margin / 2540; options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxRight] = options->header.cupsWidth - options->header.HWResolution[0] * (unsigned)options->media.right_margin / 2540 - 1; options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxBottom] = options->header.cupsHeight - options->header.HWResolution[1] * (unsigned)options->media.bottom_margin / 2540 - 1; } dither->in_left = options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxLeft]; right = options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxRight]; dither->in_top = options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxTop]; dither->in_bottom = options->header.cupsInteger[CUPS_RASTER_PWG_ImageBoxBottom]; dither->in_width = right - dither->in_left + 1; dither->in_height = dither->in_bottom - dither->in_top + 1; dither->out_width = (right - dither->in_left + 8) / 8; if (dither->in_width > 65536) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Page too wide."); return (false); // Protect against large allocations } // Calculate input/output color values dither->in_bpp = options->header.cupsBitsPerPixel; switch (options->header.cupsColorSpace) { case CUPS_CSPACE_W : case CUPS_CSPACE_SW : case CUPS_CSPACE_RGB : case CUPS_CSPACE_SRGB : case CUPS_CSPACE_ADOBERGB : dither->in_white = 255; break; default : dither->in_white = 0; break; } switch (out_cspace) { case CUPS_CSPACE_W : case CUPS_CSPACE_SW : case CUPS_CSPACE_RGB : case CUPS_CSPACE_SRGB : case CUPS_CSPACE_ADOBERGB : dither->out_white = 255; break; default : dither->out_white = 0; break; } // Allocate memory... if ((dither->input[0] = calloc(4 * dither->in_width, sizeof(unsigned char))) == NULL) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to allocate input buffer."); return (false); } for (i = 1; i < 4; i ++) dither->input[i] = dither->input[0] + i * dither->in_width; if ((dither->output = malloc(dither->out_width)) == NULL) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to allocate output buffer."); return (false); } papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "dither=["); for (i = 0; i < 16; i ++) papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, " [ %3u %3u %3u %3u %3u %3u %3u %3u %3u %3u %3u %3u %3u %3u %3u %3u ]", dither->dither[i][0], dither->dither[i][1], dither->dither[i][2], dither->dither[i][3], dither->dither[i][4], dither->dither[i][5], dither->dither[i][6], dither->dither[i][7], dither->dither[i][8], dither->dither[i][9], dither->dither[i][10], dither->dither[i][11], dither->dither[i][12], dither->dither[i][13], dither->dither[i][14], dither->dither[i][15]); papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "]"); papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "in_bottom=%u", dither->in_bottom); papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "in_left=%u", dither->in_left); papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "in_top=%u", dither->in_top); papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "in_width=%u", dither->in_width); papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "in_bpp=%u", dither->in_bpp); papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "in_white=%u", dither->in_white); papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "out_white=%u", dither->out_white); papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "out_width=%u", dither->out_width); // Return indicating success... return (true); } // // 'lprintDitherFree()' - Free memory for a dither buffer. // void lprintDitherFree( lprint_dither_t *dither) // I - Dither buffer { free(dither->input[0]); free(dither->output); memset(dither, 0, sizeof(lprint_dither_t)); } // // 'lprintDitherLine()' - Copy and dither a line. // // This function copies the current line and dithers it as needed. `true` is // returned if the output line needs to be sent to the printer - the `output` // member points to the output bitmap and `outwidth` specifies the bitmap width // in bytes. // // Dithering is always 1 line behind the current line, so you need to call this // function one last time in the endpage callback with `y` == `cupsHeight` to // get the last line. // bool // O - `true` if line dithered, `false` to skip lprintDitherLine( lprint_dither_t *dither, // I - Dither buffer unsigned y, // I - Input line number (starting at `0`) const unsigned char *line) // I - Input line { unsigned x, // Current column count; // Remaining count unsigned char *current, // Current line *prev, // Previous line *next; // Next line unsigned char *dline, // Dither line *outptr, // Pointer into output byte, // Current byte bit; // Current bit // Copy current input line... count = dither->in_width; next = dither->input[y & 3]; memset(next, 0, count); if (line) { switch (dither->in_bpp) { case 1 : // 1-bit black for (line += dither->in_left / 8, byte = *line++, bit = 128 >> (dither->in_left & 7); count > 0; count --, next ++) { // Convert to 8-bit black... if (byte & bit) *next = 255; if (bit > 1) { bit /= 2; } else { bit = 128; byte = *line++; } } break; case 8 : // Grayscale or 8-bit black if (dither->in_white) { // Convert grayscale to black... for (line += dither->in_left; count > 0; count --, next ++, line ++) { if (*line < LPRINT_WHITE) *next = 255; else if (*line > LPRINT_BLACK) *next = 0; else *next = 255 - *line; } } else { // Copy with clamping... for (line += dither->in_left; count > 0; count --, next ++, line ++) { if (*line < LPRINT_WHITE) *next = 255; else if (*line > LPRINT_BLACK) *next = 0; else *next = *line; } } break; default : // Something else... return (false); } } // If we are outside the imageable area then don't dither... if (y < (dither->in_top + 1) || y > (dither->in_bottom + 1)) return (false); // Dither... for (x = 0, count = dither->in_width, prev = dither->input[(y - 2) & 3], current = dither->input[(y - 1) & 3], next = dither->input[y & 3], outptr = dither->output, byte = dither->out_white, bit = 128, dline = dither->dither[y & 15]; count > 0; x ++, count --, prev ++, current ++, next ++) { if (*current) { // Not pure white/blank... if (*current == 255) { // 100% black... byte ^= bit; } else { // Only dither if this pixel does not border 100% white or black... if ((x > 0 && (current[-1] == 255 || current[-1] == 0)) || (count > 1 && (current[1] == 255 || current[1] == 0)) || *prev == 255 || *prev == 0 || *next == 255 || *next == 0) { // Threshold if (*current > 127) byte ^= bit; } else if (*current > dline[x & 15]) { // Dither anything else byte ^= bit; } } } // Next output bit... if (bit > 1) { bit /= 2; } else { *outptr++ = byte; byte = dither->out_white; bit = 128; } } // Save last byte of output as needed and return... if (bit < 128) *outptr = byte; return (true); } // // 'lprintMediaLoad()' - Load custom label sizes for a printer. // bool // O - `true` on success, `false` on error lprintMediaLoad( pappl_printer_t *printer, // I - Printer pappl_pr_driver_data_t *data) // I - Driver data { lprint_cmedia_t *cmedia; // Custom media int fd; // Custom media file descriptor cups_file_t *fp; // Custom media file char filename[1024], // Custom media filename line[256]; // Line from file int i; // Looping var // Allocate memory as needed... if ((cmedia = (lprint_cmedia_t *)data->extension) == NULL) { if ((cmedia = (lprint_cmedia_t *)calloc(1, sizeof(lprint_cmedia_t))) == NULL) return (false); data->extension = cmedia; data->delete_cb = free_cmedia; } // Load any existing custom media sizes... if ((fd = papplPrinterOpenFile(printer, filename, sizeof(filename), /*directory*/NULL, "custom-media", "txt", "r")) < 0) return (true); if ((fp = cupsFileOpenFd(fd, "r")) == NULL) { close(fd); return (true); } for (i = 0; i < data->num_source && cupsFileGets(fp, line, sizeof(line)); i ++) papplCopyString(cmedia->custom_name[i], line, sizeof(cmedia->custom_name[i])); cupsFileClose(fp); return (true); } // // 'lprintMediaMatch()' - Match the loaded media to one of the supported sizes. // const char * // O - Matching media size or `NULL` if none lprintMediaMatch( pappl_printer_t *printer, // I - Printer int source, // I - "media-source" index (0-based) int width, // I - Width in hundredths of millimeters or `0` if unknown int length) // I - Length in hundredths of millimeters { pappl_pr_driver_data_t pdata; // Printer driver data lprint_cmedia_t *cmedia; // Custom media info int i; // Looping var pwg_media_t *pwg; // Current size info const char *ret = NULL; // Return value papplPrinterGetDriverData(printer, &pdata); for (i = 0; i < pdata.num_media; i ++) { if ((!strncmp(pdata.media[i], "custom_", 7) || !strncmp(pdata.media[i], "roll_", 5)) && (strstr(pdata.media[i], "_min_") != NULL || strstr(pdata.media[i], "_max_") != NULL)) continue; if ((pwg = pwgMediaForPWG(pdata.media[i])) == NULL) continue; if ((abs(pwg->width - width) <= 100 || !width) && (abs(pwg->length - length) <= 100 || !length)) { if (!ret || !strncmp(pdata.media[i], "custom_", 7) || !strncmp(pdata.media[i], "roll_", 5)) ret = pdata.media[i]; } } if (!ret) { if (!pdata.extension) lprintMediaLoad(printer, &pdata); if ((cmedia = (lprint_cmedia_t *)pdata.extension) != NULL) { if (length == 0) pwgFormatSizeName(cmedia->custom_name[source], sizeof(cmedia->custom_name[source]), "roll", pdata.source[source], width, length, /*units*/NULL); else pwgFormatSizeName(cmedia->custom_name[source], sizeof(cmedia->custom_name[source]), "custom", pdata.source[source], width, length, /*units*/NULL); lprintMediaUpdate(printer, &pdata); lprintMediaSave(printer, &pdata); ret = cmedia->custom_name[source]; } } if (ret && strcmp(pdata.media_ready[source].size_name, ret) && (pwg = pwgMediaForPWG(ret)) != NULL) { // Ready media has changed... papplCopyString(pdata.media_ready[source].size_name, ret, sizeof(pdata.media_ready[source].size_name)); pdata.media_ready[source].size_width = pwg->width; pdata.media_ready[source].size_width = pwg->length; if (pwg->length == 0) papplCopyString(pdata.media_ready[source].type, "continuous", sizeof(pdata.media_ready[source].type)); else papplCopyString(pdata.media_ready[source].type, "label", sizeof(pdata.media_ready[source].type)); papplPrinterSetDriverData(printer, &pdata, NULL); } return (ret); } // // 'lprintMediaSave()' - Save custom label sizes for a printer. // bool // O - `true` on success, `false` on error lprintMediaSave( pappl_printer_t *printer, // I - Printer pappl_pr_driver_data_t *data) // I - Driver data { lprint_cmedia_t *cmedia; // Custom media int i, // Looping var fd; // Custom media file descriptor cups_file_t *fp; // Custom media file char filename[1024]; // Custom media filename // Get the custom media... if ((cmedia = (lprint_cmedia_t *)data->extension) == NULL) { // No custom media, delete any existing file... papplPrinterOpenFile(printer, filename, sizeof(filename), /*directory*/NULL, "custom-media", "txt", "x"); return (true); } // Save custom media sizes... if ((fd = papplPrinterOpenFile(printer, filename, sizeof(filename), /*directory*/NULL, "custom-media", "txt", "w")) < 0) return (true); if ((fp = cupsFileOpenFd(fd, "w")) == NULL) { close(fd); return (true); } for (i = 0; i < data->num_source; i ++) cupsFilePrintf(fp, "%s\n", cmedia->custom_name[i]); cupsFileClose(fp); return (true); } // // 'lprintMediaUI()' - Show the printer media web page. // bool // O - `true` on success, `false` on failure lprintMediaUI( pappl_client_t *client, // I - Client pappl_printer_t *printer) // I - Printer { int i; // Looping var pappl_pr_driver_data_t data; // Driver data lprint_cmedia_t *cmedia; // Custom label sizes, if any char name[128], // Form variable name text[256]; // Localized text const char *status = NULL; // Status message, if any LPRINT_DEBUG("lprintMediaUI(client=%p, printer=%p(%s))\n", client, printer, printer ? papplPrinterGetName(printer) : "null"); // Only allow access as appropriate... if (!papplClientHTMLAuthorize(client)) return (true); // Get the driver data... papplPrinterGetDriverData(printer, &data); LPRINT_DEBUG("lprintMediaUI: data.extension=%p\n", data.extension); if (!data.extension) { lprintMediaLoad(printer, &data); LPRINT_DEBUG("lprintMediaUI: AFTER data.extension=%p\n", data.extension); } cmedia = (lprint_cmedia_t *)data.extension; if (papplClientGetMethod(client) == HTTP_STATE_POST) { int num_form = 0; // Number of form variable cups_option_t *form = NULL; // Form variables if ((num_form = papplClientGetForm(client, &form)) == 0) { status = papplClientGetLocString(client, "Invalid form data."); } else if (!papplClientIsValidForm(client, num_form, form)) { status = papplClientGetLocString(client, "Invalid form submission."); } else { bool changed = false;// Did the custom media list change? pwg_media_t *pwg = NULL; // PWG media info pappl_media_col_t *ready; // Current ready media const char *value, // Value of form variable *custom_width, // Custom media width *custom_length, // Custom media length *custom_units; // Custom media units memset(data.media_ready, 0, sizeof(data.media_ready)); for (i = 0, ready = data.media_ready; i < data.num_source; i ++, ready ++) { // size snprintf(name, sizeof(name), "ready%d-size", i); if ((value = cupsGetOption(name, num_form, form)) == NULL) continue; ready->size_name[0] = '\0'; ready->size_width = 0; ready->size_length = 0; if (!strcmp(value, "custom")) { // Custom size... snprintf(name, sizeof(name), "ready%d-custom-width", i); custom_width = cupsGetOption(name, num_form, form); snprintf(name, sizeof(name), "ready%d-custom-length", i); custom_length = cupsGetOption(name, num_form, form); snprintf(name, sizeof(name), "ready%d-custom-units", i); custom_units = cupsGetOption(name, num_form, form); if (custom_width && custom_length && custom_units) { changed = true; if (!strcmp(custom_units, "in")) { ready->size_width = (int)(2540.0 * strtod(custom_width, NULL)); ready->size_length = (int)(2540.0 * strtod(custom_length, NULL)); } else { ready->size_width = (int)(100.0 * strtod(custom_width, NULL)); ready->size_length = (int)(100.0 * strtod(custom_length, NULL)); } snprintf(name, sizeof(name), "ready%d", i); pwgFormatSizeName(ready->size_name, sizeof(ready->size_name), "custom", name, ready->size_width, ready->size_length, custom_units); papplCopyString(cmedia->custom_name[i], ready->size_name, sizeof(cmedia->custom_name[i])); } } else if ((pwg = pwgMediaForPWG(value)) != NULL) { // Standard size... papplCopyString(ready->size_name, pwg->pwg, sizeof(ready->size_name)); ready->size_width = pwg->width; ready->size_length = pwg->length; } papplLogClient(client, PAPPL_LOGLEVEL_DEBUG, "ready%d-size='%s',%d,%d", i, ready->size_name, ready->size_width, ready->size_length); // source papplCopyString(ready->source, data.source[i], sizeof(ready->source)); // xxx-margin ready->bottom_margin = ready->top_margin = data.bottom_top; ready->left_margin = ready->right_margin = data.left_right; // tracking snprintf(name, sizeof(name), "ready%d-tracking", i); if ((value = cupsGetOption(name, num_form, form)) != NULL) { if (!strcmp(value, "continuous")) ready->tracking = PAPPL_MEDIA_TRACKING_CONTINUOUS; else if (!strcmp(value, "gap")) ready->tracking = PAPPL_MEDIA_TRACKING_GAP; else if (!strcmp(value, "mark")) ready->tracking = PAPPL_MEDIA_TRACKING_MARK; else ready->tracking = PAPPL_MEDIA_TRACKING_WEB; } // type snprintf(name, sizeof(name), "ready%d-type", i); if ((value = cupsGetOption(name, num_form, form)) != NULL) papplCopyString(ready->type, value, sizeof(ready->type)); } if (changed) { // Rebuild media size list and save... lprintMediaUpdate(printer, &data); papplPrinterSetDriverData(printer, &data, NULL); lprintMediaSave(printer, &data); } papplPrinterSetReadyMedia(printer, data.num_source, data.media_ready); status = "Changes saved."; } cupsFreeOptions(num_form, form); } papplClientHTMLPrinterHeader(client, printer, "Media", 0, NULL, NULL); if (status) papplClientHTMLPrintf(client, "
%s
\n", status); papplClientHTMLStartForm(client, papplClientGetURI(client), false); papplClientHTMLPuts(client, " \n" " \n"); for (i = 0; i < data.num_source; i ++) { snprintf(name, sizeof(name), "ready%d", i); media_chooser(client, &data, localize_keyword(client, "media-source", data.source[i], text, sizeof(text)), name, data.media_ready + i); } papplClientHTMLPrintf(client, " \n" " \n" "
" " \n" " \n", papplClientGetLocString(client, "Save Changes")); papplClientHTMLPrinterFooter(client); return (true); } // // 'lprintMediaUpdate()' - Update the list of custom label sizes. // void lprintMediaUpdate( pappl_printer_t *printer, // I - Printer pappl_pr_driver_data_t *data) // I - Driver data { int i, j; // Looping vars lprint_cmedia_t *cmedia; // Custom label sizes (void)printer; // Find the last size in the media list... for (i = 0; i < data->num_media; i ++) { if (!strncmp(data->media[i], "custom_", 7) && strncmp(data->media[i], "custom_min_", 11) && strncmp(data->media[i], "custom_max_", 11)) break; } // Then copy any custom sizes over... if ((cmedia = (lprint_cmedia_t *)data->extension) != NULL) { for (j = 0; j < data->num_source && i < PAPPL_MAX_MEDIA; j ++) { if (cmedia->custom_name[j][0]) data->media[i ++] = cmedia->custom_name[j]; } } data->num_media = i; LPRINT_DEBUG("lprintMediaUpdate: num_media=%d\n", data->num_media); for (i = 0; i < data->num_media; i ++) LPRINT_DEBUG("lprintMediaUpdate: media[%d]='%s'\n", i, data->media[i]); } // // 'free_cmedia()' - Free custom media information. // static void free_cmedia( pappl_printer_t *printer, // I - Printer (unused) pappl_pr_driver_data_t *data) // I - Driver data { free(data->extension); } // // 'localize_keyword()' - Localize an attribute keyword value. // static char * // O - Localized string localize_keyword( pappl_client_t *client, // I - Client const char *attrname, // I - Attribute name const char *keyword, // I - Keyword value char *buffer, // I - String buffer size_t bufsize) // I - Size of string buffer { const char *loctext; // Localized text char key[256]; // Localization key snprintf(key, sizeof(key), "%s.%s", attrname, keyword); if ((loctext = papplClientGetLocString(client, key)) != key) { // Use localized string... papplCopyString(buffer, loctext, bufsize); } else if (!strcmp(attrname, "media")) { // Create a dimensional name for the size... pwg_media_t *pwg = pwgMediaForPWG(keyword); // PWG media size info LPRINT_DEBUG("localize_keyword: keyword='%s', pwg=%p(%dx%d)\n", keyword, pwg, pwg ? pwg->width : 0, pwg ? pwg->length : 0); if (pwg) { if ((pwg->width % 100) == 0 && (pwg->width % 2540) != 0) snprintf(buffer, bufsize, "%d x %dmm Custom Label", pwg->width / 100, pwg->length / 100); else snprintf(buffer, bufsize, "%g x %gʺ Custom Label", pwg->width / 2540.0, pwg->length / 2540.0); } else { snprintf(buffer, bufsize, "Invalid '%s'", keyword); } } else { // Convert "separated-words" to "Separated Words"... char *ptr; // Pointer into string papplCopyString(buffer, keyword, bufsize); *buffer = (char)toupper(*buffer & 255); for (ptr = buffer + 1; *ptr; ptr ++) { if (*ptr == '-' && ptr[1]) { *ptr++ = ' '; *ptr = (char)toupper(*ptr & 255); } } } return (buffer); } // // 'media_chooser()' - Show the media chooser. // static void media_chooser( pappl_client_t *client, // I - Client pappl_pr_driver_data_t *driver_data,// I - Driver data const char *title, // I - Title for field const char *name, // I - Form name/prefix pappl_media_col_t *media) // I - Current media values { int i, // Looping vars cur_index = 0, // Current size index sel_index = 0; // Selected size index... pwg_media_t *pwg; // PWG media size info char text[256]; // Localized text const char *min_size = NULL, // Minimum size *max_size = NULL; // Maximum size // media-size papplLocFormatString(papplClientGetLoc(client), text, sizeof(text), "%s Media", title); papplClientHTMLPrintf(client, " %s:", text); for (i = 0; i < driver_data->num_media && (!min_size || !max_size); i ++) { if (!strncmp(driver_data->media[i], "custom_", 7) || !strncmp(driver_data->media[i], "roll_", 5)) { if (strstr(driver_data->media[i], "_min_")) min_size = driver_data->media[i]; else if (strstr(driver_data->media[i], "_max_")) max_size = driver_data->media[i]; } } if (min_size && max_size) { papplClientHTMLPrintf(client, "", name); for (i = 0; i < driver_data->num_media; i ++) { if (!strncmp(driver_data->media[i], "custom_", 7) || !strncmp(driver_data->media[i], "roll_", 5)) { if (strstr(driver_data->media[i], "_min_")) { min_size = driver_data->media[i]; continue; } else if (strstr(driver_data->media[i], "_max_")) { max_size = driver_data->media[i]; continue; } } if (!strcmp(driver_data->media[i], media->size_name)) sel_index = cur_index; papplClientHTMLPrintf(client, "", driver_data->media[i], sel_index == cur_index ? " selected" : "", localize_keyword(client, "media", driver_data->media[i], text, sizeof(text))); cur_index ++; } if (min_size && max_size) { int cur_width, min_width, max_width;// Current/min/max width int cur_length, min_length, max_length; // Current/min/max length const char *cur_units; // Current units if ((pwg = pwgMediaForPWG(min_size)) != NULL) { min_width = pwg->width; min_length = pwg->length; } else { min_width = 1 * 2540; min_length = 1 * 2540; } if ((pwg = pwgMediaForPWG(max_size)) != NULL) { max_width = pwg->width; max_length = pwg->length; } else { max_width = 9 * 2540; max_length = 22 * 2540; } if ((cur_width = media->size_width) < min_width) cur_width = min_width; else if (cur_width > max_width) cur_width = max_width; if ((cur_length = media->size_length) < min_length) cur_length = min_length; else if (cur_length > max_length) cur_length = max_length; if ((cur_units = media->size_name + strlen(media->size_name) - 2) < media->size_name) cur_units = "in"; if (!strcmp(cur_units, "mm")) papplClientHTMLPrintf(client, "
x
\n", sel_index == 0 ? "inline-block" : "none", name, name, min_width / 2540.0, max_width / 100.0, cur_width / 100.0, papplClientGetLocString(client, "Width"), name, min_length / 2540.0, max_length / 100.0, cur_length / 100.0, papplClientGetLocString(client, "Height"), name, name, name, name, name, name); else papplClientHTMLPrintf(client, "
x
\n", sel_index == 0 ? "inline-block" : "none", name, name, min_width / 2540.0, max_width / 100.0, cur_width / 2540.0, papplClientGetLocString(client, "Width"), name, min_length / 2540.0, max_length / 100.0, cur_length / 2540.0, papplClientGetLocString(client, "Height"), name, name, name, name, name, name); } else { papplClientHTMLPuts(client, "\n"); } // media-tracking (if needed) if (driver_data->tracking_supported) { pappl_media_tracking_t tracking; // Tracking value static const char * const trackings[] = { // Tracking strings "continuous", "gap", "mark", "web" }; papplClientHTMLPrintf(client, " \n"); } // media-type papplClientHTMLPrintf(client, " \n"); } lprint-1.3.1/lprint-cpcl.c000066400000000000000000000252641456151556700154470ustar00rootroot00000000000000// // Experimental CPCL driver for LPrint, a Label Printer Application // // Copyright © 2019-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" #ifdef LPRINT_EXPERIMENTAL // // Local types... // typedef struct lprint_cpcl_s // CPCL driver data { lprint_dither_t dither; // Dither buffer } lprint_cpcl_t; // // Local globals... // static const char * const lprint_cpcl_media[] = { // Supported media sizes "oe_1.25x0.25-label_1.25x0.25in", "oe_1.25x2.25-label_1.25x2.25in", "oe_1.5x0.25-label_1.5x0.25in", "oe_1.5x0.5-label_1.5x0.5in", "oe_1.5x1-label_1.5x1in", "oe_1.5x2-label_1.5x2in", "oe_2x0.37-label_2x0.37in", "oe_2x0.5-label_2x0.5in", "oe_2x1-label_2x1in", "oe_2x1.25-label_2x1.25in", "oe_2x2-label_2x2in", "oe_2x3-label_2x3in", "oe_2x4-label_2x4in", "oe_2x5.5-label_2x5.5in", "oe_2.25x0.5-label_2.25x0.5in", "oe_2.25x1.25-label_2.25x1.25in", "oe_30859-paint-can-label_2.25x3.125in", "oe_2.25x4-label_2.25x4in", "oe_2.25x5.5-label_2.25x5.5in", "oe_2.38x5.5-label_2.38x5.5in", "oe_2.5x1-label_2.5x1in", "oe_2.5x2-label_2.5x2in", "oe_2.75x1.25-label_2.75x1.25in", "oe_2.9x1-label_2.9x1in", "oe_3x1-label_3x1in", "oe_3x1.25-label_3x1.25in", "oe_3x2-label_3x2in", "oe_3x3-label_3x3in", "oe_3x5-label_3x5in", "oe_3.25x2-label_3.25x2in", "oe_3.25x5-label_3.25x5in", "oe_3.25x5.5-label_3.25x5.5in", "oe_3.25x5.83-label_3.25x5.83in", "oe_3.25x7.83-label_3.25x7.83in", "oe_3.5x1-label_3.5x1in", "oe_4x1-label_4x1in", "oe_4x2-label_4x2in", "oe_4x3-label_4x3in", "oe_4x4-label_4x4in", "oe_4x5-label_4x5in", "oe_4x6-label_4x6in", "oe_4x6.5-label_4x6.5in", "oe_4x13-label_4x13in", "roll_max_4x50in", "roll_min_1.25x0.25in" }; // // Local functions... // static bool lprint_cpcl_printfile(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_cpcl_rendjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_cpcl_rendpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_cpcl_rstartjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_cpcl_rstartpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_cpcl_rwriteline(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned y, const unsigned char *line); static bool lprint_cpcl_status(pappl_printer_t *printer); // // 'lprintInit()' - Initialize the driver. // bool // O - `true` on success, `false` on error lprintCPCL( pappl_system_t *system, // I - System const char *driver_name,// I - Driver name const char *device_uri, // I - Device URI const char *device_id, // I - 1284 device ID pappl_pr_driver_data_t *data, // I - Pointer to driver data ipp_t **attrs, // O - Pointer to driver attributes void *cbdata) // I - Callback data (not used) { data->printfile_cb = lprint_cpcl_printfile; data->rendjob_cb = lprint_cpcl_rendjob; data->rendpage_cb = lprint_cpcl_rendpage; data->rstartjob_cb = lprint_cpcl_rstartjob; data->rstartpage_cb = lprint_cpcl_rstartpage; data->rwriteline_cb = lprint_cpcl_rwriteline; data->status_cb = lprint_cpcl_status; data->format = LPRINT_EPL2_MIMETYPE; data->num_resolution = 1; if (strstr(driver_name, "-203dpi")) { data->x_resolution[0] = 203; data->y_resolution[0] = 203; } else { data->x_resolution[0] = 300; data->y_resolution[0] = 300; } data->x_default = data->y_default = data->x_resolution[0]; data->finishings |= PAPPL_FINISHINGS_TRIM; data->num_media = (int)(sizeof(lprint_cpcl_media) / sizeof(lprint_cpcl_media[0])); memcpy(data->media, lprint_cpcl_media, sizeof(lprint_cpcl_media)); papplCopyString(data->media_ready[0].size_name, "na_index-4x6_4x6in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); data->bottom_top = data->left_right = 1; data->num_source = 1; data->source[0] = "main-roll"; data->tracking_supported = PAPPL_MEDIA_TRACKING_MARK | PAPPL_MEDIA_TRACKING_WEB | PAPPL_MEDIA_TRACKING_CONTINUOUS; data->num_type = 3; data->type[0] = "continuous"; data->type[1] = "labels"; data->type[2] = "labels-continuous"; data->tear_offset_configured = 0; data->tear_offset_supported[0] = -1500; data->tear_offset_supported[1] = 1500; data->speed_default = 0; data->speed_supported[0] = 2540; data->speed_supported[1] = 4 * 2540; data->darkness_configured = 50; data->darkness_supported = 30; return (true); } // // 'lprint_cpcl_printfile()' - Print a file. // static bool // O - `true` on success, `false` on failure lprint_cpcl_printfile( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { int fd; // Input file ssize_t bytes; // Bytes read/written char buffer[65536]; // Read/write buffer // Copy the raw file... papplJobSetImpressions(job, 1); if ((fd = open(papplJobGetFilename(job), O_RDONLY)) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to open print file '%s': %s", papplJobGetFilename(job), strerror(errno)); return (false); } // Copy print data... while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) { if (papplDeviceWrite(device, buffer, (size_t)bytes) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to send %d bytes to printer.", (int)bytes); close(fd); return (false); } } close(fd); papplJobSetImpressionsCompleted(job, 1); return (true); } // // 'lprint_cpcl_rend()' - End a job. // static bool // O - `true` on success, `false` on failure lprint_cpcl_rendjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_cpcl_t *cpcl = (lprint_cpcl_t *)papplJobGetData(job); // CPCL driver data (void)options; (void)device; free(cpcl); papplJobSetData(job, NULL); return (true); } // // 'lprint_cpcl_rendpage()' - End a page. // static bool // O - `true` on success, `false` on failure lprint_cpcl_rendpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_cpcl_t *cpcl = (lprint_cpcl_t *)papplJobGetData(job); // CPCL driver data int darkness; // Composite darkness value (void)page; // Write last line lprint_cpcl_rwriteline(job, options, device, options->header.cupsHeight, NULL); // Set options papplDevicePrintf(device, "PRESENT-AT %d 4\r\n", options->media.top_offset * options->printer_resolution[1] / 2540); if ((darkness = options->print_darkness + options->darkness_configured) < 0) darkness = 0; else if (darkness > 100) darkness = 100; papplDevicePrintf(device, "TONE %d\r\n", 2 * darkness); if (options->print_speed > 0) papplDevicePrintf(device, "SPEED %d\r\n", 5 * options->print_speed / (4 * 2540)); if (options->finishings & PAPPL_FINISHINGS_TRIM) papplDevicePuts(device, "CUT\r\n"); if (options->media.type[0] && strcmp(options->media.type, "labels")) { // Continuous media, so always set tracking to continuous... options->media.tracking = PAPPL_MEDIA_TRACKING_CONTINUOUS; } if (options->media.tracking != PAPPL_MEDIA_TRACKING_CONTINUOUS) papplDevicePuts(device, "FORM\r\n"); // Eject papplDevicePuts(device, "PRINT\r\n"); papplDeviceFlush(device); // Free memory and return... lprintDitherFree(&cpcl->dither); return (true); } // // 'lprint_cpcl_rstartjob()' - Start a job. // static bool // O - `true` on success, `false` on failure lprint_cpcl_rstartjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_cpcl_t *cpcl = (lprint_cpcl_t *)calloc(1, sizeof(lprint_cpcl_t)); // CPCL driver data (void)options; (void)device; // Save driver data... papplJobSetData(job, cpcl); return (true); } // // 'lprint_cpcl_rstartpage()' - Start a page. // static bool // O - `true` on success, `false` on failure lprint_cpcl_rstartpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_cpcl_t *cpcl = (lprint_cpcl_t *)papplJobGetData(job); // CPCL driver data (void)page; // Initialize the dither buffer... if (!lprintDitherAlloc(&cpcl->dither, job, options, CUPS_CSPACE_W, options->header.HWResolution[0] == 300 ? 1.2 : 1.0)) return (false); // Initialize the printer... papplDevicePrintf(device, "! 0 %u %u %u %u\r\n", options->header.HWResolution[0], options->header.HWResolution[1], options->header.cupsHeight, options->header.NumCopies); papplDevicePrintf(device, "PAGE-WIDTH %u\r\n", options->header.cupsWidth); papplDevicePrintf(device, "PAGE-HEIGHT %u\r\n", options->header.cupsHeight); // Start the page image... papplDevicePuts(device, "CLS\n"); papplDevicePrintf(device, "BITMAP 0,0,%u,%u,1,", cpcl->dither.out_width, options->header.cupsHeight); return (true); } // // 'lprint_cpcl_rwriteline()' - Write a raster line. // static bool // O - `true` on success, `false` on failure lprint_cpcl_rwriteline( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned y, // I - Line number const unsigned char *line) // I - Line { lprint_cpcl_t *cpcl = (lprint_cpcl_t *)papplJobGetData(job); // CPCL driver data (void)options; // Dither and write the line... if (lprintDitherLine(&cpcl->dither, y, line)) { if (cpcl->dither.output[0] || memcmp(cpcl->dither.output, cpcl->dither.output + 1, cpcl->dither.out_width - 1)) { papplDevicePrintf(device, "CG %u 1 0 %d ", (unsigned)cpcl->dither.out_width, y); papplDeviceWrite(device, cpcl->dither.output, cpcl->dither.out_width); papplDevicePuts(device, "\r\n"); papplDeviceFlush(device); } } return (true); } // // 'lprint_cpcl_status()' - Get current printer status. // static bool // O - `true` on success, `false` on failure lprint_cpcl_status( pappl_printer_t *printer) // I - Printer { (void)printer; return (true); } #endif // LPRINT_EXPERIMENTAL lprint-1.3.1/lprint-cpcl.h000066400000000000000000000004171456151556700154450ustar00rootroot00000000000000// // Experimental CPCL driver table for LPrint, a Label Printer Application // // Copyright © 2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // { "cpcl-203dpi", "CPCL Label Printer", "", NULL }, lprint-1.3.1/lprint-dymo.c000066400000000000000000000410651456151556700154730ustar00rootroot00000000000000// // DYMO driver for LPrint, a Label Printer Application // // Copyright © 2019-2023 by Michael R Sweet. // Copyright © 2007-2019 by Apple Inc. // Copyright © 2001-2007 by Easy Software Products. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" // // Local types... // typedef enum lprint_dlang_e { LPRINT_DLANG_LABEL, // Label printing LPRINT_DLANG_TAPE // Tape printing } lprint_dlang_t; typedef struct lprint_dymo_s // DYMO driver data { lprint_dlang_t dlang; // Printer language lprint_dither_t dither; // Dithering buffer int feed, // Accumulated feed min_leader, // Leader distance for cut normal_leader; // Leader distance for top of label } lprint_dymo_t; // // Local globals... // static const char * const lprint_dymo_label[] = { // Supported media sizes for labels "oe_thin-multipurpose-label_0.375x2.8125in", "oe_library-barcode-label_0.5x1.875in", "oe_hanging-file-tab-insert_0.5625x2in", "oe_file-folder-label_0.5625x3.4375in", "oe_return-address-label_0.75x2in", "oe_barcode-label_0.75x2.5in", "oe_video-spine-label_0.75x5.875in", "oe_price-tag-label_0.9375x0.875in", "oe_square-multipurpose-label_1x1in", "oe_book-spine-label_1x1.5in", "oe_sm-multipurpose-label_1x2.125in", "oe_2-up-file-folder-label_1.125x3.4375in", "oe_address-label_1.125x3.5in", "oe_internet-postage-label_1.25x1.625in", "oe_lg-address-label_1.4x3.5in", "oe_video-top-label_1.8x3.1in", "oe_multipurpose-label_2x2.3125in", "oe_md-appointment-card_2x3.5in", "oe_lg-multipurpose-label_2.125x.75in", "oe_shipping-label_2.125x4in", "oe_continuous-label_2.125x3600in", "oe_md-multipurpose-label_2.25x1.25in", "oe_media-label_2.25x2.25in", "oe_2-up-address-label_2.25x3.5in", "oe_name-badge-label_2.25x4in", "oe_3-part-postage-label_2.25x7in", "oe_2-part-internet-postage-label_2.25x7.5in", "oe_shipping-label_2.3125x4in", "oe_internet-postage-label_2.3125x7in", "oe_internet-postage-confirmation-label_2.3125x10.5in", "roll_max_2.3125x3600in", "roll_min_0.25x0.25in" }; static const char * const lprint_dymo_tape[] = { // Supported media sizes for tape "oe_thin-1in-tape_0.25x1in", "oe_thinner-1in-tape_0.375x1in", "oe_medium-1in-tape_0.5x1in", "oe_wider-1in-tape_0.75x1in", "oe_wide-1in-tape_1x1in", "oe_thin-2in-tape_0.25x2in", "oe_thinner-2in-tape_0.375x2in", "oe_medium-2in-tape_0.5x2in", "oe_wider-2in-tape_0.75x2in", "oe_wide-2in-tape_1x2in", "oe_thin-3in-tape_0.25x3in", "oe_thinner-3in-tape_0.375x3in", "oe_medium-3in-tape_0.5x3in", "oe_wider-3in-tape_0.75x3in", "oe_wide-3in-tape_1x3in", "roll_max_1x3600in", "roll_min_0.25x1in" }; // // Local functions... // static void lprint_dymo_init(pappl_job_t *job, lprint_dymo_t *dymo); static bool lprint_dymo_printfile(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_dymo_rendjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_dymo_rendpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_dymo_rstartjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_dymo_rstartpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_dymo_rwriteline(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned y, const unsigned char *line); static bool lprint_dymo_status(pappl_printer_t *printer); // // 'lprintDYMO()' - Initialize the DYMO driver. // bool // O - `true` on success, `false` on error lprintDYMO( pappl_system_t *system, // I - System const char *driver_name,// I - Driver name const char *device_uri, // I - Device URI const char *device_id, // I - 1284 device ID pappl_pr_driver_data_t *data, // I - Pointer to driver data ipp_t **attrs, // O - Pointer to driver attributes void *cbdata) // I - Callback data (not used) { data->printfile_cb = lprint_dymo_printfile; data->rendjob_cb = lprint_dymo_rendjob; data->rendpage_cb = lprint_dymo_rendpage; data->rstartjob_cb = lprint_dymo_rstartjob; data->rstartpage_cb = lprint_dymo_rstartpage; data->rwriteline_cb = lprint_dymo_rwriteline; data->status_cb = lprint_dymo_status; if (!strncmp(driver_name, "dymo_lm-", 8) || strstr(driver_name, "-tape")) { // Vendor-specific format... data->format = "application/vnd.dymo-lm"; // Set pages-per-minute based on 3" of tape; not exact but // we need to report something... data->ppm = 20; // Tape printers operate at 180dpi data->num_resolution = 1; data->x_resolution[0] = 180; data->y_resolution[0] = 180; data->x_default = data->y_default = 180; data->left_right = 1; data->bottom_top = 1; data->num_media = (int)(sizeof(lprint_dymo_tape) / sizeof(lprint_dymo_tape[0])); memcpy(data->media, lprint_dymo_tape, sizeof(lprint_dymo_tape)); data->num_source = 1; data->source[0] = "main-roll"; papplCopyString(data->media_ready[0].size_name, "oe_wide-2in-tape_1x2in", sizeof(data->media_ready[0].size_name)); } else { // Vendor-specific format... data->format = "application/vnd.dymo-lw"; // Set pages-per-minute based on 1.125x3.5" address labels; not exact but // we need to report something... if (strstr(driver_name, "-turbo")) data->ppm = 60; else data->ppm = 30; // Label printers operate at 300dpi data->num_resolution = 1; data->x_resolution[0] = 300; data->y_resolution[0] = 300; data->x_default = data->y_default = 300; // Media... data->left_right = 367; data->bottom_top = 1; data->num_media = (int)(sizeof(lprint_dymo_label) / sizeof(lprint_dymo_label[0])); memcpy(data->media, lprint_dymo_label, sizeof(lprint_dymo_label)); if (strstr(driver_name, "-twin")) { data->num_source = 2; data->source[0] = "main-roll"; data->source[1] = "alternate-roll"; papplCopyString(data->media_ready[0].size_name, "oe_address-label_1.125x3.5in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); papplCopyString(data->media_ready[1].size_name, "oe_address-label_1.125x3.5in", sizeof(data->media_ready[1].size_name)); papplCopyString(data->media_ready[1].type, "labels", sizeof(data->media_ready[0].type)); } else { data->num_source = 1; data->source[0] = "main-roll"; papplCopyString(data->media_ready[0].size_name, "oe_address-label_1.125x3.5in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); } } data->tracking_supported = PAPPL_MEDIA_TRACKING_WEB; data->num_type = 1; data->type[0] = "labels"; // Darkness/density support... data->darkness_configured = 50; data->darkness_supported = 4; return (true); } // // 'lprint_dymo_init()' - Initialize DYMO driver data based on the driver name... // static void lprint_dymo_init( pappl_job_t *job, // I - Job lprint_dymo_t *dymo) // O - Driver data { const char *driver_name; // Driver name driver_name = papplPrinterGetDriverName(papplJobGetPrinter(job)); if (!strncmp(driver_name, "dymo_lm-", 8) || strstr(driver_name, "-tape")) { dymo->dlang = LPRINT_DLANG_TAPE; if (!strcmp(driver_name, "dymo_lw-duo-tape") || !strcmp(driver_name, "dymo_lw-duo-tape-128") || !strcmp(driver_name, "dymo_lw-450-duo-tape")) { dymo->min_leader = 61; dymo->normal_leader = 14; } else if (!strcmp(driver_name, "dymo_lm-pnp")) { dymo->min_leader = 58; dymo->normal_leader = 17; } else { dymo->min_leader = 55; dymo->normal_leader = 20; } } else { dymo->dlang = LPRINT_DLANG_LABEL; } } // // 'lprint_dymo_printfile()' - Print a file. // static bool // O - `true` on success, `false` on failure lprint_dymo_printfile( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { int fd; // Input file ssize_t bytes; // Bytes read/written char buffer[65536]; // Read/write buffer lprint_dymo_t dymo; // Driver data // Initialize driver data... lprint_dymo_init(job, &dymo); // Reset the printer... lprint_dymo_rstartjob(job, options, device); // Copy the raw file... papplJobSetImpressions(job, 1); if ((fd = open(papplJobGetFilename(job), O_RDONLY)) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to open print file '%s': %s", papplJobGetFilename(job), strerror(errno)); return (false); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) { if (papplDeviceWrite(device, buffer, (size_t)bytes) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to send %d bytes to printer.", (int)bytes); close(fd); return (false); } } close(fd); lprint_dymo_rstartjob(job, options, device); papplJobSetImpressionsCompleted(job, 1); return (true); } // // 'lprint_dymo_rend()' - End a job. // static bool // O - `true` on success, `false` on failure lprint_dymo_rendjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_dymo_t *dymo = (lprint_dymo_t *)papplJobGetData(job); // DYMO driver data (void)options; free(dymo); papplJobSetData(job, NULL); return (true); } // // 'lprint_dymo_rendpage()' - End a page. // static bool // O - `true` on success, `false` on failure lprint_dymo_rendpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_dymo_t *dymo = (lprint_dymo_t *)papplJobGetData(job); // DYMO driver data char buffer[256]; // Command buffer (void)page; lprint_dymo_rwriteline(job, options, device, options->header.cupsHeight, NULL); switch (dymo->dlang) { case LPRINT_DLANG_LABEL : break; case LPRINT_DLANG_TAPE : // Skip and cut... papplDevicePrintf(device, "\033D%c", 0); memset(buffer, 0x16, dymo->min_leader); papplDeviceWrite(device, buffer, dymo->min_leader); break; } // Eject/cut papplDevicePuts(device, "\033E"); papplDeviceFlush(device); // Free memory and return... lprintDitherFree(&dymo->dither); return (true); } // // 'lprint_dymo_rstartjob()' - Start a job. // static bool // O - `true` on success, `false` on failure lprint_dymo_rstartjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_dymo_t *dymo = (lprint_dymo_t *)calloc(1, sizeof(lprint_dymo_t)); // DYMO driver data char buffer[23]; // Buffer for reset command (void)options; // Initialize driver data... lprint_dymo_init(job, dymo); papplJobSetData(job, dymo); // Reset the printer... switch (dymo->dlang) { case LPRINT_DLANG_LABEL : papplDevicePuts(device, "\033\033\033\033\033\033\033\033\033\033" "\033\033\033\033\033\033\033\033\033\033" "\033\033\033\033\033\033\033\033\033\033" "\033\033\033\033\033\033\033\033\033\033" "\033\033\033\033\033\033\033\033\033\033" "\033\033\033\033\033\033\033\033\033\033" "\033\033\033\033\033\033\033\033\033\033" "\033\033\033\033\033\033\033\033\033\033" "\033\033\033\033\033\033\033\033\033\033" "\033\033\033\033\033\033\033\033\033\033" "\033@"); break; case LPRINT_DLANG_TAPE : // Send nul bytes to clear input buffer... memset(buffer, 0, sizeof(buffer)); papplDeviceWrite(device, buffer, sizeof(buffer)); // Set tape color to black on white... papplDevicePrintf(device, "\033C%c", 0); break; } return (true); } // // 'lprint_dymo_rstartpage()' - Start a page. // static bool // O - `true` on success, `false` on failure lprint_dymo_rstartpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { pappl_pr_driver_data_t data; // Generic driver data lprint_dymo_t *dymo = (lprint_dymo_t *)papplJobGetData(job); // DYMO driver data int darkness = options->darkness_configured + options->print_darkness; // Combined density const char *density = "cdeg"; // Density codes int i; // Looping var char buffer[256]; // Command buffer double out_gamma = 1.0; // Output gamma correction (void)page; if (options->header.cupsWidth > 2048) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Raster data too large for printer."); return (false); } if (options->header.HWResolution[0] == 300) out_gamma = 1.2; if (!lprintDitherAlloc(&dymo->dither, job, options, CUPS_CSPACE_K, out_gamma)) return (false); dymo->feed = 0; switch (dymo->dlang) { case LPRINT_DLANG_LABEL : papplDevicePrintf(device, "\033Q%c%c", 0, 0); papplDevicePrintf(device, "\033B%c", 0); papplDevicePrintf(device, "\033L%c%c", options->header.cupsHeight >> 8, options->header.cupsHeight); papplDevicePrintf(device, "\033D%c", dymo->dither.out_width); papplPrinterGetDriverData(papplJobGetPrinter(job), &data); // Match roll number to loaded media... for (i = 0; i < data.num_source; i ++) { if (data.media_ready[i].size_width == options->media.size_width && data.media_ready[i].size_length == options->media.size_length) break; } if (i >= data.num_source) { // No match, so use what the client sent... i = !strcmp(options->media.source, "alternate-roll"); } papplDevicePrintf(device, "\033q%d", i + 1); if (darkness < 0) darkness = 0; else if (darkness > 100) darkness = 100; papplDevicePrintf(device, "\033%c", density[3 * darkness / 100]); break; case LPRINT_DLANG_TAPE : // Set line width... papplDevicePrintf(device, "\033D%c", 0); // Feed for the leader... memset(buffer, 0x16, dymo->normal_leader); papplDeviceWrite(device, buffer, dymo->normal_leader); // Set indentation... papplDevicePrintf(device, "\033B%c", 0); break; } return (true); } // // 'lprint_dymo_rwriteline()' - Write a raster line. // static bool // O - `true` on success, `false` on failure lprint_dymo_rwriteline( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned y, // I - Line number const unsigned char *line) // I - Line { lprint_dymo_t *dymo = (lprint_dymo_t *)papplJobGetData(job); // DYMO driver data unsigned char byte; // Byte to write if (!lprintDitherLine(&dymo->dither, y, line)) return (true); if (dymo->dither.output[0] || memcmp(dymo->dither.output, dymo->dither.output + 1, dymo->dither.out_width - 1)) { // Not a blank line switch (dymo->dlang) { case LPRINT_DLANG_LABEL : // Feed for any prior blank lines... if (dymo->feed) { while (dymo->feed > 255) { papplDevicePrintf(device, "\033f\001%c", 255); dymo->feed -= 255; } papplDevicePrintf(device, "\033f\001%c", dymo->feed); dymo->feed = 0; } // Then write the non-blank line... byte = 0x16; papplDeviceWrite(device, &byte, 1); papplDeviceWrite(device, dymo->dither.output, dymo->dither.out_width); break; case LPRINT_DLANG_TAPE : if (dymo->feed) { unsigned char buffer[256]; // Write buffer papplDevicePrintf(device, "\033D%c", 0); memset(buffer, 0x16, sizeof(buffer)); while (dymo->feed > 255) { papplDeviceWrite(device, buffer, sizeof(buffer)); dymo->feed -= 256; } if (dymo->feed > 0) { papplDeviceWrite(device, buffer, dymo->feed); dymo->feed = 0; } } papplDevicePrintf(device, "\033D%c\026", dymo->dither.out_width); papplDeviceWrite(device, dymo->dither.output, dymo->dither.out_width); break; } } else { // Blank line, accumulate the feed... dymo->feed ++; } return (true); } // // 'lprint_dymo_status()' - Get current printer status. // static bool // O - `true` on success, `false` on failure lprint_dymo_status( pappl_printer_t *printer) // I - Printer { (void)printer; return (true); } lprint-1.3.1/lprint-dymo.h000066400000000000000000000055701456151556700155010ustar00rootroot00000000000000// // DYMO driver table for LPrint, a Label Printer Application // // Copyright © 2019-2023 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // { "dymo_lm-400", "DYMO LabelMANAGER 400", "MFG:DYMO;MDL:LabelMANAGER 400 ;", NULL }, { "dymo_lm-450", "DYMO LabelMANAGER 450", "MFG:DYMO;MDL:LabelMANAGER 450 ;", NULL }, { "dymo_lm-pc", "DYMO LabelMANAGER PC", "MFG:DYMO;MDL:LabelMANAGER PC ;", NULL }, { "dymo_lm-pc-ii", "DYMO LabelMANAGER PC II", "MFG:DYMO;MDL:LabelMANAGER PC II ;", NULL }, { "dymo_lm-pnp", "DYMO LabelMANAGER PNP", "MFG:DYMO;MDL:LabelMANAGER PNP ;", NULL }, { "dymo_lp-350", "DYMO LabelPOINT 350", "MFG:DYMO;MDL:LabelPOINT 350 ;", NULL }, { "dymo_lw-300", "DYMO LabelWriter 300", "MFG:DYMO;MDL:LabelWriter 300;", NULL }, { "dymo_lw-310", "DYMO LabelWriter 310", "MFG:DYMO;MDL:LabelWriter 310;", NULL }, { "dymo_lw-315", "DYMO LabelWriter 315", "MFG:DYMO;MDL:LabelWriter 315;", NULL }, { "dymo_lw-320", "DYMO LabelWriter 320", "MFG:DYMO;MDL:LabelWriter 320;", NULL }, { "dymo_lw-330", "DYMO LabelWriter 330", "MFG:DYMO;MDL:LabelWriter 330;", NULL }, { "dymo_lw-330-turbo", "DYMO LabelWriter 330 Turbo", "MFG:DYMO;MDL:LabelWriter 330 Turbo;", NULL }, { "dymo_lw-400", "DYMO LabelWriter 400", "MFG:DYMO;MDL:LabelWriter ;", NULL }, { "dymo_lw-400-turbo", "DYMO LabelWriter 400 Turbo", "MFG:DYMO;MDL:LabelWriter ;", NULL }, { "dymo_lw-450", "DYMO LabelWriter 450", "MFG:DYMO;MDL:LabelWriter 450;", NULL }, { "dymo_lw-450-duo-label", "DYMO LabelWriter 450 DUO Label", "MFG:DYMO;MDL:LabelWriter 450 DUO Label;", NULL }, { "dymo_lw-450-duo-tape", "DYMO LabelWriter 450 DUO Tape", "MFG:DYMO;MDL:LabelWriter 450 DUO Tape;", NULL }, { "dymo_lw-450-turbo", "DYMO LabelWriter 450 Turbo", "MFG:DYMO;MDL:LabelWriter 450 Turbo;", NULL }, { "dymo_lw-450-twin-turbo", "DYMO LabelWriter 450 Twin Turbo", "MFG:DYMO;MDL:LabelWriter 450 Twin Turbo;", NULL }, { "dymo_lw-4xl", "DYMO LabelWriter 4XL", "MFG:DYMO;MDL:LabelWriter 4XL;", NULL }, { "dymo_lw-duo-label", "DYMO LabelWriter DUO Label", "MFG:DYMO;MDL:LabelWriter DUO Label;", NULL }, { "dymo_lw-duo-tape", "DYMO LabelWriter DUO Tape", "MFG:DYMO;MDL:LabelWriter DUO Tape;", NULL }, { "dymo_lw-duo-tape-128", "DYMO LabelWriter DUO Tape 128", "MFG:DYMO;MDL:LabelWriter DUO Tape 128;", NULL }, { "dymo_lw-se450", "DYMO LabelWriter SE450", "MFG:DYMO;MDL:LabelWriter SE450;", NULL }, //{ "dymo_lw-wireless", "DYMO LabelWriter Wireless", "", NULL }, //{ "dymo_lw-550", "DYMO LabelWriter 550", "", NULL }, //{ "dymo_lw-550-turbo", "DYMO LabelWriter 550 Turbo", "", NULL }, //{ "dymo_lw-5xl", "DYMO LabelWriter 5XL", "", NULL }, lprint-1.3.1/lprint-epl2.c000066400000000000000000000263161456151556700153670ustar00rootroot00000000000000// // EPL2 driver for LPrint, a Label Printer Application // // Copyright © 2019-2023 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" // // Local globals... // static const char * const lprint_epl2_2inch_media[] = { // Supported 2 inch media sizes "oe_1.25x0.25-label_1.25x0.25in", "oe_1.25x2.25-label_1.25x2.25in", "oe_1.5x0.25-label_1.5x0.25in", "oe_1.5x0.5-label_1.5x0.5in", "oe_1.5x1-label_1.5x1in", "oe_1.5x2-label_1.5x2in", "oe_2x0.37-label_2x0.37in", "oe_2x0.5-label_2x0.5in", "oe_2x1-label_2x1in", "oe_2x1.25-label_2x1.25in", "oe_2x2-label_2x2in", "oe_2x3-label_2x3in", "oe_2x4-label_2x4in", "oe_2x5.5-label_2x5.5in", "roll_max_2x100in", "roll_min_0.75x0.25in" }; static const char * const lprint_epl2_4inch_media[] = { // Supported 4 inch media sizes "oe_1.25x0.25-label_1.25x0.25in", "oe_1.25x2.25-label_1.25x2.25in", "oe_1.5x0.25-label_1.5x0.25in", "oe_1.5x0.5-label_1.5x0.5in", "oe_1.5x1-label_1.5x1in", "oe_1.5x2-label_1.5x2in", "oe_2x0.37-label_2x0.37in", "oe_2x0.5-label_2x0.5in", "oe_2x1-label_2x1in", "oe_2x1.25-label_2x1.25in", "oe_2x2-label_2x2in", "oe_2x3-label_2x3in", "oe_2x4-label_2x4in", "oe_2x5.5-label_2x5.5in", "oe_2.25x0.5-label_2.25x0.5in", "oe_2.25x1.25-label_2.25x1.25in", "oe_30859-paint-can-label_2.25x3.125in", "oe_2.25x4-label_2.25x4in", "oe_2.25x5.5-label_2.25x5.5in", "oe_2.38x5.5-label_2.38x5.5in", "oe_2.5x1-label_2.5x1in", "oe_2.5x2-label_2.5x2in", "oe_2.75x1.25-label_2.75x1.25in", "oe_2.9x1-label_2.9x1in", "oe_3x1-label_3x1in", "oe_3x1.25-label_3x1.25in", "oe_3x2-label_3x2in", "oe_3x3-label_3x3in", "oe_3x5-label_3x5in", "oe_3.25x2-label_3.25x2in", "oe_3.25x5-label_3.25x5in", "oe_3.25x5.5-label_3.25x5.5in", "oe_3.25x5.83-label_3.25x5.83in", "oe_3.25x7.83-label_3.25x7.83in", "oe_3.5x1-label_3.5x1in", "oe_4x1-label_4x1in", "oe_4x2-label_4x2in", "oe_4x3-label_4x3in", "oe_4x4-label_4x4in", "oe_4x5-label_4x5in", "oe_4x6-label_4x6in", "oe_4x6.5-label_4x6.5in", "oe_4x13-label_4x13in", /* "oe_6x1-label_6x1in", "oe_6x2-label_6x2in", "oe_6x3-label_6x3in", "oe_6x4-label_6x4in", "oe_6x5-label_6x5in", "oe_6x6-label_6x6in", "oe_6x6.5-label_6x6.5in", "oe_6x13-label_6x13in", "oe_8x1-label_8x1in", "oe_8x2-label_8x2in", "oe_8x3-label_8x3in", "oe_8x4-label_8x4in", "oe_8x5-label_8x5in", "oe_8x6-label_8x6in", "oe_8x6.5-label_8x6.5in", "oe_8x13-label_8x13in",*/ "roll_max_4x100in", "roll_min_0.75x0.25in" }; // // Local functions... // static bool lprint_epl2_printfile(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_epl2_rendjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_epl2_rendpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_epl2_rstartjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_epl2_rstartpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_epl2_rwriteline(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned y, const unsigned char *line); static bool lprint_epl2_status(pappl_printer_t *printer); // // 'lprintInitEPL2()' - Initialize the driver. // bool // O - `true` on success, `false` on error lprintEPL2( pappl_system_t *system, // I - System const char *driver_name,// I - Driver name const char *device_uri, // I - Device URI const char *device_id, // I - 1284 device ID pappl_pr_driver_data_t *data, // I - Pointer to driver data ipp_t **attrs, // O - Pointer to driver attributes void *cbdata) // I - Callback data (not used) { data->printfile_cb = lprint_epl2_printfile; data->rendjob_cb = lprint_epl2_rendjob; data->rendpage_cb = lprint_epl2_rendpage; data->rstartjob_cb = lprint_epl2_rstartjob; data->rstartpage_cb = lprint_epl2_rstartpage; data->rwriteline_cb = lprint_epl2_rwriteline; data->status_cb = lprint_epl2_status; data->format = LPRINT_EPL2_MIMETYPE; data->num_resolution = 1; if (strstr(driver_name, "-203dpi")) { data->x_resolution[0] = 203; data->y_resolution[0] = 203; } else { data->x_resolution[0] = 300; data->y_resolution[0] = 300; } data->x_default = data->y_default = data->x_resolution[0]; if (strstr(driver_name, "-cutter")) data->finishings |= PAPPL_FINISHINGS_TRIM; if (!strncmp(driver_name, "epl2_2inch-", 16)) { // 2 inch printer... data->num_media = (int)(sizeof(lprint_epl2_2inch_media) / sizeof(lprint_epl2_2inch_media[0])); memcpy(data->media, lprint_epl2_2inch_media, sizeof(lprint_epl2_2inch_media)); papplCopyString(data->media_ready[0].size_name, "oe_2x3-label_2x3in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); } else { // 4 inch printer... data->num_media = (int)(sizeof(lprint_epl2_4inch_media) / sizeof(lprint_epl2_4inch_media[0])); memcpy(data->media, lprint_epl2_4inch_media, sizeof(lprint_epl2_4inch_media)); papplCopyString(data->media_ready[0].size_name, "na_index-4x6_4x6in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); } data->bottom_top = data->left_right = 1; data->num_source = 1; data->source[0] = "main-roll"; data->num_type = 3; data->type[0] = "continuous"; data->type[1] = "labels"; data->type[2] = "labels-continuous"; data->mode_configured = PAPPL_LABEL_MODE_TEAR_OFF; data->mode_supported = PAPPL_LABEL_MODE_APPLICATOR | PAPPL_LABEL_MODE_CUTTER | PAPPL_LABEL_MODE_CUTTER_DELAYED | PAPPL_LABEL_MODE_KIOSK | PAPPL_LABEL_MODE_PEEL_OFF | PAPPL_LABEL_MODE_PEEL_OFF_PREPEEL | PAPPL_LABEL_MODE_REWIND | PAPPL_LABEL_MODE_RFID | PAPPL_LABEL_MODE_TEAR_OFF; data->speed_default = 0; data->speed_supported[0] = 2540; data->speed_supported[1] = 6 * 2540; data->darkness_configured = 50; data->darkness_supported = 30; return (true); } // // 'lprint_epl2_print()' - Print a file. // static bool // O - `true` on success, `false` on failure lprint_epl2_printfile( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { int fd; // Input file ssize_t bytes; // Bytes read/written char buffer[65536]; // Read/write buffer // Copy the raw file... papplJobSetImpressions(job, 1); if ((fd = open(papplJobGetFilename(job), O_RDONLY)) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to open print file '%s': %s", papplJobGetFilename(job), strerror(errno)); return (false); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) { if (papplDeviceWrite(device, buffer, (size_t)bytes) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to send %d bytes to printer.", (int)bytes); close(fd); return (false); } } close(fd); papplJobSetImpressionsCompleted(job, 1); return (true); } // // 'lprint_epl2_rendjob()' - End a job. // static bool // O - `true` on success, `false` on failure lprint_epl2_rendjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_dither_t *dither = (lprint_dither_t *)papplJobGetData(job); // Dither buffer (void)options; (void)device; free(dither); papplJobSetData(job, NULL); return (true); } // // 'lprint_epl2_rendpage()' - End a page. // static bool // O - `true` on success, `false` on failure lprint_epl2_rendpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_dither_t *dither = (lprint_dither_t *)papplJobGetData(job); // Dither buffer (void)page; lprint_epl2_rwriteline(job, options, device, options->header.cupsHeight, NULL); papplDevicePuts(device, "P1\n"); if (options->finishings & PAPPL_FINISHINGS_TRIM) papplDevicePuts(device, "C\n"); // Free memory and return... lprintDitherFree(dither); return (true); } // // 'lprint_epl2_rstartjob()' - Start a job. // static bool // O - `true` on success, `false` on failure lprint_epl2_rstartjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_dither_t *dither = (lprint_dither_t *)calloc(1, sizeof(lprint_dither_t)); // Dither buffer (void)options; (void)device; // Save dither buffer for job... papplJobSetData(job, dither); return (true); } // // 'lprint_epl2_rstartpage()' - Start a page. // static bool // O - `true` on success, `false` on failure lprint_epl2_rstartpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { int ips; // Inches per second lprint_dither_t *dither = (lprint_dither_t *)papplJobGetData(job); // Dither buffer int darkness; // Composite darkness value double out_gamma = 1.0; // Output gamma correction (void)page; // Initialize the dither buffer... if (options->header.HWResolution[0] == 300) out_gamma = 1.2; if (!lprintDitherAlloc(dither, job, options, CUPS_CSPACE_W, out_gamma)) return (false); // Start a new label... papplDevicePuts(device, "\nN\n"); // print-darkness if ((darkness = options->print_darkness + options->darkness_configured) < 0) darkness = 0; else if (darkness > 100) darkness = 100; papplDevicePrintf(device, "D%d\n", 15 * darkness / 100); // print-speed if ((ips = options->print_speed / 2540) > 0) papplDevicePrintf(device, "S%d\n", ips); // Set label width... papplDevicePrintf(device, "q%u\n", dither->out_width * 8); return (true); } // // 'lprint_epl2_rwriteline()' - Write a raster line. // static bool // O - `true` on success, `false` on failure lprint_epl2_rwriteline( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned y, // I - Line number const unsigned char *line) // I - Line { lprint_dither_t *dither = (lprint_dither_t *)papplJobGetData(job); // Dither buffer if (!lprintDitherLine(dither, y, line)) return (true); if (dither->output[0] || memcmp(dither->output, dither->output + 1, dither->out_width - 1)) { // Not a blank line papplDevicePrintf(device, "GW0,%u,%u,1\n", y, dither->out_width); papplDeviceWrite(device, dither->output, dither->out_width); papplDevicePuts(device, "\n"); } return (true); } // // 'lprint_epl2_status()' - Get current printer status. // static bool // O - `true` on success, `false` on failure lprint_epl2_status( pappl_printer_t *printer) // I - Printer { (void)printer; return (true); } lprint-1.3.1/lprint-epl2.h000066400000000000000000000020011456151556700153550ustar00rootroot00000000000000// // EPL2 driver table for LPrint, a Label Printer Application // // Copyright © 2019-2023 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // { "epl2_2inch-203dpi-dt", "Zebra EPL Page Mode 2-inch/203dpi/Direct-Thermal", "", NULL }, { "epl2_2inch-203dpi-tt", "Zebra EPL Page Mode 2-inch/203dpi/Thermal-Transfer", "", NULL }, { "epl2_2inch-300dpi-dt", "Zebra EPL Page Mode 2-inch/300dpi/Direct-Thermal", "", NULL }, { "epl2_2inch-300dpi-tt", "Zebra EPL Page Mode 2-inch/300dpi/Thermal-Transfer", "", NULL }, { "epl2_4inch-203dpi-dt", "Zebra EPL Page Mode 4-inch/203dpi/Direct-Thermal", "COMMAND SET:EPL;", NULL }, { "epl2_4inch-203dpi-tt", "Zebra EPL Page Mode 4-inch/203dpi/Thermal-Transfer", "", NULL }, { "epl2_4inch-300dpi-dt", "Zebra EPL Page Mode 4-inch/300dpi/Direct-Thermal", "", NULL }, { "epl2_4inch-300dpi-tt", "Zebra EPL Page Mode 4-inch/300dpi/Thermal-Transfer", "", NULL }, lprint-1.3.1/lprint-sii.c000066400000000000000000000273461456151556700153150ustar00rootroot00000000000000// // Seiko Instruments, Inc. driver for LPrint, a Label Printer Application // // Copyright © 2023 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" // // Local types... // enum lprint_slp_cmd_e { LPRINT_SLP_CMD_NOP = 0x00, LPRINT_SLP_CMD_STATUS, LPRINT_SLP_CMD_VERSION, LPRINT_SLP_CMD_BAUDRATE, LPRINT_SLP_CMD_PRINT, LPRINT_SLP_CMD_PRINTRLE, LPRINT_SLP_CMD_MARGIN, LPRINT_SLP_CMD_REPEAT, LPRINT_SLP_CMD_TAB = 0x09, LPRINT_SLP_CMD_LINEFEED, LPRINT_SLP_CMD_VERTTAB, LPRINT_SLP_CMD_FORMFEED, LPRINT_SLP_CMD_SETSPEED, LPRINT_SLP_CMD_DENSITY, LPRINT_SLP_CMD_RESET, LPRINT_SLP_CMD_MODEL = 0x12, LPRINT_SLP_CMD_INDENT = 0x16, LPRINT_SLP_CMD_FINEMODE, LPRINT_SLP_CMD_SETSERIALNUM = 0x1B, LPRINT_SLP_CMD_CHECK = 0xA5 }; typedef struct lprint_sii_s // SII driver data { unsigned max_width; // Maximum width in dots int blanks; // Blank lines lprint_dither_t dither; // Dither buffer } lprint_sii_t; // // Local globals... // static const char * const lprint_sii_media[] = { // Supported media sizes for labels "om_35mm-slide_9x37mm", "om_8mm-spine_9x66mm", "om_file-folder_13x81mm", "om_return_16x43mm", "om_vhs-spine_18x141mm", "om_round_22x24mm", "om_multi-purpose_24x44mm", "om_address-small_24x83mm", "om_jewelry_27x48mm", "om_retail-label_32x37mm", "om_cut-hanging-15_32x40mm", "om_cut-hanging-13_32x78mm", "om_address-large_35x83mm", "om_euro-name-badge_38x67mm", "om_euro-folder-narrow_38x186mm", "om_euro-file-folder_39x49mm", "om_vhs-face_45x72mm", "om_zip-disk_48x55mm", "om_diskette_48x64mm", "om_media-badge_48x64mm", "om_euro-name-badge-large_48x79mm", "om_4-part-label_48x96mm", "om_shipping_48x96mm", "om_top-coated-paper_48x140mm", "om_euro-folder-wide_48x186mm", "roll_max_48x186mm", "roll_min_9x13mm" }; // // Local functions... // static unsigned lprint_sii_get_max_width(const char *driver_name); static void lprint_sii_init(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, lprint_sii_t *siidata); static bool lprint_sii_printfile(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_sii_rendjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_sii_rendpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_sii_rstartjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_sii_rstartpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_sii_rwriteline(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned y, const unsigned char *line); // // 'lprintSII()' - Initialize the SII driver. // bool // O - `true` on success, `false` on error lprintSII( pappl_system_t *system, // I - System const char *driver_name,// I - Driver name const char *device_uri, // I - Device URI const char *device_id, // I - 1284 device ID pappl_pr_driver_data_t *data, // I - Pointer to driver data ipp_t **attrs, // O - Pointer to driver attributes void *cbdata) // I - Callback data (not used) { // Print callbacks... data->printfile_cb = lprint_sii_printfile; data->rendjob_cb = lprint_sii_rendjob; data->rendpage_cb = lprint_sii_rendpage; data->rstartjob_cb = lprint_sii_rstartjob; data->rstartpage_cb = lprint_sii_rstartpage; data->rwriteline_cb = lprint_sii_rwriteline; // Vendor-specific format... data->format = LPRINT_SLP_MIMETYPE; // Set resolution... data->num_resolution = 1; if (strstr(driver_name, "_203dpi") != NULL) data->x_resolution[0] = data->y_resolution[0] = 203; else data->x_resolution[0] = data->y_resolution[0] = 300; data->x_default = data->y_default = data->x_resolution[0]; // Basically borderless... data->left_right = 1; data->bottom_top = 1; // Supported media... data->num_media = (int)(sizeof(lprint_sii_media) / sizeof(lprint_sii_media[0])); memcpy(data->media, lprint_sii_media, sizeof(lprint_sii_media)); data->num_source = 1; data->source[0] = "main-roll"; papplCopyString(data->media_ready[0].size_name, "om_address-small_24x83mm", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); data->num_type = 1; data->type[0] = "labels"; // Darkness/density settings... data->darkness_configured = 50; data->darkness_supported = 3; return (true); } // // 'lprint_sii_get_max_width()' - Get the maximum width in dots. // static unsigned // O - Maximum width in dots lprint_sii_get_max_width( const char *driver_name) // I - Driver name { switch (atoi(driver_name + 7)) { case 100 : case 410 : return (192); break; case 200 : case 240 : case 420 : case 430 : return (384); break; default : return (576); break; } } // // 'lprint_sii_init()' - Initialize siidata driver data based on the driver name... // static void lprint_sii_init( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device lprint_sii_t *siidata) // O - Driver data { const char *driver_name = papplPrinterGetDriverName(papplJobGetPrinter(job)); // Driver name (void)options; // Initialize driver data and save it... siidata->max_width = lprint_sii_get_max_width(driver_name); switch (atoi(driver_name + 7)) { case 100 : case 410 : // Reset printer... papplDevicePrintf(device, "%c", LPRINT_SLP_CMD_RESET); papplDeviceFlush(device); sleep(3); break; default : // Nothing else to do... break; } papplJobSetData(job, siidata); } // // 'lprint_sii_printfile()' - Print a file. // static bool // O - `true` on success, `false` on failure lprint_sii_printfile( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { int fd; // Input file ssize_t bytes; // Bytes read/written char buffer[65536]; // Read/write buffer lprint_sii_t siidata; // Driver data // Initialize driver data... lprint_sii_init(job, options, device, &siidata); // Copy the raw file... papplJobSetImpressions(job, 1); if ((fd = open(papplJobGetFilename(job), O_RDONLY)) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to open print file \"%s\": %s", papplJobGetFilename(job), strerror(errno)); return (false); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) { if (papplDeviceWrite(device, buffer, (size_t)bytes) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to send %d bytes to printer.", (int)bytes); close(fd); return (false); } } close(fd); papplJobSetImpressionsCompleted(job, 1); return (true); } // // 'lprint_sii_rend()' - End a job. // static bool // O - `true` on success, `false` on failure lprint_sii_rendjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_sii_t *siidata = (lprint_sii_t *)papplJobGetData(job); // SII driver data (void)options; free(siidata); papplJobSetData(job, NULL); return (true); } // // 'lprint_sii_rendpage()' - End a page. // static bool // O - `true` on success, `false` on failure lprint_sii_rendpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_sii_t *siidata = (lprint_sii_t *)papplJobGetData(job); // SII driver data (void)page; // Write last line lprint_sii_rwriteline(job, options, device, options->header.cupsHeight, NULL); // Eject papplDevicePrintf(device, "%c", LPRINT_SLP_CMD_FORMFEED); papplDeviceFlush(device); // Free memory and return... lprintDitherFree(&siidata->dither); return (true); } // // 'lprint_sii_rstartjob()' - Start a job. // static bool // O - `true` on success, `false` on failure lprint_sii_rstartjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_sii_t *siidata = (lprint_sii_t *)calloc(1, sizeof(lprint_sii_t)); // SII driver data (void)options; // Initialize driver data... lprint_sii_init(job, options, device, siidata); return (true); } // // 'lprint_sii_rstartpage()' - Start a page. // static bool // O - `true` on success, `false` on failure lprint_sii_rstartpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_sii_t *siidata = (lprint_sii_t *)papplJobGetData(job); // SII driver data const char *driver_name = papplPrinterGetDriverName(papplJobGetPrinter(job)); // Driver name int darkness; // Combined density (void)page; // Initialize the dither buffer and blanks count... if (!lprintDitherAlloc(&siidata->dither, job, options, CUPS_CSPACE_K, options->header.HWResolution[0] == 300 ? 1.2 : 1.0)) return (false); papplDevicePrintf(device, "%c%c", LPRINT_SLP_CMD_MARGIN, (int)(12.7 * (lprint_sii_get_max_width(driver_name) - options->header.cupsWidth) / options->header.HWResolution[0])); siidata->blanks = 0; // Set darkness... if ((darkness = options->darkness_configured + options->print_darkness) < 0) darkness = 0; else if (darkness > 100) darkness = 100; papplDevicePrintf(device, "%c%c", LPRINT_SLP_CMD_DENSITY, 3 * darkness / 100); // Set quality... switch (atoi(driver_name + 7)) { case 100 : case 200 : case 240 : case 410 : case 420 : case 430 : papplDevicePrintf(device, "%c%c", LPRINT_SLP_CMD_FINEMODE, options->print_quality == IPP_QUALITY_HIGH ? 0x01 : 0x00); break; default : papplDevicePrintf(device, "%c%c", LPRINT_SLP_CMD_SETSPEED, options->print_quality == IPP_QUALITY_HIGH ? 0x02 : 0x00); break; } return (true); } // // 'lprint_sii_rwriteline()' - Write a raster line. // static bool // O - `true` on success, `false` on failure lprint_sii_rwriteline( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned y, // I - Line number const unsigned char *line) // I - Line { lprint_sii_t *siidata = (lprint_sii_t *)papplJobGetData(job); // SII driver data // Dither... if (!lprintDitherLine(&siidata->dither, y, line)) return (true); if (!siidata->dither.output[0] && !memcmp(siidata->dither.output, siidata->dither.output + 1, siidata->dither.out_width - 1)) { // Skip blank lines... siidata->blanks ++; return (true); } // Feed past any blank lines... while (siidata->blanks > 0) { if (siidata->blanks == 1) { papplDevicePuts(device, "\n"); siidata->blanks = 0; } else if (siidata->blanks < 255) { papplDevicePrintf(device, "%c%c", LPRINT_SLP_CMD_VERTTAB, (char)siidata->blanks); siidata->blanks = 0; } else { papplDevicePrintf(device, "%c%c", LPRINT_SLP_CMD_VERTTAB, (char)255); siidata->blanks -= 255; } } // Output bitmap data... papplDevicePrintf(device, "%c%c", LPRINT_SLP_CMD_PRINT, (char)siidata->dither.out_width); papplDeviceWrite(device, siidata->dither.output, siidata->dither.out_width); return (true); } lprint-1.3.1/lprint-sii.h000066400000000000000000000021761456151556700153140ustar00rootroot00000000000000// // Seiko Instruments, Inc. driver table for LPrint, a Label Printer Application // // Copyright © 2023 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // // driver-name make-and-model device-id { "sii_slp100_203dpi", "SII SLP100", "MFG:SII;CMD:SIISLP;MDL:SLP100;", NULL }, { "sii_slp200_203dpi", "SII SLP200", "MFG:SII;CMD:SIISLP;MDL:SLP200;", NULL }, { "sii_slp240_203dpi", "SII SLP240", "MFG:SII;CMD:SIISLP;MDL:SLP240;", NULL }, { "sii_slp410_203dpi", "SII SLP410", "MFG:SII;CMD:SIISLP;MDL:SLP410;", NULL }, { "sii_slp420_203dpi", "SII SLP420", "MFG:SII;CMD:SIISLP;MDL:SLP420;", NULL }, { "sii_slp430_203dpi", "SII SLP430", "MFG:SII;CMD:SIISLP;MDL:SLP430;", NULL }, { "sii_slp440_300dpi", "SII SLP440", "MFG:SII;CMD:SIISLP;MDL:SLP440;", NULL }, { "sii_slp450_300dpi", "SII SLP450", "MFG:SII;CMD:SIISLP;MDL:SLP450;", NULL }, { "sii_slp620_203dpi", "SII SLP620", "MFG:SII;CMD:SIISLP;MDL:SLP620;", NULL }, { "sii_slp650_300dpi", "SII SLP650", "MFG:SII;CMD:SIISLP;MDL:SLP650;", NULL }, { "sii_slp650se_300dpi", "SII SLP650SE", "MFG:SII;CMD:SIISLP;MDL:SLP650SE;", NULL }, lprint-1.3.1/lprint-testpage.c000066400000000000000000000217261456151556700163410ustar00rootroot00000000000000// // Test page generator for LPrint, a Label Printer Application // // Copyright © 2021-2023 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" // // 'lprintTestFilterCB()' - Print a test page. // bool // O - `true` on success, `false` on failure lprintTestFilterCB( pappl_job_t *job, // I - Job pappl_device_t *device, // I - Output device void *cbdata) // I - Callback data (not used) { pappl_pr_driver_data_t data; // Printer driver data pappl_pr_options_t *options = papplJobCreatePrintOptions(job, 1, false); // Print options unsigned char *line = NULL, // Output line *lineptr; // Pointer into line unsigned width, // Width accounting for margins height, // Height accounting for margins y, // Current position in page ytop, yend, ybottom, // Top/end-of-image/bottom lines in page xc, // X count x1mm, y1mm, // Number of columns/rows per pixel (nominally 1mm) xleft, // Start for line pw, ph; // Image width and height const char **pixels, // Output image pixels *pixel; // Current output pixel bool ret = false; // Return value static const char *portrait[] = // Portrait label image { ".... ", ".TTT. ", ".TT. ", ".TT. ..", ".TT...........T.", ".TTTTTTTTTTTTTT.", ".TTTTTTTTTTTTTT.", ".TT...........T.", ".TT. ..", ".TT. ", ".TTT. ", ".... ", " .. ... ", " .SS. .SSS. ", " .SS. .SSSSS. ", " .SS. .SS..SS. ", ".SS. .SS. .SS.", ".SS. .SS. .SS.", ".SS. .SS. .SS.", ".SS. .SS. .SS.", " .SS..SS. .SS. ", " .SSSSS. .SS. ", " .SSS. .SS. ", " ... .. ", ".... ....", ".EEE. .EEE.", ".EE. .... .EE.", ".EE. .EEEE. .EE.", ".EE. .EE. .EE.", ".EE. .EE. .EE.", ".EE. .EE. .EE.", ".EE. .EE. .EE.", ".EE....EE....EE.", ".EEEEEEEEEEEEEE.", ".EEEEEEEEEEEEEE.", "................", ".... ", ".TTT. ", ".TT. ", ".TT. ..", ".TT...........T.", ".TTTTTTTTTTTTTT.", ".TTTTTTTTTTTTTT.", ".TT...........T.", ".TT. ..", ".TT. ", ".TTT. ", ".... " }; static const char *landscape[] = // Landscape label image { "........................ .... ............", ".TTTTTTTTTT..EEEEEEEEEE. ..SSSS.. .TTTTTTTTTT.", ".TTTTTTTTTT..EEEEEEEEEE. .SSSSSSSS. .TTTTTTTTTT.", ".T...TT...T..EE.......E..SSS....SSS..T...TT...T.", " . .TT. . .EE. . .SS. ..S. . .TT. . ", " .TT. .EE. . .SS.. . .TT. ", " .TT. .EE.....E. .SSS.. .TT. ", " .TT. .EEEEEEEE. .SSSS.. .TT. ", " .TT. .EEEEEEEE. ..SSSS. .TT. ", " .TT. .EE.....E. ..SSS. .TT. ", " .TT. .EE. . . ..SS. .TT. ", " .TT. .EE. . .S. .SS. .TT. ", " .TT. .EE.......E..SSS....SSS. .TT. ", " .TT. .EEEEEEEEEE. .SSSSSSSS. .TT. ", " .TTTT. .EEEEEEEEEE. ..SSSS.. .TTTT. ", " ...... ............ .... ...... " }; (void)cbdata; // Validate options and allocate a line buffer... if (!options) goto done; if ((line = malloc(options->header.cupsBytesPerLine)) == NULL) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to allocate %u bytes for test page: %s", options->header.cupsBytesPerLine, strerror(errno)); goto done; } width = options->header.HWResolution[0] * (options->media.size_width - options->media.left_margin - options->media.right_margin) / 2540; height = options->header.HWResolution[1] * (options->media.size_length - options->media.bottom_margin - options->media.top_margin) / 2540; papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "Printable area for test page is %ux%u pixels.", width, height); if (width > height) { // Send landscape raster... pixels = landscape; pw = 48; ph = 16; } else { // Send portrait raster... pixels = portrait; pw = 16; ph = 48; } y1mm = 10 * options->header.HWResolution[1] / 254; if ((y1mm * ph) > height) { if ((y1mm = height / ph) == 0) y1mm = 1; } if ((x1mm = y1mm * options->header.HWResolution[0] / options->header.HWResolution[1]) == 0) { x1mm = 1; y1mm = x1mm * options->header.HWResolution[1] / options->header.HWResolution[0]; } if ((pw * x1mm) > width) { // Too wide, try scaling to fit the width... x1mm = 10 * options->header.HWResolution[0] / 254; if ((x1mm * pw) > width) x1mm = width / pw; if ((y1mm = x1mm * options->header.HWResolution[1] / options->header.HWResolution[0]) == 0) { y1mm = 1; x1mm = y1mm * options->header.HWResolution[0] / options->header.HWResolution[1]; } } papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "pw=%u, ph=%u, x1mm=%u, y1mm=%u", pw, ph, x1mm, y1mm); if (((pw + 2) * x1mm) > options->header.cupsWidth || ((ph + 2) * y1mm) > options->header.cupsHeight) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Label too small to print test page."); goto done; } pw *= x1mm; ph *= y1mm; xleft = (width - pw) / 2 - x1mm + options->header.HWResolution[0] * options->media.left_margin / 2540; ytop = (height - ph) / 2 + options->header.HWResolution[1] * options->media.top_margin / 2540; yend = ytop + ph; ybottom = options->header.cupsHeight - y1mm; papplLogJob(job, PAPPL_LOGLEVEL_DEBUG, "pw=%u, ph=%u, ytop=%u, yend=%u, ybottom=%u", pw, ph, ytop, yend, ybottom); // Start the page... papplPrinterGetDriverData(papplJobGetPrinter(job), &data); papplJobSetImpressions(job, 1); if (!(data.rstartjob_cb)(job, options, device)) goto done; if (!(data.rstartpage_cb)(job, options, device, 1)) goto done; // Send lines for the test label: // // +---------------+ // |...............| // |... ...| // |... T E S T ...| // |... ...| // |...............| // +---------------+ // Top border memset(line, 0, options->header.cupsBytesPerLine); for (y = 0; y < y1mm; y ++) { if (!(data.rwriteline_cb)(job, options, device, y, line)) goto done; } // Side borders and gray shading on upper half memset(line, 0, x1mm); memset(line + x1mm, 128, options->header.cupsBytesPerLine - 2 * x1mm); memset(line + options->header.cupsBytesPerLine - x1mm, 0, x1mm); for (; y < ytop; y ++) { if (!(data.rwriteline_cb)(job, options, device, y, line)) goto done; } // Side borders, gray shading, and image pixels in middle for (; y < yend; y ++) { // Draw a 50% gray pattern with black borders... memset(line, 0, x1mm); memset(line + x1mm, 128, options->header.cupsBytesPerLine - 2 * x1mm); memset(line + options->header.cupsBytesPerLine - x1mm, 0, x1mm); // Render the interior text... for (pixel = pixels[(y - ytop) / y1mm], lineptr = line + xleft; *pixel; pixel ++) { for (xc = x1mm; xc > 0; xc --, lineptr ++) { if (*pixel == '.') *lineptr = 255; else if (!isspace(*pixel)) *lineptr = 0; } } if (!(data.rwriteline_cb)(job, options, device, y, line)) goto done; } // Side borders and gray shading on lower half memset(line, 0, x1mm); memset(line + x1mm, 128, options->header.cupsBytesPerLine - 2 * x1mm); memset(line + options->header.cupsBytesPerLine - x1mm, 0, x1mm); for (; y < ybottom; y ++) { if (!(data.rwriteline_cb)(job, options, device, y, line)) goto done; } // Bottom border memset(line, 0, options->header.cupsBytesPerLine); for (; y < options->header.cupsHeight; y ++) { if (!(data.rwriteline_cb)(job, options, device, y, line)) goto done; } // Finish up... if (!(data.rendpage_cb)(job, options, device, 1)) goto done; if (!(data.rendjob_cb)(job, options, device)) goto done; ret = true; papplJobSetImpressionsCompleted(job, 1); done: free(line); papplJobDeletePrintOptions(options); return (ret); } // // 'lprintTestPageCB()' - Print a test page. // const char * // O - Test page file lprintTestPageCB( pappl_printer_t *printer, // I - Printer char *buffer, // I - Filename buffer size_t bufsize) // I - Size of filename buffer { int fd; // File descriptor char testpage[] = LPRINT_TESTPAGE_HEADER; // Test page file header if ((fd = papplCreateTempFile(buffer, bufsize, "testpage", "tst")) < 0) { papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to create temporary file for test page: %s", strerror(errno)); return (NULL); } if (write(fd, testpage, sizeof(testpage)) < 0) { papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Unable to write temporary file for test page: %s", strerror(errno)); close(fd); return (NULL); } close(fd); return (buffer); } lprint-1.3.1/lprint-tspl.c000066400000000000000000000247561456151556700155150ustar00rootroot00000000000000// // TSPL driver for LPrint, a Label Printer Application // // Copyright © 2023-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" // // Local types... // typedef struct lprint_tspl_s // TSPL driver data { lprint_dither_t dither; // Dither buffer } lprint_tspl_t; // // Local globals... // static const char * const lprint_tspl_media[] = { // Supported media sizes for labels "oe_1.25x0.25-label_1.25x0.25in", "oe_1.25x2.25-label_1.25x2.25in", "oe_1.5x0.25-label_1.5x0.25in", "oe_1.5x0.5-label_1.5x0.5in", "oe_1.5x1-label_1.5x1in", "oe_1.5x2-label_1.5x2in", "oe_2x0.37-label_2x0.37in", "oe_2x0.5-label_2x0.5in", "oe_2x1-label_2x1in", "oe_2x1.25-label_2x1.25in", "oe_2x2-label_2x2in", "oe_2x3-label_2x3in", "oe_2x4-label_2x4in", "oe_2x5.5-label_2x5.5in", "oe_2.25x0.5-label_2.25x0.5in", "oe_2.25x1.25-label_2.25x1.25in", "oe_30859-paint-can-label_2.25x3.125in", "oe_2.25x4-label_2.25x4in", "oe_2.25x5.5-label_2.25x5.5in", "oe_2.38x5.5-label_2.38x5.5in", "oe_2.5x1-label_2.5x1in", "oe_2.5x2-label_2.5x2in", "oe_2.75x1.25-label_2.75x1.25in", "oe_2.9x1-label_2.9x1in", "oe_3x1-label_3x1in", "oe_3x1.25-label_3x1.25in", "oe_3x2-label_3x2in", "oe_3x3-label_3x3in", "na_index-3x5_3x5in", "oe_3.25x2-label_3.25x2in", "oe_3.25x5-label_3.25x5in", "oe_3.25x5.5-label_3.25x5.5in", "oe_3.25x5.83-label_3.25x5.83in", "oe_3.25x7.83-label_3.25x7.83in", "oe_3.5x1-label_3.5x1in", "oe_4x1-label_4x1in", "oe_4x2-label_4x2in", "oe_4x3-label_4x3in", "oe_4x4-label_4x4in", "oe_4x5-label_4x5in", "na_index-4x6_4x6in", "oe_4x6.5-label_4x6.5in", "oe_4x8-label_4x8in", "oe_4x13-label_4x13in", "roll_max_4x39.6in", "roll_min_0.75x0.25in" }; // // Local functions... // static bool lprint_tspl_printfile(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_tspl_rendjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_tspl_rendpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_tspl_rstartjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_tspl_rstartpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_tspl_rwriteline(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned y, const unsigned char *line); static bool lprint_tspl_status(pappl_printer_t *printer); // // 'lprintTSPL()' - Initialize the TSPL driver. // bool // O - `true` on success, `false` on error lprintTSPL( pappl_system_t *system, // I - System const char *driver_name,// I - Driver name const char *device_uri, // I - Device URI const char *device_id, // I - 1284 device ID pappl_pr_driver_data_t *data, // I - Pointer to driver data ipp_t **attrs, // O - Pointer to driver attributes void *cbdata) // I - Callback data (not used) { // Print callbacks... data->printfile_cb = lprint_tspl_printfile; data->rendjob_cb = lprint_tspl_rendjob; data->rendpage_cb = lprint_tspl_rendpage; data->rstartjob_cb = lprint_tspl_rstartjob; data->rstartpage_cb = lprint_tspl_rstartpage; data->rwriteline_cb = lprint_tspl_rwriteline; data->status_cb = lprint_tspl_status; // Vendor-specific format... data->format = LPRINT_TSPL_MIMETYPE; // Set resolution... data->num_resolution = 1; if (strstr(driver_name, "_203dpi") != NULL) data->x_resolution[0] = data->y_resolution[0] = 203; else data->x_resolution[0] = data->y_resolution[0] = 300; data->x_default = data->y_default = data->x_resolution[0]; // Basically borderless... data->left_right = 1; data->bottom_top = 1; // Supported media... data->num_media = (int)(sizeof(lprint_tspl_media) / sizeof(lprint_tspl_media[0])); memcpy(data->media, lprint_tspl_media, sizeof(lprint_tspl_media)); data->num_source = 1; data->source[0] = "main-roll"; papplCopyString(data->media_ready[0].size_name, "na_index-4x6_4x6in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); data->media_ready[0].tracking = PAPPL_MEDIA_TRACKING_GAP; data->num_type = 2; data->type[0] = "labels"; data->type[1] = "continuous"; data->tracking_supported = PAPPL_MEDIA_TRACKING_GAP | PAPPL_MEDIA_TRACKING_MARK | PAPPL_MEDIA_TRACKING_CONTINUOUS; data->speed_default = 0; data->speed_supported[0] = 2540; data->speed_supported[1] = 12 * 2540; // Darkness/density settings... data->darkness_configured = 50; data->darkness_supported = 16; return (true); } // // 'lprint_tspl_printfile()' - Print a file. // static bool // O - `true` on success, `false` on failure lprint_tspl_printfile( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { int fd; // Input file ssize_t bytes; // Bytes read/written char buffer[65536]; // Read/write buffer // Copy the raw file... papplJobSetImpressions(job, 1); if ((fd = open(papplJobGetFilename(job), O_RDONLY)) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to open print file '%s': %s", papplJobGetFilename(job), strerror(errno)); return (false); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) { if (papplDeviceWrite(device, buffer, (size_t)bytes) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to send %d bytes to printer.", (int)bytes); close(fd); return (false); } } close(fd); papplJobSetImpressionsCompleted(job, 1); return (true); } // // 'lprint_tspl_rend()' - End a job. // static bool // O - `true` on success, `false` on failure lprint_tspl_rendjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_tspl_t *tspl = (lprint_tspl_t *)papplJobGetData(job); // TSPL driver data (void)options; (void)device; free(tspl); papplJobSetData(job, NULL); return (true); } // // 'lprint_tspl_rendpage()' - End a page. // static bool // O - `true` on success, `false` on failure lprint_tspl_rendpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_tspl_t *tspl = (lprint_tspl_t *)papplJobGetData(job); // TSPL driver data (void)page; // Write last line lprint_tspl_rwriteline(job, options, device, options->header.cupsHeight, NULL); // Eject papplDevicePrintf(device, "PRINT %u,1\n", options->header.NumCopies); papplDeviceFlush(device); // Free memory and return... lprintDitherFree(&tspl->dither); return (true); } // // 'lprint_tspl_rstartjob()' - Start a job. // static bool // O - `true` on success, `false` on failure lprint_tspl_rstartjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_tspl_t *tspl = (lprint_tspl_t *)calloc(1, sizeof(lprint_tspl_t)); // TSPL driver data (void)options; (void)device; // Save driver data... papplJobSetData(job, tspl); return (true); } // // 'lprint_tspl_rstartpage()' - Start a page. // static bool // O - `true` on success, `false` on failure lprint_tspl_rstartpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_tspl_t *tspl = (lprint_tspl_t *)papplJobGetData(job); // TSPL driver data int darkness, // Combined density speed; // Print speed (void)page; // Initialize the dither buffer... if (!lprintDitherAlloc(&tspl->dither, job, options, CUPS_CSPACE_W, options->header.HWResolution[0] == 300 ? 1.2 : 1.0)) return (false); // Initialize the printer... if ((darkness = options->darkness_configured + options->print_darkness) < 0) darkness = 0; else if (darkness > 100) darkness = 100; papplDevicePrintf(device, "SIZE %d mm,%d mm\n", options->media.size_width / 100, options->media.size_length / 100); switch (options->orientation_requested) { default : case IPP_ORIENT_PORTRAIT : papplDevicePuts(device, "DIRECTION 0,0\n"); break; case IPP_ORIENT_LANDSCAPE : papplDevicePuts(device, "DIRECTION 90,0\n"); break; case IPP_ORIENT_REVERSE_PORTRAIT : papplDevicePuts(device, "DIRECTION 180,0\n"); break; case IPP_ORIENT_REVERSE_LANDSCAPE : papplDevicePuts(device, "DIRECTION 270,0\n"); break; } switch (options->media.tracking) { default : break; case PAPPL_MEDIA_TRACKING_CONTINUOUS : papplDevicePuts(device, "GAP 0 mm,0 mm\n"); break; case PAPPL_MEDIA_TRACKING_MARK : papplDevicePuts(device, "BLINE 3 mm,0 mm\n"); break; case PAPPL_MEDIA_TRACKING_GAP : papplDevicePuts(device, "GAP 3 mm,0 mm\n"); break; } papplDevicePrintf(device, "DENSITY %d\n", (darkness * 15 + 50) / 100); if ((speed = options->print_speed / 2540) > 0) papplDevicePrintf(device, "SPEED %d\n", speed); // Start the page image... papplDevicePuts(device, "CLS\n"); papplDevicePrintf(device, "BITMAP 0,0,%u,%u,1,", tspl->dither.out_width, options->header.cupsHeight); return (true); } // // 'lprint_tspl_rwriteline()' - Write a raster line. // static bool // O - `true` on success, `false` on failure lprint_tspl_rwriteline( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned y, // I - Line number const unsigned char *line) // I - Line { lprint_tspl_t *tspl = (lprint_tspl_t *)papplJobGetData(job); // TSPL driver data (void)options; // Dither and write the line... if (lprintDitherLine(&tspl->dither, y, line)) papplDeviceWrite(device, tspl->dither.output, tspl->dither.out_width); return (true); } // // 'lprint_tspl_status()' - Get current printer status. // static bool // O - `true` on success, `false` on failure lprint_tspl_status( pappl_printer_t *printer) // I - Printer { (void)printer; return (true); } lprint-1.3.1/lprint-tspl.h000066400000000000000000000006531456151556700155100ustar00rootroot00000000000000// // TSPL driver table for LPrint, a Label Printer Application // // Copyright © 2023 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // { "tspl_203dpi", "203dpi TSPL Label Printer", NULL, NULL }, { "tspl_rollo-x1038_203dpi", "Rollo X1038", "MFG:Printer;MDL:Thermal Printer;CMD:XPP,XL;", NULL }, { "tspl_300dpi", "300dpi TSPL Label Printer", NULL, NULL }, lprint-1.3.1/lprint-zpl.c000066400000000000000000000665301456151556700153340ustar00rootroot00000000000000// // ZPL driver for LPrint, a Label Printer Application // // Copyright © 2019-2024 by Michael R Sweet. // Copyright © 2007-2019 by Apple Inc. // Copyright © 2001-2007 by Easy Software Products. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" // Define to 1 to use run-length encoding, 0 for uncompressed #define ZPL_COMPRESSION 1 // Error and warning bits #define ZPL_ERROR_MEDIA_OUT 0x00000001 #define ZPL_ERROR_RIBBON_OUT 0x00000002 #define ZPL_ERROR_HEAD_OPEN 0x00000004 #define ZPL_ERROR_CUTTER_FAULT 0x00000008 #define ZPL_ERROR_CLEAR_PP_FAILED 0x00008000 #define ZPL_ERROR_PAPER_FEED 0x00004000 #define ZPL_ERROR_PRESENTER 0x00002000 #define ZPL_ERROR_PAPER_JAM 0x00001000 #define ZPL_ERROR_MARK_NOT_FOUND 0x00080000 #define ZPL_ERROR_MARK_CALIBRATE 0x00040000 #define ZPL_ERROR_RETRACT_TIMEOUT 0x00020000 #define ZPL_ERROR_PAUSED 0x00010000 #define ZPL_WARNING_PAPER_ALMOST_OUT 0x00000008 #define ZPL_WARNING_REPLACE_PRINTHEAD 0x00000004 #define ZPL_WARNING_CLEAN_PRINTHEAD 0x00000002 #define ZPL_WARNING_CALIBRATE_MEDIA 0x00000001 #define ZPL_WARNING_PAPER_BEFORE_HEAD 0x00000010 #define ZPL_WARNING_BLACK_MARK 0x00000020 #define ZPL_WARNING_PAPER_AFTER_HEAD 0x00000040 #define ZPL_WARNING_LOOP_READY 0x00000080 #define ZPL_WARNING_PRESENTER 0x00000100 #define ZPL_WARNING_RETRACT_READY 0x00000200 #define ZPL_WARNING_IN_RETRACT 0x00000400 #define ZPL_WARNING_AT_BIN 0x00000800 // // Local types... // typedef struct lprint_zpl_s // ZPL driver data { lprint_dither_t dither; // Dither buffer unsigned char *comp_buffer; // Compression buffer unsigned char *last_buffer; // Last line int last_buffer_set; // Is the last line set? } lprint_zpl_t; // // Local globals... // static const char * const lprint_zpl_2inch_media[] = { // Supported 2 inch media sizes "oe_1.25x0.25-label_1.25x0.25in", "oe_1.25x2.25-label_1.25x2.25in", "oe_1.5x0.25-label_1.5x0.25in", "oe_1.5x0.5-label_1.5x0.5in", "oe_1.5x1-label_1.5x1in", "oe_1.5x2-label_1.5x2in", "oe_2x0.37-label_2x0.37in", "oe_2x0.5-label_2x0.5in", "oe_2x1-label_2x1in", "oe_2x1.25-label_2x1.25in", "oe_2x2-label_2x2in", "oe_2x3-label_2x3in", "oe_2x4-label_2x4in", "oe_2x5.5-label_2x5.5in", "roll_max_2x39.6in", "roll_min_0.75x0.25in" }; static const char * const lprint_zpl_4inch_media[] = { // Supported 4 inch media sizes "oe_1.25x0.25-label_1.25x0.25in", "oe_1.25x2.25-label_1.25x2.25in", "oe_1.5x0.25-label_1.5x0.25in", "oe_1.5x0.5-label_1.5x0.5in", "oe_1.5x1-label_1.5x1in", "oe_1.5x2-label_1.5x2in", "oe_2x0.37-label_2x0.37in", "oe_2x0.5-label_2x0.5in", "oe_2x1-label_2x1in", "oe_2x1.25-label_2x1.25in", "oe_2x2-label_2x2in", "oe_2x3-label_2x3in", "oe_2x4-label_2x4in", "oe_2x5.5-label_2x5.5in", "oe_2.25x0.5-label_2.25x0.5in", "oe_2.25x1.25-label_2.25x1.25in", "oe_30859-paint-can-label_2.25x3.125in", "oe_2.25x4-label_2.25x4in", "oe_2.25x5.5-label_2.25x5.5in", "oe_2.38x5.5-label_2.38x5.5in", "oe_2.5x1-label_2.5x1in", "oe_2.5x2-label_2.5x2in", "oe_2.75x1.25-label_2.75x1.25in", "oe_2.9x1-label_2.9x1in", "oe_3x1-label_3x1in", "oe_3x1.25-label_3x1.25in", "oe_3x2-label_3x2in", "oe_3x3-label_3x3in", "na_index-3x5_3x5in", "oe_3.25x2-label_3.25x2in", "oe_3.25x5-label_3.25x5in", "oe_3.25x5.5-label_3.25x5.5in", "oe_3.25x5.83-label_3.25x5.83in", "oe_3.25x7.83-label_3.25x7.83in", "oe_3.5x1-label_3.5x1in", "oe_4x1-label_4x1in", "oe_4x2-label_4x2in", "oe_4x3-label_4x3in", "oe_4x4-label_4x4in", "oe_4x5-label_4x5in", "na_index-4x6_4x6in", "oe_4x6.5-label_4x6.5in", "oe_4x8-label_4x8in", "oe_4x13-label_4x13in", "roll_max_4x39.6in", "roll_min_0.75x0.25in" /* "oe_6x1-label_6x1in", "oe_6x2-label_6x2in", "oe_6x3-label_6x3in", "oe_6x4-label_6x4in", "oe_6x5-label_6x5in", "oe_6x6-label_6x6in", "oe_6x6.5-label_6x6.5in", "oe_6x13-label_6x13in", "oe_8x1-label_8x1in", "oe_8x2-label_8x2in", "oe_8x3-label_8x3in", "oe_8x4-label_8x4in", "oe_8x5-label_8x5in", "oe_8x6-label_8x6in", "oe_8x6.5-label_8x6.5in", "oe_8x13-label_8x13in", "roll_max_8x39.6in", "roll_min_1.25x0.25in" */ }; // // Local functions... // #if ZPL_COMPRESSION static bool lprint_zpl_compress(pappl_device_t *device, unsigned char ch, unsigned count); #endif // ZPL_COMPRESSION static bool lprint_zpl_printfile(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_zpl_rendjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_zpl_rendpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_zpl_rstartjob(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device); static bool lprint_zpl_rstartpage(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned page); static bool lprint_zpl_rwriteline(pappl_job_t *job, pappl_pr_options_t *options, pappl_device_t *device, unsigned y, const unsigned char *line); static bool lprint_zpl_status(pappl_printer_t *printer); static bool lprint_zpl_update_reasons(pappl_printer_t *printer, pappl_job_t *job, pappl_device_t *device); // // 'lprintZPL()' - Initialize the ZPL driver. // bool // O - `true` on success, `false` on error lprintZPL( pappl_system_t *system, // I - System const char *driver_name,// I - Driver name const char *device_uri, // I - Device URI const char *device_id, // I - 1284 device ID pappl_pr_driver_data_t *data, // I - Pointer to driver data ipp_t **attrs, // O - Pointer to driver attributes void *cbdata) // I - Callback data (not used) { data->printfile_cb = lprint_zpl_printfile; data->rendjob_cb = lprint_zpl_rendjob; data->rendpage_cb = lprint_zpl_rendpage; data->rstartjob_cb = lprint_zpl_rstartjob; data->rstartpage_cb = lprint_zpl_rstartpage; data->rwriteline_cb = lprint_zpl_rwriteline; data->status_cb = lprint_zpl_status; data->format = LPRINT_ZPL_MIMETYPE; data->num_resolution = 1; if (strstr(driver_name, "-203dpi")) { data->x_resolution[0] = 203; data->y_resolution[0] = 203; } else if (strstr(driver_name, "-300dpi")) { data->x_resolution[0] = 300; data->y_resolution[0] = 300; } else { data->x_resolution[0] = 600; data->y_resolution[0] = 600; } data->x_default = data->y_default = data->x_resolution[0]; if (strstr(driver_name, "-cutter")) data->finishings |= PAPPL_FINISHINGS_TRIM; if (!strncmp(driver_name, "zpl_2inch-", 16)) { // 2 inch printer... data->num_media = (int)(sizeof(lprint_zpl_2inch_media) / sizeof(lprint_zpl_2inch_media[0])); memcpy(data->media, lprint_zpl_2inch_media, sizeof(lprint_zpl_2inch_media)); papplCopyString(data->media_ready[0].size_name, "oe_2x3-label_2x3in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); } else { // 4 inch printer... data->num_media = (int)(sizeof(lprint_zpl_4inch_media) / sizeof(lprint_zpl_4inch_media[0])); memcpy(data->media, lprint_zpl_4inch_media, sizeof(lprint_zpl_4inch_media)); papplCopyString(data->media_ready[0].size_name, "na_index-4x6_4x6in", sizeof(data->media_ready[0].size_name)); papplCopyString(data->media_ready[0].type, "labels", sizeof(data->media_ready[0].type)); } data->media_ready[0].tracking = PAPPL_MEDIA_TRACKING_GAP; data->bottom_top = data->left_right = 1; data->num_source = 1; data->source[0] = "main-roll"; data->top_offset_supported[0] = -1500; data->top_offset_supported[1] = 1500; data->tracking_supported = PAPPL_MEDIA_TRACKING_MARK | PAPPL_MEDIA_TRACKING_WEB | PAPPL_MEDIA_TRACKING_GAP | PAPPL_MEDIA_TRACKING_CONTINUOUS; data->num_type = 3; data->type[0] = "continuous"; data->type[1] = "labels"; data->type[2] = "labels-continuous"; data->mode_configured = PAPPL_LABEL_MODE_TEAR_OFF; data->mode_supported = PAPPL_LABEL_MODE_APPLICATOR | PAPPL_LABEL_MODE_CUTTER | PAPPL_LABEL_MODE_CUTTER_DELAYED | PAPPL_LABEL_MODE_KIOSK | PAPPL_LABEL_MODE_PEEL_OFF | PAPPL_LABEL_MODE_PEEL_OFF_PREPEEL | PAPPL_LABEL_MODE_REWIND | PAPPL_LABEL_MODE_RFID | PAPPL_LABEL_MODE_TEAR_OFF; data->tear_offset_configured = 0; data->tear_offset_supported[0] = -1500; data->tear_offset_supported[1] = 1500; data->speed_default = 0; data->speed_supported[0] = 2540; data->speed_supported[1] = 12 * 2540; data->darkness_configured = 50; data->darkness_supported = 30; return (true); } // // 'lprintZPLQueryDriver()' - Query the printer to determine the proper driver. // void lprintZPLQueryDriver( pappl_system_t *system, // I - System const char *device_uri, // I - Device URI char *name, // I - Name buffer size_t namesize) // I - Size of name buffer { pappl_device_t *device; // Device connection char line[1025]; // Line from device ssize_t bytes; // Bytes read char model[256], // Model name *modelptr; // Pointer into model name int dpmm = 0; // Dots per millimeter // Make sure name buffer is initialized... *name = '\0'; // Connect and send Host Information command... if ((device = papplDeviceOpen(device_uri, "query", papplLogDevice, system)) == NULL) return; if (papplDevicePuts(device, "~HI\n") < 0) goto done; // Read and parse response: // // MODEL,VERSION,DPMM,MEMORY,OPTIONS if ((bytes = papplDeviceRead(device, line, sizeof(line) - 1)) <= 0) goto done; line[bytes] = '\0'; papplLog(system, PAPPL_LOGLEVEL_DEBUG, "HI response for '%s' was '%s'.", device_uri, line); if (line[0] == 0x02 && sscanf(line + 1, "%255[^,],%*[^,],%d", model, &dpmm) > 1 && (dpmm == 8 || dpmm == 12 || dpmm == 24)) { // Got model and dots-per-millimeter values, create a driver name from it... // Note: We currently assume a 4" print head for auto-detection... const char *type = "tt"; // Type of printing (direct/transfer) int dpi; // Print resolution papplLog(system, PAPPL_LOGLEVEL_DEBUG, "model='%s', dpmm=%d", model, dpmm); if ((modelptr = strchr(model, '-')) != NULL && modelptr > model) { if (modelptr[-1] == 'd') type = "dt"; } if (dpmm == 8) dpi = 203; // 203.2 else if (dpmm == 12) dpi = 300; // Technically should be 304.8... else dpi = 600; // Technically should be 609.6... snprintf(name, namesize, "zpl_4inch-%ddpi-%s", dpi, type); papplLog(system, PAPPL_LOGLEVEL_DEBUG, "auto driver-name='%s'", name); } done: papplDeviceClose(device); return; } #if ZPL_COMPRESSION // // 'lprint_zpl_compress()' - Output a RLE run... // static bool // O - `true` on success, `false` on failure lprint_zpl_compress( pappl_device_t *device, // I - Output device unsigned char ch, // I - Repeat character unsigned count) // I - Repeat count { unsigned char buffer[8192], // Output buffer *bufptr = buffer; // Pointer into buffer if (count > 1) { // Print as many z's as possible - they are the largest denomination // representing 400 characters (zC stands for 400 adjacent C's) while (count >= 400) { count -= 400; *bufptr++ = 'z'; if (bufptr >= (buffer + sizeof(buffer))) { if (papplDeviceWrite(device, buffer, sizeof(buffer)) < 0) return (0); bufptr = buffer; } } // Then print 'g' through 'y' as multiples of 20 characters... if (count >= 20) { *bufptr++ = 'f' + count / 20; count %= 20; } // Finally, print 'G' through 'Y' as 1 through 19 characters... if (count > 0) *bufptr++ = 'F' + count; } // Then the character to be repeated... *bufptr++ = ch; return (papplDeviceWrite(device, buffer, bufptr - buffer) > 0); } #endif // ZPL_COMPRESSION // // 'lprint_zpl_print()' - Print a file. // static bool // O - `true` on success, `false` on failure lprint_zpl_printfile( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { int fd; // Input file ssize_t bytes; // Bytes read/written char buffer[65536]; // Read/write buffer // Copy the raw file... papplJobSetImpressions(job, 1); if ((fd = open(papplJobGetFilename(job), O_RDONLY)) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to open print file '%s': %s", papplJobGetFilename(job), strerror(errno)); return (false); } // Update status... lprint_zpl_update_reasons(papplJobGetPrinter(job), job, device); // Copy print data... while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) { if (papplDeviceWrite(device, buffer, (size_t)bytes) < 0) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to send %d bytes to printer.", (int)bytes); close(fd); return (false); } } close(fd); papplJobSetImpressionsCompleted(job, 1); // Update status... lprint_zpl_update_reasons(papplJobGetPrinter(job), job, device); return (true); } // // 'lprint_zpl_rendjob()' - End a job. // static bool // O - `true` on success, `false` on failure lprint_zpl_rendjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { lprint_zpl_t *zpl = (lprint_zpl_t *)papplJobGetData(job); // ZPL driver data (void)options; free(zpl); papplJobSetData(job, NULL); return (true); } // // 'lprint_zpl_rendpage()' - End a page. // static bool // O - `true` on success, `false` on failure lprint_zpl_rendpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_zpl_t *zpl = (lprint_zpl_t *)papplJobGetData(job); // ZPL driver data (void)page; lprint_zpl_rwriteline(job, options, device, options->header.cupsHeight, NULL); papplDevicePrintf(device, "^XA\n^POI\n^PW%u\n^LH0,0\n^LT%d\n", options->header.cupsWidth, options->media.top_offset * options->printer_resolution[1] / 2540); if (options->media.type[0] && strcmp(options->media.type, "labels")) { // Continuous media, so always set tracking to continuous... options->media.tracking = PAPPL_MEDIA_TRACKING_CONTINUOUS; } if (options->media.tracking) { if (options->media.tracking == PAPPL_MEDIA_TRACKING_CONTINUOUS) papplDevicePrintf(device, "^LL%u\n^MNN\n", options->header.cupsHeight); else if (options->media.tracking == PAPPL_MEDIA_TRACKING_WEB) papplDevicePuts(device, "^MNY\n"); else papplDevicePuts(device, "^MNM\n"); } if (strstr(papplPrinterGetDriverName(papplJobGetPrinter(job)), "-tt")) papplDevicePuts(device, "^MTT\n"); // Thermal transfer else papplDevicePuts(device, "^MTD\n"); // Direct thermal papplDevicePrintf(device, "^PQ1, 0, 0, N\n"); papplDevicePuts(device, "^FO0,0^XGR:LPRINT.GRF,1,1^FS\n^XZ\n"); papplDevicePuts(device, "^XA\n^IDR:LPRINT.GRF^FS\n^XZ\n"); if (options->finishings & PAPPL_FINISHINGS_TRIM) papplDevicePuts(device, "^CN1\n"); // Update status... lprint_zpl_update_reasons(papplJobGetPrinter(job), job, device); // Free memory and return... lprintDitherFree(&zpl->dither); free(zpl->comp_buffer); free(zpl->last_buffer); return (true); } // // 'lprint_zpl_rstartjob()' - Start a job. // static bool // O - `true` on success, `false` on failure lprint_zpl_rstartjob( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device) // I - Output device { pappl_pr_driver_data_t data; // Driver data int darkness; // Composite darkness value lprint_zpl_t *zpl = (lprint_zpl_t *)calloc(1, sizeof(lprint_zpl_t)); // ZPL driver data // Initialize driver data... papplJobSetData(job, zpl); papplPrinterGetDriverData(papplJobGetPrinter(job), &data); // label-mode-configured switch (data.mode_configured) { case PAPPL_LABEL_MODE_APPLICATOR : papplDevicePuts(device, "^MMA,Y\n"); break; case PAPPL_LABEL_MODE_CUTTER : papplDevicePuts(device, "^MMC,Y\n"); break; case PAPPL_LABEL_MODE_CUTTER_DELAYED : papplDevicePuts(device, "^MMD,Y\n"); break; case PAPPL_LABEL_MODE_KIOSK : papplDevicePuts(device, "^MMK,Y\n"); break; case PAPPL_LABEL_MODE_PEEL_OFF : papplDevicePuts(device, "^MMP,N\n"); break; case PAPPL_LABEL_MODE_PEEL_OFF_PREPEEL : papplDevicePuts(device, "^MMP,Y\n"); break; case PAPPL_LABEL_MODE_REWIND : papplDevicePuts(device, "^MMR,Y\n"); break; case PAPPL_LABEL_MODE_RFID : papplDevicePuts(device, "^MMF,Y\n"); break; case PAPPL_LABEL_MODE_TEAR_OFF : default : papplDevicePuts(device, "^MMT,Y\n"); break; } // label-tear-offset-configured if (data.tear_offset_configured < 0) papplDevicePrintf(device, "~TA%04d\n", data.tear_offset_configured); else if (data.tear_offset_configured > 0) papplDevicePrintf(device, "~TA%03d\n", data.tear_offset_configured); // print-darkness / printer-darkness-configured if ((darkness = options->print_darkness + options->darkness_configured) < 0) darkness = 0; else if (darkness > 100) darkness = 100; papplDevicePrintf(device, "~SD%02u\n", 30 * darkness / 100); return (true); } // // 'lprint_zpl_rstartpage()' - Start a page. // static bool // O - `true` on success, `false` on failure lprint_zpl_rstartpage( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned page) // I - Page number { lprint_zpl_t *zpl = (lprint_zpl_t *)papplJobGetData(job); // ZPL driver data int ips; // Inches per second double out_gamma = 1.0; // Output gamma correction (void)page; // Update status... lprint_zpl_update_reasons(papplJobGetPrinter(job), job, device); // Setup dither buffer... if (options->header.HWResolution[0] == 300) out_gamma = 1.2; else if (options->header.HWResolution[0] == 600) out_gamma = 1.44; if (!lprintDitherAlloc(&zpl->dither, job, options, CUPS_CSPACE_K, out_gamma)) return (false); // print-speed if ((ips = options->print_speed / 2540) > 0) papplDevicePrintf(device, "^PR%d,%d,%d\n", ips, ips, ips); // Download bitmap... papplDevicePrintf(device, "~DGR:LPRINT.GRF,%u,%u,\n", zpl->dither.in_height * zpl->dither.out_width, zpl->dither.out_width); // Allocate memory for writing the bitmap... zpl->comp_buffer = malloc(2 * zpl->dither.out_width + 1); zpl->last_buffer = malloc(zpl->dither.out_width); zpl->last_buffer_set = 0; if (!zpl->comp_buffer || !zpl->last_buffer) { papplLogJob(job, PAPPL_LOGLEVEL_ERROR, "Unable to allocate compression buffers."); return (false); } return (true); } // // 'lprint_zpl_rwriteline()' - Write a raster line. // static bool // O - `true` on success, `false` on failure lprint_zpl_rwriteline( pappl_job_t *job, // I - Job pappl_pr_options_t *options, // I - Job options pappl_device_t *device, // I - Output device unsigned y, // I - Line number const unsigned char *line) // I - Line { lprint_zpl_t *zpl = (lprint_zpl_t *)papplJobGetData(job); // ZPL driver data unsigned i; // Looping var const unsigned char *ptr; // Pointer into buffer unsigned char *compptr; // Pointer into compression buffer #if ZPL_COMPRESSION unsigned char repeat_char; // Repeated character unsigned repeat_count; // Number of repeated characters #endif // ZPL_COMPRESSION static const unsigned char *hex = (const unsigned char *)"0123456789ABCDEF"; // Hex digits if (!lprintDitherLine(&zpl->dither, y, line)) return (true); // Determine whether this row is the same as the previous line. // If so, output a ':' and return... if (zpl->last_buffer_set && !memcmp(zpl->dither.output, zpl->last_buffer, zpl->dither.out_width)) { papplDeviceWrite(device, ":", 1); return (true); } // Convert the line to hex digits... for (ptr = zpl->dither.output, compptr = zpl->comp_buffer, i = zpl->dither.out_width; i > 0; i --, ptr ++) { *compptr++ = hex[*ptr >> 4]; *compptr++ = hex[*ptr & 15]; } #if ZPL_COMPRESSION // Send run-length compressed HEX data... *compptr = '\0'; // Run-length compress the graphics... for (compptr = zpl->comp_buffer + 1, repeat_char = zpl->comp_buffer[0], repeat_count = 1; *compptr; compptr ++) { if (*compptr == repeat_char) { repeat_count ++; } else { lprint_zpl_compress(device, repeat_char, repeat_count); repeat_char = *compptr; repeat_count = 1; } } if (repeat_char == '0') { // Handle 0's on the end of the line... if (repeat_count & 1) { repeat_count --; papplDevicePuts(device, "0"); } if (repeat_count > 0) papplDevicePuts(device, ","); } else lprint_zpl_compress(device, repeat_char, repeat_count); #else // Send uncompressed HEX data... papplDeviceWrite(device, zpl->comp_buffer, compptr - zpl->comp_buffer); #endif // ZPL_COMPRESSION // Save this line for the next round... memcpy(zpl->last_buffer, zpl->dither.output, zpl->dither.out_width); zpl->last_buffer_set = 1; return (true); } // // 'lprint_zpl_status()' - Get current printer status. // static bool // O - `true` on success, `false` on failure lprint_zpl_status( pappl_printer_t *printer) // I - Printer { pappl_device_t *device; // Connection to printer char line[1025]; // Line from printer ssize_t bytes; // Bytes read int length = 0; // Label length bool ret = false; // Return value if ((device = papplPrinterOpenDevice(printer)) == NULL) { papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "Unable to open device for status."); return (false); } // Get the printer status... if (!lprint_zpl_update_reasons(printer, NULL, device)) goto done; // Query host status... if (papplDevicePuts(device, "~HS\n") < 0) { papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "Unable to send HS status command."); goto done; } if ((bytes = papplDeviceRead(device, line, sizeof(line) - 1)) < 0) { papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "Unable to read HS status response."); goto done; } line[bytes] = '\0'; papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "HS returned '%s'.", line); if (sscanf(line + 1, "%*d,%*d,%*d,%d", &length) == 1 && length > 11) { // Auto-detect label length for ready media... pappl_pr_driver_data_t data; // Driver data papplPrinterGetDriverData(printer, &data); // Round the length to the nearest dot and snap to the nearest 1/4"... length = (2540 * length + data.y_resolution[0] / 2) / data.y_resolution[0]; if ((length % 635) <= 100) length += length % 635; else if ((length % 635) >= 535) length += 635 - (length % 635); // Lookup size lprintMediaMatch(printer, 0, 0, length); } ret = true; done: papplPrinterCloseDevice(printer); return (ret); } // // 'lprint_zpl_update_reasons()' - Update "printer-state-reasons" values. // static bool // O - `true` on success, `false` on failure lprint_zpl_update_reasons( pappl_printer_t *printer, // I - Printer pappl_job_t *job, // I - Current job or `NULL` if none pappl_device_t *device) // I - Connection to device { char line[1025], // Line from printer *lineptr; // Pointer into line ssize_t bytes; // Bytes read unsigned errors = 0, // Detected errors warnings = 0; // Detected warnings pappl_preason_t reasons; // "printer-state-reasons" values // Get the printer status... if (papplDevicePuts(device, "~HQES\n") < 0) { papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "Unable to send HQES status command."); return (false); } if ((bytes = papplDeviceRead(device, line, sizeof(line) - 1)) < 0) { papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "Unable to read HQES status response."); return (false); } line[bytes] = '\0'; papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "HQES returned '%s'.", line); if ((lineptr = strstr(line, "ERRORS:")) != NULL) { if (sscanf(lineptr + 7, "%*d%*x%x", &errors) != 1) errors = 0; } if ((lineptr = strstr(line, "WARNINGS:")) != NULL) { if (sscanf(lineptr + 9, "%*d%*x%x", &warnings) != 1) warnings = 0; } reasons = PAPPL_PREASON_NONE; if (errors & ZPL_ERROR_MEDIA_OUT) reasons |= PAPPL_PREASON_MEDIA_EMPTY; if (errors & ZPL_ERROR_PAPER_JAM) reasons |= PAPPL_PREASON_MEDIA_JAM; if (errors & ZPL_ERROR_PAUSED) reasons |= PAPPL_PREASON_OFFLINE; if (errors & ZPL_ERROR_RIBBON_OUT) reasons |= PAPPL_PREASON_MARKER_SUPPLY_EMPTY; if (errors & ~(ZPL_ERROR_MEDIA_OUT | ZPL_ERROR_PAPER_JAM | ZPL_ERROR_PAUSED)) { reasons |= PAPPL_PREASON_OTHER; if (errors & ZPL_ERROR_HEAD_OPEN) papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Print head open."); if (errors & ZPL_ERROR_CUTTER_FAULT) papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Cutter fault."); if (errors & ZPL_ERROR_CLEAR_PP_FAILED) papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Clear paper path failed."); if (errors & ZPL_ERROR_PAPER_FEED) papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Paper feed error."); if (errors & ZPL_ERROR_PRESENTER) papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Presenter error."); if (errors & ZPL_ERROR_MARK_NOT_FOUND) papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Mark not found."); if (errors & ZPL_ERROR_MARK_CALIBRATE) papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Mark calibration error."); if (errors & ZPL_ERROR_RETRACT_TIMEOUT) papplLogPrinter(printer, PAPPL_LOGLEVEL_ERROR, "Retraction timeout."); } if (warnings & ZPL_WARNING_PAPER_ALMOST_OUT) reasons |= PAPPL_PREASON_MEDIA_LOW; if (warnings & ~ZPL_WARNING_PAPER_ALMOST_OUT) { reasons |= PAPPL_PREASON_OTHER; if (errors & ZPL_WARNING_REPLACE_PRINTHEAD) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "Replace print head."); if (errors & ZPL_WARNING_CLEAN_PRINTHEAD) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "Clean print head."); if (errors & ZPL_WARNING_CALIBRATE_MEDIA) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "Calibrate media."); if (errors & ZPL_WARNING_PAPER_BEFORE_HEAD) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "Paper before head."); if (errors & ZPL_WARNING_BLACK_MARK) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "Black mark."); if (errors & ZPL_WARNING_PAPER_AFTER_HEAD) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "Paper after head."); if (errors & ZPL_WARNING_LOOP_READY) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "Loop ready."); if (errors & ZPL_WARNING_PRESENTER) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "Presenter."); if (errors & ZPL_WARNING_RETRACT_READY) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "Retract ready."); if (errors & ZPL_WARNING_IN_RETRACT) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "In retract."); if (errors & ZPL_WARNING_AT_BIN) papplLogPrinter(printer, PAPPL_LOGLEVEL_WARN, "At bin."); } if (job && (reasons & PAPPL_PREASON_MEDIA_EMPTY)) reasons |= PAPPL_PREASON_MEDIA_NEEDED; papplPrinterSetReasons(printer, reasons, ~reasons); return (true); } lprint-1.3.1/lprint-zpl.h000066400000000000000000000041021456151556700153240ustar00rootroot00000000000000// // ZPL driver table for LPrint, a Label Printer Application // // Copyright © 2019-2023 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // { "zpl_2inch-203dpi-dt", "Zebra ZPL 2-inch/203dpi/Direct-Thermal", "", NULL }, { "zpl_2inch-203dpi-dt_zd611", "Zebra ZD611d 203dpi", "MANUFACTURER:Zebra Technologies ;COMMAND SET:ZPL;MODEL:ZTC ZD611-203dpi ZPL;", NULL }, { "zpl_2inch-203dpi-tt", "Zebra ZPL 2-inch/203dpi/Thermal-Transfer", "", NULL }, { "zpl_2inch-300dpi-dt", "Zebra ZPL 2-inch/300dpi/Direct-Thermal", "", NULL }, { "zpl_2inch-300dpi-dt_zd611", "Zebra ZD611d 300dpi", "MANUFACTURER:Zebra Technologies ;COMMAND SET:ZPL;MODEL:ZTC ZD611-300dpi ZPL;", NULL }, { "zpl_2inch-300dpi-tt", "Zebra ZPL 2-inch/300dpi/Thermal-Transfer", "", NULL }, { "zpl_2inch-600dpi-tt", "Zebra ZPL 2-inch/600dpi/Thermal-Transfer", "", NULL }, { "zpl_4inch-203dpi-dt", "Zebra ZPL 4-inch/203dpi/Direct-Thermal", "", NULL }, { "zpl_4inch-203dpi-dt_gx420d", "Zebra GX420d", "MANUFACTURER:Zebra Technologies;COMMAND SET:ZPL;MODEL:ZTC GX420d;", NULL }, { "zpl_4inch-203dpi-dt_gx430d", "Zebra GX430d", "MANUFACTURER:Zebra Technologies;COMMAND SET:ZPL;MODEL:ZTC GX430d;", NULL }, { "zpl_4inch-203dpi-dt_zd621", "Zebra ZD621d 203dpi", "MANUFACTURER:Zebra Technologies ;COMMAND SET:ZPL;MODEL:ZTC ZD621-203dpi ZPL;", NULL }, { "zpl_4inch-203dpi-tt", "Zebra ZPL 4-inch/203dpi/Thermal-Transfer", "", NULL }, { "zpl_4inch-203dpi-tt_gx420t", "Zebra GX420t", "MANUFACTURER:Zebra Technologies;COMMAND SET:ZPL;MODEL:ZTC GX420t;", NULL }, { "zpl_4inch-203dpi-tt_gx430t", "Zebra GX430t", "MANUFACTURER:Zebra Technologies;COMMAND SET:ZPL;MODEL:ZTC GX430t;", NULL }, { "zpl_4inch-300dpi-dt", "Zebra ZPL 4-inch/300dpi/Direct-Thermal", "", NULL }, { "zpl_4inch-300dpi-dt_zd621", "Zebra ZD621d 300dpi", "MANUFACTURER:Zebra Technologies ;COMMAND SET:ZPL;MODEL:ZTC ZD621-300dpi ZPL;", NULL }, { "zpl_4inch-300dpi-tt", "Zebra ZPL 4-inch/300dpi/Thermal-Transfer", "", NULL }, { "zpl_4inch-600dpi-tt", "Zebra ZPL 4-inch/600dpi/Thermal-Transfer", "", NULL }, lprint-1.3.1/lprint.c000066400000000000000000000562231456151556700145270ustar00rootroot00000000000000// // Main entry for LPrint, a Label Printer Application // // Copyright © 2019-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #include "lprint.h" #include "static-resources/lprint-de-strings.h" #include "static-resources/lprint-en-strings.h" #include "static-resources/lprint-es-strings.h" #include "static-resources/lprint-fr-strings.h" #include "static-resources/lprint-it-strings.h" #include "static-resources/lprint-css.h" #include "static-resources/lprint-png.h" #include "static-resources/lprint-large-png.h" #include "static-resources/lprint-small-png.h" // // Local types... // typedef struct lprint_device_s { char *device_info; // Device description char *device_uri; // Device URI char *device_id; // Device ID } lprint_device_t; // // Local functions... // static const char *autoadd_cb(const char *device_info, const char *device_uri, const char *device_id, void *cbdata); static lprint_device_t *copy_cb(lprint_device_t *src); static void create_cb(pappl_printer_t *printer, void *cbdata); static bool driver_cb(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); static void free_cb(lprint_device_t *src); static int match_id(int num_did, cups_option_t *did, const char *match_id); static const char *mime_cb(const unsigned char *header, size_t headersize, void *data); static bool printer_cb(const char *device_info, const char *device_uri, const char *device_id, cups_array_t *devices); static pappl_system_t *system_cb(int num_options, cups_option_t *options, void *data); // // Local globals... // static pappl_pr_driver_t lprint_drivers[] = { // Driver list #ifdef LPRINT_EXPERIMENTAL # include "lprint-brother.h" # include "lprint-cpcl.h" #endif // LPRINT_EXPERIMENTAL #include "lprint-dymo.h" #include "lprint-epl2.h" #include "lprint-sii.h" #include "lprint-tspl.h" #include "lprint-zpl.h" }; static char lprint_spooldir[1024], // Spool directory lprint_statefile[1024]; // State file // // 'main()' - Main entry for LPrint. // int // O - Exit status main(int argc, // I - Number of command-line arguments char *argv[]) // I - Command-line arguments { return (papplMainloop(argc, argv, LPRINT_VERSION, "Copyright © 2019-2024 by Michael R Sweet. All Rights Reserved.", (int)(sizeof(lprint_drivers) / sizeof(lprint_drivers[0])), lprint_drivers, autoadd_cb, driver_cb, /*subcmd_name*/NULL, /*subcmd_cb*/NULL, system_cb, /*usage_cb*/NULL, /*data*/NULL)); } // // 'autoadd_cb()' - Determine the proper driver for a given printer. // static const char * // O - Driver name or `NULL` for none autoadd_cb(const char *device_info, // I - Device information/name (not used) const char *device_uri, // I - Device URI const char *device_id, // I - IEEE-1284 device ID void *cbdata) // I - Callback data (System) { int i, // Looping var score, // Current driver match score best_score = 0, // Best score num_did; // Number of device ID key/value pairs cups_option_t *did; // Device ID key/value pairs const char *make, // Manufacturer name *best_name = NULL; // Best driver char name[1024] = ""; // Driver name to match (void)device_info; // First parse the device ID and get any potential driver name to match... num_did = papplDeviceParseID(device_id, &did); if ((make = cupsGetOption("MANUFACTURER", num_did, did)) == NULL) if ((make = cupsGetOption("MANU", num_did, did)) == NULL) make = cupsGetOption("MFG", num_did, did); if (make && !strncasecmp(make, "Zebra", 5)) lprintZPLQueryDriver((pappl_system_t *)cbdata, device_uri, name, sizeof(name)); // Then loop through the driver list to find the best match... for (i = 0; i < (int)(sizeof(lprint_drivers) / sizeof(lprint_drivers[0])); i ++) { if (!strcmp(name, lprint_drivers[i].name)) { // Matching driver name always the best match... best_name = lprint_drivers[i].name; break; } if (lprint_drivers[i].device_id) { // See if we have a matching device ID... score = match_id(num_did, did, lprint_drivers[i].device_id); if (score > best_score) { best_score = score; best_name = lprint_drivers[i].name; } } } // Clean up and return... cupsFreeOptions(num_did, did); return (best_name); } // // 'copy_cb()' - Copy a device entry. // static lprint_device_t * // O - New device entry copy_cb(lprint_device_t *src) // I - Original device entry { lprint_device_t *dst; // New device entry if ((dst = (lprint_device_t *)calloc(1, sizeof(lprint_device_t))) != NULL) { dst->device_info = strdup(src->device_info); dst->device_uri = strdup(src->device_uri); dst->device_id = strdup(src->device_id); if (!dst->device_info || !dst->device_uri || !dst->device_id) { free_cb(dst); dst = NULL; } } return (dst); } // // 'create_cb()' - Printer creation callback. // static void create_cb(pappl_printer_t *printer, // I - Printer void *cbdata) // I - Callback data (not used) { char resource[1024]; // Resource path pappl_pr_driver_data_t data; // Driver data (void)cbdata; LPRINT_DEBUG("create_cb(printer=%p(%s), cbdata=%p)\n", printer, printer ? papplPrinterGetName(printer) : "null", cbdata); // Add custom label media page to replace the standard ready media page... papplSystemRemoveResource(papplPrinterGetSystem(printer), papplPrinterGetPath(printer, "media", resource, sizeof(resource))); papplSystemAddResourceCallback(papplPrinterGetSystem(printer), resource, "text/html", (pappl_resource_cb_t)lprintMediaUI, printer); LPRINT_DEBUG("create_cb: Added new media page for '%s'.\n", resource); // Load custom media sizes and report them... papplPrinterGetDriverData(printer, &data); lprintMediaLoad(printer, &data); lprintMediaUpdate(printer, &data); papplPrinterSetDriverData(printer, &data, NULL); LPRINT_DEBUG("create_cb: data.extension=%p\n", data.extension); } // // 'driver_cb()' - Main driver callback. // static bool // O - `true` on success, `false` on error driver_cb( pappl_system_t *system, // I - System const char *driver_name,// I - Driver name const char *device_uri, // I - Device URI const char *device_id, // I - 1284 device ID pappl_pr_driver_data_t *data, // I - Pointer to driver data ipp_t **attrs, // O - Pointer to driver attributes void *cbdata) // I - Callback data (not used) { bool ret = false; // Return value int i; // Looping var // Copy make/model info... for (i = 0; i < (int)(sizeof(lprint_drivers) / sizeof(lprint_drivers[0])); i ++) { if (!strcmp(driver_name, lprint_drivers[i].name)) { papplCopyString(data->make_and_model, lprint_drivers[i].description, sizeof(data->make_and_model)); break; } } // AirPrint version... data->num_features = 1; data->features[0] = "airprint-2.1"; // Pages per minute (interpret as "labels per minute") data->ppm = 60; // "printer-kind" values... data->kind = PAPPL_KIND_LABEL; // Color values... data->color_supported = PAPPL_COLOR_MODE_AUTO | PAPPL_COLOR_MODE_MONOCHROME | PAPPL_COLOR_MODE_BI_LEVEL; data->color_default = PAPPL_COLOR_MODE_MONOCHROME; data->raster_types = PAPPL_PWG_RASTER_TYPE_BLACK_1 | PAPPL_PWG_RASTER_TYPE_BLACK_8 | PAPPL_PWG_RASTER_TYPE_SGRAY_8; // "print-quality-default" value... data->quality_default = IPP_QUALITY_NORMAL; // "sides" values... data->sides_supported = PAPPL_SIDES_ONE_SIDED; data->sides_default = PAPPL_SIDES_ONE_SIDED; // "orientation-requested-default" value... data->orient_default = IPP_ORIENT_NONE; // Media capabilities... data->input_face_up = true; data->output_face_up = true; // Standard icons... data->icons[0].data = lprint_small_png; data->icons[0].datalen = sizeof(lprint_small_png); data->icons[1].data = lprint_png; data->icons[1].datalen = sizeof(lprint_png); data->icons[2].data = lprint_large_png; data->icons[2].datalen = sizeof(lprint_large_png); // Test page callback... data->testpage_cb = lprintTestPageCB; // Use the corresponding sub-driver callback to set things up... #ifdef LPRINT_EXPERIMENTAL if (!strncmp(driver_name, "brother_", 8)) ret = lprintBrother(system, driver_name, device_uri, device_id, data, attrs, cbdata); else #endif // LPRINT_EXPERIMENTAL if (!strncmp(driver_name, "dymo_", 5)) ret = lprintDYMO(system, driver_name, device_uri, device_id, data, attrs, cbdata); else if (!strncmp(driver_name, "epl2_", 5)) ret = lprintEPL2(system, driver_name, device_uri, device_id, data, attrs, cbdata); else if (!strncmp(driver_name, "sii_", 4)) ret = lprintSII(system, driver_name, device_uri, device_id, data, attrs, cbdata); else if (!strncmp(driver_name, "tspl_", 5)) ret = lprintTSPL(system, driver_name, device_uri, device_id, data, attrs, cbdata); else if (!strncmp(driver_name, "zpl_", 4)) ret = lprintZPL(system, driver_name, device_uri, device_id, data, attrs, cbdata); // Update the ready media... for (i = 0; i < data->num_source; i ++) { pwg_media_t *pwg = pwgMediaForPWG(data->media_ready[i].size_name); data->media_ready[i].bottom_margin = data->bottom_top; data->media_ready[i].left_margin = data->left_right; data->media_ready[i].right_margin = data->left_right; data->media_ready[i].size_width = pwg->width; data->media_ready[i].size_length = pwg->length; data->media_ready[i].top_margin = data->bottom_top; papplCopyString(data->media_ready[i].source, data->source[i], sizeof(data->media_ready[i].source)); if (!data->media_ready[i].type[0]) papplCopyString(data->media_ready[i].type, data->type[0], sizeof(data->media_ready[i].type)); } // By default use media from the main source... data->media_default = data->media_ready[0]; // Return... return (ret); } // // 'free_cb()' - Free a device entry. // static void free_cb(lprint_device_t *dev) // I - Device entry { free(dev->device_info); free(dev->device_uri); free(dev->device_id); free(dev); } // // 'match_id()' - Compare two IEEE-1284 device IDs and return a score. // // The score is 2 for each exact match and 1 for a partial match in a comma- // delimited field. Any non-match results in a score of 0. // static int // O - Score match_id(int num_did, // I - Number of device ID key/value pairs cups_option_t *did, // I - Device ID key/value pairs const char *match_id) // I - Driver's device ID match string { int i, // Looping var score = 0, // Score num_mid; // Number of match ID key/value pairs cups_option_t *mid, // Match ID key/value pairs *current; // Current key/value pair const char *value, // Device ID value *valptr; // Pointer into value // Parse the matching device ID into key/value pairs... if ((num_mid = papplDeviceParseID(match_id, &mid)) == 0) return (0); // Loop through the match pairs to find matches (or not) for (i = num_mid, current = mid; i > 0; i --, current ++) { if ((value = cupsGetOption(current->name, num_did, did)) == NULL) { // No match score = 0; break; } if (!strcasecmp(current->value, value)) { // Full match! score += 2; } else if ((valptr = strstr(value, current->value)) != NULL) { // Possible substring match, check size_t mlen = strlen(current->value); // Length of match value if ((valptr == value || valptr[-1] == ',') && (!valptr[mlen] || valptr[mlen] == ',')) { // Partial match! score ++; } else { // No match score = 0; break; } } else { // No match score = 0; break; } } cupsFreeOptions(num_mid, mid); return (score); } // // 'mime_cb()' - MIME typing callback... // static const char * // O - MIME media type or `NULL` if none mime_cb(const unsigned char *header, // I - Header data size_t headersize, // I - Size of header data void *cbdata) // I - Callback data (not used) { char testpage[] = LPRINT_TESTPAGE_HEADER; // Test page file header if (headersize >= sizeof(testpage) && !memcmp(header, testpage, sizeof(testpage))) return (LPRINT_TESTPAGE_MIMETYPE); else if (headersize >= 2 && header[0] == '^' && isupper(header[1] & 255)) return (LPRINT_ZPL_MIMETYPE); else if (headersize >= 3 && !memcmp(header, "\nN\n", 3)) return (LPRINT_EPL2_MIMETYPE); else return (NULL); } // // 'printer_cb()' - Try auto-adding printers. // static bool // O - `false` to continue printer_cb(const char *device_info, // I - Device information const char *device_uri, // I - Device URI const char *device_id, // I - IEEE-1284 device ID cups_array_t *devices) // I - Device array { lprint_device_t dev; // New device dev.device_info = (char *)device_info; dev.device_uri = (char *)device_uri; dev.device_id = (char *)device_id; cupsArrayAdd(devices, &dev); return (false); } // // 'system_cb()' - Setup the system object. // static pappl_system_t * // O - System object system_cb( int num_options, // I - Number options cups_option_t *options, // I - Options void *data) // I - Callback data (unused) { pappl_system_t *system; // System object const char *val, // Current option value *hostname, // Hostname, if any *listenhost, // Listen hostname, if any *logfile, // Log file, if any *spooldir, // Spool directory, if any *system_name; // System name, if any pappl_loglevel_t loglevel; // Log level int port = 0; // Port number, if any pappl_soptions_t soptions = PAPPL_SOPTIONS_MULTI_QUEUE | PAPPL_SOPTIONS_WEB_INTERFACE | PAPPL_SOPTIONS_WEB_LOG | PAPPL_SOPTIONS_WEB_SECURITY; // System options static pappl_version_t versions[1] = // Software versions { { "LPrint", "", LPRINT_VERSION, { LPRINT_MAJOR_VERSION, LPRINT_MINOR_VERSION, LPRINT_PATCH_VERSION, 0 } } }; (void)data; // Parse standard log and server options... if ((val = cupsGetOption("log-level", num_options, options)) != NULL) { if (!strcmp(val, "fatal")) loglevel = PAPPL_LOGLEVEL_FATAL; else if (!strcmp(val, "error")) loglevel = PAPPL_LOGLEVEL_ERROR; else if (!strcmp(val, "warn")) loglevel = PAPPL_LOGLEVEL_WARN; else if (!strcmp(val, "info")) loglevel = PAPPL_LOGLEVEL_INFO; else if (!strcmp(val, "debug")) loglevel = PAPPL_LOGLEVEL_DEBUG; else { fprintf(stderr, "lprint: Bad log-level value '%s'.\n", val); return (NULL); } } else loglevel = PAPPL_LOGLEVEL_UNSPEC; if ((val = cupsGetOption("server-options", num_options, options)) != NULL) { const char *valptr; // Pointer into value for (valptr = val; valptr && *valptr;) { if (!strcmp(valptr, "none") || !strncmp(valptr, "none,", 5)) soptions = PAPPL_SOPTIONS_NONE; else if (!strcmp(valptr, "dnssd-host") || !strncmp(valptr, "dnssd-host,", 11)) soptions |= PAPPL_SOPTIONS_DNSSD_HOST; else if (!strcmp(valptr, "no-multi-queue") || !strncmp(valptr, "no-multi-queue,", 15)) soptions &= (pappl_soptions_t)~PAPPL_SOPTIONS_MULTI_QUEUE; else if (!strcmp(valptr, "raw-socket") || !strncmp(valptr, "raw-socket,", 11)) soptions |= PAPPL_SOPTIONS_RAW_SOCKET; else if (!strcmp(valptr, "usb-printer") || !strncmp(valptr, "usb-printer,", 12)) soptions |= PAPPL_SOPTIONS_USB_PRINTER; else if (!strcmp(valptr, "no-web-interface") || !strncmp(valptr, "no-web-interface,", 17)) soptions &= (pappl_soptions_t)~PAPPL_SOPTIONS_WEB_INTERFACE; else if (!strcmp(valptr, "web-log") || !strncmp(valptr, "web-log,", 8)) soptions |= PAPPL_SOPTIONS_WEB_LOG; else if (!strcmp(valptr, "web-network") || !strncmp(valptr, "web-network,", 12)) soptions |= PAPPL_SOPTIONS_WEB_NETWORK; else if (!strcmp(valptr, "web-remote") || !strncmp(valptr, "web-remote,", 11)) soptions |= PAPPL_SOPTIONS_WEB_REMOTE; else if (!strcmp(valptr, "web-security") || !strncmp(valptr, "web-security,", 13)) soptions |= PAPPL_SOPTIONS_WEB_SECURITY; else if (!strcmp(valptr, "no-tls") || !strncmp(valptr, "no-tls,", 7)) soptions |= PAPPL_SOPTIONS_NO_TLS; if ((valptr = strchr(valptr, ',')) != NULL) valptr ++; } } hostname = cupsGetOption("server-hostname", num_options, options); listenhost = cupsGetOption("listen-hostname", num_options, options); logfile = cupsGetOption("log-file", num_options, options); spooldir = cupsGetOption("spool-directory", num_options, options); system_name = cupsGetOption("system-name", num_options, options); if ((val = cupsGetOption("server-port", num_options, options)) != NULL) { if (!isdigit(*val & 255)) { fprintf(stderr, "lprint: Bad server-port value '%s'.\n", val); return (NULL); } else port = atoi(val); } // Spool directory and state file... if ((val = getenv("SNAP_DATA")) != NULL) { snprintf(lprint_spooldir, sizeof(lprint_spooldir), "%s/lprint.d", val); snprintf(lprint_statefile, sizeof(lprint_statefile), "%s/lprint.conf", val); if (!spooldir) spooldir = lprint_spooldir; } else if ((val = getenv("XDG_DATA_HOME")) != NULL) { snprintf(lprint_statefile, sizeof(lprint_statefile), "%s/.lprint.conf", val); } #ifdef _WIN32 else if ((val = getenv("USERPROFILE")) != NULL) { snprintf(lprint_spooldir, sizeof(lprint_spooldir), "%s/AppData/Local/lprint.d", val); snprintf(lprint_statefile, sizeof(lprint_statefile), "%s/AppData/Local/lprint.ini", val); if (!spooldir) spooldir = lprint_spooldir; } else { papplCopyString(lprint_statefile, "/lprint.ini", sizeof(lprint_statefile)); } #else else if ((val = getenv("HOME")) != NULL) { # ifdef __APPLE__ snprintf(lprint_spooldir, sizeof(lprint_spooldir), "%s/Library/Application Support/lprint.d", val); snprintf(lprint_statefile, sizeof(lprint_statefile), "%s/Library/Application Support/lprint.state", val); if (!spooldir) spooldir = lprint_spooldir; # else snprintf(lprint_statefile, sizeof(lprint_statefile), "%s/.lprint.conf", val); # endif // __APPLE__ } else { papplCopyString(lprint_statefile, "/etc/lprint.conf", sizeof(lprint_statefile)); } #endif // _WIN32 if (spooldir && access(spooldir, 0)) { if (mkdir(spooldir, 0777)) { perror(spooldir); return (NULL); } } // Create the system object... if ((system = papplSystemCreate(soptions, system_name ? system_name : "LPrint", port, "_print,_universal", spooldir, logfile ? logfile : "-", loglevel, cupsGetOption("auth-service", num_options, options), /* tls_only */false)) == NULL) return (NULL); if (!cupsGetOption("private-server", num_options, options)) { // Listen for TCP/IP connections... papplSystemAddListeners(system, listenhost); } papplSystemSetHostName(system, hostname); if ((val = cupsGetOption("admin-group", num_options, options)) != NULL) papplSystemSetAdminGroup(system, val); papplSystemSetMIMECallback(system, mime_cb, NULL); papplSystemAddMIMEFilter(system, LPRINT_TESTPAGE_MIMETYPE, "image/pwg-raster", lprintTestFilterCB, NULL); papplSystemSetPrinterDrivers(system, (int)(sizeof(lprint_drivers) / sizeof(lprint_drivers[0])), lprint_drivers, autoadd_cb, create_cb, driver_cb, system); papplSystemAddResourceData(system, "/favicon.png", "image/png", lprint_small_png, sizeof(lprint_small_png)); papplSystemAddResourceData(system, "/navicon.png", "image/png", lprint_png, sizeof(lprint_png)); papplSystemAddResourceString(system, "/style.css", "text/css", lprint_css); papplSystemAddStringsData(system, "/de.strings", "de", lprint_de_strings); papplSystemAddStringsData(system, "/en.strings", "en", lprint_en_strings); papplSystemAddStringsData(system, "/es.strings", "es", lprint_es_strings); papplSystemAddStringsData(system, "/fr.strings", "fr", lprint_fr_strings); papplSystemAddStringsData(system, "/it.strings", "it", lprint_it_strings); papplSystemSetFooterHTML(system, "Copyright © 2019-2024 by Michael R Sweet. All rights reserved."); papplSystemSetSaveCallback(system, (pappl_save_cb_t)papplSystemSaveState, (void *)lprint_statefile); papplSystemSetVersions(system, (int)(sizeof(versions) / sizeof(versions[0])), versions); if (!papplSystemLoadState(system, lprint_statefile)) { // No old state, use defaults and auto-add printers... cups_array_t *devices; // Device array lprint_device_t *dev; // Current device papplSystemSetDNSSDName(system, system_name ? system_name : "LPrint"); papplLog(system, PAPPL_LOGLEVEL_INFO, "Auto-adding printers..."); devices = cupsArrayNew(NULL, NULL, NULL, 0, (cups_acopy_cb_t)copy_cb, (cups_afree_cb_t)free_cb); papplDeviceList(PAPPL_DEVTYPE_USB, (pappl_device_cb_t)printer_cb, devices, papplLogDevice, system); for (dev = (lprint_device_t *)cupsArrayGetFirst(devices); dev; dev = (lprint_device_t *)cupsArrayGetNext(devices)) { const char *driver_name = autoadd_cb(dev->device_info, dev->device_uri, dev->device_id, system); // Driver name, if any printf("%s (%s;%s) -> %s\n", dev->device_info, dev->device_uri, dev->device_id, driver_name); if (driver_name) { char name[128], // Printer name *nameptr; // Pointer in name // Zebra puts "Zebra Technologies ZTC" on the front of their printer names, // which is a bit, um, wordy. Clean up the device info string to use as a // printer name and drop any trailing "(ID)" nonsense if we don't need it. if (!strncasecmp(dev->device_info, "Zebra Technologies ZTC ", 23)) snprintf(name, sizeof(name), "Zebra %s", dev->device_info + 23); else papplCopyString(name, dev->device_info, sizeof(name)); if ((nameptr = strstr(name, " (")) != NULL) *nameptr = '\0'; if (!papplPrinterCreate(system, 0, name, driver_name, dev->device_id, dev->device_uri)) { // Printer already exists with this name, so try adding a number to the // name... int i; // Looping var char newname[128], // New name number[4]; // Number string size_t namelen = strlen(name),// Length of original name string numberlen; // Length of number string for (i = 2; i < 100; i ++) { // Append " NNN" to the name, truncating the existing name as needed to // include the number at the end... snprintf(number, sizeof(number), " %d", i); numberlen = strlen(number); papplCopyString(newname, name, sizeof(newname)); if ((namelen + numberlen) < sizeof(newname)) memcpy(newname + namelen, number, numberlen + 1); else memcpy(newname + sizeof(newname) - numberlen - 1, number, numberlen + 1); // Try creating with this name... if (papplPrinterCreate(system, 0, newname, driver_name, dev->device_id, dev->device_uri)) break; } } } } cupsArrayDelete(devices); } return (system); } lprint-1.3.1/lprint.h000066400000000000000000000157351456151556700145370ustar00rootroot00000000000000// // Header file for LPrint, a Label Printer Application // // Copyright © 2019-2023 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // #ifndef LPRINT_H # define LPRINT_H # include "config.h" # include # include // // Debug macro... // # ifdef DEBUG # define LPRINT_DEBUG(...) fprintf(stderr, __VA_ARGS__) # else # define LPRINT_DEBUG(...) # endif // DEBUG // // Function annotations... // # if defined(__GNUC__) || defined(__has_extension) # define LPRINT_FORMAT(a,b) __attribute__ ((__format__(__printf__, a,b))) # define LPRINT_NONNULL(...) __attribute__ ((nonnull(__VA_ARGS__))) # define LPRINT_NORETURN __attribute__ ((noreturn)) # else # define LPRINT_FORMAT(a,b) # define LPRINT_NONNULL(...) # define LPRINT_NORETURN # endif // __GNUC__ || __has_extension // // The CUPS API is changed in CUPS v3... // # if CUPS_VERSION_MAJOR < 3 # define CUPS_ENCODING_ISO8859_1 CUPS_ISO8859_1 # define CUPS_ENCODING_JIS_X0213 CUPS_JIS_X0213 # define cups_len_t int # define cups_page_header_t cups_page_header2_t # define cupsArrayNew cupsArrayNew3 # define cupsLangGetName(lang) lang->language # define cupsRasterReadHeader cupsRasterReadHeader2 # define cupsRasterWriteHeader cupsRasterWriteHeader2 # define cupsTempFd(prefix,suffix,buffer,bufsize) cupsTempFd(buffer,bufsize) # define httpConnect httpConnect2 # define httpDecode64(out,outlen,in,end) httpDecode64_2(out,outlen,in) # define httpEncode64(out,outlen,in,inlen,url) httpEncode64_2(out,outlen,in,inlen) # define httpGetDateString httpGetDateString2 # define httpRead httpRead2 # define httpReconnect httpReconnect2 # define httpStatusString httpStatus # define httpWrite httpWrite2 # define httpWriteResponse(http,code) (httpWriteResponse(http,code) == 0) # define IPP_NUM_CAST (int) # if CUPS_VERSION_MINOR < 3 # define HTTP_STATUS_FOUND (http_status_t)302 # endif // CUPS_VERSION_MINOR < 3 # if CUPS_VERSION_MINOR < 5 # define cupsArrayGetCount cupsArrayCount # define cupsArrayGetElement(a,n) cupsArrayIndex(a,(int)n) # define cupsArrayGetFirst cupsArrayFirst # define cupsArrayGetLast cupsArrayLast # define cupsArrayGetNext cupsArrayNext # define cupsArrayGetPrev cupsArrayPrev # define cupsGetUser cupsUser # define httpAddrConnect httpAddrConnect2 # define httpAddrGetFamily httpAddrFamily # define httpAddrGetLength httpAddrLength # define httpAddrGetString httpAddrString # define httpAddrIsLocalhost httpAddrLocalhost # define httpSetEncryption(http,e) (httpEncryption(http,e)>=0) # define ippGetFirstAttribute ippFirstAttribute # define ippGetNextAttribute ippNextAttribute typedef cups_array_func_t cups_array_cb_t; typedef cups_acopy_func_t cups_acopy_cb_t; typedef cups_afree_func_t cups_afree_cb_t; typedef cups_raster_iocb_t cups_raster_cb_t; typedef ipp_copycb_t ipp_copy_cb_t; # else # define httpDecode64 httpDecode64_3 # define httpEncode64 httpEncode64_3 # endif // CUPS_VERSION_MINOR < 5 # else # define cups_len_t size_t # define cups_utf8_t char # define IPP_NUM_CAST (size_t) # endif // CUPS_VERSION_MAJOR < 3 // // Constants... // # define LPRINT_TESTPAGE_MIMETYPE "application/vnd.lprint-test" # define LPRINT_TESTPAGE_HEADER "T*E*S*T*P*A*G*E*" # ifdef LPRINT_EXPERIMENTAL # define LPRINT_BROTHER_PT_CBP_MIMETYPE "application/vnd.brother-pt-cbp" # define LPRINT_CPCL_MIMETYPE "application/vnd.zebra-cpcl" # endif // LPRINT_EXPERIMENTAL # define LPRINT_EPL2_MIMETYPE "application/vnd.eltron-epl" # define LPRINT_SLP_MIMETYPE "application/vnd.sii-slp" # define LPRINT_TSPL_MIMETYPE "application/vnd.tsc-tspl" # define LPRINT_ZPL_MIMETYPE "application/vnd.zebra-zpl" // // Types... // typedef struct lprint_dither_s // Dithering state { pappl_dither_t dither; // Dither matrix to use unsigned char *input[4]; // Input lines for dithering (only 3 are needed, 4 makes it easier for ring buffer) unsigned in_width, // Width in pixels in_height, // Height in lines in_left, // Left (starting) pixel in_top, // Top-most pixel in_bottom; // Bottom-most pixel unsigned char in_bpp, // Input bits per pixel (1 or 8) in_white; // Input white pixel value (0 or 255) unsigned char *output, // Output bitmap out_white; // Output white pixel value (0 or 255) unsigned out_width; // Output width in bytes } lprint_dither_t; typedef struct lprint_cmedia_s // Custom label sizes (per-printer/source) { char custom_name[PAPPL_MAX_SOURCE][128]; // Custom media size names } lprint_cmedia_t; // // Functions... // extern bool lprintDitherAlloc(lprint_dither_t *dither, pappl_job_t *job, pappl_pr_options_t *options, cups_cspace_t out_cspace, double out_gamma); extern void lprintDitherFree(lprint_dither_t *dither); extern bool lprintDitherLine(lprint_dither_t *dither, unsigned y, const unsigned char *line); extern bool lprintMediaLoad(pappl_printer_t *printer, pappl_pr_driver_data_t *data); extern const char *lprintMediaMatch(pappl_printer_t *printer, int source, int width, int length); extern bool lprintMediaSave(pappl_printer_t *printer, pappl_pr_driver_data_t *data); extern bool lprintMediaUI(pappl_client_t *client, pappl_printer_t *printer); extern void lprintMediaUpdate(pappl_printer_t *printer, pappl_pr_driver_data_t *data); # ifdef LPRINT_EXPERIMENTAL extern bool lprintBrother(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); extern bool lprintCPCL(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *driver_data, ipp_t **driver_attrs, void *cbdata); # endif // LPRINT_EXPERIMENTAL extern bool lprintDYMO(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); extern bool lprintEPL2(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); extern bool lprintSII(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); extern bool lprintTestFilterCB(pappl_job_t *job, pappl_device_t *device, void *data); extern const char *lprintTestPageCB(pappl_printer_t *printer, char *buffer, size_t bufsize); extern bool lprintTSPL(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); extern bool lprintZPL(pappl_system_t *system, const char *driver_name, const char *device_uri, const char *device_id, pappl_pr_driver_data_t *data, ipp_t **attrs, void *cbdata); extern void lprintZPLQueryDriver(pappl_system_t *system, const char *device_uri, char *name, size_t namesize); #endif // !LPRINT_H lprint-1.3.1/lprint.service.in000066400000000000000000000003701456151556700163420ustar00rootroot00000000000000[Unit] Description=LPrint Service After=network.target nss-lookup.target Requires=avahi-daemon.socket [Install] WantedBy=multi-user.target [Service] ExecStart=@bindir@/lprint server -o log-file=- -o log-level=info Type=simple Restart=on-failure lprint-1.3.1/lprint.spec000066400000000000000000000032061456151556700152300ustar00rootroot00000000000000# # RPM "spec" file for LPrint. # Name: lprint Version: 1.3.1 Release: 0 Summary: LPrint, A Label Printer Application License: ASL 2.0 Source0: https://github.com/michaelrsweet/lprint/releases/download/v%{version}/lprint-%{version}.tar.gz URL: https://www.msweet.org/lprint Packager: Anonymous Vendor: Example Corp # Note: Package names are as defined for Red Hat (and clone) distributions BuildRequires: avahi-devel, cups-devel >= 2.2, gnutls-devel, libpng-devel >= 1.6, libusb-devel >= 1.0, pam-devel, pappl-devel >= 1.2 #BuildRoot: /tmp/%{name}-root %description LPrint implements printing for a variety of common label and receipt printers connected via network or USB. Features include: - A single executable handles spooling, status, and server functionality. - Multiple printer support. - Each printer implements an IPP Everywhere™ print service and is compatible with the driverless printing support in iOS, macOS, and Linux clients. - Each printer can support options such as label modes, tear-off offsets, media tracking, media top offset, print darkness, resolution, roll selection, and speed. - Each printer can print "raw", Apple/PWG Raster, and/or PNG files. For more information, see the file "DOCUMENTATION.md", the man pages in the "man" directory, and/or the LPrint project page at "https://www.msweet.org/lprint". %prep %setup %build CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr make %install make install %clean rm -rf $RPM_BUILD_ROOT %files /usr/bin/lprint %dir /usr/share/man/man1 /usr/share/man/man1/* %dir /usr/share/man/man5 /usr/share/man/man5/* lprint-1.3.1/macos-scripts/000077500000000000000000000000001456151556700156325ustar00rootroot00000000000000lprint-1.3.1/macos-scripts/postinstall000077500000000000000000000003001456151556700201250ustar00rootroot00000000000000#!/bin/sh # # Post-install script for macOS package. This script makes sure that the # LPrint service is loaded and run... # launchctl load -w /Library/LaunchDaemons/org.msweet.lprint.plist lprint-1.3.1/man/000077500000000000000000000000001456151556700136165ustar00rootroot00000000000000lprint-1.3.1/man/lprint-add.1000066400000000000000000000050521456151556700157400ustar00rootroot00000000000000.\" .\" lprint-add man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-add 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-add \- add a printer queue. .SH SYNOPSIS .B lprint .B add [ .B \-u .I SYSTEM-URI ] .B \-d .I PRINTER .B \-m .I DRIVER-NAME .B \-v .I DEVICE-URI [ .B \-o .I OPTION=VALUE ] .SH DESCRIPTION This command creates a label printer queue using the specified name, driver, and driver. .SH OPTIONS The following options are recognized by .B lprint add: .TP 5 \fB\-d \fIPRINTER\fR Specifies the name of the printer queue. .TP 5 \fB\-m \fIDRIVER-NAME\fR Specifies the name of the printer driver. See .BR lprint-drivers (1) for the command to list the available printer drivers. .TP 5 \fB\-o \fIOPTION=VALUE\fR Specifies the default value for the given option name. See .BR lprint-submit (1) for a list of supported options. .TP 5 \fB\-o label-mode-configured\fI=VALUE\fR Specifies the label printing mode: "applicator", "cutter", "cutter-delayed", "kiosk", "peel-off", "peel-off-prepeel", "rewind", "rfid", or "tear-off". .TP 5 \fB\-o label-tear-offset-configured\fI=NNNin\fR .TP 5 \fB\-o label-tear-offset-configured\fI=NNNmm\fR Specifies the label tear-off offset in inches ("NNNin") or millimeters ("NNNmm"). .TP 5 \fB\-o printer-darkness\fI=NNN\fR Specifies the base darkness setting for all print jobs as a percentage. 0 represents the lightest printing while 100 represents the darkest printing. .TP 5 \fB\-o printer-geo-location=geo:\fI=LATLON\fR Specifies the geographic location of the printer as a "geo:" URI. .TP 5 \fB\-o printer-location\fI=LOCATION\fR Specifies the human-readable location, for example "Rack 42". .TP 5 \fB\-o printer-organization\fI=ORGANIZATION\fR Specifies the organization name, for example "Acme, Inc.". .TP 5 \fB\-o printer-organizational-unit\fI=UNIT\fR Specifies the organizational unit, for example "Shipping Department". .TP 5 \fB\-u \fISYSTEM-URI\fR Specifies a remote LPrint server to use. The "SYSTEM-URI" is of the form "ipps://HOSTNAME:PORT/ipp/system". .TP 5 \fB\-v \fIDEVICE-URI\fR Specifies the device for the printer queue. The value can be a socket: URI such as "socket://11.22.33.44" or a usb: URI as listed by the .BR lprint-devices (1) command. .SH SEE ALSO .BR lprint (1), .BR lprint-delete (1), .BR lprint-devices (1), .BR lprint-drivers (1), .BR lprint-modify (1), .BR lprint-options (1), .BR lprint-submit (1) .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-cancel.1000066400000000000000000000022751456151556700164410ustar00rootroot00000000000000.\" .\" lprint-cancel man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-cancel 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-cancel \- cancel one or more print jobs. .SH SYNOPSIS .B lprint .B cancel [ .B \-d .I PRINTER ] [ .B \-u .I PRINTER-URI ] [ .B \-j .I JOB-ID ] .br .B lprint .B cancel [ .B \-d .I PRINTER ] [ .B \-u .I PRINTER-URI ] .B \-a .SH DESCRIPTION This command cancels one or more print jobs. In the first form, the currently printing job or the specified job is canceled. In the second form, all print jobs are canceled. .SH OPTIONS The following options are recognized by .B lprint cancel: .TP 5 .B \-a Cancel all print jobs. .TP 5 \fB\-d \fIPRINTER\fR Specifies the name of the printer queue. If not specified, the default printer is used. .TP 5 \fB\-j \fIJOB-ID\fR Specifies the print job number. .TP 5 \fB\-u \fIPRINTER-URI\fR Specifies an "ipp:" or "ipps:" URI for a remote printer. .SH SEE ALSO .BR lprint-default (1), .BR lprint-jobs (1), .BR lprint-submit (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-default.1000066400000000000000000000017631456151556700166410ustar00rootroot00000000000000.\" .\" lprint-default man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-default 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-default \- set or get the default printer queue. .SH SYNOPSIS .B lprint .B default [ .B \-d .I PRINTER ] [ .B \-u .I PRINTER-URI ] .SH DESCRIPTION This command gets or sets the default printer queue. When run without options, the current default printer is written to the standard output. Otherwise, the default printer is changed. .SH OPTIONS The following options are recognized by .B lprint default: .TP 5 \fB\-d \fIPRINTER\fR Specifies the new default printer queue. .TP 5 \fB\-u \fIPRINTER-URI\fR Specifies an "ipp:" or "ipps:" URI for a remote printer. .SH SEE ALSO .BR lprint (1), .BR lprint-add (1), .BR lprint-modify (1), .BR lprint-printers (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-delete.1000066400000000000000000000015321456151556700164510ustar00rootroot00000000000000.\" .\" lprint-delete man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-delete 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-delete \- delete a label printer queue. .SH SYNOPSIS .B lprint .B delete .B \-d .I PRINTER .br .B lprint .B delete .B \-u .I PRINTER-URI .SH DESCRIPTION This command deletes the specified label printer queue. .SH OPTIONS The following options are recognized by .B lprint delete: .TP 5 \fB\-d \fIPRINTER\fR Specifies the printer queue to delete. .TP 5 \fB\-u \fIPRINTER-URI\fR Specifies an "ipp:" or "ipps:" URI for a remote printer. .SH SEE ALSO .BR lprint (1), .BR lprint-add (1), .BR lprint-modify (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-devices.1000066400000000000000000000013371456151556700166340ustar00rootroot00000000000000.\" .\" lprint-devices man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-devices 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-devices \- list connected label printer devices. .SH SYNOPSIS .B lprint .B devices .SH DESCRIPTION This command lists connected label printer devices. .SH OPTIONS The \fB-o verbose\fR option produces a verbose list including the detected make, model, and IEEE-1284 device ID strings. .SH SEE ALSO .BR lprint (1), .BR lprint-add (1), .BR lprint-drivers (1), .BR lprint-modify (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-drivers.1000066400000000000000000000013411456151556700166630ustar00rootroot00000000000000.\" .\" lprint-drivers man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-drivers 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-drivers \- list drivers supported by the print server. .SH SYNOPSIS .B lprint .B drivers .SH DESCRIPTION This command lists the supported printer drivers. .SH OPTIONS The \fB\-o device-id=\fIDEVICE-ID\fR option will limit the list to drivers matching the specified IEEE-1284 device ID. .SH SEE ALSO .BR lprint (1), .BR lprint-add (1), .BR lprint-devices (1), .BR lprint-modify (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-jobs.1000066400000000000000000000015661456151556700161530ustar00rootroot00000000000000.\" .\" lprint-jobs man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-jobs 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-jobs \- list pending print jobs. .SH SYNOPSIS .B lprint .B jobs [ .B \-d .I PRINTER ] [ .B \-u .I PRINTER-URI ] .SH DESCRIPTION This command lists pending print jobs. If not specified, print jobs submitted to the default printer are listed. .SH OPTIONS The following options are recognized by .B lprint jobs: .TP 5 \fB\-d \fIPRINTER\fR Specifies the printer queue to list. .TP 5 \fB\-u \fIPRINTER-URI\fR Specifies an "ipp:" or "ipps:" URI for a remote printer. .SH SEE ALSO .BR lprint (1), .BR lprint-cancel (1), .BR lprint-default (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-modify.1000066400000000000000000000042131456151556700164750ustar00rootroot00000000000000.\" .\" lprint-modify man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2024 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-modify 1 "LPrint" "2024-02-06" "Michael R Sweet" .SH NAME lprint-modify \- modify a printer queue. .SH SYNOPSIS .B lprint .B modify .B \-d .I PRINTER [ .B \-o .I OPTION=VALUE ] .br .B lprint .B modify .B \-u .I PRINTER-URI [ .B \-o .I OPTION=VALUE ] .SH DESCRIPTION This command modifies an existing label printer queue. .SH OPTIONS The following options are recognized by .B lprint modify: .TP 5 \fB\-d \fIPRINTER-NAME\fR Specifies the name of the print queue. .TP 5 \fB\-o \fIOPTION=VALUE\fR Specifies the default value for the given option name. See .BR lprint-submit (1) for a list of supported options. .TP 5 \fB\-o label-mode-configured\fI=VALUE\fR Specifies the label printing mode: "applicator", "cutter", "cutter-delayed", "kiosk", "peel-off", "peel-off-prepeel", "rewind", "rfid", or "tear-off". .TP 5 \fB\-o label-tear-offset-configured\fI=NNNin\fR .TP 5 \fB\-o label-tear-offset-configured\fI=NNNmm\fR Specifies the label tear-off offset in inches ("NNNin") or millimeters ("NNNmm"). .TP 5 \fB\-o printer-darkness\fI=NNN\fR Specifies the base darkness setting for all print jobs as a percentage. 0 represents the lightest printing while 100 represents the darkest printing. .TP 5 \fB\-o printer-geo-location=geo:\fI=LATLON\fR Specifies the geographic location of the printer as a "geo:" URI. .TP 5 \fB\-o printer-location\fI=LOCATION\fR Specifies the human-readable location, for example "Rack 42". .TP 5 \fB\-o printer-organization\fI=ORGANIZATION\fR Specifies the organization name, for example "Acme, Inc.". .TP 5 \fB\-o printer-organizational-unit\fI=UNIT\fR Specifies the organizational unit, for example "Shipping Department". .TP 5 \fB\-u \fIPRINTER-URI\fR Specifies an "ipp:" or "ipps:" URI for a remote printer. .SH SEE ALSO .BR lprint (1), .BR lprint-add (1), .BR lprint-delete (1), .BR lprint-devices (1), .BR lprint-drivers (1), .BR lprint-options (1), .BR lprint-submit (1) .SH COPYRIGHT Copyright \[co] 2019-2024 by Michael R Sweet. lprint-1.3.1/man/lprint-options.1000066400000000000000000000016271456151556700167070ustar00rootroot00000000000000.\" .\" lprint-options man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2020-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-default 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-options \- get the supported options for a printer queue. .SH SYNOPSIS .B lprint .B options [ .B \-d .I PRINTER ] [ .B \-u .I PRINTER-URI ] .SH DESCRIPTION This command gets the supported options for a printer queue. .SH OPTIONS The following options are recognized by .B lprint default: .TP 5 \fB\-d \fIPRINTER\fR Specifies the new default printer queue. .TP 5 \fB\-u \fIPRINTER-URI\fR Specifies an "ipp:" or "ipps:" URI for a remote printer. .SH SEE ALSO .BR lprint (1), .BR lprint-add (1), .BR lprint-modify (1), .BR lprint-printers (1), .BR lprint-submit (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-printers.1000066400000000000000000000010611456151556700170520ustar00rootroot00000000000000.\" .\" lprint-printers man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-printers 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-printers \- list the configured printer queues. .SH SYNOPSIS .B lprint .B printers .SH DESCRIPTION This command lists the configured label printer queues. .SH SEE ALSO .BR lprint (1), .BR lprint-add (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-server.1000066400000000000000000000072171456151556700165230ustar00rootroot00000000000000.\" .\" lprint-server man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-server 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-server \- start a label print server. .SH SYNOPSIS .B lprint .B server [ .B \-o .I OPTION=VALUE ] .SH DESCRIPTION This command starts a label print server. Normally a server is started automatically as needed, however you can run the server manually to listen on a public network address and/or enable different logging options. .SH OPTIONS The following options are recognized by .B lprint server: .TP 5 \fB\-o admin\-group=\fIGROUP\fR Specifies that remote configuration is authenticated against the named group. If not specified or the value "none" is given then any authenticated user may remotely configure lprint. .TP 5 \fB\-o auth\-service=\fISERVICE\fR Specifies the PAM service to use to authenticate for remote configuration requests. If not specified or the value "none" is given then printers can only be added, modified, or deleted locally. .TP 5 \fB\-o listen-hostname=\fIHOSTNAME\fR Listens for IPP connections on the specified hostname/address(es). If not specified, uses the wildcard addresses to allow connections from any address. .TP 5 .B \-o log\-file=\- Specifies that all messages are written to the standard error. .TP 5 .B \-o log\-file=syslog Specifies that all messages are sent to the syslog service. .TP 5 \fB\-o log\-file=\fRFILENAME\fR Specifies that all messages are written to the named file. If the file already exists, messages are appended to it. The default log file is "$TMPDIR/lprintUID.log". .TP 5 .B \-o log\-level=error Specifies that only error messages should be logged. This is the default. .TP 5 .B \-o log\-level=info Specifies that error and informational messages should be logged. .TP 5 .B \-o log\-level=debug Specifies that all messages should be logged. .TP 5 \fB\-o server\-hostname=\fIHOSTNAME\fR Specifies the hostname to advertise for the server. The default is the system hostname. .TP 5 \fB\-o server\-options=\fIOPTIONS\fI Specifies a comma-delimited list of server options. See "SERVER OPTIONS" below. .TP 5 \fB\-o server\-port=\fIPORT\fR Listens for IPP connections on the specified port. If not specified, a random port between 9000 and 9999 is chosen. .TP 5 \fB\-o spool\-directory=\fIDIRECTORY\fR Specifies a directory that holds pending print files. If not specified, a subdirectory in the system temporary directory is used. .SH SERVER OPTIONS By default, .B lprint server uses the "multi-queue" and "web-interface" options. The \fB\-o server\-options=\fIOPTIONS\fR option can be used to override the default options, where "OPTIONS" is a comma-delimited list of any of the following: .TP 5 .B dnssd\-host When resolving conflicts, add the DNS-SD hostname instead of a serial number or UUID. .TP 5 .B no\-multi\-queue Do no support multiple print queues. .TP 5 .B raw\-socket Provide a raw ("JetDirect") socket for each printer on port 91xx. .TP 5 .B usb\-printer Enable a USB printer gadget for the default printer (Linux only for Raspberry Pi and similar embedded SBCs). .TP 5 .B no\-web\-interface Disables the web interface. .TP 5 .B web\-log Enables the log file web page. .TP 5 .B web\-network Enables the network settings web page. .TP 5 .B web\-remote Enables remote queue management. .TP 5 .B web\-security Enables the user/password settings web page. .TP 5 .B web\-tls Enables the TLS settings web page. .TP 5 .B no\-tls Disables TLS support. .SH SEE ALSO .BR lprint (1), .BR lprint-shutdown (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-shutdown.1000066400000000000000000000010541456151556700170610ustar00rootroot00000000000000.\" .\" lprint-shutdown man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-shutdown 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-shutdown \- stop a running label print server. .SH SYNOPSIS .B lprint .B shutdown .SH DESCRIPTION This command stops a running label print server. .SH SEE ALSO .BR lprint (1), .BR lprint-server (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-status.1000066400000000000000000000015641456151556700165370ustar00rootroot00000000000000.\" .\" lprint-status man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-status 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-status \- show the current status of a printer .SH SYNOPSIS .B lprint .B status [ .B \-d .I PRINTER ] [ .B \-u .I PRINTER-URI ] .SH DESCRIPTION This command shows the current status of a printer. If no printer is specified, the combined server state is shown. .SH OPTIONS The following options are recognized by .B lprint status: .TP 5 \fB\-d \fIPRINTER\fR Specifies the name of a printer. .TP 5 \fB\-u \fIPRINTER-URI\fR Specifies an "ipp:" or "ipps:" URI for a remote printer. .SH SEE ALSO .BR lprint (1), .BR lprint-default (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint-submit.1000066400000000000000000000075711456151556700165230ustar00rootroot00000000000000.\" .\" lprint-submit man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint-submit 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint-submit \- submit a file for printing. .SH SYNOPSIS .B lprint [ .B submit ] [ .B \-d .I PRINTER ] [ .B \-u .I PRINTER-URI ] [ .B \-n .I COPIES ] [ .B \-o .I OPTION=VALUE ] [ .B \-t .I TITLE ] [ .I FILE [ ... FILE ] ] .br .B lprint [ .B submit ] [ .B \-d .I PRINTER ] [ .B \-u .I PRINTER-URI ] [ .B \-n .I COPIES ] [ .B \-o .I OPTION=VALUE ] [ .B \-t .I TITLE ] \- .SH DESCRIPTION This command submits one or more files for printing. The first form prints the named files. The second form copies the print file from the standard input. .SH OPTIONS The following options are recognized by .B lprint submit: .TP 5 \fB\-d \fIPRINTER\fR Specifies the name of the printer queue. If not specified, the default printer is used. .TP 5 \fB\-n \fICOPIES\fR Specifies the number of copies. .TP 5 \fB\-o media=\fISIZE-NAME\fR Specifies the label size. .TP 5 \fB\-o media-source=\fIROLL-NAME\fR Specifies the label roll. .TP 5 \fB\-o media-top-offset=\fINNN\fBin\fR .TP 5 \fB\-o media-top-offset=\fINNN\fBmm\fR Specifies the distance to offset printing from the top of the label in inches ("NNNin") or millimeters ("NNNmm"). .TP 5 \fB\-o media-tracking=continuous\fR .TP 5 \fB\-o media-tracking=mark\fR .TP 5 \fB\-o media-tracking=web\fR Specifies how labels are tracked on the carrier backing - "continuous" for a continuous label or receipt paper, "mark" for labels that are separated with a visible mark on the carrier backing, or "web" for labels that are separated with a hole in the carrier backing. .TP 5 \fB\-o media-type=continuous\fR .TP 5 \fB\-o media-type=labels\fR Specifies the type of roll media being used - "continuous" for continuous labels or receipt paper, or "labels" for cut labels on a carrier backing. .TP 5 .B \-o orientation-requested=portrait Print images in portrait orientation. .TP 5 .B \-o orientation-requested=landscape Print images in landscape (90 degrees counter-clockwise) orientation. .TP 5 .B \-o orientation-requested=reverse-portrait Print images in reverse-portrait (upside down) orientation. .TP 5 .B \-o orientation-requested=reverse-landscape Print images in reverse-landscape (90 degrees clockwise) orientation. .TP 5 .B \-o orientation-requested=none Print images in automatic (portrait or landscape) orientation. .TP 5 .B \-o print-color-mode=bi-level Only print black or white when printing images. .TP 5 .B \-o print-color-mode=monochrome Halftone shades of gray when printing images. .B \-o print-content-optimize=auto Optimize printing automatically based on the type and content of the file. .B \-o print-content-optimize=graphic Optimize printing for graphics only. .B \-o print-content-optimize=photo Optimize printing for photos. .B \-o print-content-optimize=text Optimize printing for text only. .B \-o print-content-optimize=text-and-graphic Optimize printing for text and graphics. .TP 5 \fB\-o print-darkness=\fINNN\fR Specifies the print darkness from -100 (lightest) to 100 (darkest). .TP 5 \fB\-o print-quality=draft\fR Print using draft quality. .TP 5 \fB\-o print-quality=normal\fR Print using normal quality. .TP 5 \fB\-o print-quality=high\fR Print using high/best quality. .TP 5 \fB\-o print-speed=\fINNNin\fR .TP 5 \fB\-o print-speed=\fINNNmm\fR Specifies the print speed in inches ("NNNin") or millimeters ("NNNmm") per second. .TP 5 \fB\-o printer-resolution=\fINNN\fBdpi\fR Specifies the print resolution in dots per inch. .TP 5 \fB\-t \fITITLE\fR Specifies the print job name. .TP 5 \fB\-u \fIPRINTER-URI\fR Specifies an "ipp:" or "ipps:" URI for a remote printer. .SH SEE ALSO .BR lprint-cancel (1), .BR lprint-default (1), .BR lprint-options (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint.1000066400000000000000000000033601456151556700152120ustar00rootroot00000000000000.\" .\" Main man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint 1 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint \- a label printer application .SH SYNOPSIS .B lprint [ .I SUB-COMMAND ] [ OPTIONS ] [ FILES ] .SH DESCRIPTION .B lprint is a label printer application that can be run standalone or as a dedicated IPP Everywhere network service. .B lprint supports printing PNG images, Apple/PWG raster files, and printer-specific label files to USB and network label printers. If no sub-command is specified, "submit" is assumed. .SH SUB-COMMANDS The following sub-commands are recognized by .B lprint: .TP 5 add Add a printer queue. .TP 5 cancel Cancel one or more print jobs. .TP 5 default Set the default printer queue. .TP 5 delete Delete a printer queue. .TP 5 devices List connected printers. .TP 5 drivers List the supported drivers. .TP 5 jobs List pending print jobs. .TP 5 modify Modify a printer queue. .TP 5 options List supported options. .TP 5 printers List the printer queues. .TP 5 server Start a server. .TP 5 shutdown Shutdown a running server. .TP 5 status Show the status of a printer or all printers. .TP 5 submit Submit a file for printing. .SH SEE ALSO https://www.msweet.org/lprint .br .BR lprint-add (1), .BR lprint-cancel (1), .BR lprint-default (1), .BR lprint-delete (1), .BR lprint-devices (1), .BR lprint-drivers (1), .BR lprint-jobs (1), .BR lprint-modify (1), .BR lprint-options (1), .BR lprint-printers (1), .BR lprint-server (1), .BR lprint-shutdown (1), .BR lprint-status (1), .BR lprint-submit (1), .BR lprint.conf (5) .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/man/lprint.conf.5000066400000000000000000000020051456151556700161350ustar00rootroot00000000000000.\" .\" lprint.conf man page for LPrint, a Label Printer Utility .\" .\" Copyright © 2019-2021 by Michael R Sweet. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" .TH lprint.conf 5 "LPrint" "2021-12-21" "Michael R Sweet" .SH NAME lprint.conf \- printer configuration file. .SH DESCRIPTION The .B ~/.lprint.conf (per-user server) and .B /etc/lprint.conf (root server) files contain a list of the printer queues configured using the .BR lprint-add (1), .BR lprint-default (1), .BR lprint-delete (1), and .BR lprint-modify (1) commands along with a history of print jobs submitted using the .BR lprint-submit (1) command. The files are not intended to be hand-edited and .B cannot be changed while the server is running as those changes will be lost. .SH SEE ALSO .BR lprint (1), .BR lprint-add (1), .BR lprint-default (1), .BR lprint-delete (1), .BR lprint-modify (1), .BR lprint-server (1), and .BR lprint-submit (1). .SH COPYRIGHT Copyright \[co] 2019-2021 by Michael R Sweet. lprint-1.3.1/org.msweet.lprint.plist000066400000000000000000000010311456151556700175140ustar00rootroot00000000000000 Label LPrint, a Label Printer Application RunAtLoad ProgramArguments /usr/local/bin/lprint server -o log-file=/Library/Logs/lprint.log -o log-level=info lprint-1.3.1/snap/000077500000000000000000000000001456151556700140045ustar00rootroot00000000000000lprint-1.3.1/snap/hooks/000077500000000000000000000000001456151556700151275ustar00rootroot00000000000000lprint-1.3.1/snap/hooks/configure000077500000000000000000000003751456151556700170430ustar00rootroot00000000000000#!/bin/sh # # Script to configure the LPrint server. # # Copyright © 2022 by Michael R Sweet # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # This script does nothing but is required to enable snap settings. lprint-1.3.1/snap/local/000077500000000000000000000000001456151556700150765ustar00rootroot00000000000000lprint-1.3.1/snap/local/lprint-server000077500000000000000000000023701456151556700176420ustar00rootroot00000000000000#!/bin/sh # # Script to start LPrint as a server. # # Copyright © 2022 by Michael R Sweet # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. # # Collect options: # # - admin-group: The name of the administrative group to use # - auth-service: The PAM authentication service to use # - listen-hostname: Listen hostname ("*" for all addresses) # - log-file: Log filename ("-" for stderr, "syslog" for system log) # - log-level: Log level (fatal, error, warn, info, debug) # - server-hostname: Host name to use # - server-name: DNS-SD name for LPrint on this system # - server-options: Comma-separated list of server options (none, dnssd-host, # no-multi-queue, raw-socket, usb-printer, no-web-interface, web-log, # web-network, web-remote, web-security, no-tls) # - server-port: Port number to use # - spool-directory: The directory for spool and state files # options="" for option in admin-group auth-service listen-hostname log-file log-level server-options spool-directory server-hostname server-name server-port; do value="$(snapctl get $option)" if test "x$value" != x; then options="$options $option='$value'" fi done # Execute the server with the specified options... exec lprint server -o "$options" lprint-1.3.1/snap/snapcraft.yaml000066400000000000000000000051201456151556700166470ustar00rootroot00000000000000name: lprint base: core22 version: "1.3.1" summary: A Label Printer Application description: | LPrint implements printing for a variety of common label and receipt printers connected via network or USB. Features include: - A single executable handles spooling, status, and server functionality. - Multiple printer support. - Each printer implements an IPP Everywhere™ print service and is compatible with the driverless printing support in iOS, macOS, and Linux clients. - Each printer can support options such as label modes, tear-off offsets, media tracking, media top offset, print darkness, resolution, roll selection, and speed. - Each printer can print "raw", Apple/PWG Raster, and/or PNG files. For more information, see the file "DOCUMENTATION.md", the man pages in the "man" directory, and/or the LPrint project page at "https://www.msweet.org/lprint". grade: stable confinement: strict icon: static-resources/lprint.png architectures: - build-on: amd64 - build-on: arm64 - build-on: armhf apps: lprint: command: bin/lprint plugs: [avahi-control, home, network, network-bind, network-manager, raw-usb] lprint-server: command: bin/lprint-server daemon: simple plugs: [avahi-control, home, network, network-bind, network-manager, raw-usb] hooks: configure: plugs: [avahi-control, home, network, network-bind, network-manager, raw-usb] parts: libcups3: plugin: autotools autotools-configure-parameters: [--disable-shared] source-type: git source: https://github.com/OpenPrinting/libcups.git build-packages: [libavahi-client-dev, libssl-dev, zlib1g-dev] stage-packages: [libavahi-client3] pappl: plugin: autotools autotools-configure-parameters: [--disable-shared,--enable-libjpeg,--enable-libpng,--enable-libusb] source-type: git source: https://github.com/michaelrsweet/pappl.git source-branch: v1.4.x after: [libcups3] build-packages: [libavahi-client-dev, libjpeg8-dev, libpam-dev, libpng-dev, libssl-dev, libusb-1.0-0-dev, zlib1g-dev] stage-packages: [libavahi-client3, libjpeg8, libpng16-16, libusb-1.0-0] hooks: plugin: dump source: snap/hooks organize: configure: snap/hooks/ scripts: plugin: dump source: snap/local organize: lprint-server: bin/ lprint: plugin: autotools autotools-configure-parameters: [--prefix=/] source: . after: [libcups3, pappl, hooks, scripts] lprint-1.3.1/static-resources/000077500000000000000000000000001456151556700163425ustar00rootroot00000000000000lprint-1.3.1/static-resources/lprint-css.h000066400000000000000000000365111456151556700206170ustar00rootroot00000000000000/* static-resources/lprint.css */ static const char * const lprint_css = "/* Base styles */\n" "@import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,700;1,400;1,700&family=Source+Code+Pro&display=swap');\n" "\n" "body {\n" " background: white;\n" " color: black;\n" " font-family: 'Open Sans', sans-serif;\n" " font-size: 16px;\n" " margin: 0;\n" "}\n" "code, kbd, pre, tt, input[type=email], input[type=number], input[type=password], input[type=tel], input[type=text], textarea {\n" " font-family: 'Source Code Pro', monospace;\n" "}\n" "pre {\n" " white-space: pre-wrap;\n" "}\n" "\n" "/* Header */\n" ".header {\n" " background: black;\n" " color: white;\n" " width: 100%;\n" "}\n" ".header2 {\n" " background: #333;\n" " color: white;\n" " width: 100%;\n" "}\n" "\n" "/* Navigation */\n" "div.nav {\n" " color: #ccc;\n" " vertical-align: middle;\n" "}\n" ".header div.nav {\n" " font-size: 24px;\n" " line-height: 40px;\n" "}\n" ".header2 div.nav {\n" " font-size: 20px;\n" " line-height: 35px;\n" "}\n" ".header a.btn, .header a.btn:visited, .header2 a.btn, .header2 a.btn:visited {\n" " color: #ccc;\n" " text-decoration: none;\n" " white-space: nowrap;\n" "}\n" ".header a.btn:hover, .header2 a.btn:hover {\n" " color: #eee;\n" "}\n" ".header a.btn:active, .header2 a.btn:active {\n" " color: #fff;\n" "}\n" ".header span.active, .header2 span.active {\n" " color: #fff;\n" " white-space: nowrap;\n" "}\n" ".header a.btn, .header span.active, .header span.spacer {\n" " padding: 0 30px 0 0;\n" "}\n" ".header2 a.btn, .header2 span.active {\n" " padding: 0 20px 0 0;\n" "}\n" "div.nav img {\n" " height: 24px;\n" " margin-right: 10px;\n" " vertical-align: middle;\n" "}\n" "span.spacer {\n" " color: #ccc;\n" "}\n" "span.spacer:after {\n" " content: \"⋮\";\n" "}\n" "\n" "/* Interior Content */\n" ".content {\n" " margin: 20px 0 44px;\n" "}\n" "\n" "form {\n" " display: inline-block;\n" "}\n" "\n" "div.btn {\n" " display: inline-block;\n" " line-height: 32px;\n" "}\n" ".content a.btn, .content a.btn:visited, button, input[type=submit], select {\n" " border: none;\n" " border-radius: 5px;\n" " cursor: pointer;\n" " font-family: inherit;\n" " font-size: 14px;\n" " font-weight: normal;\n" " padding: 4px 8px;\n" " text-decoration: none;\n" " white-space: nowrap;\n" " -moz-appearance: none;\n" " -webkit-appearance: none;\n" "}\n" ".content a.btn, .content a.btn:visited, button, input[type=submit] {\n" " background: #333;\n" " color: #ccc;\n" "}\n" ".content a.btn:hover, button:hover, input[type=submit]:hover {\n" " background: #333;\n" " color: #eee;\n" "}\n" ".content a.btn:active, button:active, input[type=submit]:active {\n" " background: #444;\n" " color: #fff;\n" "}\n" "input[type=email], input[type=password], input[type=tel], input[type=text] {\n" " padding: 4px 8px;\n" "}\n" "input[type=number] {\n" " appearance: textfield;\n" " padding: 4px 0 4px 8px;\n" "}\n" "input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button {\n" " -webkit-appearance: none;\n" " margin: 0;\n" "}\n" "input[type=email]:disabled, input[type=number]:disabled, input[type=password]:disabled, input[type=tel]:disabled, input[type=text]:disabled {\n" " border: none;\n" " color: black;\n" " font-size: 16px;\n" " padding: 0;\n" "}\n" "select {\n" " background: #ccc url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23000000' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n" " color: black;\n" " padding: 4px 32px 4px 8px;\n" "}\n" "select:hover {\n" " background: #ddd url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23000000' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n" "}\n" "textarea {\n" " width: 100%;\n" "}\n" "label.image input[type=radio] {\n" " position: absolute;\n" " opacity: 0;\n" " width: 0;\n" " height: 0;\n" "}\n" "label.image input[type=radio] + img {\n" " border-radius: 5px;\n" " cursor: pointer;\n" " padding: 2px;\n" "}\n" "label.image input[type=radio]:checked + img {\n" " background: rgba(127,127,127,.5);\n" "}\n" "\n" "div.switch {\n" " display: inline-flex;\n" "}\n" "div.switch input {\n" " border: 0;\n" " clip: rect(0,0,0,0);\n" " height: 1px;\n" " overflow: hidden;\n" " position: absolute !important;\n" " width: 1px;\n" "}\n" "div.switch label {\n" " background-color: #ddd;\n" " border: 1px solid rgba(0,0,0,0.2);\n" " color: black;\n" " font-family: monospace;\n" " font-size: 11px;\n" " line-height: 1;\n" " margin-right: -1px;\n" " padding: 6px 8px;\n" " text-align: center;\n" " transition: all 0.2s ease-in-out;\n" "}\n" "div.switch label:first-of-type {\n" " border-radius: 5px 0 0 5px;\n" "}\n" "div.switch label:last-of-type {\n" " border-radius: 0 5px 5px 0;\n" "}\n" "div.switch input:checked + label {\n" " background-color: #333;\n" " color: #ddd;\n" "}\n" "\n" "label.switch {\n" " position: relative;\n" " display: inline-block;\n" " width: 30px;\n" " height: 17px;\n" " margin-bottom: 5px;\n" " margin-left: 2px;\n" " vertical-align: middle;\n" "}\n" "label.switch input {\n" " opacity: 0;\n" " width: 0;\n" " height: 0;\n" "}\n" "\n" "img.password-show, img.password-hide {\n" " cursor: pointer;\n" " margin-left: -25px;\n" " padding-bottom: 5px;\n" " vertical-align: bottom;\n" "}\n" "img.password-hide {\n" " content: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktZXllLXNsYXNoIiB2aWV3Qm94PSIwIDAgMTYgMTYiPg0KICA8cGF0aCBkPSJNMTMuMzU5IDExLjIzOEMxNS4wNiA5LjcyIDE2IDggMTYgOHMtMy01LjUtOC01LjVhNy4wMjggNy4wMjggMCAwIDAtMi43OS41ODhsLjc3Ljc3MUE1Ljk0NCA1Ljk0NCAwIDAgMSA4IDMuNWMyLjEyIDAgMy44NzkgMS4xNjggNS4xNjggMi40NTdBMTMuMTM0IDEzLjEzNCAwIDAgMSAxNC44MjggOGMtLjA1OC4wODctLjEyMi4xODMtLjE5NS4yODgtLjMzNS40OC0uODMgMS4xMi0xLjQ2NSAxLjc1NS0uMTY1LjE2NS0uMzM3LjMyOC0uNTE3LjQ4NmwuNzA4LjcwOXoiLz4NCiAgPHBhdGggZD0iTTExLjI5NyA5LjE3NmEzLjUgMy41IDAgMCAwLTQuNDc0LTQuNDc0bC44MjMuODIzYTIuNSAyLjUgMCAwIDEgMi44MjkgMi44MjlsLjgyMi44MjJ6bS0yLjk0MyAxLjI5OS44MjIuODIyYTMuNSAzLjUgMCAwIDEtNC40NzQtNC40NzRsLjgyMy44MjNhMi41IDIuNSAwIDAgMCAyLjgyOSAyLjgyOXoiLz4NCiAgPHBhdGggZD0iTTMuMzUgNS40N2MtLjE4LjE2LS4zNTMuMzIyLS41MTguNDg3QTEzLjEzNCAxMy4xMzQgMCAwIDAgMS4xNzIgOGwuMTk1LjI4OGMuMzM1LjQ4LjgzIDEuMTIgMS40NjUgMS43NTVDNC4xMjEgMTEuMzMyIDUuODgxIDEyLjUgOCAxMi41Yy43MTYgMCAxLjM5LS4xMzMgMi4wMi0uMzZsLjc3Ljc3MkE3LjAyOSA3LjAyOSAwIDAgMSA4IDEzLjVDMyAxMy41IDAgOCAwIDhzLjkzOS0xLjcyMSAyLjY0MS0zLjIzOGwuNzA4LjcwOXptMTAuMjk2IDguODg0LTEyLTEyIC43MDgtLjcwOCAxMiAxMi0uNzA4LjcwOHoiLz4NCjwvc3ZnPg==);\n" "}\n" "img.password-show {\n" " content: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktZXllIiB2aWV3Qm94PSIwIDAgMTYgMTYiPg0KICA8cGF0aCBkPSJNMTYgOHMtMy01LjUtOC01LjVTMCA4IDAgOHMzIDUuNSA4IDUuNVMxNiA4IDE2IDh6TTEuMTczIDhhMTMuMTMzIDEzLjEzMyAwIDAgMSAxLjY2LTIuMDQzQzQuMTIgNC42NjggNS44OCAzLjUgOCAzLjVjMi4xMiAwIDMuODc5IDEuMTY4IDUuMTY4IDIuNDU3QTEzLjEzMyAxMy4xMzMgMCAwIDEgMTQuODI4IDhjLS4wNTguMDg3LS4xMjIuMTgzLS4xOTUuMjg4LS4zMzUuNDgtLjgzIDEuMTItMS40NjUgMS43NTVDMTEuODc5IDExLjMzMiAxMC4xMTkgMTIuNSA4IDEyLjVjLTIuMTIgMC0zLjg3OS0xLjE2OC01LjE2OC0yLjQ1N0ExMy4xMzQgMTMuMTM0IDAgMCAxIDEuMTcyIDh6Ii8+DQogIDxwYXRoIGQ9Ik04IDUuNWEyLjUgMi41IDAgMSAwIDAgNSAyLjUgMi41IDAgMCAwIDAtNXpNNC41IDhhMy41IDMuNSAwIDEgMSA3IDAgMy41IDMuNSAwIDAgMS03IDB6Ii8+DQo8L3N2Zz4=);\n" "}\n" "\n" "div.pager {\n" " padding: 10px 0;\n" " text-align: center;\n" "}\n" "\n" "div.log {\n" " background: #333;\n" " border: solid thin rgba(127,127,127,.5);\n" " color: #ccc;\n" " height: 30em;\n" " margin-top: 20px;\n" " overflow: scroll;\n" " width: 100%;\n" "}\n" "\n" "div.log pre {\n" " padding: 10px;\n" "}\n" "\n" "/* Footer */\n" ".footer {\n" " background: rgba(224,224,224,.9);\n" " bottom: 0;\n" " color: #777;\n" " font-size: 12px;\n" " height: 24px;\n" " left: 0;\n" " position: fixed;\n" " right: 0;\n" " width: 100%;\n" "}\n" ".footer a {\n" " color: #c66;\n" "}\n" "\n" "/* Grid System - Rows and Columns */\n" ".row {\n" " position: relative;\n" " width: 100%;\n" "}\n" ".row::after {\n" " clear: both;\n" " content: \"\";\n" " display: table;\n" " width: 0;\n" "}\n" ".row [class^=\"col-\"] {\n" " float: left;\n" " margin: 20px 0 0 2%;\n" " min-height: 1px;\n" " padding: 5px 0;\n" "}\n" ".row:first-child [class^=\"col-\"] {\n" " margin: 0 0 0 2%;\n" "}\n" "h1:first-child, h2:first-child, h3:first-child, .row p:first-child {\n" " margin-top: 0;\n" "}\n" ".row p:last-child, .rounded p:last-child {\n" " margin-bottom: 0;\n" "}\n" ".col-1 {\n" " width: 6.1666%;\n" "}\n" ".col-2 {\n" " width: 14.3333%;\n" "}\n" ".col-3 {\n" " width: 22.5%;\n" "}\n" ".col-4 {\n" " width: 30.6666%;\n" "}\n" ".col-5 {\n" " width: 38.8333%;\n" "}\n" ".col-6 {\n" " width: 47%;\n" "}\n" ".col-7 {\n" " width: 55.1666%;\n" "}\n" ".col-8 {\n" " width: 63.3333%;\n" "}\n" ".col-9 {\n" " width: 71.5%;\n" "}\n" ".col-10 {\n" " width: 79.6666%;\n" "}\n" ".col-11 {\n" " width: 87.8333%;\n" "}\n" ".col-12 {\n" " width: 96%;\n" "}\n" "\n" "/* Inline Styles */\n" "span.badge {\n" " background: #c00;\n" " border-radius: 8px;\n" " color: #fff;\n" " font-size: 14px;\n" " font-weight: bold;\n" " padding: 1px 6px;\n" "}\n" "\n" "span.bar {\n" " box-shadow: 1px 1px 2px rgba(51,51,51,0.25);\n" " font-size: 20px;\n" " line-height: 20px;\n" "}\n" "\n" "img.idle, img.processing, img.stopped {\n" " border-radius: 10px;\n" " float: left;\n" " height: 64px;\n" " margin-right: 10px;\n" " padding: 5px;\n" " width: 64px;\n" "}\n" "\n" "img.idle {\n" " background-color: rgba(0,192,0,0.5);\n" "}\n" "\n" "img.processing {\n" " background-color: rgba(224,224,0,0.5);\n" "}\n" "\n" "img.stopped {\n" " background-color: rgba(192,0,0,0.5);\n" "}\n" "\n" ".shaded {\n" " background-color: rgba(127,127,127,.25);\n" "}\n" "\n" "h1.title {\n" " border-bottom: solid 2px black;\n" " clear: both;\n" "}\n" "\n" "h2.title {\n" " border-bottom: solid 1px #555;\n" " clear: both;\n" " color: #555;\n" "}\n" "\n" ".title a:link, .title a:visited {\n" " color: inherit;\n" " text-decoration: none;\n" "}\n" "\n" ".title a.btn, .title a.btn:visited {\n" " color: #ccc;\n" " vertical-align: 25%;\n" "}\n" "\n" ".title a.btn:hover, .title a.btn:active {\n" " color: #fff;\n" "}\n" "\n" "/* Animations */\n" ".banner {\n" " animation: banner 3s 1s 1 forwards;\n" " background: rgba(160,160,224,0.5);\n" " border-radius: 5px;\n" " margin: 10px 0;\n" " padding: 10px;\n" "}\n" "\n" "@keyframes banner {\n" " 0% { background: rgba(160,160,224,0.5); }\n" " 100% { background: rgba(160,160,160,0.5); }\n" "}\n" "\n" ".spinner > div {\n" " width: 18px;\n" " height: 18px;\n" "\n" " border-radius: 100%;\n" " display: inline-block;\n" " animation: spinner 1.4s infinite ease-in-out both;\n" "}\n" "\n" ".spinner .bounce1 {\n" " animation-delay: -0.32s;\n" "}\n" "\n" ".spinner .bounce2 {\n" " animation-delay: -0.16s;\n" "}\n" "\n" "@keyframes spinner {\n" " 0%, 80%, 100% {\n" " transform: scale(0);\n" " background: rgba(160,160,160,0.5);\n" " } 40% {\n" " transform: scale(1.0);\n" " background: rgba(160,160,224,0.5);\n" " }\n" "}\n" "\n" "/* Form Tables */\n" "table.form {\n" " border-collapse: collapse;\n" " margin-top: 10px;\n" " min-width: 50%;\n" "}\n" "table.form td, table.form th {\n" " line-height: 30px;\n" " padding: 5px 2px;\n" " vertical-align: top;\n" "}\n" "table.form th {\n" " text-align: right;\n" "}\n" "\n" "iframe#map {\n" " width: 300px;\n" " height: 200px;\n" "}\n" "\n" "/* List Tables */\n" "table.list {\n" " border-bottom: solid thin black;\n" " border-collapse: collapse;\n" " clear: both;\n" " width: 100%;\n" "}\n" "table.list tr:nth-child(even) {\n" " background: #fcfcfc;\n" "}\n" "table.list tr:nth-child(odd) {\n" " background: #f0f0f0;\n" "}\n" "table.list th {\n" " background: white;\n" " border-bottom: solid thin black;\n" " text-align: left;\n" " vertical-align: bottom;\n" "}\n" "table.list td {\n" " margin: 0;\n" " padding: 5px;\n" " vertical-align: top;\n" "}\n" "\n" "/* Meter Tables for Supply Levels */\n" "table.meter {\n" " border-collapse: collapse;\n" " margin-top: 10px;\n" " min-width: 50%;\n" " max-width: 600px;\n" "}\n" "table.meter thead td {\n" " border-bottom: 1px solid black;\n" " border-left: 1px solid black;\n" " border-right: 1px solid black;\n" " height: 4px;\n" " line-height: 4px;\n" " padding: 0;\n" " width: 20%;\n" "}\n" "table.meter tfoot td {\n" " border-left: 1px solid black;\n" " border-right: 1px solid black;\n" " border-top: 1px solid black;\n" " height: 4px;\n" " line-height: 4px;\n" " padding: 0;\n" " width: 20%;\n" "}\n" "table.meter td {\n" " padding: 5px 0;\n" "}\n" "table.meter th {\n" " border-right: 1px solid black;\n" " padding: 5px;\n" " text-align: right;\n" "}\n" "\n" "/* Small Device Overrides */\n" "@media only screen and (min-device-width: 320px) and (max-device-width: 480px), only screen and (min-device-width: 320px) and (max-device-width: 568px) {\n" " .content {\n" " margin: 20px 0 20px;\n" " }\n" " .footer {\n" " height: auto;\n" " position: relative;\n" " }\n" " .row [class^=\"col-\"] {\n" " width: 96%;\n" " }\n" " iframe#map {\n" " width: 200px;\n" " height: 200px;\n" " }\n" "}\n" "\n" "/* Dark Mode Overrides */\n" "@media (prefers-color-scheme: dark) {\n" " body {\n" " background: black;\n" " color: #ccc;\n" " }\n" " span.bar {\n" " box-shadow: 1px 1px 5px rgba(255,255,255,0.5);\n" " }\n" "\n" " h1.title {\n" " border-bottom: solid 2px #ccc;\n" " }\n" " h2.title {\n" " border-bottom: solid 1px #999;\n" " color: #999;\n" " }\n" "\n" " input[type=email], input[type=text], input[type=password], input[type=number] {\n" " background: #333;\n" " color: #ccc;\n" " }\n" " select {\n" " background: #333 url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23CCCCCC' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n" " color: #ccc;\n" " padding: 4px 32px 4px 8px;\n" " }\n" " select:hover {\n" " background: #444 url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23DDDDDD' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n" " }\n" "\n" " div.switch label {\n" " background-color: #333;\n" " border: 1px solid rgba(191,191,191,0.2);\n" " color: #ccc;\n" " }\n" " div.switch input:checked + label {\n" " background-color: #ddd;\n" " color: #333;\n" " }\n" "\n" " table.list {\n" " border-bottom: solid thin #ccc;\n" " }\n" " table.list tr:nth-child(even) {\n" " background: #222;\n" " color: #ccc;\n" " }\n" " table.list tr:nth-child(odd) {\n" " background: #333;\n" " }\n" " table.list th {\n" " background: black;\n" " border-bottom: solid thin #ccc;\n" " }\n" " table.meter thead td {\n" " border-bottom: 1px solid #ccc;\n" " border-left: 1px solid #ccc;\n" " border-right: 1px solid #ccc;\n" " }\n" " table.meter tfoot td {\n" " border-left: 1px solid #ccc;\n" " border-right: 1px solid #ccc;\n" " border-top: 1px solid #ccc;\n" " }\n" " table.meter th {\n" " border-right: 1px solid #ccc;\n" " }\n" "}\n" ; lprint-1.3.1/static-resources/lprint-de-strings.h000066400000000000000000000237301456151556700221050ustar00rootroot00000000000000/* static-resources/lprint-de.strings */ static const char * const lprint_de_strings = "\"New Custom Size\" = \"Neue benutzerdefinierte Größe\";\n" "\"media.na_index-3x5_3x5in\" = \"3 x 5 Label\";\n" "\"media.na_index-4x6_4x6in\" = \"4 x 6 Label\";\n" "\"media.oe_1.25x0.25-label_1.25x0.25in\" = \"1-1/4 x 1/4 Etikett\";\n" "\"media.oe_1.25x2.25-label_1.25x2.25in\" = \"1-1/4 x 2-1/4 Etikett\";\n" "\"media.oe_1.5x0.25-label_1.5x0.25in\" = \"1-1/2 x 1/4 Label\";\n" "\"media.oe_1.5x0.5-label_1.5x0.5in\" = \"1-1/2 x 1/2 Label\";\n" "\"media.oe_1.5x1-label_1.5x1in\" = \"1-1/2 x 1 Etikett\";\n" "\"media.oe_1.5x2-label_1.5x2in\" = \"1-1/2 x 2 Label\";\n" "\"media.oe_2-part-internet-postage-label_2.25x7.5in\" = \"2-1/4 x 7-1/2 2-Teil Internet-Postlabel\";\n" "\"media.oe_2-up-address-label_2.25x3.5in\" = \"2-1/4 x 3-1/2 2-Up Adresse Label\";\n" "\"media.oe_2-up-file-folder-label_1.125x3.4375in\" = \"1-1/8 x 4-7/16 2-up File Folder Label\";\n" "\"media.oe_2.25x0.5-label_2.25x0.5in\" = \"2-1/4 x 1/2 Label\";\n" "\"media.oe_2.25x0.5-label_2.25xin\" = \"2-1/4 x 1/2 Label\";\n" "\"media.oe_2.25x1.25-label_2.25x1.25in\" = \"2-1/4 x 1-1/4 Etikett\";\n" "\"media.oe_2.25x1.25-label_2.25xin\" = \"2-1/4 x 1-1/4 Etikett\";\n" "\"media.oe_2.25x4-label_2.25x4in\" = \"2-1/4 x 4 Label\";\n" "\"media.oe_2.25x5.5-label_2.25x5.5in\" = \"2-1/4 x 5-1/2 Label\";\n" "\"media.oe_2.38x5.5-label_2.38x5.5in\" = \"2-3/8 x 5-1/2 Label\";\n" "\"media.oe_2.5x1-label_2.5x1in\" = \"2-1/2 x 1 Etikett\";\n" "\"media.oe_2.5x2-label_2.5x2in\" = \"2-1/2 x 2 Label\";\n" "\"media.oe_2.75x1.25-label_2.75x1.25in\" = \"2-3/4 x 1-1/4 Etikett\";\n" "\"media.oe_2.9x1-label_2.9x1in\" = \"2.9 x 1 Label\";\n" "\"media.oe_2x0.37-label_2x0.37in\" = \"2 x 0.37 Label\";\n" "\"media.oe_2x0.5-label_2x0.5in\" = \"2 x 1/2 Label\";\n" "\"media.oe_2x1-label_2x1in\" = \"2 x 1 Etikett\";\n" "\"media.oe_2x1.25-label_2x1.25in\" = \"2 x 1-1/4 Etikett\";\n" "\"media.oe_2x2-label_2x2in\" = \"2 x 2 Label\";\n" "\"media.oe_2x3-label_2x3in\" = \"2 x 3 Label\";\n" "\"media.oe_2x4-label_2x4in\" = \"2 x 4 Label\";\n" "\"media.oe_2x5.5-label_2x5.5in\" = \"2 x 5-1/2 Label\";\n" "\"media.oe_3-part-postage-label_2.25x7in\" = \"2-1/4 x 7 3-teiliges Postlabel\";\n" "\"media.oe_3.25x2-label_3.25x2in\" = \"3-1/4 x 2 Label\";\n" "\"media.oe_3.25x5-label_3.25x5in\" = \"3-1/4 x 5 Label\";\n" "\"media.oe_3.25x5.5-label_3.25x5.5in\" = \"3-1/4 x 5-1/2 Label\";\n" "\"media.oe_3.25x5.83-label_3.25x5.83in\" = \"3-1/4 x 5-13/16 Bezeichnung\";\n" "\"media.oe_3.25x7.83-label_3.25x7.83in\" = \"3-1/4 x 7-13/16 Bezeichnung\";\n" "\"media.oe_3.5x1-label_3.5x1in\" = \"3-1/2 x 1 Etikett\";\n" "\"media.oe_30859-paint-can-label_2.25x3.125in\" = \"2-1/4 x 3-1/8 Paint Can Label\";\n" "\"media.oe_3x1-label_3x1in\" = \"3 x 1 Etikett\";\n" "\"media.oe_3x1.25-label_3x1.25in\" = \"3 x 1-1/4 Etikett\";\n" "\"media.oe_3x2-label_3x2in\" = \"3 x 2 Label\";\n" "\"media.oe_3x3-label_3x3in\" = \"3 x 3 Label\";\n" "\"media.oe_3x5-label_3x5in\" = \"3 x 5 Label\";\n" "\"media.oe_4x1-label_4x1in\" = \"4 x 1 Etikett\";\n" "\"media.oe_4x13-label_4x13in\" = \"4 x 13 Label\";\n" "\"media.oe_4x2-label_4x2in\" = \"4 x 2 Label\";\n" "\"media.oe_4x3-label_4x3in\" = \"4 x 3 Label\";\n" "\"media.oe_4x4-label_4x4in\" = \"4 x 4 Label\";\n" "\"media.oe_4x5-label_4x5in\" = \"4 x 5 Label\";\n" "\"media.oe_4x6-label_4x6in\" = \"4 x 6 Label\";\n" "\"media.oe_4x6.5-label_4x6.5in\" = \"4 x 6-1/2 Label\";\n" "\"media.oe_4x8-label_4x8in\" = \"4 x 8 Label\";\n" "\"media.oe_6x1-label_6x1in\" = \"6 x 1 Label\";\n" "\"media.oe_6x13-label_6x13in\" = \"6 x 13 Label\";\n" "\"media.oe_6x2-label_6x2in\" = \"6 x 2 Label\";\n" "\"media.oe_6x3-label_6x3in\" = \"6 x 3 Label\";\n" "\"media.oe_6x4-label_6x4in\" = \"6 x 4 Label\";\n" "\"media.oe_6x5-label_6x5in\" = \"6 x 5 Label\";\n" "\"media.oe_6x6-label_6x6in\" = \"6 x 6 Label\";\n" "\"media.oe_6x6.5-label_6x6.5in\" = \"6 x 6-1/2 Label\";\n" "\"media.oe_8x1-label_8x1in\" = \"8 x 1 Label\";\n" "\"media.oe_8x13-label_8x13in\" = \"8 x 13 Label\";\n" "\"media.oe_8x2-label_8x2in\" = \"8 x 2 Label\";\n" "\"media.oe_8x3-label_8x3in\" = \"8 x 3 Label\";\n" "\"media.oe_8x4-label_8x4in\" = \"8 x 4 Label\";\n" "\"media.oe_8x5-label_8x5in\" = \"8 x 5 Label\";\n" "\"media.oe_8x6-label_8x6in\" = \"8 x 6 Label\";\n" "\"media.oe_8x6.5-label_8x6.5in\" = \"8 x 6-1/2 Label\";\n" "\"media.oe_address-label_1.125x3.5in\" = \"1-1/8 x 3-1/2 Adresse Label\";\n" "\"media.oe_barcode-label_0.75x2.5in\" = \"3/4 x 2-1/2 Barcode Label\";\n" "\"media.oe_book-spine-label_1x1.5in\" = \"1 x 1-1/2 Book Spine Label\";\n" "\"media.oe_continuous-label_2.125x3600in\" = \"2-1/8 Kontinuierliches Etikett\";\n" "\"media.oe_dk1201-address_1.1x3.5in\" = \"DK1201 28 x 89mm Adresse Label\";\n" "\"media.oe_dk1202-shipping_2.4x3.9in\" = \"DK1202 61 x 99mm Versandlabel\";\n" "\"media.oe_dk1203-file-folder_0.66x3.4in\" = \"DK1203 17 x 86mm File Folder Label\";\n" "\"media.oe_dk1204-multi-purpose_0.66x2.1in\" = \"DK1204 17 x 53mm Mehrzweck Bezeichnung\";\n" "\"media.oe_dk1207-cd-dvd_2.2x2.2in\" = \"DK1207 56mm CD/DVD Bezeichnung\";\n" "\"media.oe_dk1208-large-address_1.4x3.5in\" = \"DK1208 36 x 89mm Large Address Label\";\n" "\"media.oe_dk1209-small-address_1.1x2.4in\" = \"DK1209 28 x 61mm Small Address Label\";\n" "\"media.oe_dk1219-round_0.47x0.47in\" = \"DK1219 12mm rundes Etikett\";\n" "\"media.oe_dk1240-large-multi-purpose_1.9x4in\" = \"DK1240 48 x 102mm großes Mehrzwecklabel\";\n" "\"media.oe_file-folder-label_0.5625x3.4375in\" = \"9/16 x 3-7/16 File Folder Label\";\n" "\"media.oe_hanging-file-tab-insert_0.5625x2in\" = \"9/16 x 2 hängende Datei Tab Einfügen Etikett\";\n" "\"media.oe_internet-postage-confirmation-label_2.3125x10.5in\" = \"2-5/16 x 10-1/2 Internet Postage Confirmation Label\";\n" "\"media.oe_internet-postage-label_1.25x1.625in\" = \"1-1/4 x 1-5/8 Internet-Postlabel\";\n" "\"media.oe_internet-postage-label_2.3125x7in\" = \"2-3/8 x 7 Internet Posting Label\";\n" "\"media.oe_lg-address-label_1.4x3.5in\" = \"1-4/10 x 3-1/2 Großes Adressat\";\n" "\"media.oe_lg-multipurpose-label_2.125x.75in\" = \"2-1/8 x 3/4 Großes Mehrzwecklabel\";\n" "\"media.oe_library-barcode-label_0.5x1.875in\" = \"1/2 x 1-7/8 Bibliothek Barcode Label\";\n" "\"media.oe_md-appointment-card_2x3.5in\" = \"2 x 3-1/2 Mittlere Karte\";\n" "\"media.oe_md-multipurpose-label_2.25x1.25in\" = \"2-1/4 x 1/1/4 Medium Multipurpose Label\";\n" "\"media.oe_media-label_2.25x2.25in\" = \"2-1/4 x 2-1/4 Medien Bezeichnung\";\n" "\"media.oe_medium-1in-tape_0.5x1in\" = \"1/2 x 1 Klebeband\";\n" "\"media.oe_medium-2in-tape_0.5x2in\" = \"1/2 x 2 Tape\";\n" "\"media.oe_medium-3in-tape_0.5x3in\" = \"1/2 x 3 Tape\";\n" "\"media.oe_multipurpose-label_2x2.3125in\" = \"2 x 2-5/16 Mehr Infos\";\n" "\"media.oe_name-badge-label_2.25x4in\" = \"2-1/4 x 4 Name Badge Label\";\n" "\"media.oe_price-tag-label_0.9375x0.875in\" = \"15/16 x 7/8 Preis Tag Etikett\";\n" "\"media.oe_return-address-label_0.75x2in\" = \"3/4 x 2 Rückgabe Adresse Label\";\n" "\"media.oe_shipping-label_2.125x4in\" = \"2-1/8 x 4 Versand Etikett\";\n" "\"media.oe_shipping-label_2.3125x4in\" = \"2-5/16 x 4 Versand Etikett\";\n" "\"media.oe_sm-multipurpose-label_1x2.125in\" = \"1 x 2-1/8 Small Multipurpose Label\";\n" "\"media.oe_square-multipurpose-label_1x1in\" = \"1 Quadratisches Mehrzwecklabel\";\n" "\"media.oe_thin-1in-tape_0.25x1in\" = \"1/4 x 1 Klebeband\";\n" "\"media.oe_thin-2in-tape_0.25x2in\" = \"1/4 x 2 Klebeband\";\n" "\"media.oe_thin-3in-tape_0.25x3in\" = \"1/4 x 3 Klebeband\";\n" "\"media.oe_thin-multipurpose-label_0.375x2.8125in\" = \"3-8 x 2-13/16 Thin Multipurpose Label\";\n" "\"media.oe_thinner-1in-tape_0.375x1in\" = \"3/8 x 1 Klebeband\";\n" "\"media.oe_thinner-2in-tape_0.375x2in\" = \"3/8 x 2 Klebeband\";\n" "\"media.oe_thinner-3in-tape_0.375x3in\" = \"3/8 x 3 Tape\";\n" "\"media.oe_video-spine-label_0.75x5.875in\" = \"3/4 x 5-7/8 Video Spine Label\";\n" "\"media.oe_video-top-label_1.8x3.1in\" = \"1.8 x 3.1 Video Top Label\";\n" "\"media.oe_wide-1in-tape_1x1in\" = \"1 x 1 Klebeband\";\n" "\"media.oe_wide-2in-tape_1x2in\" = \"1 x 2 Tape\";\n" "\"media.oe_wide-3in-tape_1x3in\" = \"1 x 3 Tape\";\n" "\"media.oe_wider-1in-tape_0.75x1in\" = \"3/4 x 1 Klebeband\";\n" "\"media.oe_wider-2in-tape_0.75x2in\" = \"3/4 x 2 Klebeband\";\n" "\"media.oe_wider-3in-tape_0.75x3in\" = \"3/4 x 3 Klebeband\";\n" "\"media.om_35mm-slide_9x37mm\" = \"35mm Slide Label\";\n" "\"media.om_4-part-label_48x96mm\" = \"48 x 96mm 4-teiliges Etikett\";\n" "\"media.om_8mm-spine_9x66mm\" = \"8mm Spin Label\";\n" "\"media.om_address-large_35x83mm\" = \"35 x 83mm Large Address Label\";\n" "\"media.om_address-small_24x83mm\" = \"24 x 83mm Small Address Label\";\n" "\"media.om_cut-hanging-13_32x78mm\" = \"32 x 78mm 1/3 Schnitt hängende Datei-Ordner-Label\";\n" "\"media.om_cut-hanging-15_32x40mm\" = \"32 x 40mm 1/5 Schnitt hängend File Folder Label\";\n" "\"media.om_diskette_48x64mm\" = \"48 x 64mm Diskette\";\n" "\"media.om_euro-file-folder_39x49mm\" = \"39 x 49mm Euro File Folder Label\";\n" "\"media.om_euro-folder-narrow_38x186mm\" = \"38 x 186mm Euro Narrow File Folder Label\";\n" "\"media.om_euro-folder-wide_48x186mm\" = \"48 x 186mm Euro Wide File Folder Label\";\n" "\"media.om_euro-name-badge-large_48x79mm\" = \"48 x 79mm Euro Groß Name Badge Label\";\n" "\"media.om_euro-name-badge_38x67mm\" = \"38 x 67mm Euro Name Badge Label\";\n" "\"media.om_file-folder_13x81mm\" = \"13 x 81mm File Folder Label\";\n" "\"media.om_jewelry_27x48mm\" = \"27 x 48mm Schmucklabel\";\n" "\"media.om_media-badge_48x64mm\" = \"48 x 64mm Medien Abzeichen\";\n" "\"media.om_multi-purpose_24x44mm\" = \"24 x 44mm Mehrzweck Bezeichnung\";\n" "\"media.om_retail-label_32x37mm\" = \"32 x 37mm Einzelhandel\";\n" "\"media.om_return_16x43mm\" = \"16 x 43mm Zurück zur Übersicht\";\n" "\"media.om_round_22x24mm\" = \"22mm rundes Etikett\";\n" "\"media.om_shipping_48x96mm\" = \"48 x 96mm Versandetikett\";\n" "\"media.om_top-coated-paper_48x140mm\" = \"48 x 140mm Top beschichtetes Papier\";\n" "\"media.om_vhs-face_45x72mm\" = \"45 x 72mm VHS Face Label\";\n" "\"media.om_vhs-spine_18x141mm\" = \"18 x 141mm VHS Spin Label\";\n" "\"media.om_zip-disk_48x55mm\" = \"48 x 55mm Zip Disk Label\";\n" ; lprint-1.3.1/static-resources/lprint-de.strings000066400000000000000000000213771456151556700216650ustar00rootroot00000000000000"New Custom Size" = "Neue benutzerdefinierte Größe"; "media.na_index-3x5_3x5in" = "3 x 5 Label"; "media.na_index-4x6_4x6in" = "4 x 6 Label"; "media.oe_1.25x0.25-label_1.25x0.25in" = "1-1/4 x 1/4 Etikett"; "media.oe_1.25x2.25-label_1.25x2.25in" = "1-1/4 x 2-1/4 Etikett"; "media.oe_1.5x0.25-label_1.5x0.25in" = "1-1/2 x 1/4 Label"; "media.oe_1.5x0.5-label_1.5x0.5in" = "1-1/2 x 1/2 Label"; "media.oe_1.5x1-label_1.5x1in" = "1-1/2 x 1 Etikett"; "media.oe_1.5x2-label_1.5x2in" = "1-1/2 x 2 Label"; "media.oe_2-part-internet-postage-label_2.25x7.5in" = "2-1/4 x 7-1/2 2-Teil Internet-Postlabel"; "media.oe_2-up-address-label_2.25x3.5in" = "2-1/4 x 3-1/2 2-Up Adresse Label"; "media.oe_2-up-file-folder-label_1.125x3.4375in" = "1-1/8 x 4-7/16 2-up File Folder Label"; "media.oe_2.25x0.5-label_2.25x0.5in" = "2-1/4 x 1/2 Label"; "media.oe_2.25x0.5-label_2.25xin" = "2-1/4 x 1/2 Label"; "media.oe_2.25x1.25-label_2.25x1.25in" = "2-1/4 x 1-1/4 Etikett"; "media.oe_2.25x1.25-label_2.25xin" = "2-1/4 x 1-1/4 Etikett"; "media.oe_2.25x4-label_2.25x4in" = "2-1/4 x 4 Label"; "media.oe_2.25x5.5-label_2.25x5.5in" = "2-1/4 x 5-1/2 Label"; "media.oe_2.38x5.5-label_2.38x5.5in" = "2-3/8 x 5-1/2 Label"; "media.oe_2.5x1-label_2.5x1in" = "2-1/2 x 1 Etikett"; "media.oe_2.5x2-label_2.5x2in" = "2-1/2 x 2 Label"; "media.oe_2.75x1.25-label_2.75x1.25in" = "2-3/4 x 1-1/4 Etikett"; "media.oe_2.9x1-label_2.9x1in" = "2.9 x 1 Label"; "media.oe_2x0.37-label_2x0.37in" = "2 x 0.37 Label"; "media.oe_2x0.5-label_2x0.5in" = "2 x 1/2 Label"; "media.oe_2x1-label_2x1in" = "2 x 1 Etikett"; "media.oe_2x1.25-label_2x1.25in" = "2 x 1-1/4 Etikett"; "media.oe_2x2-label_2x2in" = "2 x 2 Label"; "media.oe_2x3-label_2x3in" = "2 x 3 Label"; "media.oe_2x4-label_2x4in" = "2 x 4 Label"; "media.oe_2x5.5-label_2x5.5in" = "2 x 5-1/2 Label"; "media.oe_3-part-postage-label_2.25x7in" = "2-1/4 x 7 3-teiliges Postlabel"; "media.oe_3.25x2-label_3.25x2in" = "3-1/4 x 2 Label"; "media.oe_3.25x5-label_3.25x5in" = "3-1/4 x 5 Label"; "media.oe_3.25x5.5-label_3.25x5.5in" = "3-1/4 x 5-1/2 Label"; "media.oe_3.25x5.83-label_3.25x5.83in" = "3-1/4 x 5-13/16 Bezeichnung"; "media.oe_3.25x7.83-label_3.25x7.83in" = "3-1/4 x 7-13/16 Bezeichnung"; "media.oe_3.5x1-label_3.5x1in" = "3-1/2 x 1 Etikett"; "media.oe_30859-paint-can-label_2.25x3.125in" = "2-1/4 x 3-1/8 Paint Can Label"; "media.oe_3x1-label_3x1in" = "3 x 1 Etikett"; "media.oe_3x1.25-label_3x1.25in" = "3 x 1-1/4 Etikett"; "media.oe_3x2-label_3x2in" = "3 x 2 Label"; "media.oe_3x3-label_3x3in" = "3 x 3 Label"; "media.oe_3x5-label_3x5in" = "3 x 5 Label"; "media.oe_4x1-label_4x1in" = "4 x 1 Etikett"; "media.oe_4x13-label_4x13in" = "4 x 13 Label"; "media.oe_4x2-label_4x2in" = "4 x 2 Label"; "media.oe_4x3-label_4x3in" = "4 x 3 Label"; "media.oe_4x4-label_4x4in" = "4 x 4 Label"; "media.oe_4x5-label_4x5in" = "4 x 5 Label"; "media.oe_4x6-label_4x6in" = "4 x 6 Label"; "media.oe_4x6.5-label_4x6.5in" = "4 x 6-1/2 Label"; "media.oe_4x8-label_4x8in" = "4 x 8 Label"; "media.oe_6x1-label_6x1in" = "6 x 1 Label"; "media.oe_6x13-label_6x13in" = "6 x 13 Label"; "media.oe_6x2-label_6x2in" = "6 x 2 Label"; "media.oe_6x3-label_6x3in" = "6 x 3 Label"; "media.oe_6x4-label_6x4in" = "6 x 4 Label"; "media.oe_6x5-label_6x5in" = "6 x 5 Label"; "media.oe_6x6-label_6x6in" = "6 x 6 Label"; "media.oe_6x6.5-label_6x6.5in" = "6 x 6-1/2 Label"; "media.oe_8x1-label_8x1in" = "8 x 1 Label"; "media.oe_8x13-label_8x13in" = "8 x 13 Label"; "media.oe_8x2-label_8x2in" = "8 x 2 Label"; "media.oe_8x3-label_8x3in" = "8 x 3 Label"; "media.oe_8x4-label_8x4in" = "8 x 4 Label"; "media.oe_8x5-label_8x5in" = "8 x 5 Label"; "media.oe_8x6-label_8x6in" = "8 x 6 Label"; "media.oe_8x6.5-label_8x6.5in" = "8 x 6-1/2 Label"; "media.oe_address-label_1.125x3.5in" = "1-1/8 x 3-1/2 Adresse Label"; "media.oe_barcode-label_0.75x2.5in" = "3/4 x 2-1/2 Barcode Label"; "media.oe_book-spine-label_1x1.5in" = "1 x 1-1/2 Book Spine Label"; "media.oe_continuous-label_2.125x3600in" = "2-1/8 Kontinuierliches Etikett"; "media.oe_dk1201-address_1.1x3.5in" = "DK1201 28 x 89mm Adresse Label"; "media.oe_dk1202-shipping_2.4x3.9in" = "DK1202 61 x 99mm Versandlabel"; "media.oe_dk1203-file-folder_0.66x3.4in" = "DK1203 17 x 86mm File Folder Label"; "media.oe_dk1204-multi-purpose_0.66x2.1in" = "DK1204 17 x 53mm Mehrzweck Bezeichnung"; "media.oe_dk1207-cd-dvd_2.2x2.2in" = "DK1207 56mm CD/DVD Bezeichnung"; "media.oe_dk1208-large-address_1.4x3.5in" = "DK1208 36 x 89mm Large Address Label"; "media.oe_dk1209-small-address_1.1x2.4in" = "DK1209 28 x 61mm Small Address Label"; "media.oe_dk1219-round_0.47x0.47in" = "DK1219 12mm rundes Etikett"; "media.oe_dk1240-large-multi-purpose_1.9x4in" = "DK1240 48 x 102mm großes Mehrzwecklabel"; "media.oe_file-folder-label_0.5625x3.4375in" = "9/16 x 3-7/16 File Folder Label"; "media.oe_hanging-file-tab-insert_0.5625x2in" = "9/16 x 2 hängende Datei Tab Einfügen Etikett"; "media.oe_internet-postage-confirmation-label_2.3125x10.5in" = "2-5/16 x 10-1/2 Internet Postage Confirmation Label"; "media.oe_internet-postage-label_1.25x1.625in" = "1-1/4 x 1-5/8 Internet-Postlabel"; "media.oe_internet-postage-label_2.3125x7in" = "2-3/8 x 7 Internet Posting Label"; "media.oe_lg-address-label_1.4x3.5in" = "1-4/10 x 3-1/2 Großes Adressat"; "media.oe_lg-multipurpose-label_2.125x.75in" = "2-1/8 x 3/4 Großes Mehrzwecklabel"; "media.oe_library-barcode-label_0.5x1.875in" = "1/2 x 1-7/8 Bibliothek Barcode Label"; "media.oe_md-appointment-card_2x3.5in" = "2 x 3-1/2 Mittlere Karte"; "media.oe_md-multipurpose-label_2.25x1.25in" = "2-1/4 x 1/1/4 Medium Multipurpose Label"; "media.oe_media-label_2.25x2.25in" = "2-1/4 x 2-1/4 Medien Bezeichnung"; "media.oe_medium-1in-tape_0.5x1in" = "1/2 x 1 Klebeband"; "media.oe_medium-2in-tape_0.5x2in" = "1/2 x 2 Tape"; "media.oe_medium-3in-tape_0.5x3in" = "1/2 x 3 Tape"; "media.oe_multipurpose-label_2x2.3125in" = "2 x 2-5/16 Mehr Infos"; "media.oe_name-badge-label_2.25x4in" = "2-1/4 x 4 Name Badge Label"; "media.oe_price-tag-label_0.9375x0.875in" = "15/16 x 7/8 Preis Tag Etikett"; "media.oe_return-address-label_0.75x2in" = "3/4 x 2 Rückgabe Adresse Label"; "media.oe_shipping-label_2.125x4in" = "2-1/8 x 4 Versand Etikett"; "media.oe_shipping-label_2.3125x4in" = "2-5/16 x 4 Versand Etikett"; "media.oe_sm-multipurpose-label_1x2.125in" = "1 x 2-1/8 Small Multipurpose Label"; "media.oe_square-multipurpose-label_1x1in" = "1 Quadratisches Mehrzwecklabel"; "media.oe_thin-1in-tape_0.25x1in" = "1/4 x 1 Klebeband"; "media.oe_thin-2in-tape_0.25x2in" = "1/4 x 2 Klebeband"; "media.oe_thin-3in-tape_0.25x3in" = "1/4 x 3 Klebeband"; "media.oe_thin-multipurpose-label_0.375x2.8125in" = "3-8 x 2-13/16 Thin Multipurpose Label"; "media.oe_thinner-1in-tape_0.375x1in" = "3/8 x 1 Klebeband"; "media.oe_thinner-2in-tape_0.375x2in" = "3/8 x 2 Klebeband"; "media.oe_thinner-3in-tape_0.375x3in" = "3/8 x 3 Tape"; "media.oe_video-spine-label_0.75x5.875in" = "3/4 x 5-7/8 Video Spine Label"; "media.oe_video-top-label_1.8x3.1in" = "1.8 x 3.1 Video Top Label"; "media.oe_wide-1in-tape_1x1in" = "1 x 1 Klebeband"; "media.oe_wide-2in-tape_1x2in" = "1 x 2 Tape"; "media.oe_wide-3in-tape_1x3in" = "1 x 3 Tape"; "media.oe_wider-1in-tape_0.75x1in" = "3/4 x 1 Klebeband"; "media.oe_wider-2in-tape_0.75x2in" = "3/4 x 2 Klebeband"; "media.oe_wider-3in-tape_0.75x3in" = "3/4 x 3 Klebeband"; "media.om_35mm-slide_9x37mm" = "35mm Slide Label"; "media.om_4-part-label_48x96mm" = "48 x 96mm 4-teiliges Etikett"; "media.om_8mm-spine_9x66mm" = "8mm Spin Label"; "media.om_address-large_35x83mm" = "35 x 83mm Large Address Label"; "media.om_address-small_24x83mm" = "24 x 83mm Small Address Label"; "media.om_cut-hanging-13_32x78mm" = "32 x 78mm 1/3 Schnitt hängende Datei-Ordner-Label"; "media.om_cut-hanging-15_32x40mm" = "32 x 40mm 1/5 Schnitt hängend File Folder Label"; "media.om_diskette_48x64mm" = "48 x 64mm Diskette"; "media.om_euro-file-folder_39x49mm" = "39 x 49mm Euro File Folder Label"; "media.om_euro-folder-narrow_38x186mm" = "38 x 186mm Euro Narrow File Folder Label"; "media.om_euro-folder-wide_48x186mm" = "48 x 186mm Euro Wide File Folder Label"; "media.om_euro-name-badge-large_48x79mm" = "48 x 79mm Euro Groß Name Badge Label"; "media.om_euro-name-badge_38x67mm" = "38 x 67mm Euro Name Badge Label"; "media.om_file-folder_13x81mm" = "13 x 81mm File Folder Label"; "media.om_jewelry_27x48mm" = "27 x 48mm Schmucklabel"; "media.om_media-badge_48x64mm" = "48 x 64mm Medien Abzeichen"; "media.om_multi-purpose_24x44mm" = "24 x 44mm Mehrzweck Bezeichnung"; "media.om_retail-label_32x37mm" = "32 x 37mm Einzelhandel"; "media.om_return_16x43mm" = "16 x 43mm Zurück zur Übersicht"; "media.om_round_22x24mm" = "22mm rundes Etikett"; "media.om_shipping_48x96mm" = "48 x 96mm Versandetikett"; "media.om_top-coated-paper_48x140mm" = "48 x 140mm Top beschichtetes Papier"; "media.om_vhs-face_45x72mm" = "45 x 72mm VHS Face Label"; "media.om_vhs-spine_18x141mm" = "18 x 141mm VHS Spin Label"; "media.om_zip-disk_48x55mm" = "48 x 55mm Zip Disk Label"; lprint-1.3.1/static-resources/lprint-en-strings.h000066400000000000000000000240341456151556700221150ustar00rootroot00000000000000/* static-resources/lprint-en.strings */ static const char * const lprint_en_strings = "\"media.na_index-3x5_3x5in\" = \"3 x 5ʺ Label\";\n" "\"media.na_index-4x6_4x6in\" = \"4 x 6ʺ Label\";\n" "\"media.oe_1.25x0.25-label_1.25x0.25in\" = \"1-1/4 x 1/4ʺ Label\";\n" "\"media.oe_1.25x2.25-label_1.25x2.25in\" = \"1-1/4 x 2-1/4ʺ Label\";\n" "\"media.oe_1.5x0.25-label_1.5x0.25in\" = \"1-1/2 x 1/4ʺ Label\";\n" "\"media.oe_1.5x0.5-label_1.5x0.5in\" = \"1-1/2 x 1/2ʺ Label\";\n" "\"media.oe_1.5x1-label_1.5x1in\" = \"1-1/2 x 1ʺ Label\";\n" "\"media.oe_1.5x2-label_1.5x2in\" = \"1-1/2 x 2ʺ Label\";\n" "\"media.oe_2-part-internet-postage-label_2.25x7.5in\" = \"2-1/4 x 7-1/2ʺ 2-Part Internet Postage Label\";\n" "\"media.oe_2-up-address-label_2.25x3.5in\" = \"2-1/4 x 3-1/2ʺ 2-Up Address Label\";\n" "\"media.oe_2-up-file-folder-label_1.125x3.4375in\" = \"1-1/8 x 4-7/16ʺ 2-up File Folder Label\";\n" "\"media.oe_2.25x0.5-label_2.25x0.5in\" = \"2-1/4 x 1/2ʺ Label\";\n" "\"media.oe_2.25x0.5-label_2.25xin\" = \"2-1/4 x 1/2ʺ Label\";\n" "\"media.oe_2.25x1.25-label_2.25x1.25in\" = \"2-1/4 x 1-1/4ʺ Label\";\n" "\"media.oe_2.25x1.25-label_2.25xin\" = \"2-1/4 x 1-1/4ʺ Label\";\n" "\"media.oe_2.25x4-label_2.25x4in\" = \"2-1/4 x 4ʺ Label\";\n" "\"media.oe_2.25x5.5-label_2.25x5.5in\" = \"2-1/4 x 5-1/2ʺ Label\";\n" "\"media.oe_2.38x5.5-label_2.38x5.5in\" = \"2-3/8 x 5-1/2ʺ Label\";\n" "\"media.oe_2.5x1-label_2.5x1in\" = \"2-1/2 x 1ʺ Label\";\n" "\"media.oe_2.5x2-label_2.5x2in\" = \"2-1/2 x 2ʺ Label\";\n" "\"media.oe_2.75x1.25-label_2.75x1.25in\" = \"2-3/4 x 1-1/4ʺ Label\";\n" "\"media.oe_2.9x1-label_2.9x1in\" = \"2.9 x 1ʺ Label\";\n" "\"media.oe_2x0.37-label_2x0.37in\" = \"2 x 0.37ʺ Label\";\n" "\"media.oe_2x0.5-label_2x0.5in\" = \"2 x 1/2ʺ Label\";\n" "\"media.oe_2x1-label_2x1in\" = \"2 x 1ʺ Label\";\n" "\"media.oe_2x1.25-label_2x1.25in\" = \"2 x 1-1/4ʺ Label\";\n" "\"media.oe_2x2-label_2x2in\" = \"2 x 2ʺ Label\";\n" "\"media.oe_2x3-label_2x3in\" = \"2 x 3ʺ Label\";\n" "\"media.oe_2x4-label_2x4in\" = \"2 x 4ʺ Label\";\n" "\"media.oe_2x5.5-label_2x5.5in\" = \"2 x 5-1/2ʺ Label\";\n" "\"media.oe_3-part-postage-label_2.25x7in\" = \"2-1/4 x 7ʺ 3-Part Postage Label\";\n" "\"media.oe_3.25x2-label_3.25x2in\" = \"3-1/4 x 2ʺ Label\";\n" "\"media.oe_3.25x5-label_3.25x5in\" = \"3-1/4 x 5ʺ Label\";\n" "\"media.oe_3.25x5.5-label_3.25x5.5in\" = \"3-1/4 x 5-1/2ʺ Label\";\n" "\"media.oe_3.25x5.83-label_3.25x5.83in\" = \"3-1/4 x 5-13/16ʺ Label\";\n" "\"media.oe_3.25x7.83-label_3.25x7.83in\" = \"3-1/4 x 7-13/16ʺ Label\";\n" "\"media.oe_3.5x1-label_3.5x1in\" = \"3-1/2 x 1ʺ Label\";\n" "\"media.oe_30859-paint-can-label_2.25x3.125in\" = \"2-1/4 x 3-1/8ʺ Paint Can Label\";\n" "\"media.oe_3x1-label_3x1in\" = \"3 x 1ʺ Label\";\n" "\"media.oe_3x1.25-label_3x1.25in\" = \"3 x 1-1/4ʺ Label\";\n" "\"media.oe_3x2-label_3x2in\" = \"3 x 2ʺ Label\";\n" "\"media.oe_3x3-label_3x3in\" = \"3 x 3ʺ Label\";\n" "\"media.oe_3x5-label_3x5in\" = \"3 x 5ʺ Label\";\n" "\"media.oe_4x1-label_4x1in\" = \"4 x 1ʺ Label\";\n" "\"media.oe_4x13-label_4x13in\" = \"4 x 13ʺ Label\";\n" "\"media.oe_4x2-label_4x2in\" = \"4 x 2ʺ Label\";\n" "\"media.oe_4x3-label_4x3in\" = \"4 x 3ʺ Label\";\n" "\"media.oe_4x4-label_4x4in\" = \"4 x 4ʺ Label\";\n" "\"media.oe_4x5-label_4x5in\" = \"4 x 5ʺ Label\";\n" "\"media.oe_4x6-label_4x6in\" = \"4 x 6ʺ Label\";\n" "\"media.oe_4x6.5-label_4x6.5in\" = \"4 x 6-1/2ʺ Label\";\n" "\"media.oe_4x8-label_4x8in\" = \"4 x 8ʺ Label\";\n" "\"media.oe_6x1-label_6x1in\" = \"6 x 1ʺ Label\";\n" "\"media.oe_6x13-label_6x13in\" = \"6 x 13ʺ Label\";\n" "\"media.oe_6x2-label_6x2in\" = \"6 x 2ʺ Label\";\n" "\"media.oe_6x3-label_6x3in\" = \"6 x 3ʺ Label\";\n" "\"media.oe_6x4-label_6x4in\" = \"6 x 4ʺ Label\";\n" "\"media.oe_6x5-label_6x5in\" = \"6 x 5ʺ Label\";\n" "\"media.oe_6x6-label_6x6in\" = \"6 x 6ʺ Label\";\n" "\"media.oe_6x6.5-label_6x6.5in\" = \"6 x 6-1/2ʺ Label\";\n" "\"media.oe_8x1-label_8x1in\" = \"8 x 1ʺ Label\";\n" "\"media.oe_8x13-label_8x13in\" = \"8 x 13ʺ Label\";\n" "\"media.oe_8x2-label_8x2in\" = \"8 x 2ʺ Label\";\n" "\"media.oe_8x3-label_8x3in\" = \"8 x 3ʺ Label\";\n" "\"media.oe_8x4-label_8x4in\" = \"8 x 4ʺ Label\";\n" "\"media.oe_8x5-label_8x5in\" = \"8 x 5ʺ Label\";\n" "\"media.oe_8x6-label_8x6in\" = \"8 x 6ʺ Label\";\n" "\"media.oe_8x6.5-label_8x6.5in\" = \"8 x 6-1/2ʺ Label\";\n" "\"media.oe_address-label_1.125x3.5in\" = \"1-1/8 x 3-1/2ʺ Address Label\";\n" "\"media.oe_barcode-label_0.75x2.5in\" = \"3/4 x 2-1/2ʺ Barcode Label\";\n" "\"media.oe_book-spine-label_1x1.5in\" = \"1 x 1-1/2ʺ Book Spine Label\";\n" "\"media.oe_continuous-label_2.125x3600in\" = \"2-1/8ʺ Continuous Label\";\n" "\"media.oe_dk1201-address_1.1x3.5in\" = \"DK1201 28 x 89mm Address Label\";\n" "\"media.oe_dk1202-shipping_2.4x3.9in\" = \"DK1202 61 x 99mm Shipping Label\";\n" "\"media.oe_dk1203-file-folder_0.66x3.4in\" = \"DK1203 17 x 86mm File Folder Label\";\n" "\"media.oe_dk1204-multi-purpose_0.66x2.1in\" = \"DK1204 17 x 53mm Multipurpose Label\";\n" "\"media.oe_dk1207-cd-dvd_2.2x2.2in\" = \"DK1207 56mm CD/DVD Label\";\n" "\"media.oe_dk1208-large-address_1.4x3.5in\" = \"DK1208 36 x 89mm Large Address Label\";\n" "\"media.oe_dk1209-small-address_1.1x2.4in\" = \"DK1209 28 x 61mm Small Address Label\";\n" "\"media.oe_dk1219-round_0.47x0.47in\" = \"DK1219 12mm Round Label\";\n" "\"media.oe_dk1240-large-multi-purpose_1.9x4in\" = \"DK1240 48 x 102mm Large Multipurpose Label\";\n" "\"media.oe_file-folder-label_0.5625x3.4375in\" = \"9/16 x 3-7/16ʺ File Folder Label\";\n" "\"media.oe_hanging-file-tab-insert_0.5625x2in\" = \"9/16 x 2ʺ Hanging File Tab Insert Label\";\n" "\"media.oe_internet-postage-confirmation-label_2.3125x10.5in\" = \"2-5/16 x 10-1/2ʺ Internet Postage Confirmation Label\";\n" "\"media.oe_internet-postage-label_1.25x1.625in\" = \"1-1/4 x 1-5/8ʺ Internet Postage Label\";\n" "\"media.oe_internet-postage-label_2.3125x7in\" = \"2-3/8 x 7ʺ Internet Postage Label\";\n" "\"media.oe_lg-address-label_1.4x3.5in\" = \"1-4/10 x 3-1/2ʺ Large Address Label\";\n" "\"media.oe_lg-multipurpose-label_2.125x.75in\" = \"2-1/8 x 3/4ʺ Large Multipurpose Label\";\n" "\"media.oe_library-barcode-label_0.5x1.875in\" = \"1/2 x 1-7/8ʺ Library Barcode Label\";\n" "\"media.oe_md-appointment-card_2x3.5in\" = \"2 x 3-1/2ʺ Medium Appointment Card\";\n" "\"media.oe_md-multipurpose-label_2.25x1.25in\" = \"2-1/4 x 1/1/4ʺ Medium Multipurpose Label\";\n" "\"media.oe_media-label_2.25x2.25in\" = \"2-1/4 x 2-1/4ʺ Media Label\";\n" "\"media.oe_medium-1in-tape_0.5x1in\" = \"1/2 x 1ʺ Tape\";\n" "\"media.oe_medium-2in-tape_0.5x2in\" = \"1/2 x 2ʺ Tape\";\n" "\"media.oe_medium-3in-tape_0.5x3in\" = \"1/2 x 3ʺ Tape\";\n" "\"media.oe_multipurpose-label_2x2.3125in\" = \"2 x 2-5/16ʺ Multipurpose Label\";\n" "\"media.oe_name-badge-label_2.25x4in\" = \"2-1/4 x 4ʺ Name Badge Label\";\n" "\"media.oe_price-tag-label_0.9375x0.875in\" = \"15/16 x 7/8ʺ Price Tag Label\";\n" "\"media.oe_return-address-label_0.75x2in\" = \"3/4 x 2ʺ Return Address Label\";\n" "\"media.oe_shipping-label_2.125x4in\" = \"2-1/8 x 4ʺ Shipping Label\";\n" "\"media.oe_shipping-label_2.3125x4in\" = \"2-5/16 x 4ʺ Shipping Label\";\n" "\"media.oe_sm-multipurpose-label_1x2.125in\" = \"1 x 2-1/8ʺ Small Multipurpose Label\";\n" "\"media.oe_square-multipurpose-label_1x1in\" = \"1ʺ Square Multipurpose Label\";\n" "\"media.oe_thin-1in-tape_0.25x1in\" = \"1/4 x 1ʺ Tape\";\n" "\"media.oe_thin-2in-tape_0.25x2in\" = \"1/4 x 2ʺ Tape\";\n" "\"media.oe_thin-3in-tape_0.25x3in\" = \"1/4 x 3ʺ Tape\";\n" "\"media.oe_thin-multipurpose-label_0.375x2.8125in\" = \"3/8 x 2-13/16ʺ Thin Multipurpose Label\";\n" "\"media.oe_thinner-1in-tape_0.375x1in\" = \"3/8 x 1ʺ Tape\";\n" "\"media.oe_thinner-2in-tape_0.375x2in\" = \"3/8 x 2ʺ Tape\";\n" "\"media.oe_thinner-3in-tape_0.375x3in\" = \"3/8 x 3ʺ Tape\";\n" "\"media.oe_video-spine-label_0.75x5.875in\" = \"3/4 x 5-7/8ʺ Video Spine Label\";\n" "\"media.oe_video-top-label_1.8x3.1in\" = \"1.8 x 3.1ʺ Video Top Label\";\n" "\"media.oe_wide-1in-tape_1x1in\" = \"1 x 1ʺ Tape\";\n" "\"media.oe_wide-2in-tape_1x2in\" = \"1 x 2ʺ Tape\";\n" "\"media.oe_wide-3in-tape_1x3in\" = \"1 x 3ʺ Tape\";\n" "\"media.oe_wider-1in-tape_0.75x1in\" = \"3/4 x 1ʺ Tape\";\n" "\"media.oe_wider-2in-tape_0.75x2in\" = \"3/4 x 2ʺ Tape\";\n" "\"media.oe_wider-3in-tape_0.75x3in\" = \"3/4 x 3ʺ Tape\";\n" "\"media.om_35mm-slide_9x37mm\" = \"35mm Slide Label\";\n" "\"media.om_4-part-label_48x96mm\" = \"48 x 96mm 4-Part Label\";\n" "\"media.om_8mm-spine_9x66mm\" = \"8mm Spine Label\";\n" "\"media.om_address-large_35x83mm\" = \"35 x 83mm Large Address Label\";\n" "\"media.om_address-small_24x83mm\" = \"24 x 83mm Small Address Label\";\n" "\"media.om_cut-hanging-13_32x78mm\" = \"32 x 78mm 1/3 Cut Hanging File Folder Label\";\n" "\"media.om_cut-hanging-15_32x40mm\" = \"32 x 40mm 1/5 Cut Hanging File Folder Label\";\n" "\"media.om_diskette_48x64mm\" = \"48 x 64mm Diskette Label\";\n" "\"media.om_euro-file-folder_39x49mm\" = \"39 x 49mm Euro File Folder Label\";\n" "\"media.om_euro-folder-narrow_38x186mm\" = \"38 x 186mm Euro Narrow File Folder Label\";\n" "\"media.om_euro-folder-wide_48x186mm\" = \"48 x 186mm Euro Wide File Folder Label\";\n" "\"media.om_euro-name-badge-large_48x79mm\" = \"48 x 79mm Euro Large Name Badge Label\";\n" "\"media.om_euro-name-badge_38x67mm\" = \"38 x 67mm Euro Name Badge Label\";\n" "\"media.om_file-folder_13x81mm\" = \"13 x 81mm File Folder Label\";\n" "\"media.om_jewelry_27x48mm\" = \"27 x 48mm Jewelry Label\";\n" "\"media.om_media-badge_48x64mm\" = \"48 x 64mm Media Badge Label\";\n" "\"media.om_multi-purpose_24x44mm\" = \"24 x 44mm Multipurpose Label\";\n" "\"media.om_retail-label_32x37mm\" = \"32 x 37mm Retail Label\";\n" "\"media.om_return_16x43mm\" = \"16 x 43mm Return Label\";\n" "\"media.om_round_22x24mm\" = \"22mm Round Label\";\n" "\"media.om_shipping_48x96mm\" = \"48 x 96mm Shipping Label\";\n" "\"media.om_top-coated-paper_48x140mm\" = \"48 x 140mm Top Coated Paper\";\n" "\"media.om_vhs-face_45x72mm\" = \"45 x 72mm VHS Face Label\";\n" "\"media.om_vhs-spine_18x141mm\" = \"18 x 141mm VHS Spine Label\";\n" "\"media.om_zip-disk_48x55mm\" = \"48 x 55mm Zip Disk Label\";\n" "\"New Custom Size\" = \"New Custom Size\";\n" ; lprint-1.3.1/static-resources/lprint-en.strings000066400000000000000000000215031456151556700216660ustar00rootroot00000000000000"media.na_index-3x5_3x5in" = "3 x 5ʺ Label"; "media.na_index-4x6_4x6in" = "4 x 6ʺ Label"; "media.oe_1.25x0.25-label_1.25x0.25in" = "1-1/4 x 1/4ʺ Label"; "media.oe_1.25x2.25-label_1.25x2.25in" = "1-1/4 x 2-1/4ʺ Label"; "media.oe_1.5x0.25-label_1.5x0.25in" = "1-1/2 x 1/4ʺ Label"; "media.oe_1.5x0.5-label_1.5x0.5in" = "1-1/2 x 1/2ʺ Label"; "media.oe_1.5x1-label_1.5x1in" = "1-1/2 x 1ʺ Label"; "media.oe_1.5x2-label_1.5x2in" = "1-1/2 x 2ʺ Label"; "media.oe_2-part-internet-postage-label_2.25x7.5in" = "2-1/4 x 7-1/2ʺ 2-Part Internet Postage Label"; "media.oe_2-up-address-label_2.25x3.5in" = "2-1/4 x 3-1/2ʺ 2-Up Address Label"; "media.oe_2-up-file-folder-label_1.125x3.4375in" = "1-1/8 x 4-7/16ʺ 2-up File Folder Label"; "media.oe_2.25x0.5-label_2.25x0.5in" = "2-1/4 x 1/2ʺ Label"; "media.oe_2.25x0.5-label_2.25xin" = "2-1/4 x 1/2ʺ Label"; "media.oe_2.25x1.25-label_2.25x1.25in" = "2-1/4 x 1-1/4ʺ Label"; "media.oe_2.25x1.25-label_2.25xin" = "2-1/4 x 1-1/4ʺ Label"; "media.oe_2.25x4-label_2.25x4in" = "2-1/4 x 4ʺ Label"; "media.oe_2.25x5.5-label_2.25x5.5in" = "2-1/4 x 5-1/2ʺ Label"; "media.oe_2.38x5.5-label_2.38x5.5in" = "2-3/8 x 5-1/2ʺ Label"; "media.oe_2.5x1-label_2.5x1in" = "2-1/2 x 1ʺ Label"; "media.oe_2.5x2-label_2.5x2in" = "2-1/2 x 2ʺ Label"; "media.oe_2.75x1.25-label_2.75x1.25in" = "2-3/4 x 1-1/4ʺ Label"; "media.oe_2.9x1-label_2.9x1in" = "2.9 x 1ʺ Label"; "media.oe_2x0.37-label_2x0.37in" = "2 x 0.37ʺ Label"; "media.oe_2x0.5-label_2x0.5in" = "2 x 1/2ʺ Label"; "media.oe_2x1-label_2x1in" = "2 x 1ʺ Label"; "media.oe_2x1.25-label_2x1.25in" = "2 x 1-1/4ʺ Label"; "media.oe_2x2-label_2x2in" = "2 x 2ʺ Label"; "media.oe_2x3-label_2x3in" = "2 x 3ʺ Label"; "media.oe_2x4-label_2x4in" = "2 x 4ʺ Label"; "media.oe_2x5.5-label_2x5.5in" = "2 x 5-1/2ʺ Label"; "media.oe_3-part-postage-label_2.25x7in" = "2-1/4 x 7ʺ 3-Part Postage Label"; "media.oe_3.25x2-label_3.25x2in" = "3-1/4 x 2ʺ Label"; "media.oe_3.25x5-label_3.25x5in" = "3-1/4 x 5ʺ Label"; "media.oe_3.25x5.5-label_3.25x5.5in" = "3-1/4 x 5-1/2ʺ Label"; "media.oe_3.25x5.83-label_3.25x5.83in" = "3-1/4 x 5-13/16ʺ Label"; "media.oe_3.25x7.83-label_3.25x7.83in" = "3-1/4 x 7-13/16ʺ Label"; "media.oe_3.5x1-label_3.5x1in" = "3-1/2 x 1ʺ Label"; "media.oe_30859-paint-can-label_2.25x3.125in" = "2-1/4 x 3-1/8ʺ Paint Can Label"; "media.oe_3x1-label_3x1in" = "3 x 1ʺ Label"; "media.oe_3x1.25-label_3x1.25in" = "3 x 1-1/4ʺ Label"; "media.oe_3x2-label_3x2in" = "3 x 2ʺ Label"; "media.oe_3x3-label_3x3in" = "3 x 3ʺ Label"; "media.oe_3x5-label_3x5in" = "3 x 5ʺ Label"; "media.oe_4x1-label_4x1in" = "4 x 1ʺ Label"; "media.oe_4x13-label_4x13in" = "4 x 13ʺ Label"; "media.oe_4x2-label_4x2in" = "4 x 2ʺ Label"; "media.oe_4x3-label_4x3in" = "4 x 3ʺ Label"; "media.oe_4x4-label_4x4in" = "4 x 4ʺ Label"; "media.oe_4x5-label_4x5in" = "4 x 5ʺ Label"; "media.oe_4x6-label_4x6in" = "4 x 6ʺ Label"; "media.oe_4x6.5-label_4x6.5in" = "4 x 6-1/2ʺ Label"; "media.oe_4x8-label_4x8in" = "4 x 8ʺ Label"; "media.oe_6x1-label_6x1in" = "6 x 1ʺ Label"; "media.oe_6x13-label_6x13in" = "6 x 13ʺ Label"; "media.oe_6x2-label_6x2in" = "6 x 2ʺ Label"; "media.oe_6x3-label_6x3in" = "6 x 3ʺ Label"; "media.oe_6x4-label_6x4in" = "6 x 4ʺ Label"; "media.oe_6x5-label_6x5in" = "6 x 5ʺ Label"; "media.oe_6x6-label_6x6in" = "6 x 6ʺ Label"; "media.oe_6x6.5-label_6x6.5in" = "6 x 6-1/2ʺ Label"; "media.oe_8x1-label_8x1in" = "8 x 1ʺ Label"; "media.oe_8x13-label_8x13in" = "8 x 13ʺ Label"; "media.oe_8x2-label_8x2in" = "8 x 2ʺ Label"; "media.oe_8x3-label_8x3in" = "8 x 3ʺ Label"; "media.oe_8x4-label_8x4in" = "8 x 4ʺ Label"; "media.oe_8x5-label_8x5in" = "8 x 5ʺ Label"; "media.oe_8x6-label_8x6in" = "8 x 6ʺ Label"; "media.oe_8x6.5-label_8x6.5in" = "8 x 6-1/2ʺ Label"; "media.oe_address-label_1.125x3.5in" = "1-1/8 x 3-1/2ʺ Address Label"; "media.oe_barcode-label_0.75x2.5in" = "3/4 x 2-1/2ʺ Barcode Label"; "media.oe_book-spine-label_1x1.5in" = "1 x 1-1/2ʺ Book Spine Label"; "media.oe_continuous-label_2.125x3600in" = "2-1/8ʺ Continuous Label"; "media.oe_dk1201-address_1.1x3.5in" = "DK1201 28 x 89mm Address Label"; "media.oe_dk1202-shipping_2.4x3.9in" = "DK1202 61 x 99mm Shipping Label"; "media.oe_dk1203-file-folder_0.66x3.4in" = "DK1203 17 x 86mm File Folder Label"; "media.oe_dk1204-multi-purpose_0.66x2.1in" = "DK1204 17 x 53mm Multipurpose Label"; "media.oe_dk1207-cd-dvd_2.2x2.2in" = "DK1207 56mm CD/DVD Label"; "media.oe_dk1208-large-address_1.4x3.5in" = "DK1208 36 x 89mm Large Address Label"; "media.oe_dk1209-small-address_1.1x2.4in" = "DK1209 28 x 61mm Small Address Label"; "media.oe_dk1219-round_0.47x0.47in" = "DK1219 12mm Round Label"; "media.oe_dk1240-large-multi-purpose_1.9x4in" = "DK1240 48 x 102mm Large Multipurpose Label"; "media.oe_file-folder-label_0.5625x3.4375in" = "9/16 x 3-7/16ʺ File Folder Label"; "media.oe_hanging-file-tab-insert_0.5625x2in" = "9/16 x 2ʺ Hanging File Tab Insert Label"; "media.oe_internet-postage-confirmation-label_2.3125x10.5in" = "2-5/16 x 10-1/2ʺ Internet Postage Confirmation Label"; "media.oe_internet-postage-label_1.25x1.625in" = "1-1/4 x 1-5/8ʺ Internet Postage Label"; "media.oe_internet-postage-label_2.3125x7in" = "2-3/8 x 7ʺ Internet Postage Label"; "media.oe_lg-address-label_1.4x3.5in" = "1-4/10 x 3-1/2ʺ Large Address Label"; "media.oe_lg-multipurpose-label_2.125x.75in" = "2-1/8 x 3/4ʺ Large Multipurpose Label"; "media.oe_library-barcode-label_0.5x1.875in" = "1/2 x 1-7/8ʺ Library Barcode Label"; "media.oe_md-appointment-card_2x3.5in" = "2 x 3-1/2ʺ Medium Appointment Card"; "media.oe_md-multipurpose-label_2.25x1.25in" = "2-1/4 x 1/1/4ʺ Medium Multipurpose Label"; "media.oe_media-label_2.25x2.25in" = "2-1/4 x 2-1/4ʺ Media Label"; "media.oe_medium-1in-tape_0.5x1in" = "1/2 x 1ʺ Tape"; "media.oe_medium-2in-tape_0.5x2in" = "1/2 x 2ʺ Tape"; "media.oe_medium-3in-tape_0.5x3in" = "1/2 x 3ʺ Tape"; "media.oe_multipurpose-label_2x2.3125in" = "2 x 2-5/16ʺ Multipurpose Label"; "media.oe_name-badge-label_2.25x4in" = "2-1/4 x 4ʺ Name Badge Label"; "media.oe_price-tag-label_0.9375x0.875in" = "15/16 x 7/8ʺ Price Tag Label"; "media.oe_return-address-label_0.75x2in" = "3/4 x 2ʺ Return Address Label"; "media.oe_shipping-label_2.125x4in" = "2-1/8 x 4ʺ Shipping Label"; "media.oe_shipping-label_2.3125x4in" = "2-5/16 x 4ʺ Shipping Label"; "media.oe_sm-multipurpose-label_1x2.125in" = "1 x 2-1/8ʺ Small Multipurpose Label"; "media.oe_square-multipurpose-label_1x1in" = "1ʺ Square Multipurpose Label"; "media.oe_thin-1in-tape_0.25x1in" = "1/4 x 1ʺ Tape"; "media.oe_thin-2in-tape_0.25x2in" = "1/4 x 2ʺ Tape"; "media.oe_thin-3in-tape_0.25x3in" = "1/4 x 3ʺ Tape"; "media.oe_thin-multipurpose-label_0.375x2.8125in" = "3/8 x 2-13/16ʺ Thin Multipurpose Label"; "media.oe_thinner-1in-tape_0.375x1in" = "3/8 x 1ʺ Tape"; "media.oe_thinner-2in-tape_0.375x2in" = "3/8 x 2ʺ Tape"; "media.oe_thinner-3in-tape_0.375x3in" = "3/8 x 3ʺ Tape"; "media.oe_video-spine-label_0.75x5.875in" = "3/4 x 5-7/8ʺ Video Spine Label"; "media.oe_video-top-label_1.8x3.1in" = "1.8 x 3.1ʺ Video Top Label"; "media.oe_wide-1in-tape_1x1in" = "1 x 1ʺ Tape"; "media.oe_wide-2in-tape_1x2in" = "1 x 2ʺ Tape"; "media.oe_wide-3in-tape_1x3in" = "1 x 3ʺ Tape"; "media.oe_wider-1in-tape_0.75x1in" = "3/4 x 1ʺ Tape"; "media.oe_wider-2in-tape_0.75x2in" = "3/4 x 2ʺ Tape"; "media.oe_wider-3in-tape_0.75x3in" = "3/4 x 3ʺ Tape"; "media.om_35mm-slide_9x37mm" = "35mm Slide Label"; "media.om_4-part-label_48x96mm" = "48 x 96mm 4-Part Label"; "media.om_8mm-spine_9x66mm" = "8mm Spine Label"; "media.om_address-large_35x83mm" = "35 x 83mm Large Address Label"; "media.om_address-small_24x83mm" = "24 x 83mm Small Address Label"; "media.om_cut-hanging-13_32x78mm" = "32 x 78mm 1/3 Cut Hanging File Folder Label"; "media.om_cut-hanging-15_32x40mm" = "32 x 40mm 1/5 Cut Hanging File Folder Label"; "media.om_diskette_48x64mm" = "48 x 64mm Diskette Label"; "media.om_euro-file-folder_39x49mm" = "39 x 49mm Euro File Folder Label"; "media.om_euro-folder-narrow_38x186mm" = "38 x 186mm Euro Narrow File Folder Label"; "media.om_euro-folder-wide_48x186mm" = "48 x 186mm Euro Wide File Folder Label"; "media.om_euro-name-badge-large_48x79mm" = "48 x 79mm Euro Large Name Badge Label"; "media.om_euro-name-badge_38x67mm" = "38 x 67mm Euro Name Badge Label"; "media.om_file-folder_13x81mm" = "13 x 81mm File Folder Label"; "media.om_jewelry_27x48mm" = "27 x 48mm Jewelry Label"; "media.om_media-badge_48x64mm" = "48 x 64mm Media Badge Label"; "media.om_multi-purpose_24x44mm" = "24 x 44mm Multipurpose Label"; "media.om_retail-label_32x37mm" = "32 x 37mm Retail Label"; "media.om_return_16x43mm" = "16 x 43mm Return Label"; "media.om_round_22x24mm" = "22mm Round Label"; "media.om_shipping_48x96mm" = "48 x 96mm Shipping Label"; "media.om_top-coated-paper_48x140mm" = "48 x 140mm Top Coated Paper"; "media.om_vhs-face_45x72mm" = "45 x 72mm VHS Face Label"; "media.om_vhs-spine_18x141mm" = "18 x 141mm VHS Spine Label"; "media.om_zip-disk_48x55mm" = "48 x 55mm Zip Disk Label"; "New Custom Size" = "New Custom Size"; lprint-1.3.1/static-resources/lprint-es-strings.h000066400000000000000000000253531456151556700221270ustar00rootroot00000000000000/* static-resources/lprint-es.strings */ static const char * const lprint_es_strings = "\"media.na_index-3x5_3x5in\" = \"3 x 5ʺ Etiqueta\";\n" "\"media.na_index-4x6_4x6in\" = \"4 x 6ʺ Etiqueta\";\n" "\"media.oe_1.25x0.25-label_1.25x0.25in\" = \"1-1/4 x 1/4ʺ Etiqueta\";\n" "\"media.oe_1.25x2.25-label_1.25x2.25in\" = \"1-1/4 x 2-1/4ʺ Etiqueta\";\n" "\"media.oe_1.5x0.25-label_1.5x0.25in\" = \"1-1/2 x 1/4ʺ Etiqueta\";\n" "\"media.oe_1.5x0.5-label_1.5x0.5in\" = \"1-1/2 x 1/2ʺ Etiqueta\";\n" "\"media.oe_1.5x1-label_1.5x1in\" = \"1-1/2 x 1ʺ Etiqueta\";\n" "\"media.oe_1.5x2-label_1.5x2in\" = \"1-1/2 x 2ʺ Etiqueta\";\n" "\"media.oe_2-part-internet-postage-label_2.25x7.5in\" = \"2-1/4 x 7-1/2ʺ Etiqueta de envío de Internet de 2 partes\";\n" "\"media.oe_2-up-address-label_2.25x3.5in\" = \"2-1/4 x 3-1/2ʺ Etiqueta de dirección 2-up\";\n" "\"media.oe_2-up-file-folder-label_1.125x3.4375in\" = \"1-1/8 x 4-7/16ʺ Etiqueta de carpeta de archivos 2-up\";\n" "\"media.oe_2.25x0.5-label_2.25x0.5in\" = \"2-1/4 x 1/2ʺ Etiqueta\";\n" "\"media.oe_2.25x0.5-label_2.25xin\" = \"2-1/4 x 1/2ʺ Etiqueta\";\n" "\"media.oe_2.25x1.25-label_2.25x1.25in\" = \"2-1/4 x 1-1/4ʺ Etiqueta\";\n" "\"media.oe_2.25x1.25-label_2.25xin\" = \"2-1/4 x 1-1/4ʺ Etiqueta\";\n" "\"media.oe_2.25x4-label_2.25x4in\" = \"2-1/4 x 4ʺ Etiqueta\";\n" "\"media.oe_2.25x5.5-label_2.25x5.5in\" = \"2-1/4 x 5-1/2ʺ Etiqueta\";\n" "\"media.oe_2.38x5.5-label_2.38x5.5in\" = \"2-3/8 x 5-1/2ʺ Etiqueta\";\n" "\"media.oe_2.5x1-label_2.5x1in\" = \"2-1/2 x 1ʺ Etiqueta\";\n" "\"media.oe_2.5x2-label_2.5x2in\" = \"2-1/2 x 2ʺ Etiqueta\";\n" "\"media.oe_2.75x1.25-label_2.75x1.25in\" = \"2-3/4 x 1-1/4ʺ Etiqueta\";\n" "\"media.oe_2.9x1-label_2.9x1in\" = \"2.9 x 1ʺ Etiqueta\";\n" "\"media.oe_2x0.37-label_2x0.37in\" = \"2 x 0.37ʺ Etiqueta\";\n" "\"media.oe_2x0.5-label_2x0.5in\" = \"2 x 1/2ʺ Etiqueta\";\n" "\"media.oe_2x1-label_2x1in\" = \"2 x 1ʺ Etiqueta\";\n" "\"media.oe_2x1.25-label_2x1.25in\" = \"2 x 1-1/4ʺ Etiqueta\";\n" "\"media.oe_2x2-label_2x2in\" = \"2 x 2ʺ Etiqueta\";\n" "\"media.oe_2x3-label_2x3in\" = \"2 x 3ʺ Etiqueta\";\n" "\"media.oe_2x4-label_2x4in\" = \"2 x 4ʺ Etiqueta\";\n" "\"media.oe_2x5.5-label_2x5.5in\" = \"2 x 5-1/2ʺ Etiqueta\";\n" "\"media.oe_3-part-postage-label_2.25x7in\" = \"2-1/4 x 7ʺ Etiqueta de envío de 3 partes\";\n" "\"media.oe_3.25x2-label_3.25x2in\" = \"3-1/4 x 2ʺ Etiqueta\";\n" "\"media.oe_3.25x5-label_3.25x5in\" = \"3-1/4 x 5ʺ Etiqueta\";\n" "\"media.oe_3.25x5.5-label_3.25x5.5in\" = \"3-1/4 x 5-1/2ʺ Etiqueta\";\n" "\"media.oe_3.25x5.83-label_3.25x5.83in\" = \"3-1/4 x 5-13/16ʺ Etiqueta\";\n" "\"media.oe_3.25x7.83-label_3.25x7.83in\" = \"3-1/4 x 7-13/16ʺ Etiqueta\";\n" "\"media.oe_3.5x1-label_3.5x1in\" = \"3-1/2 x 1ʺ Etiqueta\";\n" "\"media.oe_30859-paint-can-label_2.25x3.125in\" = \"2-1/4 x 3-1/8ʺ Etiqueta de lata de pintura\";\n" "\"media.oe_3x1-label_3x1in\" = \"3 x 1ʺ Etiqueta\";\n" "\"media.oe_3x1.25-label_3x1.25in\" = \"3 x 1-1/4ʺ Etiqueta\";\n" "\"media.oe_3x2-label_3x2in\" = \"3 x 2ʺ Etiqueta\";\n" "\"media.oe_3x3-label_3x3in\" = \"3 x 3ʺ Etiqueta\";\n" "\"media.oe_3x5-label_3x5in\" = \"3 x 5ʺ Etiqueta\";\n" "\"media.oe_4x1-label_4x1in\" = \"4 x 1ʺ Etiqueta\";\n" "\"media.oe_4x13-label_4x13in\" = \"4 x 13ʺ Etiqueta\";\n" "\"media.oe_4x2-label_4x2in\" = \"4 x 2ʺ Etiqueta\";\n" "\"media.oe_4x3-label_4x3in\" = \"4 x 3ʺ Etiqueta\";\n" "\"media.oe_4x4-label_4x4in\" = \"4 x 4ʺ Etiqueta\";\n" "\"media.oe_4x5-label_4x5in\" = \"4 x 5ʺ Etiqueta\";\n" "\"media.oe_4x6-label_4x6in\" = \"4 x 6ʺ Etiqueta\";\n" "\"media.oe_4x6.5-label_4x6.5in\" = \"4 x 6-1/2ʺ Etiqueta\";\n" "\"media.oe_4x8-label_4x8in\" = \"4 x 8ʺ Etiqueta\";\n" "\"media.oe_6x1-label_6x1in\" = \"6 x 1ʺ Etiqueta\";\n" "\"media.oe_6x13-label_6x13in\" = \"6 x 13ʺ Etiqueta\";\n" "\"media.oe_6x2-label_6x2in\" = \"6 x 2ʺ Etiqueta\";\n" "\"media.oe_6x3-label_6x3in\" = \"6 x 3ʺ Etiqueta\";\n" "\"media.oe_6x4-label_6x4in\" = \"6 x 4ʺ Etiqueta\";\n" "\"media.oe_6x5-label_6x5in\" = \"6 x 5ʺ Etiqueta\";\n" "\"media.oe_6x6-label_6x6in\" = \"6 x 6ʺ Etiqueta\";\n" "\"media.oe_6x6.5-label_6x6.5in\" = \"6 x 6-1/2ʺ Etiqueta\";\n" "\"media.oe_8x1-label_8x1in\" = \"8 x 1ʺ Etiqueta\";\n" "\"media.oe_8x13-label_8x13in\" = \"8 x 13ʺ Etiqueta\";\n" "\"media.oe_8x2-label_8x2in\" = \"8 x 2ʺ Etiqueta\";\n" "\"media.oe_8x3-label_8x3in\" = \"8 x 3ʺ Etiqueta\";\n" "\"media.oe_8x4-label_8x4in\" = \"8 x 4ʺ Etiqueta\";\n" "\"media.oe_8x5-label_8x5in\" = \"8 x 5ʺ Etiqueta\";\n" "\"media.oe_8x6-label_8x6in\" = \"8 x 6ʺ Etiqueta\";\n" "\"media.oe_8x6.5-label_8x6.5in\" = \"8 x 6-1/2ʺ Etiqueta\";\n" "\"media.oe_address-label_1.125x3.5in\" = \"1-1/8 x 3-1/2ʺ Etiqueta de dirección\";\n" "\"media.oe_barcode-label_0.75x2.5in\" = \"3/4 x 2-1/2ʺ Etiqueta de código de barras\";\n" "\"media.oe_book-spine-label_1x1.5in\" = \"1 x 1-1/2ʺ Etiqueta del lomo del libro\";\n" "\"media.oe_continuous-label_2.125x3600in\" = \"2-1/8ʺ Etiqueta continua\";\n" "\"media.oe_dk1201-address_1.1x3.5in\" = \"DK1201 28 x 89mm Etiqueta de dirección\";\n" "\"media.oe_dk1202-shipping_2.4x3.9in\" = \"DK1202 61 x 99mm Etiqueta de envío\";\n" "\"media.oe_dk1203-file-folder_0.66x3.4in\" = \"DK1203 17 x 86mm Etiqueta de carpeta de archivos\";\n" "\"media.oe_dk1204-multi-purpose_0.66x2.1in\" = \"DK1204 17 x 53mm Etiqueta multiusos\";\n" "\"media.oe_dk1207-cd-dvd_2.2x2.2in\" = \"DK1207 56mm Etiqueta de CD/DVD\";\n" "\"media.oe_dk1208-large-address_1.4x3.5in\" = \"DK1208 36 x 89mm Etiqueta de dirección grande\";\n" "\"media.oe_dk1209-small-address_1.1x2.4in\" = \"DK1209 28 x 61mm Etiqueta de dirección pequeña\";\n" "\"media.oe_dk1219-round_0.47x0.47in\" = \"DK1219 12mm Etiqueta redonda\";\n" "\"media.oe_dk1240-large-multi-purpose_1.9x4in\" = \"DK1240 48 x 102mm Etiqueta multiusos grande\";\n" "\"media.oe_file-folder-label_0.5625x3.4375in\" = \"9/16 x 3-7/16ʺ Etiqueta de carpeta de archivos\";\n" "\"media.oe_hanging-file-tab-insert_0.5625x2in\" = \"9/16 x 2ʺ Etiqueta de inserción de pestaña de archivo colgante\";\n" "\"media.oe_internet-postage-confirmation-label_2.3125x10.5in\" = \"2-5/16 x 10-1/2ʺ Etiqueta de confirmación de envío por Internet\";\n" "\"media.oe_internet-postage-label_1.25x1.625in\" = \"1-1/4 x 1-5/8ʺ Etiqueta de envío de Internet\";\n" "\"media.oe_internet-postage-label_2.3125x7in\" = \"2-3/8 x 7ʺ Etiqueta de envío de Internet\";\n" "\"media.oe_lg-address-label_1.4x3.5in\" = \"1-4/10 x 3-1/2ʺ Etiqueta de dirección grande\";\n" "\"media.oe_lg-multipurpose-label_2.125x.75in\" = \"2-1/8 x 3/4ʺ Large Etiqueta multiusos\";\n" "\"media.oe_library-barcode-label_0.5x1.875in\" = \"1/2 x 1-7/8ʺ Library Barcode Etiqueta\";\n" "\"media.oe_md-appointment-card_2x3.5in\" = \"2 x 3-1/2ʺ Tarjeta de Cita Mediana\";\n" "\"media.oe_md-multipurpose-label_2.25x1.25in\" = \"2-1/4 x 1/1/4ʺ Etiqueta multiusos mediana\";\n" "\"media.oe_media-label_2.25x2.25in\" = \"2-1/4 x 2-1/4ʺ Etiqueta de medios\";\n" "\"media.oe_medium-1in-tape_0.5x1in\" = \"1/2 x 1ʺ Cinta\";\n" "\"media.oe_medium-2in-tape_0.5x2in\" = \"1/2 x 2ʺ Cinta\";\n" "\"media.oe_medium-3in-tape_0.5x3in\" = \"1/2 x 3ʺ Cinta\";\n" "\"media.oe_multipurpose-label_2x2.3125in\" = \"2 x 2-5/16ʺ Etiqueta multiusos\";\n" "\"media.oe_name-badge-label_2.25x4in\" = \"2-1/4 x 4ʺ Etiqueta de identificación\";\n" "\"media.oe_price-tag-label_0.9375x0.875in\" = \"15/16 x 7/8ʺ Etiqueta de precio\";\n" "\"media.oe_return-address-label_0.75x2in\" = \"3/4 x 2ʺ Etiqueta de dirección del remitente\";\n" "\"media.oe_shipping-label_2.125x4in\" = \"2-1/8 x 4ʺ Etiqueta de envío\";\n" "\"media.oe_shipping-label_2.3125x4in\" = \"2-5/16 x 4ʺ Etiqueta de envío\";\n" "\"media.oe_sm-multipurpose-label_1x2.125in\" = \"1 x 2-1/8ʺ Etiqueta multiusos pequeña\";\n" "\"media.oe_square-multipurpose-label_1x1in\" = \"1ʺ Etiqueta multiusos cuadrada\";\n" "\"media.oe_thin-1in-tape_0.25x1in\" = \"1/4 x 1ʺ Cinta\";\n" "\"media.oe_thin-2in-tape_0.25x2in\" = \"1/4 x 2ʺ Cinta\";\n" "\"media.oe_thin-3in-tape_0.25x3in\" = \"1/4 x 3ʺ Cinta\";\n" "\"media.oe_thin-multipurpose-label_0.375x2.8125in\" = \"3/8 x 2-13/16ʺ Etiqueta delgada multiusos\";\n" "\"media.oe_thinner-1in-tape_0.375x1in\" = \"3/8 x 1ʺ Cinta\";\n" "\"media.oe_thinner-2in-tape_0.375x2in\" = \"3/8 x 2ʺ Cinta\";\n" "\"media.oe_thinner-3in-tape_0.375x3in\" = \"3/8 x 3ʺ Cinta\";\n" "\"media.oe_video-spine-label_0.75x5.875in\" = \"3/4 x 5-7/8ʺ Etiqueta del lomo del vídeo\";\n" "\"media.oe_video-top-label_1.8x3.1in\" = \"1.8 x 3.1ʺ Etiqueta superior del vídeo\";\n" "\"media.oe_wide-1in-tape_1x1in\" = \"1 x 1ʺ Cinta\";\n" "\"media.oe_wide-2in-tape_1x2in\" = \"1 x 2ʺ Cinta\";\n" "\"media.oe_wide-3in-tape_1x3in\" = \"1 x 3ʺ Cinta\";\n" "\"media.oe_wider-1in-tape_0.75x1in\" = \"3/4 x 1ʺ Cinta\";\n" "\"media.oe_wider-2in-tape_0.75x2in\" = \"3/4 x 2ʺ Cinta\";\n" "\"media.oe_wider-3in-tape_0.75x3in\" = \"3/4 x 3ʺ Cinta\";\n" "\"media.om_35mm-slide_9x37mm\" = \"35mm Etiqueta de diapositiva\";\n" "\"media.om_4-part-label_48x96mm\" = \"48 x 96mm Etiqueta de 4 partes\";\n" "\"media.om_8mm-spine_9x66mm\" = \"8mm Etiqueta del lomo\";\n" "\"media.om_address-large_35x83mm\" = \"35 x 83mm Etiqueta de dirección grande\";\n" "\"media.om_address-small_24x83mm\" = \"24 x 83mm Etiqueta de dirección pequeña\";\n" "\"media.om_cut-hanging-13_32x78mm\" = \"32 x 78mm 1/3 Cut Hanging Etiqueta de carpeta de archivos\";\n" "\"media.om_cut-hanging-15_32x40mm\" = \"32 x 40mm 1/5 Cut Hanging Etiqueta de carpeta de archivos\";\n" "\"media.om_diskette_48x64mm\" = \"48 x 64mm Etiqueta de disquete\";\n" "\"media.om_euro-file-folder_39x49mm\" = \"39 x 49mm Etiqueta de carpeta de archivos\";\n" "\"media.om_euro-folder-narrow_38x186mm\" = \"38 x 186mm Etiqueta de carpeta de archivos\";\n" "\"media.om_euro-folder-wide_48x186mm\" = \"48 x 186mm Etiqueta de carpeta de archivos\";\n" "\"media.om_euro-name-badge-large_48x79mm\" = \"48 x 79mm Etiqueta de identificación\";\n" "\"media.om_euro-name-badge_38x67mm\" = \"38 x 67mm Etiqueta de identificación\";\n" "\"media.om_file-folder_13x81mm\" = \"13 x 81mm Etiqueta de carpeta de archivos\";\n" "\"media.om_jewelry_27x48mm\" = \"27 x 48mm Etiqueta de joyería\";\n" "\"media.om_media-badge_48x64mm\" = \"48 x 64mm Etiqueta de insignia de medios\";\n" "\"media.om_multi-purpose_24x44mm\" = \"24 x 44mm Etiqueta multiusos\";\n" "\"media.om_retail-label_32x37mm\" = \"32 x 37mm Etiqueta minorista\";\n" "\"media.om_return_16x43mm\" = \"16 x 43mm Etiqueta de devolución\";\n" "\"media.om_round_22x24mm\" = \"22mm Etiqueta redonda\";\n" "\"media.om_shipping_48x96mm\" = \"48 x 96mm Etiqueta de envío\";\n" "\"media.om_top-coated-paper_48x140mm\" = \"48 x 140mm Papel estucado superior\";\n" "\"media.om_vhs-face_45x72mm\" = \"45 x 72mm Etiqueta de cara VHS\";\n" "\"media.om_vhs-spine_18x141mm\" = \"18 x 141mm Etiqueta de lomo VHS\";\n" "\"media.om_zip-disk_48x55mm\" = \"48 x 55mm Etiqueta de disco zip\";\n" "\"New Custom Size\" = \"Nuevo tamaño personalizado\";\n" ; lprint-1.3.1/static-resources/lprint-es.strings000066400000000000000000000230221456151556700216710ustar00rootroot00000000000000"media.na_index-3x5_3x5in" = "3 x 5ʺ Etiqueta"; "media.na_index-4x6_4x6in" = "4 x 6ʺ Etiqueta"; "media.oe_1.25x0.25-label_1.25x0.25in" = "1-1/4 x 1/4ʺ Etiqueta"; "media.oe_1.25x2.25-label_1.25x2.25in" = "1-1/4 x 2-1/4ʺ Etiqueta"; "media.oe_1.5x0.25-label_1.5x0.25in" = "1-1/2 x 1/4ʺ Etiqueta"; "media.oe_1.5x0.5-label_1.5x0.5in" = "1-1/2 x 1/2ʺ Etiqueta"; "media.oe_1.5x1-label_1.5x1in" = "1-1/2 x 1ʺ Etiqueta"; "media.oe_1.5x2-label_1.5x2in" = "1-1/2 x 2ʺ Etiqueta"; "media.oe_2-part-internet-postage-label_2.25x7.5in" = "2-1/4 x 7-1/2ʺ Etiqueta de envío de Internet de 2 partes"; "media.oe_2-up-address-label_2.25x3.5in" = "2-1/4 x 3-1/2ʺ Etiqueta de dirección 2-up"; "media.oe_2-up-file-folder-label_1.125x3.4375in" = "1-1/8 x 4-7/16ʺ Etiqueta de carpeta de archivos 2-up"; "media.oe_2.25x0.5-label_2.25x0.5in" = "2-1/4 x 1/2ʺ Etiqueta"; "media.oe_2.25x0.5-label_2.25xin" = "2-1/4 x 1/2ʺ Etiqueta"; "media.oe_2.25x1.25-label_2.25x1.25in" = "2-1/4 x 1-1/4ʺ Etiqueta"; "media.oe_2.25x1.25-label_2.25xin" = "2-1/4 x 1-1/4ʺ Etiqueta"; "media.oe_2.25x4-label_2.25x4in" = "2-1/4 x 4ʺ Etiqueta"; "media.oe_2.25x5.5-label_2.25x5.5in" = "2-1/4 x 5-1/2ʺ Etiqueta"; "media.oe_2.38x5.5-label_2.38x5.5in" = "2-3/8 x 5-1/2ʺ Etiqueta"; "media.oe_2.5x1-label_2.5x1in" = "2-1/2 x 1ʺ Etiqueta"; "media.oe_2.5x2-label_2.5x2in" = "2-1/2 x 2ʺ Etiqueta"; "media.oe_2.75x1.25-label_2.75x1.25in" = "2-3/4 x 1-1/4ʺ Etiqueta"; "media.oe_2.9x1-label_2.9x1in" = "2.9 x 1ʺ Etiqueta"; "media.oe_2x0.37-label_2x0.37in" = "2 x 0.37ʺ Etiqueta"; "media.oe_2x0.5-label_2x0.5in" = "2 x 1/2ʺ Etiqueta"; "media.oe_2x1-label_2x1in" = "2 x 1ʺ Etiqueta"; "media.oe_2x1.25-label_2x1.25in" = "2 x 1-1/4ʺ Etiqueta"; "media.oe_2x2-label_2x2in" = "2 x 2ʺ Etiqueta"; "media.oe_2x3-label_2x3in" = "2 x 3ʺ Etiqueta"; "media.oe_2x4-label_2x4in" = "2 x 4ʺ Etiqueta"; "media.oe_2x5.5-label_2x5.5in" = "2 x 5-1/2ʺ Etiqueta"; "media.oe_3-part-postage-label_2.25x7in" = "2-1/4 x 7ʺ Etiqueta de envío de 3 partes"; "media.oe_3.25x2-label_3.25x2in" = "3-1/4 x 2ʺ Etiqueta"; "media.oe_3.25x5-label_3.25x5in" = "3-1/4 x 5ʺ Etiqueta"; "media.oe_3.25x5.5-label_3.25x5.5in" = "3-1/4 x 5-1/2ʺ Etiqueta"; "media.oe_3.25x5.83-label_3.25x5.83in" = "3-1/4 x 5-13/16ʺ Etiqueta"; "media.oe_3.25x7.83-label_3.25x7.83in" = "3-1/4 x 7-13/16ʺ Etiqueta"; "media.oe_3.5x1-label_3.5x1in" = "3-1/2 x 1ʺ Etiqueta"; "media.oe_30859-paint-can-label_2.25x3.125in" = "2-1/4 x 3-1/8ʺ Etiqueta de lata de pintura"; "media.oe_3x1-label_3x1in" = "3 x 1ʺ Etiqueta"; "media.oe_3x1.25-label_3x1.25in" = "3 x 1-1/4ʺ Etiqueta"; "media.oe_3x2-label_3x2in" = "3 x 2ʺ Etiqueta"; "media.oe_3x3-label_3x3in" = "3 x 3ʺ Etiqueta"; "media.oe_3x5-label_3x5in" = "3 x 5ʺ Etiqueta"; "media.oe_4x1-label_4x1in" = "4 x 1ʺ Etiqueta"; "media.oe_4x13-label_4x13in" = "4 x 13ʺ Etiqueta"; "media.oe_4x2-label_4x2in" = "4 x 2ʺ Etiqueta"; "media.oe_4x3-label_4x3in" = "4 x 3ʺ Etiqueta"; "media.oe_4x4-label_4x4in" = "4 x 4ʺ Etiqueta"; "media.oe_4x5-label_4x5in" = "4 x 5ʺ Etiqueta"; "media.oe_4x6-label_4x6in" = "4 x 6ʺ Etiqueta"; "media.oe_4x6.5-label_4x6.5in" = "4 x 6-1/2ʺ Etiqueta"; "media.oe_4x8-label_4x8in" = "4 x 8ʺ Etiqueta"; "media.oe_6x1-label_6x1in" = "6 x 1ʺ Etiqueta"; "media.oe_6x13-label_6x13in" = "6 x 13ʺ Etiqueta"; "media.oe_6x2-label_6x2in" = "6 x 2ʺ Etiqueta"; "media.oe_6x3-label_6x3in" = "6 x 3ʺ Etiqueta"; "media.oe_6x4-label_6x4in" = "6 x 4ʺ Etiqueta"; "media.oe_6x5-label_6x5in" = "6 x 5ʺ Etiqueta"; "media.oe_6x6-label_6x6in" = "6 x 6ʺ Etiqueta"; "media.oe_6x6.5-label_6x6.5in" = "6 x 6-1/2ʺ Etiqueta"; "media.oe_8x1-label_8x1in" = "8 x 1ʺ Etiqueta"; "media.oe_8x13-label_8x13in" = "8 x 13ʺ Etiqueta"; "media.oe_8x2-label_8x2in" = "8 x 2ʺ Etiqueta"; "media.oe_8x3-label_8x3in" = "8 x 3ʺ Etiqueta"; "media.oe_8x4-label_8x4in" = "8 x 4ʺ Etiqueta"; "media.oe_8x5-label_8x5in" = "8 x 5ʺ Etiqueta"; "media.oe_8x6-label_8x6in" = "8 x 6ʺ Etiqueta"; "media.oe_8x6.5-label_8x6.5in" = "8 x 6-1/2ʺ Etiqueta"; "media.oe_address-label_1.125x3.5in" = "1-1/8 x 3-1/2ʺ Etiqueta de dirección"; "media.oe_barcode-label_0.75x2.5in" = "3/4 x 2-1/2ʺ Etiqueta de código de barras"; "media.oe_book-spine-label_1x1.5in" = "1 x 1-1/2ʺ Etiqueta del lomo del libro"; "media.oe_continuous-label_2.125x3600in" = "2-1/8ʺ Etiqueta continua"; "media.oe_dk1201-address_1.1x3.5in" = "DK1201 28 x 89mm Etiqueta de dirección"; "media.oe_dk1202-shipping_2.4x3.9in" = "DK1202 61 x 99mm Etiqueta de envío"; "media.oe_dk1203-file-folder_0.66x3.4in" = "DK1203 17 x 86mm Etiqueta de carpeta de archivos"; "media.oe_dk1204-multi-purpose_0.66x2.1in" = "DK1204 17 x 53mm Etiqueta multiusos"; "media.oe_dk1207-cd-dvd_2.2x2.2in" = "DK1207 56mm Etiqueta de CD/DVD"; "media.oe_dk1208-large-address_1.4x3.5in" = "DK1208 36 x 89mm Etiqueta de dirección grande"; "media.oe_dk1209-small-address_1.1x2.4in" = "DK1209 28 x 61mm Etiqueta de dirección pequeña"; "media.oe_dk1219-round_0.47x0.47in" = "DK1219 12mm Etiqueta redonda"; "media.oe_dk1240-large-multi-purpose_1.9x4in" = "DK1240 48 x 102mm Etiqueta multiusos grande"; "media.oe_file-folder-label_0.5625x3.4375in" = "9/16 x 3-7/16ʺ Etiqueta de carpeta de archivos"; "media.oe_hanging-file-tab-insert_0.5625x2in" = "9/16 x 2ʺ Etiqueta de inserción de pestaña de archivo colgante"; "media.oe_internet-postage-confirmation-label_2.3125x10.5in" = "2-5/16 x 10-1/2ʺ Etiqueta de confirmación de envío por Internet"; "media.oe_internet-postage-label_1.25x1.625in" = "1-1/4 x 1-5/8ʺ Etiqueta de envío de Internet"; "media.oe_internet-postage-label_2.3125x7in" = "2-3/8 x 7ʺ Etiqueta de envío de Internet"; "media.oe_lg-address-label_1.4x3.5in" = "1-4/10 x 3-1/2ʺ Etiqueta de dirección grande"; "media.oe_lg-multipurpose-label_2.125x.75in" = "2-1/8 x 3/4ʺ Large Etiqueta multiusos"; "media.oe_library-barcode-label_0.5x1.875in" = "1/2 x 1-7/8ʺ Library Barcode Etiqueta"; "media.oe_md-appointment-card_2x3.5in" = "2 x 3-1/2ʺ Tarjeta de Cita Mediana"; "media.oe_md-multipurpose-label_2.25x1.25in" = "2-1/4 x 1/1/4ʺ Etiqueta multiusos mediana"; "media.oe_media-label_2.25x2.25in" = "2-1/4 x 2-1/4ʺ Etiqueta de medios"; "media.oe_medium-1in-tape_0.5x1in" = "1/2 x 1ʺ Cinta"; "media.oe_medium-2in-tape_0.5x2in" = "1/2 x 2ʺ Cinta"; "media.oe_medium-3in-tape_0.5x3in" = "1/2 x 3ʺ Cinta"; "media.oe_multipurpose-label_2x2.3125in" = "2 x 2-5/16ʺ Etiqueta multiusos"; "media.oe_name-badge-label_2.25x4in" = "2-1/4 x 4ʺ Etiqueta de identificación"; "media.oe_price-tag-label_0.9375x0.875in" = "15/16 x 7/8ʺ Etiqueta de precio"; "media.oe_return-address-label_0.75x2in" = "3/4 x 2ʺ Etiqueta de dirección del remitente"; "media.oe_shipping-label_2.125x4in" = "2-1/8 x 4ʺ Etiqueta de envío"; "media.oe_shipping-label_2.3125x4in" = "2-5/16 x 4ʺ Etiqueta de envío"; "media.oe_sm-multipurpose-label_1x2.125in" = "1 x 2-1/8ʺ Etiqueta multiusos pequeña"; "media.oe_square-multipurpose-label_1x1in" = "1ʺ Etiqueta multiusos cuadrada"; "media.oe_thin-1in-tape_0.25x1in" = "1/4 x 1ʺ Cinta"; "media.oe_thin-2in-tape_0.25x2in" = "1/4 x 2ʺ Cinta"; "media.oe_thin-3in-tape_0.25x3in" = "1/4 x 3ʺ Cinta"; "media.oe_thin-multipurpose-label_0.375x2.8125in" = "3/8 x 2-13/16ʺ Etiqueta delgada multiusos"; "media.oe_thinner-1in-tape_0.375x1in" = "3/8 x 1ʺ Cinta"; "media.oe_thinner-2in-tape_0.375x2in" = "3/8 x 2ʺ Cinta"; "media.oe_thinner-3in-tape_0.375x3in" = "3/8 x 3ʺ Cinta"; "media.oe_video-spine-label_0.75x5.875in" = "3/4 x 5-7/8ʺ Etiqueta del lomo del vídeo"; "media.oe_video-top-label_1.8x3.1in" = "1.8 x 3.1ʺ Etiqueta superior del vídeo"; "media.oe_wide-1in-tape_1x1in" = "1 x 1ʺ Cinta"; "media.oe_wide-2in-tape_1x2in" = "1 x 2ʺ Cinta"; "media.oe_wide-3in-tape_1x3in" = "1 x 3ʺ Cinta"; "media.oe_wider-1in-tape_0.75x1in" = "3/4 x 1ʺ Cinta"; "media.oe_wider-2in-tape_0.75x2in" = "3/4 x 2ʺ Cinta"; "media.oe_wider-3in-tape_0.75x3in" = "3/4 x 3ʺ Cinta"; "media.om_35mm-slide_9x37mm" = "35mm Etiqueta de diapositiva"; "media.om_4-part-label_48x96mm" = "48 x 96mm Etiqueta de 4 partes"; "media.om_8mm-spine_9x66mm" = "8mm Etiqueta del lomo"; "media.om_address-large_35x83mm" = "35 x 83mm Etiqueta de dirección grande"; "media.om_address-small_24x83mm" = "24 x 83mm Etiqueta de dirección pequeña"; "media.om_cut-hanging-13_32x78mm" = "32 x 78mm 1/3 Cut Hanging Etiqueta de carpeta de archivos"; "media.om_cut-hanging-15_32x40mm" = "32 x 40mm 1/5 Cut Hanging Etiqueta de carpeta de archivos"; "media.om_diskette_48x64mm" = "48 x 64mm Etiqueta de disquete"; "media.om_euro-file-folder_39x49mm" = "39 x 49mm Etiqueta de carpeta de archivos"; "media.om_euro-folder-narrow_38x186mm" = "38 x 186mm Etiqueta de carpeta de archivos"; "media.om_euro-folder-wide_48x186mm" = "48 x 186mm Etiqueta de carpeta de archivos"; "media.om_euro-name-badge-large_48x79mm" = "48 x 79mm Etiqueta de identificación"; "media.om_euro-name-badge_38x67mm" = "38 x 67mm Etiqueta de identificación"; "media.om_file-folder_13x81mm" = "13 x 81mm Etiqueta de carpeta de archivos"; "media.om_jewelry_27x48mm" = "27 x 48mm Etiqueta de joyería"; "media.om_media-badge_48x64mm" = "48 x 64mm Etiqueta de insignia de medios"; "media.om_multi-purpose_24x44mm" = "24 x 44mm Etiqueta multiusos"; "media.om_retail-label_32x37mm" = "32 x 37mm Etiqueta minorista"; "media.om_return_16x43mm" = "16 x 43mm Etiqueta de devolución"; "media.om_round_22x24mm" = "22mm Etiqueta redonda"; "media.om_shipping_48x96mm" = "48 x 96mm Etiqueta de envío"; "media.om_top-coated-paper_48x140mm" = "48 x 140mm Papel estucado superior"; "media.om_vhs-face_45x72mm" = "45 x 72mm Etiqueta de cara VHS"; "media.om_vhs-spine_18x141mm" = "18 x 141mm Etiqueta de lomo VHS"; "media.om_zip-disk_48x55mm" = "48 x 55mm Etiqueta de disco zip"; "New Custom Size" = "Nuevo tamaño personalizado"; lprint-1.3.1/static-resources/lprint-fr-strings.h000066400000000000000000000232571456151556700221300ustar00rootroot00000000000000/* static-resources/lprint-fr.strings */ static const char * const lprint_fr_strings = "\"New Custom Size\" = \"Nouvelle taille personnalisée\";\n" "\"media.na_index-3x5_3x5in\" = \"3 x 5\";\n" "\"media.na_index-4x6_4x6in\" = \"4 x 6 étiquette\";\n" "\"media.oe_1.25x0.25-label_1.25x0.25in\" = \"1-1/4 x 1/4\";\n" "\"media.oe_1.25x2.25-label_1.25x2.25in\" = \"1-1/4 x 2-1/4\";\n" "\"media.oe_1.5x0.25-label_1.5x0.25in\" = \"1-1/2 x 1/4\";\n" "\"media.oe_1.5x0.5-label_1.5x0.5in\" = \"1-1/2 x 1/2 étiquette\";\n" "\"media.oe_1.5x1-label_1.5x1in\" = \"1-1/2 x 1\";\n" "\"media.oe_1.5x2-label_1.5x2in\" = \"1-1/2 x 2\";\n" "\"media.oe_2-part-internet-postage-label_2.25x7.5in\" = \"2-1/4 x 7-1/2 Étiquette de publication Internet de 2 parties\";\n" "\"media.oe_2-up-address-label_2.25x3.5in\" = \"Étiquette d'adresse 2-1/4 x 3-1/2\";\n" "\"media.oe_2-up-file-folder-label_1.125x3.4375in\" = \"1-1/8 x 4-7/16 2-up File Folder Label\";\n" "\"media.oe_2.25x0.5-label_2.25x0.5in\" = \"2-1/4 x 1/2 étiquette\";\n" "\"media.oe_2.25x0.5-label_2.25xin\" = \"2-1/4 x 1/2 étiquette\";\n" "\"media.oe_2.25x1.25-label_2.25x1.25in\" = \"2-1/4 x 1-1/4\";\n" "\"media.oe_2.25x1.25-label_2.25xin\" = \"2-1/4 x 1-1/4\";\n" "\"media.oe_2.25x4-label_2.25x4in\" = \"2-1/4 x 4\";\n" "\"media.oe_2.25x5.5-label_2.25x5.5in\" = \"2-1/4 x 5-1/2\";\n" "\"media.oe_2.38x5.5-label_2.38x5.5in\" = \"2-3/8 x 5-1/2\";\n" "\"media.oe_2.5x1-label_2.5x1in\" = \"2-1/2 x 1 étiquette\";\n" "\"media.oe_2.5x2-label_2.5x2in\" = \"2-1/2 x 2\";\n" "\"media.oe_2.75x1.25-label_2.75x1.25in\" = \"2-3/4 x 1-1/4\";\n" "\"media.oe_2.9x1-label_2.9x1in\" = \"2.9 x 1 étiquette\";\n" "\"media.oe_2x0.37-label_2x0.37in\" = \"2 x 0,37\";\n" "\"media.oe_2x0.5-label_2x0.5in\" = \"2 x 1/2 étiquette\";\n" "\"media.oe_2x1-label_2x1in\" = \"2 x 1 étiquette\";\n" "\"media.oe_2x1.25-label_2x1.25in\" = \"2 x 1-1/4\";\n" "\"media.oe_2x2-label_2x2in\" = \"2 x 2\";\n" "\"media.oe_2x3-label_2x3in\" = \"2 x 3\";\n" "\"media.oe_2x4-label_2x4in\" = \"2 x 4\";\n" "\"media.oe_2x5.5-label_2x5.5in\" = \"2 x 5-1/2 étiquette\";\n" "\"media.oe_3-part-postage-label_2.25x7in\" = \"2-1/4 x 7 Étiquette d'affichage de 3 parties\";\n" "\"media.oe_3.25x2-label_3.25x2in\" = \"3-1/4 x 2\";\n" "\"media.oe_3.25x5-label_3.25x5in\" = \"3-1/4 x 5\";\n" "\"media.oe_3.25x5.5-label_3.25x5.5in\" = \"3-1/4 x 5-1/2\";\n" "\"media.oe_3.25x5.83-label_3.25x5.83in\" = \"3-1/4 x 5-13/16 Label\";\n" "\"media.oe_3.25x7.83-label_3.25x7.83in\" = \"3-1/4 x 7-13/16 Label\";\n" "\"media.oe_3.5x1-label_3.5x1in\" = \"3-1/2 x 1 étiquette\";\n" "\"media.oe_30859-paint-can-label_2.25x3.125in\" = \"2-1/4 x 3-1/8\";\n" "\"media.oe_3x1-label_3x1in\" = \"3 x 1 étiquette\";\n" "\"media.oe_3x1.25-label_3x1.25in\" = \"3 x 1-1/4\";\n" "\"media.oe_3x2-label_3x2in\" = \"3 x 2\";\n" "\"media.oe_3x3-label_3x3in\" = \"3 x 3\";\n" "\"media.oe_3x5-label_3x5in\" = \"3 x 5\";\n" "\"media.oe_4x1-label_4x1in\" = \"4 x 1 étiquette\";\n" "\"media.oe_4x13-label_4x13in\" = \"4 x 13\";\n" "\"media.oe_4x2-label_4x2in\" = \"4 x 2\";\n" "\"media.oe_4x3-label_4x3in\" = \"4 x 3\";\n" "\"media.oe_4x4-label_4x4in\" = \"4 x 4\";\n" "\"media.oe_4x5-label_4x5in\" = \"4 x 5\";\n" "\"media.oe_4x6-label_4x6in\" = \"4 x 6 étiquette\";\n" "\"media.oe_4x6.5-label_4x6.5in\" = \"4 x 6-1/2 étiquette\";\n" "\"media.oe_4x8-label_4x8in\" = \"4 x 8 étiquette\";\n" "\"media.oe_6x1-label_6x1in\" = \"6 x 1 étiquette\";\n" "\"media.oe_6x13-label_6x13in\" = \"6 x 13\";\n" "\"media.oe_6x2-label_6x2in\" = \"6 x 2\";\n" "\"media.oe_6x3-label_6x3in\" = \"6 x 3\";\n" "\"media.oe_6x4-label_6x4in\" = \"6 x 4\";\n" "\"media.oe_6x5-label_6x5in\" = \"6 x 5\";\n" "\"media.oe_6x6-label_6x6in\" = \"6 x 6\";\n" "\"media.oe_6x6.5-label_6x6.5in\" = \"6 x 6-1/2 étiquette\";\n" "\"media.oe_8x1-label_8x1in\" = \"8 x 1 étiquette\";\n" "\"media.oe_8x13-label_8x13in\" = \"8 x 13\";\n" "\"media.oe_8x2-label_8x2in\" = \"8 x 2\";\n" "\"media.oe_8x3-label_8x3in\" = \"8 x 3\";\n" "\"media.oe_8x4-label_8x4in\" = \"8 x 4\";\n" "\"media.oe_8x5-label_8x5in\" = \"8 x 5\";\n" "\"media.oe_8x6-label_8x6in\" = \"8 x 6 étiquette\";\n" "\"media.oe_8x6.5-label_8x6.5in\" = \"8 x 6-1/2 étiquette\";\n" "\"media.oe_address-label_1.125x3.5in\" = \"1-1/8 x 3-1/2 Adresse\";\n" "\"media.oe_barcode-label_0.75x2.5in\" = \"3/4 x 2-1/2 Barcode Label\";\n" "\"media.oe_book-spine-label_1x1.5in\" = \"1 x 1-1/2 Étiquette de la colonne\";\n" "\"media.oe_continuous-label_2.125x3600in\" = \"2-1/8 Continuous Label\";\n" "\"media.oe_dk1201-address_1.1x3.5in\" = \"DK1201 28 x 89mm\";\n" "\"media.oe_dk1202-shipping_2.4x3.9in\" = \"DK1202 61 x 99mm\";\n" "\"media.oe_dk1203-file-folder_0.66x3.4in\" = \"DK1203 17 x 86mm\";\n" "\"media.oe_dk1204-multi-purpose_0.66x2.1in\" = \"DK1204 17 x 53mm Label\";\n" "\"media.oe_dk1207-cd-dvd_2.2x2.2in\" = \"DK1207 CD/DVD 56mm Label\";\n" "\"media.oe_dk1208-large-address_1.4x3.5in\" = \"DK1208 36 x 89mm Grande étiquette d'adresse\";\n" "\"media.oe_dk1209-small-address_1.1x2.4in\" = \"DK1209 28 x 61mm Petite étiquette d'adresse\";\n" "\"media.oe_dk1219-round_0.47x0.47in\" = \"DK1219 Étiquette ronde de 12 mm\";\n" "\"media.oe_dk1240-large-multi-purpose_1.9x4in\" = \"DK1240 48 x 102mm Grande étiquette polyvalente\";\n" "\"media.oe_file-folder-label_0.5625x3.4375in\" = \"9/16 x 3-7/16 File Folder Label\";\n" "\"media.oe_hanging-file-tab-insert_0.5625x2in\" = \"9/16 x 2 Hanging File Tab Insert Label\";\n" "\"media.oe_internet-postage-confirmation-label_2.3125x10.5in\" = \"2-5/16 x 10-1/2 Internet Avis de confirmation\";\n" "\"media.oe_internet-postage-label_1.25x1.625in\" = \"1-1/4 x 1-5/8\";\n" "\"media.oe_internet-postage-label_2.3125x7in\" = \"2-3/8 x 7\";\n" "\"media.oe_lg-address-label_1.4x3.5in\" = \"1-4/10 x 3-1/2 Large Address Label\";\n" "\"media.oe_lg-multipurpose-label_2.125x.75in\" = \"2-1/8 x 3/4 Grande étiquette polyvalente\";\n" "\"media.oe_library-barcode-label_0.5x1.875in\" = \"1/2 x 1-7/8 Bibliothèque Barcode Label\";\n" "\"media.oe_md-appointment-card_2x3.5in\" = \"2 x 3-1/2 Carte de nomination moyenne\";\n" "\"media.oe_md-multipurpose-label_2.25x1.25in\" = \"2-1/4 x 1/1/4\";\n" "\"media.oe_media-label_2.25x2.25in\" = \"2-1/4 x 2-1/4 Médias Label\";\n" "\"media.oe_medium-1in-tape_0.5x1in\" = \"1/2 x 1\";\n" "\"media.oe_medium-2in-tape_0.5x2in\" = \"1/2 x 2\";\n" "\"media.oe_medium-3in-tape_0.5x3in\" = \"1/2 x 3\";\n" "\"media.oe_multipurpose-label_2x2.3125in\" = \"2 x 2-5/16 Étiquette polyvalente\";\n" "\"media.oe_name-badge-label_2.25x4in\" = \"2-1/4 x 4 Nom Badge Label\";\n" "\"media.oe_price-tag-label_0.9375x0.875in\" = \"15/16 x 7/8 Prix Tag Label\";\n" "\"media.oe_return-address-label_0.75x2in\" = \"3/4 x 2\";\n" "\"media.oe_shipping-label_2.125x4in\" = \"2-1/8 x 4 étiquette d'expédition\";\n" "\"media.oe_shipping-label_2.3125x4in\" = \"2-5/16 x 4 étiquette d'expédition\";\n" "\"media.oe_sm-multipurpose-label_1x2.125in\" = \"1 x 2-1/8 Petite étiquette polyvalente\";\n" "\"media.oe_square-multipurpose-label_1x1in\" = \"1 Étiquette polyvalente carrée\";\n" "\"media.oe_thin-1in-tape_0.25x1in\" = \"1/4 x 1 robinet\";\n" "\"media.oe_thin-2in-tape_0.25x2in\" = \"1/4 x 2\";\n" "\"media.oe_thin-3in-tape_0.25x3in\" = \"1/4 x 3\";\n" "\"media.oe_thin-multipurpose-label_0.375x2.8125in\" = \"3/8 x 2-13/16 Étiquette polyvalente\";\n" "\"media.oe_thinner-1in-tape_0.375x1in\" = \"3/8 x 1 Tape\";\n" "\"media.oe_thinner-2in-tape_0.375x2in\" = \"3/8 x 2\";\n" "\"media.oe_thinner-3in-tape_0.375x3in\" = \"3/8 x 3 Tape\";\n" "\"media.oe_video-spine-label_0.75x5.875in\" = \"3/4 x 5-7/8 Video Spine Label\";\n" "\"media.oe_video-top-label_1.8x3.1in\" = \"1.8 x 3.1 Étiquette supérieure vidéo\";\n" "\"media.oe_wide-1in-tape_1x1in\" = \"1 x 1\";\n" "\"media.oe_wide-2in-tape_1x2in\" = \"1 x 2\";\n" "\"media.oe_wide-3in-tape_1x3in\" = \"1 x 3\";\n" "\"media.oe_wider-1in-tape_0.75x1in\" = \"3/4 x 1 Tape\";\n" "\"media.oe_wider-2in-tape_0.75x2in\" = \"3/4 x 2\";\n" "\"media.oe_wider-3in-tape_0.75x3in\" = \"3/4 x 3\";\n" "\"media.om_35mm-slide_9x37mm\" = \"Label de glissement de 35 mm\";\n" "\"media.om_4-part-label_48x96mm\" = \"48 x 96mm Label de 4 parties\";\n" "\"media.om_8mm-spine_9x66mm\" = \"Étiquette de 8 mm\";\n" "\"media.om_address-large_35x83mm\" = \"35 x 83mm Grande étiquette d'adresse\";\n" "\"media.om_address-small_24x83mm\" = \"24 x 83mm Petite étiquette d'adresse\";\n" "\"media.om_cut-hanging-13_32x78mm\" = \"32 x 78mm 1/3 Cut Hanging File Folder Label\";\n" "\"media.om_cut-hanging-15_32x40mm\" = \"32 x 40mm 1/5 Couper Hanging File Folder Label\";\n" "\"media.om_diskette_48x64mm\" = \"étiquette de disquette 48 x 64 mm\";\n" "\"media.om_euro-file-folder_39x49mm\" = \"39 x 49mm Euro File Folder Label\";\n" "\"media.om_euro-folder-narrow_38x186mm\" = \"38 x 186mm Euro Narrow File Folder Label\";\n" "\"media.om_euro-folder-wide_48x186mm\" = \"48 x 186mm Euro Wide File Folder Label\";\n" "\"media.om_euro-name-badge-large_48x79mm\" = \"48 x 79mm Euro Large Nom Badge Label\";\n" "\"media.om_euro-name-badge_38x67mm\" = \"38 x 67mm Euro Nom Badge Label\";\n" "\"media.om_file-folder_13x81mm\" = \"13 x 81mm File Folder Label\";\n" "\"media.om_jewelry_27x48mm\" = \"27 x 48mm Jewelry Label\";\n" "\"media.om_media-badge_48x64mm\" = \"48 x 64mm Médias Badge Label\";\n" "\"media.om_multi-purpose_24x44mm\" = \"24 x 44 mm polyvalent Label\";\n" "\"media.om_retail-label_32x37mm\" = \"32 x 37mm Label de détail\";\n" "\"media.om_return_16x43mm\" = \"16 x 43mm Return Label\";\n" "\"media.om_round_22x24mm\" = \"Étiquette ronde de 22 mm\";\n" "\"media.om_shipping_48x96mm\" = \"étiquette d'expédition 48 x 96mm\";\n" "\"media.om_top-coated-paper_48x140mm\" = \"48 x 140mm Top Coated Paper\";\n" "\"media.om_vhs-face_45x72mm\" = \"45 x 72mm VHS Face Label\";\n" "\"media.om_vhs-spine_18x141mm\" = \"18 x 141mm VHS Spine Label\";\n" "\"media.om_zip-disk_48x55mm\" = \"étiquette de disque zip 48 x 55mm\";\n" ; lprint-1.3.1/static-resources/lprint-fr.strings000066400000000000000000000207261456151556700217010ustar00rootroot00000000000000"New Custom Size" = "Nouvelle taille personnalisée"; "media.na_index-3x5_3x5in" = "3 x 5"; "media.na_index-4x6_4x6in" = "4 x 6 étiquette"; "media.oe_1.25x0.25-label_1.25x0.25in" = "1-1/4 x 1/4"; "media.oe_1.25x2.25-label_1.25x2.25in" = "1-1/4 x 2-1/4"; "media.oe_1.5x0.25-label_1.5x0.25in" = "1-1/2 x 1/4"; "media.oe_1.5x0.5-label_1.5x0.5in" = "1-1/2 x 1/2 étiquette"; "media.oe_1.5x1-label_1.5x1in" = "1-1/2 x 1"; "media.oe_1.5x2-label_1.5x2in" = "1-1/2 x 2"; "media.oe_2-part-internet-postage-label_2.25x7.5in" = "2-1/4 x 7-1/2 Étiquette de publication Internet de 2 parties"; "media.oe_2-up-address-label_2.25x3.5in" = "Étiquette d'adresse 2-1/4 x 3-1/2"; "media.oe_2-up-file-folder-label_1.125x3.4375in" = "1-1/8 x 4-7/16 2-up File Folder Label"; "media.oe_2.25x0.5-label_2.25x0.5in" = "2-1/4 x 1/2 étiquette"; "media.oe_2.25x0.5-label_2.25xin" = "2-1/4 x 1/2 étiquette"; "media.oe_2.25x1.25-label_2.25x1.25in" = "2-1/4 x 1-1/4"; "media.oe_2.25x1.25-label_2.25xin" = "2-1/4 x 1-1/4"; "media.oe_2.25x4-label_2.25x4in" = "2-1/4 x 4"; "media.oe_2.25x5.5-label_2.25x5.5in" = "2-1/4 x 5-1/2"; "media.oe_2.38x5.5-label_2.38x5.5in" = "2-3/8 x 5-1/2"; "media.oe_2.5x1-label_2.5x1in" = "2-1/2 x 1 étiquette"; "media.oe_2.5x2-label_2.5x2in" = "2-1/2 x 2"; "media.oe_2.75x1.25-label_2.75x1.25in" = "2-3/4 x 1-1/4"; "media.oe_2.9x1-label_2.9x1in" = "2.9 x 1 étiquette"; "media.oe_2x0.37-label_2x0.37in" = "2 x 0,37"; "media.oe_2x0.5-label_2x0.5in" = "2 x 1/2 étiquette"; "media.oe_2x1-label_2x1in" = "2 x 1 étiquette"; "media.oe_2x1.25-label_2x1.25in" = "2 x 1-1/4"; "media.oe_2x2-label_2x2in" = "2 x 2"; "media.oe_2x3-label_2x3in" = "2 x 3"; "media.oe_2x4-label_2x4in" = "2 x 4"; "media.oe_2x5.5-label_2x5.5in" = "2 x 5-1/2 étiquette"; "media.oe_3-part-postage-label_2.25x7in" = "2-1/4 x 7 Étiquette d'affichage de 3 parties"; "media.oe_3.25x2-label_3.25x2in" = "3-1/4 x 2"; "media.oe_3.25x5-label_3.25x5in" = "3-1/4 x 5"; "media.oe_3.25x5.5-label_3.25x5.5in" = "3-1/4 x 5-1/2"; "media.oe_3.25x5.83-label_3.25x5.83in" = "3-1/4 x 5-13/16 Label"; "media.oe_3.25x7.83-label_3.25x7.83in" = "3-1/4 x 7-13/16 Label"; "media.oe_3.5x1-label_3.5x1in" = "3-1/2 x 1 étiquette"; "media.oe_30859-paint-can-label_2.25x3.125in" = "2-1/4 x 3-1/8"; "media.oe_3x1-label_3x1in" = "3 x 1 étiquette"; "media.oe_3x1.25-label_3x1.25in" = "3 x 1-1/4"; "media.oe_3x2-label_3x2in" = "3 x 2"; "media.oe_3x3-label_3x3in" = "3 x 3"; "media.oe_3x5-label_3x5in" = "3 x 5"; "media.oe_4x1-label_4x1in" = "4 x 1 étiquette"; "media.oe_4x13-label_4x13in" = "4 x 13"; "media.oe_4x2-label_4x2in" = "4 x 2"; "media.oe_4x3-label_4x3in" = "4 x 3"; "media.oe_4x4-label_4x4in" = "4 x 4"; "media.oe_4x5-label_4x5in" = "4 x 5"; "media.oe_4x6-label_4x6in" = "4 x 6 étiquette"; "media.oe_4x6.5-label_4x6.5in" = "4 x 6-1/2 étiquette"; "media.oe_4x8-label_4x8in" = "4 x 8 étiquette"; "media.oe_6x1-label_6x1in" = "6 x 1 étiquette"; "media.oe_6x13-label_6x13in" = "6 x 13"; "media.oe_6x2-label_6x2in" = "6 x 2"; "media.oe_6x3-label_6x3in" = "6 x 3"; "media.oe_6x4-label_6x4in" = "6 x 4"; "media.oe_6x5-label_6x5in" = "6 x 5"; "media.oe_6x6-label_6x6in" = "6 x 6"; "media.oe_6x6.5-label_6x6.5in" = "6 x 6-1/2 étiquette"; "media.oe_8x1-label_8x1in" = "8 x 1 étiquette"; "media.oe_8x13-label_8x13in" = "8 x 13"; "media.oe_8x2-label_8x2in" = "8 x 2"; "media.oe_8x3-label_8x3in" = "8 x 3"; "media.oe_8x4-label_8x4in" = "8 x 4"; "media.oe_8x5-label_8x5in" = "8 x 5"; "media.oe_8x6-label_8x6in" = "8 x 6 étiquette"; "media.oe_8x6.5-label_8x6.5in" = "8 x 6-1/2 étiquette"; "media.oe_address-label_1.125x3.5in" = "1-1/8 x 3-1/2 Adresse"; "media.oe_barcode-label_0.75x2.5in" = "3/4 x 2-1/2 Barcode Label"; "media.oe_book-spine-label_1x1.5in" = "1 x 1-1/2 Étiquette de la colonne"; "media.oe_continuous-label_2.125x3600in" = "2-1/8 Continuous Label"; "media.oe_dk1201-address_1.1x3.5in" = "DK1201 28 x 89mm"; "media.oe_dk1202-shipping_2.4x3.9in" = "DK1202 61 x 99mm"; "media.oe_dk1203-file-folder_0.66x3.4in" = "DK1203 17 x 86mm"; "media.oe_dk1204-multi-purpose_0.66x2.1in" = "DK1204 17 x 53mm Label"; "media.oe_dk1207-cd-dvd_2.2x2.2in" = "DK1207 CD/DVD 56mm Label"; "media.oe_dk1208-large-address_1.4x3.5in" = "DK1208 36 x 89mm Grande étiquette d'adresse"; "media.oe_dk1209-small-address_1.1x2.4in" = "DK1209 28 x 61mm Petite étiquette d'adresse"; "media.oe_dk1219-round_0.47x0.47in" = "DK1219 Étiquette ronde de 12 mm"; "media.oe_dk1240-large-multi-purpose_1.9x4in" = "DK1240 48 x 102mm Grande étiquette polyvalente"; "media.oe_file-folder-label_0.5625x3.4375in" = "9/16 x 3-7/16 File Folder Label"; "media.oe_hanging-file-tab-insert_0.5625x2in" = "9/16 x 2 Hanging File Tab Insert Label"; "media.oe_internet-postage-confirmation-label_2.3125x10.5in" = "2-5/16 x 10-1/2 Internet Avis de confirmation"; "media.oe_internet-postage-label_1.25x1.625in" = "1-1/4 x 1-5/8"; "media.oe_internet-postage-label_2.3125x7in" = "2-3/8 x 7"; "media.oe_lg-address-label_1.4x3.5in" = "1-4/10 x 3-1/2 Large Address Label"; "media.oe_lg-multipurpose-label_2.125x.75in" = "2-1/8 x 3/4 Grande étiquette polyvalente"; "media.oe_library-barcode-label_0.5x1.875in" = "1/2 x 1-7/8 Bibliothèque Barcode Label"; "media.oe_md-appointment-card_2x3.5in" = "2 x 3-1/2 Carte de nomination moyenne"; "media.oe_md-multipurpose-label_2.25x1.25in" = "2-1/4 x 1/1/4"; "media.oe_media-label_2.25x2.25in" = "2-1/4 x 2-1/4 Médias Label"; "media.oe_medium-1in-tape_0.5x1in" = "1/2 x 1"; "media.oe_medium-2in-tape_0.5x2in" = "1/2 x 2"; "media.oe_medium-3in-tape_0.5x3in" = "1/2 x 3"; "media.oe_multipurpose-label_2x2.3125in" = "2 x 2-5/16 Étiquette polyvalente"; "media.oe_name-badge-label_2.25x4in" = "2-1/4 x 4 Nom Badge Label"; "media.oe_price-tag-label_0.9375x0.875in" = "15/16 x 7/8 Prix Tag Label"; "media.oe_return-address-label_0.75x2in" = "3/4 x 2"; "media.oe_shipping-label_2.125x4in" = "2-1/8 x 4 étiquette d'expédition"; "media.oe_shipping-label_2.3125x4in" = "2-5/16 x 4 étiquette d'expédition"; "media.oe_sm-multipurpose-label_1x2.125in" = "1 x 2-1/8 Petite étiquette polyvalente"; "media.oe_square-multipurpose-label_1x1in" = "1 Étiquette polyvalente carrée"; "media.oe_thin-1in-tape_0.25x1in" = "1/4 x 1 robinet"; "media.oe_thin-2in-tape_0.25x2in" = "1/4 x 2"; "media.oe_thin-3in-tape_0.25x3in" = "1/4 x 3"; "media.oe_thin-multipurpose-label_0.375x2.8125in" = "3/8 x 2-13/16 Étiquette polyvalente"; "media.oe_thinner-1in-tape_0.375x1in" = "3/8 x 1 Tape"; "media.oe_thinner-2in-tape_0.375x2in" = "3/8 x 2"; "media.oe_thinner-3in-tape_0.375x3in" = "3/8 x 3 Tape"; "media.oe_video-spine-label_0.75x5.875in" = "3/4 x 5-7/8 Video Spine Label"; "media.oe_video-top-label_1.8x3.1in" = "1.8 x 3.1 Étiquette supérieure vidéo"; "media.oe_wide-1in-tape_1x1in" = "1 x 1"; "media.oe_wide-2in-tape_1x2in" = "1 x 2"; "media.oe_wide-3in-tape_1x3in" = "1 x 3"; "media.oe_wider-1in-tape_0.75x1in" = "3/4 x 1 Tape"; "media.oe_wider-2in-tape_0.75x2in" = "3/4 x 2"; "media.oe_wider-3in-tape_0.75x3in" = "3/4 x 3"; "media.om_35mm-slide_9x37mm" = "Label de glissement de 35 mm"; "media.om_4-part-label_48x96mm" = "48 x 96mm Label de 4 parties"; "media.om_8mm-spine_9x66mm" = "Étiquette de 8 mm"; "media.om_address-large_35x83mm" = "35 x 83mm Grande étiquette d'adresse"; "media.om_address-small_24x83mm" = "24 x 83mm Petite étiquette d'adresse"; "media.om_cut-hanging-13_32x78mm" = "32 x 78mm 1/3 Cut Hanging File Folder Label"; "media.om_cut-hanging-15_32x40mm" = "32 x 40mm 1/5 Couper Hanging File Folder Label"; "media.om_diskette_48x64mm" = "étiquette de disquette 48 x 64 mm"; "media.om_euro-file-folder_39x49mm" = "39 x 49mm Euro File Folder Label"; "media.om_euro-folder-narrow_38x186mm" = "38 x 186mm Euro Narrow File Folder Label"; "media.om_euro-folder-wide_48x186mm" = "48 x 186mm Euro Wide File Folder Label"; "media.om_euro-name-badge-large_48x79mm" = "48 x 79mm Euro Large Nom Badge Label"; "media.om_euro-name-badge_38x67mm" = "38 x 67mm Euro Nom Badge Label"; "media.om_file-folder_13x81mm" = "13 x 81mm File Folder Label"; "media.om_jewelry_27x48mm" = "27 x 48mm Jewelry Label"; "media.om_media-badge_48x64mm" = "48 x 64mm Médias Badge Label"; "media.om_multi-purpose_24x44mm" = "24 x 44 mm polyvalent Label"; "media.om_retail-label_32x37mm" = "32 x 37mm Label de détail"; "media.om_return_16x43mm" = "16 x 43mm Return Label"; "media.om_round_22x24mm" = "Étiquette ronde de 22 mm"; "media.om_shipping_48x96mm" = "étiquette d'expédition 48 x 96mm"; "media.om_top-coated-paper_48x140mm" = "48 x 140mm Top Coated Paper"; "media.om_vhs-face_45x72mm" = "45 x 72mm VHS Face Label"; "media.om_vhs-spine_18x141mm" = "18 x 141mm VHS Spine Label"; "media.om_zip-disk_48x55mm" = "étiquette de disque zip 48 x 55mm"; lprint-1.3.1/static-resources/lprint-it-strings.h000066400000000000000000000250131456151556700221250ustar00rootroot00000000000000/* static-resources/lprint-it.strings */ static const char * const lprint_it_strings = "\"New Custom Size\" = \"Nuova dimensione personalizzata\";\n" "\"media.na_index-3x5_3x5in\" = \"3 x 5 etichetta\";\n" "\"media.na_index-4x6_4x6in\" = \"4 x 6 etichetta\";\n" "\"media.oe_1.25x0.25-label_1.25x0.25in\" = \"1-1/4 x 1/4 Etichetta\";\n" "\"media.oe_1.25x2.25-label_1.25x2.25in\" = \"1-1/4 x 2-1/4\";\n" "\"media.oe_1.5x0.25-label_1.5x0.25in\" = \"1-1/2 x 1/4 Etichetta\";\n" "\"media.oe_1.5x0.5-label_1.5x0.5in\" = \"1-1/2 x 1/2 etichetta\";\n" "\"media.oe_1.5x1-label_1.5x1in\" = \"1-1/2 x 1 etichetta\";\n" "\"media.oe_1.5x2-label_1.5x2in\" = \"1-1/2 x 2 etichetta\";\n" "\"media.oe_2-part-internet-postage-label_2.25x7.5in\" = \"2-1/4 x 7-1/2 Etichetta di Postage Internet 2 pezzi\";\n" "\"media.oe_2-up-address-label_2.25x3.5in\" = \"Etichetta di indirizzo 2-1/4 x 3-1/2\";\n" "\"media.oe_2-up-file-folder-label_1.125x3.4375in\" = \"1-1/8 x 4-7/16 2-up Etichetta cartella file\";\n" "\"media.oe_2.25x0.5-label_2.25x0.5in\" = \"2-1/4 x 1/2 etichetta\";\n" "\"media.oe_2.25x0.5-label_2.25xin\" = \"2-1/4 x 1/2 etichetta\";\n" "\"media.oe_2.25x1.25-label_2.25x1.25in\" = \"Etichetta 2-1/4 x 1-1/4\";\n" "\"media.oe_2.25x1.25-label_2.25xin\" = \"Etichetta 2-1/4 x 1-1/4\";\n" "\"media.oe_2.25x4-label_2.25x4in\" = \"2-1/4 x 4 etichetta\";\n" "\"media.oe_2.25x5.5-label_2.25x5.5in\" = \"2-1/4 x 5-1/2 etichetta\";\n" "\"media.oe_2.38x5.5-label_2.38x5.5in\" = \"2-3/8 x 5-1/2 etichetta\";\n" "\"media.oe_2.5x1-label_2.5x1in\" = \"2-1/2 x 1 etichetta\";\n" "\"media.oe_2.5x2-label_2.5x2in\" = \"2-1/2 x 2 etichetta\";\n" "\"media.oe_2.75x1.25-label_2.75x1.25in\" = \"2-3/4 x 1-1/4 etichetta\";\n" "\"media.oe_2.9x1-label_2.9x1in\" = \"2.9 x 1 etichetta\";\n" "\"media.oe_2x0.37-label_2x0.37in\" = \"2 x 0.37 Etichetta\";\n" "\"media.oe_2x0.5-label_2x0.5in\" = \"2 x 1/2 etichetta\";\n" "\"media.oe_2x1-label_2x1in\" = \"2 x 1 etichetta\";\n" "\"media.oe_2x1.25-label_2x1.25in\" = \"2 x 1-1/4 Etichetta\";\n" "\"media.oe_2x2-label_2x2in\" = \"2 x 2 etichetta\";\n" "\"media.oe_2x3-label_2x3in\" = \"2 x 3 etichetta\";\n" "\"media.oe_2x4-label_2x4in\" = \"2 x 4 etichetta\";\n" "\"media.oe_2x5.5-label_2x5.5in\" = \"2 x 5-1 / 2\";\n" "\"media.oe_3-part-postage-label_2.25x7in\" = \"Etichetta di Postage 2-1/4 x 7\";\n" "\"media.oe_3.25x2-label_3.25x2in\" = \"3-1/4 x 2 etichetta\";\n" "\"media.oe_3.25x5-label_3.25x5in\" = \"3-1/4 x 5 etichetta\";\n" "\"media.oe_3.25x5.5-label_3.25x5.5in\" = \"3-1/4 x 5-1/2 etichetta\";\n" "\"media.oe_3.25x5.83-label_3.25x5.83in\" = \"3-1/4 x 5-13/16 Etichetta\";\n" "\"media.oe_3.25x7.83-label_3.25x7.83in\" = \"3-1/4 x 7-13/16 Etichetta\";\n" "\"media.oe_3.5x1-label_3.5x1in\" = \"3-1/2 x 1 etichetta\";\n" "\"media.oe_30859-paint-can-label_2.25x3.125in\" = \"2-1/4 x 3-1/8 di vernice\";\n" "\"media.oe_3x1-label_3x1in\" = \"3 x 1 etichetta\";\n" "\"media.oe_3x1.25-label_3x1.25in\" = \"3 x 1-1/4 Etichetta\";\n" "\"media.oe_3x2-label_3x2in\" = \"3 x 2 etichetta\";\n" "\"media.oe_3x3-label_3x3in\" = \"3 x 3 etichette\";\n" "\"media.oe_3x5-label_3x5in\" = \"3 x 5 etichetta\";\n" "\"media.oe_4x1-label_4x1in\" = \"4 x 1 etichetta\";\n" "\"media.oe_4x13-label_4x13in\" = \"4 x 13 etichetta\";\n" "\"media.oe_4x2-label_4x2in\" = \"4 x 2 etichetta\";\n" "\"media.oe_4x3-label_4x3in\" = \"4 x 3 etichette\";\n" "\"media.oe_4x4-label_4x4in\" = \"4 x 4 etichetta\";\n" "\"media.oe_4x5-label_4x5in\" = \"4 x 5 etichetta\";\n" "\"media.oe_4x6-label_4x6in\" = \"4 x 6 etichetta\";\n" "\"media.oe_4x6.5-label_4x6.5in\" = \"4 x 6-1 / 2\";\n" "\"media.oe_4x8-label_4x8in\" = \"4 x 8 etichetta\";\n" "\"media.oe_6x1-label_6x1in\" = \"6 x 1 etichetta\";\n" "\"media.oe_6x13-label_6x13in\" = \"6 x 13 etichetta\";\n" "\"media.oe_6x2-label_6x2in\" = \"6 x 2 etichetta\";\n" "\"media.oe_6x3-label_6x3in\" = \"6 x 3 etichetta\";\n" "\"media.oe_6x4-label_6x4in\" = \"6 x 4 etichetta\";\n" "\"media.oe_6x5-label_6x5in\" = \"6 x 5 etichetta\";\n" "\"media.oe_6x6-label_6x6in\" = \"6 x 6 etichetta\";\n" "\"media.oe_6x6.5-label_6x6.5in\" = \"6 x 6-1 / 2\";\n" "\"media.oe_8x1-label_8x1in\" = \"8 x 1 etichetta\";\n" "\"media.oe_8x13-label_8x13in\" = \"8 x 13 Etichetta\";\n" "\"media.oe_8x2-label_8x2in\" = \"8 x 2 etichetta\";\n" "\"media.oe_8x3-label_8x3in\" = \"8 x 3 etichette\";\n" "\"media.oe_8x4-label_8x4in\" = \"8 x 4 etichetta\";\n" "\"media.oe_8x5-label_8x5in\" = \"8 x 5 etichetta\";\n" "\"media.oe_8x6-label_8x6in\" = \"8 x 6 etichetta\";\n" "\"media.oe_8x6.5-label_8x6.5in\" = \"8 x 6-1 / 2\";\n" "\"media.oe_address-label_1.125x3.5in\" = \"1-1/8 x 3-1/2 Etichetta di indirizzo\";\n" "\"media.oe_barcode-label_0.75x2.5in\" = \"3/4 x 2-1/2 Etichetta di codici a barre\";\n" "\"media.oe_book-spine-label_1x1.5in\" = \"1 x 1-1/2 Libro Spina Etichetta\";\n" "\"media.oe_continuous-label_2.125x3600in\" = \"Etichetta continua 2-1/8\";\n" "\"media.oe_dk1201-address_1.1x3.5in\" = \"DK1201 28 x 89mm Indirizzo etichetta\";\n" "\"media.oe_dk1202-shipping_2.4x3.9in\" = \"DK1202 61 x 99mm Etichetta di spedizione\";\n" "\"media.oe_dk1203-file-folder_0.66x3.4in\" = \"DK1203 17 x 86mm Etichetta della cartella di file\";\n" "\"media.oe_dk1204-multi-purpose_0.66x2.1in\" = \"DK1204 17 x 53mm Multiuso Etichetta\";\n" "\"media.oe_dk1207-cd-dvd_2.2x2.2in\" = \"DK1207 56mm CD/DVD Etichetta\";\n" "\"media.oe_dk1208-large-address_1.4x3.5in\" = \"DK1208 36 x 89mm Grande etichetta di indirizzo\";\n" "\"media.oe_dk1209-small-address_1.1x2.4in\" = \"DK1209 28 x 61mm Piccolo indirizzo etichetta\";\n" "\"media.oe_dk1219-round_0.47x0.47in\" = \"Etichetta rotonda DK1219 12mm\";\n" "\"media.oe_dk1240-large-multi-purpose_1.9x4in\" = \"DK1240 48 x 102mm Grande etichetta multiuso\";\n" "\"media.oe_file-folder-label_0.5625x3.4375in\" = \"9/16 x 3-7 Etichetta cartella file\";\n" "\"media.oe_hanging-file-tab-insert_0.5625x2in\" = \"9/16 x 2 Etichetta di inserimento della scheda di file appeso\";\n" "\"media.oe_internet-postage-confirmation-label_2.3125x10.5in\" = \"2-5/16 x 10-1/2 Etichetta di conferma della posta\";\n" "\"media.oe_internet-postage-label_1.25x1.625in\" = \"Etichetta di posta elettronica 1-1/4 x 1-5/8\";\n" "\"media.oe_internet-postage-label_2.3125x7in\" = \"2-3/8 x 7 Etichetta di posta elettronica\";\n" "\"media.oe_lg-address-label_1.4x3.5in\" = \"1-4/10 x 3-1 Grande etichetta di indirizzo\";\n" "\"media.oe_lg-multipurpose-label_2.125x.75in\" = \"2-1/8 x 3/4 Grande etichetta multiuso\";\n" "\"media.oe_library-barcode-label_0.5x1.875in\" = \"1/2 x 1-7/8 Biblioteca codice a barre etichetta\";\n" "\"media.oe_md-appointment-card_2x3.5in\" = \"2 x 3-1/2 Carta media di nomina\";\n" "\"media.oe_md-multipurpose-label_2.25x1.25in\" = \"2-1/4 x 1/1/4 Etichetta multiuso media\";\n" "\"media.oe_media-label_2.25x2.25in\" = \"2-1/4 x 2-1/4 Media Etichetta\";\n" "\"media.oe_medium-1in-tape_0.5x1in\" = \"1/2 x 1 Nastro\";\n" "\"media.oe_medium-2in-tape_0.5x2in\" = \"1/2 x 2 Nastro\";\n" "\"media.oe_medium-3in-tape_0.5x3in\" = \"1/2 x 3 Nastro\";\n" "\"media.oe_multipurpose-label_2x2.3125in\" = \"2 x 2-5 Etichetta multiuso\";\n" "\"media.oe_name-badge-label_2.25x4in\" = \"2-1/4 x 4 nome Badge Label\";\n" "\"media.oe_price-tag-label_0.9375x0.875in\" = \"15/16 x 7/8 Prezzo Tag etichetta\";\n" "\"media.oe_return-address-label_0.75x2in\" = \"3/4 x 2 Etichetta di indirizzo di ritorno\";\n" "\"media.oe_shipping-label_2.125x4in\" = \"2-1/8 x 4 Etichetta di spedizione\";\n" "\"media.oe_shipping-label_2.3125x4in\" = \"2-5/16 x 4 Etichetta di spedizione\";\n" "\"media.oe_sm-multipurpose-label_1x2.125in\" = \"1 x 2-1/8 Piccola etichetta multiuso\";\n" "\"media.oe_square-multipurpose-label_1x1in\" = \"1 etichetta multiuso quadrato\";\n" "\"media.oe_thin-1in-tape_0.25x1in\" = \"1/4 x 1 Nastro\";\n" "\"media.oe_thin-2in-tape_0.25x2in\" = \"1/4 x 2 Nastro\";\n" "\"media.oe_thin-3in-tape_0.25x3in\" = \"1/4 x 3 Nastro\";\n" "\"media.oe_thin-multipurpose-label_0.375x2.8125in\" = \"3/8 x 2-13/16 Etichetta multiuso sottile\";\n" "\"media.oe_thinner-1in-tape_0.375x1in\" = \"3/8 x 1 Nastro\";\n" "\"media.oe_thinner-2in-tape_0.375x2in\" = \"3/8 x 2 Nastro\";\n" "\"media.oe_thinner-3in-tape_0.375x3in\" = \"3/8 x 3 Nastro\";\n" "\"media.oe_video-spine-label_0.75x5.875in\" = \"3/4 x 5-7/8 Etichetta di filatura video\";\n" "\"media.oe_video-top-label_1.8x3.1in\" = \"1,8 x 3.1 Video Top Label\";\n" "\"media.oe_wide-1in-tape_1x1in\" = \"1 x 1 Nastro\";\n" "\"media.oe_wide-2in-tape_1x2in\" = \"1 x 2 Nastro\";\n" "\"media.oe_wide-3in-tape_1x3in\" = \"1 x 3 Nastro\";\n" "\"media.oe_wider-1in-tape_0.75x1in\" = \"3/4 x 1 Nastro\";\n" "\"media.oe_wider-2in-tape_0.75x2in\" = \"3/4 x 2 Nastro\";\n" "\"media.oe_wider-3in-tape_0.75x3in\" = \"3/4 x 3 Nastro\";\n" "\"media.om_35mm-slide_9x37mm\" = \"Etichetta di scorrimento 35mm\";\n" "\"media.om_4-part-label_48x96mm\" = \"48 x 96mm Etichetta a 4 pezzi\";\n" "\"media.om_8mm-spine_9x66mm\" = \"Etichetta di filatura 8mm\";\n" "\"media.om_address-large_35x83mm\" = \"35 x 83 millimetri Etichetta di indirizzo grande\";\n" "\"media.om_address-small_24x83mm\" = \"24 x 83mm piccolo indirizzo etichetta\";\n" "\"media.om_cut-hanging-13_32x78mm\" = \"32 x 78mm 1/3 Etichetta della cartella di file sospesa di taglio\";\n" "\"media.om_cut-hanging-15_32x40mm\" = \"32 x 40mm 1/5 sospensione di taglio Etichetta cartella file\";\n" "\"media.om_diskette_48x64mm\" = \"48 x 64 millimetri etichetta di Diskette\";\n" "\"media.om_euro-file-folder_39x49mm\" = \"39 x 49mm Euro File Folder Etichetta\";\n" "\"media.om_euro-folder-narrow_38x186mm\" = \"38 x 186mm Etichetta pieghevole Euro Narrow File\";\n" "\"media.om_euro-folder-wide_48x186mm\" = \"48 x 186mm Etichetta pieghevole Euro Wide File\";\n" "\"media.om_euro-name-badge-large_48x79mm\" = \"48 x 79 mm Euro Grande Nome etichetta Badge\";\n" "\"media.om_euro-name-badge_38x67mm\" = \"38 x 67 mm Euro Nome etichetta Badge\";\n" "\"media.om_file-folder_13x81mm\" = \"13 x 81mm Etichetta cartella file\";\n" "\"media.om_jewelry_27x48mm\" = \"Etichetta di gioielli da 27 x 48 mm\";\n" "\"media.om_media-badge_48x64mm\" = \"48 x 64 mm Media Badge Label\";\n" "\"media.om_multi-purpose_24x44mm\" = \"24 x 44 millimetri multiuso Etichetta\";\n" "\"media.om_retail-label_32x37mm\" = \"32 x 37 mm Etichetta di vendita al dettaglio\";\n" "\"media.om_return_16x43mm\" = \"16 x 43 mm Etichetta di ritorno\";\n" "\"media.om_round_22x24mm\" = \"Etichetta rotonda 22mm\";\n" "\"media.om_shipping_48x96mm\" = \"48 x 96mm Etichetta di spedizione\";\n" "\"media.om_top-coated-paper_48x140mm\" = \"48 x 140mm Carta rivestita superiore\";\n" "\"media.om_vhs-face_45x72mm\" = \"45 x 72 millimetri VHS Face Label\";\n" "\"media.om_vhs-spine_18x141mm\" = \"18 x 141mm VHS Spina Etichetta\";\n" "\"media.om_zip-disk_48x55mm\" = \"48 x 55mm Zip Disk Etichetta\";\n" ; lprint-1.3.1/static-resources/lprint-it.strings000066400000000000000000000224621456151556700217050ustar00rootroot00000000000000"New Custom Size" = "Nuova dimensione personalizzata"; "media.na_index-3x5_3x5in" = "3 x 5 etichetta"; "media.na_index-4x6_4x6in" = "4 x 6 etichetta"; "media.oe_1.25x0.25-label_1.25x0.25in" = "1-1/4 x 1/4 Etichetta"; "media.oe_1.25x2.25-label_1.25x2.25in" = "1-1/4 x 2-1/4"; "media.oe_1.5x0.25-label_1.5x0.25in" = "1-1/2 x 1/4 Etichetta"; "media.oe_1.5x0.5-label_1.5x0.5in" = "1-1/2 x 1/2 etichetta"; "media.oe_1.5x1-label_1.5x1in" = "1-1/2 x 1 etichetta"; "media.oe_1.5x2-label_1.5x2in" = "1-1/2 x 2 etichetta"; "media.oe_2-part-internet-postage-label_2.25x7.5in" = "2-1/4 x 7-1/2 Etichetta di Postage Internet 2 pezzi"; "media.oe_2-up-address-label_2.25x3.5in" = "Etichetta di indirizzo 2-1/4 x 3-1/2"; "media.oe_2-up-file-folder-label_1.125x3.4375in" = "1-1/8 x 4-7/16 2-up Etichetta cartella file"; "media.oe_2.25x0.5-label_2.25x0.5in" = "2-1/4 x 1/2 etichetta"; "media.oe_2.25x0.5-label_2.25xin" = "2-1/4 x 1/2 etichetta"; "media.oe_2.25x1.25-label_2.25x1.25in" = "Etichetta 2-1/4 x 1-1/4"; "media.oe_2.25x1.25-label_2.25xin" = "Etichetta 2-1/4 x 1-1/4"; "media.oe_2.25x4-label_2.25x4in" = "2-1/4 x 4 etichetta"; "media.oe_2.25x5.5-label_2.25x5.5in" = "2-1/4 x 5-1/2 etichetta"; "media.oe_2.38x5.5-label_2.38x5.5in" = "2-3/8 x 5-1/2 etichetta"; "media.oe_2.5x1-label_2.5x1in" = "2-1/2 x 1 etichetta"; "media.oe_2.5x2-label_2.5x2in" = "2-1/2 x 2 etichetta"; "media.oe_2.75x1.25-label_2.75x1.25in" = "2-3/4 x 1-1/4 etichetta"; "media.oe_2.9x1-label_2.9x1in" = "2.9 x 1 etichetta"; "media.oe_2x0.37-label_2x0.37in" = "2 x 0.37 Etichetta"; "media.oe_2x0.5-label_2x0.5in" = "2 x 1/2 etichetta"; "media.oe_2x1-label_2x1in" = "2 x 1 etichetta"; "media.oe_2x1.25-label_2x1.25in" = "2 x 1-1/4 Etichetta"; "media.oe_2x2-label_2x2in" = "2 x 2 etichetta"; "media.oe_2x3-label_2x3in" = "2 x 3 etichetta"; "media.oe_2x4-label_2x4in" = "2 x 4 etichetta"; "media.oe_2x5.5-label_2x5.5in" = "2 x 5-1 / 2"; "media.oe_3-part-postage-label_2.25x7in" = "Etichetta di Postage 2-1/4 x 7"; "media.oe_3.25x2-label_3.25x2in" = "3-1/4 x 2 etichetta"; "media.oe_3.25x5-label_3.25x5in" = "3-1/4 x 5 etichetta"; "media.oe_3.25x5.5-label_3.25x5.5in" = "3-1/4 x 5-1/2 etichetta"; "media.oe_3.25x5.83-label_3.25x5.83in" = "3-1/4 x 5-13/16 Etichetta"; "media.oe_3.25x7.83-label_3.25x7.83in" = "3-1/4 x 7-13/16 Etichetta"; "media.oe_3.5x1-label_3.5x1in" = "3-1/2 x 1 etichetta"; "media.oe_30859-paint-can-label_2.25x3.125in" = "2-1/4 x 3-1/8 di vernice"; "media.oe_3x1-label_3x1in" = "3 x 1 etichetta"; "media.oe_3x1.25-label_3x1.25in" = "3 x 1-1/4 Etichetta"; "media.oe_3x2-label_3x2in" = "3 x 2 etichetta"; "media.oe_3x3-label_3x3in" = "3 x 3 etichette"; "media.oe_3x5-label_3x5in" = "3 x 5 etichetta"; "media.oe_4x1-label_4x1in" = "4 x 1 etichetta"; "media.oe_4x13-label_4x13in" = "4 x 13 etichetta"; "media.oe_4x2-label_4x2in" = "4 x 2 etichetta"; "media.oe_4x3-label_4x3in" = "4 x 3 etichette"; "media.oe_4x4-label_4x4in" = "4 x 4 etichetta"; "media.oe_4x5-label_4x5in" = "4 x 5 etichetta"; "media.oe_4x6-label_4x6in" = "4 x 6 etichetta"; "media.oe_4x6.5-label_4x6.5in" = "4 x 6-1 / 2"; "media.oe_4x8-label_4x8in" = "4 x 8 etichetta"; "media.oe_6x1-label_6x1in" = "6 x 1 etichetta"; "media.oe_6x13-label_6x13in" = "6 x 13 etichetta"; "media.oe_6x2-label_6x2in" = "6 x 2 etichetta"; "media.oe_6x3-label_6x3in" = "6 x 3 etichetta"; "media.oe_6x4-label_6x4in" = "6 x 4 etichetta"; "media.oe_6x5-label_6x5in" = "6 x 5 etichetta"; "media.oe_6x6-label_6x6in" = "6 x 6 etichetta"; "media.oe_6x6.5-label_6x6.5in" = "6 x 6-1 / 2"; "media.oe_8x1-label_8x1in" = "8 x 1 etichetta"; "media.oe_8x13-label_8x13in" = "8 x 13 Etichetta"; "media.oe_8x2-label_8x2in" = "8 x 2 etichetta"; "media.oe_8x3-label_8x3in" = "8 x 3 etichette"; "media.oe_8x4-label_8x4in" = "8 x 4 etichetta"; "media.oe_8x5-label_8x5in" = "8 x 5 etichetta"; "media.oe_8x6-label_8x6in" = "8 x 6 etichetta"; "media.oe_8x6.5-label_8x6.5in" = "8 x 6-1 / 2"; "media.oe_address-label_1.125x3.5in" = "1-1/8 x 3-1/2 Etichetta di indirizzo"; "media.oe_barcode-label_0.75x2.5in" = "3/4 x 2-1/2 Etichetta di codici a barre"; "media.oe_book-spine-label_1x1.5in" = "1 x 1-1/2 Libro Spina Etichetta"; "media.oe_continuous-label_2.125x3600in" = "Etichetta continua 2-1/8"; "media.oe_dk1201-address_1.1x3.5in" = "DK1201 28 x 89mm Indirizzo etichetta"; "media.oe_dk1202-shipping_2.4x3.9in" = "DK1202 61 x 99mm Etichetta di spedizione"; "media.oe_dk1203-file-folder_0.66x3.4in" = "DK1203 17 x 86mm Etichetta della cartella di file"; "media.oe_dk1204-multi-purpose_0.66x2.1in" = "DK1204 17 x 53mm Multiuso Etichetta"; "media.oe_dk1207-cd-dvd_2.2x2.2in" = "DK1207 56mm CD/DVD Etichetta"; "media.oe_dk1208-large-address_1.4x3.5in" = "DK1208 36 x 89mm Grande etichetta di indirizzo"; "media.oe_dk1209-small-address_1.1x2.4in" = "DK1209 28 x 61mm Piccolo indirizzo etichetta"; "media.oe_dk1219-round_0.47x0.47in" = "Etichetta rotonda DK1219 12mm"; "media.oe_dk1240-large-multi-purpose_1.9x4in" = "DK1240 48 x 102mm Grande etichetta multiuso"; "media.oe_file-folder-label_0.5625x3.4375in" = "9/16 x 3-7 Etichetta cartella file"; "media.oe_hanging-file-tab-insert_0.5625x2in" = "9/16 x 2 Etichetta di inserimento della scheda di file appeso"; "media.oe_internet-postage-confirmation-label_2.3125x10.5in" = "2-5/16 x 10-1/2 Etichetta di conferma della posta"; "media.oe_internet-postage-label_1.25x1.625in" = "Etichetta di posta elettronica 1-1/4 x 1-5/8"; "media.oe_internet-postage-label_2.3125x7in" = "2-3/8 x 7 Etichetta di posta elettronica"; "media.oe_lg-address-label_1.4x3.5in" = "1-4/10 x 3-1 Grande etichetta di indirizzo"; "media.oe_lg-multipurpose-label_2.125x.75in" = "2-1/8 x 3/4 Grande etichetta multiuso"; "media.oe_library-barcode-label_0.5x1.875in" = "1/2 x 1-7/8 Biblioteca codice a barre etichetta"; "media.oe_md-appointment-card_2x3.5in" = "2 x 3-1/2 Carta media di nomina"; "media.oe_md-multipurpose-label_2.25x1.25in" = "2-1/4 x 1/1/4 Etichetta multiuso media"; "media.oe_media-label_2.25x2.25in" = "2-1/4 x 2-1/4 Media Etichetta"; "media.oe_medium-1in-tape_0.5x1in" = "1/2 x 1 Nastro"; "media.oe_medium-2in-tape_0.5x2in" = "1/2 x 2 Nastro"; "media.oe_medium-3in-tape_0.5x3in" = "1/2 x 3 Nastro"; "media.oe_multipurpose-label_2x2.3125in" = "2 x 2-5 Etichetta multiuso"; "media.oe_name-badge-label_2.25x4in" = "2-1/4 x 4 nome Badge Label"; "media.oe_price-tag-label_0.9375x0.875in" = "15/16 x 7/8 Prezzo Tag etichetta"; "media.oe_return-address-label_0.75x2in" = "3/4 x 2 Etichetta di indirizzo di ritorno"; "media.oe_shipping-label_2.125x4in" = "2-1/8 x 4 Etichetta di spedizione"; "media.oe_shipping-label_2.3125x4in" = "2-5/16 x 4 Etichetta di spedizione"; "media.oe_sm-multipurpose-label_1x2.125in" = "1 x 2-1/8 Piccola etichetta multiuso"; "media.oe_square-multipurpose-label_1x1in" = "1 etichetta multiuso quadrato"; "media.oe_thin-1in-tape_0.25x1in" = "1/4 x 1 Nastro"; "media.oe_thin-2in-tape_0.25x2in" = "1/4 x 2 Nastro"; "media.oe_thin-3in-tape_0.25x3in" = "1/4 x 3 Nastro"; "media.oe_thin-multipurpose-label_0.375x2.8125in" = "3/8 x 2-13/16 Etichetta multiuso sottile"; "media.oe_thinner-1in-tape_0.375x1in" = "3/8 x 1 Nastro"; "media.oe_thinner-2in-tape_0.375x2in" = "3/8 x 2 Nastro"; "media.oe_thinner-3in-tape_0.375x3in" = "3/8 x 3 Nastro"; "media.oe_video-spine-label_0.75x5.875in" = "3/4 x 5-7/8 Etichetta di filatura video"; "media.oe_video-top-label_1.8x3.1in" = "1,8 x 3.1 Video Top Label"; "media.oe_wide-1in-tape_1x1in" = "1 x 1 Nastro"; "media.oe_wide-2in-tape_1x2in" = "1 x 2 Nastro"; "media.oe_wide-3in-tape_1x3in" = "1 x 3 Nastro"; "media.oe_wider-1in-tape_0.75x1in" = "3/4 x 1 Nastro"; "media.oe_wider-2in-tape_0.75x2in" = "3/4 x 2 Nastro"; "media.oe_wider-3in-tape_0.75x3in" = "3/4 x 3 Nastro"; "media.om_35mm-slide_9x37mm" = "Etichetta di scorrimento 35mm"; "media.om_4-part-label_48x96mm" = "48 x 96mm Etichetta a 4 pezzi"; "media.om_8mm-spine_9x66mm" = "Etichetta di filatura 8mm"; "media.om_address-large_35x83mm" = "35 x 83 millimetri Etichetta di indirizzo grande"; "media.om_address-small_24x83mm" = "24 x 83mm piccolo indirizzo etichetta"; "media.om_cut-hanging-13_32x78mm" = "32 x 78mm 1/3 Etichetta della cartella di file sospesa di taglio"; "media.om_cut-hanging-15_32x40mm" = "32 x 40mm 1/5 sospensione di taglio Etichetta cartella file"; "media.om_diskette_48x64mm" = "48 x 64 millimetri etichetta di Diskette"; "media.om_euro-file-folder_39x49mm" = "39 x 49mm Euro File Folder Etichetta"; "media.om_euro-folder-narrow_38x186mm" = "38 x 186mm Etichetta pieghevole Euro Narrow File"; "media.om_euro-folder-wide_48x186mm" = "48 x 186mm Etichetta pieghevole Euro Wide File"; "media.om_euro-name-badge-large_48x79mm" = "48 x 79 mm Euro Grande Nome etichetta Badge"; "media.om_euro-name-badge_38x67mm" = "38 x 67 mm Euro Nome etichetta Badge"; "media.om_file-folder_13x81mm" = "13 x 81mm Etichetta cartella file"; "media.om_jewelry_27x48mm" = "Etichetta di gioielli da 27 x 48 mm"; "media.om_media-badge_48x64mm" = "48 x 64 mm Media Badge Label"; "media.om_multi-purpose_24x44mm" = "24 x 44 millimetri multiuso Etichetta"; "media.om_retail-label_32x37mm" = "32 x 37 mm Etichetta di vendita al dettaglio"; "media.om_return_16x43mm" = "16 x 43 mm Etichetta di ritorno"; "media.om_round_22x24mm" = "Etichetta rotonda 22mm"; "media.om_shipping_48x96mm" = "48 x 96mm Etichetta di spedizione"; "media.om_top-coated-paper_48x140mm" = "48 x 140mm Carta rivestita superiore"; "media.om_vhs-face_45x72mm" = "45 x 72 millimetri VHS Face Label"; "media.om_vhs-spine_18x141mm" = "18 x 141mm VHS Spina Etichetta"; "media.om_zip-disk_48x55mm" = "48 x 55mm Zip Disk Etichetta"; lprint-1.3.1/static-resources/lprint-large-png.h000066400000000000000000002542261456151556700217100ustar00rootroot00000000000000/* static-resources/lprint-large.png */ static unsigned char lprint_large_png[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82, 0,0,2,0,0,0,2,0,8,6,0,0,0,244,120,212, 250,0,0,4,25,105,67,67,80,107,67,71,67,111,108,111, 114,83,112,97,99,101,71,101,110,101,114,105,99,82,71,66, 0,0,56,141,141,85,93,104,28,85,20,62,187,115,103,35, 36,206,83,108,52,133,116,168,63,13,37,13,147,86,52,161, 180,186,127,221,221,54,110,150,73,54,218,34,232,100,246,238, 206,152,201,206,56,51,187,253,161,79,69,80,124,49,234,155, 20,196,191,183,128,32,40,245,15,219,62,180,47,149,10,37, 218,212,32,40,62,180,248,131,80,232,139,166,235,153,59,51, 153,105,186,177,222,101,238,124,243,157,239,158,123,238,185,103, 239,5,232,185,170,88,150,145,20,1,22,154,174,45,23,50, 226,115,135,143,136,61,43,144,132,135,160,23,6,161,87,81, 29,43,93,169,76,2,54,79,11,119,181,91,223,67,194,123, 95,217,213,221,254,159,173,183,70,29,21,32,113,31,98,179, 230,168,11,136,143,1,240,167,85,203,118,1,122,250,145,31, 63,234,90,30,246,98,232,183,49,64,196,47,122,184,225,99, 215,195,115,62,126,141,105,102,228,44,226,211,136,5,85,83, 106,136,151,16,143,204,197,248,70,12,251,49,176,214,95,160, 77,106,235,170,232,229,162,98,155,117,221,160,177,112,239,97, 254,159,109,193,104,133,243,109,195,167,207,153,159,62,132,239, 97,92,251,43,53,37,231,225,81,196,75,170,146,159,70,252, 8,226,107,109,125,182,28,224,219,150,155,145,17,63,6,144, 220,222,154,175,166,17,239,68,92,172,219,7,170,190,159,164, 173,181,138,33,126,231,132,54,243,44,226,45,136,207,55,231, 202,83,193,216,171,170,147,197,156,193,118,196,183,53,90,242, 242,59,4,192,137,186,91,154,241,199,114,251,109,83,158,242, 231,229,234,53,154,203,123,121,68,252,250,188,121,72,246,125, 114,159,57,237,233,124,232,243,132,150,45,7,252,165,151,148, 131,21,196,131,136,127,161,70,65,246,231,226,254,177,220,74, 16,3,25,106,26,229,73,127,46,146,163,14,91,47,227,93, 109,166,232,207,75,12,23,55,212,31,75,22,235,250,129,82, 160,255,68,179,139,114,128,175,89,6,171,81,140,141,79,218, 45,185,234,235,249,81,197,206,23,124,159,124,133,54,171,129, 127,190,13,179,9,5,40,152,48,135,189,10,77,88,3,17, 100,40,64,6,223,22,216,104,169,131,14,6,50,20,173,20, 25,138,95,161,102,23,27,231,192,60,242,58,180,153,205,193, 190,194,148,254,200,200,95,131,249,184,206,180,42,100,135,62, 130,22,178,26,252,142,172,22,211,101,241,171,133,92,99,19, 63,126,44,55,2,63,38,25,32,18,217,131,207,94,50,73, 246,145,113,50,1,34,121,138,60,77,246,147,28,178,19,100, 239,250,216,74,108,69,94,60,55,214,253,188,140,51,82,166, 155,69,221,57,180,187,160,96,255,51,42,76,92,83,215,172, 44,14,182,134,35,203,41,251,5,93,189,252,198,95,177,92, 233,44,55,81,182,226,25,157,186,87,206,249,95,249,235,252, 50,246,43,252,106,164,224,127,228,87,241,183,114,199,90,204, 187,178,76,195,236,108,88,115,119,85,26,109,6,227,22,240, 209,153,197,137,197,29,243,113,241,228,87,15,70,126,150,201, 153,231,175,244,93,60,89,111,46,14,70,172,151,5,250,106, 249,86,25,78,141,68,172,244,131,244,135,180,44,189,39,125, 40,253,198,189,205,125,202,125,205,125,206,125,193,93,2,145, 59,203,157,227,190,225,46,112,31,115,95,198,246,106,243,26, 90,223,123,22,121,24,183,103,233,150,107,172,74,33,35,108, 21,30,22,114,194,54,225,81,97,50,242,39,12,8,99,66, 81,216,129,150,173,235,251,22,159,47,158,61,29,14,99,31, 230,167,251,92,190,46,86,1,137,251,177,2,244,77,254,85, 85,84,233,112,148,41,29,86,111,77,56,190,65,19,140,36, 67,100,140,148,54,84,247,184,87,243,161,34,149,79,229,82, 105,16,83,59,83,19,169,177,212,65,15,135,179,166,118,160, 109,2,251,252,29,213,169,110,178,82,234,210,99,222,125,2, 89,211,58,110,235,13,205,21,119,75,210,147,98,26,175,54, 42,150,154,234,232,136,168,24,134,200,76,142,104,83,135,218, 109,90,27,5,239,222,244,143,244,155,50,187,15,19,91,46, 71,156,251,12,192,190,63,241,236,251,46,226,142,180,0,150, 28,128,129,199,35,110,24,207,202,7,222,5,56,243,132,218, 178,219,193,29,145,72,124,11,224,212,247,236,246,191,250,50, 120,126,253,212,233,220,196,115,172,231,45,128,181,55,59,157, 191,223,239,116,214,62,64,255,171,0,103,141,127,1,160,159, 124,85,3,92,11,239,0,0,0,56,101,88,73,102,77,77, 0,42,0,0,0,8,0,1,135,105,0,4,0,0,0,1, 0,0,0,26,0,0,0,0,0,2,160,2,0,4,0,0, 0,1,0,0,2,0,160,3,0,4,0,0,0,1,0,0, 2,0,0,0,0,0,40,48,151,191,0,0,3,99,105,84, 88,116,88,77,76,58,99,111,109,46,97,100,111,98,101,46, 120,109,112,0,0,0,0,0,60,120,58,120,109,112,109,101, 116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98, 101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109, 112,116,107,61,34,88,77,80,32,67,111,114,101,32,53,46, 52,46,48,34,62,10,32,32,32,60,114,100,102,58,82,68, 70,32,120,109,108,110,115,58,114,100,102,61,34,104,116,116, 112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49, 57,57,57,47,48,50,47,50,50,45,114,100,102,45,115,121, 110,116,97,120,45,110,115,35,34,62,10,32,32,32,32,32, 32,60,114,100,102,58,68,101,115,99,114,105,112,116,105,111, 110,32,114,100,102,58,97,98,111,117,116,61,34,34,10,32, 32,32,32,32,32,32,32,32,32,32,32,120,109,108,110,115, 58,100,99,61,34,104,116,116,112,58,47,47,112,117,114,108, 46,111,114,103,47,100,99,47,101,108,101,109,101,110,116,115, 47,49,46,49,47,34,10,32,32,32,32,32,32,32,32,32, 32,32,32,120,109,108,110,115,58,73,112,116,99,52,120,109, 112,69,120,116,61,34,104,116,116,112,58,47,47,105,112,116, 99,46,111,114,103,47,115,116,100,47,73,112,116,99,52,120, 109,112,69,120,116,47,50,48,48,56,45,48,50,45,50,57, 47,34,10,32,32,32,32,32,32,32,32,32,32,32,32,120, 109,108,110,115,58,112,104,111,116,111,115,104,111,112,61,34, 104,116,116,112,58,47,47,110,115,46,97,100,111,98,101,46, 99,111,109,47,112,104,111,116,111,115,104,111,112,47,49,46, 48,47,34,62,10,32,32,32,32,32,32,32,32,32,60,100, 99,58,99,114,101,97,116,111,114,62,10,32,32,32,32,32, 32,32,32,32,32,32,32,60,114,100,102,58,83,101,113,62, 10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 60,114,100,102,58,108,105,62,77,105,99,104,97,101,108,32, 83,119,101,101,116,60,47,114,100,102,58,108,105,62,10,32, 32,32,32,32,32,32,32,32,32,32,32,60,47,114,100,102, 58,83,101,113,62,10,32,32,32,32,32,32,32,32,32,60, 47,100,99,58,99,114,101,97,116,111,114,62,10,32,32,32, 32,32,32,32,32,32,60,100,99,58,114,105,103,104,116,115, 62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,114, 100,102,58,65,108,116,62,10,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,60,114,100,102,58,108,105,32,120, 109,108,58,108,97,110,103,61,34,120,45,100,101,102,97,117, 108,116,34,62,67,111,112,121,114,105,103,104,116,32,50,48, 49,57,32,77,105,99,104,97,101,108,32,83,119,101,101,116, 60,47,114,100,102,58,108,105,62,10,32,32,32,32,32,32, 32,32,32,32,32,32,60,47,114,100,102,58,65,108,116,62, 10,32,32,32,32,32,32,32,32,32,60,47,100,99,58,114, 105,103,104,116,115,62,10,32,32,32,32,32,32,32,32,32, 60,73,112,116,99,52,120,109,112,69,120,116,58,72,101,97, 100,108,105,110,101,62,78,101,119,32,73,99,111,110,60,47, 73,112,116,99,52,120,109,112,69,120,116,58,72,101,97,100, 108,105,110,101,62,10,32,32,32,32,32,32,32,32,32,60, 112,104,111,116,111,115,104,111,112,58,72,101,97,100,108,105, 110,101,62,78,101,119,32,73,99,111,110,60,47,112,104,111, 116,111,115,104,111,112,58,72,101,97,100,108,105,110,101,62, 10,32,32,32,32,32,32,60,47,114,100,102,58,68,101,115, 99,114,105,112,116,105,111,110,62,10,32,32,32,60,47,114, 100,102,58,82,68,70,62,10,60,47,120,58,120,109,112,109, 101,116,97,62,10,221,242,56,27,0,0,89,59,73,68,65, 84,120,218,237,157,7,212,20,69,214,134,135,156,37,71,69, 64,81,130,168,40,40,98,64,16,3,96,22,84,92,119,21, 113,13,191,57,139,152,17,69,12,128,174,162,8,171,98,192, 4,42,6,68,81,48,7,20,1,73,6,20,115,196,28,64, 9,245,223,59,116,47,69,59,121,122,102,186,123,158,58,231, 57,103,93,210,215,221,213,245,190,125,235,222,91,177,24,131, 193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96, 48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24, 12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,70, 228,70,5,0,0,8,52,12,134,111,226,94,49,11,42,1, 0,64,65,201,102,77,198,36,48,210,138,125,58,33,175,156, 130,42,0,0,80,18,82,173,205,233,140,3,166,0,193,79, 40,242,246,4,171,106,81,45,13,213,1,0,160,160,164,91, 135,237,53,59,153,89,72,100,10,48,4,17,21,253,84,130, 95,37,129,192,187,19,173,134,69,77,15,181,0,0,32,16, 120,215,103,123,237,246,26,7,219,28,100,106,8,24,33,21, 253,116,130,111,139,189,45,236,181,29,234,56,108,100,81,55, 9,245,0,0,160,160,36,91,127,237,53,218,93,183,221,117, 220,54,10,94,83,144,137,33,192,12,68,64,244,171,121,196, 190,166,37,246,117,44,113,119,39,90,125,161,129,67,67,139, 70,30,26,3,0,64,81,241,174,195,246,26,237,174,219,245, 61,198,97,35,203,24,212,242,68,12,108,67,128,25,8,169, 240,167,19,125,91,240,235,122,132,190,161,37,232,77,28,154, 10,205,28,154,59,180,176,216,24,0,0,74,130,189,22,187, 235,179,187,94,55,181,214,241,198,150,73,176,141,65,221,4, 134,32,157,25,192,8,4,84,248,83,137,190,253,133,239,10, 190,45,246,77,45,113,215,137,181,137,208,82,216,212,161,149, 208,218,161,141,197,102,0,0,80,18,236,181,216,93,159,91, 89,235,118,75,103,45,223,216,50,9,77,61,166,192,53,4, 118,132,32,157,25,192,8,4,88,248,237,47,253,141,172,175, 124,247,11,191,137,245,69,239,138,125,23,225,112,225,108,97, 140,48,69,120,94,88,32,124,33,252,40,252,33,172,22,12, 0,0,148,132,213,206,90,252,163,179,54,235,26,253,130,179, 102,223,32,156,43,252,67,216,73,104,43,108,110,153,5,215, 28,184,166,192,141,24,52,177,34,4,110,116,96,35,79,100, 0,35,16,96,225,119,191,246,237,240,190,43,250,141,45,209, 87,23,216,81,56,82,24,237,76,156,239,121,169,0,0,34, 135,174,237,47,58,198,96,144,243,161,183,133,101,10,90,91, 134,160,133,101,6,26,91,102,192,222,38,112,163,2,24,129, 34,138,127,166,194,239,126,237,55,240,124,233,235,195,221,87, 184,86,120,91,88,203,139,1,0,80,118,232,218,63,87,24, 37,244,23,58,88,134,192,141,16,180,244,152,1,119,155,192, 142,10,100,99,4,24,121,126,245,103,35,252,141,173,253,252, 126,194,173,194,151,76,124,0,0,240,160,218,112,155,99,6, 218,11,91,90,102,192,141,12,184,121,3,141,115,48,2,68, 3,124,252,234,183,247,248,109,225,119,195,252,234,216,182,18, 46,22,62,96,114,3,0,64,134,168,102,12,19,186,59,102, 192,141,12,180,246,68,5,220,237,1,175,17,112,115,4,136, 6,20,224,171,223,78,238,243,126,241,235,67,233,33,220,45, 252,201,68,6,0,128,28,81,13,153,228,108,27,107,190,88, 59,39,153,208,141,10,108,108,25,1,59,34,96,39,11,18, 13,240,225,171,223,14,247,215,178,146,251,236,80,255,94,194, 83,76,90,0,0,240,153,167,133,67,156,200,114,123,143,17, 104,225,217,26,112,147,5,107,121,182,5,136,6,100,40,254, 201,190,250,221,112,127,125,39,33,163,169,243,197,255,4,19, 20,0,0,10,204,52,97,255,4,70,160,165,101,4,26,57, 26,229,221,22,72,21,13,32,228,159,100,175,223,254,234,119, 247,249,155,56,89,155,227,99,212,227,3,0,64,113,251,15, 220,41,236,234,24,1,119,107,160,181,149,44,216,196,202,15, 240,70,3,216,18,200,32,228,159,236,171,95,247,92,206,140, 173,107,254,192,100,4,0,128,82,160,26,52,84,216,214,50, 2,218,83,160,149,147,31,144,46,26,80,214,91,2,153,132, 252,237,189,254,38,78,86,230,75,76,60,0,0,8,8,175, 56,137,130,219,196,214,247,19,112,183,5,220,104,128,157,27, 80,246,91,2,217,134,252,213,73,157,35,172,96,178,1,0, 64,192,80,109,186,72,232,44,116,114,162,1,155,123,162,1, 217,110,9,148,173,248,219,33,255,14,78,226,5,147,12,0, 0,130,94,45,176,187,39,26,224,230,6,52,243,108,9,148, 157,9,72,39,254,181,99,27,150,247,237,45,124,198,164,2, 0,128,144,240,121,108,221,129,114,157,61,185,1,238,150,128, 93,46,88,187,92,76,64,34,241,119,235,251,107,122,196,95, 247,76,78,19,86,50,153,0,0,32,100,168,118,13,17,182, 23,182,142,173,43,25,116,183,4,90,120,242,2,220,228,192, 68,253,2,34,97,2,50,21,127,119,191,127,52,19,8,0, 0,66,206,205,66,87,167,82,64,183,4,218,38,200,11,136, 180,9,200,68,252,221,100,63,221,39,153,194,164,1,0,128, 136,240,168,176,179,179,37,208,209,202,11,240,38,7,70,206, 4,164,218,243,247,138,191,186,162,103,153,44,0,0,16,49, 102,198,214,53,14,218,206,201,11,208,211,6,219,56,31,189, 201,76,64,232,115,2,50,21,127,77,144,160,190,31,0,0, 162,220,47,96,119,39,47,160,83,30,38,32,116,95,255,201, 178,253,221,47,127,196,31,0,0,202,193,4,244,176,76,64, 187,4,38,32,89,117,64,104,162,0,222,208,127,50,241,223, 132,176,63,0,0,148,17,179,156,237,128,108,77,64,40,182, 2,18,137,127,213,216,250,38,63,110,169,95,83,18,254,0, 0,160,12,153,26,91,215,218,62,217,118,128,91,34,232,54, 11,170,26,22,19,144,40,227,191,122,108,125,135,63,183,206, 159,82,63,0,0,40,87,198,38,48,1,110,117,128,219,39, 192,237,24,88,61,73,101,64,224,247,253,237,131,125,180,5, 162,118,65,58,141,135,15,0,0,101,206,133,194,78,142,9, 208,234,128,45,98,235,155,5,53,118,52,211,62,64,40,176, 249,0,201,246,253,93,241,215,236,70,237,131,172,237,125,233, 240,7,0,0,229,142,106,225,191,132,110,177,117,37,130,218, 39,192,109,22,212,220,209,204,122,150,9,8,108,62,64,162, 208,191,55,233,79,59,33,209,219,31,0,0,96,29,122,118, 64,31,199,4,116,118,116,82,219,6,235,217,1,205,18,36, 5,6,110,43,192,117,33,169,246,253,53,177,129,83,253,0, 0,0,54,228,25,167,50,96,135,216,186,182,193,122,118,192, 102,158,164,192,68,249,0,37,143,2,164,11,253,215,119,18, 26,206,229,33,3,0,0,36,228,114,97,151,216,186,179,3, 244,0,161,118,158,164,192,250,65,220,10,72,21,250,119,247, 253,53,211,113,5,15,24,0,0,32,33,170,145,135,90,149, 1,118,82,160,157,15,16,152,173,0,111,214,191,55,244,223, 208,217,195,160,211,31,0,0,64,106,94,141,173,107,23,156, 40,31,192,109,18,100,111,5,148,180,42,32,147,208,255,153, 60,84,0,0,128,140,184,76,216,205,201,7,216,38,182,190, 83,96,166,91,1,37,253,250,119,179,254,27,57,238,229,71, 30,40,0,0,64,70,168,102,238,27,91,119,132,112,151,216, 186,38,65,222,173,0,183,42,160,100,9,129,201,190,254,237, 172,255,241,60,76,0,0,128,172,184,203,217,10,216,201,218, 10,72,84,21,80,146,40,64,162,175,127,59,241,79,59,24, 233,137,71,171,121,144,0,0,0,89,161,218,121,100,108,125, 105,160,110,5,184,173,130,221,46,129,137,18,2,139,18,5, 200,228,235,255,9,30,34,64,97,144,21,192,12,137,85,52, 47,196,42,155,39,133,179,228,127,119,142,85,48,21,184,55, 0,81,97,186,208,203,83,21,208,214,74,8,44,73,20,32, 147,175,255,189,120,120,0,133,97,176,136,253,60,17,253,197, 177,42,127,227,37,249,255,135,197,42,153,158,98,6,170,113, 175,0,194,206,49,78,52,125,199,216,186,6,65,110,66,96, 201,162,0,169,190,254,221,178,191,167,120,112,0,254,115,188, 136,127,34,225,79,196,28,49,3,55,138,25,56,72,204,64, 61,238,29,64,24,153,33,236,17,91,215,32,168,139,21,5, 216,52,182,190,77,112,81,163,0,153,236,253,243,224,0,124, 230,95,89,136,191,151,133,98,6,238,18,51,48,72,254,142, 86,220,75,128,48,241,207,216,250,222,0,110,155,96,183,44, 48,93,20,160,168,123,255,234,72,238,230,129,1,248,203,0, 249,138,207,85,252,19,241,152,24,130,51,196,12,108,35,127, 47,247,23,32,208,60,40,244,78,17,5,40,90,46,128,109, 0,236,186,127,247,235,95,127,176,63,121,96,0,254,177,159, 136,244,194,36,123,254,126,160,137,132,151,75,116,160,135,252, 59,85,185,223,0,65,67,53,245,224,36,81,0,111,46,128, 219,23,160,160,6,160,114,108,195,174,127,110,230,255,197,60, 44,0,255,216,83,68,249,157,2,138,191,151,183,228,223,186, 65,204,192,1,242,239,214,229,254,3,4,133,107,147,68,1, 236,138,0,187,59,160,239,219,0,222,240,191,219,243,223,237, 250,167,29,138,62,224,65,1,248,195,110,34,194,243,138,40, 254,94,22,200,191,61,81,204,192,81,178,85,176,9,207,3, 160,148,44,21,246,182,42,2,220,22,193,173,99,27,118,7, 180,207,8,240,53,10,144,44,249,207,237,249,223,143,135,4, 224,15,221,68,252,231,150,80,252,19,49,85,126,158,211,196, 12,116,34,111,0,160,20,28,239,84,4,104,139,96,237,11, 208,49,182,190,59,160,123,70,64,193,146,1,43,196,214,31, 249,155,168,244,239,86,30,16,64,254,108,39,2,251,86,192, 196,223,203,243,242,243,93,34,102,96,87,249,89,171,240,204, 0,138,193,157,177,117,61,118,220,131,130,182,142,173,59,35, 32,89,73,160,123,84,112,5,63,196,63,81,248,223,77,254, 83,7,242,21,15,8,32,63,244,235,122,118,192,197,223,203, 155,242,243,142,150,173,130,253,229,103,223,136,103,8,80,40, 190,22,250,8,61,99,235,207,8,72,148,12,232,251,54,64, 162,240,191,123,228,175,38,32,236,203,195,1,200,15,217,208, 51,175,133,76,252,189,104,194,226,29,98,6,180,103,65,11, 158,41,128,223,156,144,32,25,112,115,43,25,208,61,42,216, 215,109,128,68,217,255,118,248,255,90,30,12,64,238,200,27, 108,94,14,185,248,39,226,17,185,166,83,197,12,116,36,111, 0,192,15,198,122,146,1,117,27,64,15,9,106,149,98,27, 192,23,3,144,44,251,95,67,15,111,243,96,0,114,67,222, 220,120,45,126,212,196,223,203,76,185,198,139,197,12,236,76, 222,0,64,174,204,19,250,198,214,29,18,148,104,27,32,89, 53,64,133,124,191,254,43,37,201,254,215,76,196,181,60,24, 128,236,145,94,158,113,97,140,186,248,123,209,60,135,235,100, 171,160,159,152,129,58,204,3,128,76,81,173,237,159,100,27, 32,89,53,64,94,121,0,201,246,255,221,214,191,71,242,80, 0,178,71,94,30,51,163,12,197,223,203,124,185,7,255,21, 51,112,164,68,7,154,51,47,0,210,113,182,179,13,144,172, 26,160,129,159,121,0,137,246,255,235,58,123,13,218,128,96, 52,15,4,32,59,36,78,103,166,33,254,9,153,34,247,229, 100,49,3,29,152,39,0,137,24,103,85,3,184,173,129,237, 166,64,13,29,141,246,37,15,160,66,138,242,63,61,141,232, 5,30,8,64,230,136,61,55,143,35,254,25,241,172,220,167, 11,197,12,116,151,173,130,202,204,29,0,229,101,167,242,206, 109,10,180,157,32,126,57,222,20,104,227,20,229,128,57,25, 128,68,135,255,184,251,255,186,231,240,61,15,4,32,51,180, 191,254,163,136,127,78,188,33,247,237,90,217,42,232,43,102, 160,22,115,9,202,23,213,220,253,133,61,133,93,211,228,1, 120,15,7,242,109,255,191,169,243,15,243,64,0,50,64,155, 228,76,70,252,125,203,27,24,47,102,96,160,68,7,154,50, 183,160,252,248,135,85,14,232,205,3,104,234,87,30,64,170, 250,127,221,107,56,156,7,1,144,30,253,98,125,64,4,11, 241,46,12,106,172,254,79,204,64,59,230,26,148,7,103,58, 121,0,187,123,242,0,90,89,121,0,121,247,3,240,26,0, 111,253,255,57,60,8,128,212,200,27,104,38,33,254,69,67, 43,43,46,16,51,160,7,42,85,98,254,65,52,25,30,91, 119,0,95,38,253,0,242,50,0,169,18,0,199,240,32,0, 146,35,241,55,115,23,226,95,50,180,181,242,72,185,255,251, 136,25,168,201,124,132,232,48,222,73,4,236,29,91,127,58, 160,239,137,128,94,3,80,219,249,75,221,4,192,41,60,8, 128,196,136,237,142,247,197,71,136,131,193,60,49,3,227,228, 121,28,46,209,129,198,204,79,8,55,143,89,137,128,201,26, 2,213,179,18,1,243,50,0,137,58,0,234,225,3,207,243, 32,0,254,142,188,48,102,2,226,31,88,22,137,25,208,156, 140,19,196,12,180,101,190,66,56,75,1,15,136,173,63,30, 184,171,208,73,104,235,104,115,178,142,128,89,25,0,111,11, 96,187,2,64,179,13,23,240,32,0,54,68,251,220,143,67, 252,67,197,211,98,8,206,19,51,208,85,182,10,42,50,135, 33,248,44,18,14,20,246,201,162,18,32,235,82,192,84,45, 128,245,31,249,130,7,1,176,161,248,143,69,252,67,205,171, 98,6,174,146,103,216,91,204,64,13,230,52,4,147,47,133, 131,172,74,0,61,25,112,155,216,186,147,1,211,181,4,206, 201,0,120,143,0,214,114,131,31,121,16,0,235,208,78,117, 255,65,252,35,197,92,49,3,106,232,250,139,25,104,200,28, 135,224,160,218,123,112,108,195,150,192,174,1,104,21,251,251, 209,192,89,27,128,116,61,0,90,11,127,240,32,0,98,241, 114,179,27,16,255,200,231,13,220,43,207,248,88,217,42,104, 205,156,135,210,162,218,123,72,108,221,209,192,61,157,82,192, 68,103,2,228,220,11,32,19,3,176,154,7,1,229,142,238, 25,143,66,252,203,14,61,204,233,44,49,3,157,37,58,80, 129,247,0,138,203,106,199,0,36,234,5,80,48,3,96,55, 1,106,195,67,0,196,63,22,63,215,30,65,44,111,94,18, 51,112,133,204,131,158,98,6,170,241,94,64,113,232,239,24, 0,61,20,168,123,138,102,64,190,24,128,90,24,0,128,245, 232,87,223,200,12,197,255,195,109,182,55,191,62,253,140,89, 185,100,137,249,238,202,17,230,163,46,221,16,206,136,50,71, 204,192,141,50,47,14,18,51,80,143,247,4,10,107,0,18, 157,10,232,75,55,64,12,0,64,10,241,31,145,129,248,191, 215,108,19,243,227,237,119,152,181,107,214,24,239,248,235,147, 79,204,242,209,55,152,101,61,122,153,197,21,171,34,158,17, 100,161,152,1,237,4,57,72,182,10,54,229,189,1,127,25, 16,219,176,27,160,239,6,192,237,2,104,27,0,183,13,240, 102,60,0,40,87,241,191,42,157,248,87,170,102,190,58,229, 52,179,250,167,159,76,38,99,213,55,223,152,31,110,27,111, 62,233,179,175,89,92,181,38,226,25,81,166,138,33,56,93, 204,192,214,18,29,224,93,2,31,12,192,126,9,12,128,221, 14,216,54,0,89,117,3,196,0,0,36,96,120,26,241,255, 112,219,46,230,143,57,115,76,174,67,77,195,79,247,78,50, 159,29,114,168,89,82,115,35,132,51,162,188,32,102,224,82, 49,3,61,196,12,84,225,189,130,252,12,128,182,3,214,243, 0,58,22,194,0,84,199,0,0,196,204,176,84,226,95,165, 134,249,246,210,203,205,218,191,254,50,126,141,53,127,252,97, 126,121,228,81,243,249,191,6,153,119,235,55,70,56,35,202, 155,98,6,70,203,220,218,95,204,64,93,222,51,240,223,0, 84,247,195,0,212,195,0,0,226,255,119,150,182,219,202,172, 120,251,109,83,200,161,198,226,215,103,102,152,47,79,60,41, 158,91,128,112,70,147,119,196,12,232,33,82,255,146,232,64, 11,222,59,200,207,0,212,195,0,0,228,201,229,41,196,255, 139,99,254,109,214,252,246,155,41,230,208,164,194,223,95,126, 197,124,125,214,57,230,131,54,91,32,156,17,230,17,49,4, 167,138,25,232,192,123,8,27,114,168,99,0,246,196,0,0, 20,8,221,167,77,180,48,47,169,81,199,252,116,215,221,38, 8,99,197,220,185,230,219,139,47,53,75,183,218,22,209,140, 48,51,197,12,92,36,243,113,103,217,42,168,204,187,137,1, 216,240,72,96,12,0,64,49,196,255,131,214,109,11,30,242, 207,117,172,124,239,61,243,221,136,145,230,163,29,118,50,139, 43,32,154,81,101,182,152,1,109,66,213,87,204,64,109,222, 85,12,0,6,0,192,63,46,73,34,254,90,183,191,106,249, 114,19,134,241,215,103,159,153,239,111,188,201,124,220,179,119, 188,52,17,225,140,38,243,197,12,76,16,51,112,132,204,217, 102,188,187,24,0,12,0,128,255,226,175,217,248,107,255,252, 51,103,65,30,58,116,168,169,93,187,182,233,213,171,151,25, 59,118,172,249,250,235,175,139,102,6,86,125,247,157,249,113, 194,127,205,167,251,30,96,150,84,171,133,112,70,152,201,98, 8,254,79,230,112,59,222,101,12,0,6,0,32,127,241,255, 102,232,69,121,139,176,138,191,253,111,85,172,88,177,36,102, 96,245,47,191,152,159,238,187,223,124,118,232,64,179,164,118, 61,68,51,194,204,16,51,112,129,204,233,110,178,85,80,137, 247,27,3,128,1,0,200,78,252,181,127,191,31,67,35,0, 42,250,137,254,237,82,153,129,53,43,86,152,95,30,123,220, 124,49,232,88,243,110,131,38,136,102,132,121,77,204,192,213, 178,85,176,183,152,129,154,188,239,24,0,12,0,64,234,132, 63,237,215,239,231,248,234,171,175,204,77,55,221,100,118,223, 125,247,180,102,224,150,91,110,41,170,25,88,187,106,149,249, 237,217,231,204,87,39,157,98,222,111,177,41,162,25,97,230, 137,25,184,85,204,192,97,50,239,27,243,254,99,0,48,0, 128,248,91,72,6,253,15,183,222,86,80,193,205,198,12,20, 59,50,176,118,237,90,243,251,107,175,155,175,207,61,223,124, 176,121,59,68,51,194,44,18,51,112,191,152,129,227,229,61, 104,203,122,128,1,192,0,64,185,112,89,162,38,63,146,49, 255,227,196,187,138,154,177,31,100,51,16,239,53,48,127,126, 188,213,177,30,109,140,104,70,155,233,98,8,206,19,51,208, 85,182,10,42,178,70,96,0,48,0,80,78,29,254,114,253, 242,255,68,142,248,221,115,207,61,77,181,106,213,204,246,219, 111,111,134,15,31,110,22,45,90,20,57,51,240,231,210,165, 102,249,53,215,153,101,59,237,66,175,129,136,243,138,152,1, 61,253,178,183,152,129,234,172,25,24,0,12,0,68,129,100, 189,253,191,189,228,178,156,133,177,119,239,222,9,255,173,45, 183,220,210,12,25,50,196,188,241,198,27,241,208,122,148,204, 192,95,95,124,97,190,191,249,22,243,113,239,189,205,226,202, 213,17,205,8,51,87,204,192,205,242,222,244,23,51,160,121, 3,245,89,71,48,0,0,97,66,38,182,185,34,137,248,127, 121,220,137,121,137,161,126,249,167,251,247,55,222,120,99,115, 234,169,167,154,231,158,123,206,172,94,189,58,82,102,96,245, 247,223,155,31,239,184,211,124,186,255,65,102,73,245,218,136, 102,132,121,78,204,192,52,65,223,37,78,48,196,0,0,132, 66,252,175,76,34,254,159,30,112,176,89,155,165,32,123,135, 134,255,179,249,121,26,54,108,104,142,57,230,24,243,216,99, 143,153,21,82,142,151,205,80,113,15,178,25,88,243,235,175, 230,231,7,31,50,159,15,60,210,188,91,167,62,162,25,97, 174,145,119,138,245,5,3,0,16,104,241,31,145,68,252,151, 117,223,213,172,249,227,143,188,69,79,115,0,246,216,99,143, 156,126,62,109,18,116,232,161,135,154,251,238,187,207,252,252, 243,207,209,50,3,43,87,154,95,158,120,210,124,49,248,56, 243,94,163,102,136,102,4,171,8,90,177,198,96,0,0,130, 42,254,87,39,17,255,247,154,109,98,86,73,104,221,207,177, 108,217,50,115,253,245,215,155,93,119,221,53,169,32,167,162, 106,213,170,166,111,223,190,102,252,248,241,230,155,111,190,137, 148,25,208,40,203,111,179,158,55,95,157,122,186,121,127,147, 214,8,104,68,208,214,195,172,53,24,0,128,64,161,101,76, 215,36,17,127,77,90,251,253,197,151,10,42,120,42,176,227, 198,141,51,125,250,244,137,11,123,214,63,191,136,117,143,30, 61,204,232,209,163,205,199,31,127,156,245,191,125,243,205,55, 7,215,12,72,66,228,31,111,204,54,223,12,25,106,150,110, 217,17,33,13,49,119,177,13,128,1,0,8,154,248,95,151, 76,252,181,203,223,168,49,121,149,250,117,237,218,213,140,28, 57,210,124,248,225,135,25,253,217,159,126,250,201,220,123,239, 189,166,127,255,254,166,86,173,90,57,93,83,174,229,133,65, 55,3,241,163,140,23,46,52,223,14,27,110,62,236,220,21, 81,13,25,111,201,54,0,107,14,6,0,32,16,232,193,39, 215,167,16,255,207,14,59,194,215,82,63,215,12,44,149,26, 249,140,26,235,72,210,223,163,143,62,106,142,62,250,104,211, 160,65,131,156,174,49,215,242,194,48,152,129,63,63,250,200, 44,191,126,180,89,182,75,15,179,184,98,85,68,54,4,52, 101,221,193,0,0,4,65,252,199,164,16,255,165,29,182,142, 103,169,23,170,212,175,75,151,46,230,234,171,175,206,56,50, 176,74,122,240,63,251,236,179,230,228,147,79,142,151,9,230, 114,205,155,108,178,137,57,229,148,83,204,204,153,51,179,42, 47,204,212,12,244,236,217,179,100,102,64,115,52,126,184,101, 156,249,100,175,62,102,113,149,26,136,109,64,217,81,250,3, 176,254,96,0,0,74,70,101,225,198,20,226,175,2,178,98, 222,188,162,149,250,101,107,6,244,75,254,245,215,95,55,231, 157,119,158,217,98,139,45,114,186,7,90,94,56,104,208,160, 172,203,11,195,96,6,86,255,240,131,249,233,174,187,205,167, 7,245,55,75,106,212,65,120,3,196,254,24,0,12,0,64, 169,144,201,106,254,147,74,252,245,104,223,225,87,229,93,234, 167,161,241,92,126,190,108,205,128,142,5,11,22,152,97,195, 134,153,237,182,219,46,175,242,194,73,147,38,101,85,94,232, 154,1,21,251,160,154,129,53,191,255,110,126,158,60,197,124, 126,228,81,230,221,186,13,17,225,18,51,136,74,0,12,0, 64,169,196,127,108,26,241,255,104,135,157,226,71,222,250,49, 116,175,255,170,171,174,202,89,152,213,12,100,147,64,232,150, 23,142,26,53,170,232,229,133,97,48,3,107,255,252,211,252, 250,212,244,120,55,199,247,154,180,64,144,75,192,89,24,0, 12,0,64,41,196,255,214,52,226,175,173,105,87,46,94,92, 16,241,41,133,25,80,1,207,183,188,112,183,221,118,203,186, 188,48,20,102,96,205,26,243,251,11,47,154,175,207,56,203, 188,223,106,115,196,185,72,92,130,1,192,0,0,20,147,170, 194,109,105,196,63,94,242,119,237,245,69,17,31,63,204,64, 182,219,4,26,218,215,242,194,1,3,6,228,85,94,120,197, 21,87,100,85,94,152,141,25,208,223,87,10,51,160,227,143, 183,230,152,111,134,94,100,150,182,239,132,80,211,18,24,3, 128,1,128,40,80,77,152,144,129,248,127,212,109,231,248,87, 97,177,71,41,204,128,38,253,77,157,58,53,239,242,194,243, 207,63,63,171,242,194,160,155,1,77,252,252,100,239,190,8, 117,1,185,25,3,128,1,0,40,6,122,54,249,29,25,136, 191,214,144,255,241,230,91,166,212,163,20,102,192,143,242,66, 253,115,90,94,168,167,23,174,202,48,127,34,83,51,48,116, 232,208,194,31,87,252,249,231,230,139,163,142,161,151,64,17, 152,128,1,192,0,0,20,154,154,194,196,76,196,95,143,248, 253,247,9,57,139,135,10,148,102,209,107,89,220,152,49,99, 226,21,0,126,153,129,17,35,70,20,213,12,184,229,133,250, 101,175,95,248,197,42,47,76,101,6,244,222,22,44,15,64, 204,202,242,235,70,153,37,181,235,33,206,180,3,198,0,96, 0,32,42,226,127,119,134,226,255,110,189,70,102,213,183,223, 230,44,34,42,80,137,196,87,91,241,46,246,41,161,176,20, 102,64,199,66,105,187,155,79,121,161,230,26,104,206,65,54, 229,133,182,25,208,123,91,168,8,192,239,175,190,102,150,110, 181,45,162,92,100,30,192,0,96,0,0,10,133,76,66,51, 41,67,241,87,190,31,115,99,94,66,162,2,149,170,220,174, 93,187,118,230,130,11,46,48,179,103,207,14,181,25,112,203, 11,181,42,32,159,242,194,219,110,187,45,235,211,11,125,237, 11,32,71,58,127,125,214,57,132,251,75,196,195,156,7,128, 1,0,40,4,181,133,251,178,16,127,253,2,244,163,230,95, 5,77,133,45,93,185,93,203,150,45,205,169,167,158,106,102, 205,154,149,85,43,222,160,153,129,76,175,55,93,121,161,26, 10,53,22,69,203,244,159,253,166,249,96,139,14,8,113,9, 153,138,1,192,0,0,248,205,70,194,131,89,136,191,242,235, 180,167,124,23,25,13,117,107,200,91,67,223,137,182,7,92, 26,53,106,100,6,15,30,108,30,127,252,113,179,114,229,202, 208,154,1,63,202,11,247,216,99,15,223,114,39,146,229,54, 44,31,121,45,103,4,4,128,39,48,0,24,0,0,63,169, 43,76,150,133,37,155,133,104,217,78,187,20,190,172,204,41, 183,211,164,56,77,142,75,213,138,247,176,195,14,51,247,223, 127,191,249,229,151,95,124,51,3,90,183,95,76,51,96,95, 111,182,229,133,122,126,66,65,14,9,250,238,187,117,7,4, 33,190,129,224,41,12,0,6,0,192,79,241,159,146,165,248, 199,191,254,159,153,81,220,3,106,36,228,175,101,114,90,46, 167,167,242,165,218,43,239,215,175,159,153,48,97,130,249,54, 143,228,196,82,155,1,45,7,212,235,205,180,188,80,79,80, 244,61,228,47,165,157,239,111,186,25,194,27,32,158,198,0, 96,0,0,252,160,190,240,104,14,226,191,108,215,221,115,58, 224,71,191,82,85,168,186,118,237,154,117,91,94,111,72,90, 27,232,164,43,183,211,189,114,63,203,11,75,101,6,50,41, 47,236,221,187,183,175,226,255,227,196,187,204,146,106,181,16, 221,128,49,3,3,128,1,0,200,151,6,194,212,28,196,95, 249,109,230,172,172,5,69,5,42,209,207,225,154,1,21,215, 92,135,150,219,105,139,221,116,251,247,126,150,23,230,107,6, 244,207,229,98,6,236,235,213,191,67,13,149,26,43,191,114, 0,212,108,124,115,209,37,136,45,6,0,48,0,16,69,26, 9,143,231,40,254,31,247,204,237,75,83,133,170,80,95,200, 246,208,67,119,244,240,157,116,229,118,118,121,97,166,173,120, 131,104,6,252,62,237,239,243,129,71,34,180,1,230,57,12, 0,6,0,32,31,241,127,50,71,241,143,127,253,207,120,54, 39,113,209,175,212,98,132,203,19,149,219,105,253,124,170,114, 59,205,41,240,171,188,48,172,102,96,141,36,32,126,210,111, 127,68,54,224,204,196,0,96,0,0,114,65,38,150,153,150, 135,248,107,221,127,174,67,67,212,189,122,245,42,234,222,121, 162,242,194,67,15,61,52,101,121,161,86,27,28,115,204,49, 241,242,194,76,91,241,134,221,12,172,249,237,55,243,241,30, 123,33,176,24,0,192,0,64,20,105,42,60,149,135,248,43, 63,220,54,62,16,7,246,228,147,64,232,150,219,105,175,253, 76,203,11,239,187,239,190,140,91,241,22,202,12,20,170,214, 127,181,92,215,178,93,122,32,174,33,97,22,6,0,3,0, 144,13,205,132,233,121,138,255,123,13,155,198,219,192,6,237, 244,190,124,205,64,182,229,133,227,199,143,207,187,188,48,87, 51,224,119,173,255,234,239,191,55,31,117,237,134,176,98,0, 0,3,0,81,164,185,240,116,158,226,175,124,115,193,133,5, 13,67,151,226,40,223,100,229,133,67,134,12,73,91,94,216, 163,71,143,120,121,161,38,29,22,203,12,248,89,235,175,95, 254,31,118,238,138,168,134,140,231,49,0,24,0,128,76,104, 33,204,240,65,252,23,87,174,30,63,243,189,88,35,8,102, 64,199,162,69,139,254,87,110,87,140,242,194,116,102,192,175, 90,127,205,246,103,207,63,156,188,128,1,192,0,0,20,77, 252,133,207,250,31,86,178,210,180,160,152,1,183,188,80,191, 252,211,149,23,106,4,33,223,242,66,189,110,253,185,245,231, 247,179,214,95,127,38,74,253,48,0,128,1,0,196,63,35, 126,121,252,9,19,132,81,170,3,123,18,149,23,106,46,64, 166,229,133,51,103,206,244,229,244,66,63,70,252,40,95,132, 20,3,0,24,0,136,30,27,251,44,254,239,53,105,225,203, 145,191,81,53,3,217,150,23,106,245,65,190,229,133,185,142, 229,215,143,70,68,49,0,128,1,128,168,138,255,179,62,138, 191,242,245,153,103,231,36,54,67,135,14,141,11,162,159,189, 248,131,110,6,220,242,66,21,250,116,229,133,106,24,252,40, 47,204,116,252,242,200,163,102,113,5,4,52,236,188,136,1, 192,0,0,20,67,252,149,21,115,231,230,36,56,137,190,134, 253,236,197,31,116,51,160,33,127,13,253,23,179,188,48,217, 248,243,131,15,204,187,117,27,34,160,17,224,37,12,0,6, 0,160,24,226,255,225,54,219,231,44,58,26,1,200,180,23, 127,212,205,128,38,222,233,117,106,114,160,94,119,170,242,66, 189,111,190,118,249,147,222,13,250,28,17,207,104,240,10,6, 0,3,0,96,39,252,21,66,252,149,229,215,94,159,119,178, 156,246,226,239,211,167,79,202,100,185,150,45,91,250,214,139, 191,80,157,248,252,50,3,110,121,161,70,66,18,253,44,26, 57,241,115,124,113,244,96,132,51,66,188,138,1,192,0,0, 20,34,219,223,203,159,121,28,209,155,44,89,110,192,128,1, 41,147,229,26,53,106,100,6,15,30,28,239,197,191,114,229, 202,200,155,1,187,188,80,239,139,159,17,0,109,221,140,104, 98,0,0,3,0,17,108,239,251,76,1,197,255,195,78,157, 11,22,154,215,100,185,169,83,167,102,220,139,255,254,251,239, 55,191,252,242,75,228,205,128,175,247,88,114,55,150,84,171, 133,104,70,140,215,48,0,24,0,224,96,159,167,11,40,254, 241,214,191,23,94,92,20,161,202,182,23,255,132,9,19,10, 150,44,23,214,163,124,255,150,115,240,215,95,236,251,71,148, 55,48,0,24,0,40,95,154,248,112,170,95,38,252,49,251, 205,226,11,151,211,139,255,252,243,207,79,219,139,191,208,229, 133,97,54,3,223,94,124,41,98,25,81,222,196,0,96,0, 160,60,105,36,76,43,130,248,191,191,113,171,188,218,216,250, 53,22,46,92,24,239,197,159,46,139,191,208,229,133,97,50, 3,43,222,126,59,126,118,3,98,25,77,222,198,0,96,0, 160,252,168,47,60,86,4,241,87,190,252,191,147,3,215,249, 207,77,150,219,109,183,221,50,46,47,44,132,137,9,178,25, 32,244,31,125,230,97,0,48,0,80,94,212,21,30,41,146, 248,199,123,255,75,215,184,32,15,183,188,48,211,94,252,133, 42,47,204,215,12,236,177,199,30,190,110,97,124,123,201,101, 136,100,196,121,7,3,128,1,128,242,161,182,240,80,17,197, 127,113,197,170,102,245,15,63,152,176,140,108,123,241,107,121, 97,33,122,241,231,106,6,244,148,63,63,198,202,37,75,204, 226,42,53,16,201,136,179,8,3,128,1,128,242,160,166,112, 95,172,82,81,23,152,15,59,119,53,97,29,110,47,254,76, 203,11,11,213,139,63,27,51,160,71,253,250,49,62,233,187, 31,2,89,6,156,29,171,200,218,136,1,128,168,35,19,194, 220,85,100,241,207,231,240,159,160,141,108,203,11,11,213,139, 63,157,25,232,221,187,119,222,255,198,175,211,158,66,28,203, 128,17,178,30,176,54,98,0,32,226,200,132,48,183,149,64, 252,227,251,255,143,61,110,162,54,220,242,66,237,197,159,174, 188,80,59,242,105,121,161,38,29,22,194,12,104,2,160,86, 45,232,151,191,134,255,243,205,1,208,163,154,151,182,239,132, 64,70,156,91,100,61,168,196,218,136,1,128,104,83,81,184, 161,68,226,31,223,255,255,241,71,19,245,161,189,248,181,188, 48,93,136,190,24,167,23,230,59,190,31,115,35,2,25,113, 238,149,245,160,58,107,35,6,0,162,207,136,82,137,127,200, 247,255,253,232,197,159,174,188,80,35,8,133,42,47,204,101, 172,90,190,220,188,91,191,49,34,25,97,166,74,210,223,70, 214,60,60,138,28,0,12,0,68,147,139,229,229,46,229,98, 243,197,177,199,155,114,30,90,94,168,185,0,153,150,23,206, 156,57,179,96,167,23,102,50,190,62,247,124,68,50,194,232, 41,159,77,172,121,119,64,172,2,199,1,99,0,32,138,156, 81,98,241,87,126,24,123,171,97,228,86,94,168,213,7,133, 40,47,76,250,245,255,221,119,102,73,173,186,8,101,68,81, 161,111,101,205,179,221,68,252,181,7,192,115,24,0,12,0, 68,139,163,2,32,254,241,254,255,175,191,129,242,167,40,47, 84,161,79,87,94,168,134,161,80,229,133,27,68,43,46,184, 16,161,140,112,191,255,78,34,248,238,188,218,70,254,247,28, 167,23,200,147,24,0,12,0,68,7,13,235,45,42,102,163, 159,100,72,255,248,53,69,252,130,13,115,121,161,134,254,75, 89,94,184,250,251,239,205,187,117,234,35,150,17,109,245,219, 221,18,255,54,194,171,214,250,48,25,3,128,1,128,104,208, 195,9,235,5,97,225,249,112,235,237,80,247,28,202,11,53, 41,80,147,3,53,73,48,85,121,225,208,161,67,253,107,249, 203,105,127,145,100,161,172,5,125,45,241,215,253,255,103,61, 235,195,61,244,2,192,0,64,248,217,78,94,244,183,3,34, 254,241,4,192,65,199,162,232,62,148,23,106,217,96,162,242, 66,221,30,240,229,235,95,202,52,223,173,219,16,193,140,32, 71,88,25,254,154,249,63,53,193,250,48,30,3,128,1,128, 112,35,15,214,188,22,32,241,87,150,95,115,29,10,94,160, 242,66,21,127,191,34,0,223,93,125,13,98,25,65,78,178, 196,191,154,112,79,146,114,224,27,49,0,24,0,8,47,141, 132,25,1,19,255,48,156,0,200,144,45,135,53,107,204,7, 173,219,34,152,17,227,18,75,252,181,17,216,205,41,122,129, 92,131,1,192,0,64,120,15,247,153,28,64,241,87,86,46, 92,136,194,6,124,104,155,102,4,51,90,140,22,65,175,96, 173,17,87,164,105,4,54,12,3,128,1,128,240,161,125,188, 199,149,176,203,95,74,42,84,161,2,32,4,227,147,125,250, 33,154,17,226,118,89,15,170,88,107,196,57,25,148,3,95, 64,39,64,12,0,132,143,97,65,21,127,225,253,77,55,67, 93,3,62,254,124,255,253,184,81,67,56,163,193,131,178,30, 212,180,214,135,35,51,236,5,114,6,6,0,3,0,225,98, 112,64,26,253,36,227,227,222,123,163,176,1,31,122,76,51, 194,25,13,166,201,54,96,125,107,125,232,155,69,47,144,19, 49,0,24,0,8,15,61,229,229,94,24,208,125,127,151,47, 143,255,63,20,54,192,99,205,202,149,28,250,19,17,158,151, 181,160,133,181,62,104,211,159,121,89,172,15,71,99,0,48, 0,16,14,182,20,222,12,184,248,43,223,94,114,25,42,27, 224,241,243,195,143,32,158,17,224,117,89,11,182,176,214,135, 142,34,254,217,174,15,135,99,0,48,0,16,124,26,36,232, 226,21,84,56,4,40,216,227,179,1,135,35,160,33,71,155, 126,109,111,117,249,219,84,120,41,135,245,225,0,235,239,0, 12,0,4,144,202,194,221,1,78,250,83,222,104,216,212,140, 63,124,160,25,126,193,5,102,201,130,5,168,108,64,199,234, 95,126,49,75,170,215,70,68,67,140,182,251,222,221,18,110, 237,5,242,76,142,31,7,123,97,0,48,0,16,108,134,6, 60,233,79,197,255,202,243,135,152,203,46,187,44,206,167,159, 126,138,210,6,116,252,56,241,46,68,52,228,28,100,137,182, 44,242,102,74,30,145,193,221,48,0,24,0,8,46,251,203, 11,26,244,5,73,191,252,93,241,87,190,151,211,229,24,212, 254,131,255,12,182,246,236,181,230,255,206,60,35,131,93,49, 0,24,0,8,38,237,132,183,67,176,239,63,124,200,5,27, 24,128,63,255,252,19,165,13,224,88,245,205,55,102,113,165, 106,8,105,72,57,203,18,127,237,246,55,198,135,109,193,78, 24,0,12,0,4,143,218,194,211,33,73,250,211,125,127,219, 0,220,124,243,205,230,197,23,95,52,203,151,47,71,117,131, 20,254,191,227,78,132,52,164,92,233,105,217,123,177,79,219, 130,109,89,107,49,0,16,60,174,15,120,210,95,170,45,0, 155,113,227,198,153,151,95,126,217,252,40,199,206,50,74,156, 253,127,232,64,196,52,132,140,149,181,160,146,181,54,156,234, 99,78,208,198,172,181,24,0,8,22,3,66,176,239,159,42, 9,48,25,227,199,143,55,175,189,246,154,249,249,231,159,81, 227,34,143,181,171,86,153,119,235,54,68,80,67,134,30,227, 91,205,90,27,14,243,57,33,184,1,235,45,6,0,130,67, 219,144,236,251,39,50,1,183,13,60,194,92,126,201,37,105, 141,128,114,251,237,183,155,217,179,103,155,95,127,253,21,117, 46,194,248,253,133,23,17,212,144,49,85,214,129,58,214,218, 176,103,1,186,128,214,100,205,197,0,64,48,168,42,76,13, 161,248,111,208,160,164,86,93,243,104,183,157,205,141,199,254, 59,35,35,160,76,156,56,209,188,245,214,91,230,247,223,127, 71,169,11,52,190,57,255,2,68,53,68,204,144,117,160,177, 181,54,116,205,178,197,111,166,84,100,221,197,0,64,48,56, 39,224,245,254,217,242,102,189,70,102,242,110,61,205,168,147, 78,206,200,8,92,126,249,229,230,238,187,239,54,115,231,206, 53,43,56,78,216,215,241,225,214,219,33,172,33,225,101,17, 250,86,158,22,224,111,20,64,252,213,80,176,238,98,0,32, 0,116,14,193,33,63,249,240,90,147,22,230,254,61,247,54, 215,158,126,70,70,102,96,216,176,97,230,222,123,239,53,243, 231,207,55,43,229,240,26,70,30,229,127,95,125,133,176,134, 197,52,203,26,208,209,42,205,211,131,126,94,40,208,186,240, 26,6,0,3,0,165,71,147,124,166,69,88,252,189,188,216, 178,141,185,187,223,126,102,196,57,231,102,100,6,174,184,226, 10,115,255,253,247,155,133,11,23,210,99,32,135,241,243,228, 41,136,107,8,208,47,242,157,44,241,175,95,224,117,97,38, 6,0,3,0,165,103,72,196,66,255,153,178,176,66,85,243, 92,219,118,230,142,131,251,255,173,153,80,50,134,15,31,110, 30,122,232,33,179,100,201,18,179,74,50,219,25,233,199,215, 103,158,141,192,6,253,93,16,49,182,251,242,107,114,222,131, 5,46,5,158,134,1,192,0,64,105,217,42,226,161,255,76, 89,80,185,186,121,186,227,54,230,182,195,143,48,195,46,186, 40,35,51,112,213,85,87,153,135,31,126,216,188,247,222,123, 102,245,234,213,40,125,146,241,209,142,221,17,217,128,51,208, 234,242,167,135,127,77,40,66,31,144,41,24,0,12,0,148, 142,10,69,112,249,161,12,133,86,171,109,158,216,174,171,25, 123,212,209,25,151,21,142,24,49,194,60,250,232,163,102,233, 210,165,102,205,154,53,168,190,51,214,252,241,135,89,92,165, 6,243,42,192,156,104,137,191,114,109,145,214,132,123,61,221, 5,1,3,0,69,100,96,153,134,254,179,43,43,172,183,174, 172,240,223,199,101,92,86,56,114,228,72,243,248,227,143,155, 143,62,250,168,236,205,192,111,207,191,192,60,10,48,23,123, 196,191,152,219,129,19,48,0,24,0,40,13,13,133,215,9, 253,103,197,236,250,141,205,67,61,122,101,92,86,168,92,123, 237,181,230,201,39,159,52,31,127,252,177,89,187,118,109,217, 25,128,239,174,28,193,220,9,40,218,238,187,130,181,38,156, 88,228,15,130,255,96,0,48,0,80,26,46,35,244,159,23, 175,52,219,196,220,183,215,62,230,154,51,206,204,216,12,92, 127,253,245,102,250,244,233,230,179,207,62,43,159,254,255,253, 15,99,190,4,16,253,250,174,98,173,7,7,149,160,253,247, 181,24,0,12,0,20,159,54,194,2,190,254,125,97,145,240, 194,166,155,153,187,247,221,223,140,56,247,220,140,205,192,232, 209,163,205,140,25,51,204,151,95,126,25,105,3,176,116,203, 142,204,147,128,161,121,63,118,11,222,221,69,252,223,41,193, 122,48,12,3,128,1,128,226,243,31,190,254,11,83,74,85, 81,202,10,183,104,111,110,63,100,192,223,142,40,78,197,13, 55,220,96,158,123,238,57,243,205,55,223,68,47,1,80,238, 9,115,35,56,104,233,93,125,79,3,176,82,157,253,49,212, 147,127,0,24,0,40,48,219,135,236,164,191,176,242,78,229, 26,102,250,86,82,86,56,240,31,82,86,120,113,198,102,224, 166,155,110,50,207,63,255,188,249,238,187,239,66,111,0,254, 120,107,14,115,33,64,204,18,161,111,97,173,5,155,11,175, 150,48,18,120,22,6,0,3,0,197,101,34,95,255,197,47, 43,172,46,101,133,219,239,96,110,62,122,144,185,236,210,75, 51,54,3,183,220,114,139,121,241,197,23,205,247,223,127,31, 74,3,240,227,157,19,121,254,65,105,133,45,66,223,214,90, 7,154,9,51,75,188,13,248,127,24,0,12,0,20,183,223, 63,139,97,105,153,83,187,190,121,100,167,93,204,13,199,29, 159,177,17,80,198,141,27,103,94,121,229,21,243,211,79,63, 133,167,3,224,217,231,242,204,131,80,202,42,66,223,217,234, 242,87,87,120,60,0,57,64,131,48,0,24,0,40,30,183, 240,245,31,40,222,104,208,196,60,180,123,47,115,253,201,167, 100,101,6,38,76,152,96,94,123,237,53,243,203,47,191,4, 218,0,124,210,103,95,158,115,169,183,162,68,232,123,88,226, 47,11,179,153,20,144,117,96,32,6,0,3,0,197,161,189, 192,130,24,224,178,194,230,45,165,172,176,143,25,121,230,89, 89,153,129,59,238,184,195,204,158,61,219,252,246,219,111,193, 171,0,104,183,21,207,182,164,21,42,149,205,1,150,248,87, 10,216,71,192,129,214,207,6,24,0,40,32,215,240,245,31, 154,178,194,231,91,109,110,238,218,239,0,115,213,121,231,101, 108,4,46,191,252,114,51,113,226,68,51,103,206,28,243,251, 239,191,7,194,0,44,169,81,135,103,90,66,142,246,124,97, 95,21,176,53,96,31,12,0,6,0,10,143,150,253,204,163, 238,63,132,101,133,213,204,179,91,118,136,151,21,94,49,116, 104,86,102,224,158,123,238,49,115,231,206,53,43,86,172,40, 137,248,175,146,146,70,158,97,233,56,211,35,254,103,5,176, 237,119,15,12,0,6,0,10,207,191,233,249,31,254,189,92, 57,80,231,169,78,219,154,113,71,28,153,85,89,225,176,97, 195,204,164,73,147,204,59,239,188,99,254,252,243,207,226,149, 0,206,126,147,231,86,34,134,123,26,236,12,14,232,251,191, 3,6,0,3,0,133,63,241,239,25,190,254,35,86,86,88, 199,60,222,101,71,115,243,160,99,178,42,43,28,62,124,184, 121,224,129,7,204,194,133,11,205,95,127,253,85,80,3,240, 243,67,147,121,86,37,224,38,17,255,138,214,251,191,175,136, 236,162,128,190,255,91,99,0,48,0,80,88,118,165,244,47, 210,188,85,167,129,121,164,251,174,102,204,241,39,100,149,60, 120,229,149,87,154,201,147,39,155,37,75,150,152,85,171,86, 249,110,0,150,95,55,138,231,83,100,238,18,241,175,106,189, 251,59,203,187,63,63,192,230,191,45,235,51,6,0,10,203, 8,146,255,202,167,172,176,97,83,243,96,207,61,204,117,167, 156,154,149,25,184,234,170,171,204,195,15,63,108,222,127,255, 125,179,122,245,106,127,122,0,156,121,54,207,164,136,60,34, 66,95,199,122,239,59,137,248,191,21,240,200,223,38,172,207, 24,0,40,28,250,53,240,38,225,255,178,228,101,41,43,156, 180,119,95,51,242,172,236,202,10,175,190,250,106,51,117,234, 84,179,116,233,82,179,102,205,154,156,13,192,23,71,15,230, 57,20,9,221,226,107,100,189,247,173,132,87,66,240,222,55, 98,141,198,0,64,225,216,139,240,63,101,133,21,164,172,176, 181,148,21,238,127,160,148,21,158,159,149,25,184,230,154,107, 204,227,143,63,110,150,45,91,102,214,174,93,155,149,1,248, 116,255,131,184,255,69,224,37,17,250,77,173,119,94,69,117, 70,72,76,127,77,214,104,12,0,20,142,49,132,255,193,83, 86,56,163,93,71,243,223,254,135,74,89,225,133,89,153,129, 235,174,187,206,76,155,54,205,124,242,201,39,25,153,129,247, 123,239,205,61,47,48,179,69,232,59,88,239,123,109,225,145, 16,69,252,42,177,70,99,0,160,48,84,33,252,15,41,203, 10,107,154,167,182,238,108,198,253,227,72,115,249,197,23,103, 101,6,70,141,26,101,158,126,250,105,243,249,231,159,39,53, 0,99,111,252,143,185,237,240,35,226,121,9,220,239,2,84, 130,200,187,221,205,202,162,175,26,178,131,190,244,231,103,157, 198,0,64,129,232,70,248,31,50,100,110,141,141,204,99,93, 187,153,155,6,13,206,170,172,80,25,51,102,140,153,49,99, 134,249,234,171,175,54,48,0,26,49,136,87,27,156,63,4, 19,224,119,36,71,196,115,47,75,252,181,236,239,198,144,69, 251,94,199,0,96,0,160,112,156,77,243,31,200,165,172,112, 163,6,230,225,157,119,51,99,78,56,49,43,35,160,220,120, 227,141,102,230,204,153,230,27,233,2,120,197,21,87,252,239, 255,31,127,248,64,238,173,143,28,230,233,242,119,89,8,183, 250,158,199,0,96,0,160,112,76,37,252,15,249,126,165,53, 106,102,30,236,213,219,92,119,234,105,89,155,129,13,26,16, 93,112,1,247,211,39,78,240,136,255,233,33,53,250,79,97, 0,48,0,80,24,26,113,242,31,248,93,86,216,98,83,115, 239,62,125,205,213,103,159,157,189,1,24,130,1,240,131,161, 30,241,31,24,226,40,223,195,24,0,12,0,20,134,222,236, 255,67,1,203,10,103,181,105,107,38,30,112,80,124,127,63, 19,3,192,22,64,254,92,231,233,239,191,183,188,227,11,67, 28,229,155,228,185,30,192,0,0,251,255,16,34,22,84,210, 178,194,173,204,127,7,28,102,174,184,48,113,89,33,73,128, 249,51,94,196,178,178,245,126,239,40,226,31,246,211,61,255, 139,1,192,0,64,97,184,155,250,127,40,50,243,171,214,52, 211,182,217,206,220,250,143,127,198,67,254,186,239,175,95,254, 136,127,126,60,32,239,114,13,235,221,110,47,204,142,64,126, 207,205,24,0,12,0,248,143,126,41,204,37,1,16,32,244, 60,33,239,113,61,235,221,214,222,249,47,70,228,221,190,14, 3,128,1,0,255,217,130,4,64,128,208,51,83,132,190,185, 245,94,55,16,166,71,200,216,95,129,1,192,0,128,255,244, 37,1,16,32,212,188,42,66,191,185,245,78,107,207,252,201, 17,139,234,93,232,169,104,0,12,0,248,192,169,36,0,2, 132,150,57,34,244,219,90,93,254,180,165,247,127,35,152,211, 115,22,6,0,3,0,254,115,35,9,128,0,225,60,159,65, 196,127,55,75,252,101,65,53,215,71,244,125,62,9,3,128, 1,0,255,121,146,4,64,128,240,245,87,144,247,118,63,75, 252,149,11,35,28,205,27,140,1,192,0,128,255,204,195,0, 0,132,142,163,60,130,248,127,17,223,202,27,136,1,192,0, 128,191,52,164,2,0,32,116,156,238,17,195,254,101,144,200, 123,144,39,218,1,24,0,200,147,78,84,0,0,132,138,97, 158,114,184,61,228,29,94,80,6,81,188,62,24,0,12,0, 248,203,94,24,0,128,208,240,31,17,255,138,214,251,187,189, 188,191,229,210,196,107,119,12,0,6,0,252,229,40,74,0, 1,66,193,68,17,255,170,214,187,219,86,120,189,140,242,119, 186,97,0,48,0,224,47,167,99,0,0,2,143,30,133,91, 219,122,111,181,227,223,172,50,75,222,221,22,3,128,1,0, 127,185,20,3,0,16,104,158,22,161,111,100,189,179,117,203, 180,116,119,11,214,107,12,0,248,203,104,154,0,1,4,22, 61,200,167,165,245,190,234,41,127,247,149,233,59,219,146,245, 26,3,0,254,114,59,6,0,32,144,232,17,190,29,172,119, 85,22,74,51,174,140,223,215,70,172,215,24,0,240,151,135, 105,2,4,16,56,52,179,127,7,207,158,247,213,101,110,214, 107,179,94,99,0,192,95,166,99,0,0,2,133,214,244,247, 246,136,255,185,228,234,152,202,172,215,24,0,240,151,89,24, 0,128,64,49,192,35,254,199,34,254,230,1,79,243,35,192, 0,128,15,188,138,1,0,8,12,199,121,90,252,30,32,102, 96,17,239,168,57,144,18,64,12,0,248,207,28,22,23,128, 64,112,129,71,252,245,152,223,119,120,63,227,31,41,85,89, 171,49,0,224,63,11,89,96,0,74,206,53,158,16,247,54, 34,254,152,243,117,156,195,41,128,24,0,240,159,138,156,4, 8,80,114,180,180,207,78,112,107,195,214,220,255,88,228,233, 131,0,24,0,240,137,10,24,0,128,146,162,77,125,106,88, 239,100,19,225,89,196,127,3,115,196,90,141,1,0,12,0, 64,164,120,92,132,190,174,245,62,110,36,76,69,252,55,160, 39,201,127,24,0,40,28,44,50,0,197,231,57,17,250,102, 214,123,88,77,184,135,174,156,27,48,67,238,81,5,214,104, 12,0,96,0,0,162,148,213,190,153,39,23,231,38,196,63, 109,73,36,96,0,0,3,0,16,90,222,18,241,223,198,19, 214,30,134,248,255,141,121,114,159,26,176,62,99,0,120,0, 133,165,189,48,68,156,246,75,236,61,2,20,148,249,242,142, 237,234,17,255,51,233,242,151,144,145,36,255,97,0,48,0, 197,67,79,26,235,37,139,211,24,121,241,230,97,6,0,124, 47,103,219,215,35,254,71,34,254,73,233,76,242,31,6,0, 3,80,26,52,27,121,160,44,78,247,17,154,4,240,133,127, 121,246,179,251,210,226,55,41,122,66,41,235,48,6,0,3, 80,36,238,16,161,255,167,44,80,245,18,252,90,43,225,116, 249,53,106,147,1,114,227,52,143,248,119,23,241,39,202,150, 156,67,73,254,195,0,96,0,138,199,100,103,49,210,61,202, 27,197,12,232,86,64,165,4,191,111,39,249,255,71,200,175, 191,201,226,5,144,17,151,123,246,178,59,202,59,196,251,147, 156,217,114,111,106,176,38,99,0,48,0,197,227,134,4,161, 126,77,10,60,79,156,248,150,9,126,127,13,231,148,178,219, 229,207,113,150,0,64,98,212,76,87,180,222,155,77,5,146, 109,83,51,148,175,127,12,0,6,160,184,156,155,38,25,73, 35,4,154,176,84,55,193,159,109,42,28,47,191,246,4,11, 27,192,255,184,83,196,191,138,245,158,52,18,158,230,29,73, 203,102,172,199,24,0,12,64,113,57,34,195,108,100,221,183, 212,42,129,221,147,108,17,108,43,255,255,197,242,119,113,144, 9,148,51,83,100,254,215,178,222,11,253,223,83,120,39,210, 114,59,165,127,24,0,12,64,241,233,33,194,157,237,203,250, 162,44,104,26,57,104,155,224,239,211,47,159,189,228,239,188, 89,94,232,249,44,124,80,70,76,151,249,222,208,243,46,220, 65,53,77,70,236,69,233,31,6,0,3,80,124,54,207,179, 35,224,131,178,192,29,145,100,139,160,190,160,37,80,147,49, 2,16,113,94,144,57,190,137,231,176,173,209,136,127,70,60, 47,247,174,18,107,49,6,0,3,80,124,170,251,212,18,88, 183,8,116,193,235,145,100,139,64,163,5,231,136,25,120,30, 51,0,17,227,13,153,211,237,60,243,253,98,26,253,100,204, 73,36,255,97,0,48,0,165,227,69,159,69,89,191,134,206, 78,178,69,160,153,209,218,18,245,58,49,11,111,99,6,32, 228,204,149,57,220,213,19,190,62,25,241,207,152,119,228,254, 53,102,13,198,0,96,0,74,71,33,187,254,61,32,127,247, 192,36,91,4,154,32,213,95,22,207,187,229,247,208,25,13, 194,198,2,153,179,189,61,226,127,24,226,159,21,163,73,254, 195,0,96,0,74,203,181,69,216,171,212,45,130,235,229,223, 217,77,22,204,138,9,126,134,141,157,47,39,202,165,32,44, 244,247,136,191,154,1,122,99,100,199,142,36,255,97,0,48, 0,165,229,140,34,127,181,232,22,193,89,242,111,110,158,228, 231,233,34,139,130,30,147,250,6,139,41,4,148,127,123,246, 173,117,27,96,46,243,53,43,30,167,239,63,6,0,3,80, 122,6,228,80,10,232,23,186,253,112,184,44,166,27,37,248, 185,170,10,253,228,103,187,77,126,207,2,22,87,8,8,67, 60,226,175,29,51,49,171,217,243,15,146,255,48,0,24,128, 210,211,189,132,6,192,222,34,208,196,192,93,147,108,17,104, 55,181,193,178,96,76,101,161,133,18,114,181,103,207,186,133, 240,2,115,50,107,222,242,52,76,2,12,0,6,160,68,180, 244,169,20,208,207,186,224,51,69,236,219,36,249,121,59,8, 23,200,175,191,204,194,11,69,228,86,17,255,202,158,62,23, 211,152,131,57,113,41,95,255,24,0,12,64,48,208,69,45, 168,201,75,186,69,160,153,213,117,18,252,220,218,111,64,79, 47,212,3,141,56,98,21,10,61,15,171,91,115,175,166,240, 32,141,126,114,102,75,214,93,12,0,6,32,56,60,27,112, 1,213,4,43,173,86,216,89,4,191,66,130,159,95,115,8, 180,220,240,126,22,101,240,153,199,100,238,213,245,24,230,241, 204,179,156,185,135,210,63,12,0,6,32,88,76,12,209,130, 54,75,22,100,173,92,104,157,228,90,90,59,149,13,207,17, 21,128,60,81,99,220,212,51,191,174,65,252,243,98,95,74, 255,48,0,24,128,96,113,85,72,23,181,123,229,231,214,42, 134,218,73,174,107,39,249,181,17,242,123,222,194,12,64,150, 232,201,150,222,60,148,33,52,250,201,139,151,228,158,86,97, 189,197,0,96,0,130,197,73,33,95,216,180,173,176,126,153, 117,79,178,69,80,67,56,80,126,237,14,186,14,66,134,89, 234,91,123,190,84,143,67,252,243,230,12,146,255,48,0,24, 128,224,113,64,0,74,1,253,98,166,44,222,167,201,66,211, 42,201,181,54,19,78,144,95,127,18,35,0,9,208,99,172, 119,246,136,255,65,17,122,63,74,133,38,26,55,103,173,197, 0,96,0,130,71,151,136,46,112,154,112,164,45,91,147,213, 28,111,43,191,118,137,152,129,215,48,3,32,104,116,168,175, 71,252,119,151,255,126,135,249,145,55,55,145,252,135,1,192, 0,4,147,102,1,235,5,80,136,45,2,109,226,178,83,146, 45,2,221,151,220,91,126,109,172,252,30,22,251,242,229,72, 79,136,90,13,34,167,86,250,195,46,36,255,97,0,48,0, 193,68,69,177,92,106,233,53,179,251,84,89,232,55,77,114, 47,180,193,203,191,228,215,167,176,240,151,21,167,122,196,95, 207,170,120,149,57,224,11,79,209,247,31,3,128,1,8,54, 79,149,225,98,119,151,124,241,31,34,95,38,53,147,220,147, 182,194,185,34,12,180,123,45,175,206,116,26,17,155,201,51, 247,141,65,36,255,97,0,48,0,193,102,66,25,215,55,207, 145,197,94,203,5,187,37,9,83,234,249,4,122,148,177,158, 87,192,169,111,209,98,140,60,83,123,91,72,155,254,60,198, 51,246,117,251,173,46,235,43,6,0,3,16,108,46,163,193, 73,156,25,178,96,157,34,95,44,45,147,220,167,218,206,9, 138,247,112,191,66,143,150,133,218,117,233,218,238,119,18,207, 213,87,174,36,249,15,3,128,1,8,62,212,57,255,61,35, 92,59,36,30,156,98,139,96,19,65,205,194,51,124,49,134, 142,201,242,204,106,122,206,150,184,5,241,247,157,78,36,255, 97,0,48,0,193,167,47,181,206,41,27,195,104,183,196,29, 82,44,102,93,229,215,174,144,223,51,27,51,16,138,164,180, 6,158,231,119,37,226,239,59,255,199,222,63,6,0,3,16, 14,182,193,0,100,188,69,112,178,44,108,27,39,185,143,213, 4,237,119,174,7,198,44,192,12,4,14,77,232,244,62,187, 179,136,126,249,206,57,136,63,6,0,3,16,30,26,68,188, 23,64,33,182,8,238,20,145,63,48,197,22,129,76,102,115, 172,44,132,83,49,2,129,224,117,121,14,222,163,104,255,133, 248,251,206,133,136,63,6,0,3,16,62,230,32,84,57,241, 166,220,55,13,33,119,77,177,69,208,81,126,109,168,44,140, 47,115,143,75,118,164,116,23,207,243,209,72,13,103,67,248, 203,48,146,254,48,0,24,128,112,194,151,106,254,104,66,160, 238,125,182,72,114,143,245,60,249,61,68,120,110,148,133,114, 30,247,187,40,232,86,76,47,143,248,107,191,255,249,220,127, 95,185,218,83,82,9,24,0,12,64,136,32,11,218,223,45, 2,45,51,211,131,150,106,36,185,223,90,31,125,132,152,133, 7,184,239,5,229,96,143,248,107,102,250,155,136,191,175,140, 150,57,92,145,53,20,3,128,1,8,47,23,178,31,90,176, 45,2,173,16,232,146,98,139,64,207,158,63,83,238,63,29, 232,252,229,88,207,126,180,158,18,201,54,140,191,220,44,115, 187,50,235,39,6,0,3,16,110,142,198,0,20,156,233,34, 62,39,166,216,34,208,16,106,119,49,10,26,78,125,11,161, 202,139,243,60,226,223,72,152,193,61,245,149,241,158,102,74, 128,1,192,0,132,148,222,148,2,22,117,139,224,191,178,120, 238,47,247,188,122,146,231,81,211,57,139,94,171,13,72,86, 203,142,17,158,100,52,237,224,248,8,247,208,87,116,94,86, 99,221,196,0,96,0,162,65,123,74,1,75,182,69,160,217, 211,219,167,216,34,104,46,104,228,96,26,34,150,22,205,101, 169,100,221,187,170,194,68,242,44,124,69,91,38,215,100,205, 196,0,96,0,162,67,29,12,64,32,186,212,157,32,66,223, 60,197,115,210,115,234,245,4,187,215,48,3,127,227,94,17, 166,234,158,131,156,110,68,252,125,229,65,185,159,181,89,47, 49,0,24,128,232,241,58,162,18,8,22,202,115,208,19,26, 247,19,177,79,22,102,213,189,215,125,228,215,245,139,247,29, 158,91,188,140,117,35,14,185,42,40,143,112,186,31,6,0, 3,16,93,38,35,36,129,67,207,23,184,92,132,172,115,138, 45,2,237,228,120,148,68,5,166,148,233,243,211,228,190,38, 158,123,114,42,73,173,190,242,184,220,227,250,172,145,24,0, 12,64,116,185,129,47,166,64,163,57,0,199,139,176,53,77, 241,12,181,221,173,102,192,191,80,38,102,224,21,185,206,214, 158,123,48,16,241,247,125,107,170,17,235,35,6,0,3,16, 109,206,101,225,12,205,22,129,150,96,245,75,177,69,160,251, 223,61,228,215,175,151,223,55,55,162,102,64,19,40,183,242, 68,70,246,150,255,94,72,36,203,215,232,74,115,214,70,12, 0,6,32,250,252,3,3,16,58,222,144,5,90,247,186,183, 77,177,69,160,73,91,135,202,179,189,39,66,17,30,109,165, 220,221,115,205,59,202,127,211,98,217,63,102,201,189,220,132, 117,17,3,128,1,40,15,122,208,11,32,212,60,41,11,246, 191,69,232,155,164,120,198,45,157,253,241,48,55,197,209,47, 252,62,30,241,215,50,214,217,136,191,111,188,152,96,107,5, 48,0,24,128,8,179,57,165,128,145,217,34,184,77,190,246, 251,138,72,86,77,241,188,245,4,195,225,242,251,194,214,27, 255,8,79,151,63,253,74,125,1,241,247,141,87,229,94,182, 101,61,196,0,96,0,202,139,234,24,128,200,161,165,157,151, 136,96,110,147,98,139,64,159,187,150,28,106,94,65,208,247, 207,79,246,136,191,86,64,60,133,248,251,58,95,58,176,22, 98,0,48,0,229,201,139,44,166,145,229,9,121,182,122,64, 78,227,20,207,95,183,15,244,247,60,22,192,121,112,177,71, 252,107,82,186,234,123,82,101,42,163,8,24,0,12,64,196, 185,143,82,192,200,179,64,22,250,91,229,57,235,62,122,170, 195,92,52,195,94,79,137,124,37,0,34,59,202,115,222,188, 254,220,255,101,174,250,198,28,121,198,93,16,127,192,0,148, 55,215,177,168,150,21,218,82,88,191,172,183,78,177,248,87, 118,14,139,210,182,186,165,200,178,255,175,231,212,185,10,204, 83,95,153,155,160,162,2,48,0,24,128,50,228,12,74,1, 203,22,13,251,15,150,231,159,170,233,75,93,167,92,244,129, 34,9,240,67,242,51,121,15,158,25,202,28,245,141,249,114, 127,123,32,254,128,1,0,101,0,165,128,108,17,136,40,232, 25,3,251,164,217,34,144,23,213,156,37,98,60,171,64,81, 129,105,9,218,207,158,128,248,251,134,158,33,177,39,226,15, 24,0,112,233,142,1,0,79,73,216,69,34,186,91,165,16, 138,10,206,188,185,90,76,195,28,159,204,192,243,242,247,180, 240,252,59,253,153,155,190,150,138,246,67,252,1,3,0,222, 70,49,44,144,144,236,196,189,99,210,108,17,104,184,254,96, 17,150,59,197,12,44,202,209,12,104,41,218,22,158,191,183, 151,252,157,11,200,248,247,5,125,46,7,35,254,128,1,128, 68,9,95,244,82,135,116,161,227,177,34,240,123,165,217,34, 208,47,248,19,197,48,76,203,98,62,189,45,191,119,59,143, 56,109,47,255,253,54,115,210,55,6,122,202,41,1,48,0, 240,63,158,99,177,133,44,182,8,180,84,176,99,154,47,74, 61,206,248,82,249,125,175,167,152,91,106,44,118,247,252,61, 218,145,238,117,230,163,111,28,133,248,3,6,0,82,49,145, 18,43,200,129,71,69,168,143,22,129,105,152,98,110,105,196, 64,251,15,104,146,225,59,150,176,107,88,250,64,143,248,235, 41,116,179,16,127,223,56,30,241,7,12,0,164,227,42,12, 0,228,185,69,112,179,204,161,61,211,108,17,168,81,80,195, 240,176,147,91,224,45,55,124,2,241,47,88,11,101,0,12, 0,36,228,36,74,173,192,39,180,139,224,5,50,159,178,233, 47,95,131,142,148,190,114,14,226,15,24,0,200,148,3,41, 183,130,2,240,136,152,1,221,131,110,144,98,238,201,194,16, 111,83,204,253,242,135,139,16,127,192,0,64,54,116,197,0, 64,129,187,207,253,71,68,94,219,11,87,246,204,189,17,136, 191,111,12,147,123,201,122,6,24,0,200,138,102,244,2,128, 34,241,178,152,129,33,242,149,218,94,230,220,57,108,61,249, 198,72,207,225,73,0,24,0,200,8,93,56,230,147,128,5, 16,74,70,139,248,87,100,29,3,12,0,228,202,83,24,0, 128,208,161,213,23,149,89,191,0,3,0,249,48,129,189,88, 128,80,49,222,115,108,50,0,6,0,114,226,114,12,0,64, 104,208,230,93,213,88,183,0,3,0,126,112,28,9,89,0, 161,96,146,136,127,77,214,44,192,0,128,95,244,165,20,16, 32,240,60,36,185,58,181,89,175,0,3,0,126,178,13,6, 0,32,240,141,149,234,178,86,1,6,0,252,166,1,189,0, 0,2,139,158,147,208,128,117,10,48,0,80,40,230,80,10, 8,16,56,180,68,183,49,235,19,96,0,160,144,60,134,1, 0,8,20,51,228,157,108,206,218,4,24,0,40,52,183,80, 10,8,16,24,102,137,248,111,194,186,4,24,0,40,6,23, 82,10,8,16,8,94,20,241,111,205,154,4,24,0,40,22, 71,99,0,0,74,206,171,34,254,109,89,143,0,3,0,197, 100,79,74,1,1,74,202,235,34,254,29,88,139,0,3,0, 197,166,3,165,128,0,37,227,77,17,255,109,197,132,179,22, 1,6,0,138,78,29,12,0,64,73,208,18,220,174,136,63, 96,0,160,148,116,146,69,104,132,84,3,204,165,36,16,160, 40,204,147,119,173,59,226,15,24,0,8,10,218,114,244,88, 73,10,156,142,17,0,40,24,243,229,253,234,129,248,3,6, 0,130,138,46,80,218,35,96,33,102,0,192,55,222,145,247, 105,79,196,31,48,0,60,132,48,208,66,56,75,162,2,47, 99,4,0,242,66,205,116,63,196,31,48,0,24,128,176,33, 15,210,28,32,139,215,125,116,14,4,200,154,69,34,254,7, 35,254,128,1,192,0,132,157,246,194,48,49,2,28,36,4, 144,25,3,37,138,198,218,1,24,0,12,64,164,74,8,143, 146,133,237,73,140,0,64,82,142,70,252,1,3,128,1,136, 50,90,210,116,163,68,5,22,96,6,0,254,199,241,136,63, 96,0,48,0,229,66,83,225,52,89,244,94,192,8,64,153, 115,10,226,15,24,0,12,64,57,82,89,232,43,81,129,187, 73,26,132,50,228,92,196,31,48,0,24,0,136,197,79,57, 187,68,22,196,55,137,10,64,25,112,17,226,15,24,0,12, 0,108,72,77,225,31,178,56,78,197,8,64,68,209,234,24, 222,117,192,0,96,0,32,5,59,200,246,192,40,89,44,231, 99,6,32,34,140,148,249,92,129,119,27,48,0,24,0,200, 140,70,194,73,18,21,152,133,17,128,16,51,90,196,191,34, 239,51,96,0,48,0,144,61,50,89,204,94,18,21,184,131, 164,65,8,25,99,101,206,86,230,29,6,12,0,6,0,242, 167,141,48,84,162,2,111,16,21,128,128,51,94,196,191,10, 239,44,96,0,48,0,224,47,53,132,195,196,8,60,140,17, 128,0,50,81,196,191,26,239,41,96,0,48,0,80,88,182, 147,237,129,107,100,193,157,135,25,128,0,48,73,230,98,77, 222,75,192,0,96,0,160,120,212,23,180,189,234,12,140,0, 148,136,135,100,238,213,230,93,4,12,0,6,0,74,131,150, 91,245,146,168,128,238,193,46,194,12,64,145,120,84,230,90, 93,222,63,192,0,96,0,32,24,180,20,206,147,168,192,171, 24,1,40,32,79,200,252,106,192,251,6,24,0,12,0,4, 15,77,200,58,68,162,2,15,97,4,192,103,166,203,156,106, 204,59,6,24,0,12,0,4,159,78,98,4,174,146,237,129, 185,152,1,200,19,205,55,105,206,59,5,24,0,12,0,132, 11,221,175,29,44,219,3,211,49,2,144,3,207,203,188,105, 201,123,4,24,0,12,0,132,155,221,36,42,112,139,68,5, 22,98,6,32,3,94,146,121,210,154,247,6,48,0,24,0, 136,14,45,132,179,36,42,240,50,70,0,146,160,9,165,91, 240,174,0,6,0,3,0,209,68,91,184,30,32,81,129,251, 56,127,0,44,180,5,117,7,222,15,192,0,96,0,160,60, 104,47,232,89,238,115,136,10,148,53,111,202,243,223,86,76, 33,239,4,96,0,48,0,80,102,104,135,183,127,201,246,192, 147,24,129,178,67,205,95,87,196,31,48,0,24,0,128,238, 34,6,55,74,84,96,1,102,32,242,232,25,19,221,17,127, 192,0,96,0,0,108,154,10,167,74,84,224,5,140,64,36, 153,47,207,181,7,226,15,24,0,12,0,64,50,42,11,125, 69,40,238,34,105,48,50,188,35,226,191,39,226,15,24,0, 12,0,64,166,180,21,46,150,168,192,155,68,5,66,139,246, 131,216,23,241,7,12,0,6,0,32,23,244,76,248,35,196, 8,76,197,8,132,10,61,65,242,16,196,31,48,0,24,0, 0,63,208,12,242,81,178,61,48,31,51,16,120,6,138,105, 99,206,2,6,0,3,0,224,43,141,132,255,19,129,153,133, 17,8,36,71,35,254,0,24,0,128,66,34,47,128,217,75, 162,2,183,147,52,24,24,78,64,252,1,48,0,0,197,164, 181,112,129,136,207,27,68,5,74,198,169,136,63,0,6,0, 160,84,212,16,14,21,33,154,130,17,40,42,231,34,254,0, 24,0,128,160,208,89,182,7,174,145,237,129,121,152,129,130, 114,49,226,15,128,1,0,8,34,245,133,227,68,164,102,96, 4,124,231,10,49,88,204,49,0,12,0,64,160,145,151,198, 244,146,168,192,109,34,90,139,48,3,121,51,82,238,99,5, 230,21,0,6,0,32,76,180,20,116,223,250,85,140,64,78, 140,17,241,175,200,60,2,192,0,0,132,149,170,194,193,18, 21,120,144,82,194,140,25,43,247,170,50,115,7,0,3,0, 16,21,58,137,17,184,74,196,109,46,81,129,164,76,144,251, 83,133,185,2,128,1,0,136,34,117,133,99,100,123,96,58, 70,96,3,38,138,248,87,99,126,0,96,0,0,202,129,221, 36,42,160,33,239,133,101,110,6,38,201,61,168,201,124,0, 192,0,0,148,27,45,132,51,37,42,240,114,25,26,129,135, 228,154,107,51,7,0,48,0,0,229,140,238,127,239,47,81, 129,73,101,146,52,248,168,136,127,93,158,59,0,6,0,0, 214,211,94,24,38,70,96,78,68,163,2,79,200,117,53,224, 57,3,96,0,0,32,49,26,30,255,151,108,15,60,25,33, 35,160,9,144,141,121,182,0,24,0,0,200,140,238,178,61, 112,163,68,5,22,132,216,12,104,203,228,230,60,75,0,12, 0,0,100,79,83,65,143,199,125,33,100,70,224,121,249,121, 91,242,252,0,48,0,0,144,31,218,49,175,175,68,5,38, 134,32,105,240,37,17,255,54,60,51,0,12,0,0,248,75, 91,65,143,206,125,51,128,81,1,61,19,97,11,158,17,0, 6,0,0,10,135,54,212,25,40,70,96,106,64,140,192,27, 242,115,116,224,185,0,96,0,0,160,120,116,149,237,129,235, 101,123,96,126,137,204,128,70,35,182,149,159,129,103,1,128, 1,0,128,18,208,72,56,81,162,2,51,139,104,4,180,127, 65,87,196,31,0,3,0,0,165,167,162,176,167,136,242,127, 11,156,52,56,79,196,191,59,226,15,128,1,0,128,224,209, 90,184,64,162,2,111,248,28,21,208,237,134,221,17,127,0, 12,0,0,4,155,26,194,0,17,236,41,62,24,1,109,80, 180,23,226,15,128,1,0,128,112,209,89,196,123,164,108,15, 204,203,193,12,232,145,198,251,34,254,0,24,0,0,8,47, 245,133,127,203,246,192,140,12,141,192,34,249,125,135,32,254, 0,24,0,0,136,6,178,16,152,158,34,236,227,36,42,176, 40,133,25,208,190,3,220,47,0,12,0,0,68,16,237,225, 127,174,8,253,171,30,35,112,52,226,15,128,1,0,128,232, 83,85,56,72,162,2,15,72,84,224,4,196,31,0,3,0, 0,0,0,24,0,0,0,0,192,0,0,0,0,0,6,0, 0,0,0,48,0,0,0,0,128,1,0,0,0,0,12,0, 0,0,0,96,0,0,32,20,84,170,84,201,84,175,94,157, 123,1,128,1,0,128,114,96,208,160,65,102,222,188,121,102, 229,202,149,102,237,218,181,230,163,143,62,50,163,70,141,50, 181,107,215,230,254,0,96,0,32,136,52,110,220,216,180,105, 211,38,41,117,235,214,13,253,53,100,74,171,86,173,76,163, 70,141,76,181,106,213,152,27,89,112,195,13,55,152,100,227, 221,119,223,53,53,106,212,224,62,1,96,0,32,104,124,248, 225,135,38,213,152,50,101,74,232,175,33,151,241,231,159,127, 154,229,203,151,155,101,203,150,153,183,223,126,219,220,115,207, 61,230,188,243,206,51,125,250,244,49,45,90,180,96,238,56, 116,233,210,197,172,89,179,38,229,189,188,250,234,171,185,87, 0,24,0,8,26,31,127,252,113,202,197,251,209,71,31,13, 253,53,20,98,124,251,237,183,102,194,132,9,166,87,175,94, 166,98,197,242,237,141,63,116,232,208,180,247,106,201,146,37, 188,107,0,24,0,192,0,68,195,0,216,227,243,207,63,55, 215,93,119,157,217,108,179,205,202,110,254,220,126,251,237,105, 239,207,95,127,253,21,79,14,228,125,3,192,0,0,6,32, 82,6,192,29,43,86,172,48,151,93,118,89,89,101,193,107, 20,36,147,209,176,97,67,222,55,0,12,0,96,0,162,105, 0,220,161,57,9,125,251,246,45,139,249,115,203,45,183,164, 189,31,191,255,254,187,169,80,161,2,239,27,0,6,0,48, 0,209,54,0,58,180,20,238,184,227,142,139,252,252,57,251, 236,179,211,222,11,45,15,228,93,203,141,253,246,219,207,124, 242,201,39,27,48,115,230,76,238,13,6,0,3,0,24,128, 160,26,0,215,4,28,127,252,241,145,158,63,45,91,182,52, 191,253,246,91,202,251,112,202,41,167,240,174,249,152,99,161, 57,39,220,27,12,0,6,0,48,0,25,92,131,214,162,31, 121,228,145,73,249,231,63,255,105,6,15,30,108,78,59,237, 180,120,86,251,85,87,93,21,15,109,207,154,53,43,158,237, 159,175,9,208,38,57,81,158,67,39,158,120,162,89,189,122, 117,194,235,159,62,125,122,89,87,73,228,131,222,183,111,190, 249,6,3,0,24,0,192,0,148,234,26,180,57,144,134,98, 239,188,243,78,243,227,143,63,102,109,2,126,253,245,87,211, 188,121,243,72,207,163,29,119,220,209,220,127,255,253,102,241, 226,197,241,48,181,10,191,70,63,216,251,207,157,110,221,186, 37,173,58,225,254,96,0,48,0,128,1,40,242,53,84,169, 82,197,28,126,248,225,241,86,183,217,140,187,238,186,139,249, 6,89,49,124,248,112,12,0,96,0,0,3,16,180,107,208, 118,193,186,93,176,106,213,170,140,183,2,186,119,239,206,156, 131,140,209,228,73,12,0,96,0,0,3,16,208,107,56,232, 160,131,226,109,131,51,25,143,60,242,8,115,14,50,98,211, 77,55,77,217,120,138,123,132,1,192,0,0,6,32,0,215, 160,249,1,250,133,159,110,104,182,60,7,13,65,38,156,116, 210,73,24,0,192,0,0,6,32,12,215,144,73,75,92,29, 122,152,16,243,14,210,49,109,218,52,12,0,96,0,0,3, 16,134,107,208,35,137,51,169,16,184,233,166,155,152,119,144, 146,90,181,106,197,219,74,99,0,0,3,0,24,128,144,92, 195,184,113,227,210,26,128,183,222,122,139,121,7,41,57,240, 192,3,211,30,62,197,125,194,0,96,0,0,3,16,160,107, 208,92,128,116,227,179,207,62,43,233,189,210,206,125,90,198, 120,241,197,23,199,75,19,95,127,253,117,51,119,238,220,248, 249,5,175,190,250,170,121,248,225,135,227,77,144,46,189,244, 210,120,131,31,253,26,141,210,124,111,223,190,189,57,249,228, 147,227,205,158,38,78,156,104,102,204,152,17,239,93,240,245, 215,95,199,75,59,223,126,251,109,243,220,115,207,153,41,83, 166,152,209,163,71,199,239,149,38,228,21,227,103,107,208,160, 129,57,255,252,243,205,23,95,124,129,1,0,12,0,96,0, 194,116,13,122,10,96,186,138,0,253,245,108,255,222,26,53, 106,152,159,127,254,57,254,103,189,172,92,185,50,222,155,32, 221,223,209,174,93,187,120,35,163,76,203,22,221,209,164,73, 147,156,127,54,151,125,246,217,39,175,251,154,234,223,208,109, 151,116,157,6,219,180,105,99,134,12,25,146,180,172,46,147, 161,162,172,134,160,16,71,62,235,179,25,59,118,108,252,208, 164,76,71,170,251,157,138,103,159,125,150,117,15,3,128,1, 0,12,64,41,126,22,29,117,235,214,205,234,239,172,93,187, 118,202,191,111,147,77,54,73,250,103,59,118,236,104,30,120, 224,1,179,102,205,154,172,69,239,167,159,126,202,251,103,211, 49,96,192,128,188,238,105,186,127,163,109,219,182,9,255,156, 138,245,211,79,63,237,235,249,14,122,31,181,156,115,235,173, 183,206,123,174,236,181,215,94,230,201,39,159,204,168,130,196, 175,193,22,20,6,0,3,0,24,128,2,49,123,246,236,180, 139,176,126,145,250,41,128,93,187,118,77,248,231,246,223,127, 255,172,190,42,189,67,175,37,12,6,224,144,67,14,217,224, 247,107,68,224,244,211,79,79,123,72,81,62,67,147,244,78, 56,225,132,156,175,233,153,103,158,41,201,1,85,24,0,12, 0,6,0,48,0,5,66,247,148,83,13,61,52,39,219,115, 1,210,9,160,230,30,120,255,76,170,3,122,50,29,247,220, 115,79,40,12,192,101,151,93,246,191,223,219,170,85,43,243, 202,43,175,20,77,80,39,77,154,100,42,85,170,148,245,53, 233,1,85,24,0,192,0,0,226,25,161,107,208,164,186,116, 67,15,23,242,83,0,143,61,246,216,255,253,94,61,124,71, 19,220,252,24,151,92,114,73,40,12,128,38,46,234,239,171, 87,175,94,60,161,175,216,227,218,107,175,197,0,0,6,0, 48,0,229,126,13,233,14,9,210,36,188,108,79,200,75,39, 128,23,94,120,225,255,126,175,138,182,95,99,224,192,129,161, 48,0,90,193,80,185,114,229,120,130,91,169,70,38,247,10, 3,0,24,0,64,60,35,122,13,42,236,233,246,157,53,155, 220,111,1,252,207,127,254,19,255,125,59,237,180,83,86,89, 254,186,143,173,226,185,116,233,210,120,53,129,119,108,183,221, 118,161,48,0,154,68,119,223,125,247,101,116,205,154,19,161, 251,239,250,213,174,149,1,199,29,119,92,188,212,111,208,160, 65,230,172,179,206,138,223,75,173,22,200,54,105,242,151,95, 126,137,71,32,50,189,38,141,210,60,244,208,67,9,201,36, 145,52,217,159,77,71,38,81,29,192,0,96,0,48,0,24, 128,44,233,210,165,75,218,133,91,235,204,253,22,64,93,216, 235,212,169,19,23,242,116,249,7,250,149,172,162,215,172,89, 179,191,153,23,205,77,208,19,11,143,56,226,8,115,206,57, 231,152,154,53,107,134,194,0,164,27,127,253,245,151,185,245, 214,91,205,174,187,238,106,170,86,173,154,113,103,199,203,47, 191,220,252,240,195,15,25,255,59,90,195,239,199,60,186,232, 162,139,232,3,0,24,0,192,0,132,233,26,50,9,191,171, 88,251,45,128,47,189,244,146,185,227,142,59,82,254,30,21, 254,45,183,220,210,247,107,14,186,1,208,51,26,52,49,48, 215,127,187,97,195,134,230,249,231,159,207,184,87,64,38,61, 25,48,0,128,1,0,196,51,98,215,48,103,206,156,180,34, 113,244,209,71,23,85,0,127,253,245,87,243,207,127,254,179, 96,215,28,84,3,160,209,14,141,116,248,113,141,42,234,211, 167,79,207,232,223,237,223,191,63,6,0,48,0,128,1,40, 167,107,56,248,224,131,51,18,37,253,162,44,150,1,208,46, 121,154,23,80,200,235,14,162,1,208,251,156,168,52,50,31, 180,133,112,38,249,21,55,220,112,3,6,0,48,0,128,1, 40,151,107,208,86,181,153,36,110,105,40,185,88,95,192,223, 125,247,157,233,220,185,115,193,239,125,16,13,192,213,87,95, 93,144,107,213,51,18,252,104,158,132,1,0,12,0,32,158, 17,184,6,109,2,115,247,221,119,103,36,76,167,156,114,74, 81,4,80,179,226,243,237,191,31,86,3,240,254,251,239,199, 207,100,40,196,181,54,109,218,52,158,237,159,46,225,80,13, 33,6,0,48,0,128,120,70,248,26,116,111,88,147,250,50, 25,31,124,240,129,169,86,173,90,81,12,192,168,81,163,138, 118,239,131,102,0,14,61,244,208,130,94,175,86,19,164,27, 90,13,130,1,0,12,0,32,158,17,189,6,45,151,123,237, 181,215,50,22,166,190,125,251,22,69,0,181,19,94,166,165, 110,81,51,0,154,243,144,171,201,202,148,179,207,62,59,237, 207,161,135,252,96,0,0,3,0,136,103,132,174,65,107,229, 119,220,113,71,51,121,242,228,172,190,200,245,244,184,98,125, 1,31,117,212,81,69,189,247,65,50,0,227,199,143,15,68, 178,103,190,81,8,12,0,96,0,0,3,80,226,107,80,193, 111,217,178,101,60,163,92,67,191,90,231,157,237,248,244,211, 79,227,127,71,49,4,80,255,45,63,234,208,195,106,0,246, 222,123,239,130,95,175,38,86,166,27,199,31,127,60,6,0, 48,0,128,1,8,194,53,232,254,187,214,132,39,66,79,205, 211,176,174,54,241,25,57,114,164,185,233,166,155,204,253,247, 223,111,230,206,157,155,215,81,186,174,32,235,153,244,197,16, 89,29,218,218,182,216,247,62,72,6,32,219,67,150,114,161, 110,221,186,105,127,142,243,206,59,15,3,0,24,0,192,0, 4,225,26,74,49,252,18,255,108,4,176,24,101,127,65,53, 0,95,126,249,101,209,174,57,93,123,96,21,112,12,0,96, 0,0,3,80,134,6,64,107,193,253,18,255,76,5,80,69, 169,98,197,138,101,107,0,158,126,250,233,162,93,179,10,48, 6,0,48,0,128,1,192,0,252,111,252,252,243,207,241,90, 127,191,133,56,19,1,44,213,115,10,138,1,240,163,3,31, 6,0,48,0,24,0,12,0,6,32,235,161,253,0,90,180, 104,81,50,145,45,102,237,127,16,13,192,176,97,195,48,0, 128,1,192,0,0,6,160,56,99,217,178,101,241,35,99,55, 223,124,243,146,139,236,208,161,67,203,218,0,156,123,238,185, 24,0,40,7,3,176,31,6,0,48,0,37,48,0,122,200, 204,130,5,11,226,245,230,61,123,246,140,151,9,6,69,100, 79,56,225,132,178,54,0,90,205,129,1,128,136,51,192,49, 0,189,139,101,0,234,122,12,192,106,30,2,6,32,138,6, 64,251,231,107,159,119,93,92,181,155,158,118,249,211,196,50, 173,255,87,113,213,6,64,249,246,120,47,164,0,30,118,216, 97,101,109,0,142,60,242,72,12,0,68,153,213,25,26,128, 186,126,24,128,106,73,12,192,31,60,8,12,64,216,174,225, 169,167,158,138,139,72,50,106,213,170,85,146,12,250,32,137, 108,216,13,64,49,175,31,3,0,37,224,143,44,13,64,181, 66,24,128,31,121,16,24,0,174,1,3,128,1,192,0,64, 81,249,209,99,0,118,22,182,19,58,248,105,0,42,10,149, 61,6,160,145,208,66,104,35,124,193,131,192,0,112,13,24, 0,12,0,6,0,138,202,151,142,1,216,55,129,1,104,227, 104,116,35,143,1,168,236,104,186,111,6,96,1,15,2,3, 192,53,96,0,48,0,24,0,40,42,139,132,254,142,1,216, 163,24,6,160,102,2,3,240,2,15,2,3,192,53,96,0, 48,0,24,0,40,42,47,59,6,160,159,99,0,186,11,157, 133,246,9,12,64,77,191,12,192,70,66,67,161,185,208,90, 152,194,131,192,0,112,13,24,0,12,0,6,0,138,202,227, 194,33,142,1,232,37,236,100,25,128,214,142,70,55,116,52, 187,96,6,224,6,30,4,6,128,107,192,0,96,0,48,0, 80,84,38,56,6,160,175,208,211,49,0,219,10,237,252,50, 0,49,203,0,84,245,24,128,102,66,43,225,60,30,4,6, 128,107,192,0,96,0,48,0,80,84,70,8,7,11,125,28, 3,208,77,216,70,216,210,209,230,102,30,3,80,213,50,0, 177,92,12,64,13,161,142,208,192,249,203,55,21,254,193,131, 192,0,112,13,24,0,12,0,6,0,138,202,57,194,65,142, 1,216,93,216,209,50,0,155,58,26,221,192,209,236,26,249, 24,128,74,9,12,64,83,231,31,217,137,7,129,1,224,26, 48,0,24,0,12,0,20,149,99,132,3,133,125,132,30,194, 14,194,214,194,22,142,54,55,77,96,0,42,101,107,0,42, 120,12,64,109,161,190,208,68,104,41,180,21,190,231,97,96, 0,184,6,12,0,6,0,3,0,69,65,53,247,48,225,0, 97,47,97,55,161,171,208,201,209,228,150,142,70,215,119,52, 219,54,0,21,114,49,0,238,121,0,250,151,213,115,254,242, 77,132,205,133,23,121,32,24,0,174,1,3,128,1,40,141, 1,248,254,251,239,89,187,202,139,87,98,127,63,10,184,139, 176,149,163,201,155,56,26,93,207,209,236,172,207,1,72,102, 0,18,157,8,72,37,0,6,128,107,192,0,96,0,10,100, 0,134,12,25,146,246,122,235,212,169,195,250,85,94,21,0, 222,46,128,122,14,128,183,13,112,206,39,1,38,43,5,76, 212,13,112,16,15,4,3,192,53,96,0,48,0,133,49,0, 122,180,113,186,209,185,115,103,214,175,242,97,72,138,30,0, 190,116,1,204,180,23,64,43,39,244,176,150,135,130,1,224, 26,48,0,24,0,255,13,192,192,129,3,211,94,239,33,135, 28,194,250,85,30,168,214,30,229,169,0,232,102,245,0,104, 229,87,15,0,175,1,72,86,9,160,89,135,115,121,48,24, 0,174,1,3,128,1,240,223,0,236,179,207,62,105,175,119, 196,136,17,172,95,229,193,124,225,112,167,2,96,239,44,42, 0,114,50,0,222,82,192,234,158,74,0,55,17,112,20,15, 6,3,192,53,96,0,48,0,254,27,128,214,173,91,167,189, 222,95,127,253,213,52,109,218,148,53,44,250,140,243,36,0, 238,154,36,1,176,190,149,0,152,83,9,96,54,137,128,253, 121,48,24,0,174,1,3,128,1,240,223,0,40,95,127,253, 117,218,107,30,59,118,44,107,88,244,57,61,150,252,20,64, 95,19,0,83,229,1,212,141,109,120,38,128,254,227,95,242, 112,48,0,92,3,6,0,3,224,191,1,208,57,155,110,172, 90,181,202,244,235,215,143,117,44,186,124,37,12,140,253,189, 5,112,162,51,0,114,62,5,48,155,60,128,102,86,30,192, 109,60,160,232,27,128,53,107,214,152,249,243,231,23,157,105, 211,166,97,0,48,0,101,107,0,6,15,30,108,50,29,55, 220,112,131,169,94,189,58,235,89,244,184,59,182,190,1,144, 238,255,239,150,96,255,191,153,159,251,255,182,1,72,214,17, 208,205,3,96,27,160,12,12,64,169,198,242,229,203,49,0, 24,128,178,53,0,42,232,223,125,247,93,198,239,203,187,239, 190,107,198,140,25,99,142,57,230,24,211,163,71,15,179,213, 86,91,153,93,118,217,197,28,120,224,129,230,248,227,143,55, 183,220,114,139,121,235,173,183,204,79,63,253,100,54,219,108, 51,214,190,112,112,134,83,255,191,159,83,255,191,75,154,253, 127,111,11,224,156,12,64,178,60,0,111,63,0,173,65,252, 128,135,132,1,192,0,96,0,48,0,254,26,0,101,248,240, 225,5,121,183,58,117,234,196,218,23,124,150,10,71,56,225, 255,190,25,214,255,231,189,255,159,73,63,0,247,104,96,61, 133,104,24,15,10,3,128,1,192,0,96,0,252,55,0,53, 107,214,52,139,23,47,198,0,148,39,99,60,225,127,45,255, 219,209,9,255,39,59,2,56,239,253,255,116,121,0,245,157, 154,195,150,78,8,162,187,240,39,15,11,3,128,1,192,0, 96,0,252,53,0,138,138,245,31,127,252,129,1,40,47,84, 83,143,113,182,217,147,133,255,91,58,90,92,223,207,253,255, 68,121,0,137,202,1,237,109,128,73,60,48,12,0,6,0, 3,128,1,240,223,0,40,187,239,190,123,86,249,0,24,128, 208,51,217,201,254,63,200,202,254,79,20,254,79,86,254,151, 183,1,176,243,0,146,109,3,184,213,0,251,242,192,48,0, 24,0,12,0,6,160,48,6,32,230,52,7,122,227,141,55, 48,0,229,193,201,86,243,159,189,82,100,255,39,10,255,87, 242,67,252,147,109,3,120,171,1,180,17,65,71,225,105,30, 90,56,89,180,104,81,32,13,192,39,159,124,226,219,53,220, 123,239,189,161,126,70,53,106,212,48,43,86,172,72,121,141, 125,251,246,141,236,207,22,180,235,127,239,189,247,82,254,44, 103,158,121,102,193,254,109,189,206,151,94,122,41,231,247,234, 149,87,94,49,205,155,55,103,237,11,46,207,57,201,127,238, 225,63,110,243,159,237,29,173,221,44,69,246,127,101,191,190, 254,83,109,3,184,213,0,110,83,160,118,206,15,203,195,3, 0,40,2,45,90,180,136,31,26,164,221,0,103,204,152,97, 230,204,153,99,150,45,91,102,126,248,225,135,120,132,66,255, 91,123,105,220,113,199,29,241,106,130,131,15,62,56,254,103, 184,119,161,232,252,151,40,249,111,155,216,134,205,127,146,101, 255,251,102,0,146,85,3,216,135,3,105,34,66,91,39,49, 97,26,15,15,0,0,32,39,158,17,254,225,124,80,239,155, 32,249,175,173,149,252,231,54,255,241,53,251,63,85,20,192, 62,28,40,81,50,160,238,87,172,230,33,2,0,0,100,133, 106,231,41,206,215,191,158,252,183,79,108,195,163,127,19,37, 255,37,58,252,167,96,6,160,138,39,25,208,110,13,236,70, 1,238,228,65,2,0,0,100,197,125,25,124,253,219,173,127, 237,228,191,42,133,50,0,169,146,1,237,19,2,221,40,128, 30,85,248,35,15,19,0,0,32,35,84,51,7,91,123,255, 201,190,254,55,246,124,253,23,36,249,47,155,40,64,195,4, 81,128,161,60,80,0,0,128,140,24,153,32,243,63,217,215, 127,195,98,126,253,187,6,32,93,20,192,205,5,104,231,56, 150,87,120,168,0,0,0,41,121,93,248,103,108,125,221,191, 157,249,239,30,251,155,104,239,63,209,215,127,65,12,64,38, 185,0,222,138,0,221,195,88,193,195,5,0,0,72,136,106, 228,73,194,225,177,117,93,255,220,67,127,180,197,254,246,73, 50,255,139,250,245,159,109,20,160,117,108,221,65,5,90,179, 120,17,15,24,0,0,32,33,215,58,137,127,253,157,143,230, 61,157,60,186,29,28,13,221,210,209,212,146,126,253,103,19, 5,112,187,3,118,136,173,235,91,76,135,64,0,0,128,13, 121,214,10,253,219,137,127,110,207,255,14,177,245,93,255,74, 250,245,159,42,10,224,246,5,176,187,3,182,138,173,235,87, 220,201,185,160,207,121,216,0,0,0,113,84,19,143,245,132, 254,221,150,191,93,28,237,220,194,209,82,187,235,159,93,247, 95,212,175,255,116,81,0,247,168,224,38,86,89,96,59,39, 140,161,23,185,146,135,14,0,0,101,142,106,225,25,86,214, 191,27,250,223,205,10,253,183,179,202,254,220,158,255,117,74, 249,245,159,44,10,96,159,17,224,150,5,186,9,129,155,91, 91,1,67,120,240,0,0,80,230,140,112,246,253,7,88,89, 255,110,205,191,27,250,223,220,74,252,115,203,254,236,158,255, 37,249,250,79,20,5,72,148,16,232,221,10,216,202,201,104, 188,153,135,15,0,0,101,202,237,194,145,214,190,127,31,161, 167,39,235,223,27,250,79,148,248,87,146,175,255,68,81,128, 116,91,1,173,157,112,134,158,99,220,85,120,148,73,0,0, 0,101,198,147,194,191,98,235,186,253,217,251,254,187,56,218, 184,117,108,253,105,127,153,134,254,75,98,0,82,37,4,214, 74,82,21,160,173,12,183,117,146,28,102,50,25,0,0,160, 76,120,65,56,218,201,135,59,56,182,174,219,159,246,250,119, 75,254,220,118,191,137,178,254,107,149,58,241,47,151,173,128, 186,177,245,109,130,189,249,0,122,209,116,10,4,0,128,168, 163,157,254,6,89,226,111,39,253,37,218,247,119,219,253,214, 13,90,232,63,219,173,0,111,62,128,118,52,234,40,108,23, 91,215,234,16,19,0,0,0,81,22,255,99,132,129,86,198, 255,94,142,254,117,115,180,176,163,163,141,222,125,255,64,134, 254,51,173,10,176,243,1,220,46,129,222,164,64,189,9,179, 152,36,0,0,16,193,176,255,32,75,252,247,115,196,223,109, 246,227,77,250,115,187,253,217,251,254,129,200,250,207,101,43, 192,155,15,96,39,5,106,123,195,78,206,13,208,237,128,169, 76,22,0,0,136,80,194,159,187,231,239,21,127,55,227,191, 83,108,125,171,95,55,233,47,217,190,127,160,66,255,153,108, 5,184,249,0,181,156,189,12,59,41,176,141,199,4,232,13, 25,203,164,1,0,128,144,115,187,147,237,111,239,249,39,19, 255,54,158,164,191,186,142,102,186,251,254,129,13,253,103,154, 15,224,77,10,180,77,64,59,143,9,184,48,70,199,64,0, 0,8,31,170,93,218,228,71,235,252,15,75,35,254,237,60, 226,239,77,250,171,22,38,241,79,149,15,144,141,9,216,201, 113,78,156,29,0,0,0,97,65,53,75,219,251,106,135,63, 109,242,163,117,254,253,156,108,255,30,214,158,127,54,226,95, 57,76,226,159,44,31,192,174,12,112,59,5,54,76,177,29, 160,55,74,187,35,61,195,164,2,0,128,128,163,167,250,233, 193,62,218,219,95,219,251,106,135,63,109,242,163,117,254,187, 121,196,127,203,4,226,239,118,250,171,233,17,255,64,239,251, 103,186,21,144,141,9,216,202,41,139,216,209,73,14,28,38, 172,96,130,1,0,64,192,80,109,186,46,182,238,72,95,55, 217,111,127,231,3,118,15,71,195,118,116,52,109,171,60,196, 63,84,6,32,153,9,168,154,194,4,184,213,1,90,14,161, 53,145,218,24,65,187,35,237,226,132,83,94,101,178,1,0, 64,64,208,250,254,147,60,33,127,221,239,215,131,125,122,58, 218,181,131,163,101,29,29,109,115,179,253,147,137,127,213,40, 136,127,54,38,160,174,199,4,184,205,130,180,43,146,182,70, 236,234,36,78,104,2,197,101,194,143,76,60,0,0,40,17, 170,65,35,173,175,254,254,86,200,127,79,43,217,175,171,163, 97,29,98,235,155,252,108,156,96,207,63,146,226,159,173,9, 112,251,4,184,205,130,180,37,162,246,69,222,218,217,59,233, 230,236,165,168,195,186,75,88,205,68,4,0,128,34,161,154, 115,159,48,216,217,235,119,191,250,181,190,127,31,39,228,239, 182,246,221,222,209,174,246,142,150,185,77,126,220,58,255,178, 16,255,76,114,2,106,120,76,128,118,65,210,86,136,218,15, 121,51,39,91,114,43,107,75,96,103,199,97,105,153,197,116, 38,37,0,0,20,24,77,72,63,197,9,247,31,102,237,245, 219,95,253,59,91,33,255,173,28,237,218,204,209,178,230,142, 182,53,72,145,237,31,73,241,207,212,4,184,29,3,181,5, 162,246,65,110,230,36,74,184,121,1,26,70,217,70,232,226, 100,84,170,211,234,21,91,215,99,121,6,19,20,0,0,124, 230,57,225,116,143,240,107,184,191,159,179,215,223,203,202,242, 239,226,104,84,7,107,191,127,19,71,203,26,57,218,230,118, 248,43,43,241,207,198,4,212,73,144,28,232,110,9,184,253, 2,220,104,128,238,179,244,112,66,47,186,31,243,160,240,39, 147,22,0,0,114,68,53,100,178,112,178,19,234,119,133,255, 64,103,11,218,13,247,247,112,52,200,253,234,119,235,251,55, 79,176,223,239,30,236,83,182,226,159,206,4,184,103,7,184, 7,8,217,121,1,238,150,64,27,79,52,64,247,89,118,116, 178,45,53,4,163,53,151,218,121,233,90,97,41,19,25,0, 0,50,68,53,99,76,108,253,201,125,135,90,95,252,174,240, 247,118,180,102,23,71,123,182,247,124,245,183,177,66,254,246, 126,191,125,176,79,213,114,21,255,68,38,32,209,1,66,110, 114,160,189,37,96,71,3,236,220,128,109,157,208,75,55,143, 17,208,240,204,241,194,157,194,215,76,110,0,0,240,160,218, 112,119,108,93,7,63,247,107,191,191,147,220,183,191,21,234, 183,133,191,155,163,57,219,122,246,250,237,175,126,59,228,95, 219,35,254,182,240,151,157,248,123,77,64,54,91,2,110,52, 192,205,13,104,155,194,8,184,91,3,218,131,89,155,50,156, 16,91,119,216,208,60,97,45,19,31,0,160,236,208,181,127, 190,48,206,217,219,31,232,136,254,0,39,122,124,128,147,213, 223,199,209,14,55,212,159,76,248,219,90,123,253,238,87,127, 182,33,255,178,19,255,108,183,4,18,69,3,90,88,219,2, 250,16,218,123,140,192,142,78,86,166,38,104,244,180,162,2, 125,29,135,119,182,51,9,94,22,190,231,197,0,0,136,28, 186,182,191,34,76,16,134,8,71,197,214,213,238,31,234,232, 128,45,250,125,173,175,253,158,142,118,236,236,104,137,45,252, 237,29,205,113,195,253,45,50,248,234,47,235,144,127,62,91, 2,222,104,128,93,46,232,26,129,77,19,24,1,55,71,96, 7,39,67,211,141,10,244,178,204,64,31,103,111,103,127,39, 203,243,76,225,74,97,188,240,152,99,14,22,9,95,198,214, 53,127,248,35,70,255,1,0,128,82,215,227,255,225,172,201, 95,58,107,180,174,213,143,59,66,127,181,112,142,179,151,127, 152,35,246,3,156,253,252,131,156,100,190,253,157,181,191,143, 37,250,189,172,175,253,157,28,237,112,247,248,189,194,191,169, 37,252,141,61,123,253,246,87,63,33,127,31,182,4,236,104, 128,91,46,88,207,50,2,205,156,189,23,219,8,104,120,70, 219,47,110,237,100,104,186,81,1,219,12,244,116,66,60,123, 90,134,160,159,101,10,14,112,38,203,65,142,83,60,196,161, 191,195,0,15,135,2,0,64,65,241,174,187,238,122,236,174, 207,7,91,66,127,128,37,246,253,44,193,223,211,89,251,123, 122,68,223,253,218,239,236,104,71,71,43,212,239,10,255,198, 142,230,184,194,95,47,182,190,188,47,147,175,126,196,63,135, 104,128,155,27,224,221,22,112,243,3,92,35,224,110,13,232, 190,204,230,78,102,166,29,21,112,205,192,14,206,158,142,134, 120,118,117,38,193,238,86,132,96,79,103,15,104,31,103,210, 244,113,66,68,253,44,147,176,175,19,58,74,198,254,0,0, 144,23,169,214,216,125,45,113,239,231,172,209,238,122,189,143, 179,134,239,105,125,225,239,238,172,245,187,58,107,127,55,71, 11,92,209,183,191,246,183,112,52,164,181,21,234,119,133,191, 161,37,252,118,184,63,209,94,63,95,253,62,71,3,220,109, 1,175,17,176,183,6,220,100,65,55,42,160,15,114,75,203, 12,108,237,236,233,108,231,49,4,221,157,137,177,139,179,7, 228,26,131,158,14,189,28,231,184,135,51,169,108,246,4,0, 128,130,226,93,119,221,245,184,151,181,78,187,66,191,155,179, 150,239,236,172,237,182,224,111,231,104,192,214,150,232,111,233, 104,133,251,181,239,38,247,53,77,240,197,239,10,191,29,238, 231,171,191,72,209,128,116,70,160,145,147,145,105,71,5,90, 89,102,96,11,39,180,211,193,50,4,110,132,96,123,103,130, 116,117,38,203,142,206,196,217,201,161,187,101,20,118,182,12, 3,0,0,20,30,123,237,117,215,99,119,125,238,230,172,217, 59,56,107,120,23,103,77,119,191,240,93,193,239,224,104,192, 22,150,232,183,242,124,237,55,113,180,36,91,225,231,171,191, 64,209,128,76,140,128,155,44,88,223,218,30,176,205,128,27, 25,208,208,206,102,30,67,208,222,50,5,157,44,99,176,173, 67,103,135,237,28,182,7,0,128,146,224,174,195,238,186,236, 174,211,174,208,119,178,196,190,189,71,240,55,115,52,192,253, 210,183,69,223,13,243,215,183,146,251,178,21,126,196,191,4, 70,192,78,22,180,163,2,174,25,176,35,3,205,157,132,14, 215,16,184,17,2,215,20,180,117,38,203,150,14,174,65,112, 77,130,77,71,0,0,40,10,222,245,183,189,37,240,238,122, 189,133,179,134,187,98,239,126,225,187,130,191,177,163,1,246, 151,190,43,250,246,215,126,45,207,30,63,194,31,18,35,80, 195,50,3,117,156,7,234,70,6,220,109,2,55,58,224,230, 13,180,176,76,65,75,103,178,184,230,160,181,67,27,139,205, 0,0,160,36,216,107,177,187,62,183,178,214,237,150,150,216, 183,176,246,243,221,175,124,55,188,239,126,233,111,20,91,95, 202,231,126,237,35,252,33,51,2,233,204,128,189,77,80,207, 50,4,13,61,166,192,53,6,205,172,136,129,107,18,90,88, 102,1,0,0,138,143,189,22,55,183,190,232,155,89,66,111, 139,125,67,75,240,235,121,194,251,233,68,31,225,15,145,17, 200,196,12,120,13,193,70,150,41,176,141,129,107,14,26,90, 38,193,166,49,0,0,20,21,239,58,108,175,209,13,60,66, 95,207,243,133,111,11,126,38,162,143,240,71,204,12,216,134, 192,27,33,112,77,129,107,12,92,115,176,145,101,18,18,81, 15,0,0,10,74,178,245,215,94,163,235,88,66,95,219,90, 215,109,177,183,5,31,209,47,3,51,144,137,33,240,154,130, 26,158,136,65,77,143,81,0,0,128,210,226,93,159,237,181, 219,22,251,76,5,31,209,143,168,25,72,103,8,92,83,80, 197,99,14,108,131,144,140,234,0,0,80,80,210,173,195,85, 61,34,95,197,35,246,153,8,62,162,95,166,134,192,54,5, 137,204,65,229,20,102,1,0,0,138,71,170,181,217,187,142, 87,68,240,25,153,154,130,100,230,32,21,149,0,0,160,160, 100,179,38,39,91,215,25,12,6,131,193,96,48,24,12,6, 131,193,96,48,34,60,254,31,251,170,76,23,71,154,195,185, 0,0,0,0,73,69,78,68,174,66,96,130, }; lprint-1.3.1/static-resources/lprint-large.png000066400000000000000000000605141456151556700214560ustar00rootroot00000000000000PNG  IHDRxiCCPkCGColorSpaceGenericRGB8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ 8eXIfMM*i(0ciTXtXML:com.adobe.xmp Michael Sweet Copyright 2019 Michael Sweet New Icon New Icon 8Y;IDATxEֆ%GE@Q((b@`T\wq 9E b*DQ0Is@ ;t/E;yzf{:9g]}[`0 `0 `0 `0 `0 `0 `0 FF4 o^1 *@AfM$0Ҋ}:!*PRO(jQ- [5;YHd 0T_%EM xg{dj!to-8ldQ7 $[5]u6 ^S! D@yľ%u,qw'Z}CCF@Q=a#D lC}[z%M ;J볻^7ƖIA TS -M-q׉RԡڡfP][YvKg-2 M=5v X/| E}pla0Ex^X |!(! Z6f +CIh+ln4"nt`#Od#`w+-WQ8RLy"/:`󡷅e Z[e[f&p"~7|WVx[XˋPv?W%:Xw dcy~g#~­—L|pc [Zf ys0D|mwض.>`r@f ;f DpsN~C!-DQ lkX;'Ѝ ll;"`'  ײP^SLZ𙧅Cr{hpkyd(ɾp}'! 4aFe9H dw8Yc@q)wk,F _\ΌkdR4T2S.P[&NVKL<8phP[نI#`@PmH,tr{n !N ^-'4l H'c-|Ƥyl݁r=].X\L@"wkz_LNV2 dv +tZxD"a2w4BBWR@& Dd?'¤𨰳% &Fg,1f5 8L@s2M/`w'/S& t_ɲ/L@& Yu@h2߄?lM@(&?n_S [>v["6 (zl}?ΟR?(W&0nu'X=Ie@}vA:e΅N -b5v4>@(]F탬}jῄnu%'mz l>@п7O;!`zv@tvtR$n+u!5S62`غzvfD% w!$raغvA Hw5q !ZvRoֿ7à@j^k(mdo* An"(^ȿ=QQU ,*cv5 ,ߏDP1U~ t"oTh` 1;{F@+V@l'V]"f`WYu=v܃;# YI{Tp??QMS ?zv˛󎖭g߈gP(=cH 6@{& 3LhbgA )ߜ ps+=*mDvZ @l^'S t$ozu@ jb,_Co`rCx-~LƋ L@h Y5@|+%Lĵ<^qa{Yd.Έ2G2/3P k K7@ @ lwkO7e=z"d9H 6۰h f<(W*Wf:4L&c7ߘno>鳯Y\&Q!8]] ~ 6Yu$`xp.9sLCMON2rYRs#3 fR1= Tὂ :T̰T_ڿ2~5a~yQw7F8#ʛbF_@]3TwʬxmSȡgf/O<)[pFw !R@ ;)cm)Ф_~|}96[ 1{rcݧM0/Qt&cܹۋ/5Kь03 \$qg*̻H` @1m u|=݈v2+ QemBW@mU ?.I"Zjrgo|ܳw4& L3pf k3gA:t]ի;v믋fV}qͧ`TpFbOp;e  fEyoUX$f`/|v@v=D33pnUPNC#*R5+V_{|1Xn&fyMղU @?ꫯM7dv}f[n)XjW'bo)aUa2c0[HVP ;2vZk=|y;D3,3p=hz@pY&?1Ļd350~ձmhFb3U *F`0PNrDs=Mjoon-Z93ҥf5יe;B= Dd䲜w - 2ļz__|aq3W3yYG0aB&"y܉y~7xcsꩧ{ά^:Rf`ߛ|AfIڈfyN4A%N0BL"pY {y6lh9cRPqX2<Ҽ[>awhDuլ㏼EOsc~>mt衇2+W_x|18^ffZ`*W'mbVIhϱl2sכ]w5 jժo߾fo(o7_zyhDì5@eL$MZŗ *x*ƍ3} {?u=ѣ}7 HBo6 jn! 1w _Lߨ1yuՌ9|ٟ~{ヲVZ9]SA7.4n>Q o6k 'ק;R? ,Hߣ>j>hӠA10??,~YKbUD64eAǤgԯK.ꫯ82Jz?O r͛l9S̙3*/ ٳdf@s4~ed>fqm@Q`JFeb޼ekK_7wb-rZ^8hР `V鮻ͧ7KjAx @jJhW]ꧡ\~l̀ aÆ.I&eU^5n~<|~Qݺ 3J @lhG1tY d@5a0kx7@KY @)4⯭iW.^\)PϷpv˺0f` /8˼jsĹH\mi?^wE?@U^xWdU^W 3㏷o^dP(PMmWaG)̀&M:5?? Mdu(z6֐[ԣfBsZ^0"S30tW拣@L_ 9 fkYܘ1c~#F e_*/Le,@F%!δ` *wnFfշ,"*PW[.)f@BiOyhA6其{[ﯾfn-\d` LB3)CWsc^Bܮ]v .0gp * n- } G:}9KÜ(_M-]]˖-ͩjf͚U+ޠL7]y 5E`q FƒY봧| uk[C߉\5jdlqrК? cr'6,y-g'0?+L%hN)Ӥ8MKՊ3_|3Z_L3`_oz~BA u!) O񟒥ǿQj$erZ.+ׯ0a6R-ʹPOP=/o `hls:GRUvu[^oHZ+ӽr? Ke2)/ݻĻ̒j݀1ȗ_m欬E*\it~kbտC +rl|s%-0E (KSP_Cwtvvyaxh>G"9  2Gx6'qѯbi|r;)0f`$ ~oD6`rA&kCCԽz*yC=4eyVs1L[ 7{!@i*<+?6>@iL フ[ \ײ]z !a ̈́y{ |@Ǐϻ0W3w7u톰bQt|s C(dC I[^أGxy& Y_v1Lh!AW?X#f@ǢEWnWtfZg?MVҴPӕj!Bn_&J0?#~y Q{j.@3gB?F(_,5iˑQ5ٖjA兹׏FD1>g$6C nBtj(/tȣfq4켈Cs$8t3! 0̻u"% 6,:ȴ̀&ujr^wBov h `'B^wӧOd-[֋P2nyFB,9s|q`3B"˟yћ,Yn)5jdſrțPm݌hblLN dSf܋7K̀Xr7ThF0` (ֿ^\ʶ  ,֣|s_G70(_p_&1 ӋOۋa6^|)bQ`Yڈ#Ud🠍l Ջ?ݻwƯӞBˀ6b Ȅ0@=n6BşP;iy& hV-藿У@F[d=ڈhSQDG0];s#q:k#ψRşP#*/eZܼ[1"aJF<< D.bűǛrZ^Μ9`f2>|D2)Myw@c QbW~{aV^(/LwfIeDQoeͳDs D (/TOW^PD+.pN"Fȓ D -*fdH5E syKY^ͻu#m6«0h apP 5)P5I0UyСCkid}-g==@N^"AǢ>j`B_4߭ GX?50p#ּ W_s ^B"]} bANĿpOr1/0Ȑ-5k"K)z\@x@WV.\|hf3ZA`Wi6 }Ǖ_J*T }!vYXk9_@'@ aAM7C]>|QC8Դև#3rbp@${zL3 6`}k}E/1=^}/?6cʕ>hӟyYGc0 +^r*Ï uY և"ٮc0|$T8(#!G~mouTx) NShԌ?|~fɂl@_~1KFDCnL{a0loϿ< 0{Ŀہ0( gC=ze\V\{'4Yvm (&X`0P.#4ܷ>3 \f>+cb 6}a¦ߌ8܌ѣ͌3̗_~itˎ̓y?v E)z0  SJUQ hon?dߎ(N 7`{97D/P s#8h]}OR1ԓ(0ۇ줿NfVRV8RVxqfছn2?Boxks!@oa 0xe"_/+.e`n>zK36ryJyAi-BZ 3K  ?aiSyd] Pƍg^yO?̃P*BWWx<9@0((h<{/sɧde&L`^{5/|g_sD{X/ u` š-yYY;̞=oh϶*W G( [mnsyel.r3qD3g,QgZB|a_5`  ̣?e̳[v^1thVf{1s5+V(Fa8#gw  Ͽ\9PNۚqGUYa̤I;c~V"{ ?#VVX|y… _UPCyV%&좀[c0PXv/ҼUyf'd}g( C gik&pP|?@\￷ C"TҲ­f0qY!I3^IJ~(=@a(24ӶC_~< r n/̎@~ ~)% y@Wv?K #<4 te{'ȓNTar=^PQ> ^kw (JBDֻVxwa0/c[zo߬2Khodu˴tw k h=ȧ);ےr; wUJ3Fi84Ϟenk^c_cʬY@1#"O# yZ f`9@ @pGwx?)UY1? Y`J56"u)🊜PrNpkX M}jXdYsZ @x\>n$LE7'(,29f{XM0CQh `վ'&?mI$`Zyr>cx0DK=3򗐑$a0CO%ya|/g#G"ILP4y,Ny7)zB)0P$,PZ+t5jr4w'ʖCI`dg1= V@o'Gȯ{;;roj&c0~M Ϙw5f `JG!= $[ _ϻ =I`J˵Eث-M̊ ~/'ʥ ,zcdǎ$a0"Yon"){u`.5+?PzP p,% gM~WC<310ӽ"]lh7`LergϺs2k4L DϺ3E$y;ȯ EVʞ>Ә9q)_ @0E-KEuo@O/8b =[s ~rfK]  8<p+VYB_s~ed̳?  XL т6Kd\hZZ; 9=#\;$b`A3|1jzΖN$a0/)hR,f]׮33w%;?dEp,l'w, M>~9?D@!?0Lfs,S1uyޣh΅?> T97 !wMEQ~m,/sKvtH gC00p—jhB}Hr<=Dxnr(VL/k_SR  @ --3Ӄj$Z}`kf9\5/Z-b@Ϟ?S?X~6,s2'n">'"jw1 N} ʋ2وo`k09"MHVMO?J}W^e=`ʋȡ`nb@j^AOV@<:_:b0ɋ, yz@N_<ypGkR{Re* @ĹRȳ@[9>z\4^O|%";s޼ey]7ױRXNWvҶȲԹ S_02 J 矪K]\" C3yr{ el("՜%b<@Qi Ϟ!'pOIE"[ μZL;CF1,Ľclh`; , h) }.#D _Rt"{"/0Lb>-w;8m/6s7z)0?c,Tc/J=R}[j,v=ڑuoR1+ȁGEibni@h;kX@)t8 * Ep̡=lQP[-7|/X e $$J'2/_rȔ)݃nboS@6t@GD^ W̽o {zȊf"񲘁!^9l=HI]8擀JFWd SСY0XP1sl2rr @h]X~p Y`M,_ <$:Y~  VЀu 0P(P 8D1`<3l(4P foº(R ^o͚(GcJΫ"mYdOJJ"XŦ%MmńN @Iܮ?`tEhT̥$(̓w; rXI (.P#`!f7ޑiO0<0B8K/cBt?0! }tȚE"#01$% @JI@RF2ZtD`?`0BS4Y^@s  @9RY+QI2\0O9D7 @p lHM8N@Du` ;(Y,c "\w0ȌFI3ZĿ"3`0=2Y^AceV 0To3^Ŀ ,`0/5<2QĿ)`0PXkd0IbMK`x d] J[. @xTZ]?` Γ( Oj M:Dag˜j; Nb큹7i; ݯ,1˼i{ $*pDb ^yҚ0-$*2F [D[ Q8,u`mPpY{l "/ "} "$*(о/ D#p4SU8HHT0 ` TTT^{r`РAf޼yfʕfڵ棏>2F2k` 4nشi&)u 5dJVLFLj՘Yp 7dw55j>` h|&՘2eJ!˗e˖~s=3}1-Z`8tŬY&彼꫹WqG 5b|f„ W^b?tдjɒ%kD?7]wln~i_O} R+V0]vYYek$ѰaC7 `iܡ9 }-s-P06:㎋9 -]ˍ|'0sL ?-[4[p)c9' 0\֢yI?ilN;xVUW]mϚ5+ퟯ &9QC'xYzu>}zYWI޷o9bN?fm~WӼyHϣwf0 F?ϝnݺ%:`0(5TR~VٌY1|p `kv]jժwΜI `k8蠃m3<s2bM7Mx{ נnh< A&tI אIK\z1m4 `k#3馛wZjJc\øqzy)9>}`k\t>+}ZxK_u3wyM.x|o߾9͞&Nhf̘]_K;~msϙ)SѣG&gkР9_| `t z `l5j9g\2ޛ Ѯ]x#LѤI6}'mt۴ic .G>;vlФLGg}u @)~u]vʿoM6Ig;vhxf͚E履~g1`im۶ O?zs뭷{^'̨į1{촋~)]vM*C% CkDOO{HQ>CN8ᄜg)U 0BS =4's xLz2sO( e]۪U++MP'Md*U5UkФtCS=^=|G\rI( &.W^;ϡ`gAkwqG3y䬾b}uQEA2ǏDgQ `PkPoٲe<\CZOG1P-?j{_&V<05ք'BOӰ69r馛oΝQ Yڶ>H Crnݺi;J1leA5_~eѮ9]{`p `P@kLPEbŊek~] 00oZ8,s 0  ZhQ2-f a08cٲe#c7|СC{(0%0ẑ ={ EdO8ᄲ6Ź31ez j @kw]\v2Wq@x/vaemiwĈ_|p`,*r2RJ7p5`0֭[_4mڔ5,$$S `6y0(_uk;v,kX9=@_Sԍmx&_p0\9nZ׏u,|% p3r>08gw(o؆efU؇i"B['1a '|P 65?U>(Q2W!dj)׿Olã%%:`'n FAd}|ۭ*2(U# #T3[{ɾ7|$/(@Qv4(l[QcV^us}@3 .ޤ@ $ KsmMse+`'j{N 퀩LPŸ7Sl}_7/پBl ;) ˤso'6f gM M@; 0F@]GK#_j?muyv@g )I&`@Pm.H_7ovGvt4m[h].M7G`'CӍ @gog'LJac _5#FR_:kՏ;Bp#d%p¿%={W?!h[.X2͜hxF/ndhQ tB<{Ze p&AS<ġ@Az[B%,Y{zDhGG+ Ǝ_//~?hp\#n NfpΞxvu&V`OghgqBD,:J}-qzi}:k7G \ѷp4w%v?^?_>GmdA7*rK ll1ݝ縇3l]wNBoh֖oh&5M 竿HрtFiGZYf` '2n`{gtu&ˎɡev {ucw};8kxgMw]h|7q$[竿@рL,X̀fC2,cCgӮwľG7s4ҷE ׷~ĿFN#͝u&˖ApMMG( %zb~Ể+~-?#P2uFm7: LAKg栵C$k>햖طݯ|7~o[_~#!3̀MP2 =5ͬkZXf7YBo}CKyD x F)kZ&1:l sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`oeXIfMM*V^;ftiHHMichael SweetCopyright 2019 Michael Sweet00S pHYs  iTXtXML:com.adobe.xmp 72 72 1 128 128 New Icon Copyright 2019 Michael Sweet Michael Sweet New Icon v)+ FIDATh͙ipǟ{,7IȀeqp-:TTOڙN`G>jeCVuKuu"Sb $,! y{rMngyysr\)k7aS"4jb- x.DXqxb]^Z=Ϩx 51ֺ~~?C O*,CbE?J,  _R?3c}{-V7^ &Oӧ[f8lm566ZÅ v:3Ӯ{U<ﭝ.. 6<@@Y$EACkt7]MM0ZcGgx/(*:-#"%%9iUDuf T|ȚsXyEE?OЦ"Y2!i˳M<yKK<)RYUe٤˪e`;wΦokm 24O&z%}\-ixm${hhbKBdM7ٹ筵<_]Yi._n]g&ͨ0`_I((%Υ *hL")֑@ _̲KNyAu5-#3gDٱ#G]žci$Gǥπ?4WZʪKE) ^gsB>-7=.21bY9vm?+;MdMfQ.b{&}3r^S#ԭQIbh3 #z{7 ZZzI;zuݐr[!y9p9"Úҙ > ^B{h]132V6lPr gYA}ݯԺ{ӽZ6cB>0I,?ۚX~-bV$ 1M{4J) ƺ.CM(8 f3r-;-rϜgnf[BɊV^3ߺ0]USR~zˑ'q)AQ)q1[jn`P8݆ ,fY~'6 ""9/'Nbx޾Xƥ9:(jne8BtH|)00D5 8~n,B"otDKwݗi)`CQ74@IY j֮H)_BGw dd:BFb(ÆI#+6&5EG@Ὄw-.{'e SS;tlxR@SDy$dd˥#;;(+- |VHluPVvJXۈQ ͛7ׯ`jkkg{.XrkDYNZ*o!`uiIENDB`lprint-1.3.1/static-resources/lprint.css000066400000000000000000000316701456151556700203730ustar00rootroot00000000000000/* Base styles */ @import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,700;1,400;1,700&family=Source+Code+Pro&display=swap'); body { background: white; color: black; font-family: 'Open Sans', sans-serif; font-size: 16px; margin: 0; } code, kbd, pre, tt, input[type=email], input[type=number], input[type=password], input[type=tel], input[type=text], textarea { font-family: 'Source Code Pro', monospace; } pre { white-space: pre-wrap; } /* Header */ .header { background: black; color: white; width: 100%; } .header2 { background: #333; color: white; width: 100%; } /* Navigation */ div.nav { color: #ccc; vertical-align: middle; } .header div.nav { font-size: 24px; line-height: 40px; } .header2 div.nav { font-size: 20px; line-height: 35px; } .header a.btn, .header a.btn:visited, .header2 a.btn, .header2 a.btn:visited { color: #ccc; text-decoration: none; white-space: nowrap; } .header a.btn:hover, .header2 a.btn:hover { color: #eee; } .header a.btn:active, .header2 a.btn:active { color: #fff; } .header span.active, .header2 span.active { color: #fff; white-space: nowrap; } .header a.btn, .header span.active, .header span.spacer { padding: 0 30px 0 0; } .header2 a.btn, .header2 span.active { padding: 0 20px 0 0; } div.nav img { height: 24px; margin-right: 10px; vertical-align: middle; } span.spacer { color: #ccc; } span.spacer:after { content: "⋮"; } /* Interior Content */ .content { margin: 20px 0 44px; } form { display: inline-block; } div.btn { display: inline-block; line-height: 32px; } .content a.btn, .content a.btn:visited, button, input[type=submit], select { border: none; border-radius: 5px; cursor: pointer; font-family: inherit; font-size: 14px; font-weight: normal; padding: 4px 8px; text-decoration: none; white-space: nowrap; -moz-appearance: none; -webkit-appearance: none; } .content a.btn, .content a.btn:visited, button, input[type=submit] { background: #333; color: #ccc; } .content a.btn:hover, button:hover, input[type=submit]:hover { background: #333; color: #eee; } .content a.btn:active, button:active, input[type=submit]:active { background: #444; color: #fff; } input[type=email], input[type=password], input[type=tel], input[type=text] { padding: 4px 8px; } input[type=number] { appearance: textfield; padding: 4px 0 4px 8px; } input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } input[type=email]:disabled, input[type=number]:disabled, input[type=password]:disabled, input[type=tel]:disabled, input[type=text]:disabled { border: none; color: black; font-size: 16px; padding: 0; } select { background: #ccc url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23000000' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; color: black; padding: 4px 32px 4px 8px; } select:hover { background: #ddd url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23000000' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; } textarea { width: 100%; } label.image input[type=radio] { position: absolute; opacity: 0; width: 0; height: 0; } label.image input[type=radio] + img { border-radius: 5px; cursor: pointer; padding: 2px; } label.image input[type=radio]:checked + img { background: rgba(127,127,127,.5); } div.switch { display: inline-flex; } div.switch input { border: 0; clip: rect(0,0,0,0); height: 1px; overflow: hidden; position: absolute !important; width: 1px; } div.switch label { background-color: #ddd; border: 1px solid rgba(0,0,0,0.2); color: black; font-family: monospace; font-size: 11px; line-height: 1; margin-right: -1px; padding: 6px 8px; text-align: center; transition: all 0.2s ease-in-out; } div.switch label:first-of-type { border-radius: 5px 0 0 5px; } div.switch label:last-of-type { border-radius: 0 5px 5px 0; } div.switch input:checked + label { background-color: #333; color: #ddd; } label.switch { position: relative; display: inline-block; width: 30px; height: 17px; margin-bottom: 5px; margin-left: 2px; vertical-align: middle; } label.switch input { opacity: 0; width: 0; height: 0; } img.password-show, img.password-hide { cursor: pointer; margin-left: -25px; padding-bottom: 5px; vertical-align: bottom; } img.password-hide { content: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktZXllLXNsYXNoIiB2aWV3Qm94PSIwIDAgMTYgMTYiPg0KICA8cGF0aCBkPSJNMTMuMzU5IDExLjIzOEMxNS4wNiA5LjcyIDE2IDggMTYgOHMtMy01LjUtOC01LjVhNy4wMjggNy4wMjggMCAwIDAtMi43OS41ODhsLjc3Ljc3MUE1Ljk0NCA1Ljk0NCAwIDAgMSA4IDMuNWMyLjEyIDAgMy44NzkgMS4xNjggNS4xNjggMi40NTdBMTMuMTM0IDEzLjEzNCAwIDAgMSAxNC44MjggOGMtLjA1OC4wODctLjEyMi4xODMtLjE5NS4yODgtLjMzNS40OC0uODMgMS4xMi0xLjQ2NSAxLjc1NS0uMTY1LjE2NS0uMzM3LjMyOC0uNTE3LjQ4NmwuNzA4LjcwOXoiLz4NCiAgPHBhdGggZD0iTTExLjI5NyA5LjE3NmEzLjUgMy41IDAgMCAwLTQuNDc0LTQuNDc0bC44MjMuODIzYTIuNSAyLjUgMCAwIDEgMi44MjkgMi44MjlsLjgyMi44MjJ6bS0yLjk0MyAxLjI5OS44MjIuODIyYTMuNSAzLjUgMCAwIDEtNC40NzQtNC40NzRsLjgyMy44MjNhMi41IDIuNSAwIDAgMCAyLjgyOSAyLjgyOXoiLz4NCiAgPHBhdGggZD0iTTMuMzUgNS40N2MtLjE4LjE2LS4zNTMuMzIyLS41MTguNDg3QTEzLjEzNCAxMy4xMzQgMCAwIDAgMS4xNzIgOGwuMTk1LjI4OGMuMzM1LjQ4LjgzIDEuMTIgMS40NjUgMS43NTVDNC4xMjEgMTEuMzMyIDUuODgxIDEyLjUgOCAxMi41Yy43MTYgMCAxLjM5LS4xMzMgMi4wMi0uMzZsLjc3Ljc3MkE3LjAyOSA3LjAyOSAwIDAgMSA4IDEzLjVDMyAxMy41IDAgOCAwIDhzLjkzOS0xLjcyMSAyLjY0MS0zLjIzOGwuNzA4LjcwOXptMTAuMjk2IDguODg0LTEyLTEyIC43MDgtLjcwOCAxMiAxMi0uNzA4LjcwOHoiLz4NCjwvc3ZnPg==); } img.password-show { content: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktZXllIiB2aWV3Qm94PSIwIDAgMTYgMTYiPg0KICA8cGF0aCBkPSJNMTYgOHMtMy01LjUtOC01LjVTMCA4IDAgOHMzIDUuNSA4IDUuNVMxNiA4IDE2IDh6TTEuMTczIDhhMTMuMTMzIDEzLjEzMyAwIDAgMSAxLjY2LTIuMDQzQzQuMTIgNC42NjggNS44OCAzLjUgOCAzLjVjMi4xMiAwIDMuODc5IDEuMTY4IDUuMTY4IDIuNDU3QTEzLjEzMyAxMy4xMzMgMCAwIDEgMTQuODI4IDhjLS4wNTguMDg3LS4xMjIuMTgzLS4xOTUuMjg4LS4zMzUuNDgtLjgzIDEuMTItMS40NjUgMS43NTVDMTEuODc5IDExLjMzMiAxMC4xMTkgMTIuNSA4IDEyLjVjLTIuMTIgMC0zLjg3OS0xLjE2OC01LjE2OC0yLjQ1N0ExMy4xMzQgMTMuMTM0IDAgMCAxIDEuMTcyIDh6Ii8+DQogIDxwYXRoIGQ9Ik04IDUuNWEyLjUgMi41IDAgMSAwIDAgNSAyLjUgMi41IDAgMCAwIDAtNXpNNC41IDhhMy41IDMuNSAwIDEgMSA3IDAgMy41IDMuNSAwIDAgMS03IDB6Ii8+DQo8L3N2Zz4=); } div.pager { padding: 10px 0; text-align: center; } div.log { background: #333; border: solid thin rgba(127,127,127,.5); color: #ccc; height: 30em; margin-top: 20px; overflow: scroll; width: 100%; } div.log pre { padding: 10px; } /* Footer */ .footer { background: rgba(224,224,224,.9); bottom: 0; color: #777; font-size: 12px; height: 24px; left: 0; position: fixed; right: 0; width: 100%; } .footer a { color: #c66; } /* Grid System - Rows and Columns */ .row { position: relative; width: 100%; } .row::after { clear: both; content: ""; display: table; width: 0; } .row [class^="col-"] { float: left; margin: 20px 0 0 2%; min-height: 1px; padding: 5px 0; } .row:first-child [class^="col-"] { margin: 0 0 0 2%; } h1:first-child, h2:first-child, h3:first-child, .row p:first-child { margin-top: 0; } .row p:last-child, .rounded p:last-child { margin-bottom: 0; } .col-1 { width: 6.1666%; } .col-2 { width: 14.3333%; } .col-3 { width: 22.5%; } .col-4 { width: 30.6666%; } .col-5 { width: 38.8333%; } .col-6 { width: 47%; } .col-7 { width: 55.1666%; } .col-8 { width: 63.3333%; } .col-9 { width: 71.5%; } .col-10 { width: 79.6666%; } .col-11 { width: 87.8333%; } .col-12 { width: 96%; } /* Inline Styles */ span.badge { background: #c00; border-radius: 8px; color: #fff; font-size: 14px; font-weight: bold; padding: 1px 6px; } span.bar { box-shadow: 1px 1px 2px rgba(51,51,51,0.25); font-size: 20px; line-height: 20px; } img.idle, img.processing, img.stopped { border-radius: 10px; float: left; height: 64px; margin-right: 10px; padding: 5px; width: 64px; } img.idle { background-color: rgba(0,192,0,0.5); } img.processing { background-color: rgba(224,224,0,0.5); } img.stopped { background-color: rgba(192,0,0,0.5); } .shaded { background-color: rgba(127,127,127,.25); } h1.title { border-bottom: solid 2px black; clear: both; } h2.title { border-bottom: solid 1px #555; clear: both; color: #555; } .title a:link, .title a:visited { color: inherit; text-decoration: none; } .title a.btn, .title a.btn:visited { color: #ccc; vertical-align: 25%; } .title a.btn:hover, .title a.btn:active { color: #fff; } /* Animations */ .banner { animation: banner 3s 1s 1 forwards; background: rgba(160,160,224,0.5); border-radius: 5px; margin: 10px 0; padding: 10px; } @keyframes banner { 0% { background: rgba(160,160,224,0.5); } 100% { background: rgba(160,160,160,0.5); } } .spinner > div { width: 18px; height: 18px; border-radius: 100%; display: inline-block; animation: spinner 1.4s infinite ease-in-out both; } .spinner .bounce1 { animation-delay: -0.32s; } .spinner .bounce2 { animation-delay: -0.16s; } @keyframes spinner { 0%, 80%, 100% { transform: scale(0); background: rgba(160,160,160,0.5); } 40% { transform: scale(1.0); background: rgba(160,160,224,0.5); } } /* Form Tables */ table.form { border-collapse: collapse; margin-top: 10px; min-width: 50%; } table.form td, table.form th { line-height: 30px; padding: 5px 2px; vertical-align: top; } table.form th { text-align: right; } iframe#map { width: 300px; height: 200px; } /* List Tables */ table.list { border-bottom: solid thin black; border-collapse: collapse; clear: both; width: 100%; } table.list tr:nth-child(even) { background: #fcfcfc; } table.list tr:nth-child(odd) { background: #f0f0f0; } table.list th { background: white; border-bottom: solid thin black; text-align: left; vertical-align: bottom; } table.list td { margin: 0; padding: 5px; vertical-align: top; } /* Meter Tables for Supply Levels */ table.meter { border-collapse: collapse; margin-top: 10px; min-width: 50%; max-width: 600px; } table.meter thead td { border-bottom: 1px solid black; border-left: 1px solid black; border-right: 1px solid black; height: 4px; line-height: 4px; padding: 0; width: 20%; } table.meter tfoot td { border-left: 1px solid black; border-right: 1px solid black; border-top: 1px solid black; height: 4px; line-height: 4px; padding: 0; width: 20%; } table.meter td { padding: 5px 0; } table.meter th { border-right: 1px solid black; padding: 5px; text-align: right; } /* Small Device Overrides */ @media only screen and (min-device-width: 320px) and (max-device-width: 480px), only screen and (min-device-width: 320px) and (max-device-width: 568px) { .content { margin: 20px 0 20px; } .footer { height: auto; position: relative; } .row [class^="col-"] { width: 96%; } iframe#map { width: 200px; height: 200px; } } /* Dark Mode Overrides */ @media (prefers-color-scheme: dark) { body { background: black; color: #ccc; } span.bar { box-shadow: 1px 1px 5px rgba(255,255,255,0.5); } h1.title { border-bottom: solid 2px #ccc; } h2.title { border-bottom: solid 1px #999; color: #999; } input[type=email], input[type=text], input[type=password], input[type=number] { background: #333; color: #ccc; } select { background: #333 url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23CCCCCC' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; color: #ccc; padding: 4px 32px 4px 8px; } select:hover { background: #444 url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23DDDDDD' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; } div.switch label { background-color: #333; border: 1px solid rgba(191,191,191,0.2); color: #ccc; } div.switch input:checked + label { background-color: #ddd; color: #333; } table.list { border-bottom: solid thin #ccc; } table.list tr:nth-child(even) { background: #222; color: #ccc; } table.list tr:nth-child(odd) { background: #333; } table.list th { background: black; border-bottom: solid thin #ccc; } table.meter thead td { border-bottom: 1px solid #ccc; border-left: 1px solid #ccc; border-right: 1px solid #ccc; } table.meter tfoot td { border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 1px solid #ccc; } table.meter th { border-right: 1px solid #ccc; } } lprint-1.3.1/static-resources/lprint.png000066400000000000000000000145331456151556700203660ustar00rootroot00000000000000PNG  IHDR>aiCCPkCGColorSpaceGenericRGB8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ 8eXIfMM*ikF&MciTXtXML:com.adobe.xmp Michael Sweet Copyright 2019 Michael Sweet New Icon New Icon 8JIDATx]tUHA =  $Ku)!$R"A Ma%,-KJH(C۰‚"CO^f g&oa{}OQԦ6G' BTx *ᾈgjD(C A灌_Ɖē57eP!(X_S/G BCTG1nv!!U2d"QQqŋEЎ` Dq3,ր^胈B2܂#"Вv2U%%ُRwy$3W;AƭOLY`g x"(tGe񀷥w5Pmo_ D,$O:#(/xW~(I x,M8Zo`<)K[LI?m;7A\)(ejD+D@leR qŰ0߳kg!0=5|S؉?>/7k/_t&(U)OY˛"^{7Aiq1dܢhb WŐߣ<M|~Vp+sr[(M[QC)~Je3sޕà]/ɂ]=S(u&0<ƎDt&M 99ϟgϞ5)ǷoÝ+d@UpŰ Ռ H=zʕ+aڵjՂ(3f |P^^^I OJJn8U-LԸa!]lr>v/ #2ܹСC 4χԩSe˖ {/_^I m+CᢉOc4E۷/l۶ ?~ W\LQ#=''zʼn!!!MPQQa(+Jk#GO/\E &yݯVѧ/^#4<<Ə8vi HRPjMNy|)ՖΝ; or5w<HLLއT{6#(tP`LXgZRz8͹ܨ~rss9KBY)t< x F5yz( sSk̹J&1.c& )hm[9]_ZTBk6lNĈ|-gtK.W?%1W#]Te|Bݻw׏#u0k,wWX#'ef?SEO;va ""a„ p]rOFl >*sf_Ko 6"'H$  Ś/;s}D'r-DWc68%k A\r!څԞOS]mQ ` >4Rh*!O+Nₐ[ `5|1ڥoJ~6G$4; 8/_Gnl"-cEmQ'؏iوLp^#S(Ob `¥)?%f7>X5Ũ+]!Ӣ 1|->Wf.#IU Nq$a~7{c o?6c={67i%}/JM{*Ydh|50Eⱥhcs,8%aڞ\r E`v AɟF{V,`R@oO Vu 3?P"W ͵_^D~/4֮}G$G/>qE&pQSAm+6 J,="~s8[tRr)MhwEhn K0oPhȻ~%w™g_Q.ׄ`6fi6 ͷP>(#h$^ָhӕ6fY5;% ńv SdM``,#"k*\r.g/]NE ~9S A;0!l0*NTOó;vW h˹"ʹA_:b(?2dcP{\*+NFƵAP]@ ʹd`+1Tf_2~9jܘ_:tq1 EcP>5r.~PmVrk࿛%B \2 vp@2i4G YiwbjyUS/mE~};9UΈdO9=%N`y 6m ,Ntlٲ;?`ݻw'boO@nn.9} "G9x<*nѢE [n .a}ӧCII ,YH'rU< zOOO۷/1+ KSS 4iN=޹sg5j$$$poڴ)w… !''ׯop]jj:uue`رPN =NZo^ر;wreff¬Y*ZkСCg7lw6}T{~ƌPsIY&iě>5SHU" ŋ\6THK [K̾ve"\EdTtt.FÇ\m*@9pY+Kn"#@*.9$ mnY ̛7Oh3kD'D$K_xClM bT(**#0dwE1B'۷Cf ,, BCCɈv:kO}}5 |})`\UPvm.Ml((R?kcE&[LвFF\eM*7o^w^4Ť6gΜJnܸav%V?AfUjyRzM6ԕVE\r(3u^7DQ S )Xƭѯ?$4Dv0~oFSR4"".貸L21׏ѵUU.K3N464f&LAjȏc1N=466Ї zx@(e_6hcwU6o, fBńb'TXMa>|gAo .SVb OUTPUT.pwg // // Copyright © 2023 by Michael R Sweet // #include "lprint.h" #include #include // // Local functions... // static void write_line(lprint_dither_t *dither, unsigned y, cups_raster_t *out_ras, cups_page_header_t *out_header, unsigned char *out_line); // // 'main()' - Main entry for test program. // int // O - Exit status main(int argc, // I - Number of command-line arguments char *argv[]) // I - Command-line arguments { int ret = 0; // Exit status bool plain = false; // Plain/original output pappl_pr_options_t options; // Print job options unsigned page, // Current page y; // Current line on page const char *in_name; // Input filename int in_file; // Input file cups_raster_t *in_ras; // Input raster stream cups_page_header_t in_header; // Input page header unsigned char *in_line; // Input line cups_raster_t *out_ras; // Output raster stream cups_page_header_t out_header; // Output page header unsigned char *out_line; // Output line lprint_dither_t dither; // Dithering data static const pappl_dither_t clustered = { // Clustered-Dot Dither Matrix { 96, 40, 48, 104, 140, 188, 196, 148, 97, 41, 49, 105, 141, 189, 197, 149 }, { 32, 0, 8, 56, 180, 236, 244, 204, 33, 1, 9, 57, 181, 237, 245, 205 }, { 88, 24, 16, 64, 172, 228, 252, 212, 89, 25, 17, 65, 173, 229, 253, 213 }, { 120, 80, 72, 112, 132, 164, 220, 156, 121, 81, 73, 113, 133, 165, 221, 157 }, { 136, 184, 192, 144, 100, 44, 52, 108, 137, 185, 193, 145, 101, 45, 53, 109 }, { 176, 232, 240, 200, 36, 4, 12, 60, 177, 233, 241, 201, 37, 5, 13, 61 }, { 168, 224, 248, 208, 92, 28, 20, 68, 169, 225, 249, 209, 93, 29, 21, 69 }, { 128, 160, 216, 152, 124, 84, 76, 116, 129, 161, 217, 153, 125, 85, 77, 117 }, { 98, 42, 50, 106, 142, 190, 198, 150, 99, 43, 51, 107, 143, 191, 199, 151 }, { 34, 2, 10, 58, 182, 238, 246, 206, 35, 3, 11, 59, 183, 239, 247, 207 }, { 90, 26, 18, 66, 174, 230, 254, 214, 91, 27, 19, 67, 175, 231, 254, 215 }, { 122, 82, 74, 114, 134, 166, 222, 158, 123, 83, 75, 115, 135, 167, 223, 159 }, { 138, 186, 194, 146, 102, 46, 54, 110, 139, 187, 195, 147, 103, 47, 55, 111 }, { 178, 234, 242, 202, 38, 6, 14, 62, 179, 235, 243, 203, 39, 7, 15, 63 }, { 170, 226, 250, 210, 94, 30, 22, 70, 171, 227, 251, 211, 95, 31, 23, 71 }, { 130, 162, 218, 154, 126, 86, 78, 118, 131, 163, 219, 155, 127, 87, 79, 119 } }; // Check command-line if (argc == 2 && argv[1][0] != '-') { in_name = argv[1]; } else if (argc == 3 && !strcmp(argv[1], "--plain")) { plain = true; in_name = argv[2]; } else { fputs("Usage: ./dithertest [--plain] INPUT.pwg >OUTPUT.pwg\n", stderr); return (1); } // Open input raster file... if ((in_file = open(in_name, O_RDONLY)) < 0) { perror(in_name); return (1); } if ((in_ras = cupsRasterOpen(in_file, CUPS_RASTER_READ)) == NULL) { fprintf(stderr, "%s: %s\n", in_name, cupsLastErrorString()); close(in_file); return (1); } // Output output raster stream... if ((out_ras = cupsRasterOpen(1, CUPS_RASTER_WRITE_PWG)) == NULL) { fprintf(stderr, "stdout: %s\n", cupsLastErrorString()); close(in_file); cupsRasterClose(in_ras); return (1); } // Loop until we run out of pages... memset(&options, 0, sizeof(options)); memcpy(&options.dither, clustered, sizeof(options.dither)); for (page = 1; cupsRasterReadHeader(in_ras, &in_header); page ++) { // Show page info... fprintf(stderr, "Page %u: %ux%ux%u\n", page, in_header.cupsWidth, in_header.cupsHeight, in_header.cupsBitsPerPixel); // Build the output header and job options... memcpy(&options.header, &in_header, sizeof(options.header)); memcpy(&out_header, &in_header, sizeof(out_header)); if (plain) { out_header.cupsColorOrder = CUPS_ORDER_CHUNKED; out_header.cupsColorSpace = CUPS_CSPACE_K; out_header.cupsBitsPerColor = 1; out_header.cupsBitsPerPixel = 1; out_header.cupsBytesPerLine = (out_header.cupsWidth + 7) / 8; out_header.cupsNumColors = 1; } else { out_header.cupsColorOrder = CUPS_ORDER_CHUNKED; out_header.cupsColorSpace = CUPS_CSPACE_SRGB; out_header.cupsBitsPerColor = 8; out_header.cupsBitsPerPixel = 24; out_header.cupsBytesPerLine = out_header.cupsWidth * 3; out_header.cupsNumColors = 3; } // Allocate memory if (!lprintDitherAlloc(&dither, NULL, &options, CUPS_CSPACE_K, 1.0)) { fputs("Unable to initialize dither buffer.\n", stderr); ret = 1; break; } in_line = malloc(in_header.cupsBytesPerLine); out_line = malloc(out_header.cupsBytesPerLine); if (!in_line || !out_line) { perror("Unable to allocate memory for page"); free(in_line); free(out_line); lprintDitherFree(&dither); ret = 1; break; } // Dither page... cupsRasterWriteHeader(out_ras, &out_header); for (y = 0; y < in_header.cupsHeight; y ++) { cupsRasterReadPixels(in_ras, in_line, in_header.cupsBytesPerLine); if (lprintDitherLine(&dither, y, in_line)) { if (plain) cupsRasterWritePixels(out_ras, dither.output, out_header.cupsBytesPerLine); else write_line(&dither, y, out_ras, &out_header, out_line); } } if (lprintDitherLine(&dither, y, NULL)) { if (plain) cupsRasterWritePixels(out_ras, dither.output, out_header.cupsBytesPerLine); else write_line(&dither, y, out_ras, &out_header, out_line); } // Free memory lprintDitherFree(&dither); free(in_line); free(out_line); } // Cleanup and exit... close(in_file); cupsRasterClose(in_ras); cupsRasterClose(out_ras); return (ret); } // // 'write_line()' - Write a color-coded line showing how dithering is applied. // static void write_line( lprint_dither_t *dither, // Dither buffer unsigned y, // Current line cups_raster_t *out_ras, // Output raster stream cups_page_header_t *out_header, // Output page header unsigned char *out_line) // Output line buffer { unsigned count; // Number of pixels left unsigned char *out_ptr, // Pointer into output line *dptr, // Pointer into dither output dbit; // Bit in dither output unsigned char *in_ptr; // Pointer into input line // Provide a color-coded version of the dithered output, with blue showing // repeated areas... for (count = dither->in_width, out_ptr = out_line, dptr = dither->output, dbit = 128, in_ptr = dither->input[(y - 1) & 3]; count > 0; count --, in_ptr ++) { // Set the current output pixel color... if (*dptr & dbit) { // Black or dark blue if (*in_ptr < 255) { // Dark yellow for gray that came out black *out_ptr++ = 79 - *in_ptr / 8; *out_ptr++ = 79 - *in_ptr / 8; *out_ptr++ = 31; } else { // Black *out_ptr++ = 0; *out_ptr++ = 0; *out_ptr++ = 0; } } else if (*in_ptr) { // Yellow for gray that came out white *out_ptr++ = 255 - *in_ptr / 4; *out_ptr++ = 255 - *in_ptr / 4; *out_ptr++ = 127; } else { // White *out_ptr++ = 255; *out_ptr++ = 255; *out_ptr++ = 255; } // Advance to the next bit in the dithered output... if (dbit == 1) { dbit = 128; dptr ++; } else { dbit /= 2; } } // Write the output line and return... cupsRasterWritePixels(out_ras, out_line, out_header->cupsBytesPerLine); } lprint-1.3.1/testsuite/000077500000000000000000000000001456151556700150745ustar00rootroot00000000000000lprint-1.3.1/testsuite/bad-label.pwg000066400000000000000000003373371456151556700174360ustar00rootroot00000000000000RaS2PwgRasterauto ,,#+Q) / A&)- A&), *&)+2&) *2&) *1&)                                                                                            "+^!(Z (Y (3'  'b (3# "e"(3de#feefkڎef e҅fefhoefe}feohfefse#fe}e#(4f$Wn F1 fO7z)_z1")b (4g Wo F2 gP8{)_|1!)a; !(4fWo F1 gP8|*_{1)h(4f!Wp F1iP7x)`y1)iD4fAPFWp F1 JPsOPQWOP^uPONU|ONOQ?1FP/ )b(4fCOWp F1 H/0-Pf0Cw0/06Ϥ<1Ow)b(4fQaWp F1 PWq H1a)cW?A?@@(4fP_Wp F1 PV p F1_)e (4fP_Wp F1 PV p F1_)b (4fP_Wp H2QWr H1_)b!(4fPƷ _Wp e6%\HB<nH]U e71_)b(4fPa 87U_Wp689- (876T.8OU784689-1_7 89)cB4fP7 (_Wpfh )'1_gx)cB4fP8 *_Wphg))1_h |)iH4fP8 )_Wngg *)1_g |)iH4fP8 )_Wrhe .. 1_g {)cB4fP8 )_W{v=[}{~y7 =v|{}}|t91_g {)cB4fP8 )_Wv7    wZ Zn1_g {)`D4fP8 )_W{: {V Wp1_g {)`(4fP8 )_Wz:{V Wp1_g {)c; !(4fP8 )_Wy: |V Wo1_g {)c(4fP8 )_Wz:{W Xq2_g {)` (4fP8 )_WspopvW!Ypop~{qpopq_g {)` (4fP8 )_WM D4_g {)g!(4fP8 )_WFI ) _g {)g!(4fP8 *_WEH *_g {)C !(4fP6 (_WGH )_f x)C (4fPV )*J_WհY)+*) H (*D_~)* ),)C  (4fP_WVUh ghw"H Ms Vt_ʩ )C (4fP _Wo92H qW /_ )C (4fP _Wp:0H pV 1_ )C (4fP_Wp:0H pV 1_)CW@?A@??(4fQ`Wp9/HqW 1a)C(4fGTWp !K !2D!Vۃ'!ub !   ! ! 1U~)CB4fM_S#WpVq_|>{_tm_~b_i=8HV~-1$S_^6)CL4f$Wp F0ahP7|(aXq H1%)CL4f$Wp F1`gP8{)_Wp F1%)> L4f$Xp F1`gP8{)_Wp F1%)> L3e&Vp F1aiQ9}+`Xp G/%(A B3W#XVp F1AF7{(TbqwXt{WXZnXufW$Xp@ (3%p F1#()%!() &(('(=C)()4}-)(O%BW@?A@??(3%p F1 (y9$C (4 p F1 (z 9 I (@ p F2 (}: I (? p }C0&   -4!t6 H(?Վop oponp=noqY!Qqo|;.uN `|po{}ol8Tpo|֎op op>L@9 *`WpggO )`Wp: *>L@8 )_WphgP )_Wp8 )>B@8 )_WphgP )_Wp8 )>(88 )_WohgO )_Wp 8 )<  -(76 0b ]u  hm V  2_Tl     "6 )<   (7Ԓz{Y>}{z|j(h𳄅Š_,h{r8 bl+2tԒz{Z )> (74oW$ Eh_ 8L]5 )> (7/qU!F h_:N_0 )C (8/pV!F g  _ :O_0)C (80pX!Eh_ 8O b/(D竭 (8079wG}n 9s_" 9cO L\9+69:8VE݈-(80]LFG; ,FFL OFV_kO =FV,UF/'?Y(80~Vn _ O:rG-B80{Wp _O8oDYE D80{Wp _O8oD㡈yL8/~Vo aN8rDʴ@0COH3͜N1$ h9 10u16+1B m12! w n121+1B8^;fJB3MNMm)'KNz }MNmDnN~ NYw/ NtkD8%JNMNh;YA `B3dP8o E0b0G T)7a8(=-,)+./-,-+*,-,%  ]xD4fO7o F1`1H V (9_8*=('&$%*#()('%"$)*'Pdǿ(4fO8p F1`1G V )9_8);?AF>-.>/-=CA@CF8+0BDBCEA->EFE.(4fP8q F1`0G V )9`7)<XZ_WFGVWHGV]ZY\_QDJ[\[][HX_[Y!(4fP8D Øuhughz̓hu xhgh{) !(80{V!(z1 P pp9)>ݾ (80{W!'z2 O qp8(>`kᓏ~(80 {O8'{ . ^!t pK/ &== -N:1L\(80-zifgV$ Afgx{fghx-Hfgd ^҅fhjg fep SԢ`́f|=4z/$4@uB80I Wp Gf 8 { Vp  0n=h6& UuD40H WpFh 8 zWp  0 n> $,LefXC8 :TD30G Wo F h 8{Wp  0p?rl$Ȱ# H30F  Wm Hh 7{Yr 0oD'%A( yH3ίaP~TOP/  2PNOPR4h sOPNP~TNOC@R a޷ZP\0oB>t%"6 D3/1bw{21'h ̃40wG*0/./0VB0m0oBB}>(4fP!y h  qX/`0oD@W@#&?>#"(4fP!z h  pV 1_0oD@jR@#(4fP!z h  pV 1_0oD@Z4L_@!(4fQ! z g  sX0_0 r>?yJ)*?.(4f<QGH>tz4IGH pd TA=HG\QHG\HG'T=@?3X8(4f.8mȪG#898Cz* $898sa987 487/Gd8s787el 487T>?G "|5(4fFXz3 O7YOhgO (>@wJI|ye=PF4gHU z2 P9V OggO *?B} "CwH4fHVz1 P8WPgfO )>C}X3H@8|(1`g)_z1_(>H3 9{ ) 2`g)`{2_ *> D3vqpo}볎spopi2=np|qp|zoqO`{pqL SpqpvW_ަqoqp>(3n Ox_ \j ,&.,&V _oYDq=ˌ}IX}ZB?B??(4fH oUWq 1 ) P_fN8m=Я`P-YO#(4fH oUVp  0 ) O_hO8o=N9 )4.4Na!(4fH rWXo  /) O_fP9p> 51 -.(4fH ae )eu*).I) *)=# t_)+_gD2)*)u>ի"/s|`-#~(4fH 'PVc bVUV[~VW6  6VUVqbrvVW:/TVeg_gGVW?UZVn=`H ?YѺU@ i(4fH ('zP*a0_g|'>1%)ڤ(5GF4fH )(zP)_1_g{)>?Ҧ>H4fH )(zP)_1_g {)>@S[a?(4fG ) 'zQ(_0ai x'>@ J?-(4f  ^  >=! .z    G- C_   D߅U[  ! $- B>AA@ (4f3 Hv _vz%u `>BM_֦_8GUt_8 $S_V& .~֦?@@@!(4fQ sW Xz;ahG_Xq OHO;x68!(4fP qV Wz:`gH_Wp OGO0Ӻcn꞊'+9 (4fP qV Xz:`gH _Wp O G?(ﺝT $Rwl BX (4fP qV Xw8_eH _Yp N I=ׯ,JAc7:6 (4fP乧\ qV 7XWsYVWzeWXWW>Hӫ_=|W\鿧pVWXW7  6WXW?2 =Ρ ž1 Z| /; !(4fPU()(qVD)(5+H0(H_#)()4b(H+ !) (H=uT-5BC<7 ?ytV4@(4fP6qV!(1H (_E/!1 (=w  [x$$N_D4fP8qV!( 0G )_F1 0*>͜XM<=JRnּB4fP8rV )0H )_E10)>̾zlWVitB4fPE k[,&/D| )_S?/&/  6AܷH4fPަL 5kpou|porMsoopoP!Ypopn= )_䫏՝}qpoP)qM @CH4fP *_y`g)_gG o@H4fP )_z`g)_gG oFżB4fP )_z`g)_gG oFB4fP *_z `g*_ g H oG*  %m B4fP (b z    bi (c  m  E oG "T B4fP֕{|zxBTz{|z bl+9{|{| H Sz{|[ߝz{z ^%a{|zxC oD /<'eD4fP< $z8Lg$ $(K6 0 oD  UmM'Xǿ(4fP8!z:Ng    )F1 0oI K.k @B@=.=BA (3p OhhO8oV p F1 fG *;X_qplpdF^fqg\anmnl_lqmlW? ?(3q OhhO8pV p F1gH )?  (3 o OhgO8oV p G1gG )@,"N3񿗘$hgjO??2|o$4dgh|xhgzp Qx.1ԡg"Uhg .ahgf~=G.1g   B@ϰdU&:jH4fQ`Wz:Oj )_V G1g'>O: -&-/29JLRZB4fP_Wz:Oh )_W F1g)> 6  &SZ_(4fP_Wz9Nh  *`X F2i )>լ!.s3FC0.124623R](4fP _W|K^u!'WP F- ^  )>^G;Ua2'~NHG? !(4fP҅fe gf}_WghzgfśgfgiZEfgZ&'XfgkFHgh g\+3~R )>/$(֯YSjw!"(4fP7 )_Wo / { F O )>? V?"(4fP8 *_Wo 0 { FO )?@ Q?YB?@??(4fP8 )_Wo   0| GP *>?B? (4fP8 )_Wp  .~ GQ '?@A?L4fP8 )_Wp  nO;ZSNOB 2OQkOB!GOH"9 $JNg>A@?B4fP8 )_Wp  /0vϯG|2120SBWV)0h ]>>|@@(4fP8 )_Wp  9qX!{9PjiF q?/c@A; ! (4fP8 )_Wp  8pV z9OhgG oD'ϧTNB (4fP8 )_Wp  8pV z9OhgG oDٳ ,y #@ (4fP8 )_Wp  7qX z;Qjf FnBϞϻe.@ (4fP8 )_Wp e  ŷ_GHGzA z+=M GxMGAtS .6ADQS@6 (KrI   (4fP8 )_Wp89 8 [8aƇ@78/ z*89/28Av  >lU (4fP8 )_Wp f .I z^ BϞYJ*'5F\g (4fP8 )_Wng 0G z`Eݸ(4fP; ._Wrh$4K z]I B4fP֕yz {zx_W{u=[ {~{zґz{zÃz|g+Rz[{e)1sךIB4fP _Wu7  bR ^z7L  #9 ~IL4fP_W{:`W Wz9O 0zJ® (4fP_Wz:`V Wz9O0{JƼ9,!'*$+;ep-(4fP_Wz: `V Wz9O0{Jʖl^# !#)5T[t (4fO^Wz:` WVz9N 0{Do   +SPIF@9)!(4f0w~5Wz:鰏W`ۥ͗zpob*4yH"jv..epon|0!Xon}D[ &() *PT`^VN#!(4f Wz:Y `?!4Y  b0DwA {ӷZ !Qެ' (4fWz:M`1z)`g0H nAӟ)x%Jʭ, (4fWz:N`1{*_g0G o@+ #h!m暅&",(4e!Ww8N_/x(_ g0G n@ *tV- -(3|)*#)(q+)Vi)*)xP)+5)*Iy )~ P)(c1)?<} R;(3ɩ#Ъخ ԭ?B@@D3"# @@@@B3$&A@A?B39o@>H3 1۽_@=H3iOZmԝ_0M|ϋx"=QH3ݽ Ƕg 'ç1 qB3֪0`vJ$I{#B5܍i  I.IeB5诏B9-*! & ,;rD,:BuB8ߵ~NHSWY^푈D8ʫleptw}D5H5H: D:(8UVZB?B??(8V#(5I !(5E!(3B~(3‰@(3GFIRiltx?(3  +3w@H3;8/,&%$ Uj@ǿ(5ǨdW ,s?-(5żPF6. Q@ (3ϣfR0"9]A (3qJ?@; ! (5Ͳc%k@(5Ѹ)Oi9B8̝OE!"PQL8γra L3˃jL3-  L3Èy<&%B3pFB5񶡝(8 (8 (5  (5ſ (5ݖ8*)2u½!(5īm]$Rl嬢 (7G235L7'#g (7* '0OQ4(8cդ Ii;!  (5ʖr &b9&*" + (5wZ *DU. #G6 y(3$1h.ߤ($/D3@95(5?>>W@?A??(5@@A (5~@@@"(5~@B@#(5~8v48!(31l&→0 (30$%賖S )gɓ$4D (3Ԯ  #̵: '?2#flk_  (3ʞ$&!?VoX"JNLD#5!(5iK "fO8:F!(5u5-" #"!"5E}jHC9?kv (7ҕbXEDR\ε (7賨vbapz (5"(5#(5 (5-(3ˣ`ZEDGITcŽ(3ذeoݱ}U,&.D3ޒaY7KgF2 (%LZ(3/"W =:)#  Lm(3Ԫ%.]xϵ= C}ve '<(3_HBW# }" e(3H7j~`$FM4Le (5=G rŲ1  (5@Az7 (5A@?  (5A@@  (S_>FA(S_ 9Xz> ; (F .,U@o. Yű1,:(E .,jQ XnѺ:S貟,:MDE .,բ NelN+hל;,BE.,* 0HAv\#(D..뻝UF175452,.46<9%!",XA?@??(D     gyf   5F (C  h嵨tgLH9321589:7,3JN]e (C iŐl`QMYgaO^(B rµ(Bv DBtDAoJA   lž (@    j˅wib;,*$ ,   dհ #櫑*  (>  d0&)ܵ.%1(>     e6<-(=    i=>(.?@D.?@B.??B./˹1B~/ j똂# H~1G6Pdub4DH5]tt^ B5C.BRSC2J(8I: ',% %4- (8ѲcT'!% &@O  (5ݼybXFBN\[TDQz"(5Πwb]jyxrcp"(: (: (8 (8!(5!(5!(5!(_Sލ!(_SOJq(E   U") 9(D   U  6%'DB ^⛃}BA ^鸡+"]oB@ ^`FHA   aG pHF    :968;<:9:98:;:8)"f(F   $#!"#&"!$#$#"$!  Rj(F    =?C<,-=.-*):AHK',@D5?7Q;(7?E.8-(7@sA0bખ+!*(5Av ,L$q  (5~CB5*?xy'  (5DԊA6 Da!(5 M[J!`"(5[Q4&(B      iO           +ũ[ W~܈t 8K (>      ˘s *?]/9nY'QTUO)  (>         ̜ ˽4 Sv "!(=       R9 Rauxqg +RƧQ<&-a}!(iPuo  Tp EW!(iPuȮpd=6.58L[ɴ!(iPuʻrcKJ`j!(hPv̔wvXA@??(gM(cNDcNǿB7ﰤB35#1vB3!]B3 .;*mD3 ;K, \D3  ɞnO0EH3 ʘR T|H:"xc(.RdD:"ѥ%#3 (5!κm8Ym푁(5 Q>#(5!ঔQHS\"(5"u i!(5 Ǽv^ OnXA>?@@(3+*)+/,&*+,-0;9&  #,(1???? ?? ? ??  ??  j %&*'" $&$!"'+32'""'(1???? ?? ? ??  ??  j&.@>8  -6@4(-<>@=;,;?H1???? ?? ? ??  ??  j@HZUVXN3GOZNBGVWUGVZXW(1???? ?? ? ??  ??  l  -(1?????????????????????????jH7e}ÇE!muwurlKB (1?????????????????????????j=|&Y< (1?????????????????????????j@ U@!(1?????????????????????????j~@D?"(1?????????????????????????j@B?"(1?????????????????????????n@A@!(1?????????????????????????n>~A@.(1?????????????????????????j1i@Aǿ(1?????????????????????????j)ش[ GBB1?????????????????????????j˚t *?Ԉ0p@H1W-W-W;;;;;-W-WW-W-;;;;;W-W--W-W-;;;;-W-WW-W-W;;;;W-W-W-W-;;;;-W-W-W-W;;;;W-j̙ k(@H1lQ6R`txtg92YFA5l 5cK A5ɭma<2 +246EUvliAOlZ/,;CWaz(OƻvF*!.?t+-{y|T>"D'DrczMUpvF*&nvC%2͖a]lt(Mͧl<' &5i)+mӾ`fA/!Dߚv'Dr]nGMgl<'&hi5#2 DMϟ[lãۭꜚӈoAQbzʽ䱂Ǯ೤ã¸َDMʕVlŵïhAR\v÷ǖîïϿ{NKӪͼanΘ1bïe%1bdz׮̻ϼ<(^zNKڷƳܚ艹fqǕ/[ܽx^%/[ݺߴŻݽ}>'UpF;.)461,)'+9IozJMҰt_Ovpr`ŲԴbԴ̙ٷkn?(#IYrث۬}k($3WaJOװ܎z_Pz\]SU¯iŸƍ׻mvF*#L]sIJx$ )NMGDB<*7DOݼ{Yྲྀ  î~{~ڻfdϠ൦œŵ݈a   ,TUWSJB(OܹtZǻ3 ~ڻee˘˛²0j췞O)RƔ| &=W?A@??(O˘eFɸƷehꪫ🵪ŷǮ̸ܹŵŵ򤘗 ҼpMŨ"  (OΞ־E#˾n󸫡λ߿ΫˣʙG6pή['܇q!7H (O޽' }g4Nl`_E.9ho;j߾7#,e&^h26T (s[+ !(O[?G`DGu뇆lZBJe벑FJeĻcQ?KZSE^DEbz5x.d6(OB}@AB5A~@AB5@@@D5<w??(5 3a@>-(58+&仍H '^俭/ *(5ְ *˺o $Ƭ>* j  (5ΠoU 9!; (5ׅb )," C|6E`(5+"#_3")b~B5ϞymD?JNMStvH5ƥ`YgkmtH5B5B5D5D8 (8W (7N(5E (5C (3Ǒ@!(3hily@!(5 (+8@@ (5#bz@;  (3Ƽ}v\O)9}A(3۽zl5+^AB3нxTC) 2:Tt@D3ﻤwb< E?(5ҷlU0=|@XA@??(5βu Qm<!(5ĭo\852<#!(5̰m[ !(5ֵ\I !(3" !(3VE$ (3iAC (3sr (5"(5Ľ"(7E8,8A  (7~l($aƺ  (5F09;J5%!h (5(%/TV7*6bԣJk (5ѥ~ !ĻV5+4K: $ox{- (5` 7yN, 8% -(5#.i.ࡍ(%/(5<9Ѿ3(5>=9D5?A?D5@A@~(3A@@ (3={9; (51o(1 #(5)%洘T )g̑$5F"(3ʖr&̵<(@2#dij_ (3ի Ұ+'@ZEQUL # (3aC () [ڴL86@y (3`!(vkT-( 'R_=.' Ll!(5խ",^z϶= Cxf (;(3]F?T~$ }# fB3F5h{_$DO5MfB3>G tƴ1 D3AA}7(3B@?-(3A@?(5?G @  (5 :Y z=  (3YCl¦. [Ʋ0-<(3nSUkҼ:T糠,;O (3֣  I_ŽkN-jԚ;, (3% +GCǽu\&-(5뽝QC04563*,35:7%!#-(5lX    *;B5洧tgMH:63136569>C^iD5“ncQLWca_afkuL5L5L5򻲦L5˄vje>/-,$ -/.81T:D5BQvμ4 D3BvJI|{g ?R(3A?{(3A~X2:RW_^R*A(3AF5OrA3Sp_1+%()(.uA3JNZӨH3z~ƼH3B3ΰǿ(8{k1Bsl@ (5:x58 W@?A??(5,жcb坈%0@(55(!x쨇K%.Eesb VrD5ݽ !A Dd,./+ (5ϡ þ1Xx /(5؆b ()! F҅c8H;!  (5*"_䣁2)+2Wg (7߶`REDS[ (7pZXhr (37=OQNONE *;EPE:?NPQPM>=MTSR (3޿˳ (3"(53!2(7D,@R(7(5D5Ž(5-(5 (5#(5"(5 (5  (5 .(: (:NBD<(<(<(5 A5 H5 B5 (BA  @>A ~?  ??!~?  ? ???@ A A@ A11A@ @ !?BBA"@@A ~?AA? ?!!A@A A  @BA A ?? A ?11LK-K-.KNN-L-/KK-L-K--LLK-K.!.LK-L-L--KML-L-KK-L-K11ǿǿξξǿϿÿϿǿÿÿ߾ǿǿϿϿ¾ǿǿͽͽϿϿÿϿϿÿ1146        <?  ))<4     64    64  6I       4I¿ վ ÿ4V rTYIJ<5ƙs=W84JaںsS6-!2My˱fPߔ~!>Xi4vZP̻f$!.KE0IX꽤&E,#:'#Jfطe7 ?Oε<PsZŨ<6ŏPHe_-?RTV fRGPΓ$pÖoO%9ܪ"!>W͡y  mê7  i &BrҝF 4׹lY&:yڢG xSJFѝFiǭt\0w0YeLwǵ= _}&Bto' "vT  |. 039Ie$ Uv<&  I ;NnY Ci  Tu- =\rF #uS }읈/1踚5N~` (l^) /''ITTי =PkM  ! Nk   kz\ хj Ee<3TT^  +<㧈#5ݫ$ X-P}) %CƖU ,GWFJ*#>!#P ն6+xÓ$7Tȓp 7Ͳf)Y?垆 $3τj  %/)&0 x毁KiȑLArܚs *;aO0EbW")!V5 tæ%1G˗s !9ξg*Zշ'(x"?^  )Au$Bڪ'(- -V串1K衍4 2TZ߆-&"JG#"?OgI z}T.aOεoJv_ #;U%+>k|孎p"I- {iM'1& 6b6 8*jhLD*FJ(:C{L몌-r]@ 4Mۿ%2oj$9I2)v>2}&zy[ۦ) V\0"4vnYs !WZ($M2FXdƏP4:$@PG.6O뿎|PS#8Q:2@W"KvoWBJƪ/OiƧ4soT,~'^p(nV#゚jn #U";Ea/5Cä3jM,M{H1?L HcYE>ֵ\g˰/ JmQ#| ,bm"noR#컡zȑQ58"Wi &wtXTCA@GH2DSd?@A@^sDغ?';识,6Rx8ifYI04Aĥ FfU";Eﶗ.G"iK?>'mڻbIy;":NƧ:VT";E,b1%]5 F;#;K/ PV"@LjI{" ;C t 9Vu>nܽba:$?O§ CW:$Wޛy)?rx~sM?(2!&YΡV U2-Aܾ%DbT!27u\4/җ}yX3>IhЅ/CV~:!1@봅AC)KhKCRn]6% >Yu0LqxF?qtyPD(2~'ZϣV]25Fپ#Oc:#3EjS(Nć}s:3EWڮ;5RjT -9aT :!*8٪-+A[Ð m. x,!)CӧV2c(NT)}0 nF ;Y.&EJ #a)!5.PnU!(*7%zۜ#&*$:TȔkBT]7M.*CϥC+2(xR#*A@?@?>9-Π{ 컌wR' !Z.6M-LhR =GŘ0 =Xĭ_@BA:2!s稈2`9!:JHKσ?* *J9ѸW.KzwP5+@?@?92uҦ ~S' X},?P,Vi:$:Oܾk$DrH@A?6. Y|Ós8U/?`a:$>N,A¨. [ޫ1:V) ,Ff6g6 亜^tǨFg},2Jɖ., LP#Jy6!7K8#=QT";E9$'Ѵ[7I6K8,;˗[zN _ç2Skϴ2 .X쪇* &Dα , KP$Iu9#?O6#AQ:%=Q, A纝 }&:jT&. Pa:$?OȻq'7Es]4LМ#-C󼺑 3 t 4\3 ˭ Ym蹚W|~_ UxE+ aJ&':iX"M|8"8Lٽ2?WT";Eӽ0/C]΂7, *Ҵ<);x󽻦**ߩ RpK lѸ:Md¥. 9nh ;qG+`J' (4iY#My:$@OӺ0EV:%=QDZq'7FqӻJ1nq.S@!p Pa 9#AQδ<(?Ӽg8k诀  I[2Ft)ܿ*Wjݙz{@"躜PqІp`Z9!=QƧ LmS!=GݾgRж<(@ͯ7 Ol`  #NzPa :$>N︙1 2Yo6d诀 ;N/Ap+,Uh؋m8!ʬ"Jiߜ/! &1Ļaa@(9Jĥ RtS":DˣWSפ^w+2B*%z /_8 ,HZF)),.C0>W׼b '{iP"ŦfT!+0ųf->jݪHa0%1+FT G@O_+|E4ICMkؽb'~kO§w:!+<A :NB=S|W+`TT  :!.<ݠ5Nat.LxȜ4 #! ! 'DTt 3bF(*Na85,.C0>WѩY +sZpT!,0䩔T:[٧Ha˰J! !" "  $>Hܧ-I_* yDDVR(E3ICKiѩX*sV鷝:!,<ޛ6QlܾA=Tk!" $#  "+BrTk<&p qlPV$:Ba" Rا! BϨ!f~:#VR, eϷT0\!3ҥ9! ס r`! 7RЦC+ qТ{ayH,Pwð3"+ᘃ)2@V#.2δF#ViW: b޿w.&5=&1'_xvI :nƬ@*U1CTR  ;",:欍rf5!Vj88e뵘+ oʬ$  pḇ+ќ~~) yܵ "ܻ>V߀X.8q@`r] DXU!*-+ dpO 8TǢRC<&ҷ: K軞/Ե7 l' u線 ڹ媌U 2DTR 8";# la6:?7  R 8Aq?$3BA@?@?@ABCHw:@A@>7-i9">N뾏:@6+fg4&.@B@>4, Tw+I!<?@?2* :V+;ABA?@JQRX^badheghmrzႀxwz|ututsvwkacaSJGIR\dDf%SzRDLbz钐wbRKHO]{Cf%OsD?@Lbx阞n[NIJNa{Cf%LyL>APhxwh[VX[_ozEe/Lq@;>@HZo|󍐋q[NMSYd{{Fev%MU@<>AOev󠘒{dRLOT]n|Kev%LkIA?HO[my񐓒yk]QRWau~Cev%KfGACOT]ix臊뫪~o_TRT`n}Bev%I\HBKVX]ky򊋌􍇂wdVST\j~~Cev%I։YHKV\Zbs~􋇊vj[VX[ewEev%Jv[PX[Y[gwꭱ󊎐~vmcWV]k Aev%JuXPXY^jx}𨫭팎xne]VT[i@ev%JeUSVX[bmv{~󊏐ꮯ󏋂|ogaZUZn?e/J`Y[`hrx|}sia_YWbz} @e/JdZXZYZerwvz{slfb][^kOe/JڅcY[XW]istsz~ꉋ|solhd`cp Aev%I{a]XWXY_jrsz~|somfdfq ?ev%Irc[W_iqrsx~됌zokpskcgt >ev%Ite^XUWclqpry~{pimqmhgq =ev%Irf`TRX^flqtz񉈃~tlkomlkm{<ev%Iݑoe]ST]baclqrx~xplnqsx<ev%IՉme\XZ^\]emr{{uspqtz;e/IЈof^]_\YZdkor|򢧫񜞚y|zutx;e/HLJme`_^\YZenor螠}~}uw}y;e/IЄga\Z^b^[`ilot}󻺷환~z{;ev%Hu^_\[dgchjhoy|񲶸~|};ev%Htea`adhkhihox~콻~}w~;ev%H~lgabdgnljhou}zx񭣜|twnmx}ysv{<ev%HƂpiegdhkmljkru|vntqmjkjefq}ľ|xwrpje^dht}}{s~ 8ev%H{lhgcgjknlruz}uroli`\VZ]ZY^[ds{~鼶~qlgc_YUVZcp~uy򅆀~tmw8ev%H|neb^aikmnlmprvwpmigf[TSRNQ[\]m{ڞ~wkb\^ZXY^fvyuy|}}vmq7ev%H}ka\akonprswtwspuvuy}|vonfag`ew|֦|urjajpsy|}upr8ev%Hyg^\[bjmoqspqvwy{}}zrnsty}vz}~zpqx9ev%Hrb]VXdimrstqonuwz}xvw|}y轶~zoln:e/HjXTSYdkrvtprtw~{xw|y³|plk{;e/$ oPQTYbjkotqtuvx{yuy|znij{ <e/$qLMSVajoqvwz{z~|wtpzpgjwtvtw~{yvtz~ͮ~srzk]\f =e/$껠y>CNSdknpy{|zeV\cihir}vqfadjsz|z|ywz纋wsrw{l^NB^>ev%$b5AKTcjms|aZdlic`bejmu}|~wqmbSRbrzzsg^jxytv~~qib]^mv}v{rf`_m~?ev%$ݑtwc4?MWbgmtznZjkdWVXVQA?977854HMHFJU_hp\lnbZVQ:9dws}3e^W%%im~iKFPXRMOKPJQvw^NLNVZ]WKLX[^nvurnryxZAHUi}u`I5Qbosqoprqsnc]\]_d`\djts[}of]GU~s|} >e^%򭐒phvmPIR^cdir{|Zrvd^bhlmov}jMJGLdxgT;@IgwqolovreinxczqdPfHe^%󯘕wuw}qRFOYbku[isnmruyv[?OJIbs}mO>9Qdoyvwrjknssmun_RtGe^'}~{x]HNW]hqX\optpsy{whC;9I_o{rTRPltpx܉}xtrpqrnoxb{ul\^Ge^'ypSNV\ftfNjsxutsw|y{cE@Oapztabhpx}|~~~}{utswuvwvuwidytmbtGe^'ҙ{{_QUZbqUatwvuvz|{|iJHTenywdY_m|yxtrorytvzwgauoknGe^C礜~~{jUSWZixw{|pvuwvtw~{yx|q_SQ[hq{zk\Zdqx~܆}{xywqrxytsqgfynlkyHe^'񏖅plYSVYcm}]`nuwxz}|rgXYZalu}re][`dp~w{srynjxsHe^'Ν~vi[TVX]gws]MUaipw}}|vtj\RW`adgnxyqgb_Yalv~|{plhuv(e^W%&顎{udVX[bpu`RW_gnprsnd`XQSZdljfhks|xnmkihedinkhotzpu뒑~smi'e^W%&{sZWXap}|voa\ZYXUTZbiqw|yichp|}xnotwz}~rmŹ&e^W%&֌{wZWZaoyꎋxe_jx{uplw~푍}rmlɣ%e^W%&{u\UW[cmx}p_bp}yrjr}ꘗ{rmk˭$e^W%$ǁv\WY[anx𛞟qf]fv󘔍}ujnr祠|sml|$e^$ᎇaW[bnv}rdcbjz}vnpv|umi|#e^$}~fVZ^bmt}khlrz}yusm}ukhz#e^%~zcWZ^blu}}nqtqr}ê~yx}{q}䱰|rjit{#e^W%%dUX^bis}~zqwqvú{xw}tyqikq"e^W%%ĉ~cVX^bksz}󚝢~osmlu{tpox}vzvqjkt"e^W%%cXZ^ckrv|ꛟqnrvjbixzognqst}xqiv#e^W%%󱐎{bY[_iquzx}pwrbkv}ymbav}smx썋|xqjhw#e^W%% ͔}dY[\_gnsvx~펒xolmolkquyxvmfhlmls}{zvqkiz$e^I|{}wd\[\_ekpty~zoefo|wqrstyqflps|zwxuplx%e^I{rtsfZ[^_ejory}~|upfmx{}qgjhjtwxztnlw+e^I҄motm\Z^_ckmsy{~|wojhmnt򒊂oeg`\aitwxplku e^Jhjyw_Z^_bfnuwz|~zwphdiws~oeg`\bakv{록zwxpljhte^W%Jcg}cZ^_chqvwz~荐}{}urjecjupuҗokje\[^ino|{z}smlhse^W%Jhcw|cZ[`dhnsuy~wy|}|{vphdipvz|}zqpg^Z[digv~}|spmhqe^W%KpkrbYZ^bemuty~vswvtzwr{vmjknsz~xnjbcafkqvw~|smkem!^f9%J[X^bfqvw~yrvwtrutsvunmlp|ꑓwslihmvtpx~y{|umjhp%B^f9%IdV\afqxy~阆tsu{urswyuvzutw|t~{򆅀zvmhw#B^f9%5lVY^envz{|rsywruwz~{y~|zt}umb% A^f9%PwTVZcov|{|r{|{uy|x{|{|{vtu}utsx{~|{{t|ztmc"@^f9%PUQWcov|}w}zuoigbca\b_\bge_]_]_`a`dfit|||wqie!?^f9%PXQV`mw}|{~{tj]SPRTWde_ef`WTWalsqz|k^\SLU_iszwnh! ?^frP^PU_jux{~iSD<>Ljy|qJ93:Wu}yuofn! ?^frQhORZhqw{}|݅kJ.0IaϿγ_5,Dj}yxqj`z1?^frQtQRVdox{~®iO@?Kpͷ̤c{S9Hh}yxpi_0?^frQ~QRT]ju{|}򖏀iVC?_YEYcd~\ZRJ]XKRew}xvnfa-?^f9%OQOSZfqz{~vdZQPOKOTUX[^PU`cZWXWYVW^is}vrlcd-@^f9%5SORV`nyxz~oe`^]`a`ab]Z^`dghlinsz領|woh^h*B^f9%3[NOR[juxz{xkgdbfhnprtyxtx{}wronruv|~yumb]p)D^f9%3fNQPUbnux{}~rlfhqy{~vqoruxz~~xqha]}'=^f9%4|NP\gpvyyrtrxy~|}폐zume`\';^frRSMNUakuwtzzy~~yqja\( :^frR\LOPQYfos|}zumga]59^frSlNOPT`fpuz~茍xtplc]^e-8^f9%S{QOR\cksz~{tpojb_p,8^f9%STNOW`invz{~{~{vqlof_`,7^f9%STPOMS]flrvzrlxꊏ|yurokb\_`-7^f9%STRONLOWagosofiu덐򜛚zyxvrqoh^]`-7^f9%STRNR[bimotkas퍂oqtwupqlb`ac`,7^f9%SWRVQNLOV_egmoibrut{svrqphaedb.7^f9%SZPTPLMRYadhkiagiq񞝙xqsrmf`dgd.7^f9%T[QUWRMLNV]fgaVWdnw|xsptrkbdghde/8^f9%R]UXYUMJNSZdg_QO_ho|{z~qotvqgdghefg0 :^f9%RXU[XUPLORW]fhdXKVdnx~{󞟡~wvx|~vmqxtlghgdgi1<^frOcPT\YWRMNOR]cgh[JTdkr~򓒉zusnjlu{pikhecfj1>^frOnWPUZ[ZWPLPYbhYHL^lwy|򒜢뎒|wmhpvxlknjhfdgi15^frP\POUX\][VNLNS]dYHGWjz{wz癗zyschsvrkpofghi1R^fr$*eQHLUY\a^YRJMPXae]IFWmvu|t`lsporkdghfgj2 Q^frOnXH>GSZ[d^UKMRU]ef[IL_s{zgputqpgehfgi7P^frO`R?1@OW[ea[RIOSZ`fgSGVw򛜛xjqwtrmecghfg5P^frLn[O7%;NW^ejhe\NJNSZaf\EWwoltvutpfcgkhjl1P^f9%6aUH+8LVbgjomeVJKQX`fcUr}|xqvwvti`acikoi2 H^f9%6|\RC#3KU]fjnqobPFKT\bge\lutxِzjs{yxsl`]cgjlorgZ1 H^f9%6kWP=5HU[dhmuxp`LGNV\eje^`dy񓎘垣}mu{wvpd\_fikjlpsdPX1 G^f9%6_TP9';HT]`iqvzyp[LINW`djeWt|~ܐzqu|zxsj^[ahmqsaH_ J^f9%6x\UP:&/?IT`fkrv{}vdXIGRZ\de^_pop|nyzunb]aejprswt_;JU`jpqu|{tjVGKUY`fgagbez}wztpstwtwz~|qd]`dhnquzyts`51I^1M^fr6泂iZUM9-5>IV`hrvu|ykXGKSZahfdT[mznovwx~tld`cozsuqr|~zw~|~ud\^chmrv~|vrd6*=S{ O^fr%ԡuh`XYUN;.8=HV_eq{~}zjSFKSZdegc\ahv{^U`]ekc_]VW`dX`afehjpt}wiYaflpu}|vtrg7"6Nf  Q^fr%麂d_b^UWTRA2;DJXt`QTa[KMRTROPQSQPONLKIMNUhlZPOPM[YTSKZV_^f_V^QYSTZPQNOMKIKHKJHKMLVP[YWqf9%JOSLKIKMKNLMKMJNLNQLNROXRXOXWSbT^`UfZ\b[eQEPa]URSURPOPOLNPLNMNQPOPLC<8?82327FN\hĿȿhRVX^eULKLEDHKOPSTRPOPMNMOPUgbROQRP\WDCGMOXRVST^Q^UXcU_T`UVWNXQOQMKIHKNLqf9%JKLMOKNUKVRO]PUYR`PWbTj\[hSa\RbUYZQXRLROMICI_WRPONOPOMOLNMOPOJ<0,.7NH@>9&+DPYp¿¼ɶ~WLY]c^MDFHKNKMJOMNRNUP]TW\ScUX\UPMKILKHGqf9%IKNLMJOYSZQVbO_YShSZ`WbSX_T`XT[NTQMOMNOKNLFJIFGZbYUSPONPNLOPOPLCBD+)8BGNJEGH')HP\qÿ¼rWIL[ebaYED8?=/5<>?B@DHKIGKJEFCJF=936:EKINMLKLJMLMLKHKPNSKQTWUNUOJHGqf9%JLUP[UVcUYSRYLSQNUKOPKNPNQOPKPNKMKNOLNKNJNJIJTd_WTRSRPQNLPMB@<;@I6;GHIJKFJQD*BHQhxɯn]J@Rgjb`]QGB@=><;?B=9;<8=BAGJLISKQTMWU_W`W\lVaTZ_RTNKMNMOLKIHIOM\TOqf9%y[jZQPIKLKNJPMHKPSNOKNLONKLJHPMNOSlYd{[gYdP]dVPSPS\SQRMN;"1CJLF?8EKJK@BC?* ,BLO\|ȱz]^\ZUV\cfbcVHFECI[MDA?FGJLKLHEGCDCDCDFIKUTeZg~[p[hrY\OHKLKMOKLKHEFHMqfr+r%b %\ %] %_D]F\ %b %r%+^%^%^HMFMEr%+M JMHMGM F!\]\[]\]\[]^\]\]\]\]\]\]^]\]\]\]\]^]^\]\]\^]\]\^]\]\]^\]\[]\]\[\^]\]\]\]\[\[\[\]\]\[\[\[\]\[\]\]\]\]\[]\]\[]^]\[]\[]\[^\]\]\]\[\e\Z\dbWhbK;Rcki\OD+$*:L<467FV[Q`NB[a\RJXlqeVSPNMI:0$.HtoKNhjafm~_MYa`]_eja]^_W[]ZRXd[W^YSVGBEDAHNC'!:OKGL@:BLODQZ\MDTQV\_NK_^_]S4%?Y_UPJ0*,;Q[^[UTPU^_U;<3;K\tf]TVbc;#!,BU[\[Wzxk`9)Kci_ %!]^]^]^]^]^]^]^]^]^_^]^]^]^]^]^]^]^]^]^]^]^]^]^]\]^]\]^]^]\]\]\]\]\^]^]\^]^]^]\]^]^]\]\]^]^]\]\]\]\]^\[^]\]^]\_]G`][\]_\]\^]^]^_]^\^ed]OBEUZY\USZ[hTRYUcflfTR9(>E7BQIFD@<4"+FRN=;2#";k{sjSF?HFdbVW^\RLY_^_`[UPUWXZPQA>W]\]^_`YB(6[^ETL.*CX\^ca]`VO\dU75@MTea[XRX][P@1#&O^\[q|`E>V_]^\kq %!]^]^]^_^]_^]^]^_^_^]^]^]^]^]^_^_^]^]^]^]\^]^\^]\]\]\]\]^]\]^]\]^]\^]^]\]^_]\]\]\]\]^]\]\]^\]\]\]^]\]^\]^]_]^]^]^\`\]Thd]_`^]^]^_^YV\^]dgkcSRVQW]\`UGDMa^XSVWPC.;KE5#")./.)!&!"&#$)546,3LUQ[Q^b]`_IW_^_`^`ohUQG8E\YUSGR\Y\]`b]_]M/,HJZaM0:UZ\]blZLNQV<0N]\JKX[XVZ^]a`][N*:Y`]\fppQHZ\Y\ZUS %!]^]^]^]^]^]^]^]^_^]^]^]^]^]^]^_^]^]^_^]_^]^]\^]\]\]^_^]^]^\]^]^]^]^]\]^]^]_]\]^]\]^]^\]^\]^]^]^]\]^]^]^]_]\]^]^]^]_f_^]qd_^\ah_^]^]^YX]^_gb`ZFC:6HRWgpXIT^RDA5BTUVMHGQ[]K,)LUYZWKNIR]TQOC463,*($!  3DO[NcqbacT[_^[\^]kh^[TFLdUREL^][\SXdfbYW@,9V\[1+Q_[ROTWTW[PIC.N]_TOW^]YZ]^`]G-*AUX\_j~`>M\][XUHC %!]^]^]^_^]_^]^]^]^]_^]_^_^]^_^]_^]_]^_^_^_]^]^_^]\]^\^]^]^_^\]^_^]\]^]^]\]^]^_]\]\]\]^\^_^]^]\]^]^]^]_]^]^\]^]^h`]_te_^]_^]^]^[]^_de`[QC?17PTcq^[\XVJHBJTYXLJOFGKWSD41GRSIT[_ca[IEQZ\]aib\E3 $/3HY_qrh^W^`^XY\Zojibd_Z]KAI[alh^iyjlnUZ=%7W^;%JcUO[kf_WJD0AZ_VPXha^_\]\UZU\^D%&:LZ`u|tQEY]\^Y`TN G!\]^]^] ^_^_^]^]^_^]_^_^_ ^_^_^_^_^_^_^]^]^]^]^]^]^_^]^]\]_^]^]^]^_^]^]^]^]^]^]\^\^_^_]^_^]^] ^b`^asc_^_^_^_^ZU\]^`e][_][STXS^o_MPY_WIWSTZVILZYLWZ[ZF'&+5UaXVZ_^?CW_^_ouqYPXL*",2TW^tj^`_\^_Z[mch`JSaXUQbnmhg}gGKkp[aWA&9XH&@dc_bui_^]\I.H\VTWgd_\XZdbZUVTN7>NY\se9Yd_[_eUOH!]^_^]^]_^] ^_^_^_^_^_^]^_^]^_^]^_^]^_^_^]_`^_^_^_^]^]^]^]\]^]^]^]_^]_^]^_^_^_]^_^]^]^]^_^]^_^_^]^_^_^]^]^_^_^]^_^]_^_^_`_al`_^_^_]^_^][Z]_^]gY]_^UX\bm_[Y^abUHM\_YRU\]QX^_^G(5<=;5@RWI=O]_^VoiqeZ]^Q8!!/>Tdtka_]\_`^Wk]iY>J]YVOcplbirP@K]}jZOdnE'D]35U]ernhb^_]Y57Wb]U]a\IXtnkbLOV[]LPXOZlNUki^\bfOF J!^]_^_^_^]^_^]_^_^_^_^_^_^_^_^_^_^_^_^_^_^]_`^_^_^_^_^_^_^]^]^]^_]^_^]\^]^_^]^_^_^]^_^_^_^]^]^_^_^]_^_^\^`a]^_^[^_b^_^iWX^fXP\^bXTX[VB>BOZ\^_`h_]_^\Q1IRLK:5/0@V^_`Vcf|r][^`[D+!$/I^qi^[WYZ[^e]^]egXMSbeUS]o_ZY\WRLW`gU>O1#3Segmf^_`]VZN4Pd`Y^_ePZdIBTUVYM`SMWk_@Bxs`]_blF79%!^_^_^_^]^_^_^_^_^_^_^_^_^_^_`^_^_^_]^_^_^_`_^_^_^_^_^_^_^]^_]_^_^_^_^_^_^_^_^_^_^_^_^_]^_^_^_^_`_^]^_]_^_^a^ _^]_d`_^_lYS]^\cdKGfida`TOY\LCQUO[akc_WT4@98OWN<6>;GQ\_\a`laX\`^_XA% 0GUe`Z]b\V]eabdbUSY[abNKN^]S\ZWTOXkQ.%D;$:Z[N@Yha\^WPWD&8RY]a^`QNYS[_`_`em]Y^`_b][\`_]J<*"3FLSZa`]NM[VA?T\`UDUlmk`[XaZOJEAOVG1);\jS`rnXKESULR87BCQE4GRLNOB741/*+CoiSbvpodb\TR%!^_^_^_` _^_`_`_` _`_`_`_`_`_`_^_`_`_`_^_`_`_`_^_`_^_^_`^_^_^_`_`_`_^_`_`_`_`_`_^_`_`_^_`_`_`_^_`_`_`_b^e[RQ^Z[_bZW\b][^`]^\_b`_`a_eb_L0/!1V`_^b`_VQPJ\a`dmha_`ad_\_`_fK4+542EX^a_ZXNMS[aQEcst_S\bO69PZYGBD>#!6GJ:30.*0;E72/98&0OXMA68;AFOSTWQOtvPLtzjcndSP  %!_^_`_`_^_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_^_`_`_^_`_`_`_`_`_^_`_`_`_`_`_`_`_`_`_`_`_^_^_`^_`_`_`_`_`_`_`_`_`_^_`_a`_gbZXWZ_aWUZb[_^iqojc_`b`aKA<7=Ue[\b`]P[PGVW]`ck^[_`]V]_`a`l]QWG0#&3JTSZn^]TSRI[STfhnfTY/$?a][VH@UA%#4PYbiPB:Y[aXTQZQD7CDU^\W]TNY_`_ljbc}~SOxkqPTF!_^_`^_^_^_`_`_`_`_`_^_`_`_`_`_`_`_`^_`_`_`_^_`_`_^_`_`_`_`_^_`^_^_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_kc_`_\^\YTXakb_guaJLX^`_^_\_`]D:OSY@7MQ\MFK_XDU[_`VY^a]S\`a`hc`a`U;'0FUag`li_QY\^iak^]_b.%6M@KV@AX^V3 !8Zga\LCIi]PKMNMZQ3@Y^V[ZU\^_`b\[_t~cNl~nY\E!_`_^_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_^_`_`_`_`_`_`_`a`_`_`_`_`_`_`_`_`_`_`_`_`_`_a`_`_`_`_`_`_`_`_`_`_`_b_ea`_`\Z^][a`kc\_qsSTa^_\X]_bd\R_RBGC4AWYRV]b_UIP\`a`a_V\_a]S]a`ab`gb_`^\[K6!.H_kj^LY\S\Thbm^hjL>IRUE9FYNLYho]P5 +;@V_`ac][_adcZRWfdT;">ZgaX]_[^ZY]\RKQD6DT^qe\_WG@:B6HW_l}`MK %!`_`_`_`_`_`a`a`_`_`_`a`ab`a`a`_a`a`a`a`_`_`a`_`a`_`_`_`_`_`_`_`_`_`_`a`_`b`a`_a`_`_`a`a`_`_a`a`a`a`a`a`a`hg_bca`]^_ic_aQ>AGSEKajXT\TS]`a`_YH:@97Vba`_aQ@V`babab\Y_baba`bluc^`_]SOL4% "/IMWk~kX_cW_ab]^_`a`USZ_ac`O*4ViaVT[^Y^]YQ[SM\^G:Jaf_`\F7=EDRFBdefVO %!`_`_`_a`a`a`a`_`_`a`a`a`a`a`a`a`_`a`a`_`a`a`_`_a`a`a`a`_`a`_a`a`a`_`_`a`_a`_`_`a`a`_`_a`a`_`_`a`_`a`a`a`a`aba`fha`a`a`][_`kc_ZGCMY_dgY^mg^Z]`ba`]_aKUp`[W\YP[V]`a]V^bc\P^cb`b_M;I\baV\_cabab]Z_ab`egkgqfjca_VQ[xjknVMIC4#.DVltuha`ab_[^[\_bajc1/Ra`[XahWTX:/@Y`a`Y?$:QSMVZileN0FhUL[I7KR %!_a`_`a`a`a`a`a`_`a`ababa`aba`ab`a`a`aba`_`a`aba`a`aba`a`a`a`a`aba`a`_`b`a`ba` a`a`a`aba`a`a`a`a`baba`a`babababababa`ab`eaZ^bababab`_a`_J21E][T]ba]JMX_a]\`ba`ababa`NE[b^_`cbabc\W_bcbabd]Z`i{kfYQ\e_OWbc]MTN217! %!ba`a`a`a`aba`a`ab abababa`abababababababa`baba`abab`aba`a`a`a`aba`a`a`ababa`ababababababa`aba`ab`a`abababababababacbcababab`abc[CIPV_abaZ^]`ababcbcbcbabcb`yt`\_bcbc\V_cb`^\^_hyi]\`ZV`bYalgY?YgGN_c]H1+*;BJ[tykgjp{|Mbvkgh_\WFU^]VPX^_ba\`S>/*(1?VHUjK,!0VS8$%!aba`aba`a`aba`ababababababababababababa`a`ababa`aba`a`bababa`a`ba`a`a`cabababababababababa`bababababababababababababcbababab`WZ^abab`TS[\_bcbcbababvp^[abcb`^abc_GL[`Zte`_`d^c^YiSeN]b`aZC-$"'/;HR`frh<7;\qYKHNRH>8P_b[V^`^RC985+0=kwJ0*TdX?DG%!`abab`a`acba`abababababababcbababababababababababababa`ababababababababababababababababababab`bababab`ababababababababcbabcbababab_`bab_ca[V[W]cbcbabcbcbcbljYZbcbcbc]FHX^bcea_LCL`W`db~fN]OP\becb[J0$+.8QN^]QA/(%+>Wj\XcZ]VP93>]b^USPY_NE;1FRH/FRM9=^VYF;:r!ababababababab`abacb`abcbcbabababababab`bababcbab`bcbabababcbabababababababababababababababababcbabababa`babcabababa babcbabcbabc bcXYac`U\Z^cbcbcbcbcdU[acbcbcbcda`_Xc`xfa^VZjaUb^O[unJZOGZbcba]SA)!#!#!(" %)#"&8amW:?LpfSB?HW^`[JRKCLY815&VnE>F/(r!`ababababab`a`ababababacbababacbabababababcbababacababababababababababababababcababababcabababababababa`babababacbabababcabcbcbcbabcbcbcbcbab]Z`c`T\]acbcbcbcbcdbcbcbcaV\bcbcbcdcda\^b\aigafsYWY^faLVhiGSWFMYbcacbcb`bZOIBO:/.-021*"!%#&*&'IrmUGHXOC>IYbVQM[\WV4)Brk@.;)"S!abababababababababababcba babababcbcbcbababcbcbabcbab`acbabababababababcbcbcbcbabcbcbabcbcbcbcbcbababcbacbcbcbababcbcbcbcbcbc^X`baWY\bcdcbcbcbcdcY^cbcdbcdcbTQY]eb[VRej]`US^`\[GX`YKSX]ca^eda`cdf}j_ba_U:4AJMAG0!*CYovfX[YUKMKRW]Y[_YZL.$=q^P<',/%!abcbabab`abababcbcbcbababcbcbabcbcba babc bacbcbabcbcbababcbcbababcbcbcbcbabcabcbcbcbabcbcbcbc bcbcbabc bcbcbcbcbcbcbcbc^S_dbX]acbcbcbcdcdbcaZ_cdcdcda`_a`a`NT^]_a`\_bc^_I5Rb`_KXhbS]_\ZRS]cbcdxmcbcZCVXTc`5)*"'4Mr|`J;HS][^`]_WVD9 KqTEHWJ.HS%!cbababcbabababcbcbcbabcbabcbabcbcbababcbcbcbcbabcbcbcbcbabcb`abcbabcbcbcbcbabcbcbcbcbababacbcbcbcbcbcbcbcbcbcbcbcbcbcdc^S_dcfedcd cdcb[adcdb`ba^]\Z`icea`bgeZKYcdc[BVbaiVUecW`cb]S_dcdcrmcdc]Z[UQ]PAZJ((?Rn|hMR][Y_Z\[YB2$\jV84@81R^%!bababababababcbcbcbabcbcbcbcdbcbcbcbababcbcbcbababcacbcbcbcbababcbabcbcbcbcbcbcbabcbabcbcbcbcbcbacbcbacbcbcbcbcbcbcdcbcbacbcbcbcdc]U_dafedcdcdcdcdcdcd`bdcdb`bcbcadjc^_cefnk\[acdc`T_cV\_Z^cdcbTP`defdcbpndcdcdbcbcTSUTQ6GM;*!&->Wpy{jdlrTQW^TGH1%ZM6-.1-R^%!bacbabababababcbcbcbcbcbcbcbabcbcbcbcbcbcbcbcbcbcbcbc bcb`bcbabcbcbcbcbcbcbcbcbcbcbcdcbcbcbcbcbacbcbcbcdbcbcbcdb cb c]S_dcdcdedcdcdcdedcdcdcdc`b`a`dgj`Z^cgpte`Y`cdcbcd`S[_Z`bc]T_cbcnpdcdcdil]^g>5PXK@*#)7SR[ivUNSABU8#]_1 /0+,OZ%!cbcbcbcbabcbcbcbcbcdcbcbcbacbcbcdcbcbcbcdcbcbcbcdbcdcbcbacbcbcbcbcbcbcbcbcbcbcbcdbcdcbcedbcdbcbcbcdbcbcbcdcacdcbcbcdcdbcdcdacdcde\U`dgdcedcdcdcdcdcdcedeYBFAKMY^iXY^dhlodcb_bcdedcW^aV\bcac`aca`cdioecdcdcfemdYwV6TfS[kjXhiUSNTkyhXVT3(puD%(0+./%!cbabcbacbabcbcbcbcb cbcbcbcbcbcbcbcbcbcbcbcbcdcbcdbcbcbcbcdbcbcbcbcbcbcdcbcbcbcbcd cdcdcbcdcbcbcbcdcbcdcbcdcdcdcdcbcdcdcdcdcdcdcd^X`dcacdcdedcdcdcdceX0.2JGDQ`[^`aZQ^cedb`cd`bcdbS[bYU_`]ac]\bdgld`cdcbflemjauqD,4bxhZJ?KPWVCMdtr_X3/rvg<&$,=40%!cbcbcbcbcbcbcbcdcdbcdcdbcbcbcb cbcdcdcdcdcbcdcbcbcbcbcdcdbcbcbcdcdcbcbcdbcdbcbcdcdcdcdbcdcbcbcdcdcdcdcedcdcbcdcdcdcdea]cda\adcdedededcdcdedcdedcdedXD/E^Y:?UacgT=8L_cadacdZYadcaVX^\^c^_cacdcdg`\adcbdiqvq^wsE=-7K=U]aJ5)*.=W_Z_m|C/ixjL1!)FM%!bcbcbcbcbcbcbcbcbcdcdcbcdbcdcdbcbcdcbcdcdcdcbcdbcbcdcdcdcdcbcbcdcbcdcdcbcdcdcdcbcdcdcdcdcdcdcdcdcdcdc dcdcdcdbcf[Q_edc dededededcededbfcU\LDED?LSXVZQOerlgcec][adZacdaZ^`acdeX\d_UMTV`dadWLdhniy~g_cg^_[gcTZn\HLQ91<28MVlHAB\YQ`fUOQB!8}m`lePKTV%!dcdedcdcdedefedcdededededededededededededededcdededededededededcdedededededededfedefededefedefededededefedededededfedefefedefefefefefefefefefgfgfedfefgefef_Zegfedomf`Zpdz[\m`TLWRebYfc`nl[zh>Vlc_UerXRZaVY?F@+@hE%McaeXKLNJ!ededededefefedefedefefgfdegfefededefefdefedfefefedefedededefedefdedfedededfefefededcfefefdfefefefefefefdefedefedefedefefefgefefefgfefefefefgefdgfgfgfgfgfgfgfgeghgfgfgakmihece[^bgfab^_fgh\iha]`^LDNDFQZlwrn^cl]^bxnhgfgbZ[cWXGXZN9+!&.)5@?/7PNLpe,.XeaM:=? E!ded efefefefdefefefefedededfef efdedefedefedfefefefefededfefefedefefefedfedf efefedefdfgfedefedefefefefefg fgfgfgfgedfgfgfgfgfgfgfgfghfgfgf[NKG\bafaU\_cabfYU]^bXczmogmvmVLIH]o}pWTAQcRVbzqgdbcXK;I^M3/;ANIE>7I>*_orf]\ E!fefefefefefgfefefefefefegfefefefefegfefefgfefedfefgfefgfefegefefefefefefgfefefgfefefefegfefefefefefefefgefgfefgfgfgfefgfgfgfgfefgf gfgfghghgfgfghgl_PEKPO[e`\c]kn][_ckWORel]dju?0<69NdbY]umHQXYbnqdTY`a`ubXaQVR[bfPN^WNLNXhgdR')V{bHC E!fe fefefefgfefefefegfefefefg fgfefgfefefefefefefefefgfefgfgfefefefgefefgfgfefgefefefgfefefgfgfgfgfgfgfgfgfgfgfgfgfghgfegmlkhgfgf ghghghghghgh ghgjbQ[egUJ[d[`_ph`_afncifechkeZr{c\_kibf}Y?JV`rfTXadfzsckNSdf[T^cfeaLP_S[_NUej5%8ZWNM E!egfefefg fgfefgfgfefefegefefefgfefgfefgfgfgefgfgfefefgfegfefgefgefgfgfgfgefgfefefgfgfgfgfefgfgfgfgfgfgfgfgfggeihfgfghfgfgfgfgfghghghghghghghghghgfg\Xgej_TegX_]_j_gedfldfXadcbi`w|j[XalfV^lcCZ`ZmigewudrZVcdabdgflX=RZX^MIWf6#5[a`  %!fefgfefegfefefefefefgfgfghgefefefgfgefe fgfgfgfgfgfgfgfgfgfgfgfgfgfgfefgfgfefgfgfgfgfefgfgfgfgfgfgfgfgfgfgfgfgfghfgfgfgfghghfgfju]Tbghgfgfghgfghghghghghghgeg^]_Yi]RNWgf^]^Vb`\_aete^SJZhgrqnji]Xxn^quW:N^`baeghe_svpvlbfgfaefemhDJ[K?;EUa}E(,_o  %!efefgfefgfegfefefefghfgfgfgfgfgfgfgfgefgfg fgfgfgfefgfgfgfgfgfegfgfgfgfgfgfgfgfgfgfefgfgfghfgfgfgfgfgfefgfgfgefgfgfgfghgfghghgfghgfgecdifghgfghgfghghihihghghghihghghgfgdfgcZ\QZ_J@RW_iZXU_YO^fhzj]O:BRiqrja`jrrXWf}{gXM]cbJLZab`ovwzt^O^gfdcdZbcSTZ:5?QVQmW,'Ta`  %!edefegfefgfefghgfgfegfgfgfgfgfefgefghfgfgfgfgfgfghgfgfgfgfgfgfgfgfgfgfgfgfgf gfgfgfgfgfgfgfgfgfghgfgfghfgfghghgfghghghghghgevokeQblighfghghghghihihghejhfbcfgdhgd`SQNPapYU^V]j`^eidPZfsvkaV>G[`dhfibdakf[QILdh^U\ofcW[_]hemsyvaXCSdfgmeHG\maX13FG_`em8'Gdj %!egfefegfefgfgfgfgfghgfgfgfgfgfgfgfghfgfgfgfefgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfghgfgfgfgfghfghfgfghgfghgfghfghghghghghghfghge}nVJMcjb`ehgihghgihgihghihihgihaOMVkj_dkc_hgbd^ROTW^l[TVOP\Y^icgkRUfvsj`PT]gecnsb_\^b]R;P_fmuiWV`cgfs|{hT_b`bapnTRibWB$)/,9FQqi[RAV\g^[^]cgifrkhjica`amaAV[`^[KFA@SR]fbYN^]>IEjl5'7=  %!gfegfgfghghgfghgfghfghfghghfghghgfgfghfghfghghghghghghghghghghgfghghghgfghghghghghghghihihghghghihghghihfegbroub[bkbU[_cgREXghghihihihihihihig[^`eztcgkfU^fk`ERc^]b_ba[kvUFTebWqwphyweSWcja^R[o`Q]GA_eaYVW]fkzjmidacaSX@IK\`_IBIFKV[ZSVRacH5'[jQbjlrwpjhihijihijihjhijih^cfUanacjeQ]fougcXhmnfhn]RVUJXLJWOX^ZW]`eYUb^h]VSRMNks]EBXiU@R_{rjc_`^deHWegdc^cm^]afhih]L<=KWaj}j;Xzr!gfghfghghghighghghghgfghghghghghghghghghghgihghghghghghghihihihihghghghihgihihihghghihghgihihihihghgihihihihihihihiebfikWbYNVma`_I8;D6Pbgj`ilkihijhihjijihd\cialeZ^dgaXfhfaB4Se`qwqBLUjbCI[\XJVbgjZ]eafnjfa`YQ\tmK9IebTGSl{j_hkO_vRM\ahiY_l`_chihlpIO`W[ahrl:g M!ghghghghghghghghfghghghghghghghghghghghghghghghihihghghihihihihihihghghihghihihihihihihihihgihihgihgihijhihihihikihfeiblea\OFVLOZS:EVK_kKJKZ^\R]ijhjihijh_bihofNJ]bcf^V]_armTPfckjxePUTcJH@?QKPWU\XYS_`aZorp`YVNfzp`fe`V[bq~tcnygrzNRc^agZU]cehgjqe\de]_hn^8u%!ghghghghghghg hghghghghg hihg hihghghihghihihgihihihihihghij hihghihghihihihihihihghihihghihihjihihgijijihihihihihihikifjnjfb]SESeODMC0@XMb_eUJK`mgPB;Xehkijijieghih^ahikgaXOYegUXcboskhbTWcvpZTSRAHA0:JIQ]SEFINYPYVYgebaZ^uyib`[\h}flsgjbQYg]gjcQUfecgaqwYdh`dcfpaQ%!ghghghihghghghihghgihihihghihihghghghihghghg hihihihghghihghihihihihihihihihihihihihihihgihihihihijijhgihihikihjhijihihihihgihihje`ljS7>JFAIACRHKZd_fh\l}\>GTagc_cgijijihehkjkgb_ah[`ghbdgUOafhfa]PJX_Z_c\auy_UFR`I43@YfdedUgrjmEPd[Y_fgh{pc`gh_Tdt{m]SJS\^_hfVecgUahXcikhbjb%!hghghihghghgihghihihihgihghihgihghihghghihghghghijihihihghghihihihihihijihihihihihihihihihihihihihjihijihihijijhjihihihjijkihjijihijihjihihihgc`_]chR,8QTWR;7QX>/HeighaKIMHYijkjhgjhkdfjipoha\[d^bhge^a`VPbdafko]PYbcfa_oyib`XIFSZ^VDgji^WZHLXbhjkjkjkhdhigahkjhuvhfg^_X`ea]ae^P^cdlba[]e]^`cd`lxlea_a]\cjhbQ.Kcf^gnjBPdrqi_[RL6[cZfjK>^l_l %!ghghihihihijihihihghihgihghihihihghihghihihihihihihihihijijijihijihihihjihjijijhijijijihijihijihgijhijkihjikjihijkjijijkjhijkjhijihaZ^XajL_`efdR]R;DE`idghgRE\ihikjikjh`fnledikjhz|ighjbY[ZX`W[ghZcbvyefe^ed]ikfdl{k`a`ca\VNWVH4*?b`[cdSMeivk\dicX]qA10`R849\ebcmljhjiL8UdbigCD_kX\  %!hihihihihihihijhihihihihihihihihihihihihihijhjihihijijijijijijihijihijijijihijijijijijhijijijihjhikjijijkjkjijijkjikof^YocSVbgOJbjRQdbe][jdfgb]Q^_^`hikijigenpjhjhkehljVMank_P]dcfknjihj_bf\aklfj}nc]^TVXD9?IU=M]d[NM\WNF57hohj_ikjkjepkbfigd^`^\ E!hihihijhijijhihijihijijihijihihijijijijihijkjijkjijijihijijijijijkjkjijijijikijkjijikjijijijijijijijijijikjijikjijijijijijijkjijijifZ[VZW`QWeged^ZTM[`cMJF\obVZfh[Ofg`ejkijnoe`djcZ]eg{qgje_Y_`]XR[RO]jhfa_`]dSUeb`ahkehYbcLMZY\V\kKAFTcCET\hqxwm{zbV`[E@FWada`VWXHCcuihkagjklkjndKUghbefb\sk E!ihihihijihijijijijijihjihijkjihjkjijijijijijijikjkjijijijkjikijijkikjijkjijkjkijkjijijkijkijijkjkjijijkjijijkjkjijhe^QOXQOQBA]jgb[GCEGROCDdbn[_fnpg[Raedmoigjhlje_^h|pbaifhk]JS[^`ObmtrXY_die]N]cghgmjWQcb\hb_`dXLZeYW\XRa_bdor %!ijkjijijijijijijkjkjkjijijijkjijijkjkikjkjkjikjkjkjkjkjkjijijkjkjkjkjkjkjkjkjkjijkijkjkjkjkjikjkjikjkjijkjkjkjkjkji^dX\fkegr{eYXO[iu{aWV:NqlLXikaX{jULWd]XQTh_FEGpnk_ajikjk\XT_hkiqpliqbZ\B*GfZV^MDRkvaV^hkgYI5Gal_bvqfY\_emSObgbf\`biecikjhikfehbilhkeahzlhkhjkmlkiknmgla;BQaXYX^hz  %!ikjijijijkjijkjijkjkjijikjijkjkjkjijkjkjikjkjkjkjkijkjkjijkikjkjijkjkjkjkijikjkjkjklkjkjklkjkjkjijkjkj kjklklkli^jcafW^ur\QDAOidVYb<7_iOcklkoykd\PZU`a`eSJOkqji_ahgjig[dovcdejcYmfZcbQF^aX}~xzsA:WESpel\CYgzvjkjkljkg^W^ilklmlijhsklkjkj`P]Wdq^IJKadjkI!jikjikjkjkjikjkjkjkjkjkjkjkjkjkjkjkjkjkjkljkijkjkjkjkljkjkjkjkjklklkjkjkmkjkjkjkjkjkjkjkjkl kikjklkjkjkjklkjklklkjklklklkmlklirkc]kmfPNdhgkxn_feCJ_JF8*%B^iljc^c[_f\XNTOZaxs`jocbf`de^cWLPgilqdNYcV^acaQWIM`a_HZjhUWf~eB7Iakro^OFCBFYG@NOL{shkjklkbfkfN\jlmlkrlkljklhkdSF@]jVLP[^hlfcbr!jijkjkjkjkjkj klkjkjkjkjkjkjkjkljklkjkjkljklmlkjkjkljklklkjkjklkjklkjkljkjklklklkjkjkjklkljklmlmlklklmnmlkcVMea^j`VQK]jlknlklhXa^L_`KM@WnkrbaX^jZKXVOY^uqfwu`ageWQISck]il`irhPeigeahldYKV^XfOakiR^]5@`lin^Wgi>+.EX\xudSOrpyjc]hgK[jkmlhjoolmlklklcB8/VfVLK\RdkbQKr!jkjkjkjkjkjkj kjkjkjkjkjkjkj kjkjklkjklklklklkiklklklklklklklklklklklklmlkmlklklkjklkljklklmlkmlmlklmlmnmlmlbY\h[FIXaeiklkaekjhmf^a\]hWDTbks`TlmercjfQIZrpcos^imk]MdlfcZVdndY^gfagjkli^San^Z\mplaJUR6XgjknkLWkUDKhqnlnjf]UhtLXmid_dT`komkmihnklmlnlkl^UTac=4P_ihZHD) %!kjkjkjkjklklklkjkjkjkjkjkjklkjklkjkjklklklklklklklklkmlklklklklklmlklklklkjkmlklmlklmlig^VTekbfkli_ckmloncZbjljZEZwyvI?7IX?PU>]kmlmf`T[baQZa`bcjmlfUTW^e^\age\]hmoe_jb[dmnaTS\XT`b]`ijP=CM>Mf|zqTC4;]kiY]kncejYvsmklmnlslkmlmnmnmlmnokf=/-A^dc E!klklkjkjkjkmlklklkmlklklklklklklmlklkmlklmlklmnmlmlmlmlmlnlmnlmlmlmlmlmlmlmlmlmlnlmlmlmlmlmlmlmnlmlmlklmnlmlmlmnlmlmlmlmlmlmnlnZ_riUgmnmlmkeV\hb\W]_`cVXZYgeidH>6RN;:PT=;gzspmlkmia_}{nolkqq]jlmlmnmlmnmhklQ2?`lc`E!klklk lklkl mlklklmlmomlmlmlmlmlmlmlmlmnmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmnmlmnmlmlmlmlmlmlmlmlnmlmnmlmlmnmnmlgjkeifdjmnmliqnjgechnj^FSL[KakgdlpjempopcWle`ifjoeMStempopopjkoporjblo_cmpopopokS43Ukpmh^`|tg_UGYtt?5[_BcyfM;AC^uefRJT!nmonmnononononononmonmnonononopononopononononopopononononopopoponon onononopononononopnonononononopononopomoniXcU]lopoponikjhd>9WG@Zr[bnolpopnopjimpjhinopjQaykmpopopmi_ahmopopi_dnpdelmpqpqpqpoqX4XmiWcyC+# 7D\K0(:;,6Vn|eWRnj>&"I!mnmnonononoponononmononononmonop oponopnonoponoponononopnonopopnonopopopopopononopnonopnon oponopopononopopopoUKfpqpnoleihmpXV?8=BKcbfopopqpopokinponjoqpnkg_nropqpqdZdhdfcihoqgfnopqpvtXI-4@OWTVUalcF(#)%$!#$%$'Ldnsutquvud_ G!nmnmnononononoponononononononopopononopopoponopopopop opoponopopnonopopopnonopopopopopopopopopopopm`kopomiloeTWfk~x\`U=\VXdcedjpqpqpopjiopkopogjYZkmkoqpqpqpmiaYiopqmnpqrpqI10#)/<@92&$0:/ !&'1640/(&'8SYZcWPYDN]`l^k}wG!onononononon onopoponoponop opopnopopononopoponopopnopopopopoponoponononopopopopopopopopopopopopopopopopopopopopopnoponogjbYTckl`_iKOifPJ[dgmoqpqpkjopsmopjc]Rjjiopoqpqpqrd\jqpopqpstpfsjPD.'&().)$  &09EQ]fgkmljfZ^RVrs^be\WSbemsWF!nmonononopnoponopopononopopopopopopopopoprvtqnopopoponopopnoqpopopopomopopoponopopopoqpopopopopopopopopopo popqpqpopqpoqpqpopoqplolilkXDR[Ren[`_YD_nuZ4Wmoqpopqpqpqkhnqprtsqpodbinrkclpqpqrqprpfblrpqpqp|W6+(9IX]`_RMEYinV[mqpqlnopqpqpqpm]_b[]b]RQSPEO_qrw %!onopopoponopopopopopopopopopopopopopy~{xqopopopqpoqpopopqpopoplnopopqpopqpoqpopoqpoqpopopqpqpopopopqpqpqpqpqpoprqrprpqpmjopodW^k\NchYTc`\Tbi[W]Vkpqpqrnfmcgoqpqh]bqn]alsYbysqpqrpqrqrqveL`nqofmX;,(:LQSXZb]MN[d}opspqpqpqpryrpsvumQ;+.8Q %!oponopopopopopopopnopopopopopopopopqpqpopo~|yuqpopopopqopqpqpqpqpopqpmopqpopqpopoqpqpoqpqpqpoqpqpqpqpopqpqpqpqpqpqpopqpqpqpqrpoqkiopjgXZ\XoUVgkjeQVjcZdWeoqrqrpqpoiRZdfmzsrdbmp]Xjo[RtyflopqrqrqrsqrshVjrlN@>-$2O\[]Y]igcYX[G=u{~wrqpqprqrpszhlUBACQ| %!popopopopopopqpopqpopopopopqpoqpqpop|wsqpqpopopqpopqpqpqpnopqpopqpopqpqpqpqpqrqpqpqpqpopqrqpqrpqrqpqpqrqpqrpqrpqpihoqpibX_]^cLepYR]gopVYkrqrqv_HZmgETkqpqrogdnrX@>FGTypz~xrqprqoswrjYZI."+Mojfknl[RH_`_\abJPborqrqpryqroityvbezw[qv^Rd %!opopqpopqpopo pqpopopopopopopz~wrpqpqpopopqpqpqpqpqpqopqpqpqprqpqpqpqpqpqrprpqpqpqprqpqrqponoqpqrqrpqpqpqrqrqprporpqpqrpqrqprqpdZ^ipoeO`hmQcpvhSWVhqs^M`pqrqrpmbekUOYmqsrp_bc]dR?9Jb|qoprqptnZaE?*!)DcrtprmaVPZbNFSV3E]utqpsx{z}vnbdht{iE58?CL^xd]Xrz %!opopqpqpoqpopqpqpopqpopqpqpqpqprspqpqprqpqpqpqpqrpqpqpqpqpqpopqpqpqpqpqpqpqrqpqpqrqprqrqpqrqrqpqpqpopnopqpqrqpqrqprqprqrqpqrqrqrqsphb_\Z[^knopVdphijKBL`pd\cprpqpqrpme_[`lqpoprqsrsqplNB_qsofQLvpjnl^onz{NBZK?.+1=QcorqprsqmlhYZUV@=9YxQ4,1Xpqpv|vY@AG^dc`YaSB;>?QT_mg[GD]mXgo %!opopopopqpq popqpopqpqpqpqpqpqpqpqpqpqpqpqprqrqpqpqpqsrqpqrpqpqpqpqrqpqrqrqpqpqpqpqrqrqpopnopoprqrqrqrqpqrqrqrqrqpqrqrqrqprpqrnlnl_Zhnoqo[]P]nqs^@:XogabosqrpmqrpnoaZjprsjkqrqsrqrsnYG[psrk]<)3KMBOcj1%,4DUajprqrurnopnX\XLFKI50?C2+>OgoprpTH\[Usu\agut_\XHFft^E?BGVp`W %!popopqpqpopqpqpqpopqpqrqpo pqpqpqpqpqpqpqrqpqrqrqpqpqrqpqrqsrqpopopqrqpqpqrqrqrqrprqrqprqpqrqpopopoqprqrqsrqrqrqsrqpqrqrqrqrqrqrolpdmkiorpW^lqpnWEcrhdanrqrqrqnmqprd]ZksqgZirsrsrslWShstsp`G4'%$*8?/(?`lqsrqsrqp~|spdSdaPAE90/,-)>P;MrspmnlgalwqYeqUDbaSD415>Ube %!nopqpqpqpqpqpqrqpqpqpqpqpqpqrprqpqrpqrqpqrqrqpqrqpqrqpqprqrpqrqrqpqpqpgc_hqrpqrqprqpqrqrqrqpqrqrsrqrpqrpopqpopqprqrqrqrqr qrqrqrqrprsrpln]jrd]gztfmsrqoakninslhgoqsrslgmpnkm^Rb[UejmrsrstsrspcbdajprmeXE-&!2XmqsrsrqrvznX^lmY=0-=.-/Q:+Yjcejsylk{eQh{U9KV\V<;BYug` %!opqpqrqpqpqrqpqpqpqpqrpqrqrqpqpqpqpqrqpqrqrqpqrqrpqrqrqpqrqrqrqrqrqpqrqrqrsplbZhqrqrqrqrqrqrsrqrqrqrqrqrqrqrqpqpqpqpqpqrqrqrqsqrsrqrqrsrqrp_^nqrqnsgXisgRZjmprsrn\jplqrpoqsrskdlqni^YTmehqsrsrsrsrsrpkj\lsrsrsqC!$Vprsrsrsrqrq|uia`f[D5/.:c]B:@?2-j^oecvwvi]\tj\IMQ9/9UTKtj_r!qpqpqrqpqrqrqrqrqrqrqrqprqrqrqrqrsrqrsrsrqrqrqrqrsqrqrqsrsrsqrqrn_\lrqsqprsqrqsqrsrqsrsrsrsqrsqrqpqpqprstqrsqsrqrsrpqpfemsniqtsrqplnlYcnlehiprv{wrih_krtsrsqjplfprpqpsqjnshLZcHLIOJakjkrtsrstststspmelmoJ0*Jkrslmrtsrsuyuqsp]D,)CG97HK<9GjR(*JiywsxqX=LeTA/)Oz?304I460Ptl%!qpqrpqrqrqrqrq rqrq rqrqrqrqrqrq rqrqrsrsrqrqrqrqrqrsqrqpdcmsqrsrsrsrsrsrsqsrsrsrsrsrqrqrqpqsrsrsrsrsprmvlgptnhqsjflfTdndejpaViphamsrsrstpojhqsnmimrlkmiQKajhcfcmstrsrsrstnl[Xfp|^0#Motstopstpg_JDUmqfG6-3G;6>G?506[^=cidZhcH;BIBFQ8')?zN54'@N0,&<=> %!qrqrqrqrqrqrsrqsrsrqrqrqrqrsrqrqrqrqrq rsrqrsrqrsrsqsqrsrsrsqsrsrslkpsrqrsrsrsrstrqrstsrqrsrsrsrqrqprsrsrstsrsropjemxhfnsniqstmbdfW\ljfgniUCNcdpqwutstrstuqjlrstqeimsqfj]FJ^cjpstdnstststststrswhfbrWDHisutrststpSMO\lqsmD404@:87;51,1^laytylVL:VS8BI7-#)7Qi6-(3,-A@8-02 %!rqrsrqrqrqrqrqrsrqrsrsrsrsrqrqrqrqrqrsqrsrqrsrsrsrsrqrqrsrsqrsrsrsrsrsrsrsqrsrqspaVgrsrsrsrsrsrstrsrsrsrstsrsrqrqrqrqsrsrmopnl`nvpcjorprtsqmibha\eje]bdoqkd_Ukrtststststspuzyfrp]U]fhloa[`TV[T_ob`hP_qutstsutstqpspo|[DKisprstutsrsutrstmI53RP=6463.2IjnawhjvXg]:5485-5?]aT;)$&*38,1HN %!qrqrsrqrqrqrsrsrsrsrsrqrsrqrsrsrqrqsrsqrsrsrsrstsqstrsqsrsrsrstrj\R`orsrstsrststrsrsrsrsrsrstsrststrsrqrqsrststsrsqjosgmusdipnqtspipchmX]geWb\gswdfYeomqststqsnpxsa_lgXPipidih^SLO_phcjorcSkststsuvridcdo|]9QnutututstststsusrW7HeaA5.Prtsp[\PfraZ<13CXUH[YOXC-.*({b-&+/JR E!rsrsrsrsrqrsrsrsrqsrstsrsrsrsrsrsrsrstrststsrsrstsrsqrstsrsrsrststrstsrstrnc]fosrsrsrststsutststststststsutstststststsknrsridqspnrqdglq[E:[gqsxoh[\o}useanrsutpjkeytrstutxlYgP^kobPU[kiputunhqutuvuvutwsYMGXnvutvuvutututstvututvutsuvuqjkE9Pfrtj<(:YloWuycSjtsbLMR\ICRC3-SC#$*9`k E!qrstrsrsrsrsrstststsrsrstsrstrstrsrsrsrsrstsrststststststutststststsrstslco ststststststststststststutrstsrststststrststnsrsvqstkopdhbgq`_SVanpskcjqa]qwtuhibirtsutrmjfouorusumSgbLeliknlinfouvuqhnsvtuvuvt|T>VntuvtututuvuvuvuvwvtuvuqflXiXhrtvT-,K]qsxztnrtpswiG9UcB5-0-,+#508Zd E!qrsrststsrqsrsrsrststststsrststststrstsutstststststsrsndostrststststutstutststststststsutststvtlotqoqvrqsrcgjblhio_dn[Tlqmhgfd_aqtrulfjcosutsjc`hxqrstrscYZK^mxuzphlibouvtjlrutuvutaHbuvutututvutvuvutuvtuwvuqethpuf<)M_crqu|vtiUgoZM;7WfXN1*.1/+(/0/]mgukKQlwoidcJ@VWjYC/4*)+F^b %!srstsr stsrsututstututstutstsutstststsvtsutstststutututstututututututuvtsdoststututstututututvututvututstuvutututvuvtuvuvuvyrcmsvxrolMQfsnlqjacbdyyjlp]VespnvwtmecblncPVi`SlopohoZUQRM]i^FMki[htwvwvwqRasvuv~VAeuvwvuvwvuvuvuvuwvuvuvwvwuvwuvwuwpqwqWC^bB=QJGHR`^TWX`juzWFCZlb<93(Jr{%!rsrstutststststututututututuvtststsutstutstutututvututuvutuvtututsutututuvtlqtututstututuvuvutvuvuvutuvutuv uvuvuvutuwtseltutvx`]P[olesq`^enzvygah_RZnjbhgnrhacdhgXiqa[dnokpka[j[DW^hid`kVIdtwvwvwu_etvtuzqFbxzxwuvwuvwvuvwvuvwvuwuvwxvwvwvuvwlb`fdpR06(;bcfd_[RgxWC7KzQD\UF[cI!rststsutrststsrstutuvtututstutststsutvtututututuvutututuvuvtutuvutuvutlqtutuvuvuvuvuvuvuvtuvutvuvuvuvutuvuvuvuvurthmursqcj`EcqrlVdov}tjldZNRiqahonrqkdYc[`fdwrh^lmojfjfnl`l}gfdloePHTftvuqy|ruqxzmhaUMdw~vk^apwvuwvuvuwvuwvwvuvuvuwvuvwxwuvuhWdnuzhE3/023GReu{QbqUC3@PbkHPyXVZL!stststutsutututststutututututututsutstutuvutsutvutvtutvututuvutuvtuvutvuvutiouvuvutuvuvutuvuvuvuvuvuvuvuvuvtuvtuvutuvuvtsvflursnhn^enq`\hosxro[76L]lpinpruplrVRWiopv|udtupi`d^jolpjWVa\hghV^twxt}|~tvb?RemqjsqjbpwuvwvwvwvuwvuwxvwvwvwvwxvuwvwsvwvtpN953851=BelWHSpMA=-7TnxuULbG<r!tststutututsutuvuvututututututuvuvutvutuvutuvuvuvtuvuvuvuvuvueluvuvuvu vuvuvwvknuvuvwuvutwvuvwvuwvuvwvwvwvsuglutqsqedswoguyg`hidmvtve74KTkxtgmuquzr`emvsqlqnleVfltsdcd]czevuLVca`ljQTbVMHGXjrutsmkbY]pvw{xwvwvwuvwvuwxvuwuwvwxwvwvwvxwrj[@6BXG608:ZmcdUfgJ=3'?NQXdI4FX[9%!ututsututuvtutututututuv uvutututsutsutuvuwutuvuvuvuvuvuvuvuvuvuvuvutvusbetvuvuvuvuvuvuvuvuvuvwvutra^p vwvuvw vwuvwvwuvwtjpvuosqftwUarVO>@SehbcjfKUSforlekiy{i{qUYXfi]mprpocdywmps[}hVMhjk~lR@B_ibDE_qvpodV\li[TMW[\_p}zxwvwxwxwvwvwxwvwvwxwvwxwvwvwvwuqX=7WmL82324[pU<7@KF1,($6HZA@AGI9%!tutututuvutututuvuvuvuvuvutututuvuvuvuvuvutvuvuvuvutvuwvuvuvuvuvwvuvuvuwujXEXrwu vwvuvuvtvuvwtsdO]qvuwvwuvwvuvwvwvwvwvtkrutnqrz{jPZ^KI^d`TQ]_Wcf_]_alb_gnuvtiXRk~bZjspsposodclqpm^FgvhLJ]eaZW\d^RomePQgsvzlOQcur]?Lmw]<232?fZG:754.4,:K2*T|xK=) %!tsuvuvtuvututuvuvutuvuvuvututuvuvuvuvutvuvuvuvuvuvuvuvuvuvuvuvwvuvwsYA$-cvuwvuvuwuvuvwvpovwvwvomroswvuwuvwuvwvuwvuvwvwtmruqpvutwjzLJ`aikwijtlech[XfhbeZh{khGnn^hlZapkoqxupqtn\LTS]ZeRHNWhuwxufW\cgpzxpZXntqkh_S=GivxtwvwxyxwvwxwuvwxwxwxwxwxwxcQjuhNE:41PsWA9460.,451#C\`[Z) %!uvuvuvtuvuvtuvuvuvuvuvuvuvuvuvuvuvuvuvwuvuvw vwvwvtJ '^uvuvuvuvuwvwuvwvqmhouvuwktrXBUqwuvtvuwvwvwvwvwvwsltu]W^lwuorviDaW_l[ZerhoeagbcXcYRbheacy~g>Fdhdkytg[js~tpce`YM=Eb`cgdpmqvtl]Ub|ptnepnhrlMGM@21,Oqxwxwzxtmfemvwxwyxyxvwyxwxwyxwxwgmxg[vhC@Uo^J>728AD+%*=&-?[np# %!uvuwvuvuvuvuvuvuvuvuvuvuwvuvuvuvuwuvuvuvuvuvwvwvuvwvwvwvwvwvwvwvwvwvuvwhK0PnvwvuwuvwvwvwvqeblrsoptwvwpdlfH9SqxwprsvwvrlrvwuwxuvwvwvwsmpsaFNgoW?WyqODIbk`jpskhaW\hWZjco}se`O@4:lmfuydbqfKWaHZNVkigfgvlblokg^TeQTgfrpo]O=203A1(4erpswxwxuoqf]baTduxwxyxwxwyxyxyxstkpnpefhRFH:0SmT81C@403\vxwx$ %!utuwvuvtuvwvuvuvuvwvuvuwvuvuvuvuvuvuvwvuvwvwvuvwvwvwvwvuwvwvwvqxdetwvwvuvuwvwvwvigpmblsvturk^dK?[pwtpotwvqgmsuqnsvoqvwxwvwtpsqmhknqpQTc|k=EglcnvqjnmifaMTcdhmqatgef^_\RFVnpr}djkUjOPZUCKb^kc_\ifstsmenv{fN=>XfmdNFQN6+0SG15LKH\rwxripdpk`mxyxyxyxyxyxyxyxyxw}ldclt^jiX>GT[grheX\leanwitxwiH8?Wa`KQhcB,0M<39\nvwxw}nmtxqsxyxyxyxyxyxyxyxu|\kw{shjb\>:/Vi`]B/)/-):hxy{&D!tvwvuvuvuvuwvuvwuwvuwvwvwvwvuvwvwvwuw vwvwvwvuwuvwxwvwvuvwvwvwuwvwuztwvwvuvwvwxwvwrptl_ZelinwqQPeqmjb_nrprdGAOamacoh\dpwsf`ipjrwvwtswvtvrmosvpakj{tiDS[boqrotnlroU7*3/# %!vuvuvwvwvwvwvwvwxwvwxvwxwxwvwvwvwvwvwvwvwvwvwxwxwvwvwxwvwxvwxwxwxwvwvwuksxwxwxwxwvwenw|p_aemop\QBOksqimndaqijnfmlcY]lnquncVenjbfoqmkqurpvwyuwkmvwvt{rDLeclrj_knpdSk`Om\DTLR[fesfcUDWi`^O<8B7JussZTXraemov{|x}xwnmim]fnk\ZK?gbF@87+IeqvueHA803EFA=<>`|yxvxyxvwxyujsxyzyxytlnXYG=2BhI818]B3mZfM@dotwxcMTjo) %!vwvwvwvwvwvwxwvwxvwxwvwvwvwxvwvwvwvwvwxwvwxvwxwxwxwvwxvwxwxwxwxvwxwsydYpxwxwxwxyxwxwxt_kvtjlqjbce`Oe}|mneTIbdhRnmd_Vfl`_YRkjqml`mstjgmrvrtuwnlut~c?\ncmf\gihb`p|~jE[WVQW\dehf^a`FSedNYR]iVXumk]\ychtozypckvl`\_M[`nhesiaWUHCE\szyxiT[RIapnh]QINmzxzyxutvxysmvytswyzxyxtjVg]N?:DbTQPM8X^ckgmUCJoftxuw~xu) %!vwvwxwxvwvwxwxwxwxwxwvwvwxwxuwxvwxwxwvwxwxwxwxwxwxvwxwxwxwxwxvwxqyYkwxwxvwxwxwscnw}ulrznJQhjbTgtsui\[lsnjSXieZumYbpg`tuIPbmolgsqtvrakmbcfqytmrwxwtnwOFeigmrvlf[d}rhd>R`kfZXdxmMK[na\d_LekSLC=@OVKcuowdmvgqnwgosvyxpjiV?KaQi~znmfdkusiszxtajrhZ_s{zyvtstwxyxnrsxzyzxinvwhpzyzvfTFZomcYfGQmqlahP?>Zw]_VpnSmutv9%!vwvwxwxwxwxwxwxwxwxwxwxwxwxwxvwxwxwxwxwxwxwxuwxwxwvwxvwxwxwxyxwr~afvwxwxw{yxwto`lv{v_gglY[`MSd^fshZU]PGARcI5YnhqftgVX^eaipvnpuzqdfekrmrtmntwxypgstI\lyusqz~\2>KLeusnquu<@amoF0>_cZbk\GRT:6[ytrudowtpmpwvqadkfUhiOVgvjmtnhpvthsxrxzytgbjuyxyzxzxleqxuglsyzxplszwfmvyxyxvheoydUVHejYwpVQYhncsdqx\egmu9%!wvwx wxwxwxwxwxwxwxwxwxwxwxwxwxyxyxwxwxwxyxyxy xyxwxwxqwe]sxy xupmUeswzpinqsenv{xm[SPKT_afnjloi`J7LeUF_ldvjcjnc]bfdbiopeihs~q]jsv{v_]kpomcntkqnFeyxoqp_uuiJ?GE6Nv{iab`g\YLYUAMVcmdfnfjb@8JYnznzyzjWLdhmgsoJe_O_`\mvtkblnfqxvwsvrimckvyzusvxocovl^eryzurolbqyumtutwyljokFPKOT^i|hQ[`_[sxw{cShmYkr!vwxwxwxwxwxwxwyxwyxyzxyxwxwxwxwxwxwyxwyxyxwxyxwxyxyxyxyxyxyxwxvwkPpxwxyxqrmP;csvlmtqpsuqpy~_R]cKXjrdTUclfLGVWFLVPfihb^fnclpeka\b`nxpfirvw~mfaYUQ]cedbCDkpoiF=BMQ\jpZeurpsd_rkacUazjZ_Wblxpj`]i{muoQfncj~vqrXO]fo|zly|yidZNWKCTK`wueNVjtwyupnbqf`_nwuqukihstvwnhVgmprstqtyj\jmqxvtqx{yqomkrG3NWHkUPkuYprhRIKdaexqmr!wxwxwxwxyxyxyxyxw xy xyxyxyzxyxyxyxyxyxyxyxyxyxyxyxyxutP\uyxquxwxyxtvmrj]kcmvqswqplfZfh^lf[ih`gYJVdY[n`XTjmlt^HQbjadUM^epvl_Zjofnkhmf\furvtpljapqOfiPIn|nlpkfs^gvrlbafogd_waZfz~zf^daepyuntiP`S]^o|utmcJYiyh`aoZPf|J8RD>Pj[BY][cYacloYbZOgyg_RareAL`WVK\cRTKGSk[P.8~lKX<&";CD`npqdaWbvZYmdSV]cqpjl[]bhYqtdlge{perx{z{uqkitzyo^|zY8TVr]dUICHWPZrlbwjK^znhr!yxyxyxyzyxyzxyxyzyzyzyxyxyxyzyzyxzyzyxyzyxyxyxyzyxyxyxyxzyzyzyzxyxyzyxyxyxX^nl]lxzxnhd_ksn`]i{l@Kf|j`YPsgcS^j`<2[gcNObsnbqdh|nXQeb\jlbhlmc\VklYZf}`c^`gcgbsnWScb`dhwtn|_K_aYa[ITgflcin`XbgXRajhjhnmrcSdbQZkVHX}jVOXu|lXSF@7DPUNDKa[^i]^rgfS-GFB^J70FV\eqmk\XOanXaS`ht{liqb`kaibqhoymjknwy{|ytuxotrlwyuwsja{t\TsOLQPdP;J_ya^Q:Ae{tpr!xyxyxyzyzyzyzyzxyxyzyzyxyxyxzyxyxyz{yzxyzyzyzyzy{zxyzyzyz{yzyxyzyx|eOGY_Ice^pwuqpujitofY[bvm_i[fraORjgYiriT7>TlmVXecYBP>CSK7?ceVijd`Yhkha^YVO^ysroyg^blu`\vpojpusdPWmzuWOnojlfdb^aW]pxqWjxwnrojigbusYUgcptqb\L<;>FSeSfc^gh{ol?'3K^[oNenhj`eaUS`mdgdbP`txvkhsi^tjfoh[`uve\jsyxvrpUP}ys[ky{~x{qomYlfOA:GI5=ZSencemukh9%!x yzyxyzyzyzyzyzyzyxyzyzyzyxyzyzyxy{zyxy{zyzy{z{yzyz{yzyzyzyz{yxz{zvzjc\Ii_JkqftyonhojQi}PQU95DP`va`a9%!x yzyzy{zyzyzyzyzyzyzyz{zxz{zxyzyzyxyzyz{zyz{yzyz{zyzyzyzy zyz{zyzx{y{ne}knsofYrZBQv{vw~nosqsoruqocgwrPMLQDj|xhoeN[_tV\n]erqtywrx{uztw]dlswrjwvi^XcmaSGPps`prisvbaq`nk`JOPFQsdDlS/CI_afahqkYgjVghXP_bSM^_nrhmrjVartaWedPi`jsg{ypszrvtrejxoh`hlcTW^VJG^slkcoscEDEPS9%=ayzyz{z{zyz{z{|{z{zyz{z{y{z{z{z{z{z{yz{z{zy{zyz{z{zyzyz{yz{z{z{z{x}yaJ<11;HWku_itnlesdn[cZL\VAEWQOK`vmNYxuYH^wr[]a`qmgQ6'&# K`G8F>Z`P=4FX[`brfhmtynqeOVaiYcpgaPSmwYXgvi`W[tqch|{oytg|{uzk_w}^]OTQmcTqsrgZ^nkLBr=ayz{z{z{z{zyzyzyz{|z{z{z{zyz{z{z{yz{z{z{z{z{z{zyz{z{z{z{|{zyz~|XAI@EDUYbOctqumxogpiSZ_YKJZ_YjPSY_jlMLhg_PY}wJLZfKXgb`f]qrhYH42NalouypuoqjhcZL[V>BGXnji]LYjo|rjqhmXNTQPJUhofVkoputy}i`UXlgafgO?EWljpvdndS=@LYJ1)1F_oW9!2epwsqcr{|sjqy|wrvmea_lyplwuyvkuPIbJWkV[dgbfpwslymUS]_emsX03SmbH6Ki[fww{oSN^euw}meiqstyqJRhpaY^f|hH[dXKerlnosjgv}ltpYktw{~syvtiwtaXW9%=ay{zyz{z{z{z{z{z{z{z{z{z{z{z{|z{z{zyz{z{z{z{z{|{z{|z{z{z{|yu}ira7GRORiUefKOq}v_\jfkyl[muY=L_|p]UPWZ]`WPavr^`GI^WDALU^ft|xupaYKN[_oeonj\]V_Xiuo|sjP6<>)%(,G\kcY9&#:Uh\[gqx{xlqy|{pkhpgblsdl|oWKTKHi[\l_cfmixrvxvVIcifpwrF1Elw\H;DG7fqhIRpxyq\sxngp|ovq|km|PXzdVipoysnuybL]{slsprorys^lpTO9%=az{z{|{z{z{z{z{z{z{|{|{z{z{z{|{|{|{z{z{|{z{z{|z{|{|{|{|{z{z{|{|z{|ywz{q~pYw\4A[_bogft`?dxqihp|yZ_[RD@SXcYPJ_clxrUZYOZPjqr^RDTXPaicotY\nlk]rdegU`kuvdJ7dpsegZPMNQ[iMYeadXOF*!G]^_uvsvjdpz{timvwukhwrgjdWGNPe`=AdkVrgfbivrda`KYyutxq]d`JNZl}w_fFH/@mwhXyklpsl_VM[`Wb[WBRrfZctofWPO^Z69=CDJ^n_mpmeWMFXw{YA_tpcYTfxlb`I,3Zzk`TEQ]KPNKOPXZcgh]ON^x{hfafjd]xqfvwihnYVu]Rbj^nh_dXZpdlz~hZrzum`;35I^muzkeqntuqfQfo|h]jy}{waXqpl_^q@CnbF>Wsxuxrbfr\^nUVjg_SUahjzy|gsvu9%=a{|{}|{|{|{|{|{}|{|}|}|}~|{|{|{|{}|{|}|{|}|{}|{|}|}|}|}|}|{|}|}|}|}|}|}|}|sfpvt~pOcoTgvtp~piVdvd_k~{h]k[H=3QSKi~k]_fmsl\TPSKc`M;RcL=U_Wc_VhmgXPURJE=DbhbvsmjqcSHTq~xOYrv_][qwoklc\6%=crk\ha`tgXKS[cpxrvt{X[YK_lk{lR<=JcT\ygjlufg_fHOYj~jnjoths|yygrujve@:O`r{r`h{|{nkXTfu~ahuvwxY`sr^v\WhSIZGFTZkpy|yqknahULU]RX]gt{ylb^\[9%=a|}|}|{}|}|{|}|}|{|}|}|}~|{|{}|{|{|}|}|}|}|}|}|}|}|}|}|}|{}|}|}|}|}|j_jhktrwqlbjy|xpUWuydJVe\e`_fjaVAXNBdqwl^V^aWSQYbdYZV[g\F`ZnrRr|igtzrHYibV]ijYfxpoXaKV^]~脁sopsM4SuzdY`r}La_twɀlNPZSeWDJ@`sqxSHn|z\]jwuoIMielxzuxnWDHZisbA7@?Rj[PaI6RdaRNfUOUdtvYSP]dOEUZOith]acqeS[slegdkXGQENn~|xqxanq]Xcw_c{sqsvbv~|lIO[UTbW9@JSVr{jfmsknusgiw}wRAEaeswr=a|}|}|}|}|{}~}|}~}|}~}|}|~}|}|}|~|}|{}|}~}|}|}~}~}|}|}|}|}|ouypqnbUEVtIabUf{~sufCOlg_greVigZL]RE8>DQckmf<*EBA=McNYfOBQfgZF^fLBX{}mknfYeKGcR?4,19=<987:>HLMEAD>@RQjs>Vw~{u_nkyszmLCXr|ywXQjgnkiY[CJ\[tRFxnTOtpZhol]_tUYfncRDaulmR[eTOQ^hmmx~gV?GFOtxouctbY^x_T]tj^kj]rupQcwb='%-9MVomt}|tqbo~wiacttJOZjmr.a|}|}|}|}|}|}|{}|}|}~ }|}|}|}|}~}|}|}~}~}|~}~}~}|}~}|}|}|}|}|}~}~|y~{y|whyskTKwU)")LNIPgi^r]MCQ\_gkinweZOiot^f{~upuh@542/.*+,7Pl{hT]susO:Hdzpq}{~yrYPmp}yijqHSp{qorvwtxsjNV`mgV}S?`diufqVE@4E6Mw|ulga^nulgsbEPOC<8BVXO^gbd]j\XGFYZ[kN:KolwypQ28_pv}yqadqk[_UXmyN[r~tj\Zrz{f`rS;D_x}qf}z^davrqliyd^NQ@:9%*h|}~~}~|}~}~|}|}~}~}~}~}~}|}~}~}|}~}~}|}}~~|}~}~}~}~}~}|}~y|v~y># /T[hm^XRaoz|vtwpv|~}pw|iy~zyxtzeRrjZcV4L[c[aPA8>FMipsQVpx}~y_:.Oxwx~~l^X[iu~{z|eRUWF<7@Vkgkgjililuqefmd_RTfMGZ{eaWH4;@:ICTeX^]GL}xywdM;3]abgr]ZdsskhyiWpqn_@emvtz}lH7Lmytvuzp`gjp^L]\^xUJ\pS[j}r]QriplK4?Plztsyox~~z}~~}u|~|{la~XSg|xqOSZju|~{gmnYcn[Kk~}}~sR1@l~~x[S`Km~tylX<,-53% ;\{lqgcxtzjso\_o]FGcxzynSPD6JRL[HY^S./'J\JZbj|nhcogchWj{z{pqs\[e}cmpgr~nV93IdwkMXjfTYP`mnf`r{oc_`tgHR~{amzfijXAMIYpqjauRWaC\DAWkM=?759%)g~}~}~}~}~}~}|}~}~}~}~}~}~}~}~}~}~}~}~}|~|}~}~}~}~}~}~}~}~}}~~}ڕ[,&-LdhJQXFWnxzpu}z}~~~~|~}z~^Xeuhg_g`WIVjx{zoehoPTv|y~}g?Bay~{j^?HQq{~s{vP3&#%5Ply`UliYZ_`adrd_`T\ojporcMRQKHoJEcuQVQTnS]mx|{a[kgkaw|~|p]jtjlckxpdq}uzuV79\w~ucX\]ngQZ^UEObdmohaWMAHQeSXsvqole`EBNeqaWntW|R48XlK4<?9%)g~}~~}~}~~}~}~~}~~}~}~}~}~}~}~}~}~~~}~}~}~}~~}~~}~}~~}{{c0%:fvYkzqtu{nw|{~~~~|rqrTm~bfedrqyvijn|xZgu~sq}vO1Vy~xeb_k}_bombI+ ?D>W^Zlqyr`ipjamhytpok[SQZga@6XwfqTE|xiVPI_t`fX`u{p^UawyxhO[il{}O^|}simsxu|uXALjv|s|jTNCFecgx|nND;Grgiahsk`i^@>@PZj`ea]K6JNXYiMV[Z9%)g~~~}~}~}~}~}~~}~~~}~~}~}~}~}~}~~~}~~}~}~~~~~}~}~}~~}~~};%$'Tsmq~|vz|pz~~~ۀ~zozwcPQV@:Ytvkv|xo^Ofgk`gZdz|T=\z~s{xjRUPgnprcY9IC>Rgjlsfa[pxyrjnom{nkxonaJHXJILAS8#=h]YnqZhuz}fauw`R]pfko~gW[JaxveM\pqwuflorwz~|~uS7Ablac`J^a7hsoz[RfbNPid|iZq\PE@EGWUTcchP6:fymbmZbkl9%)g}~~}~~}~~~}~~~~}~}~}~~}~}~~}~~~}~~~~}~~~~ ~<&$!Bs~zt|zr{~~~|gst\NL[SC8Jcsvb_^juofc^klzeXuwdQzpmyOPTN4`oGVwv{wjrijg^iy}y~rtx`]s{tL`gpgo|vjtz}{vP9ENP;234B^m<'`ER]:MevjYfjbgmCmnIXnypsdkpyjixo{zutcyz~bQelurjxv_`lv{tXIVY:+)% =l`3$L^t]MZG=PfZc{\cjXC;@d~zM<=Zdp|ofK:T\pq}e]t|9%)g~~}~~~}~~~ ~}~~~~~~~~~ ~zy|t򍔗N)$!'^|zu||yz{ysjlouxfYgusjndKWYKIYksvsxyd\{}r_FAdy|ru~}T:Rsnm_ge[glakwsf_hZdthWYja\_vly~j{zmYHazT6APlsfljz|p]cZzrsjr|rtyrjpdwgojl}u~]Ifu}kK[rzrdrplY`np^VU\kdYTK6#-Tld29g}^WE.Eqdc[ajxv]_j{~jNYP_m~uYM<8G^Zr{sr*h}~~~~~~~~~}~~~vqnyj7#$Kwyt~}wvtkqv{sp|ru}{slh_\jotwhuvj][jlq~zd\vwMF]p}zI]zpz|vorjZqr|jQZksP0HISWtqrwp`_lthE?o[zvytbKzvovgn|{w}lp[kx}_iv~qXYlxbfquqwourzj[lYX^Z^kZ]`?+9US13bpfmeI@]xw]C_i][@\|dgzJFusVRD^k|{NU\r*i~~~~~~ ~{umky}plmy~e6'&;p~}~zx~|d]ax{oz}{~sx~|jT]xkdjbjlbe{qu|~}^MA-1CNWpaNjmc[jqmx}]ugUhe[UNiJ-IGU\r}g\S]|^1Ks^mv_\bv~|sRnVekcjr}}o~}oxdgxh}z~uVjnTloqskbfnszaTckf_WZRM?)+VQN24Xnpdne?ofV<2oQWuJ&,`}ufbsukvlKb{z{zx~vmiwywjeSXjf]dz}po|}uywkfhg\TVU_rWQ=40-Cm~u\ibjcKE@dU7EPi~oebfYu}Y%9olN\cPGYztnlSOp|m[pwrufx}瑆el~r]tdVj^U`s{|w_ZoqWTkojefkG&H`W91]uxrz\AkXeZ`Ml}smwhj}wxmg`u}tWssdkjg`t~yz~|io~rgr~wejn[eRhjwiJTR^bE[\`W\{~t\T8#!&98@ISGH_jT2]^@;29J\E?:8GRe[V9%) g~vgXg{{eUB6432354574JK:65410<\yq_lrad`V}~~hu|nwvOMTcx~|s{wlt}zxpx~mTgrBRC>SRaMPefFA@0# !,bYRuzI/R<%.Wm{~|rs{t_qx|fV]u}j_OR`im[debYL-&-_^:&Bdc]gwsksjN87R`fU?87IU[O<9JLH90;lf`]VbA5467=EBLS_|9%) g~hafrhXTZkN:87454JA3101312Ei{fl|x~wUrjo|~쀂tlx{}}^MW\Xmnr}mnzwxyxwxwz]wgFJ^T]T1:sgH>BcywjbQ:%/pRAU^fYCfe,H}}r^Uvnmzt}qKFb{zfGY|oegS]a\[L6,+Il;"8dljOVrKNorvV@423;M:1e]y9%)gՀe`q]UWbwӴdSID@?<9=UB87420/1327Uwhwyw{ak~o`OIE^jx~rb~~||z}zqfklpQ2GD9]d_vlUMC07VrxnhejRWfD@*)I_DM3 ,_}j`^`qxmx{sLHXweY^]yoWOZWO6(*4j_-8jrn|}yxy~ba|gScX]eO;L[fjJ"E`d9346A\C/\aKIJ9%+hn[wkSO]rԴzumih[QKLF91/.030=_|mv~xyz~{|n{ru{ve`n}|nwx|Ӂ~|{ydk_ioPHI=*0756\J3TjVdl9%,i{[rjWյI730-/302Elpt~ytextbrm~|vz{kgecsvz|{u}{yyht~\X`x}@$!#$"#+2<[a@9M]y~m[o~ws^S_djlheuS;91,.Sx>,Mcivzsx~wsrxvo]Qd}x}gtpkpw~dG=@q}W[XB<@4823N?3o[gq9%-k󂁂dgtTwӵplrzL872/,025a~rtyr^i|jL5Esmy~|r{~ngSa|~^]zʁzfhtzkcjrpkbRh\MC+!>^mpk`hP3Ajfg`d{rvlb>)!HwL) #!$.3)$(GUunaqxbpuw|tm}rgcpqo|xdc|ŀnxNMnunW=IP2Kb^Yrufia^]3$DZAYjkwmxyne>,ClF)0FJ=G=+! "#!$'!3YFLpsgdaY[RMU^UQA2T}qJ:JEU]Y{NJvq]x~{fSdupaiz~eivqxW/%8anW\reM?De{V,!$'7Kw9%/l}]qfVO9863:i~넃~~{p{wWUW`jclrakpv}s~_NEb^WVYp}vxl^vy|uLQe\_u~rjvrZa^cbR-5P<[rrfngec@*IrK_{s\>-.,#"%!,3&+4,+($.?;.'($/<@[o_ISZMO{|}u_ctwxqw~xngfa^S\W19VR`}ye[71onclusUL[;$*O:5ACr,i_fؽ李S:98578:b胄xrmqfmyeTCd|[j|ptu^?MIMC`swup}݅uraFGfuo]cpgejeams~noztBPF-ku~}ve63g~VJcreZh{~^[E38.-/+.3DEWdfsqeRYhfmG#;dovjwjZ\VUXYOdbVlu{uPfgpdB2V]\9%) g~[=97:9^|rzv|}nhu}vFLhTEWHBDMX^uz}}r}dTv{or~tOMpsjhnxv{{jf~szzf2),.>?Ogw~zu|vuyYb{{~xpe`luaX]cdjlhid`abTC5-8lv5)DKTL.$+'0?^yyیx}zoxzQ*+VhwytwqysdVqp]b}tsjstX+Fx9%)vƶÜw4-27>ELSm\<:879]|szy~zyu|jUCQN?9QGLYlyrx{o|}sw~bQ^fsqO[y}ce}ryw}tsn{~}xtzP(&*.3^wz|w{qs`j|}b^Z]ga_hkjhgh_]aTD1+/f|B9d|}~tcJ.!3WnzgzZ_c|e4'Xlfqyzlaigurgfuv~sZcjtOef?s9%7g |cljbXQG@w_;7:87Z~z}}ozW?4I[\PLNY_ha\U_mdbl{|rlrhj{rVn~{a^zqu}|}sqwz}|]iubRJLXt{xwyk}ukeyr`hmj]X^_gkhacgd[`WJ?12[M.jqXJ0.Qm]enaB^epi:(DnzmkmlZ\tz|tdT\[dytX\hzyfJ0;[}r7gĞ|IMU[agovc>987:;9Z~ހykRIFJ^Y91DUFOguy^I^\Xcq_k|e@Fe]OfAgx}gkz}zuvtkps}jRc{xfjtw{yxsx聄npf`lowzmPWSV\S\ib_]SL?20[W2Ls|zxrqv{|ry{VD;DHVfr}{hq_COytvceltrpk_L^hy|`_vQ5Yjr7g󆅆Ği|yskd]d?;8Y}܄\PVTif>0DjPZxyw\;9^R^sukuzdPWwewrlnqv{tdny~qv|}qouowpɅ|ut{~u`cqx|{q_NZ^_]_gj\]\WE<57J~\7Rhk{wtxuh_P5=Xbckpq}{ldptrqw{wkXYgeilwqd]y\K^s~r*bƞ~BDLQYbiri@;<:86V}xSUijb>8OlyqsrpmpqjXBVu㇁ndvsuxuehuvj_OE_jvyyzdWGDalx{nz{uv}gYfrwrjkjg^`egknoiTW[I/35GyZ,Eoktqxy~yredkzynYEIELbwotxXFc{ys|j]^`cmdhdaum{Y]|wqr)b|Ǡi~xqm?7:;7U|䄂tiXB80?Mgr|~yz{rnqMUO_{wЂ|gmh{~vnlaTrcnfO]pt{zvypVIKO^i{ma]\t~l~܈l\`htvnkifdjbXdidhkgRPK-,;?o^,.bqnuz{rqp}LGfmgikuP3;OMgsenhmlzlhnt}ly|q~zbe{zxr)bxƟFGLKOSY_qC:8;9S}z|jRXRi^oeiqgqmsignzsZgrs|mos`izwkejo{~s{gU^lSKd[IVp|kYdnsploligc`aTZilfaXK34:Eof45hsosqcewnzpgegoN>931@XvgWaoibiw~ibu{Ter) guȟexytsD:89;8Q|ކ~trYdbh\l|tmc^tru^GWk愅q{~oskhpmjZR_FVgo{|cIxpB=NcygptpjprklfjhcQHZb_ZYR5):Vld3/_juz}kP[yr`]_fUYda:)>M_jgn_dhnz~jiowpq{gJn}r) guɟJNPKJMQTwC9;:97N{}uzwrwi[dg[EWnmond_nt_N6/4_uPACj][OPBIYe~hx~x{wOIctsKC@Epr[EQxF;?=Zc[eqkpqhab`eh]XK@JD9<0,[nB0Mls|s}}ueac`rzvwv}zx]f{E&DPGCXtrurzkmonv|vmz|ke9%! uɡNPTPLKL~}G;9:;8Lzq|O:7>GERhfo|nu}modAVMJatcglqt}fow_FQcdr|kZFX}퉈wWtn@7\gpq`jmronlnsid`cdafc[ZU@ABKC3=[F0CWps~{}ldnmnopak}xwunQstK*E}P5+:Rkszr|qtqspuqsvrqu9%! 񆅐sˠZes{G:;:98Jy hvpbhKZknt~r|ltZAJ[v|q~}yoq~eZhis|{xxez퉈tzY9M~f_kpukmpqpd_cghgde_[T[R71?m{}zqcfvidix|y{u}yb^zz󃉊uv΋pX_djnlrprsnhjqpoicbikeb`b^YP6*+3dwB6erj~uZ]jqfWFRZCH[nkhgpt^JXacx}|so|}qrvtnrub@L_cf|vyqx|}vjdlg[s~9%!  nɠ]?8:;<=jۈwvpv~pisfalwvfVk{Xi|~fW]hknpokqpfdktqg`hcba`]R4%).\cEKp{iog^XNIUarsbMKC4GlqNCapbdjrlՆyzxqnu}z[AQkjvxx{v|soqtkaqy{y9%!򈉈tǷtQNVahpxeD=;9:;=hwko~nt}xqdepqud_lz|zy|z[NYfhcjnqjiojnlg^afgd`^ZXU;)*-=gPSqf[qs|抉|dJ>BNi}mwsxxq}wt|yp{{}|w\ERd{n~wylqt{xozqroxqm9%!臖p˺yrpr|~U<8789:;?@DLT\elTB<><;fvs}xrz{v{|{ob|}}|~ތjWOWimhikmosqknpmhgegkgdefa\VWE+.DkL6`zbo~kxyt}syzx}~}xj_rqxv|{rsptjv|vxocTGRwnfo~ztjnqtiuol9%)a劉yqmrxfVJBDB>;87642-3;=<:c򉊋v|~s}}}u`}~}ya`gsplsoimusqspmhikhkhdadb\ZI1+-AtS/Wy}ljtl~|~~}{xu|{tvxfcv{lrxrpsv~|xfZjugizxjako9%)aΈypjhkv~tqy{srh]kstvk\TMC=:63131*-5<;`s|xx{~|wmz|~|nW_dioqpgjutqnlgdikhdegb`de\UI0),;=CA9634679;@DHRWYajkfma?-+\~񉊈~p􌍉|bajlomnomqmpmknsqhjokmopinhdc_[a]6",0=iM6ctjvwky|t{~uifwurqtuqlr|tnjghsx}ks}y}tu{z~RNP\fki}z9%)a w_[\UOGA?<:=<:98564210,.452,=l {kqu}򎍏d`nqyuplmiegoqpkhbgrputninlfgjbZ^O1)+;qf2F|}r|sZ{􋊆}{ztsw}|~zucmgeUIYTN\|wpqlucfzyfXT9%)aLBhqaSHDLXi}ĚkTC@?@?=<;72-*185.P|~yq||r\gkosuqnomkfkrpnidowtposrljijkeca^\I0)+4jl1>{yqto}`q|qv~x|u{qn{xqoniXB3(-027IWar{z}ueouYeynVSgr*b WBXrYFCEM\pÛtd^YUPIGCA@?=>=<:40,.472,7e{pl{}揎d\hjlqrqnjhikntumhifnplmhombkjhiea\Y[L.'*8kr74qqks|spxnz|}v~l];('(.,$ 2BVexwsempTRWROY\_lr* ceBPu]Jf›准}yqke`Z[ZG?<82.+.650.Ny􏌆z{{mhz܋qaedepuyxogdfkrqnmlnjinmnoqnhdkomlga[\J:*0az<$et}xinz{wdezsoN.*+.7D7>HQxꋆrec_VkePNor+dpDHmcIUšzcba`cfko[?<61*164*Mzlkx~qd^hjlswxrmljnqspompolnrklvofjrtpke`\]P6,3a}D&Utx{q|t{}~jP7,*(*3G[fiPQ_~{}tlIZr-ozIBdfMQě򉆂~[>:3/+.4Kw lj v]frqursphfnvqonjiekqpnosqmosvqidb`ZU>().`Q&L}utz~}~uwrpjo{rxu|sry{vvhP1+)%5`DO`u~XOy|sqpcPhjv9%!Q@YhPM›]A=<>?<73*1m}ts k`lpqtqutqpimswtpnkefplhnqmknvsmke[`_XO?+)+EwT/Lxytzjtw}}uswxzto{ІjD.*&%LzZIf~{dbymovuvw^Z9%!tKTjQIrÛ[A?>=?;=gqwz}}b^imnopsominrvsomomjgljpmiknopkhaY\ZU@)(-Gy['9hp|xknqvqy{}u{kpu_>.'#5W~bWV{pZuwz{zsp||oU9%.lsQEhĚ\A?=?<`wy|~~|mZahpvspsusjihnrpsnhmpknplkpqonikmid`_\VH1(,6rb0:jx~xplkr{|yqpqury~myx|x~z]<-'+;ExaThlg~}{}tm9%, jtMaę\@=>?=>;a }{y]W`tvpowusmlinononkiejrpkpjehkmjhe[\UB*'+6ji1.a}{vkq|z|ngmjwxݕrK0.7>Grlahpuatio򌗝}zsger*h ęzhlrv~]C?><>?<:`z}zzbfmrokwzruqortunlnpoplhmrtujgnjhowtmjib\T6(*/ZyC)^뜝u}v}i^{I)Z0 _zcz}lmsu9%)g3ě]B>?<_򐑐|}~m_jswtpuxvtsrsmprprkemqmopknlkhjrneif`[UQ8&),PzI/\}uxv~xtw|Ꮣs_yXhd>Y™mxut{zvxrw~9%)g Ü]C?=>?<_lnoptwxvuroruposwsi^gnpnlsmhiklimf]YTN1#(+=pL.[}{gefm}zt|{|}}|ϖl\txv|yzyx~haeh9%)g   ě]B?@?=?=^{hu{tjpsxrorpfmpotuqljkmlonlkomfgoplnfa\ZO+ '-/ZO+Mzzpqpry}|{sqrz}lpy|qyvsdctsmozyz9%)g ʵśU67;?CHOV[}]?>@?@?=;^rqxyutszxurpmornortplkjqrnlkrsojikhnrmedb_[W:#',/BI+Bp|x~|~zx{xox}|slzto}~玌famv]m|}y~{9%)gěT(&/+*/0/@^A=>?@?<]攀houwxnqv{xtuvqpuxtouzsijonjnsurniempolg`]WVWD-',/06,Cps}~wtxzy||ۑ{xwupmlny}{xyuهtgohyvtzik{zs~snx{}tpux~t~{z9%*h ěT$+R0)F.&e_C?<=?<]wisutsprw~vpsusrutqpsurvtqmljknsqpqpmomfhd_]\XF-(+-/+(Dgji}|z~|dlmnvry|x{uxcqzm~烍zs{|nw}{9%*i ĜT#-^4,\7,aB?@?=>?=\liqoinoqxvyzrspsuspsqknuqsvoikqminptojebcgc_XE,(+7O9&@nz}~yzvszxz}y~{}݃|~z9%,j ĞT.;f<0_6*`A?@?><[zfjimpohnyz|ywuqmpsqpvsmhopotshjoknopkc`b`a^VI/'*7ns5&Xr؀}~zpdbgp~ytu{y䅆}~~}r|yqiv9%-l򑒐īƞV=Yxd`ye\b@=>?@?:Ylelmrvu|z~|uwqoptnkrolomptuqotrnojklfab_\[I2(+8o|=.Prvuxvbeuxfovyu}ٍ{~uv{}vzy~z{zw|qy~trqyt}9%!󒓐~ÞU&-^91bF?dD?<;>?@<=?~|\Iuzvqstvx~xy}xuugxywrmgfuyq{~vx}pv}{}xwyxzwpoxz~r7gǡXIdzh]wZMeA=?@?>:Smnqutjqwtvw{zxzwtnrtmqpoptqnlqpsnkqldigda^_Z6'*,XX*2b|zxuqjmy~~}xp|yr}xuq|w}{oF6Mvsz}}{~w~}svr)c  š񘦫V.8PHL[\`eD?<>?@??@?==?@??@>N򕗎pfosqputmtvuxwu{votsrporvwqpomoprpmnsnhke]N3%)+B{='F|{zusxwyn}{~}y~zs~|}{|t~yzxv~|t~omr}{uy|sxz9%7a  ȢW%1a??@?=K\frtmosrgkopszvstvtnjmosrqmomoplpwqrpmstpkc][N7'+B{G)>jswx||tqouvqovz{z{~}|~x~~㑐xzx9%.l ¶ƢX$+]H vchmoptutqonrtstwsniorpkntonlnortzrlgfornolg^]U:*+2pQ.>o~ys{xquwtsyv{~}vpuzt{~|twuqrv{swz}|}spy|~ゐ~kax|xmxvyyw9%, j{t~vȣ\2HoQEi=6pF?>?@G~ojpqpurnlqryxtwxvrkhlrspnlpt{vqoqmr{vtqlnmkic^\^VE3,1cS(8busy|uimwyvw{yz|~򀋑~z}|utsw~}|щ~{ysy}uvw~|yrx|[KUuzs|~un{snr9%+ i攕|qwcxqaȤf]sH?@>=?E| jmlostqplkmljquzxy{xtmlnpsqnopvsvpxvqrtuoljhec]\O2(+.YW*2exrkxxpu{wxkt|uqw{xuzyqy~}js~wqsrx~銏|}kgir|}xr|cs~tmuwxliqr*h򕎂|uz~yz}z||vxdxisq~tZXɥ`POSUY]dldpwG?@?>=Ezvnrmnospmjmliny~ztwuwqmfiknprmomqstwqrsqsrmklnjd`\WA,'+-@{^('Pm~}sdboz|yrvikxy|ys{|뚓xt}㍉|}zroxy}{uvlnstw|xwuvqr*h mfdkjejohqv{rowvrw~}tjnz{sjdWIG{ɦ얏~zupjfa_xG>?A@By npqikovwpmknksw|}yvqpspojnkjnpqpmosvqouqwunlihfc_]ZJ,$*.Awi/'Osxyט|qju{~qgm|~|~zjx|w|}وx{{~wxrvsrpu~{}}rop|f_r) g|qe`^_ca`hklimlnkliomkrqswrvtjonosx{|{ujlf^Z}̬zK?=?A@Bwxmvspsxsonomlhmrwzy{wqstljmononopsquvpoqpronifda_\]>(*,C|n1-\s{|}}tklq|{|zejv}~|҈novuyxguxz{~{jskdkm~l[vzyr}tvt9%) guycUT]behnjlsplklinlgd]_a^efgkc`cjpmnorpoprp~|׆Żwvz~I>?@Btkiuqv|yrmknpqnip{yvrpurmnknouxsptwuwunmorqlmonif_\cF*)+=yx;&[|{w}~̀|xt~zw~}{xt{ytyՐxis~zxuul|uz{z}vu|qxoilvnz9%) gprb`cdgnognkjecafd`a`ZaYcmnlie`_Za`ca_`dfdcgdikfkikqsyuw|v}wle][YRSTRSV]dgr{]A<=>?s{gjrtsvxsminpoiw}yuplinpspnotrtwvwuqrvtkjnomoia[^aC'(,5ox<-U~vtwt|Ǐte}|xeZuz}|zr|wuol_Z{zmnqmu9%) g~qqc]Zcmnhjofjfdcfmjkfafb`e_]\YVTW`_dfh_Z\[^Z^`_\[af^bcdfdcabfhjnprvxyvqvlje`b`[SNKHEDBA?647:;=<=owmorsrspmloqmjvytrohjorvwqmnrvyxqpsrtslhlopjklc\`B&'-/`|D+Zxtی~z}umfn{zuru~rey{qt~yty}{xq|swty{im}wpso9%) g {zsg^homlnknrmjlfejgdedgfafhjnmni^_Z]b^]Y[^\^b_^b\X\`]_dgmhgchkege`_caklflptzrmopmfa`^UMLOIFp󘚘mporyxrsrnoknkq~yrxtmkpsqovtlknxtpquqnoqpnfec[^_>"&-SzG1W}~~􊋄{vrv~ꑊ~xsgbc`{kgn~vpwz}mdnpan~w}vz}wzzeukgvy}{r{9%) gztgcdeiutjlfgfihmksqopefdijhkia_cgd^YXbcdgeheg][Y\_`Y^]\WXUSWQRT\`]^_bifdfgejef`dikjkuxursruoutwx{uemsuwrqpsolmijgpxtsmjouqopqpinouvtsqutmkhnongeaZY[J+&+-KxP,P{t|ቂ|vqt}yury{wuxz~t~t{愂qpx}됅}wv~rs}xrwolm9%*hᖗvtea`adjokifmogmijmhcjofhb^`bifdjbemoghe^\]fqeb`^ba`][_\[^bc^`_X_`^`cejcYWX^`^`^_`hiqhfgdihfdcedijfmnihpiotqruw|{|ؙmft{~yrmntqpmlnickuspsohgnrtqponlhglotvtsutpmcgjhjknf_\Q>,.@qS4V}~|~xqz醄ztvy{}x}z}떘~}qnv|}t}{xy}yuxjg9%*h혗y}dfmpqoqvnljqnafcZbdcecmocgbfa^hea_`YZ\ef\[^`c`[^alsqnf^agfb`cea\^_fhqte`cacjmiac]`]_`cfgmkhbc`acgkgbdioptwtzwysmnpv}~tlsuvw{|jlopnmlemqstqlhflrqpopnpmjmosutxzywsoigmhgke`]^M6,-.DtS.T}{}yz~tx~|y~~xw}|ytqrzy~}}~y⌎|}~yz|xzmnzokl9%+ i|g`cakolgfcelghpncbd`gdahedfc`\Y_lgac^\WVXa`W]^\^_[ZW^Y\^`a_]_]^X]cbelcb`fe^\X^cbdfgdfkhjmf]XV]^`acijlheihkodmikfmefcfjmljlhjkruimtnkjlolbhsrtpeaiompomrqpnorsx{zxurpolkljegica]aZ6(*-E|a8\zsnlp刄~wtz~xt}~ysr|y}|}|qs|zysmv~~~~w9%, jf_adedciofihoxlhmhicfda^Z^`cachlvulda]`[]`cfb^]_ZWXUV]_cdab]`f^_`^\db`b`_^a_\b_]`cmspid^egcgmfgehb_calopgcbdluqeche_]b\^b_[Wfminpmndervrvqjbchqplklpoqpuxwsnkmklqpikea_aU:*+->sj9Spks|Ԉ|x~|rgj{~ztsptqvtp~vusy~y{vu|x~um{x}vuys9%.lh]_jpmhdce_bdhlnc_\^gkeclilcieknf`b[WTZbjc][]_Zag_^`Zahbab\`^[X^_cgbcefa`b_\X\[^`fcfjriedimgefa`gkfhnkjpnlnigegojklihb`Z^\^\alnmopjbfu{urmihknqsqpompuquyrvyrpkhjloplecabX8(*.F|m?Lv|}~hb~}soputv~zy}zx{w}~|邆ux~yq{{򕍈r|xnpynqpvzxr!󆉐rY[aeckig]Vemlngnk_^babahjkhfg^\^_fg_^Y[afc_Z[\X\[\_`_]_[ZWU[_b`efjklpke`bge`c`bp{sfaebebjrnkdfjhinkokikqvqwrokoslklnrolf`YWXZUYfkjmlbkuxqrmdfhjnmnxtmorqrtwspqstuqmljkonojbc_@(*+Cv5Fr聆}usv}|mq~z~~h_ky{rv|~}wwtwyNFbzkr}t}|jz{xr!ۙt\`cfckprseW]goighacd]ejiejklmjgfada]^\^Z\VUWZ^`\[a\Z_^bfd`igacbca_Y]a_\Z[_`[_c`hd`bairjnebc`fptwtpigdgqopmjdbfjoknfekpspomjfba^\YT_jkniagtqstmhghpmsqnmotwstxvsrpqpmjokhg`_]@+*,:sy9/aotz}}~yqoqszyx{wzuoyՃ|vz|xwT?Wkorx~k}}sezupr!ޚv`\[bfdejij_[dg^][X^ifinmijemjge^]\`]^_`a`\YX[acgske`cjda`\^\c`YZ]VUVX`_`dgbi`_c_`^_a`edgcjgfljmqlhbdoicgfkrlegh`hkomiogejnlf^]_a]URYfkoh`bnrosrlghlojpwonquvrqtwtpjnonpnmkhcZ]@(*,:sC7`xqrpxuqv|uwrw֌}~}uoz|xyxjuy}kudl}sjbqr|9%)fh`_\`cge`Zecafb`fce`_cfdghgjfce`becfqruje^Z[_\_`\[^`^ehba`bcbdcd`_`_bcbhb[ZW]ebljhcjliedikhdjgdihquqhgmilcbeptwrolikmhlnidac]Xgnonlc^jurszohghmkfemnosvurstupoplnjinqpmifda_@'),2fCd}jz|}{ꊏ{}񕐈t~{n~|{w}ꏔulx~xu|hl{v}ho|x}chv9%)fia`\_dlhda[`_]a`c^afdfacdfhdkqlnlirigeacjc_[XY^\W^`\c_\^bjlbkosqckib]ab`]cmfjf_`lohaeacgekolksnlqtmsnljoqglecnmlopsxrifdcYTYSVeopohclvxtvpdeghigipqsrpvxspsnkhmnorofcbcF),6f_wzv}squz}x}󊋅~uy{t|䀃zw~y{y~|xy|yngt}sc}9%)f՛j`aclrjibYUTMQVW`c]ehfypkpsfluhdbfga_fdclpjmiafalpjahb]_cgkpmhah_^fmfif_`b`fjb]\cmlkgnjmgktjgmtqigfdmkhinsnpl]^eakhbgfad`_]\WZYamoniacmuyxwnd`bfjknoquwsnryupqpmhjljqmlfdfdH.+,;la}ypl{nrmnpkt}~}|싍uy{w|x|detkezvrq|y9%4i⛚oWT\grsnlcZXYhdcngkdcZ[^bhlfac`iclpeb]bjchn]^gdcdbonimcghgjsonolbicea`ba`^bjec`kqgdidhionmfjpgjigmrnghgfaZ[_b`_bdba`\[UZenplbfov{utkgjkhnqnsvwuvutsrpmklklkhmolokb]@+)-=qVq~|}}{uvys{{ߟ|~珍jxvnqzfXZ[a|gm|9%5h𜆋~ea`bejk`b_[a]^]_\[\hlijicd`_fgbc`cd^Z\`d[ab]^_^ZX[\^gbkohjgiechq{hac_bc^_`edc_hdjic]egdgmecfjmojhov~tqhbfgloimpjgde`alb]Y[YTYfquj_`lrzwtnchnojovxsjnrursqrqplmlopmrmfaW7&),7lN_ku菆w|~vs~tzyuvqsz{ghru~ywr6g뚀`^Y]ac]U\]ZYX[UX^]dcgmjga`cbd`^cdYW]_c`kd`ijfleaca_a]a`Z^\^YZ]cdghlc^\Y`jdlfeibgejhmrpmeokjmlomjfdahwplcfc`]bc\^]YX\WZenri_`lsyxsicegnkntutnonlowuqotqplnuqrojg]G;84/=pTlu|vSR`~}}}}~|}؈rjsp~|vpkn|l|r7feXT[fibdjoc_V]b]^_c^b`ZX`c][_`cb_ca[^_b_^b[`ca_`[^ha\_[\becijdcghopog]aegdbcje]jklilosupmimkhdejrofecejilpolqmif`_XZYU]YXYXbmkd]_msvwtmgidelomnvunvpopsrsrpnjntrsomiU=<=??>8Cu혚Zr}a#:{Ʌws}{y~y~~|}t|zyxy{~~Yn}pfjyvrv|gojr7f雞pWX[]\^\Xahfe_acgegqgejgpmc`^\`cbif]fhnisqc^hb`]VZ]Z`_dmjcefkjhigdc]alfeljec]_ba^`gekqourlbfbfedc`i`agfmignkmca`bf_eaVSPN\ifa\`lopnpdefejlqvzvnpsqpsqrnoplnopoliU>;?@?;85@}똚`wt}iYq}u|~lA@Ktu{winptjol~~풁||tl]v~vrk9%.l힎}b]UTZWS\`ghc`X[XZbd]_a`[`[^\abckc^_[^ieb`_a`dec]X^edciefhjkcda`gf`_^bjea_adcfkgqnhpnpkjkrtplqgmpojdh^]^_aZ[XPUej_X_loqsqpecghkjnsvtprqporvqnjikomomcG:>AB@=:86Fy]j}{xfwޑ{lu~zs|{v3&p}|vtqr㈊tuv|yc}|T\iS_f9%, j󪮉bRY[Y[_XRY^eb[][WV`sqimecjgf^V]beabe^[\`cfdec`gbkj^Y^`Xagde^_`bcah_bqtmdfgmopjiqsmejurmnlknpxrokfbknoged^`cfb`dbZVYUS`e_[]jqsusoc_fhlopsvuopopu{xsqlmomk`I;>@A@=986?m՘^|~u~z~{}|{ujao}銇tL.Rz~O%+lv{tm|}nvf|kiyL[Yk9%+ i뇏dTW^\_eb^`_bckia^Vamd`ce_da^YZ\epintloska_]^\^dso_Z^`fe`chb_\aedalwsv}sicabY]ZU]egipwvxjliqgcfdjbcb`hlgkickgdlc`Za[RPT_`]Y^ipspld`inonmrsvuqpompwxsplmopkP9=ABA><86@pbBbr}c~utsv}~|}~{u{}xnpwu}C.~ۋucv~{wzhp{yuvo}{wYnPa9%*h䝞o[Y^bcd[XVW]YX[Z^W]fa_`dkfg_bhb_]WZ_d]Y^][Z[_]cdbfaYZX_hoqjgehgdhk]dgdcdc`][abgmnrlopsqmfdihmilcacjfhfahb_`cg_\VWRU^_YZbjkqslghejkopnostosprpruw{slnlt^D>@BC@=:7:^h9,(ztcq}{|zz􈃊|skqv򍎊}~{y}؅h;cw~ypncjd\kyn]jpnxlY}z9%*h؝wWMQXYVSVYZ_bfea`edjof`cjb_`[`ce^VZY\_c_aedijluph`]lgd]\TWSX\Z^_bd]_]dihegdid]abigc`_jrorlpmnpvqmja^\_`_b]^cde^WZUTSPY[YX_lpotpjglnoprsthmrpnrpuwywqplfjnYC@AB@>:87O}I2($!c~cbcu~y|vxwy~|~猊u}|~}xwxғ|x}{enzrcXince|t{pbi_o}s|r)g`WXV`kcdhdilc`_VY^c`Y`fje`abhefcXZ_^emkgdcimd`]Z[W]d^`^\[Zdimfikiedhkgbgdha_`\[cjdfcprpkegbcdmrkfa^aeieokfd`a^[XSPNUYW\_inknhelqpjqzurporqorsrpmrtnqpk_MC@<86Gw}R:IqG%%-2Vf]lvqoy~{|{}~}wwns텓}~{~熂somo{uwztvl^uyq{gRrvs]u}~]lfr)gXVTZ^c`Z`\]YXZY]_[^fbdinfgkijkeaZYX^b`_^`acaZY^_ghkofdba_\_hehikjba]^bafhc`_e`]_eb_dlkfjdbedabfgbefdedgbie`\^_XOSQVZV]dkljhkjkpnopsurnpstnrsvzrlmoqsnYJFDCD?=:7@lR1,$YB)*29=Qzjp~~z{撈z|}zyゕ}~}vxovyx~{}y~mzt{|W}woV]u{~iu|szur)g讵cZY\egb`hcbdZ]d`b^X\`^_b`]UVWZ[\[^YX^hje_ahb^a`ea]ki^_\_YUS\Z^c`_abfb]_aghqsoieb^ZW]kplifa`cdca]bd`bde^][b`_Y[ZUSYXZ^bfghinljnqmloruqoqrtqtzxnkijUB=BCDA>:7;WjFG6*!2MLC:8=@A>Exmo{y}vz~}􈑌̑{lypyc~n_[v}{xz{}r)g 퇋v_[_`Z\]Y^_[YXYUSW_dgjkgedbeiebdaf_Z\_`b]U^c^_`]^\_ac`]YXYZ]acikhbcbknfda^cndX]ceb_][Zbmfbgi^`_hc^`a`cfbcghk][XTROPSTY[aimlkmlihnposqmnoportwuqmlcI;ACDB><97Qe?1@}=&!)29:8Is{I30(4wrQ<27>@A@=50.20Hzahxz}򊈎u~lx|~~zx~z|}}{z~yz~}z~yzxzvp|zwnezhuv}sds~r)g |[X[YX\bXVWUTVW][XVY^_^VW\a`_a_`[Z[Y]bcaedbgijnda`dha]^VWVW[YTVYWZ[\^Y^dcdea`b_bd\[W`_ZU]adhihfmfkhjh^Xba\WSPUWTW\ZY[`gljecknomoqmoy|wxon]C@DFD@?<9@mZBZk='"'17;@DB>8/1;`JML`{{}|x~ꑐ{䁈|}wqxp~~v}z򀄌z{y{okirvaozyznh_WsuvhizoZfwr*h럡cRPRXW\^]^YV]\[^`a`\figdbgjfcbiea[WRVUQUZVUVTSVX\]\V[]VW]aca_hdibXb]_`_ed]_\Z_]`_bdeigmhdedc_ajd`Z^]WYX]Z[Z[\`inkmpjhinjhkorqpmlnuwxuvqo]E?DGB><8:PW90'sp;)-5>?@>9439b|ysq琊銄~~{{~{u`npwqz|YRkzj[o~nz}eQchfm{x{y}|9%*iꯒfWUY\^afafh\^b]`ZW\_`bd`YTZ_^]_ed\^gbZ\_bhd`Z_b`acjd`^Z^XY]Y^\`aZXZ[eb^becfiegkebfd]bfbcjifdbfa`aedcih[XUVWYZ[_`eklhljhikihjqstsoqpmuwqtusY>@GDA?<8GpnI>3,%@SMB9:?B?932>Bg÷y{|䊆~~ցkv|ut}ao|qj}n[Wckw]gtM:Ljdt|jyvqp9%,j⡎kWTURQX][ZWY[UV[YX]_\^_bcelohdh`df^ic`\^\`fbcb[^db`cede^\_]\c_\^[^ghligdidacahcac][_cahjilmgkbfbc_\YXTWVTV[]\^`behkoigjhkjmsutojmuxwrpum\LEGHEB@>;DckF69p9&$+5<>WR80)3W:28>BCA=710JǪ}yxrn䓍򋏓zluz^t|}wR`b^za@ajw~}ucj{9%!^Y^_YSZX[Z^_[XZ^_\]b]WZU[`^da_ilinfda_a[Z^]`idega`ada[\[^XWZ_ifd`cdea`fnhcfjmc`fabdgdegc_cb`eljagdf^ZY[^RNWXY_dilkihnrpkpstqstpufH=EHD@?;TzY?KkD)$06=>?BDB=813TdmȾ򉃋}no{鉆|̇w|sex}oju|x}wNjW]vMHvzpgx9%!ZPSYU`_^bd`_bacie`hf`dahe_noipa^dg^XSYRSTW`[]bc]X]fea_`cbefnhbekfcgeic`]b]_eadmjhfgjhgmncifhogdbdaXTQSUTWY\bdjmkjkoprsunsromrprU>DIHDB@=9Grc<2*Xz@,-8>@C?;64G~̿}sp|넅}󎋈oszwks{wdYj^xz`@[vs|9%!飗hYU]_][ca_ge\[YZ^Y[\USZ[\YV]acfa]^\dfjrlf`\^aeijkxynlhlehec`_ed\Z[WY[]^_cb^\`fc`hnjpoje`edcdbZ_a^\Z\_[^WSTX[_cabjonijknprprsmomnkXQJGC@>9DirMJ3(0CE@<BEA917CAž|{mgx{~ruӋwltsjbknYl|nZVmqyr!飕qs_\_XQOTY^_\[\^_b[^a]\[hfdgdeaZfe[^`ki`c_]Y[_gbU\c`b_^\[\WZ_bca_\X]dab`_^eh^ab_Y]\X\[\^Z^fh`Z^WXdh`]SP\_acgjonjhnloikmpnmutqrpZECHJHEA?9>auK5-{^2%+6>@CFC:23Akzʽwr}yz}zzpudaYe}}l}n[_lzynyytvhxpnuwvr!u{d][^YX`b`d_]c^cf`_\X]_ac`d^STNQPS]^ec]b\a`dgb]florlieflcalmcmsmif^ebZ_`ib`_\_fd`c_`[ec`^VZYURPZ\ZX[]_aekoliejmqogagnoprqnsiPEGKIEC@3uE)")5;KynJ5.p~Z=17?DGE?603Gxſüzxr}}덃|y둒y[Sh`ejlm][dwv}j`ov{nn|9%!صvf^XUVZ_ZYZUVZXWXSX^]\`b`[X[`ckeac_`ebchbfecldacjhefifc`a`c`gc`b^]ZYZX\b`cefc\[ab^ba_ea]^\c_QOSPMRSW]_`egkmomlihlqrptqm\ILMJFA>:FlmK:q;'19=?EGFA604CZj`ŵ{r|x~xv}~rdi[Rfhq]Patuvagryt{SZ~{|9%!ڤoVQSVTVa^_cdigdgacfafkidgbi`ec`ab^e_bg_^ZU\b`_cbcg^[_ba_afc`bcacb_cfcdgeje\^]_babg]_`[XR]X[RU]\XYXZ_b`fklklqpkmolhji_RGKMKGC@DGHA913GnvZGDp²Ʋٽ˿}s{ut󈊈}z{npwgelngaJaPDGNQWHat~zuq}PCn}9%! ➓´}c`]_^_cfaekbc`^_daZX[^Z[Z[YW[_\c`gd^[]_hbfighkedafjbdceced\^`cedh^X^\[]ZY^Z^Ya_d^Y]SUTV^YZXVZ\`blhfmrolminlhjcHDKNLHEAH]VUOLcby{um_^hu|9%!閍²½`XUPTS\`_`]VY_]b`[^`^_`c_a]bdbfihdhX\b`d`_da]^]ba\[a`^_]_[XWTZ_`[a`[Y_`_]bab_[a^]b`bYTYOPRPSQV^_ba`kjdegmnjnlihk_INLIFC=?d\<2-m_:.5@DGE<40X_BPg?(09@A@DHIE=3-7M`LB4>Skl]Jiȵ¸yz}҅zwq􆊉{d}xYgP2:R242+5I=.BjxO6.=oB1/;BEIC71:`sn̿n>GW:&.Zg]=CǼŷǼý{|~{򛒏v|{x񉆂zb_`cX<&(0GN=B+$ %&!343DH]rtrj{tPI>Tlz9%!ndqq_gwd\XWZX\`_afed`glecdeaelfabhb`ba`b\]bf`_]_`_c\ZX[_]\ZX^\Z]_[]\X^_^][^_[\V]_Y[WTNPSOU]_bfiopmkjkebUFNLHDA?QoR?ed7).8;=AGKHB826GҩͮkhnO3N~IFUmx~y~}}~}szy򓑊tbw鄅~rpn`^Z=)-/8.(E9$! 3TI2,5BG:4Ps}sigl`OLewyr!{hm{_^x򲳹g[UX\Y[_bda\]`][c^a\_ZXUYV[XVZ_\^]_bcabeabclfdgjeg_\Z^bafgmdY^cZ[\YUYRTROMPNOX[_abaiolihgf_MDLNJGD@=W~xV<2/k|S819BFKC:13Y}|ű]RE@%#CPYmpVIWOKIekt{~򅆇}~|zvup{qs茎vo~|{}ghdfQ6).)+$%8-DK,0>IQ=4U{ydnmhZqt{|r!~h{}aUz_QRPOV[_]Y]\_gc`db`b`bibacdfedcgdehcijgmg`_b`Y[\achb]\Y[UVYVZ^`ebYUY^ZXVTSXY^[YXU]XY[ROYdegimlkjgeaSHMOLHD@>EZnY?PsG*)36IRP{}²wgo{|񆇁|~z~󌆇Ėthj_:$+/',% *B' @['!"+xuaGDkqjwxpjq}r!򦢐mh|aX{fic]_e_dfaeb^a^Y\`^][UXYX][\WT[Z[Y[Z^da^\][_`Z_ab`a`X[_][\]`]X]`f`_Z\]XT]aZ[WQRPQRPRTOV^cfegihikbOFMPOJEB?>\s^J8-RjA3:CILE;7:]u<"ED;DG>TM+D>274-6;JgipyaQRY~uot{~~vzˑvsvqjM)#*3(-&^QC=-38d""Lz:8`fZdwtysvrvski9%)gssn}mT\e]SUWSMIRZ[_a]_ZYaca_acb_]\`acaba`b^be`elinldc`gecehdZ[]\_\Z\VXYVWYTSTXVQTYXUWVQRSUTV^`cfkhcfgUEIQPLID>?FQBKhlXRO47XVF=DKMLE:2,FƾÙo[dSGQ[R1*("$'-=H/$#0(NaB+CD9BWctduzlv}|}y{q}~ozxz~y͐u~r\ija>$#$"!/,!+)&+YsqF5%.{^ 2@i_. q|}vw9%6hݨyUJMB@sɻǫva^VZXU[SRTUTW[WVZVX[ZYXVZ\^_[\]YW[^Z\]^`fgc^acabaeg`baceadbalpia\VZ_^YV^]YUTQRXVQMNUTY]_dfbTEINOLHC?CYnY=2`X4-9DKOMD738NĹØ¿ͷŝe_bB$!(:4HI6-,3ZGMF94>u{z~zʉ}xsx~|w{zw󆋆|nsc[H)# )@gO&T|^e`/)+u\#Zinl7Yz\hef9%7hߧ{~~\LD=F~·wYW\acaY`fhjefa_ea_b_\fc`_\bdbfagjhcfgbda\X^[\X]\XVTUYZSVYUTRQSQPSUSLINORTRQSQMOSZ]W]`WGCLOLHE?AUeWGaV4EHDCKOND4$'Vʞɷ򮠮ȕZaYH690%DXDBTA(-DV^Yn\qmD&7K^i}}x{~~~}|zw~|r򐍂vteA%#")!R\5jC&AsC(#$i_%"0pG-LmK'PCNf_9%7g ݩsaiukWLA:D¾qfg[\Yca]VWYX^ZX\XWYWTVZ^XUTRUVZ_\]ba[^a_`a_^_deaY]Y]`VZ^]b\Z^[URXPU^UZXQTQX[R]\_ZKDIMLHDA?Qi]K;3oT7BLPG6*2KNǙvmU-#:F07:AIU]R[I%0[rW^pNHKC.(7Tkxjnow{}{|ty|{sftzv~q|scpma:$#$ *;x|;")g_%Te'Ex54gnV#dqg9%7gwPbdSNPWƹÿʏh_WRWUT`]V[\U]a_`^b`^`ga^_^_][ebi^X[_`befc`ca[aZ]Z[YXYXUSVYXSPSQTSPLMNOLNYTMS]ZYZH?CJHDA?HYVG@xj:2?GHLPJ>8;J¾ÝBSw[JUulHbc*/Å8&AH%0EXjMRn~{z}~}|rjs~xpw{鈌ujeY/#)3{q1#*FGEA=DV[R=4ksR=AKRLA:_ȵ½ƨȫ̗bTkem~bk>C6A6H<(CUestjtW`~z{󎏌~zstxz}~vkL(#$! '-VB]b5+qsoter[& r|uF$Tr6gwn_YPkᳯΨqa^_\Z[`^WXWRYW]aZ[YWYWX[YZ[ZY[^_YZ_ahjhgkfabca`b[TY[^_]Y[QTZWSUW[SPOLOSOMFIUWK?;AD@>EW[I:=y@0;FMRSMC@\j˽¹ǸŠYLνŷ}JHlTpQ6<*1HFLUZnl[sXECUvy{vz~xrs}󄋏~|{x~󁘝̈yelnc<%#$ % ih*!_c:,g~Q/$W?!:arMa}6Ii7 'wr)h𨝍{ny}w~w`yθuliaV]_YW_^YU\eYQSWTRPUTNJPSNRTVPMRZaVWQPQVRPOMONOIPYXZ]^[ZRNOPXYU[_YVSVWVG:>BC@´ƼʹȾ˫ȿzgbLkg+"C[nk]\gqWaD?9dyocx}w}yjuz}vospn~sndW0$#!/$$0rU.#a\xq;QB$?kV]G[ Wr)ht[Zb^OUYV¾żőRHGMNPQNMLOKGINPIKOMKNOLRTQPOX\X]_b`Z\h^`cg^_hc]_\VZ`[c`\TQTPQPVWPKMNRPQMHJONLOPM=;?A@;=Nc`M<8{~N5=IOTQD@UõʹÿжýνŒtQZfj8;Eghk{uVUYCPXcZjm{zoce^bz}ytlbW`w~|luꎒ|wy~ɁxnhO)#$ GqiFY]>4 %aw:! DG",nV&+l:,[r) j񫨇ZOWL8=<=BA@>?@CBCFDGBFIFEDLNIDIOQLHLGMRMLNSQSY\ZSORUWTUQRY[XQL?7;?@?:JhaFVfhTVm}}|r|}wu`v{rnfI(#$!*RrZ0+ Hbs]-  2J .T) JkmwKf9%5ik^WS\QT̙QABABACBCBCBCDCEDEFGHFGFGFGIHIKIHFHJIHEHGA@?<=A?@=87;=;8B`fUQM8\jRADMQPG7=yþ˾˼ź½ǵ¦liwmhmI@JAEF23TN,&+O^=NY]kXoILKZUZYd_|卌~w}~닏}{ia_bN*#$ IvsfJ!yN3kY! Nk.!uiMk?#e{K)D9%6h񨠜r`_cfkZ\본½c˝R?@?>?>=>?>?@?@ABCBCDCDEFGHIJKLMLMLNMNMKG<875=QiYA4dP79EKRJ@EZrʽ¾Ƶɾ÷f:8HXOi[NXYO4#&EM$)H\oz\ft_2*Uyztv|{w|zwqbehK)&3! Sl9Llcnz?-mPHuwb?mw.U`<]pnY)/{9%7g񬪜onkXPSZXIap̛gVE?>?>=>=>?>?@?@A@?@A@A@BABCBCBCDCBA?3-9WeSBQsI8?FEJPQJ<;QδŰ{Ƶg{Z3;85=?=>=;:>?@?=>@A@BA@A@A@>?><:60CjgON:GmXA?ELOKA?QƲ˻³̛U.&?5BKXTNAHXVS;LA$).J^_LXPnI=QfJ8.('Fy~{oeaQPJER{r]WdwvǏnbdeE&5N%uT %wI''~Z&*}o!Wp6!\](,oB!M9%7g}mnhot]\SONFpȾνU=B;2320-&,;<541-'*8<76530&)8>97873*8?=;<;6.,;A@>?<8.0?CA@=36AECB@=5<DA@<6=CHMIB9L_ʹžð¼ƋJ%#%COR^P39QIAD5?@0" 18=5F=SY/)S=G6#5NQB2A`d]XRLH]an|b^DTvnzxywquv~xgfhD&2I#wI 4y?! [l/&xw' #jU) ;f2 hS5r7g y^]xݭrWbhPDzǾijUKL?6530+/=<4320.(*;=4320.(':?6321/'&8?7540(&7?:8751'):@<;85(,=@?=5*3@C@A@8-5>4RX<?>EIGA7:k¿ν񾲣ľ¾ʯ`2 '%27FA?C76IR;-41.,"3A,5012=(AE)42,CUglN=DRFPYZ^INY\XGRuvx|󊋉~|uqfB&5M% wH9t5qRpz$ Gl/!j8M`+r6gzt맛|]Ucj^QľͣT@B@?@?<>?>=>=<8;?>;<:7=:843>?:;83>@;8:9612?@987/3B?9:85+6C>784,7=0O[=17>BD:15wƿ˽¿h&4Ukhmzb[J67IH?2(9(2S[=2HOXQT]YcV\hnW[SgLFTVEHKBWXNZtzrqTZtXIlt~x~vp]Z_TBRaUtr)h{٥weclXZƽŻs6058=><;7658747:=>=><>=:;>:;>?@A@BCDCEFEFGHIJKLKLMLMNONKHFA91565Bf¾ʿƻξɼT%?kl_eovnmcTJ\hPZG3'>F<>NY_SEZXfdYFaSB7<4651;?<634763/6<=:876<6432')157549<4:59;727@B@?<961('.@\x¿±ĸýƽZ^{bhwil[rmhUFMYZuyG#C(#&9:UD8DM[ZrgFC7.5>DB@XL?CKCMHEXa`TVdWP]WgrtysijneV\bJFJOmsqwxr_D9AED12DKXO@ iE Mc" M> x? _W )q7dr!䭮y}ogvt|菎gXVXsοxP>=ACB@>8:<>?@<9;?@?@BA@>?<48;9;<958=?B=890.2474856782:4.026/,)$'%!#?˾Ÿµúִ;Ÿ~pywxobndWfs}aWKN68?RujF2% 'B&>)B* 8@PFRL?2J\EBO_]dbSU=9WIYdgWFLbDGW]cphe_cfeUNR]_c^Vltoxvnfhtq\NAH`KGCIKZdZ756mZ"$nG GB >x1jQ .r3fr!u؄sZMowty|vs{wu|}sqkVPx˲u[HEFA@?<>C@C@:=:78>?C@>;=?>?=?@<8;?=?@:;=<>94:?;6/-/.(+lȽ̟Ǹʬɲrob}j{oqmODbgS`farqp]QSR_iki_bhd/6WPCR<%/@A02%!#93#.9BC=?JCFQ]eYJGQKBFZW]cf[Lf\IPVQ^ce]Pa\`Zdnd`X`pia_U_[RjnTOR\vf[heXhX[t`k3Dx=:HxcuI8t/jr+j 뮩jtzvwn^`dkqlvodfeglqop]PúʶyQA@A?>@A@=?ED@?A><>?@=?A@<;?@ACDFDJHCDAEA=?=>BDEA=<8>DGB=:57605ɻƫaMW`yyfbc^hsthfa_m_bh?Ll`_W`a]SyUSP=5Gc~iUvy89O5AQ5*9^\fjO)+MN');KJ<4*,54FTdbL8?CD?:8BFADA?@BA?<:<>ACDB@?@>:987?@A@FB@?=?@=<>?>?<;?@=<>=>?>?@?@>=?@=<;9;>B@BEA@=<BA?<9?>6HɿͼŊNjꩈ{pU@JQJNSJ;76=NO4+R^arcJLsVQZD& +=4:90bg]VW[Yktovtdegh`Y^K/)%*.+.->43Oi^L;H\lp\UWDWhfa^MXWE85KOKGO9,31<@C65BPWN\f\ULIS_TMHIKIWcalmB.RP>PVln7)fY3|Y"'Kqh(1r)hߦt}lj]MJBT][hnkje`[V^jdflga_]^TGNȵ^Yi[HB@FHB?<@>?<?>=?<>?@?=>B@95<@<@B@ACF@<=BEFBED=BGIHEIC>?A8S½ŷrs«}rjQN\_Vka[G(,HJ6+!2.4UNKZEF;>:,!7* " 1KEdcV]Zh{`cxqlqP>IG5,#'#%8?D`teVRX[V[VOCLeWRXOQEBEQB;EUNIC50(#)1$%7MajfXYWZUNSkeZW_o[b^P_Y=:LI=?>Lt_!(c~58}rH!@r)g孬qo~zpnZCKP\^W_l~yh`VPY`b_`]SD?S¿ȿɼqLCDJB<:867;<:78;9;=?<>;BCD@?DGFB@FEABFIHKEAC=\ǻ½śpwyƟnldB_WPL_@FH&*A>3>0%!,34GLGA>9=D/&(0KY2#-':ng\japlnTV[O@IWdK-/QFKXH2*@9amNM=>X:A2<4*'0<=<=98H?,*"$$*!"5IVUOU]TELegWDHg\icSMPGNZgkcA$/}l! Nn,PzDNrpxôr)gᮯpoek^DAJVZMN]lxuiXOYa`\ZTOHIJCZ˾棗t_eda`^XTVY[ZVMLNHDFKIHGFLIGDCB??GAB=>=?BACBEF@?CEFGJIGIMJDFG@mʡĿľɿƔ}wZn|]eoprUWF?@C048*0FJAXbI=.,8SNKwxJ$(./_;";@,(VRadTa^[NZ]S;@L\_?*!(%$!+1BW]\{u[baJO_O;,46(*(')6M53:>A.' *6&'7QKNX`X?DbH?JB>V\J@BK@JWdm^[MEsd10"EjtU!v]&%Jör)g~ntwjbheH:G_iTGYl|~mYKJT_]VKGRWVUE9^ŻͶ𣚛잜xgiumsz݀wpspljwpkzxd][U`ed_X]XW`c]ØļsoNh]?hsngOH5,BT:2H8FPDBC/5,.+.;@+'-3Nhnd`d^_U>;=4*%,53*+89>I@BI.! "&.@)6VPE735.8;'+QP=TvkTZYPbTOLbciHQg\gY 2nLA}8){r)g줇rfcv~|r_m}_>K^R@Ecztr_PLNQIDHSQHIGkÿȸ󢙞ɿʹͧznjk~lUtwc\DJTQja72WlOAf|^L8@AWqQ:ÝE+)*+N_^n~jT\S>8>5%*(6746265.30KkJ6''" 7IFKXWIS,37.,)"*"(16=CNM@>?#"-&!%F>'CB%+DN@1%#.0($'7Hagtc`_I2+63Tl[JUTg~F7mV~^$>r*g䬟oj`fysd^hwpX\dRD]kw{^Y^WPLILRO<19M|ȷ|򞝟ĶԻȼ|ωbJVftxnki]UTCHu|pv{bMiY8IKNXM2<[_lqa.DE1@VaxknXVRWIA74F916#$+/)*0+.85.F6!#%&%2@=TiKE+5'#"+5.$&"0V?8ZzuRs\)>4f²r*g󮬭rkoj^Wgvnqsfaerkl`SPICJPLMI9+*7NĻܟ蝣ʻȤeS\oI@JRUfbcXQXQ_sF^NE=LS\cTXReY68?FT\Hd\kZ_Q6;?:3C2(%96.&.!+G/H3)7@TXntqM-8-%A:?7)&/64*'$*N]>:3#(!+&3'493*=QfcbZC8<:GMbqbLWpxjCJt=W~E!2r+gwi\XVdplpwqujbve`^YKHC@B?>/"(-2OꑛޟεûңrzŸTO_V>4AD7E9C<;NZfpon9Yanp|ujz¿¹wI&)2-5CnrdXWlW7/&).B:DC@-'>\CA4ZU) '4@6(-0PJbxtH3+7J^V:+.3LZ@;31)&IT8/3+AK,"##"-6.'4=VPQNX^S5&,:CMTkmRBFNhmJByYVGOrAdïr* h߯zs{udcb\U^jsyrtrik_^XQBAFAC@5(!,-0Rºһ̾{h󧤝ީͰƲ́QX~¿YJ<4=ZD52NKB2QSMdmjmt_i}ũc:$76-/'5JRSnhMQHLM.)+.3<2+0/\bSJ8278&"/:72;hZjXyp3J=OryQ5+'+>MNOWXPR<70<4./8DB43('#&.-8QYjfQN\M6=NC=QNQaL>NQs}RXywImGOn6Cr)hˣ~ihzlaWR`px|qssYKFSYKCIH@8,'*0?RΈaǾНſɼ̱եVeā¾m;61Tw[L_mIP·yhfdcamlroZwNO:T|Q.0ik]H)/<7BejF4.6DTWC*$-$=VFRZR[\B%#&2Pdyzq?YidK<78;9@dqlotoimfD16,*+&,):8#CIURZjia\NMk])/PRH;JLNQNZ@IR5Aaq; Onr) iyp|qUkzjZQ]mim~R9AMVcbK797.13.5Kδmĵ뤣{~ɨԸrd«þ|aqkzb~hn»_^chdYplsedǂkPL+#Ywylz}g9#.1-6N9-;@HUKD%". 9H867082''3(<6 %*?q{yph\IOA1*47%!^vxjY=,=5*,& 5\gOM7*N[bUX[\PVLFMI>HOAKRnO=DM_TABGRuqw7 *yƱr)trp~^N]nlZ^gc]dojsK4KVW\WMD@>6/5=?Uʝ~ǽ𕓠𝣠ؙ|͢ΧkƁ˹Ǧ¨lT{jcu{r~Tq}lRgktjpKFoB0vjaM6>)4* CI?:G=5<7:)#5'27=#"%3#&>C&(! =MPVI3;9?+1+$,F6*Mwh.!4>IN6-,+6_l}hK&M_YXTJNGD84<4EOHD/>KcoF4qK%" kr!ljw}w}gJ@Pa^cYQclmnsyiA-?T_S9?H?B=/9JFEzɑ{ƻ󌏎՞ʿŘƍ˿ŪjXye~djleqm}bVSiluyXqxN3SbjMi_5:CEN3)RO<84*&/*#52DG@)*H81<.*(*&!!'3%4@(% $/72-$'-DFLdpyT5mzj8?VYNC/+&0,#",\V:213AfxY8@1.9I[E, \h.'kyqr!T^soym^w|YPbinwhV]fntu{jR9CHB:J~ƍ{ƹ󜗙򙖓𮭬󫭣ֽ{ǶtľŽõƬm\v[~zdRTidcbQ,6\N)-"/4.#!$420>80*@34*&6A0.=@[]cmIDRmuy|Y*9f{cK3)" 3&4r?/sya[r.lZTooej~yf_cetx[]jsxy|t^U^mvh_NEUdaRCB6,5;2CIovLCOL4?F&=@E8$VqibZ]rf@. %&670;KQDch^=+:A+#$! #41IJPOWneLF<#-$GSTM;17JBHA>*3ix}iQ=M\HYT/\b8'"&/ ?kGD]KB.8B(#+,0djYPNr% i\[nzVK_hkt`Tcv~wO<8?mz_gz`]_ZaC7HTP)L[98HVf~~j[WMJr$hkdXdfTQ`fkdeifhqvY2'Drmj~wdPMV[dpX48L\S>;23>LYNDB~ѥĿ̼ﮦÚaKIjsW[XK5Zƿ񼕣{hkpýƶkjeuvgfOQNRDB8JPsmEKLVTOST@MB6B5.-(!18;J69>LI^ULMRNYenA07+$"/*! *+0@Ua`VD=<;>ǡϷ󔓠ve\UZhŷo~z\VZVWbUl_nqcXug|ʷeR]fY][YRPefacvdj|lzokteQ6)&3G:071/!PJ6*'8?'D:FNcb^MCH0MvpjlZQFaGQR%,)#0&Sl]1061 !#3J\SB?:MkSp}s9(I?/2?613,K~g]P@'JpbC;JbIeK!2G*1cr}離~ufWCEUHFIV\]r# g[ZYTFHal^TOJXf`VYi^C5KRĢͭ򚞛{`PKJKORQR\uЍpbkcYQLONIDvYbZTNse}mf]JTPc_N]heQBD\aV9;98?V^db].6?<987=BMZRȽaNKLQ`ouz|o哸tvrU[em]OC=@Lit]_trnYc]XCrz~^Ok|fk{dzsU`aewu[VRGCEPR[Ok}hUSTc\35JD>')'*!.+.6*&$.<4KZM?.(.**<7$-QYDW_WD+(AH/)Z]=:$>-"*CK.'@OH5GgmiZH01XsSOtTMY*`T?Xx}zren{^:*%(#$$ :zyqogVRSYXN^lfYZYWr# gjmhgk\LV^bcYUY^ZW^O:Knsz|lywipswbCLM=BOALGKLMNSKŸ¿ƾל{YLKMLXn|{wzZbxgZfrdcjV:+2=FHB[y}tkfW_`nikwt`^leJL]cd]jl^Gt{PB>S]_hWdSXk^R=Xigh]^caXSVQL6)(.$30QG*%7:KPO@-$/B6FHD>?CD1%Q[\I3%$,JOptm8)LF+97%074tu^SYhjraECXeJTGU46=#1W^_cfd_WRQbi]ZPY\W]lpmaPLr# hk\Veb\_[`[Y^G7DXR^aO9@mwjwzjlytged^RZ]NE:7EGADU`R?{Ⱥ̿򚋅xTKLKJILSZ_cnleyZUlkYKNV^a`ogL@5)0,2@Me}t_^Z`o~~}plml_UYpnljtk\[_pqiG]gbfj}jZgbaP`eZlWLXRUJWSL5&!1=F`pM-#-?K7J?xʽž㍎XLMLIJGA6anMPdq{euy_aleywbleRO[b`PVfeW@MSPG9&.Din\TJPj|mX_fjbT^lheqnfmrbMT^_OW@1Vrqid`\_npyrsZ>ZMRTDSQKTL@-#:L_evrL3,1.,.CAGMOSVSPOL-6KIVUH@)-2*+&!Vj@&",FNC'("," 7NOQPG@?-,n}wuy}ohbP8.]_)! &)7Z@!*HXcUIPNT{zeu`dklgfgaTQr$im`RHL`fXHLTel_\YW]ef`O@DWymWROHSUQH?OhbQUlsbOFGB<>:{˽񧲽™~㍌_LMKIH?3+']o@5:Km{wtb\^fj|rWICHBCTeYCLU`L;n}b?'1JWX`gVJD7L`xf^QXn{jK`tf`leOaWD5Mpb=1*(Db\USpwi`eXbJ7HDQV[ZRIXYPL7&5KPO[`nlH=9)! #?NLCKL?.1:A;IQU_S@98LP7)! +jX"'341$!)0'$#),5=@4QbNF^1-!&J|{z[/2C6E`UD4)90( )QVmeJIKIfwoo[^oqrnifer%g_b]IEPULGMOY\W\QM\meP>0>`lfTKPWa]KFSQYkbRT[aQ;UgO?>G܌pOKLHJ9-+(&\nL<'#9~wyrhXML[_S[RC>FKNRVTKEF;C>E]mpS@610CNVWRSWN^laMvsfcgnXgf^Y^`CFC.CFeb5#/41G@>SedfZCBHW?8MT_NE8ZE?:SX`]SUX^]P[M'7[WNMYEZ`\X7%.;UMHg{j_v^jF"@ay|sI+&;ae^>-.*4W=&!'*QV^cVPORf{vstsfY]gquxqnr'gV`H9H\TNZREN`oqbVXUH;3;>8VbcZGI>FRSB@Z[VQF.1R\_WPhUBEZf\X^YfwaHY`VtrNFkQ9SOGJQOUQ>LG&$*'-)$+.<3&B: 6=Ed`9 @^uyX+>4#5bpኌ]) 5SvplwtV7:cL'!Rujfd][\jx|tc[eyxutr!^aYD/7SRDMSVQIR`lk]QVWH>CHA=9;=ISJNYil\RYRHDBDOTE'8CA2-2>w̽ɻ眙cMKI?.,2c|z~_WdeNVbo~dxtWPHQP<+:LMFJLQPX\E9=D8OR:-@NJlJ3UWQTZKOIA>;:?1+./62:-8NTNOM[i^cu\="*0MhqeXV[OTf_WibecQcb_gOAEQYUQCQU`]jdhcli\OIBLRPME:>2AB:;+-&$07BPWRA2#1=# "*]@:]>85&*0BaitF ?5$%U{~rpp2#5!,JPRPD0OB51 )7$>iwjuigqp`X^bZab`jlr!EJW[R=8C=AKP^h^PL*#*&(FRP]R=.IdF5&Jg`oe]W>5GNUs~Q& :8.0*'@s͖ymV2aN0<]uB)S9(%$@?EoqMBdpjfg]CDCFP[hTMr.lQURQYRBACB?UjbQPD8GY\J82.6C?=HX[XgfYZU>9^s^XR:5FH?74jŻʼ쒏Җ{RJOE1)&0xg6(U{O8;WNVTGR[_`flY@9@RYFCT=1<@BCAOWRMC6HQRJHDLPX_G?L@/08609MP)M@)*5QN-:Rnlql_VrxD73NiklcS[^iuKBSX?6(%9dcPU[XowxjOJW_^\KP[VdJ:26+$#'03'/6/;B+-51)2CFMI1*");/7'!#!GdQ5;MGknWiX>462(-.&>pqb|yZLhqc'0H5/!"2V{}cXbrystq^PA9ARca[Yr, jmU5D^YFHMCJ_gh^H@H?8DLHSU=EWTSajXEFOZG;MfbPT]TKSJ0"(oﰽʽ猋뜘uPKWC-)'EvD-+Uv<$(FQPSHMY`gEKfrN1D@');IBJVMVlWEQR]_V9'/@vƿƶuPO]fy~~`SC=PNE\jixuzmOPAC<,:@><5HUPFGJIBFQ@.'-1;PSTXVOBOd_YbZ:#"-@|¸ŵ{؉~sPVay졟yT=AMC@7@Oo~}wgoK*0EQA34AO?INQLJ?20&$3.2YmRIESF8$!*5GFMqPS~|ZTQGHNLUO9SngNVG-,<=@:416@F@Nio[Y]^bWLRTNCHQ`RW3>cN.+', ! 1Xg]TL_V;:GNGE91-(03%)!/7#=xlR4 '4C3/'%B|qzu~vw|xvyܖ~ow8/13)/(WaRZdv}b_T=6=GT^ar*hJ?7@Xl_LMUNH:Dfj^T`ZUQLOD>C;*1R_NRWUeb^TFN^ZCAP3!3ErɻƗtP^kb]\Xtd[Xcc]iquOBGKE?+)4OhrxZ=GCMOX_GLPMIC/(#)742HOn~^QL[G90)'(/847EHTYXI?@GB4HlpWN^QCQJLMFH?6KTNTMRhZLTZRH9327608Blɼ̼󋊏oN_lN/'Tr<2#4n6&7N|{[D?9/8)#6J\fjg{iMD@DRVWRLKUYO4.)+(')3.6GFJIS[O3&(,129Q]nwYOPTO`dN;X]Xcpg\YZLMPMWB4,0)23D:+IN7Z\WC:LM7"6E:/5.(5E?;.05=/+.6)0=1=:OBIC.' -7?B70<7"!( (='&*2/&)?mr{{ށ~OBVjn`bgwjSTbjV]tukakcIEJNWZr)gA@CHJKPSIDJUTEL_VEIWTHFQVUZ][G2@OQXS=LqoTNSWSHC7MR7&jμƿうpR]kM+'(Tr@6$5i@2=Pyf|XUC1E?)*;LOXYVufc`SMIKVXHBIE@99KVQ9&Fwp;GU<675NI8%-67, 7BA6>:;?8,%)/@<>&#FWK>7:9io`q6&/H-0/)   %$->76RrDMA5UTG\jK[x|z~lh~fxwx~vz|nlvwvqrgsk]M_PZkj`hiPNOLHFr)gCB><F@FTQ[fs`CIG?AM[SLJSN8/;AGPD?[tjUPJMST\Q?=7-kҾſƏwW^iO-('QrH?+`v~pu{rwx}|iey~wty~|{ԇws|jhsznTO_txnuocZbjWKIr)gOJBFKD?PegcpeD:?NJHcrWC?;=AC628BTRMTSLGMB5CRQIHC1(]ҽȽx^bjN+#%HcOF9BYJL70x_\c]_RqjSOLPE:@\da|iH5/5AJIO;*90*>JA?SXHFKPEP`aMBK=07&987AEAHIFH]J='#423RLHAF'#3+%+202' DC610&DbB! 4, (1&27k~ztvӈ{q{ldezz厛vbU\wpTIV|dun^[e{V<7r)gMPGDF47Ujgagzu`PK>;UaNYl[L>656BLHMSXVWMHPUH75FOY`K:,^վ~YV[P=78YkOGQRM=818~jadrvlQD3/H=UxhE?/#,OxaE=0'+@GB=HEMPC:FPNBLPOC&2@YdôsmpcZ?0AIG8@QR=-:\x^ALYO9=,LJ/C=:B@8:74H@GO8!*4FL142)/:*$I>1,L6&7MJ5*BH)"*= ',D7$&0Dw~ztpy􂉌w~珋z}yv}zYIo{~xrzn^\r)g:;9/&<^kaXos`RC7,CTNVXNKEAFCObVC;8CMLEMSJCH@BRJ649,aؿ™z~}y|Ú|~{v[WNijaSL36_~jyqzvZ9*1G^VPO?:uUWJ.!1IG=<;AMIHSPLH>9GWJF,!&@ONl~x`ZO?A@;48aVD)*J^T4>A=,V[tWPpfM:8)5013SbG36I;2' +=8/) -?2&#/7"Po>%'+6 '1 D\H-FXyꖊwv~voڋ}|lhnspskJFTfiksfk~}mhr*h0,/6,/KckdiqcYO;1.1BTe]DDKSMISUA/+.(Wpgwq[RJB=FTgtTC96.'&-;ptX`~tyUJ@38/8ELIKjdZauZ0!>F2.5;?EOJECI\OERTM:.%EB6Mxs_ZljV<5XnXM41[ZN>, &Cz\HO?-$3)4B4#/EM:.6)"*'&5>%:67?JWQ=?JNC=9;NSWc`\Y?'*6:0N²󒠛ǒ{R^yq\RJ<1AM[hK@641' (^xdHVayplpmgJ4D94IV@)Lje9*(9A0'195=Le\^Q[jK-AO:;76;4,3FE2+(-AQSWXE5.".43)VĴޑpPWoqWVODJHGMDCKC37A6aiV9<=_`_]WxeUrQ1-4@5*06:ec2"*696:9'!'?UO@KR^K@KI=2K\fsdSC=2!"OPDY]gFPsI-(0=[yr_]bj463$&4&%=VJ]># /E*,2?;6JS;LB!5<#'+3$ $! '7M<@?kx􃄊}z~򋍃z~vtwy~ۀpur~s~cQkeguzf`r-lF>7UwyvskINWF6-&>agYF769?GJ@,+EL=3,('>I=ONA=AgTCIP>9E[lrz`UWHF5 &FG?E>D>FIBD5,*V_[I7Djq@;0%+8,O{mjK(2BS2(!(/,BF57G13-7(.30" 34$5! 7%Gu~ۂ~zzovg`jabxyxr!^US}vpzaOJA931.BSVQGKSXSF@8XgYSG8=52<9/7;13CLB3[Ƿȵ~⨩|jw|meokbUPMUMSU=?D>$+KJ9+39Yrg;):60,).vSm{SKYo_A",/PL=5M>+#%)9,$5#"/' ,*.X>]}q}}yw|s}stnll}xulhSZsopr!`anlkvk`NDUWD<=2AHA?9OB48BJFTZF7PT\ly~yfS_pdIBJ]cvr]H70AtT:<67>;@LEINL6$@SgQB5-#*;,&@USYH(F2% 546D'4M@UnyN048E=84?]`H+$" %#!# ##""!'C`tzuq~u}䇎}{{~{}|~lgtl]Yr!^hj^\dv[HUNHB8E-"(BP?/'(-4C@7@FBGMK91JahfSPF0*3bǻz{}}}i{vqu_OQbh[WXWMFAC8=H*&@709FE;JQ8*DLQSKMZ^SAGX}^AQnebuvSAAKciYE>B=[aSE4#'@BAC6'!-3DO5GKB1 818-=8+-LH?8SqS0`nH61)&3A>'#&#!%*(&3+".6$+?6!-F-)%&!"!!6nvyl~{}֌|y|~~|z~~皝u{rqlzy~ytpcB9r!nwq[_z~jW@=FI=19CALN7*4VidWE.$'3?9;?ARNA=2A_e{a<2($,Zꓕngqf_fbJC;GVUPLD>469;92*94'4B74>+5I96,BC:ENCFHTA2618;1%(IugNB>=HTZSF:14G?78P7LY]eG3D0"#,)=XP2%;X[?:3F5a@ "',4$33$6E.! "+q}sx{|ႀ{y|܌x}urvqcWUr!fotacoF5$2LF1(;CIZb_NIU`cpkK:8314.+5CINIU`Th{W5-%&S}fWRY\J8%)>MNJOS4#%+AD71#",=@'8:1 $H8*./+DRL?AKQd_XctumjhaTMQNG5BLKMKHD<9:HOG@FRK>AG?68HF4,*+:LA/5TQKQIAB4>[P32MuDfwPDNGS]X9!*Oj\-&GM^LG`B7HXI$-61<1*GC(/F.'=1(7-$20):0!"# $=y~}{w|ؑty\{zw}~uqx}vzjabvofh`VTr!\VY[cvS,/:NYMGOMPUQJELQZeaY_bS?>BC:/0Bf|m;=[WQI4' O˼¥aB<;Q>1:DKOC>C>;(/6+$, #! !;'+65$">JGA92DJLNRM\[KCO\`ZPUNF=1ZTnvqbBKRPR=#+,/ #9Wd*(-&*()?BQ4(-&(<1'%&+ #3P9!&'(#.3?4GoJ*85%1C{y㊏~tnvlostyvqor!`XONMEBNKEPZ_^cidUIOP?I]b[LKMSLNUB,9TfeP9=RG+2LYQPO=+Wĸxw}|aWQ[T=.5.)*)+3729(+'$-/ ./,-&*%'/37>JCMG@:@?-*3IdXL@8CE>3BOJEJA4*"%4>JX\J>?WG-#/7FHL7(3) +PU\[KahnI0>z`j~z_NJCIEBTdrkG780%"#/6)3LC:;54CST@(%1C[pY_PHNPGIM=Sȿ{vz抒wipk]^tbaVK<7,"&"*1!!%)"*935@79@HNTMKFSR<.+1'$0FOKA3%&'.(%0DTUPKRM<:)7=@aG'2=%*)"NY8Arh;#! 4NoqX,D4)07I<.,"+% #&%+2+2ESMB?>@:;4,25DRP[VN`cNEMTI`ʿ̻|}~֑~cmydit\SA2&%) #( $$83,0=L9%-IMJHPTPUN7+!+/4?DC?6-(-?3% AFJLB?MO>(AYNEG*&")!4?WpuwhR; */:*+5PdndJ/)0&1 ,6gdD4BGKB87/)'.#%!/.'*/'%8N^C=@,*0/80.(& /0 >*6.'3" cvy}苉vy|uwu}vhfknowzr!PV]b_VMTba_[UM9$#*=D5;PG?UZNOQTVK?;3+3:AKPNICMa\GM\J;eͿzԈ~o`xyfVXH@(.!$,/0)!'21-#*'/APK<;LPFDJ=>'!" (8017568'%-69( )2<:)1S_?0;QVYWJ" '%,Ap{±YQOC/!1=>7MPS`\RO@%.BaF4/,:I8HVjUX8+I\VRI),H:?X>CW9" '5+#-$#+ +' ! " '(8jtnQA63536,2;9>TZQFHLEFCDdͿɿ{t\dmncT<&#%-/:*/0,$$!)6):FD:)"8FBA=ABFA:-"&% %,%.&!(" (8&$'=JB=8)#",1HBC**0:4*SŧP;61%)EYD?RJ\iG:02569XZKMQysWTS]XMR\TGA?+"5KSiagkW. !)/4" 4"*!&+ !$.?bwrsl{z~zrog`W[irvr!WK9AUPFHYbMBQ`L56GW[_`C'(,0HYH4%!(,-393-0:?97A?9>:>A5X~l_SW^UI5$)/)2;HO;,1+$%"%0$"(/6=<4<=?A>I=2&%*&+#!7@A3*"$+ /5"$*;IC6:(/-,CA-"*% %JGiٿrYD3.1HRV0.FSk[26DBK8;O;O]ixrZTYDSicVWEB12%0XhVS@90 OhM6 !"* $,! $# (6cqxy{~`NOVkw_U\aV[kihr!}iILF7DUI/0>=4,(1IPJ<'*NYGC5+2:A3')05>GD;.'),=B8aԿ˿󓌑bGLVQG(17@=A[ZN7%  " $-DNB>B=>DAB86%%+=:8?VJ5/&'!%45,/.73-(*FD'EpgxlVE8%)2BO;-CQhTCLYEKP0)!DWghb\XTkiYLJE>;72$&")04CD1*%$" 7'"3H=.8T\7%420?dT9'%*#.3-53CaTMabgHC9+2"N^V?KIA?B1:ENG?82/9) -8,$# "6G2.239FB3%+#$-0$"&!'(3@F\mjwlPX_|{_:.)4mbH%2K=%23;68083DC:.)LP\K7(DI5$ ( !'#32$ Qe. $'72!Kz}|tc`nqmjb_b`YNQWYr!fd^N804@>9FS]kh[@7BIORD9IVO>2+,7MYH81:>78>JWQCBIMG?OwԼps̾Ӌm\RUVUXRFGNKG2 ")'3C>'%HNHDJ@=<=G?9CB913:@3D" '"".&/.&AG0!(F?#&#!  #+1:#! %*LX[eaS]R@:CPijWCFK`yjF'5H3%")(1L.B1!$%-?Q;0,Nk{~|olp~ulcux~qr||fb_^r!fjaRG>;89:P`e~{f`N."&*& )1.,./FUIASD&"/.+ -40!& /OB%,.&!+1.;'DA#%4;F%),&-JNelX<.2578>B40F^_bxH4 #4- )6"<`J*"BPV4" "*" 5A$(.$#!&/?=ScL=D2dpBQB-&' 7XdS,3Qs튌rkzwpnr!@JSKCGJD;OgriVWB/%"4@F=0+?aY9* &5CMPLIRVF:>B90[Ӡ}z̾y}}wpYC=J>5=4-" -$+PQ.2BC.26AF7@IUFB=BEI:-+6,'"%42,+  %"(+L]X\gf5 01+%%FQC3,4N1$#! +"8G80,(>\[4- ("1(%$RC'+: $4,(-#':muv񐢙tyugOQbz{zr!!%7UaZRLCDSbpeJFKJ;&'.(,;@GPC*7W\OB4&"1BNQVZUB8?HJA@V⼽Μ}mɾ}Y?7-+2($9JR]`H ;IPC3FIC@GD79LVH+1LUT?,*.8>/")&28<;6"0D7HC4+ -.3*$ FTDC.)+"(#&1R\XQO>"'GX7XnGBAU^d\@>+ +0-0-6KVO2'1A($!2))&9:=RUFA<*1."/ @6$%=T,.-:$ %"(*.  -M~{}wgq|~r!>2/N_W\_PM\{hVUOA2N_R[cN2,5;CMUWNB7.%$A\]^TLNK?,#&3PΗsdׁkEKC3, ,/9A019E<6CEJPQJ;7GK67RYUQ4*9LQME?G90-FR5;AKJ<7CF>-0:- '.>72PH<(!(;1RNMOF57/"(Vx{TLJD:(ct< +.*@P[dO2$9&(./B5*%?6QgA *?' :G@$#9D4(bX9 HA;91*$ %ELBy盓}|~nmb`lxr!REG?7=;81"*N`ZHF38KOMQASXE39ITUSNC7H@;( W_8")7KQSJ2$" 0Zp}M !)&  *F@(&%.)diFj`/"4i~oWe^G:qz0Hoagzr!c`X]T>KZ\gk\TJ<3?R<#$2:2*(8VPGSQLN8(5PbmaD1,/+*$Jk^¼ƾy}|}[6;3-(-4.*8FN<-;>6%-HPNDIKCIUE3NQFGM@05EZYXadaR]`kbI1,4"+)4#%!+/)1-"=D$7X@=8CMLE@MTypbtW4/&!#84"&\Ek~sp@ (Durm{r!_bioX6Nri`_P?61=LO@85.252.*'#,>732:@9?H;7IPL;/)%'Yɽif̿}x~~ӎqIH:-*#(08$6.5106.%8O?"-=FOC5=OPDVA!:/(+@YWO^gnWLC8),-087(&.$"%CFH/0FK4&|sbb@A=B7)  -.  *:82"!"Q_:)*85!PH*:1%3$)-DV+3-,4=* <8JB !%'(Kw{t;JbDb~N3# ;)I~vqmzpx|r!FS_g\=`sjSBFP`cSJ;',9BHQVK<357;JSQ^aG1?>'&+1-#"%)7hͷht~PCK8+'! !4I^jRZ]80/'-;NA %05479IRK?ZT1!DaPN\_T>5?DSD4% CO" ;7.%.0 6!=) !105I8GgkR4GeaSC$&4+,3!!%6JACA;867,@%2D& EZlV=KD*!  2./&=Oj~wJ?UOCc~|1Bmn􉑅rd[j|r!O^pf[P:6DKOZhoxkZN5#(=WZYT<9J\hf^b`P>3681("-;5"!2C`»̷j⍎}|z|}wTIN76@9'$(2+.MK2#4D2$%'1>F7*@7#If_g_dX8/' 2XSC:+!)$2# ,"-% 3*5?FKro}phQBX[DJUK* #2LWJ8( %%.)63,/$$H-  $=6)1>QRVL$ *07/@Yl[MN:D]sm)Pxuz|{xtejok{r!U[iR5CK<6DM\qzvhcK& 5?24A@3&0IXbc`ZRJA;F.$/3) !'QŽ˷tŽ~ݒqagYJQ9$93$.#.,E:(&1E=204@87E>GQ4)3-+/&8=61TM>LZ1 %4SRZ6*'!'"%B<(>1@9.'O}}kgX@J`U$LI& 8lL%7ZbR+62#*)9Z0_S!E>*DXjeim^eC7I?@P`XN8 4_PJA@B,0Ta80$ -9QaBGXnyd\C&3  4>('0%,@W/%5`]3Ed^]|sM6f|鑃~w~yv{uqlpcSPr!}X9BA6;/& 0G;"&CVRPV[S:3""!&"BI2"&O_?N9*1<9!,  1y\ZUJT27'! 5jE&,"2 'ANln|Sr|i]PXS57/8^bwo6>?"(H>R=)!Nc@$;168.+'!Ko}r~yrgG"R$ ,$(-%4%!Y9$ '<:C' !1&$8N^WgVAQksfᦇxxokwhbr!tmO?LRGO^fmXK=:@OWQMOXOA4201-2GdbYgosN,"!+:HIOQe¿˷֞}}^T_gD/&!$",:>B,/;WV<2"*2$* '/?:+'4m])!('(7DH>,>, 'Cwpxsdcli:4PY\h]F3 *$FRW"G\)'7D&>PC`wvkboN$)0 GEc~yz虓wy|ypu_X`sxwr!;O`QGNfs|[JB40>VYC9BA5@Z]E8;F\gVAFZsw]CB4"0ITJQcʿͻļ甗}|]W_V6&&)! )AC=(""+<9(FP("]w]C9(#6*#E8/F-)!Gg9(   %HwtshtrkNgaH`efY@& +L=HD%($-+RZ_n{yT#3E# KDUfp{zM -*CN'&,"'#1)LYV)FBG<9;6C_[P\kjuhF9?NOKYmq_K3 !-@IHRT^oTj›荈yݓyb]q5.X> $'#! "  +KB*-;'$4*Iv\<4)$7F71).[eN/)!LV_uvo\b]QTip\>UWNdpsT4+!'**DY~_@' ) &,&.J* ,.+ed*"#+#"HgI%BdSG\뙡~xzzgoprtur!6q\NT^rgwS9;<=:343(:PJ@DEIhj@%!1:5?ZlcL:07BEFGIRWg;b8fžzֈwowe]t:#0CXC ,:$ .>-IXi-;$'2":R^qz{}vwV4 /\J17B  Ur~|~V+.&0R,(@UVf2Oca[L/%?* !%(FYRtG4=@:4Uxq\RV/&T`~}|w{xzr!ZruEQ]aphiL/7?=9<:*"+:HK<3Ys<+EQUF48=?KG9:VadŰ{ɾƾx}􃆐͕y}sy}g`pCFRZzi6#1:$(\I(?<"B.+#9^C8@+KXNJ,(MJVl~uh~d@!-# ),#!#Calh[`f[gZSHa]+5-8L80X|A7B#'#7jrjuzxylieThvtruqs> Ksuvyxkcrh."D.*.#*5+Ecau|{?& JQTiz~tulj}􅔘vtur!LUmnR?DQg`IEFJA=A;5AMF@?>IKTb_YTB)&9F:% .ETU@*MŲĺƾz}ؑk]zr=('#WP0+! /J*(*O`SBQOL3 /%%0%&M}~p2+DkM4Mwmwv1k|pRZmy枆RO^6%"+)3C#:pN\^[ZX_WPEL\3J@+60/6e~P@8-=91dpy}|xr{q|~|J 8nzwC2(>PNB.'/($KsE (D2@HT{zfuz{un`o|{|}w䇘r!]^\UB:Lym;2Sl\IECHa[B;?DNI*0ECB>0,(&N`:#=F@9*&EÿŴŵɿ}~}|}uaTwt?'%&`\@8-.'#*->XNF81341&?kS,)$"9+5;.aM %4.JG Am\<0"-Qz~V :eh*DRaIVnR "#1VE3eIZcT[PgjXJCI3;1*%01i_2,A"29'!.i~yzu{u~zutZ 8zvs|rbHD%9bcQ:1) D`{|}jhYpitvsvԇz}|xuytr!pV;=?<7=OXWZ`d^N>:@G@9?NRYP(DVZL6-%%/2($qf53A,;G2  *PO5UG+1"'23Gy.69aI";eOxR%1q>!*YV&5PROL%>Ƨz~E+inG]\0 &/1+;E_uWM&S2$KUG\dalpXJ:IW9DB7) 16.D9WnuJ&,0**/8Spxlp|vsxyxq|Z 8uythv|vXdvr73o\8,&:[s}|zxwp|zxw𗟒r!LHJ;646BL_oebYH?;=?BT^\B"0MXNC7*#&40("&72-Dfɾƶ»½x}肈whZ{x@#'W\KSZ5()!'#&"2P\I7(!#!JQ"*;M>#'3:ZV,?QH]Y&0O<:JB=eG3svVU\rgekE"*[U8H;DO,"&( G]\d^dXG;7MB\wg:!3AU5)X|jW.6,*'!Qxzx~|j& ,qsl<=_n@;qze7<[B!&Ppzsr|z}x|}r!nslN?BA7AIEMrxgRKENL?>A=74 *BTIY\dh$WL+=;'.@+*=,%+&*#'&3FHZƿ󱴾ƷƘyx{|񋒏|~zq^MD.OS/#)&9E?9GIhnQDQ|pC_p;"(5.B(*:@Z2GưD3I="FHD5sγp8k{|@0SNEgxyciVg]X6;I;+47+6aE1H/41&W|WJidgnY,10Eq|ys`hx>[jQj}i3';4 &=OVTay~tacu~umnorxh^Ycs}gWlr!26?LIF9;XmuZDFJLO^fT=*!#*Dh`bT=_yxjG-[x[Ru|FF21n{M('&)FJOkj{~|ys~vpciu|waI:=Lbqux}x~rie]ilrxdNJpr!:DUTA=8G`_SHFDINXP<. 7UxdhW4 !%3C?2=]\?,.9EKTQXǶž}ux|x~zx~񂒞~{xtsqpztD"(PA&*:LNB0.LknRG`H,A+*`nE%"lBg§cKWEmgYw`2[g\WOWSMB9S8%4K2'\W-6"$1.RX"8Xks{N #MpO8NF=?KG@91DXQFED?802JT:! G`zliW;&CdpoW=!#01=df]ZL@I=WQ!+JWSD931068DM?VƵ–miqw~ꅃ{}tldiz`BF;7=CEFGIQPV^[N4# -2#2O,7esia:>QZE1/01+1HWT@0".Zbh^C=3 %#&*'#"!)03:34@9WǼƶĚbm~}wq^RSabctvs}|{~눒qSAPZ3.,*CkV3M\bd61P[P38+1A^,$?% #1X- Uv~ǑC]z@<801LrocegA6{}+#ȟo]Ydku}v|hajuw٫¼}qmhjs{}to]`c^dvuvw{zَpWQcipq|tsxsg_M>?HZcdSZt|r!/2;T[NG;AK8%#*9;EWGG>72XŻŵ}y}xkU@LGUaio{ztz|}wlinuq}wjC 6FMOFDLRVG.$>MWA#,JV1$=#,- '6|WKwy@.85!Nn^UGOhߞ~ru윢䘏|w{qv{wzprurs{ph|}z{ႍ{ubYZ\ebfeit|rf\I=8:L_g]Scir!+.;BA_sK03#@elW6(6@7&+=7TQLB,%2KVKHI6%6@A@dvas|~tmrmov}pvvg_uoZ.*XadEUH=MTD( ,?R<0_we8J/)-2;2,B=?IB$Bd`dkWMPYIRWH8Ul[SmXqm^[Wm۝{zp}ᘛrbz}v~}{}|͌pcq}tr|rh]\hti\apnbileVNGFIOA1.3CXqutxu`OKr!%*45%!IpaOYdj_M5"58#"( 7Xc~_MKC80;XcUG@GA%+=<74.%Džĵũ|~󍇃}|x_aist{wrufaeihmzaT\SBDY[s촫͵򖓈zяx}twvrmhqzv{|{yzg适ܑ}{pnv~kbjkp}jZKAIa`UNSUPR_[UMOQSUF23=GWj|rn[Ur!,07949YqfVU_X>' 0, *?:! 2GQUx]GBA@76HTOC4?OB50&.Zĵʪ|z{sjvq~pWP@HOYyywv|䆊ľ妛͒{{zuwz|sywmwrhv{bjtp}~yw݀}z|䌎|n`ls|pfnmp{teTBE]l`OA701HMNMV[_eT94BUXd`MACILFPJI]>5?TzT& .?4%0JZ@/-?f񵡬|w{|ۑ}z|Ѻè綴t{nhp}z|klusvuk`\dbNKUaWHGS\fkmc`lqma\agi[bv}neikejokntkejzӖ̎~{}p|}rvtYKLbfY[aPFHLJWjmihvfojlupi_Z[cZNI8)&# 3PNP]M>?IONX^if]\r!{V:BFEKA:NYNAC@?A;-&2AXuZ8+(#1;/!$%5UMAWc^ĵĦڂ|{ѸķϿ⁅xy|}}ip}vmknqsqtrn{|yt󖏈󤡗洶v핓~ukltgpz}~{qa\hnxvzjbK=?SahiMoqXTX\[SHBFKIKC-+,(?MQ`M:25/" *0'!+9VpZõŻ}񏎏{}̹йͧຳ|~w}뢧򚙅xs}rqha_ljknz{svzy{}uwupsyicjnobL73<58>CDGD>9IQXVZVNQRr!bd_J:GKCP_fghdP615641+,%$5hnH1.(%/A81-(KP,>´ɼɶû󢼭лι󉎏}Ԑ~{~uxz}vx~}|umynj{~ul}njcalmecgYTmgrdTQNLHXeoqmU^cjqyvaRJTdl~mdjfXH@AFLMGDG?=6426=6376143,+34151+('r!J;?^XKQX[^]XTdW86=83?@>B0%FjG.+9A5)06(1H?#I򻵶׶ŰͳƾǾƲ¼z~~}~쐌|~ݤs~{zxafntugu}uouxsmnoqgb_ny}{or|aW[fbYZYQKf~yso|ysqkjlhkpvuwpicUJKLTXV[aXF567:7321.*+,.*%$'%&%$%,130(%'(r!>9NnT9EIP[H4Qc:=>/'7;-32*XqK20A@&/)4@/"UýǺΰľȹfq~񃆄~ws{qlktwkgy|vzu|tw{vt{onhc|vkchkhgsrjfvulhkfrofoe\msrx{~~tvxuvzvmjstkcbin_afWShc^UH?;9735120-*(+)&'(.-/4312,%(+,.-.-07@3/0r! GeF&1?EWKYͱeASK7287%'.,VڐzY:6EK2":PF7:FIJdͯϳŽ»˾ϼȾû갹il||~|rxtnr~xieldptg[Ua\mvwrlmx}sx}yw~yturpxvqtikqyxwmel|zxz{wry|vyzx{xofil~ujdhevzdc[SJTo||{ty~xzrkomlnmlblszgmvx}{um`\XQOA9:<2/1+.0-,)*.2/-/('*(%'(*+-/04:;89789516@FKQcvr!-1NQ3*12>UO}аd@VN7495&(.-[f>-,89;Xhn{𪱮ʻ궯þɼŸð¦ɉdctzxtg_dgY[W[hZHPY_^]_d`\hrfjZfoqrsplor{}~|wx{}{xqpjutmjclolocbcikjklgjnmidbdcfnfnsgca`f\Wf딌}~v|}tsvyzh<\}zxtsjig|{tsxzrindijY^dXKLRDFHINF:6/)&%$#&'$%&',/*,.37<:891/131/58=NPKQMFGHQWQGO^ZU_por}xr!Mfy_?76,=6;701/(&%*0474.,0-21-+5?=5BK^gY[VW^e]QUb\bjlaZULP[_VPRQI@:8ACFEDOLHPYXcr~nir!ՈzM4+ 7TO|̬a9NUIGF9)&'&9y󯳸⤬ĿĽγǹƺѿŽvmgmuvwvwt|npwpsuofpnqtrjrqlrunpywumfligd[X]ejcZS_bQOPMKTYdqwunc]dglo|ywz~}npnr|{z~|{xrkcmy}|{}slwrvpfkrm[P?[MEDFB=5,.,(*+*+(&'+14141,+.512FKF>8>FZfVbjakpk`cjq}{n_cihs|pYH<>E@CF;4049;ACAEHBFHTcmtr!ڎvU?*:VQΫ`6Fn~nX>7.#%;|ުɫijѶҫǽ{|xtnh}{xzxtpjlklsg{sgh{rnrkgachlgcie]^cda^kjokiebfdfmia_bcnbV^ejlorupupi{rw|y{yztQZ^IOjmhjnm`WXPTP^[QR]YRDG?@513-*(-OV9031)$%*+*/0/7DH:9?:8:TpweR?<4$&<}鶴ķʷӫ|sulhej|xvutjbcgihek\Zemehmqnig^htxmrz{sinutpy{uskqs|{tu{vsrmljlrtrophfjqsp{xihnz|}vjY_rnke]XN<=1$*798740'$)&%')'&(.)$)*).0.-1064>5TkHBA=BHY\MDSRfrukhndl{򍊎{zrnor|zwvrdZc[KX`lz{{[JGIH>@EDCJB=2*+0109@6%<|񴹽ŷȵ²lbht~zrg^ad[a_gsneszyvtszv{xuvspolko|sjvwtqurvz|~y{ytmngRNOLFEHFJGB692-().+&$#"$'()*,+().0.-)+0341,/7GE=HNDRa_^bmemyqrxugvnjwvy{uيzunhonmt|{|uy~lX^fmjlusjP76>4./3BD<82.,-/0678;L`ptr!ݹagO=OhmWH?:6+';yºӷĻ벫ٴǶsuzunmok߅xrosihxyuvtszs~xqlinv{bqwz{xwrlyzphglf[XNI=7.').6>A@CJL84FE@WKS\V@6+'-,)+IWVENOL<:DIZ\XRY^\gl^WZXWfz|g_wt}}w~|އphjpxvuoi~sprqxy||[KQUTWbfYP;4<613AVKHIJFGFA=87A]~r!±wz_}O?TmrWG;4.);w˼ήïﱭƼ¹Ʒɺ鱶meopd[Y\a]Y{~|ubV_uwuha_`ownrxmdb_]_k`LOUVQHDC>HOJ?6/,-0+$ ,9?65FTapxosmsxp{~|egG431-4?WZR[{xmfe^k|nk~xzszswytg~w{wyzw}z{uqpiXdny{kspq}z{z{|~xxv|qinzZIJQVaj{k[NEIECAOWTJ>:C;.24.&).;PUr!㿻xsei}V9576-)# -lۺ˼ƿuspcic[W[PXVkx~w|yp`RJNRPSWSq}edgU;68>HB?A:202:H<232,+-*,-173.&#+/0/)-14+!%3JVRYau{zxw~|hmwxqpmkzvfbZJ_zwrdipcXjzrxxtmnywq`ueu|z|y|rjn{tqtynm~wszkfmkmqy}uoypjnmz{pryuywm_I<4-.6DGA912-*./30-.-7ACr!߬~vphlsd-'&%&#!fӾpt}qljmijbgqc^_]fwrpzryvjwojo|vjxra]Hdz~jc`N8,2657.26/450,*.)(+43)#*,',14;<,()1A<84B5/0:@FNYgSObm`F:=>Laswom{wv}z~vwopiywzty}~ovu~}yz}woq}ue\rx}zqj_h{~wupwoxux~|uzz|zv}yoktr|vpnrto|xy~v~~ϐ{uxuspmsefvoicYE:=7168ADGC:9;BC>;<989;ACr!ꖐ|ɤl]b{l.*&'($"6u񭪧Я৪~|tslgrhe\dyjekcrxZig~ľ¼V4;[gU?6@>6:biL@<=TR\^\XYL\]nxb[izvqlxdSPSUZbpodwtX_jmz}~|}|vzwn}|umohdestvtnfcdu{nfy|vply~z{|fxug~}|vsqr}lgnljwuww~|}}{}yjojwakwe`ab`_k~xl`SKHTSJ?FPUSC8<@>898231-./r!֏~rf]`zk/*&'(%%?򐋂~v|m]otsrjfk`rk]Zbacgt~ีͰƼĹxgfsvzsvol`|z{tsrjanpxrlfgdgrtpt~ug^U_mynr~sqmlj{zqim}uvywimpf]Vhgb\]`qulysrnr~wu{~}~zrgxrpfleinld`y~u{y}z|}js{vuvupx~klrorocpvwpqgikck{xvhj[KC@=:BLUVB3013431./+./r!wjeSJhk/*(&# &@󓙢vneb]fhdlyqps~uƹºνƯƹǰĽoivyumadho}tq|zvz}z}{{vqf]bdjw{olomifd|uq]_c`fkntxy}yw}w~wyxro}|qrnusg^dyrwsjkw}wiy|yx{spo^npkmlmiw}w}zurpsty}vxuu|wpufL?;:9>GQ^U?5479?C<;87r!{o^dv`\qk/+)*)%"&A¡xtosrpxwmiefjpmchs{ʿƼƽ÷ǷŻȿ~vswu~nsx~zdjlgt{pnidfdzogclpnogfib\[Zi^WXadepaLKWghns{}|xhnxuy{xyrsqhzjcfvnqx{uql|ofz~lhx|~}y}t{~s_mz{vwqhYTx|qikqmirxyx~v}釃ztxohb`expqj]hfQMIGMUbaUKEFD?>830210r!rQkf[gfF:*=OQOF1"&CĵѼ»½·ƻ٩ź|trutwtmrw~s|rqjbqoxunhUlp`Yothdca`_khb`Scef_\]QEIRJ@CUIOfw|yqpinsvxwrsosruxklrlxljkih`a~qy~񓒎}kzmpxspvzxtzjdwvnro_jnvvt}}|{stmly{ursikfmzusjfr}|zxqjTE><;BKY]ZQI>9781,0r!ФfDZfZ_fhaF-'/PfbaV7"'B¶Ⱦǿ齾þż󼾹ľ񲹵Ž÷ø¶wvtx}z{wmkeo}vujeWbj^ab]baW[WV]iqg_dji]YjcP?B[^`cUPYbmkeg^PSo}wjltqkoywprsrsgfgecdifsqlztpjmfpw|yutkh〉zujsosqshbpzywsxur{|ut~rnhzqshrtqrmf}~|ykpvxv}}nevzosiTGE;02:ENb[UJ<9=@:64r!ҢkKBueZ`fdaJ.'0PecaV6!'?û½˼¹ý̻ƿſʩvrmxxy~mq{vochqnsx~kjb[ihYXZ[`cgmuhegdag^W]rwrlgfghgd^ca`ehj_`][_uހy}npxwxvpxzkqw~ystrtrniuxwpjblul]s~|~}xy}ytzyou~|xuy{}|pmvys|vrujkqh]XZI<:;A[}~ubSOLKA40/r!ܠr[LtdYagd_K0(0PfdbT5!%Bùݼüʽ¼е}yrgfcikiklqp|o^VPU\c]if`acdknfdcbedcagkurjilfbhkjtzxruwzskh]pxyrsqplbrlcgwxusmfbcorinmla]fhyqdo|u||{{|}xsozrsw񓐋{wzsn{y~ro{yubI:;PejeYJG@;51+*r!|umjf\bhcI/(0Nca]P3$@¸¼òȺƸĹľ̬ɿɿy}|y{u~w}|{x}sedhtsjkquw{lcZT_hifcfacaWZaclomrxurswzxuoehtvwfrvwqv|z]adr~mhdbd`okhlskgnlko{{x~sywz}p}|~x{ywz~vqpsidr؂~x~wotyqmkr}z|}ywvjVD87FU^\SNF=;=3/r!~zojielf[^]G.+/=D@:4*&-HƷƾƿմ¼öŽp{vy~yqgbr{tkysfelyvuvwrwxlfeirwe`W`jrmb_a`ikilx{yvwxneimosj_bstq`pyvolhURoqz}{qiou}|x~yz{{rzxtr|zqfuh}usv}{w{|rw}|zu~}vtnln~ywrx}xu}tiqvw}vpqxr]G@AOajfacdcT>9r!POSVPIBDWdl{pN:9<>:8¿ÿ¾ÿ¹Ĝ򱦻ɳɻ󻽹qtuqw}{vz{tpitxrsgdaetzijnrlpzsqgvzvpla\[aid]TQWXamxwpsvwx|z{vxyx}z}{x~wvw}wpoji}shafeYgtry{ojhmt{|xnp}u|ytxz~yt{~{z{~||{藍|yseKCr!UF@swF8=VjmjlfI/+,-,*&"(x仹Ǿ¿žŻ»̺żȺŹz~}rwzt~v}smghxpfaekljo\ZY^kzxmecpyrgabcdc`Zdnfdhlgprv|y~qcnwxvz{prtpsqnrmorv{qsb\YQTctqipzoq|w{|vruxwyuryw~|sy}tlswx{wz{|y}|xrzxtrsz|tplkdZTWNJr!hRBqo?=WlomohJ0/0-)$ 1{ƿļʾÿŶúﯴƯ¾ǽ}vwrv{tqvtvf^]lj]SXfqrqtwuz}~~uprwtjkrkhstmnjkjvuou~{~|z}pgstpgjk^WOIPWPEJWdrvduymz|rlpkw{rigekruvkwsuwz~||܁z{wuoxyx{|ॠ~x{vt|~sp{xvwefe][r!UL\m[eN249BNUTN>ArſϾηdzƱ¾Ƿɾέ~px{zu|vpxqiju|snskjvpfb^bcdsuxyuvi]W]dmruj^r{uomgXV`bj}wxukwvpvy|tzu{~wvxjgku}~yz}}~||~zu}yr{|z{⧨yzx{{}~|zwurkn`Yr!Fdwxz~ʲƾżþ¼úż̿ξֻϽ}|{phjuolq}~uptp{olpmlrqjgb]dc_fgp{wjv}qkmtuw|sc~yusnz^Sbj\em{vnclwpjpИwmxlmvx~|pvxtv{훓~|~{z{~y|yostry}tljeskXSRr!GEe{qWnr¼ȸûĸ鮹ͺºɸŻĿ}o|~|z~}xutunlyxs{{plrv}{qb^ainle`YSYhqpmsz~|y{ytvtqrwgc`hy~vx~s{o~om~{ݮ~|pzxtvsqmsw~~|{{yxzxoqrmlusy{ot~nklr!M_zxsvsŸw¼¼ƻúシϬӸȿϵĽxhy}wjm~x|}lx~oqkhoslkov~|u~{}xtz|uዒ}|~~yzunq}|vum~w䣞~ugksnctumq|x}|wؐyzu|~{yxphpji}|yzyw}zhn}yzoprr!a}ڒtLWuz©ιĻżɼû̾ɲ~}엚|}py}xyxspl`_ky|{~}vwxqtwyx|yp}|Յ{z|{~|~}󡦮}uqovq`jxnqswv{y~|xw{~|x~wvpew|぀}{zx|zuzzutoi_`r!atzWIY{p|yx{»»ŻƽƿǴȿҲ}xrv}|o{|wnlrsgVQ_lyvzxry}r|uwy}z{yqvtfe|rig^osd]}mq~}~v~}~x|utx{xvsnirwswz~z~xyx~}kv}r`]^kotpopuvr!bm{|kfJMSUXcȿȲrº¾ⶽþ¹ȿvtuw|yw{|~zuruz{zytja`bfnrm_qzz{uk|}p{|~ztuzytz~w񤡝񠥫~zvn]Rmyqxx||y|zz~xirxqplonfbqopqpmsz~⋊qrvtpmlz|x|xzx}r!yλ̻緹ĸ¿zÿƼʶ̴pgkwslr~~{y{wz~{xtmfpmopmpvzwo{~worpqvqxsljep~pqzskm{zxtyum}|}r{~u~{why~yknc`ywywzx~uqvyxrt~zx~w}z|y{zwr!늎ŷľ븺þùɿȶƲ湸ͤ}oko|厔|{|xtqpigjfgjrut~z||yus~ةv|}yworvr|}y}܅{onpmhfrnl{|zrypmw~{|~ynr{~t`gry{xt|}{rtwywtjxytrr!톎~{dZVPTV\jsy»ý·诸}ľĿ³Ĥ~᜔zwywurpwmeglpvin{~yst||u|tq|y}~xӂsx{~piqpfqy|~vjbpwutxxǟ|~yu|urnjfpthciglw~~{||{}vt}~wtwy~r!|ԛqpusz۹Ǿ«~vǷ¿Ĺz|{ilo~}y{󒟧ʉndlw{~or~zw~}yulruvnmfvumksnpcq񄀁̌if^qopkls~}~pvrvz{}y~v遀~y}r!㡢򘖈ûDZݼtqǬ÷ͻʹztyɠnd]`ghxqlt|nw}y|tvyvimplmvzxgn{yxst}}u}{xou{uvtwvw]pyx{zsrz~z{y|yvx}t{􌋅~}vs{yr!񢖑ŻƸzyƬľٶǷԳ󅃀¶si_[emt|~~|mr{rfr~rv}rwuzvxwuecq}~{prtnpyurlyqomk_vns|nm鴀}ytw}yz}~|}腊|}vyxt|{wr!򌑜žƽ»DzzȽǼ{utsqm{lejrpjkoxrp}~}xpuvstvknuntzy~}z}|ztpwutz{~|zlosribljahty{xumoy}~uqxu{oq}wkt{򌋅sqs}|r!򕚘忹mߵѿɹνþ¿ܜ~zuxz{ymi_TP`Weie`WTZjvh^Uj}|~uwrpgt{y{wngmpio}~ymnolqru~}{y}}~|vpm}~zvwv|{yzqeayxngfgasrmhy񆈅vȂ}~z{󎋈~}}eIBKMRr!뗑ɽprżŭʺꪭvqtnxnfgjrje]OPDGPTWIMVU`wyu|v|vxoihptib]m~wutpkndWR\rvw{vqu~yz}yut{~|zyktprulgxpon`{~xuv}z{|ywzx|z{}|xm|Dz󁀌p߉|cgr!垢~ϟľ½nl𳬰ׯ«ƹjkhakpdam|~{}}xw{yhkwvbXuwxxmx{ywu}ha_qtgblwnjtqikotldgnx~}|~~|}wrzvfutvwopxtn||~ylojhip|~}xr|set{xrjmstx|{|v؃m{§zd\e]avߝr!۔쒘_oǮܯijùvl}m~}vnfdkxy{hfstgatz|sx|sruzxwgeil_~znfafd\d_`ikoq}y{zx|zw}xmt~|{zupvzxqsuwp~vr򏃋{qrxw}w}ighnhlwl_Sex̬݉rptw~y~tsqfڒr!򖕔țƾ٪oǾگλƹúijtmo~ir{zvꃆujefhbjcQ;KVYTS`fnjnyuvtmnyx~{t}tjhjlox{ypuqhep{svropmq}|yueq{|vnrvtprpr{xzuq~|{}zwtutz|nw|svzr~}ڈ{r!򙛤엚ĸĺʱ¸Ⱦ۠ĺvn{{ut`fg^djmnrg_a]V]TGOejichpu~{z{slt{tmnrurgikoutxwpgjfdujihcb`h}wspt|tr}|{zx~}~xz{x|xprtqsvxw{~}ro}|wyxquxuާu뛠r!ᡢ󣨪籰˹䫮{eQpxyz{|zxstwrx~wtnijlxqjfjuzrfliejnib_fb_Zaicabimt}usx~ty~v~zun_[jtzw|~yz{}~~y~}mz~{yuzixtxylhwv|ypxqyԟ|ᛚr!򒓕ឝ䐓~yvd[jxyqrwgent߰Ӿϸ{xtz|go~}|~zruz}|ztv{x|soxrdfmwklkicoqnhopjhrqnhvrs}vpmz}{x}~vwp{}~|vxxnsv{zx}z{|~yq~zvuw~zowvآ򔊉񦧰r>Mr!򡙜}{ăsdYI@HIQfc^[cszqv}ž»Ľɼ渻rtu{|whm|wzx{}uvujrwupoierth^befjiqwyrlx~}hs}trpmnkrn`etlnl}zru{wq~|uszujp}mgmprtr{zwtv~zywtsru{|xzrnsz~vqf٢䲭vr!{uspx}ru{pcQELQbtkjy~ǹȾɿ¹yfhneb^hvuspoxyxtsz{zxou}ksvz~|sk`|mlibgc_qifnmif^pwsijnlku{zwxu|~ydflkjhehvonrsrsvx{x}펀x}w}~ꆊۥ񡘋⥪vyr!t{vqcWA0($(7Jlfl{þǽǼ¹ƻʸx_aq~}{vux{lr|sq}uwz{mtu}~phegwf]V\f`gqjpsqsq{}yz~~|{~|opqsymRV]cnjl{tnuz{|{~|ys||p}|{zܨ豣y⚔|qsr!|y{{x{~|vpsy}}sjUMP@1*4AGQ_clro`p|xlyĻセºǹĻogox|}ytwmx{fanjosposvmw}|kdkryx|w{}}ur|~{~zx~}{x||rainqskJawz~{vzu~zuvެmv}y}}zvw{r!՞yuqgbhjd]agc[OIGFDCA?DJNUZ\ZSMKJLNLMNKGCFA9>?CBCNXVZXRUWXVQNIEBA?<858;=<9=>:48><8=FSYZ[iroihda`]NEBCGMZ_clsx|vmeda_rϾټ|ebfknt}~|{{z|plout}~{uslivumlortsongfjszvz|yΎzvqcdkqv~tgqwqlriolkrnoqm{ysmplwtj~񖎒yx{~{~|}|}}}uyzr!UZ_][WH;671(2@FA=734578=BED?JVULJLF>9?ELOQRQX[S\u뇃{wxtf]`inigqkclts}ڥ}}Ľͽhxznlwmk}|}t|{gZjfdmnvrbmzvgqzylpvwzxy{tx|uz}oz~rx{rdcdlkelajmu}tmtvxz~򐙟{zotsy{srsnz{uslsvz{tov~}yz຃zsnsqho|⩯r!svwkafgaQB:Whq~|eWPNd蕙詨¿q¶탆|]RTilZ[au}zumr}ws|y~ykfn|ywzx~xpr|ucet}z}rs|}ympsnkqyzv|vlev}y}xnihp|lgeqzwsovx{ȁȓ~퐑»r!߀|t𒔗磝ʿžue^fagk|}|}pqu{yqnrunpy|socu~|{|}}}~sSNk|~||vuyu|~}zsvp{zqyzqkhinoy~wx|}xnmusx|􈍐̖񤲪¾»yr!󘝞󑐏ɸ½»ö|ztn~hknmn}|nqzwttlp~fSEiv}~z}zwmt~qtz}~yywz~swyz|{y}{}xzrjnq{}ƭ艋Ϙ}~彿ɼ½x~r!𘗔´vrwywvnituswvsnjr~v|xwy~w}v}zx~{{ynktzxz{tpqosjv~zxw{w󔜥Җ߿ɾº|vur!฼ǿŽĺ|uw}o]djp~uw}xpos|}ݍywx~qoqw{z{}|xwyvxvuw|vz~{xyxvx{xysvԚʿ𬧞~|~wixyw~r!얚wzyrgX`pqg^hpngdkxwz~z}||svy}{}yqo|y}xwreltocdmorqxnot}xsv{wuxvw}՗´û뇊~ywsw~tr!昛򭮩ª{xnecki]h|爃wu|z{~z||{tvytyoqprxzwtrxthjlpyzuvry|rxvzyz|zuxtw{󊍉퓆נ}uy|~vz}q{|yv}mq}r!żzrm󰴲㌉w}~ztpvyzvgft~}󍌍֤~xnq}yvxvloz{wqxusruorprnrz|r!񗟏~{|􍋅㏐}xwx{ٟ犈|srx|uxzsqsrpmluw}xpxyxjzr!򜡙斗۔񥤣纷꾼~܆~z~z|yzujoڠ}~z|}x~}~tswy}r!z􈃂~땖󗓔¾½놇wplx䳱ܪ}j~}~qt~|sry{ytysz}~wt|r!uy}~}yxz~}핔򸴰۵¹ûݦvq{~}yzwvq{pty}|vzmy}x}{}yu~~xvr!y}~|}|𕒖򌋌臌åŷܣ}yu}|x~}~yusvtx|trp~znw~v~r!~x}~{y||w}훞󋎏zsys²ºǹ㋓sާ얒}||zxupoyqjmqsp|~wt}}{xwr!}rovz|󚝙뙛눌ʒýǾĿ{펗ݫu|銋~~|xtpxxvq}}phv~r!}xsuzw}vxʑÿûþwz|}ޮxw}zbz~{zmwzp}|xq{}~􅓕zvolu{r!|zs{yw|xy󀂈y򘙘훜𵺾ﹱ}|~yӕtqްsjauv}r{|ml`SNPWehy|{wv}|w{}vw{|~}w{vy}{~}r!{}{~}}z}w~~󒑐󘟧裢º˼¿ýȻxvux}z}k~|wblpú󮙂}|ڈݳtja\z}{~tvoW]slxymlspkuvhcku~|zwor~t}xrq|r!~sk{}|xz|z}{~鄁𔖗ퟝ똛úռľķìꉑ~Úļ}xsy}߻{w|zyz{|zr}epx~nkt{|c^wztvxwtuwr!~}spt|~{xy|~}zyߒݚŻĻļ¾Ľ뿺øþĻüƳ}|~}ܵq|vxmrz|}{rqkzuqtwuz}vm|vprnlsxutmwr!񁈔|otyvuz}wv{𠗖÷ºŲĻ󲷹ľž˺ࣤ~۷~onx臋wv}xqsg`xwx}~w{v|wkgtuo{r!rvݝſ񯮯Ʒȸƾ磤{~عzo{z~|zyiy~tstyr!򬳼kx{u}|󖓑񟙖֞÷½󚰪Փܹ~c\]hw򛓂r!|u匐󊉊ҙ䴱ĺĺwkoTqykSK=8>EJWvr!zx}~倇}򙚘윙똖۟漳½¾򌋗ܽzU6,$"#/W}²r!悅~{uz}폑沱ü꺮ľѷ´Ēl\S;*$#&0CZq񎈇z~r!~|}刄~哗󚘗薕¾ƸĽ𻼻굶ٱ֤}]@( !$-:Pp{r}r!zy{v{|蘚梧쪬½ĿʥwVA4,%'8EWl|}򁀆}r!{~燄z{󖕔󘔕瓕氨û½ų¼Ȥד:#*;=T|~}|urzyxtz}v{󏊉r!򓕔ܠº򫰫ž毭Ťͥkh|vrsmnyzwzz~|r!䉈󮵳螘ܗē񕈁}tgmwusz蔖{r!󬩣윢𝛗֝ýĪv䴷󮯲¾¼{r!셆}맢ﻸܭ~r!{񋍕򝜞񖘝~|ž۠þþr!lmnjpzrp㩧𷳬𗘒⾼Ŀ򕏍񥩦r!hkoqrsﯩٶ򐖘컼ĺ簯᭟r!jx𚤫󴶲½ǿ񹽻𞜛⒖跴}{񨬲r!觯Žö½䍐𝘎ꑓ¸ﬦr!þ߳Ƽ並þԹ擐ž½𳶺𴢩ਥr!ɹø疙򓒓륬r!~vopwƳþʾƽ鸞𛟙Ჵ}r!󇊔ü㪮񚘕蟝뫤󫮬r!|hpüǶ򷱰䑓ꢣ򞟠r!、y}{|㪫wyij޶򎏑񗛜򭩥쪬r!nqvxtpry{||梥¿򸲩잖󘗔혛񲴶󥤥r!lifmtvzywqw|û򧪫ꡟǹ󪭯mr!hcgw|}z{wuxy~񨪦߬쐓¹p㩣r!hm|{xzթ򣡠r!lrz}ޭ뗠鑕𐑔춳񮭪r!笥ku򕖗񬩤r!֤|zvw}﫲ݝ}甕dh~l`_⫭r!󐑝矣饞zjVc薙fORur!|m}򰥤񤩪v~|򤣥𫩦r!ljꠦ匿奤󳱳r!זǤȺ殰󢤧r!󨭳zwߗ緱񬭯򡣧r!Ϟߠ欯첰쪩r!厕{읟򮭨󲰯r!}pcan婭ܩ𖗙r!wx~|v~즡򲰳񨬲r!v|٠zuy⟘r!⤟稪r!͔yz󰬪򰲰񘗘앓r!ތyf{{|~w~ણ񬫨󦥦󒗕񙛜r&+d                d +6696     92        52        55  85   84    74   74    74    7H   BH     BH   BH   BH  BH  BH    BH     CH      CH       CH    CH  DH  DH     EH     Fk  H+lprint-1.3.1/testsuite/sample-label.pwg000066400000000000000000002107761456151556700201660ustar00rootroot00000000000000RaS2PwgRasterauto ,,G4GM   XGK     XGK     XGJ  XGJ  XGJ   XGK     8 GL     7GN    6GQ   6GJ    5 GJ    5  GK      . GK      . GM      .  G  G G ,JO  ,PI   ,TE4,WB4,Z?4,\=4,^;     ,`9        ,a8',c6 ',d5 ',e4   ',f3       L  ,g2       L  ,h1    Z ,i0   Y ,j/   Y ,k.   X ,k.      P ,l-       O  ,m,d  ,m,c  ,n+c ,n+c ,o*b ,o*b  ,#,)     ','()        ',*%)' /,+%(& /,-#(% /,."(%      /,/!($        (,0!'#        (,1 '"    /,1 '! 2  ,2'   2   ,2'    2 ,3'      * ,3&    *  ,3&7  ,3&7  ,4&7  ,4&7  ,4&7  ,4&7 ,4&7 ,4&7   ,4&7  ,4&4,4&  ,4&     ,4&  ,4&  ,3&  ,3&      ,3&        ,3&       ,2'         ,2'    ,2'    ,1 '     ,0!'     ,0!'     ,/!(4,."(4,-#(4,+%(4,)&)4,'()4,#,)4,o*4,n+4,m,4,l-4,k.4,j/4,i04,h14,g2  ^ hti:-"  - : R hpL7#0AM uTB "5LVn hT>61)I&mux ^UL7 $ 7K2W%]h*,f3  ^ hti:-"  - : R hpL7#0AM uTB "5LVn hT>61)I&mux ^UL7 $ 7K2W%]h*,e4  ^ hti:-"  - : R hpL7#0AM uTB "5LVn hT>61)I&mux ^UL7 $ 7K2W%]h*,c6  ^ hti:-"  - : R hpL7#0AM uTB "5LVn hT>61)I&mux ^UL8 $ 7K2W%]h*,b7  ^ hti9-" - ; R ioL7#0AM tUB "5LUn hT=71)I&lux ^UL8$ 7K2W%]h*,`9  ^ hti ,RӲ+IԴ" '*5- 0 R2W.vA7Է#0!:VN1LI@&xPΊUL7*P$ 7K2W%]h*,_:  ^ hti?4# - R du`H7 !#0<M `H="$5nu~x hYB51*I%yxnUL B7$ 7K2W%]h*,\=  ^ hti?3# - R cu_G7!#0;M  _H<"#5nu~w hYB41*I$zxmUL A6$ 7K2W%]h*,Z?  ^ hti?3" - R cu_G7!#0:M  _H;"#5nu~w hXC41*I$yxmUL B6$ 7K2W%]h*,WB  ^ hti?3 - Q`uaC8!#09N| \ E9" 5puw h VD51/K$zujULA7$ 7K2W%]h*,TE  ^ hti\D?3]^h-IYsrdZ'u[7=`|#bO Xr#0mc1<]fӦ՟]c_q^ot]m5I]V ozmuUQwBb[A*ꨶ!1J]h/$ɬU/.ig#Z=U0`o"$ 7K2W%]h*,PI  ^ htiO?3- D luQO( &#0< o gP;-5PT uwW: 7010=$i `U@ 2$ 7K2W%]h*,IP  ^ htiL?3- @ huZL2 $#0A u kNB75L[ uw ]>711-@$m~| ^UG 3$ 7K2W%]h*,z  ^ htiL>2- ? huZL2 $#0A t kNB75L[ uw ]>711-@$m~{ ^UG 3$ 7K2W%]h*,z  ^ htiM = 1  - =  hu WM 1 %#"0 @  t kN A7  5K [ u uZ>811-A%o"{ \U E  3$ 7K2W%]h*,z  ^ htiYnYiYq - . huCZYmXt RXk0/v:9X`ԤT1&^N橾WF ji5^6;]uTA]>OE 11-Iz1 =`|XgҮ"T9U1 ) 3$ 7K2W%]h*,z  ^ hti?2- K hui=@# 0J[ y ^N/5?Tu cQ>11-5+Mr UN @3$ 7K2W%]h*,z  ^ htiF:(- G hueGG, 0FW  eN-5FQu cY>11-<)Iq UL =3$ 7K2W%]h*,z  ^ htiF:(- G hueGG, 0FW  eN,5FQu cY>11-<)Iq UL =3$ 7K2W%]h*,z  ^ htiD@' - G mzeGL+ 0F]  zlK6 &5CU | { ^\ <  11+9)I l"UL ; 1$ 7K2W%]h*,z  ^ hti &Rٲ&O$/$/-.G ^$,#eGר(\$$Bڿ <0$7FN/ \ $(]+ܿ 8<;5$! 3Ju0i5+f՜$#A٢ "."11 )I F v|$4UL* "O$u$ 7K2W%]h*,z  ^ hti=0 - G Q eG?%0F] x l@3!5X^ |z [L 6(11)I&S{uUL:#^ޣ$ 7K2W%]h*,z  ^ hti?3 - G R eGB)0F[ z kB3#5V` z{ ]K 6'11)I&QzxUL ;"_ޣ$ 7K2W%]h*,z  ^ hti?3 - H Q fGB(0F[ z kC2$5V_y{ ]L 7'11)I&QyxUL ;"`ޣ$ 7K2W%]h*,z  ^ hti?3H;8 -08 7 z;9 :"NG3¤;:1 ;P6P0aK[ ^;At9*4 4 - : \ ^G;+ 0R[ u eT7%5Mn~q \B911,A&lr ^U 74$ 7K2W%]h*,z  ^ hti  @3 !- : ^ _G ; .  %0R[  t dT  8 ' #5L p  r^  D9  91+@ &o"~r ^U   @4$ 7K2W%]h*,z  ^ hti#jLmzkq~s- :Qkqq̖knGklvm fk|0 QnR b6Dkf9DV<TiOluwikqykz5,Kc$ `|koku)q!jLivr :{k1r{%O[&pLJJr ^UkLek$ 7K2W%]h*,z  ^ htiUI)- : K iG. &0CRXT>/ 59[ x dQ I; 1+M&rwr ^UA]ܣ$ 7K2W%]h*,z  ^ htiRF( - : R pG7 $0FR _T<- 5@V u cP F ; 1)I&qzr ^U>_ޣ$ 7K2W%]h*,z  ^ htiSF& - ; R qF6 $0ES^T;. 5@U u cOF ; 1)H&rzr ]T>_ޣ$ 7K2W%]h*,z  ^ htiOC.- 7 R lJ:.0(N&O $  eP@+/5?&[ }' ]OMF17P4m} r^U<'_ޣ$ 7K2W%]h*,z  ^ htiN8OPe!QaFY-@L;WR3OVM,"TS6OQeOQlTOG 0ŧkI vrOK*OiGON9/QcMOP\^Oa5ݵ-# - 9)Rh $lLڝ?,0J 0` i eK#):<65?  4҅. \֊ L& K421>UߩO_ޣ$ 7K2W%]h*,z  ^ htiRG- - A R hdLH,09 ` v eU) '5Gqo iL921)H&S~{QG6_ޣ$ 7K2W%]h*,z  ^ htiSF- - @ R heLG,0; ` u eT) )5Frr hK ;21)I&Q~{QG6_ޣ$ 7K2W%]h*,z  ^ htiQF.  - @ S ieLG-0;` ugT)!*5Fsr gM ;21,I&S~ QF6 aޣ$ 7K2W%]h*,z  ^ hti?@c>?WB8 - m<h<|>=$eLG?>?VI>8 0-.9,9)M` uFA>1)HN[Q5F,9 z8eK P<(=>Aw ;&1 14 /]I&{>8M<(>B{6F>1)T$ 7K2W%]h*,z  ^ htiK=  - H Y eLG&#0GS` uF)5FR vv bT ;11-<*I&v cZ>3$ 7K2W%]h*,z  ^ htiL?  - G X eLG(#0FR` uH)5FQ uw cT ;11-<*I&u cZ>3$ 7K2W%]h*,z  ^ htiL?  - F X eLF'#0FQ` tH(5FQ uw cT ;11-;*I&v cZ>3$ 7K2W%]h*,z  ^ htiL?   - H XeLG ($0FS`vH )$5GQ  x w ` R ; :1->3I&u aX > 3$ 7K2W%]h*,z  ^ htiL?{g  |-c|}XV~|˃|%|}|}釄y|}0F`@ʀHzbz|l 5 aQ Yy0H|yCw1{|X*|}݆cs|~hq1-ꟘI&|p9 A||1wO-|cu|~hj|$ 7K2W%]h*,z  ^ htiL? - X boRH.0F` }YH4!5Q^wXC 8$41-I&jw gNF 9$]ݣ$ 7K2W%]h*,z  ^ htiL? - X cuZM7 0F` z _H3 )5Q[~w ]K 6"21-I&m|mUL 7"_ޣ$ 7K2W%]h*,z  ^ htiK= - V cvXM5 0Ea z]H3 &5Q[}u [L 6 31.I&o|mUJ 8!_ޣ$ 7K2W%]h*,z  ^ hti -Yӫ,W*% - ( l2cgє*.mMӯ*+H׻ ɾ0!*:V8T z1sHӳ)!3׻ E?5Q[v*80q)A '*!6@N1(I!`*&|'mIӥ+W-* 0;*"_ޣ$ 7K2W%]h*,z  ^ hti>Bb?<JR z H63 5AQ[ c@6$01+I|mKA5_ޣ$ 7K2W%]h*,z  ^ htiRF(- @ L ceMB2 0AMW z H<3 5FQ[ c>6'11,I~|mQG4_ޣ$ 7K2W%]h*,z  ^ htiAŜ:`89W623C--BjAL68;q8=s:]Ƨ:^=/4810kIMi85 _8LbΠ11 ,ZI&82lGm6%Q=n 3,)I$ 7K2W%]h*,z  ^ htiUP - L!^gmFD 0M'u # sM<<5F(^  ( cD >611)I!g ,mQP2Ҷ@$ 7K2W%]h*,z  ^ htiK< - L ip^M4 !0M s eU<,5FU ~u cL >!11.I%rmZP81$ 7K2W%]h*,z  ^ htiL? - L hp^L7  0M v eT<-5FV ~v cK >!11.H%rl ZP71$ 7K2W%]h*,z  ^ htiK C - L h qcK 5 &0M r eQ<,$5JV  {c P =)11,O +nqWP7#1$ 7K2W%]h*,z  ^ hti2]ocU- Lly\^|`2㥻[G$`\r0M?iL e7<hn5~pTV \g&_x]\^ (qI11\fHe:lQ㤼7nI 1$ 7K2W%]h*,z  ^ htiD8- ? L dDE'0M o eL<#"5MV q i \ 7(11,?)Q~vQF7#1$ 7K2W%]h*,z  ^ htiF:- @ L eGG)0M p eN<$#5LV r h ] 7'11,@)Q~xQG7"1$ 7K2W%]h*,z  ^ htiF7- > L fEE)0K p eK<$#5LU r h ] 8%01+?)R~xQG8"1$ 7K2W%]h*,z  ^ htiFE- G!L_PM'0W(y p eW<$"5+L\#r| h W 45C1?L:M   pQG4!D$ 7K2W%]h*,z  ^ hti,`Fᆡ~o pz-az{LT~ʂP1z})څzx]quz j0 ^z}s> p e,w[<p$zm5 fL T{|1 Ur @z h-z| "g n瘜1l뤃{zi'Nx={G 92[QG݀^ ozat$ 7K2W%]h*G  ^ htiUF - L foRO3 0O[ p eW<$ 5L^rv hH A51/Bul `QG 5$ 7K2W%]h*G  ^ htiRF  - L huZL2!0R` p eT<$5L[r{ hP >61-Eqr ^QG3$ 7K2W%]h*G  ^ htiSD  - M iuXL/ 0Qa m eT:$5K[qz iP?51.Erq ^OE3$ 7K2W%]h*G  ^ htiHѦ.]+% (+6-"+3B)Zu/oL*  ,Eն)+C&+@0"' _8T+4 eH+-U+?1&%A5!;Z+;[+8{ Ÿ+*Qթ*6Τ &X1'E=c=+6t P-[ӧ*V/"3$ 7K2W%]h*G  ^ hti-[,V*+@վ(&- R*( K)uRLҢ/Ը*##03*8c*' g e/g+P/>;5R*8[5ȃ9(PГP,WӢ '!/1!NEs&uʊ60qҢ,Zө+*Sϥ3$ 7K2W%]h*G  ^ htiJ5$- > ZuaL7*0<V { eI. 5>[ t ^PD 81+E%mjVJ=3$ 7K2W%]h*G  ^ htiL:(- @ Xu_L7)0;W z eN3 5@[ w ]P F 71,E$mmZL >3$ 7K2W%]h*G  ^ htiL:(- @ Xu_L7)0;X z eN3!5@[ w ]P E 71,E$mnZL >2$ 7K2W%]h*G  ^ hti*j:surqg-q#Qs1Gn.Ar|*pX7)0 o! Tr}rj*8s e,s됟zt} fu5 l$[Hst~,s}uuzhi皤1,쪉y`!`~< ?{,nHZtzf#trx$ 7K2W%]h*G  ^ hti :,  -  VbwaV7)0 [ y| eL3 ,&5 [o'x ^a 8)@1,I3E t _Z  B/=$ 7K2W%]h*G  ^ hti:-  - Q ioYL7)0`  t eB(#5[nq cX ;41,?)Ir dZ:&1$ 7K2W%]h*G  ^ hti:-  - R hpZM7)0`  u eB)#5[nr cY ;41,@)Ir cZ;'1$ 7K2W%]h*G4  he%     5 &        %     3#        %     1"      !  ! %     0       "  "%   /      " "%   .!     #  #%  -"   !# #%  -  "           -            ,             ,           ,           ,         ,          ,          +         @         @         ?   ""   >   ! !  !  =   !   !  <      "  ;   (     #  :    ]    #   9    ] ! !   $  7    ^ ""  $ 6    ^      %   5   _   %  3  _    %  2  _    %  1  _    % !0 ) !_   % !/ * !_    % !/ , !_    %#. - #_    % #- . #_   %  -/  _    %   "  _   %   !  _    %    _   %     _  %     _  %    _    %    _    %    _ h . # L - " L ,!L + L * L *'L                                                     ;/%REEFF  G H Jl     W      U    S    S     R        Q       Q       Q     P    P     P  P P   P     P     P       Q        Q        Q         R         R     S     T     U       W@!                  =            ;           :         :        9        9    9   8  8   8  8  8   8  8  8  8   8     8      9       9        9          :             :             <>h    =l       )     &    %  $ /  $  -     $ ,        $ ,        #+       $+     $+    $+    $ +  % +    & ,     ' -    2  /   ! 2"7       27       27       27    2 7  2 7   27    2     2!2-aI G !  .OO    ON      OM        ^ C         ^ ?          ^ ?         ^ ?        ^ G      ^ L     ^ L    ^ L   PM  PM  PD    ^ D   ^ D   ^  D   ^      ^      ^      ^      ^      O       O        O8? !  -   0      /         .      -        ,        ,        ,      +       +       +       +    +  +  +      +   +   +   ,     ,     ,      -      -    .         .         / 6,    1{ W       ~W     VW VW VW WW  WW     WW          WW          TW#      TW"    !UW     %YW      YW    YW      YW      ZW   ZW!     VW       WW       WW    [X [X  \Y  \Z     \[         \]         ]+                  /                                                                                                                                                                  @   k     i     h    g   f    f      e       e       e     e    e   e    e   f  f f g  h #  j ' l ) w    w    w      w     w      w    w   w   w   w     w   w?lprint-1.3.1/xcode/000077500000000000000000000000001456151556700141455ustar00rootroot00000000000000lprint-1.3.1/xcode/config.h000066400000000000000000000007151456151556700155660ustar00rootroot00000000000000// // Xcode configuration header file for LPrint, a Label Printer Application // // Copyright © 2019-2024 by Michael R Sweet. // // Licensed under Apache License v2.0. See the file "LICENSE" for more // information. // // Version number #define LPRINT_VERSION "1.3.1" #define LPRINT_MAJOR_VERSION 1 #define LPRINT_MINOR_VERSION 3 #define LPRINT_PATCH_VERSION 1 // Enable experimental drivers? /*#undef LPRINT_EXPERIMENTAL */ #define LPRINT_EXPERIMENTAL 1 lprint-1.3.1/xcode/lprint.xcodeproj/000077500000000000000000000000001456151556700174515ustar00rootroot00000000000000lprint-1.3.1/xcode/lprint.xcodeproj/project.pbxproj000066400000000000000000001233211456151556700225270ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 2715B53225FD7FC200C0BBF6 /* lprint-zpl.c in Sources */ = {isa = PBXBuildFile; fileRef = 2715B52D25FD7FC200C0BBF6 /* lprint-zpl.c */; }; 2715B53325FD7FC200C0BBF6 /* lprint-common.c in Sources */ = {isa = PBXBuildFile; fileRef = 2715B53025FD7FC200C0BBF6 /* lprint-common.c */; }; 2715B53425FD7FC200C0BBF6 /* lprint-dymo.c in Sources */ = {isa = PBXBuildFile; fileRef = 2715B53125FD7FC200C0BBF6 /* lprint-dymo.c */; }; 271DBD422B56EB3A00475159 /* lprint-brother.c in Sources */ = {isa = PBXBuildFile; fileRef = 27712E3D2B12A48B0032AE30 /* lprint-brother.c */; }; 271DBD472B56ED0D00475159 /* lprint-cpcl.c in Sources */ = {isa = PBXBuildFile; fileRef = 271DBD432B56ED0D00475159 /* lprint-cpcl.c */; }; 272FF1992966330F008C4F4F /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 272FF1982966330F008C4F4F /* Security.framework */; }; 273A4980276BB83B00C3B44E /* lprint-epl2.c in Sources */ = {isa = PBXBuildFile; fileRef = 273A497F276BB83B00C3B44E /* lprint-epl2.c */; }; 273A4982276BCE3100C3B44E /* libjpeg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 273A4981276BCE3100C3B44E /* libjpeg.a */; }; 275C79822772301C00BB595D /* lprint-testpage.c in Sources */ = {isa = PBXBuildFile; fileRef = 275C79812772301C00BB595D /* lprint-testpage.c */; }; 27712E402B12A48B0032AE30 /* lprint-tspl.c in Sources */ = {isa = PBXBuildFile; fileRef = 27712E3B2B12A48B0032AE30 /* lprint-tspl.c */; }; 27712E412B12A48B0032AE30 /* lprint-brother.c in Sources */ = {isa = PBXBuildFile; fileRef = 27712E3D2B12A48B0032AE30 /* lprint-brother.c */; }; 27712E422B12A48B0032AE30 /* lprint-sii.c in Sources */ = {isa = PBXBuildFile; fileRef = 27712E3E2B12A48B0032AE30 /* lprint-sii.c */; }; 277343A82964619E00380814 /* libcups3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343A72964619E00380814 /* libcups3.a */; }; 277343AB296461CB00380814 /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343A9296461CB00380814 /* libssl.a */; }; 277343AC296461CB00380814 /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343AA296461CB00380814 /* libcrypto.a */; }; 277343AE296461E100380814 /* libobjc.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343AD296461E100380814 /* libobjc.tbd */; }; 277343B0296461F000380814 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343AF296461F000380814 /* libiconv.tbd */; }; 277343B2296461FD00380814 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343B1296461FD00380814 /* libresolv.tbd */; }; 277343B42964620400380814 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343B32964620400380814 /* Cocoa.framework */; }; 277BC9BE23D88C930022AC4D /* libpam.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEEF2396995C00BB195A /* libpam.tbd */; }; 2790DD5625FB037A00686B4C /* libpappl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2790DD5525FB037A00686B4C /* libpappl.a */; }; 27E485962B55DFCC00202288 /* lprint-sii.c in Sources */ = {isa = PBXBuildFile; fileRef = 27712E3E2B12A48B0032AE30 /* lprint-sii.c */; }; 27E485972B55DFCC00202288 /* lprint-tspl.c in Sources */ = {isa = PBXBuildFile; fileRef = 27712E3B2B12A48B0032AE30 /* lprint-tspl.c */; }; 27EC68942967B17700ABB3EE /* lprint-common.c in Sources */ = {isa = PBXBuildFile; fileRef = 2715B53025FD7FC200C0BBF6 /* lprint-common.c */; }; 27EC68962967B17700ABB3EE /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 272FF1982966330F008C4F4F /* Security.framework */; }; 27EC68972967B17700ABB3EE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343B32964620400380814 /* Cocoa.framework */; }; 27EC68982967B17700ABB3EE /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343B1296461FD00380814 /* libresolv.tbd */; }; 27EC68992967B17700ABB3EE /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343AF296461F000380814 /* libiconv.tbd */; }; 27EC689A2967B17700ABB3EE /* libobjc.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343AD296461E100380814 /* libobjc.tbd */; }; 27EC689B2967B17700ABB3EE /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343A9296461CB00380814 /* libssl.a */; }; 27EC689C2967B17700ABB3EE /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343AA296461CB00380814 /* libcrypto.a */; }; 27EC689D2967B17700ABB3EE /* libcups3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 277343A72964619E00380814 /* libcups3.a */; }; 27EC689E2967B17700ABB3EE /* libjpeg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 273A4981276BCE3100C3B44E /* libjpeg.a */; }; 27EC689F2967B17700ABB3EE /* libpappl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2790DD5525FB037A00686B4C /* libpappl.a */; }; 27EC68A02967B17700ABB3EE /* libpng16.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FE0EEC23CBFDFD00FE1347 /* libpng16.a */; }; 27EC68A12967B17700ABB3EE /* libpam.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEEF2396995C00BB195A /* libpam.tbd */; }; 27EC68A22967B17700ABB3EE /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FE0EEA23CBFC6200FE1347 /* libz.tbd */; }; 27EC68A32967B17700ABB3EE /* libdl.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEF723969AB700BB195A /* libdl.tbd */; }; 27EC68A42967B17700ABB3EE /* libpthread.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEFD23969AD900BB195A /* libpthread.tbd */; }; 27EC68A52967B17700ABB3EE /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEFB23969ACC00BB195A /* CoreFoundation.framework */; }; 27EC68A62967B17700ABB3EE /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEF923969AC000BB195A /* SystemConfiguration.framework */; }; 27EC68A72967B17700ABB3EE /* libusb-1.0.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEF32396998300BB195A /* libusb-1.0.a */; }; 27EC68A82967B17700ABB3EE /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEF12396996600BB195A /* IOKit.framework */; }; 27EC68AF2967B1A400ABB3EE /* testdither.c in Sources */ = {isa = PBXBuildFile; fileRef = 27EC68AE2967B1A400ABB3EE /* testdither.c */; }; 27FBEEE52396988300BB195A /* lprint.c in Sources */ = {isa = PBXBuildFile; fileRef = 27FBEEC92396988300BB195A /* lprint.c */; }; 27FBEEF22396996600BB195A /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEF12396996600BB195A /* IOKit.framework */; }; 27FBEEF42396998300BB195A /* libusb-1.0.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEF32396998300BB195A /* libusb-1.0.a */; }; 27FBEEF823969AB700BB195A /* libdl.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEF723969AB700BB195A /* libdl.tbd */; }; 27FBEEFA23969AC000BB195A /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEF923969AC000BB195A /* SystemConfiguration.framework */; }; 27FBEEFC23969ACC00BB195A /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEFB23969ACC00BB195A /* CoreFoundation.framework */; }; 27FBEEFE23969AD900BB195A /* libpthread.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FBEEFD23969AD900BB195A /* libpthread.tbd */; }; 27FE0EEB23CBFC6200FE1347 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FE0EEA23CBFC6200FE1347 /* libz.tbd */; }; 27FE0EED23CBFDFD00FE1347 /* libpng16.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27FE0EEC23CBFDFD00FE1347 /* libpng16.a */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 27155EA1239697D4000D0567 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; 27EC68A92967B17700ABB3EE /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 27155EA3239697D4000D0567 /* lprint */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lprint; sourceTree = BUILT_PRODUCTS_DIR; }; 2715B52D25FD7FC200C0BBF6 /* lprint-zpl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-zpl.c"; path = "../lprint-zpl.c"; sourceTree = ""; }; 2715B52E25FD7FC200C0BBF6 /* lprint-zpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-zpl.h"; path = "../lprint-zpl.h"; sourceTree = ""; }; 2715B52F25FD7FC200C0BBF6 /* lprint-dymo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-dymo.h"; path = "../lprint-dymo.h"; sourceTree = ""; }; 2715B53025FD7FC200C0BBF6 /* lprint-common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-common.c"; path = "../lprint-common.c"; sourceTree = ""; }; 2715B53125FD7FC200C0BBF6 /* lprint-dymo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-dymo.c"; path = "../lprint-dymo.c"; sourceTree = ""; }; 271DBD432B56ED0D00475159 /* lprint-cpcl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-cpcl.c"; path = "../lprint-cpcl.c"; sourceTree = ""; }; 271DBD4C2B56EDC000475159 /* lprint-cpcl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-cpcl.h"; path = "../lprint-cpcl.h"; sourceTree = ""; }; 2724350F23A441DB00B318AF /* lprint-default.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-default.1"; path = "../man/lprint-default.1"; sourceTree = ""; }; 2724351023A441DB00B318AF /* lprint-delete.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-delete.1"; path = "../man/lprint-delete.1"; sourceTree = ""; }; 2724351123A441DB00B318AF /* lprint-modify.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-modify.1"; path = "../man/lprint-modify.1"; sourceTree = ""; }; 2724351223A441DB00B318AF /* lprint-add.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-add.1"; path = "../man/lprint-add.1"; sourceTree = ""; }; 272FF1982966330F008C4F4F /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 273A497F276BB83B00C3B44E /* lprint-epl2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-epl2.c"; path = "../lprint-epl2.c"; sourceTree = ""; }; 273A4981276BCE3100C3B44E /* libjpeg.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjpeg.a; path = ../../../../../usr/local/lib/libjpeg.a; sourceTree = ""; }; 275C79802770055400BB595D /* lprint-epl2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-epl2.h"; path = "../lprint-epl2.h"; sourceTree = ""; }; 275C79812772301C00BB595D /* lprint-testpage.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-testpage.c"; path = "../lprint-testpage.c"; sourceTree = ""; }; 27712E3A2B12A48B0032AE30 /* lprint-sii.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-sii.h"; path = "../lprint-sii.h"; sourceTree = ""; }; 27712E3B2B12A48B0032AE30 /* lprint-tspl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-tspl.c"; path = "../lprint-tspl.c"; sourceTree = ""; }; 27712E3C2B12A48B0032AE30 /* lprint-brother.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-brother.h"; path = "../lprint-brother.h"; sourceTree = ""; }; 27712E3D2B12A48B0032AE30 /* lprint-brother.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-brother.c"; path = "../lprint-brother.c"; sourceTree = ""; }; 27712E3E2B12A48B0032AE30 /* lprint-sii.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "lprint-sii.c"; path = "../lprint-sii.c"; sourceTree = ""; }; 27712E3F2B12A48B0032AE30 /* lprint-tspl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-tspl.h"; path = "../lprint-tspl.h"; sourceTree = ""; }; 277343A72964619E00380814 /* libcups3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcups3.a; path = ../../../../../usr/local/lib/libcups3.a; sourceTree = ""; }; 277343A9296461CB00380814 /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libssl.a; path = ../../../../../usr/local/lib/libssl.a; sourceTree = ""; }; 277343AA296461CB00380814 /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = ../../../../../usr/local/lib/libcrypto.a; sourceTree = ""; }; 277343AD296461E100380814 /* libobjc.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libobjc.tbd; path = usr/lib/libobjc.tbd; sourceTree = SDKROOT; }; 277343AF296461F000380814 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; 277343B1296461FD00380814 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; }; 277343B32964620400380814 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 277BC9BF23D9E2DA0022AC4D /* lprint-es-strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-es-strings.h"; path = "../static-resources/lprint-es-strings.h"; sourceTree = ""; }; 277BC9C023D9E2DA0022AC4D /* lprint-fr-strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-fr-strings.h"; path = "../static-resources/lprint-fr-strings.h"; sourceTree = ""; }; 277BC9C123D9E2DB0022AC4D /* lprint-it-strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-it-strings.h"; path = "../static-resources/lprint-it-strings.h"; sourceTree = ""; }; 277BC9C223D9E2DB0022AC4D /* lprint-de-strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-de-strings.h"; path = "../static-resources/lprint-de-strings.h"; sourceTree = ""; }; 277BC9C323D9E2DB0022AC4D /* lprint-en-strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-en-strings.h"; path = "../static-resources/lprint-en-strings.h"; sourceTree = ""; }; 2790DD5525FB037A00686B4C /* libpappl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpappl.a; path = ../../../../../usr/local/lib/libpappl.a; sourceTree = ""; }; 27BE5C4623CCA1B10095CD45 /* CONTRIBUTING.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = CONTRIBUTING.md; path = ../CONTRIBUTING.md; sourceTree = ""; }; 27BE5C4723CCA1B10095CD45 /* DOCUMENTATION.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = DOCUMENTATION.md; path = ../DOCUMENTATION.md; sourceTree = ""; }; 27BE5C4823CCA1B10095CD45 /* CHANGES.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = CHANGES.md; path = ../CHANGES.md; sourceTree = ""; }; 27EC68AD2967B17700ABB3EE /* testdither */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testdither; sourceTree = BUILT_PRODUCTS_DIR; }; 27EC68AE2967B1A400ABB3EE /* testdither.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testdither.c; path = ../testdither.c; sourceTree = ""; }; 27FB485723BD7D8000BE0E47 /* lprint-large-png.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-large-png.h"; path = "../static-resources/lprint-large-png.h"; sourceTree = ""; }; 27FB486023C2519B00BE0E47 /* lprint-drivers.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-drivers.1"; path = "../man/lprint-drivers.1"; sourceTree = ""; }; 27FB486123C2519B00BE0E47 /* lprint-options.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-options.1"; path = "../man/lprint-options.1"; sourceTree = ""; }; 27FBEEA32396988200BB195A /* lprint-jobs.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-jobs.1"; path = "../man/lprint-jobs.1"; sourceTree = ""; }; 27FBEEA52396988200BB195A /* lprint-shutdown.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-shutdown.1"; path = "../man/lprint-shutdown.1"; sourceTree = ""; }; 27FBEEA82396988200BB195A /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 27FBEEA92396988200BB195A /* lprint-printers.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-printers.1"; path = "../man/lprint-printers.1"; sourceTree = ""; }; 27FBEEAA2396988200BB195A /* lprint-png.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lprint-png.h"; path = "../static-resources/lprint-png.h"; sourceTree = ""; }; 27FBEEAC2396988200BB195A /* NOTICE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = NOTICE; path = ../NOTICE; sourceTree = ""; }; 27FBEEAD2396988200BB195A /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 27FBEEAE2396988200BB195A /* lprint-cancel.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-cancel.1"; path = "../man/lprint-cancel.1"; sourceTree = ""; }; 27FBEEB02396988200BB195A /* lprint.conf.5 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = lprint.conf.5; path = ../man/lprint.conf.5; sourceTree = ""; }; 27FBEEB52396988200BB195A /* lprint-server.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-server.1"; path = "../man/lprint-server.1"; sourceTree = ""; }; 27FBEEBD2396988200BB195A /* lprint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lprint.h; path = ../lprint.h; sourceTree = ""; }; 27FBEEBE2396988300BB195A /* lprint-devices.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-devices.1"; path = "../man/lprint-devices.1"; sourceTree = ""; }; 27FBEEC62396988300BB195A /* lprint.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = lprint.1; path = ../man/lprint.1; sourceTree = ""; }; 27FBEEC82396988300BB195A /* lprint-submit.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-submit.1"; path = "../man/lprint-submit.1"; sourceTree = ""; }; 27FBEEC92396988300BB195A /* lprint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lprint.c; path = ../lprint.c; sourceTree = ""; }; 27FBEECF2396988300BB195A /* lprint-status.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = "lprint-status.1"; path = "../man/lprint-status.1"; sourceTree = ""; }; 27FBEEED2396994E00BB195A /* libcups.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libcups.tbd; path = usr/lib/libcups.tbd; sourceTree = SDKROOT; }; 27FBEEEF2396995C00BB195A /* libpam.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libpam.tbd; path = usr/lib/libpam.tbd; sourceTree = SDKROOT; }; 27FBEEF12396996600BB195A /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 27FBEEF32396998300BB195A /* libusb-1.0.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libusb-1.0.a"; path = "../../../../../usr/local/lib/libusb-1.0.a"; sourceTree = ""; }; 27FBEEF5239699A600BB195A /* libpng16.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpng16.a; path = ../../../../../usr/local/Cellar/libpng/1.6.34/lib/libpng16.a; sourceTree = ""; }; 27FBEEF723969AB700BB195A /* libdl.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libdl.tbd; path = usr/lib/libdl.tbd; sourceTree = SDKROOT; }; 27FBEEF923969AC000BB195A /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; 27FBEEFB23969ACC00BB195A /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; 27FBEEFD23969AD900BB195A /* libpthread.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libpthread.tbd; path = usr/lib/libpthread.tbd; sourceTree = SDKROOT; }; 27FBEEFF23969DF900BB195A /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; 27FBEF0123969E2A00BB195A /* Makefile.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = Makefile.in; path = ../Makefile.in; sourceTree = ""; }; 27FBEF0223969E2A00BB195A /* config.h.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = config.h.in; path = ../config.h.in; sourceTree = ""; }; 27FBEF0323969E2B00BB195A /* configure.ac */ = {isa = PBXFileReference; lastKnownFileType = text; name = configure.ac; path = ../configure.ac; sourceTree = ""; }; 27FE0EEA23CBFC6200FE1347 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 27FE0EEC23CBFDFD00FE1347 /* libpng16.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpng16.a; path = ../../../../../usr/local/lib/libpng16.a; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 27155EA0239697D4000D0567 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 272FF1992966330F008C4F4F /* Security.framework in Frameworks */, 277343B42964620400380814 /* Cocoa.framework in Frameworks */, 277343B2296461FD00380814 /* libresolv.tbd in Frameworks */, 277343B0296461F000380814 /* libiconv.tbd in Frameworks */, 277343AE296461E100380814 /* libobjc.tbd in Frameworks */, 277343AB296461CB00380814 /* libssl.a in Frameworks */, 277343AC296461CB00380814 /* libcrypto.a in Frameworks */, 277343A82964619E00380814 /* libcups3.a in Frameworks */, 273A4982276BCE3100C3B44E /* libjpeg.a in Frameworks */, 2790DD5625FB037A00686B4C /* libpappl.a in Frameworks */, 27FE0EED23CBFDFD00FE1347 /* libpng16.a in Frameworks */, 277BC9BE23D88C930022AC4D /* libpam.tbd in Frameworks */, 27FE0EEB23CBFC6200FE1347 /* libz.tbd in Frameworks */, 27FBEEF823969AB700BB195A /* libdl.tbd in Frameworks */, 27FBEEFE23969AD900BB195A /* libpthread.tbd in Frameworks */, 27FBEEFC23969ACC00BB195A /* CoreFoundation.framework in Frameworks */, 27FBEEFA23969AC000BB195A /* SystemConfiguration.framework in Frameworks */, 27FBEEF42396998300BB195A /* libusb-1.0.a in Frameworks */, 27FBEEF22396996600BB195A /* IOKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 27EC68952967B17700ABB3EE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 27EC68962967B17700ABB3EE /* Security.framework in Frameworks */, 27EC68972967B17700ABB3EE /* Cocoa.framework in Frameworks */, 27EC68982967B17700ABB3EE /* libresolv.tbd in Frameworks */, 27EC68992967B17700ABB3EE /* libiconv.tbd in Frameworks */, 27EC689A2967B17700ABB3EE /* libobjc.tbd in Frameworks */, 27EC689B2967B17700ABB3EE /* libssl.a in Frameworks */, 27EC689C2967B17700ABB3EE /* libcrypto.a in Frameworks */, 27EC689D2967B17700ABB3EE /* libcups3.a in Frameworks */, 27EC689E2967B17700ABB3EE /* libjpeg.a in Frameworks */, 27EC689F2967B17700ABB3EE /* libpappl.a in Frameworks */, 27EC68A02967B17700ABB3EE /* libpng16.a in Frameworks */, 27EC68A12967B17700ABB3EE /* libpam.tbd in Frameworks */, 27EC68A22967B17700ABB3EE /* libz.tbd in Frameworks */, 27EC68A32967B17700ABB3EE /* libdl.tbd in Frameworks */, 27EC68A42967B17700ABB3EE /* libpthread.tbd in Frameworks */, 27EC68A52967B17700ABB3EE /* CoreFoundation.framework in Frameworks */, 27EC68A62967B17700ABB3EE /* SystemConfiguration.framework in Frameworks */, 27EC68A72967B17700ABB3EE /* libusb-1.0.a in Frameworks */, 27EC68A82967B17700ABB3EE /* IOKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 27155E9A239697D4000D0567 = { isa = PBXGroup; children = ( 27FBEF0023969E0900BB195A /* Autoconf */, 27FBEEEB2396988F00BB195A /* Documentation */, 27FBEEFF23969DF900BB195A /* config.h */, 27FBEEBD2396988200BB195A /* lprint.h */, 27FBEEC92396988300BB195A /* lprint.c */, 27712E3C2B12A48B0032AE30 /* lprint-brother.h */, 27712E3D2B12A48B0032AE30 /* lprint-brother.c */, 2715B53025FD7FC200C0BBF6 /* lprint-common.c */, 271DBD4C2B56EDC000475159 /* lprint-cpcl.h */, 271DBD432B56ED0D00475159 /* lprint-cpcl.c */, 2715B52F25FD7FC200C0BBF6 /* lprint-dymo.h */, 2715B53125FD7FC200C0BBF6 /* lprint-dymo.c */, 275C79802770055400BB595D /* lprint-epl2.h */, 273A497F276BB83B00C3B44E /* lprint-epl2.c */, 27712E3A2B12A48B0032AE30 /* lprint-sii.h */, 27712E3E2B12A48B0032AE30 /* lprint-sii.c */, 275C79812772301C00BB595D /* lprint-testpage.c */, 27712E3F2B12A48B0032AE30 /* lprint-tspl.h */, 27712E3B2B12A48B0032AE30 /* lprint-tspl.c */, 2715B52E25FD7FC200C0BBF6 /* lprint-zpl.h */, 2715B52D25FD7FC200C0BBF6 /* lprint-zpl.c */, 27EC68AE2967B1A400ABB3EE /* testdither.c */, 27FB485E23C0D91300BE0E47 /* Static Resources */, 27155EA4239697D4000D0567 /* Products */, 27FBEEEC2396994E00BB195A /* Frameworks */, ); sourceTree = ""; }; 27155EA4239697D4000D0567 /* Products */ = { isa = PBXGroup; children = ( 27155EA3239697D4000D0567 /* lprint */, 27EC68AD2967B17700ABB3EE /* testdither */, ); name = Products; sourceTree = ""; }; 27FB485E23C0D91300BE0E47 /* Static Resources */ = { isa = PBXGroup; children = ( 277BC9C223D9E2DB0022AC4D /* lprint-de-strings.h */, 277BC9C323D9E2DB0022AC4D /* lprint-en-strings.h */, 277BC9BF23D9E2DA0022AC4D /* lprint-es-strings.h */, 277BC9C023D9E2DA0022AC4D /* lprint-fr-strings.h */, 277BC9C123D9E2DB0022AC4D /* lprint-it-strings.h */, 27FBEEAA2396988200BB195A /* lprint-png.h */, 27FB485723BD7D8000BE0E47 /* lprint-large-png.h */, ); name = "Static Resources"; sourceTree = ""; }; 27FBEEEB2396988F00BB195A /* Documentation */ = { isa = PBXGroup; children = ( 27BE5C4823CCA1B10095CD45 /* CHANGES.md */, 27BE5C4623CCA1B10095CD45 /* CONTRIBUTING.md */, 27BE5C4723CCA1B10095CD45 /* DOCUMENTATION.md */, 27FBEEAD2396988200BB195A /* LICENSE */, 27FBEEAC2396988200BB195A /* NOTICE */, 27FBEEA82396988200BB195A /* README.md */, 2724351223A441DB00B318AF /* lprint-add.1 */, 27FBEEAE2396988200BB195A /* lprint-cancel.1 */, 2724350F23A441DB00B318AF /* lprint-default.1 */, 2724351023A441DB00B318AF /* lprint-delete.1 */, 27FBEEBE2396988300BB195A /* lprint-devices.1 */, 27FB486023C2519B00BE0E47 /* lprint-drivers.1 */, 27FBEEA32396988200BB195A /* lprint-jobs.1 */, 2724351123A441DB00B318AF /* lprint-modify.1 */, 27FB486123C2519B00BE0E47 /* lprint-options.1 */, 27FBEEA92396988200BB195A /* lprint-printers.1 */, 27FBEEB52396988200BB195A /* lprint-server.1 */, 27FBEEA52396988200BB195A /* lprint-shutdown.1 */, 27FBEECF2396988300BB195A /* lprint-status.1 */, 27FBEEC82396988300BB195A /* lprint-submit.1 */, 27FBEEC62396988300BB195A /* lprint.1 */, 27FBEEB02396988200BB195A /* lprint.conf.5 */, ); name = Documentation; sourceTree = ""; }; 27FBEEEC2396994E00BB195A /* Frameworks */ = { isa = PBXGroup; children = ( 272FF1982966330F008C4F4F /* Security.framework */, 277343B32964620400380814 /* Cocoa.framework */, 277343B1296461FD00380814 /* libresolv.tbd */, 277343AF296461F000380814 /* libiconv.tbd */, 277343AD296461E100380814 /* libobjc.tbd */, 277343AA296461CB00380814 /* libcrypto.a */, 277343A9296461CB00380814 /* libssl.a */, 277343A72964619E00380814 /* libcups3.a */, 273A4981276BCE3100C3B44E /* libjpeg.a */, 2790DD5525FB037A00686B4C /* libpappl.a */, 27FE0EEC23CBFDFD00FE1347 /* libpng16.a */, 27FE0EEA23CBFC6200FE1347 /* libz.tbd */, 27FBEEFD23969AD900BB195A /* libpthread.tbd */, 27FBEEFB23969ACC00BB195A /* CoreFoundation.framework */, 27FBEEF923969AC000BB195A /* SystemConfiguration.framework */, 27FBEEF723969AB700BB195A /* libdl.tbd */, 27FBEEF5239699A600BB195A /* libpng16.a */, 27FBEEF32396998300BB195A /* libusb-1.0.a */, 27FBEEF12396996600BB195A /* IOKit.framework */, 27FBEEEF2396995C00BB195A /* libpam.tbd */, 27FBEEED2396994E00BB195A /* libcups.tbd */, ); name = Frameworks; sourceTree = ""; }; 27FBEF0023969E0900BB195A /* Autoconf */ = { isa = PBXGroup; children = ( 27FBEF0223969E2A00BB195A /* config.h.in */, 27FBEF0323969E2B00BB195A /* configure.ac */, 27FBEF0123969E2A00BB195A /* Makefile.in */, ); name = Autoconf; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 27155EA2239697D4000D0567 /* lprint */ = { isa = PBXNativeTarget; buildConfigurationList = 27155EAA239697D4000D0567 /* Build configuration list for PBXNativeTarget "lprint" */; buildPhases = ( 27155E9F239697D4000D0567 /* Sources */, 27155EA0239697D4000D0567 /* Frameworks */, 27155EA1239697D4000D0567 /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = lprint; productName = lprint; productReference = 27155EA3239697D4000D0567 /* lprint */; productType = "com.apple.product-type.tool"; }; 27EC688D2967B17700ABB3EE /* testdither */ = { isa = PBXNativeTarget; buildConfigurationList = 27EC68AA2967B17700ABB3EE /* Build configuration list for PBXNativeTarget "testdither" */; buildPhases = ( 27EC688E2967B17700ABB3EE /* Sources */, 27EC68952967B17700ABB3EE /* Frameworks */, 27EC68A92967B17700ABB3EE /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = testdither; productName = lprint; productReference = 27EC68AD2967B17700ABB3EE /* testdither */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 27155E9B239697D4000D0567 /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1520; ORGANIZATIONNAME = "Michael R Sweet"; TargetAttributes = { 27155EA2239697D4000D0567 = { CreatedOnToolsVersion = 11.2.1; }; }; }; buildConfigurationList = 27155E9E239697D4000D0567 /* Build configuration list for PBXProject "lprint" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 27155E9A239697D4000D0567; productRefGroup = 27155EA4239697D4000D0567 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 27155EA2239697D4000D0567 /* lprint */, 27EC688D2967B17700ABB3EE /* testdither */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 27155E9F239697D4000D0567 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 271DBD472B56ED0D00475159 /* lprint-cpcl.c in Sources */, 27FBEEE52396988300BB195A /* lprint.c in Sources */, 271DBD422B56EB3A00475159 /* lprint-brother.c in Sources */, 2715B53325FD7FC200C0BBF6 /* lprint-common.c in Sources */, 2715B53425FD7FC200C0BBF6 /* lprint-dymo.c in Sources */, 273A4980276BB83B00C3B44E /* lprint-epl2.c in Sources */, 27E485962B55DFCC00202288 /* lprint-sii.c in Sources */, 275C79822772301C00BB595D /* lprint-testpage.c in Sources */, 27E485972B55DFCC00202288 /* lprint-tspl.c in Sources */, 2715B53225FD7FC200C0BBF6 /* lprint-zpl.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 27EC688E2967B17700ABB3EE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 27712E422B12A48B0032AE30 /* lprint-sii.c in Sources */, 27712E402B12A48B0032AE30 /* lprint-tspl.c in Sources */, 27712E412B12A48B0032AE30 /* lprint-brother.c in Sources */, 27EC68942967B17700ABB3EE /* lprint-common.c in Sources */, 27EC68AF2967B1A400ABB3EE /* testdither.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 27155EA8239697D4000D0567 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ., /usr/local/include, /usr/local/include/libpng16, "/usr/local/include/libusb-1.0", ); INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = /usr/local/lib; MACOSX_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 27155EA9239697D4000D0567 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Apple Development"; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ., /usr/local/include, /usr/local/include/libpng16, "/usr/local/include/libusb-1.0", ); INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = /usr/local/lib; MACOSX_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; }; name = Release; }; 27155EAB239697D4000D0567 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = RU58A2256H; ENABLE_HARDENED_RUNTIME = YES; LIBRARY_SEARCH_PATHS = "$(inherited)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 27155EAC239697D4000D0567 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = RU58A2256H; ENABLE_HARDENED_RUNTIME = YES; LIBRARY_SEARCH_PATHS = "$(inherited)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; 27EC68AB2967B17700ABB3EE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = RU58A2256H; ENABLE_HARDENED_RUNTIME = YES; LIBRARY_SEARCH_PATHS = "$(inherited)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 27EC68AC2967B17700ABB3EE /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = RU58A2256H; ENABLE_HARDENED_RUNTIME = YES; LIBRARY_SEARCH_PATHS = "$(inherited)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 27155E9E239697D4000D0567 /* Build configuration list for PBXProject "lprint" */ = { isa = XCConfigurationList; buildConfigurations = ( 27155EA8239697D4000D0567 /* Debug */, 27155EA9239697D4000D0567 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 27155EAA239697D4000D0567 /* Build configuration list for PBXNativeTarget "lprint" */ = { isa = XCConfigurationList; buildConfigurations = ( 27155EAB239697D4000D0567 /* Debug */, 27155EAC239697D4000D0567 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 27EC68AA2967B17700ABB3EE /* Build configuration list for PBXNativeTarget "testdither" */ = { isa = XCConfigurationList; buildConfigurations = ( 27EC68AB2967B17700ABB3EE /* Debug */, 27EC68AC2967B17700ABB3EE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 27155E9B239697D4000D0567 /* Project object */; } lprint-1.3.1/xcode/lprint.xcodeproj/project.xcworkspace/000077500000000000000000000000001456151556700234475ustar00rootroot00000000000000lprint-1.3.1/xcode/lprint.xcodeproj/project.xcworkspace/contents.xcworkspacedata000066400000000000000000000002271456151556700304120ustar00rootroot00000000000000 lprint-1.3.1/xcode/lprint.xcodeproj/project.xcworkspace/xcshareddata/000077500000000000000000000000001456151556700261025ustar00rootroot00000000000000lprint-1.3.1/xcode/lprint.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist000066400000000000000000000003561456151556700325640ustar00rootroot00000000000000 IDEDidComputeMac32BitWarning