From a3623cb733d4a3ddcf8ba280724b8ce3f19a7a58 Mon Sep 17 00:00:00 2001 From: rwatson Date: Sun, 25 May 2008 22:11:40 +0000 Subject: Remove netatm from HEAD as it is not MPSAFE and relies on the now removed NET_NEEDS_GIANT. netatm has been disconnected from the build for ten months in HEAD/RELENG_7. Specifics: - netatm include files - netatm command line management tools - libatm - ATM parts in rescue and sysinstall - sample configuration files and documents - kernel support as a module or in NOTES - netgraph wrapper nodes for netatm - ctags data for netatm. - netatm-specific device drivers. MFC after: 3 weeks Reviewed by: bz Discussed with: bms, bz, harti --- sbin/atm/Makefile | 5 - sbin/atm/atm/Makefile | 42 - sbin/atm/atm/atm.8 | 993 ----------- sbin/atm/atm/atm.c | 1143 ------------ sbin/atm/atm/atm.h | 195 --- sbin/atm/atm/atm_fore200.c | 596 ------- sbin/atm/atm/atm_inet.c | 154 -- sbin/atm/atm/atm_print.c | 891 ---------- sbin/atm/atm/atm_set.c | 528 ------ sbin/atm/atm/atm_show.c | 1144 ------------ sbin/atm/atm/atm_subr.c | 626 ------- sbin/atm/fore_dnld/COPYRIGHT | 38 - sbin/atm/fore_dnld/Makefile | 36 - sbin/atm/fore_dnld/fore_dnld.8 | 114 -- sbin/atm/fore_dnld/fore_dnld.c | 1346 -------------- sbin/atm/fore_dnld/pca200e.c | 3796 ---------------------------------------- sbin/atm/ilmid/Makefile | 40 - sbin/atm/ilmid/ilmid.8 | 110 -- sbin/atm/ilmid/ilmid.c | 2725 ---------------------------- 19 files changed, 14522 deletions(-) delete mode 100644 sbin/atm/atm/Makefile delete mode 100644 sbin/atm/atm/atm.8 delete mode 100644 sbin/atm/atm/atm.c delete mode 100644 sbin/atm/atm/atm.h delete mode 100644 sbin/atm/atm/atm_fore200.c delete mode 100644 sbin/atm/atm/atm_inet.c delete mode 100644 sbin/atm/atm/atm_print.c delete mode 100644 sbin/atm/atm/atm_set.c delete mode 100644 sbin/atm/atm/atm_show.c delete mode 100644 sbin/atm/atm/atm_subr.c delete mode 100644 sbin/atm/fore_dnld/COPYRIGHT delete mode 100644 sbin/atm/fore_dnld/Makefile delete mode 100644 sbin/atm/fore_dnld/fore_dnld.8 delete mode 100644 sbin/atm/fore_dnld/fore_dnld.c delete mode 100644 sbin/atm/fore_dnld/pca200e.c delete mode 100644 sbin/atm/ilmid/Makefile delete mode 100644 sbin/atm/ilmid/ilmid.8 delete mode 100644 sbin/atm/ilmid/ilmid.c (limited to 'sbin/atm') diff --git a/sbin/atm/Makefile b/sbin/atm/Makefile index 79fc6a3..4145d21 100644 --- a/sbin/atm/Makefile +++ b/sbin/atm/Makefile @@ -25,9 +25,4 @@ SUBDIR= atmconfig -# Disabled in 7.0 as netatm is not MPSAFE. -# atm \ -# fore_dnld \ -# ilmid - .include diff --git a/sbin/atm/atm/Makefile b/sbin/atm/atm/Makefile deleted file mode 100644 index 973e5cc..0000000 --- a/sbin/atm/atm/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# =================================== -# HARP | Host ATM Research Platform -# =================================== -# -# This Host ATM Research Platform ("HARP") file (the "Software") is -# made available by Network Computing Services, Inc. ("NetworkCS") -# "AS IS". NetworkCS does not provide maintenance, improvements or -# support of any kind. -# -# NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, -# INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE -# SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. -# In no event shall NetworkCS be responsible for any damages, including -# but not limited to consequential damages, arising from or relating to -# any use of the Software or related support. -# -# Copyright 1994-1998 Network Computing Services, Inc. -# -# Copies of this Software may be made, however, the above copyright -# notice must be reproduced on all copies. -# -# @(#) $Id: Makefile,v 1.5 1998/07/10 16:01:58 jpt Exp $ -# $FreeBSD$ - -PROG= atm -SRCS= atm.c atm_fore200.c atm_inet.c atm_print.c \ - atm_set.c atm_show.c atm_subr.c -MAN= atm.8 - -.if ${MACHINE_ARCH} == "arm" -WARNS?= 3 -.else -WARNS?= 6 -.endif - -CFLAGS+= -I${.CURDIR}/../../../sys - -DPADD= ${LIBATM} -LDADD= -latm - -.include diff --git a/sbin/atm/atm/atm.8 b/sbin/atm/atm/atm.8 deleted file mode 100644 index 7cd6493..0000000 --- a/sbin/atm/atm/atm.8 +++ /dev/null @@ -1,993 +0,0 @@ -.\" -.\" =================================== -.\" HARP | Host ATM Research Platform -.\" =================================== -.\" -.\" -.\" This Host ATM Research Platform ("HARP") file (the "Software") is -.\" made available by Network Computing Services, Inc. ("NetworkCS") -.\" "AS IS". NetworkCS does not provide maintenance, improvements or -.\" support of any kind. -.\" -.\" NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, -.\" INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY -.\" AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE -.\" SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. -.\" In no event shall NetworkCS be responsible for any damages, including -.\" but not limited to consequential damages, arising from or relating to -.\" any use of the Software or related support. -.\" -.\" Copyright 1994-1998 Network Computing Services, Inc. -.\" -.\" Copies of this Software may be made, however, the above copyright -.\" notice must be reproduced on all copies. -.\" -.\" @(#) $FreeBSD$ -.\" -.\" -.de EX \"Begin example -.ne 5 -.if n .sp 1 -.if t .sp .5 -.nf -.in +.5i -.. -.de EE -.fi -.in -.5i -.if n .sp 1 -.if t .sp .5 -.. -.TH ATM 8 "1998-08-20" "HARP" -.SH NAME -atm \- user configuration and display command for HARP ATM interface -.SH SYNOPSIS -Interface management subcommands: -.in +10 -.ti -5 -.B atm attach - -.ti -5 -.B atm detach - -.ti -5 -.B atm set MAC - -.ti -5 -.B atm set netif - -.ti -5 -.B atm set prefix - -.ti -5 -.B atm show config -[] -.ti -5 -.B atm show interface -[] -.ti -5 -.B atm show netif -[] -.ti -5 -.B atm show stats interface -[ [phy | dev | atm | aal0 | aal4 | aal5 | driver]] -.sp -.ti -10 -VCC management subcommands: -.ti -5 -.B atm add PVC - ... -.ti -5 -.B atm delete PVC - -.ti -5 -.B atm delete SVC - -.ti -5 -.B atm show stats VCC -[ [ []]] -.ti -5 -.B atm show VCC -[ [ [] | SVC | PVC]] -.sp -.ti -10 -IP management subcommands: -.ti -5 -.B atm add ARP -[] -.ti -5 -.B atm add PVC - IP [ | dynamic] ... -.ti -5 -.B atm delete ARP -[] -.ti -5 -.B atm set arpserver - | local [ ...] -.ti -5 -.B atm show ARP -[] -.ti -5 -.B atm show arpserver -[] -.ti -5 -.B atm show IPVCC -[ | ] -.ti -5 -.sp -.ti -10 -Miscellaneous subcommands: -.ti -5 -.B atm help -.ti -5 -.B atm show version -.in -10 -.fi -.SH DESCRIPTION -.I atm -configures and displays the status of the Host ATM Research Platform -(HARP) networking software. -The subcommands fall into several categories: -.PP -\fIInterface management\fP subcommands allow manipulation of the -ATM interface. -Functions include assigning a signalling manager to an interface, -setting the ATM address, associating network interfaces with -an interface, and displaying information about interfaces. -.PP -\fIVCC management\fP subcommands allow for managing ATM virtual -channel connections (VCCs). -Functions include opening and closing VCCs and displaying information -about them. -.PP -\fIIP management\fP subcommands allow for managing the interface -between IP and the ATM software. -Functions include displaying and manipulating the ATMARP cache, -opening a PVC connected to IP, -assigning an ATMARP server to a network interface, -and displaying information about IP VCCs. -.PP -\fIMiscellaneous\fP subcommands allow for displaying the version -of the ATM software and for getting help with the \fIatm\fP command. -.SS "Signalling Managers" -The signalling manager is responsible for the opening and closing of -VCCs. -Four signalling managers are supported: -.PP -.in +10 -.ti -5 -PVC - for PVCs only, -.ti -5 -SPANS - supports SPANS, FORE's proprietary signalling protocol, -.ti -5 -UNI 3.0 - supports the signalling protocol from The ATM Forum's -\fIATM User-Network Interface Specification, Version 3.0\fP. -.ti -5 -UNI 3.1 - supports the signalling protocol from The ATM Forum's -\fIATM User-Network Interface Specification, Version 3.1\fP. -.in -10 -.PP -All four signalling managers support the opening and closing of PVCs -(see the \fIadd\fP and \fIdelete\fP subcommands). -.PP -A signalling manager must be attached to a physical interface -(see the \fIattach\fP subcommand) -before any VCCs can be created on the interface. -.SS "Physical and Network Interfaces" -Two types of interfaces are supported: -physical interfaces and network interfaces. -A physical interface represents a physical point of attachment to an -ATM network. -A physical interface has an ATM address associated with it, except -when the PVC-only signalling manager is being used. -.PP -A network interface is a logical interface. -One or more network interfaces are associated with a physical -interface; each network interface has an IP address associated with it. -For UNI-controlled interfaces, there can be up to 256 network -interfaces associated with a physical interface. -In this case, the correspondence between the network interface and -the ATM address is determined by the selector field (the last -byte) of the physical interface's ATM address. -For PVC-only interfaces, there can be up to 256 logical interfaces -associated with each physical interface. -For interfaces controlled by the SPANS signalling manager, -there must be one and -only one network interface associated with each physical interface. -.SS "Keyword and Documentation Conventions" -Command and subcommand keywords can be abbreviated by simply giving -enough of the first part of the keyword to make it unique. -Thus, \fIatm sh v\fB gives the same result as \fIatm show vcc\fB. -.PP -All keywords are case-insensitive. -.PP -Where a host address needs to be given to the \fIatm\fP command, -either a DNS name or an IP address in dotted decimal format can -be used. -.PP -ATM addresses are specified as strings of hex digits, with an -optional leading "0x". -Fields within the address may be separated by periods, but periods -are for readability only and are ignored. -SPANS addresses are 8 bytes long, while NSAP-format addresses -are 20 bytes long. -The full address, including any leading zeroes, must be given. -For example: -.in +5 -0x47.0005.80.ffe100.0000.f21a.0170.0020481a0170.00 (NSAP format) -.br -0x00000010.f2050aa9 (SPANS format) -.in -5 -.fi -.SH SUBCOMMANDS -.SS Interface Management Subcommands: -.in +5 -.ti -5 -\fIatm add PVC ...\fP -.in -5 -.PP -the format of the \fIadd PVC\fP subcommand varies depending on the -owner of the PVC. -See the description under "IP Management Subcommands." -.PP -\fIatm attach \fP -.PP -where: -.in +10 -.ti -5 -\fI\fP specifies the physical interface to which the -signalling manager is to be attached, -.ti -5 -\fI\fP specifies which signalling manager is to be attached. -Valid choices are "SIGPVC", "SPANS", "UNI30", and "UNI31". -.in -10 -.PP -This command attaches a signalling manager to an interface. -Until this is done, VCCs cannot be opened or closed. -Only one signalling manager at a time can be attached to an interface. -.PP -\fIatm detach \fP -.PP -where: -.in +10 -.ti -5 -\fI\fP specifies the physical interface whose signalling -manager is to be detached. -.in -10 -.PP -This command detaches a signalling manager from an interface. -All VCCs that the signalling manager has created will be closed, -and no new VCCs can be created until a signalling manager (either -the same or a different one) is attached again. -.PP -\fIatm set MAC \fP -.PP -where: -.in +10 -.ti -5 -\fI\fP specifies the physical interface whose -MAC address is to be set, -.ti -5 -\fI\fP specifies the 6-byte MAC part of the NSAP -address for the interface. -The MAC address is specified as a string of 12 hexadecimal -digits with an optional leading "0x". -Fields in the address may be separated by periods. -.in -10 -.PP -This command sets the MAC address for a UNI-controlled interface. -The first 13 bytes (the prefix) of the 20-byte NSAP-format address -are set by the \fIatm set prefix\fP command or the ILMI daemon -(\fIilmid\fP (8)), -the next 6 bytes (the End System Identifier (ESI)) are set by -this command, -and the last byte (the selector) will be determined by which -network interface is to be associated with the address. -.PP -The \fIatm set MAC\fP command can be used to override the MAC -address in the interface hardware. -.PP -\fIatm set netif \fP -.PP -where: -.in +10 -.ti -5 -\fI\fP specifies the physical interface that the network -interface(s) are to be associated with, -.ti -5 -\fI\fP specifies the invariant part of the network -interface name, -.ti -5 -\fI\fP specifies the number of network interface to be -created. -.in -10 -.PP -This command creates one or more network interfaces and associates them -with the specified physical interface. -The network interface names are determined by the prefix and the count. -The names will be of the form , where is the -prefix specified in the \fIset\fP subcommand and is a number -in the range 0 - -1. For example, the command: -.PP -.ti +5 -atm set netif hfa0 ni 2 -.PP -would create two network interfaces, named ni0 and ni1, and associate -them with physical interface hfa0. -.PP -\fIatm set prefix \fP -.PP -where: -.in +10 -.ti -5 -\fI\fP specifies the physical interface whose NSAP -prefix is to be set, -.ti -5 -\fI\fP specifies the first 13 bytes of the NSAP address -for the interface. -The prefix is specified as a string of hexadecimal digits with an -optional leading "0x". -Fields in the prefix may be separated by periods. -.in -10 -.PP -This command sets the address for a UNI-controlled interface. -The first 13 bytes (the prefix) of the 20-byte NSAP-format address -are set by this command, -the next 6 bytes (the End System Identifier (ESI)) will be the -MAC address taken from the physical interface or set by the -\fIset MAC\fP subcommand, -and the last byte (the selector) will be determined by which -network interface is to be associated with the address. -.PP -The NSAP prefix must be set before a UNI-controlled -interface can become active. -This can be accomplished either by the ILMI daemon (\fIilmid\fP (8)) -or the \fIset prefix\fP subcommand. -.PP -.I atm show config [] -.PP -displays the following information: -.PP -.B Interface -\- the name of the physical interface. -.PP -.B Vendor -\- the name of the adapter vendor. -.PP -.B Model -\- the model of the adapter. -.PP -.B Media -\- the communications medium used by the adapter. -.PP -.B Bus -\- the type of bus the adapter is attached to. -.PP -.B Serial No. -\- the adapter's serial number. -.PP -.B MAC address -\- the MAC address of the interface. -Note that this is the MAC address encoded in the hardware of -the adapter, even if the \fIatm set MAC\fP command has been used -to change the effective MAC address of the interface. -.PP -.B Hardware version -\- the hardware revision level reported by the interface. -.PP -.B Firmware version -\- the firmware revision level reported by the interface. -.PP -If no parameters are specified on the \fIshow config\fP subcommand, -the configurations of all physical interfaces will be displayed. -If an interface name is specified, only the configuration of the given -interface is displayed. -.PP -.I atm show interface [] -.PP -displays the following information: -.PP -.B Interface -\- the name of the physical interface. -.PP -.B Sigmgr -\- the name of the signalling manager which has been attached to the -interface. -A dash (-) is shown if no signalling manager has been attached. -.PP -.B State -\- the state of the signalling manager for the interface. -Each signalling manager has its own set of states. -They are: -.in +21 -.ti -16 -PVC: -.ti -11 -ACTIVE\ ---\ The signalling manager is active. -.ti -11 -DETACH\ ---\ The signalling manager is being detached. -.ti -16 -SPANS: -.ti -11 -ACTIVE\ ---\ The signalling manager is active. -.ti -11 -DETACH\ ---\ The signalling manager is being detached. -.ti -11 -INIT\ -----\ The signalling manager's initial state. -.ti -11 -PROBE\ ----\ The signalling manager is attempting to make -contact with the ATM switch. -.ti -16 -UNI 3.0 or UNI 3.1: -.ti -11 -NULL\ -----\ The signalling manager's initial state. -.ti -11 -ADR_WAIT\ -\ The signalling manager is waiting for the NSAP -prefix to be set. -.ti -11 -INIT\ -----\ The signalling manager is attempting to establish -contact with the switch. -.ti -11 -ACTIVE\ ---\ The signalling manager is active. -.ti -11 -DETACH\ ---\ The signalling manager is being detached. -.ti -21 -.PP -.B ATM address -\- the ATM address of the interface. -.PP -.B Network interfaces -\- the names of network interfaces, if any, associated with the -physical interface. -.PP -If no parameters are specified on the \fIshow interface\fP subcommand, -information about all physical interfaces will be displayed. -If an interface name is specified, only information about the given -interface is displayed. -.PP -.I atm show netif [] -.PP -displays the following information: -.PP -.B Net Intf -\- the name of the network interface. -.PP -.B IP Address -\- the IP address of the network interface. -.PP -If no parameters are specified on the \fIshow netif\fP subcommand, -information about all network interfaces will be displayed. -If an interface name is specified, only information about the given -network interface is displayed. -.PP -\fIatm show stats interface [ [phy | dev | atm | aal0 | -aal4 | aal5 | driver]]\fP -.PP -displays statistics associated with one or more interfaces. -Subject-area keywords -(\fIphy\fP, \fIdev\fP, \fIatm\fP, \fIaal0\fP, -\fIaal4\fP, \fIaal5\fP, or \fIdriver\fP) -can be specified to change the scope of the statistics displayed. -.PP -If no subject area keyword is specified, the following information is -displayed: -.PP -.B Interface -\- the name of the physical ATM interface. -.PP -.B Input PDUs -\- the number of Protocol Data Units (PDUs) which have been received -by the interface. -.PP -.B Input Bytes -\- the number of bytes which have been received by the interface. -.PP -.B Input Errs -\- the number of input errors which the interface has experienced. -.PP -.B Output PDUs -\- the number of Protocol Data Units (PDUs) which have been transmitted -by the interface. -.PP -.B Output Bytes -\- the number of bytes which have been transmitted by the interface. -.PP -.B Output Errs -\- the number of output errors which the interface has experienced. -.PP -.B Cmd Errs -\- the number of command errors which the interface has experienced. -.PP -If a subject-area keyword is specified, then statistics for -that subject are displayed. -The statistics displayed depend on the adapter. -If requested statistics are not available for an adapter, -an error will be noted. -.PP -If no parameters are specified on the \fIshow stats interface\fP -subcommand, statistics for all ATM interfaces are displayed. -If an interface name is specified, only statistics for the given -interface are displayed. -.PP -.SS VCC Management Subcommands: -.PP -\fIatm delete PVC \fP -.br -\fIatm delete SVC \fP -.PP -where: -.in +10 -.ti -5 -\fIPVC\fP specifies that the VCC to be closed is a PVC, -.ti -5 -\fISVC\fP specifies that the VCC to be closed is an SVC, -.ti -5 -\fI\fP specifies the physical interface at which the -VCC to be closed terminates, -.ti -5 -\fI\fP specifies the Virtual Path Identifier (VPI) of the VCC, -.ti -5 -\fI\fP specifies the Virtual Channel Identifier (VCI) of the VCC. -.in -10 -.PP -This command closes a VCC. -The two forms differ only in that the first specifies that the -VCC is a PVC (that was created by the \fIadd PVC\fP subcommand) and -the second specifies that the VCC is an SVC. -Reserved VCCs (with VCI values less than 32) cannot be closed -with this command. -.PP -\fIatm show stats VCC [ [ []]]\fP -.PP -displays the following information: -.PP -.B Interface -\- the physical interface on which the VCC terminates. -.PP -.B VPI -\- the Virtual Path Identifier (VPI) for the VCC. -.PP -.B VCI -\- the Virtual Channel Identifier (VCI) for the VCC. -.PP -.B Input PDUs -\- the number of Protocol Data Units (PDUs) which have been received -on the VCC. -.PP -.B Input Bytes -\- the number of bytes which have been received on the VCC. -.PP -.B Input Errs -\- the number of input errors which the VCC has experienced. -.PP -.B Output PDUs -\- the number of Protocol Data Units (PDUs) which have been transmitted -on the VCC. -.PP -.B Output Bytes -\- the number of bytes which have been transmitted on the VCC. -.PP -.B Output Errs -\- the number of output errors which the VCC has experienced. -.PP -If no parameters are specified on the \fIshow VCC\fP subcommand, all -active VCCs are displayed. -If an interface name is specified, all active VCCs for the given -interface are displayed. -If an interface and VPI are specified, all active VCCs for the VPI -on the given interface are displayed. -If an interface, VPI, and VCI are specified, only the specified VCC on -the given interface is displayed (note that this could actually be -two VCCs, since SPANS considers SVCs to be unidirectional). -.PP -\fIatm show VCC [ [ [] | SVC | PVC]]\fP -.PP -displays the following information: -.PP -.B Interface -\- the physical interface on which the VCC terminates. -.PP -.B VPI -\- the Virtual Path Identifier (VPI) for the VCC. -.PP -.B VCI -\- the Virtual Channel Identifier (VCI) for the VCC. -.PP -.B AAL -\- the ATM Adaptation Layer (AAL) in use on the VCC. -Possible values are null and AAL 1-5. -.PP -.B Type -\- specifies whether the VCC is an SVC or a PVC. -.PP -.B Dir -\- the direction of information flow on the VCC. -VCCs can be inbound, outbound, or both. -.PP -.B State -\- the state of the VCC, as reported by the signalling manager. -Each signalling manager has its own set of states. -They are: -.in +21 -.ti -16 -PVC: -.ti -11 -NULL\ -----\ No state. -.ti -11 -ACTIVE\ ---\ The VCC is active. -.ti -11 -FREE\ -----\ The VCC is closed and the signalling manager is waiting for -its resources to be freed. -.ti -16 -SPANS: -.ti -11 -NULL\ -----\ No state. -.ti -11 -ACTIVE\ ---\ The VCC is a PVC and is active. -.ti -11 -ACT_DOWN\ -\ The VCC is a PVC and the interface is down. -.ti -11 -POPEN\ ----\ The VCC is being opened. -.ti -11 -R_POPEN\ --\ The VCC is being opened by a remote host. -.ti -11 -OPEN\ -----\ The VCC is active. -.ti -11 -CLOSE\ ----\ The VCC is being closed. -.ti -11 -ABORT\ ----\ The VCC is being aborted. -.ti -11 -FREE\ -----\ The VCC is closed and the signalling manager is waiting for -its resources to be freed. -.ti -16 -UNI 3.0 or UNI 3.1: -.ti -11 -NULL\ -----\ No state. -.ti -11 -C_INIT\ ---\ A VCC is being initiated. -.ti -11 -C_OUT_PR\ -\ An outgoing VCC request is proceeding. -.ti -11 -C_PRES\ ---\ A VCC is being initiated by the network. -.ti -11 -CONN_REQ\ -\ A VCC request has been accepted by a HARP user. -.ti -11 -C_IN_PR\ --\ An incoming VCC request is proceeding. -.ti -11 -ACTIVE\ ---\ The VCC is active. -.ti -11 -REL_REQ\ --\ The VCC is being closed. -.ti -11 -REL_IND\ --\ The network is clearing a VCC. -.ti -11 -SSCF_REC\ -\ The SSCF session on the signalling channel is in -recovery from an error. -.ti -11 -FREE\ -----\ The VCC is closed and the signalling manager is waiting -for its resources to be freed. -.ti -11 -ACT_DOWN\ -\ The VCC is a PVC and the interface is down. -.ti -21 -.PP -.B Encaps -\- the encapsulation in effect on the VCC. -Possible encapsulations are null and LLC/SNAP. -.PP -.B Owner -\- the owner or owners of the VCC. -Shows the name(s) of the function(s) using the VCC. -.PP -.B Destination -\- the ATM address of the host at the remote end of the VCC. -.PP -If no parameters are specified on the \fIshow VCC\fP subcommand, all -active VCCs are displayed. -If an interface name is specified, all active VCCs for the given -interface are displayed. -If an interface and VPI are specified, all active VCCs for the VPI -on the given interface are displayed. -If an interface, VPI, and VCI are specified, only the specified VCC on -the given interface is displayed (note that this could actually be -two VCCs, since SPANS considers SVCs to be unidirectional). -.PP -.SS IP Management Subcommands: -\fIatm add ARP [] \fP -.PP -where: -.in +10 -.ti -5 -\fI\fP is the optional name of the network interface the -ATMARP entry is to be associated with. -If no name is specified, a network interface is chosen depending -on the IP address of the host being added. -.ti -5 -\fI\fP is the host name or IP address of the host to -be added to the ATMARP table, -.ti -5 -\fI\fP is the ATM address of the host. -.in -10 -.PP -This command adds an entry to the ATMARP table for ATM. -The given host's IP address is associated with the given ATM address. -When IP needs to transmit data to the host, the specified ATM -address will be used to open an SVC. -.PP -The entry will be marked as permanent in the ATMARP table and will not -be subject to aging. -.PP -.in +5 -.ti -5 -\fIatm add PVC IP [ | dynamic] \fP -.in -5 -.PP -where: -.in +10 -.ti -5 -\fI\fP specifies the physical interface where the PVC -is to terminate, -.ti -5 -\fI\fP specifies the Virtual Path Identifier (VPI) of the PVC, -.ti -5 -\fI\fP specifies the Virtual Channel Identifier (VCI) of the PVC, -.ti -5 -\fI\fP specifies the ATM Adaptation Layer (AAL) for the PVC. -Valid choices are "null" or "AAL0" for the null AAL; "AAL1" for -AAL 1; "AAL2" for AAL 2; "AAL3", "AAL4", or "AAL3/4" for AAL 3/4; -and "AAL5" for AAL 5, -.ti -5 -\fI\fP specifies the encapsulation for the PVC. -Valid choices are "null" or "none" for null encapsulation, and -"LLC/SNAP", "LLC", or "SNAP" for LLC/SNAP encapsulation, -.ti -5 -\fIIP\fP specifies that the owner of the PVC is IP. -.ti -5 -\fI\fP specifies the network interface which the PVC is -to be associated with. -The network interface must exist and be associated with the -specified physical interface, -.ti -5 -\fI | dynamic\fP gives the address of the host at -the far end of the PVC, or the word "dynamic" if its address -is to be determined with Inverse ARP. -If "dynamic" is specified, LLC/SNAP encapsulation must also -be specified. -.ti -5 -\fI\fP is the traffic type of the PVC and may be one of -UBR, CBR or VBR. -Following the traffic type the traffic parameters must be given. -For UBR and CBR this is the peak cell rate and for VBR these -are the peak and sustainable cell rate and the maximum burst size. -.PP -This command creates a PVC with the specified attributes and attaches -it to IP. -.PP -\fIatm delete ARP [] \fP -.PP -where: -.in +10 -.ti -5 -\fI\fP is the optional name of the network interface the -ATMARP entry is associated with. -If no name is specified, the specified host is deleted from the -cache regardless of what network interface it is associated with. -.ti -5 -\fI\fP is the host name or IP address of the host to -be deleted from the ATMARP table. -.PP -This command deletes the specified host's entry from the ATMARP table. -.PP -\fIatm set arpserver | local [ ...]\fP -.PP -where: -.in +10 -.ti -5 -\fI\fP specifies the network interface for which the -ATMARP server address is to be set. -.ti -5 -\fI\fP specifies the ATM address of the host which is to -provide ATMARP service. -If "local" is specified instead of an ATM address, the host on -which the command is issued will become the ATMARP server. -.ti -5 -\fI ...\fP is an optional list of IP prefixes -that the ATMARP server will provide information about. -An IP prefix is specified as a dotted decimal IP address, followed by -a slash, followed a number specifying how many bits of the IP address -are significant. -For example, 10.0.0.0/8 indicates that the ATMARP server will provide -services for all addresses on IP network 10. -The IP subnetwork which the network interface belongs to is -automatically included. -.in -10 -.PP -This command sets the address of the ATMARP server for a network -interface. -.PP -.I atm show ARP [] -.PP -displays the following information: -.PP -.B Net Intf -\- the network interface which traffic for the entry will use. -.PP -.B Flags -\- flags showing whether the entry is valid and whether it is -permanent. -\- flags giving further information about the ATMARP entry. -The meanings of the characters in the flags are: -.PP -.in +5 -P - the entry is permanent -.br -R - the entry has been refreshed -.br -V - the entry is valid -.in -5 -.PP -.B Age -\- the number of minutes for which the entry will remain valid. -.PP -.B Origin -\- the source of the ATMARP entry. -Possible values are: -.in +16 -.ti -11 -LOCAL\ ----\ The entry is for an interface on the host. -.ti -11 -PERM\ -----\ The entry is permanent. -This is used for entries that are created with the -\fIadd ARP\fP command. -.ti -11 -REG\ ------\ The entry was created as the result of a host -registering with the ATMARP server. -.ti -11 -SCSP\ -----\ The entry was learned via SCSP. -.ti -11 -LOOKUP\ ---\ The entry was created as the result of a host -performing an ATMARP lookup. -.ti -11 -PEER_RSP\ -\ The entry was created as the result of a host -answering an InARP Request. -.ti -11 -PEER_REQ\ -\ The entry was created as the result of a host -sending an InARP Request. -.in -5 -.PP -.B ATM address -\- the ATM address of the host the entry refers to. -.PP -.B IP address -\- the IP address or domain name of the host the entry refers to. -.PP -If no parameters are specified on the \fIshow ARP\fP subcommand, -the whole ATMARP table will be displayed. -If a host name or IP address is specified, only information about the -given host is displayed. -.PP -This command displays both information that has been learned dynamically -(through one form or another of ATMARP and via SCSP) and information -which has been configured by the user (through the \fIadd ARP\fP -subcommand). -.PP -.I atm show arpserver [] -.PP -displays the following information: -.PP -.B Net Intf -\- the network interface for which information is being displayed. -.PP -.B State -\- the state of the connection to the ATMARP server. -Possible values are: -.in +16 -.ti -11 -NOT_CONF\ -\ No ATMARP server has been configured for the interface. -.ti -11 -SERVER\ ---\ The host is the ATMARP server. -.ti -11 -PEND_ADR\ -\ No ATM address has been set for the interface. -.ti -11 -POPEN\ ----\ The host is attempting to open a VCC to the ATMARP server. -.ti -11 -REGISTER\ -\ The host has a VCC open to the ATMARP server and is in -the process of registering with the server. -.ti -11 -ACTIVE\ ---\ The ATMARP server connection is active. -.in -16 -.PP -.B ATM Address -\- the ATM address of the ATMARP server. -.PP -If no parameters are specified on the \fIshow arpserver\fP subcommand, -the ATMARP servers for all network interfaces will be displayed. -If an interface name is specified, only information about the given -network interface is displayed. -.PP -.I atm show IPVCC [ | ] -.PP -displays the following information: -.PP -.B Net Intf -\- the name of the network interface at which the VCC terminates. -.PP -.B VPI -\- the Virtual Path Identifier (VPI) for the VCC. -.PP -.B VCI -\- the Virtual Channel Identifier (VCI) for the VCC. -.PP -.B State -\- the state of the VCC. -Possible values are: -.in +15 -.ti -10 -PMAP\ ----\ The host has an IP packet to send and is waiting for -an ATMARP mapping. -.ti -10 -POPEN\ ---\ The VCC is being opened. -.ti -10 -PACCEPT\ -\ A VCC from a remote host is being accepted. -.ti -10 -ACTPENT\ -\ A PVC is open, but no ATMARP information is -available for it yet. -.ti -10 -ACTIVE\ --\ The VCC is active. -.in -15 -.PP -.B Flags -\- flags giving further information about the VCC. -The meanings of the characters in the flags are: -.PP -.in +5 -S - the VCC is an SVC -.br -P - the VCC is a PVC -.br -L - the VCC uses LLC/SNAP encapsulation -.br -M - the IP-to-ATM address mapping for the VCC is valid -.br -N - there is no idle timeout for the VCC -.in -5 -.PP -.B IP Address -\- the name and IP address of the host at the remote end of the VCC. -.PP -If no parameters are specified on the \fIshow IPVCC\fP subcommand, all -active VCCs are displayed. -If a host name is specified, the active VCC(s) for the given -host are displayed. -If a network interface name is specified, the active VCC(s) for the -given network interface are displayed. -.PP -.SS Miscellaneous Subcommands: -.I atm help -.PP -displays a synopsis of the atm command with its subcommands -and their parameters. -.PP -.I atm show version -displays the version of the running HARP software. -.fi -.SH "SEE ALSO" -\fIilmid\fP (8); \fIscspd\fP (8); \fIatmarpd\fP (8). -.fi -.SH BUGS -Care must be taken to avoid confusing physical interfaces and -network interfaces. -.PP -Please report any bugs to harp-bugs@magic.net. -.fi -.SH COPYRIGHT -Copyright (c) 1994-1998, Network Computing Services, Inc. -.fi -.SH AUTHORS -John Cavanaugh, Network Computing Services, Inc. -.br -Mike Spengler, Network Computing Services, Inc. -.br -Joe Thomas, Network Computing Services, Inc. -.fi -.SH ACKNOWLEDGMENTS -This software was developed with the support of the Defense -Advanced Research Projects Agency (DARPA). diff --git a/sbin/atm/atm/atm.c b/sbin/atm/atm/atm.c deleted file mode 100644 index 94cde38..0000000 --- a/sbin/atm/atm/atm.c +++ /dev/null @@ -1,1143 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * User configuration and display program - * -------------------------------------- - * - * Main routine - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "atm.h" - -#ifndef lint -__RCSID("@(#) $FreeBSD$"); -#endif - - -/* - * Usage string - */ -#define USAGE_STR "Interface management subcommands:\n\ - attach \n\ - detach \n\ - set mac \n\ - set netif \n\ - set prefix \n\ - show config []\n\ - show interface []\n\ - show netif []\n\ - show stats interface [ phy | dev | atm | aal0 | aal4 |\n\ - aal5 | driver]\n\ -\n\ -VC management subcommands:\n\ - add pvc ...\n\ - [UBR | CBR | VBR ]\n\ - delete pvc \n\ - delete svc \n\ - show stats vcc [ [vpi [vci]]]\n\ - show vcc [ [ [] | SVC | PVC]]\n\ -\n\ -IP management subcommands:\n\ - add arp [] \n\ - add pvc IP |\n\ - dynamic\n\ - delete arp [] \n\ - set arpserver ...\n\ - show arp []\n\ - show arpserver []\n\ - show ipvcc [ | ]\n\ -\n\ -Miscellaneous subcommands:\n\ - help\n\ - show version\n" - - -/* - * Local definitions - */ -static int do_cmd(const struct cmd *, int, char **); -static void usage(const struct cmd *, const char *); - -static void attach(int, char **, const struct cmd *); -static void detach(int, char **, const struct cmd *); -static void help(int, char **, const struct cmd *); -static void arp_add(int, char **, const struct cmd *); -static void pvc_add(int, char **, const struct cmd *); -static void pvc_dlt(int, char **, const struct cmd *); -static void svc_dlt(int, char **, const struct cmd *); -static void arp_dlt(int, char **, const struct cmd *); -static void vcc_dlt(int, char **, const struct cmd *, struct atmdelreq *); - -static const struct cmd add_subcmd[]; -static const struct cmd dlt_subcmd[]; -static const struct cmd set_subcmd[]; -static const struct cmd show_subcmd[]; -static const struct cmd stats_subcmd[]; - -static const struct cmd cmds[] = { - { "add", 0, 0, NULL, (const char *)add_subcmd }, - { "attach", 2, 2, attach, " " }, - { "delete", 0, 0, NULL, (const char *)dlt_subcmd }, - { "detach", 1, 1, detach, "" }, - { "set", 0, 0, NULL, (const char *)set_subcmd }, - { "show", 0, 0, NULL, (const char *)show_subcmd }, - { "help", 0, 99, help, "" }, - { 0, 0, 0, NULL, "" } -}; - -static const struct cmd add_subcmd[] = { - { "arp", 2, 3, arp_add, "[] " }, - { "pvc", 6, 16, pvc_add, " ... [UBR | CBR | VBR]" }, - { 0, 0, 0, NULL, "" } -}; - -static const struct cmd dlt_subcmd[] = { - { "arp", 1, 2, arp_dlt, "[] " }, - { "pvc", 3, 3, pvc_dlt, " " }, - { "svc", 3, 3, svc_dlt, " " }, - { 0, 0, 0, NULL, "" } -}; - -static const struct cmd set_subcmd[] = { - { "arpserver", 2, 18, set_arpserver, " " }, - { "mac", 2, 2, set_macaddr, " " }, - { "netif", 3, 3, set_netif, " " }, - { "prefix", 2, 2, set_prefix, " " }, - { 0, 0, 0, NULL, ""} -}; - -static const struct cmd show_subcmd[] = { - { "arp", 0, 1, show_arp, "[]" }, - { "arpserver", 0, 1, show_arpserv, "[]" }, - { "config", 0, 1, show_config, "[]" }, - { "interface", 0, 1, show_intf, "[]" }, - { "ipvcc", 0, 3, show_ip_vcc, "[ | ]" }, - { "netif", 0, 1, show_netif, "[]" }, - { "stats", 0, 3, NULL, (const char *)stats_subcmd }, - { "vcc", 0, 3, show_vcc, "[] [ [] | SVC | PVC]" }, - { "version", 0, 0, show_version, "" }, - { 0, 0, 0, NULL, "" } -}; - -static const struct cmd stats_subcmd[] = { - { "interface", 0, 2, show_intf_stats, "[ [cfg | phy | dev | atm | aal0 | aal4 | aal5 | driver]]" }, - { "vcc", 0, 3, show_vcc_stats, "[ [vpi [vci]]]" }, - { 0, 0, 0, NULL, "" } -}; - - -/* - * Supported signalling protocols - */ -static const struct proto protos[] = { - { "SIGPVC", ATM_SIG_PVC }, - { "SPANS", ATM_SIG_SPANS }, - { "UNI30", ATM_SIG_UNI30 }, - { "UNI31", ATM_SIG_UNI31 }, - { "UNI40", ATM_SIG_UNI40 }, - { 0, 0 } -}; - -/* - * Supported VCC owners - */ -static const struct owner owners[] = { - { "IP", ENDPT_IP, ip_pvcadd }, - { "SPANS", ENDPT_SPANS_SIG,0 }, - { "SPANS CLS", ENDPT_SPANS_CLS,0 }, - { "UNI SIG", ENDPT_UNI_SIG, 0 }, - { 0, 0, 0 } -}; - -/* - * Supported AAL parameters - */ -const struct aal aals[] = { - { "Null", ATM_AAL0 }, - { "AAL0", ATM_AAL0 }, - { "AAL1", ATM_AAL1 }, - { "AAL2", ATM_AAL2 }, - { "AAL4", ATM_AAL3_4 }, - { "AAL3", ATM_AAL3_4 }, - { "AAL3/4", ATM_AAL3_4 }, - { "AAL5", ATM_AAL5 }, - { 0, 0 }, -}; - -/* - * Supported VCC encapsulations - */ -const struct encaps encaps[] = { - { "Null", ATM_ENC_NULL }, - { "None", ATM_ENC_NULL }, - { "LLC/SNAP", ATM_ENC_LLC }, - { "LLC", ATM_ENC_LLC }, - { "SNAP", ATM_ENC_LLC }, - { 0, 0 }, -}; - -/* - * Supported ATM traffic types - */ -struct traffics traffics[] = { - { "UBR", T_ATM_UBR, 1, "UBR " }, - { "CBR", T_ATM_CBR, 1, "CBR " }, - { "VBR", T_ATM_VBR, 3, "VBR " }, -#ifdef notyet - { "ABR", T_ATM_ABR, 2, "ABR " }, -#endif - { NULL, 0, 0, NULL } -}; - -char *prog; -char prefix[128] = ""; - -int -main(int argc, char *argv[]) -{ - int error; - - /* - * Save program name, ignoring any path components - */ - if ((prog = (char *)strrchr(argv[0], '/')) != NULL) - prog++; - else - prog = argv[0]; - - if (argc < 2) { - usage(cmds, ""); - exit(1); - } - argc--; argv++; - - /* - * Validate and process command - */ - if ((error = do_cmd(cmds, argc, argv)) != 0) - usage(cmds, ""); - - exit(error); -} - - -/* - * Validate and process user command - * - * Arguments: - * descp pointer to command description array - * argc number of arguments left in command - * argv pointer to argument strings - * - * Returns: - * none - * - */ -static int -do_cmd(const struct cmd *descp, int argc, char **argv) -{ - const struct cmd *cmdp = NULL; - - /* - * Make sure we have paramaters to process - */ - if (!argc) { - usage(cmds, ""); - exit(1); - } - - /* - * Figure out what command user wants - */ - for (; descp->name; descp++) { - /* - * Use an exact match if there is one - */ - if (!strcasecmp(descp->name, argv[0])) { - cmdp = descp; - break; - } - /* - * Look for a match on the first part of keyword - */ - if (!strncasecmp(descp->name, argv[0], strlen(argv[0]))) { - if (cmdp) { - fprintf(stderr, "%s: Ambiguous parameter \"%s\"\n", - prog, argv[0]); - exit(1); - } - cmdp = descp; - } - } - if (!cmdp) - return(1); - argc--; argv++; - - /* - * See if this command has subcommands - */ - if (cmdp->func == NULL) { - strcat(prefix, cmdp->name); - strcat(prefix, " "); - return (do_cmd((const struct cmd *)(const void *)cmdp->help, - argc, argv)); - } - - /* - * Minimal validation - */ - if ((argc < cmdp->minp) || (argc > cmdp->maxp)) { - fprintf(stderr, "%s: Invalid number of arguments\n", - prog); - fprintf(stderr, "\tformat is: %s%s %s\n", - prefix, cmdp->name, cmdp->help); - exit(1); - } - - /* - * Process command - */ - (*cmdp->func)(argc, argv, cmdp); - return(0); -} - - -/* - * Print command usage information - * - * Arguments: - * cmdp pointer to command description - * pref pointer current command prefix - * - * Returns: - * none - * - */ -static void -usage(const struct cmd *cmdp __unused, const char *pref __unused) -{ - fprintf(stderr, "usage: %s command [arg] [arg]...\n", prog); - fprintf(stderr, USAGE_STR); -} - - -/* - * Process interface attach command - * - * Command format: - * atm attach - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -static void -attach(int argc __unused, char **argv, const struct cmd *cmdp __unused) -{ - struct atmcfgreq aar; - const struct proto *prp; - int s; - - /* - * Validate interface name - */ - if (strlen(argv[0]) > sizeof(aar.acr_att_intf) - 1) { - fprintf(stderr, "%s: Illegal interface name\n", prog); - exit(1); - } - - /* - * Find/validate requested signalling protocol - */ - for (prp = protos; prp->p_name; prp++) { - if (strcasecmp(prp->p_name, argv[1]) == 0) - break; - } - if (prp->p_name == NULL) { - fprintf(stderr, "%s: Unknown signalling protocol\n", prog); - exit(1); - } - - - /* - * Build ioctl request - */ - aar.acr_opcode = AIOCS_CFG_ATT; - strncpy(aar.acr_att_intf, argv[0], sizeof(aar.acr_att_intf)); - aar.acr_att_proto = prp->p_id; - - /* - * Tell the kernel to do the attach - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCCFG, (caddr_t)&aar) < 0) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case EINVAL: - case EOPNOTSUPP: - case EPROTONOSUPPORT: - perror("Internal error"); - break; - case ENOMEM: - fprintf(stderr, "Kernel memory exhausted\n"); - break; - case EEXIST: - fprintf(stderr, "Signalling manager already attached to %s\n", - argv[0]); - break; - case ENETDOWN: - fprintf(stderr, "ATM network is inoperable\n"); - break; - case EPERM: - fprintf(stderr, "Must be super user to use attach subcommand\n"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - argv[0]); - break; - case ETOOMANYREFS: - fprintf(stderr, "%s has too few or too many network interfaces\n", - argv[0]); - break; - default: - perror("Ioctl (AIOCCFG) attach"); - break; - } - exit(1); - } - (void)close(s); -} - - -/* - * Process interface detach command - * - * Command format: - * atm detach - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -static void -detach(int argc __unused, char **argv, const struct cmd *cmdp __unused) -{ - struct atmcfgreq adr; - int s; - - /* - * Validate interface name - */ - if (strlen(argv[0]) > sizeof(adr.acr_det_intf) - 1) { - fprintf(stderr, "%s: Illegal interface name\n", prog); - exit(1); - } - - /* - * Build ioctl request - */ - adr.acr_opcode = AIOCS_CFG_DET; - strncpy(adr.acr_det_intf, argv[0], sizeof(adr.acr_det_intf)); - - /* - * Tell the kernel to do the detach - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCCFG, (caddr_t)&adr) < 0) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case EALREADY: - fprintf(stderr, "Signalling manager already detaching from %s\n", - argv[0]); - break; - case EINVAL: - perror("Internal error"); - break; - case EPERM: - fprintf(stderr, "Must be super user to use detach subcommand\n"); - break; - default: - perror("ioctl (AIOCCFG) detach"); - break; - } - exit(1); - } - (void)close(s); -} - - -/* - * Process PVC add command - * - * Command format: - * atm add PVC - * ...owner info... - * [ubr | cbr | vbr ] - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -static void -pvc_add(int argc, char **argv, const struct cmd *cmdp) -{ - struct atmaddreq apr; - struct atminfreq air; - struct air_int_rsp *int_info; - const struct owner *owp; - const struct aal *alp; - const struct encaps *enp; - const struct traffics *trafp; - char *cp; - u_long v; - ssize_t buf_len; - int s; - - /* - * Initialize opcode and flags - */ - apr.aar_opcode = AIOCS_ADD_PVC; - apr.aar_pvc_flags = 0; - - /* - * Validate interface name and issue an information - * request IOCTL for the interface - */ - if (strlen(argv[0]) > sizeof(apr.aar_pvc_intf) - 1) { - fprintf(stderr, "%s: Illegal interface name\n", prog); - exit(1); - } - bzero(air.air_int_intf, sizeof(air.air_int_intf)); - strcpy(air.air_int_intf, argv[0]); - air.air_opcode = AIOCS_INF_INT; - buf_len = do_info_ioctl(&air, sizeof(struct air_int_rsp)); - if (buf_len == -1) { - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - err(1, "Internal error"); - case ENXIO: - errx(1, "%s is not an ATM device", argv[0]); - default: - err(1, "ioctl (AIOCINFO)"); - } - } - int_info = (struct air_int_rsp *)(void *)air.air_buf_addr; - strcpy(apr.aar_pvc_intf, argv[0]); - argc--; - argv++; - - /* - * Validate vpi/vci values - */ - errno = 0; - v = strtoul(argv[0], &cp, 0); - if (errno != 0 || *cp != '\0' || v >= 1 << 8) - errx(1, "Invalid VPI value '%s'", argv[0]); - apr.aar_pvc_vpi = (u_short)v; - argc--; - argv++; - - errno = 0; - v = strtoul(argv[0], &cp, 0); - if (errno != 0 || *cp != '\0' || v < MIN_VCI || v >= 1 << 16) - errx(1, "Invalid VCI value '%s'", argv[0]); - apr.aar_pvc_vci = (u_short)v; - argc--; - argv++; - - /* - * Validate requested PVC AAL - */ - for (alp = aals; alp->a_name; alp++) { - if (strcasecmp(alp->a_name, argv[0]) == 0) - break; - } - if (alp->a_name == NULL) - errx(1, "Invalid PVC AAL '%s'", argv[0]); - apr.aar_pvc_aal = alp->a_id; - argc--; - argv++; - - /* - * Validate requested PVC encapsulation - */ - for (enp = encaps; enp->e_name; enp++) { - if (strcasecmp(enp->e_name, argv[0]) == 0) - break; - } - if (enp->e_name == NULL) - errx(1, "Invalid PVC encapsulation '%s'", argv[0]); - apr.aar_pvc_encaps = enp->e_id; - argc--; - argv++; - - /* - * Validate requested PVC owner - */ - for (owp = owners; owp->o_name; owp++) { - if (strcasecmp(owp->o_name, argv[0]) == 0) - break; - } - if (owp->o_name == NULL) - errx(1, "Unknown PVC owner '%s'", argv[0]); - apr.aar_pvc_sap = owp->o_sap; - if (owp->o_pvcadd == NULL) - errx(1, "Unsupported PVC owner '%s'", argv[0]); - argc--; - argv++; - - /* - * Perform service user processing - */ - (*owp->o_pvcadd)(argc, argv, cmdp, &apr, int_info); - - argc -= 2; - argv += 2; - - if (argc > 0) { - /* - * Validate requested traffic - */ - for (trafp = traffics; trafp->t_name; trafp++) { - if (strcasecmp(trafp->t_name, argv[0]) == 0) - break; - } - if (trafp->t_name == NULL) - errx(1, "Unknown traffic type '%s'", argv[0]); - apr.aar_pvc_traffic_type = trafp->t_type; - argc--; - argv++; - - if (trafp->t_argc != argc) - errx(1, "Invalid traffic parameters\n\t %s", - trafp->help); - switch (trafp->t_type) { - - case T_ATM_UBR: - case T_ATM_CBR: - errno = 0; - v = strtoul(argv[0], &cp, 0); - if (errno != 0 || *cp != '\0' || v >= 1 << 24) - errx(1, "Invalid PCR value '%s'", argv[0]); - apr.aar_pvc_traffic.forward.PCR_high_priority = (int32_t) v; - apr.aar_pvc_traffic.forward.PCR_all_traffic = (int32_t) v; - apr.aar_pvc_traffic.backward.PCR_high_priority = (int32_t) v; - apr.aar_pvc_traffic.backward.PCR_all_traffic = (int32_t) v; - argc--; - argv++; - apr.aar_pvc_traffic.forward.SCR_high_priority = T_ATM_ABSENT; - apr.aar_pvc_traffic.forward.SCR_all_traffic = T_ATM_ABSENT; - apr.aar_pvc_traffic.backward.SCR_high_priority = T_ATM_ABSENT; - apr.aar_pvc_traffic.backward.SCR_all_traffic = T_ATM_ABSENT; - apr.aar_pvc_traffic.forward.MBS_high_priority = T_ATM_ABSENT; - apr.aar_pvc_traffic.forward.MBS_all_traffic = T_ATM_ABSENT; - apr.aar_pvc_traffic.backward.MBS_high_priority = T_ATM_ABSENT; - apr.aar_pvc_traffic.backward.MBS_all_traffic = T_ATM_ABSENT; - break; - - case T_ATM_VBR: /* VBR pcr scr mbs */ - errno = 0; - v = strtoul(argv[0], &cp, 0); - if (errno != 0 || *cp != '\0' || v >= 1 << 24) - errx(1, "Invalid PCR value '%s'", argv[0]); - apr.aar_pvc_traffic.forward.PCR_high_priority = (int32_t)v; - apr.aar_pvc_traffic.forward.PCR_all_traffic = (int32_t)v; - apr.aar_pvc_traffic.backward.PCR_high_priority = (int32_t)v; - apr.aar_pvc_traffic.backward.PCR_all_traffic = (int32_t)v; - argc--; - argv++; - - errno = 0; - v = strtoul(argv[0], &cp, 0); - if (errno != 0 || *cp != '\0' || v >= 1 << 24) - errx(1, "Invalid SCR value '%s'", argv[0]); - apr.aar_pvc_traffic.forward.SCR_high_priority = (int32_t)v; - apr.aar_pvc_traffic.forward.SCR_all_traffic = (int32_t)v; - apr.aar_pvc_traffic.backward.SCR_high_priority = (int32_t)v; - apr.aar_pvc_traffic.backward.SCR_all_traffic = (int32_t)v; - argc--; - argv++; - - errno = 0; - v = strtol(argv[0], &cp, 0); - if (errno != 0 || *cp != '\0' || v >= 1 << 24) - errx(1, "Invalid MBS value '%s'", argv[0]); - apr.aar_pvc_traffic.forward.MBS_high_priority = (int32_t)v; - apr.aar_pvc_traffic.forward.MBS_all_traffic = (int32_t)v; - apr.aar_pvc_traffic.backward.MBS_high_priority = (int32_t)v; - apr.aar_pvc_traffic.backward.MBS_all_traffic = (int32_t)v; - argc--; - argv++; - - break; - - case T_ATM_ABR: - errx(1, "ABR not yet supported"); - - default: - errx(1, "Unsupported traffic type '%d'", trafp->t_type); - } - } else { - /* - * No PVC traffic type - */ - apr.aar_pvc_traffic_type = T_ATM_NULL; - } - if (argc > 0) - errx(1, "Too many parameters"); - - /* - * Tell the kernel to add the PVC - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCADD, (caddr_t)&apr) < 0) { - switch (errno) { - case EPROTONOSUPPORT: - case ENOPROTOOPT: - err(1, "Internal error"); - case EINVAL: - errx(1, "Invalid parameter"); - case EEXIST: - errx(1, "PVC already exists"); - break; - case ENETDOWN: - errx(1, "ATM network is inoperable"); - break; - case ENOMEM: - errx(1, "Kernel memory exhausted"); - break; - case EPERM: - errx(1, "Must be super user to use add subcommand"); - break; - case ERANGE: - errx(1, "Invalid VPI or VCI value"); - break; - default: - err(1, "ioctl (AIOCADD) add PVC"); - } - } - (void)close(s); -} - - -/* - * Process ARP add command - * - * Command formats: - * atm add arp [] - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -static void -arp_add(int argc, char **argv, const struct cmd *cmdp __unused) -{ - int len, s; - struct atmaddreq apr; - Atm_addr host_atm; - struct sockaddr_in *sain; - union { - struct sockaddr_in sain; - struct sockaddr sa; - } host_ip; - - /* - * Initialize add request structure - */ - bzero(&apr, sizeof(apr)); - - /* - * Get network interface name if one is present - */ - if (argc == 3) { - check_netif_name(argv[0]); - strcpy(apr.aar_arp_intf, argv[0]); - argc--; argv++; - } - - /* - * Get IP address of specified host name - */ - bzero(&host_ip, sizeof(host_ip)); - host_ip.sa.sa_family = AF_INET; - sain = get_ip_addr(argv[0]); - host_ip.sain.sin_addr.s_addr = sain->sin_addr.s_addr; - argc--; argv++; - - /* - * Get specified ATM address - */ - len = get_hex_atm_addr(argv[0], (u_char *)host_atm.address, - sizeof(Atm_addr_nsap)); - switch(len) { - case sizeof(Atm_addr_nsap): - host_atm.address_format = T_ATM_ENDSYS_ADDR; - host_atm.address_length = sizeof(Atm_addr_nsap); - break; - case sizeof(Atm_addr_spans): - host_atm.address_format = T_ATM_SPANS_ADDR; - host_atm.address_length = sizeof(Atm_addr_spans); - break; - default: - fprintf(stderr, "%s: Invalid ATM address\n", prog); - exit(1); - } - - /* - * Build IOCTL request - */ - apr.aar_opcode = AIOCS_ADD_ARP; - apr.aar_arp_dst = host_ip.sa; - ATM_ADDR_COPY(&host_atm, &apr.aar_arp_addr); - apr.aar_arp_origin = ARP_ORIG_PERM; - - /* - * Tell the kernel to add the ARP table entry - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCADD, (caddr_t)&apr) < 0) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case EINVAL: - fprintf(stderr, "Invalid parameter\n"); - break; - case EPERM: - fprintf(stderr, "Must be super user to use add subcommand\n"); - break; - case EADDRNOTAVAIL: - fprintf(stderr, "IP address not valid for interface\n"); - break; - default: - perror("ioctl (AIOCADD) add"); - break; - } - exit(1); - } - (void)close(s); -} - - -/* - * Process PVC delete command - * - * Command formats: - * atm delete pvc - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -static void -pvc_dlt(int argc, char **argv, const struct cmd *cmdp) -{ - struct atmdelreq apr; - - /* - * Set opcode - */ - apr.adr_opcode = AIOCS_DEL_PVC; - - /* - * Complete request by calling subroutine - */ - vcc_dlt(argc, argv, cmdp, &apr); -} - - -/* - * Process SVC delete command - * - * Command formats: - * atm delete svc - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -static void -svc_dlt(int argc, char **argv, const struct cmd *cmdp) -{ - struct atmdelreq apr; - - /* - * Set opcode - */ - apr.adr_opcode = AIOCS_DEL_SVC; - - /* - * Complete request by calling subroutine - */ - vcc_dlt(argc, argv, cmdp, &apr); -} - - -/* - * Complete an SVC or PVC delete command - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * apr pointer to ATM delete IOCTL structure - * - * Returns: - * none - * - */ -static void -vcc_dlt(int argc, char **argv, const struct cmd *cmdp __unused, - struct atmdelreq *apr) -{ - char *cp; - long v; - int s; - - /* - * Validate interface name - */ - if (strlen(argv[0]) > sizeof(apr->adr_pvc_intf) - 1) { - fprintf(stderr, "%s: Illegal interface name\n", prog); - exit(1); - } - strcpy(apr->adr_pvc_intf, argv[0]); - argc--; argv++; - - /* - * Validate vpi/vci values - */ - v = strtol(argv[0], &cp, 0); - if ((*cp != '\0') || (v < 0) || (v >= 1 << 8)) { - fprintf(stderr, "%s: Invalid VPI value\n", prog); - exit(1); - } - apr->adr_pvc_vpi = (u_short) v; - argc--; argv++; - - v = strtol(argv[0], &cp, 0); - if ((*cp != '\0') || (v < MIN_VCI) || (v >= 1 << 16)) { - fprintf(stderr, "%s: Invalid VCI value\n", prog); - exit(1); - } - apr->adr_pvc_vci = (u_short) v; - argc--; argv++; - - /* - * Tell the kernel to delete the VCC - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCDEL, (caddr_t)apr) < 0) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case EINVAL: - fprintf(stderr, "Invalid parameter\n"); - break; - case ENOENT: - fprintf(stderr, "VCC not found\n"); - break; - case EALREADY: - fprintf(stderr, "VCC already being closed\n"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - apr->adr_pvc_intf); - break; - case EPERM: - fprintf(stderr, "Must be super user to use delete subcommand\n"); - break; - default: - perror("ioctl (AIOCDEL) delete"); - break; - } - exit(1); - } - (void)close(s); -} - - -/* - * Process ARP delete command - * - * Command formats: - * atm delete arp - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -static void -arp_dlt(int argc, char **argv, const struct cmd *cmdp __unused) -{ - int s; - struct atmdelreq apr; - struct sockaddr_in *sain; - union { - struct sockaddr_in sain; - struct sockaddr sa; - } host_addr; - - /* - * Set opcode - */ - bzero(&apr, sizeof(apr)); - apr.adr_opcode = AIOCS_DEL_ARP; - - /* - * Get network interface name if one is present - */ - if (argc == 2) { - check_netif_name(argv[0]); - strcpy(apr.adr_arp_intf, argv[0]); - argc--; argv++; - } - - /* - * Get IP address of specified host name - */ - bzero(&host_addr, sizeof(host_addr)); - host_addr.sa.sa_family = AF_INET; - sain = get_ip_addr(argv[0]); - host_addr.sain.sin_addr.s_addr = sain->sin_addr.s_addr; - apr.adr_arp_dst = host_addr.sa; - - /* - * Tell the kernel to delete the ARP table entry - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCDEL, (caddr_t)&apr) < 0) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case EINVAL: - fprintf(stderr, "Invalid parameter\n"); - break; - case EPERM: - fprintf(stderr, "Must be super user to use delete subcommand\n"); - break; - default: - perror("ioctl (AIOCDEL) delete"); - break; - } - exit(1); - } - (void)close(s); -} - - -/* - * Process help command - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -static void -help(int argc __unused, char **argv __unused, const struct cmd *cmdp __unused) -{ - usage(cmds, ""); -} diff --git a/sbin/atm/atm/atm.h b/sbin/atm/atm/atm.h deleted file mode 100644 index 09f5c87..0000000 --- a/sbin/atm/atm/atm.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - * - * @(#) $FreeBSD$ - * - */ - -/* - * User configuration and display program - * -------------------------------------- - * - * Control blocks - * - */ - -#define MAX_NIFS 256 /* Max network interfaces */ -#define MIN_VCI 32 /* Smallest non-reserved VCI */ - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - - -/* - * User commands - */ -struct cmd { - const char *name; /* Command name */ - int minp; /* Minimum number of parameters */ - int maxp; /* Maximum number of parameters */ - void (*func)(int, char **, - const struct cmd *);/* Processing function */ - const char *help; /* User help string */ -}; - - -/* - * Supported signalling protocols - */ -struct proto { - const char *p_name; /* Protocol name */ - u_char p_id; /* Protocol id */ -}; - - -/* - * Table of state names - */ -struct state { - const char *s_name; /* State name */ - u_char s_id; /* State id */ -}; - - -/* - * Supported signalling protocol states - */ -struct proto_state { - const char *p_name; /* Signalling manager name */ - const struct state *p_state; /* Protocol state table */ - const struct state *v_state; /* Protocol VCC state table */ - u_char p_id; /* Protocol ID */ -}; - - -/* - * Supported VCC owners - */ -struct owner { - const char *o_name; /* Owner name */ - u_int o_sap; /* Owner's SAP */ - void (*o_pvcadd)(int, char **, const struct cmd *, - struct atmaddreq *, struct air_int_rsp *); - /* PVC ADD processing function */ -}; - - -/* - * Supported AALs - */ -struct aal { - const char *a_name; /* AAL name */ - u_char a_id; /* AAL code */ -}; - - -/* - * Supported encapsulations - */ -struct encaps { - const char *e_name; /* Encapsulation name */ - u_char e_id; /* Encapsulation code */ -}; - -/* - * Supported traffic type - */ -struct traffics { - const char *t_name; /* Traffic name: CBR, VBR, UBR, ... */ - uint8_t t_type; /* HARP code T_ATM_XXX */ - int t_argc; /* Number of args */ - const char *help; /* User help string */ -}; - -/* - * External variables - */ -extern char *prog; /* Program invocation */ -extern char prefix[]; /* Current command prefix */ - -/* - * Global function declarations - */ - - /* atm_eni.c */ -void show_eni_stats(char *, int, char **); - - /* atm_fore200.c */ -void show_fore200_stats(char *, int, char **); - - /* atm_inet.c */ -void ip_pvcadd(int, char **, const struct cmd *, struct atmaddreq *, - struct air_int_rsp *); - - /* atm_print.c */ -void print_arp_info(struct air_arp_rsp *); -void print_asrv_info(struct air_asrv_rsp *); -void print_cfg_info(struct air_cfg_rsp *); -void print_intf_info(struct air_int_rsp *); -void print_ip_vcc_info(struct air_ip_vcc_rsp *); -void print_netif_info(struct air_netif_rsp *); -void print_intf_stats(struct air_phy_stat_rsp *); -void print_vcc_stats(struct air_vcc_rsp *); -void print_vcc_info(struct air_vcc_rsp *); -void print_version_info(struct air_version_rsp *); - - /* atm_set.c */ -void set_arpserver(int, char **, const struct cmd *); -void set_macaddr(int, char **, const struct cmd *); -void set_netif(int, char **, const struct cmd *); -void set_prefix(int, char **, const struct cmd *); - - /* atm_show.c */ -void show_arp(int, char **, const struct cmd *); -void show_arpserv(int, char **, const struct cmd *); -void show_config(int, char **, const struct cmd *); -void show_intf(int, char **, const struct cmd *); -void show_ip_vcc(int, char **, const struct cmd *); -void show_netif(int, char **, const struct cmd *); -void show_vcc(int, char **, const struct cmd *); -void show_version(int, char **, const struct cmd *); -void show_intf_stats(int, char **, const struct cmd *); -void show_vcc_stats(int, char **, const struct cmd *); - - /* atm_subr.c */ -const char * get_vendor(int); -const char * get_adapter(int); -const char * get_media_type(int); -const char * get_bus_type(int); -const char * get_bus_slot_info(int, u_long); -const char * get_adapter_name(const char *); -int get_hex_addr(char *, u_char *, int); -const char * format_mac_addr(const Mac_addr *); -int parse_ip_prefix(const char *, struct in_addr *); -size_t compress_prefix_list(struct in_addr *, size_t); -void check_netif_name(const char *); -void sock_error(int); - -extern const struct aal aals[]; -extern const struct encaps encaps[]; diff --git a/sbin/atm/atm/atm_fore200.c b/sbin/atm/atm/atm_fore200.c deleted file mode 100644 index d6da017..0000000 --- a/sbin/atm/atm/atm_fore200.c +++ /dev/null @@ -1,596 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * User configuration and display program - * -------------------------------------- - * - * Routines for Fore SBA-200-specific subcommands - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "atm.h" - -#ifndef lint -__RCSID("@(#) $FreeBSD$"); -#endif - - -/* - * Local constants - */ -#define SHOW_PHY 1 -#define SHOW_DEV 2 -#define SHOW_ATM 4 -#define SHOW_AAL0 8 -#define SHOW_AAL4 16 -#define SHOW_AAL5 32 -#define SHOW_DRIVER 64 - - -/* - * Headers for statistics - */ -#define TAXI_STATS_HDR \ -"%s TAXI Statistics\n\ - CRC Errs Framing Errs\n" - -#define DEV_STATS_HDR \ -"%s Device Statistics\n\ -Type 1 Type 1 Type 2 Type 2\n\ -Small Buff Large Buff Small Buff Large Buff Receive Receive\n\ -Alloc Fail Alloc Fail Alloc Fail Alloc Fail Queue Full Carrier\n" - -#define ATM_STATS_HDR \ -"%s ATM Layer Statistics\n\ - Cells In Cells Out VPI Range VPI NoConn VCI Range VCI NoConn\n" - -#define AAL0_STATS_HDR \ -"%s AAL 0 Statistics\n\ - Cells In Cells Out Cell Drops\n" - -#define AAL4_STATS_HDR \ -"%s AAL 4 Statistics\n\ - CRC Proto Cell PDU PDU\n\ - Cells In Cells Out Errs Errs Drops PDUs In PDUs Out Errs Drops\n" - -#define AAL5_STATS_HDR \ -"%s AAL 5 Statistics\n\ - CRC/Len CRC Proto PDU\n\ - Cells In Cells Out Errs Drops PDUs In PDUs Out Errs Errs Drops\n" - -#define DRIVER_STATS_HDR \ -"%s Device Driver Statistics\n\ - No Xmit Max Seg No No No IQ No Cmd No\n\ - VCC Queue Seg Not Seg DMA VCC No Mbuf Full DMA Queue DMA\n\ - Out Full Size Align Pad Out In Buff In In Sup Full Cmd\n" - -#define OC3_STATS_HDR \ -"%s OC-3c Statistics\n\ -Section Path Line Line Path Corr Uncorr\n\ -BIP8 BIP8 BIP24 FEBE FEBE HCS HCS\n\ -Errs Errs Errs Errs Errs Errs Errs\n" - -static void print_fore200_taxi(struct air_vinfo_rsp *); -static void print_fore200_oc3(struct air_vinfo_rsp *); -static void print_fore200_dev(struct air_vinfo_rsp *); -static void print_fore200_atm(struct air_vinfo_rsp *); -static void print_fore200_aal0(struct air_vinfo_rsp *); -static void print_fore200_aal4(struct air_vinfo_rsp *); -static void print_fore200_aal5(struct air_vinfo_rsp *); -static void print_fore200_driver(struct air_vinfo_rsp *); - -/* - * Process show Fore SBA-200 statistics command - * - * The statistics printed are vendor-specific, depending on the brand of - * the interface card. - * - * Command format: - * atm show stats interface [ [phy | dev | atm | - * aal0 | aal4 | aal5 | driver]] - * - * Arguments: - * intf interface statistics are for - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * - * Returns: - * none - * - */ -void -show_fore200_stats(intf, argc, argv) - char *intf; - int argc; - char **argv; -{ - int stats_type; - ssize_t buf_len; - struct air_cfg_rsp *cfg; - struct air_vinfo_rsp *stats; - struct atminfreq air; - - /* - * Get statistics type qualifier - */ - if (!strcasecmp("phy", argv[0])) { - stats_type = SHOW_PHY; - } else if (!strcasecmp("dev", argv[0])) { - stats_type = SHOW_DEV; - } else if (!strcasecmp("atm", argv[0])) { - stats_type = SHOW_ATM; - } else if (!strcasecmp("aal0", argv[0])) { - stats_type = SHOW_AAL0; - } else if (!strcasecmp("aal4", argv[0])) { - stats_type = SHOW_AAL4; - } else if (!strcasecmp("aal5", argv[0])) { - stats_type = SHOW_AAL5; - } else if (!strcasecmp("driver", argv[0])) { - stats_type = SHOW_DRIVER; - } else { - errx(1, "Illegal statistics type"); - } - argc--; argv++; - - /* - * Get adapter configuration from the kernel - */ - bzero(&air, sizeof(air)); - air.air_opcode = AIOCS_INF_CFG; - strcpy(air.air_cfg_intf, intf); - buf_len = do_info_ioctl(&air, sizeof(struct air_cfg_rsp)); - if (buf_len == -1) { - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - err(1, "Internal error"); - case ENXIO: - errx(1, "%s is not an ATM device", intf); - default: - err(1, "ioctl (AIOCINFO)"); - } - } - cfg = (struct air_cfg_rsp *)(void *)air.air_buf_addr; - - /* - * Get vendor-specific statistics from the kernel - */ - bzero(&air, sizeof(air)); - air.air_opcode = AIOCS_INF_VST; - strcpy(air.air_vinfo_intf, intf); - buf_len = do_info_ioctl(&air, sizeof(struct air_vinfo_rsp) + 1024); - if (buf_len == -1) { - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - err(1, "Internal error"); - case ENXIO: - errx(1, "%s is not an ATM device", intf); - default: - err(1, "ioctl (AIOCINFO)"); - } - } - stats = (struct air_vinfo_rsp *)(void *)air.air_buf_addr; - - /* - * Print the statistics - */ - if ((size_t)buf_len < sizeof(struct air_vinfo_rsp) + - sizeof(Fore_stats)) { - free(stats); - free(cfg); - return; - } - - switch (stats_type) { - case SHOW_PHY: - switch (cfg->acp_media) { - case MEDIA_TAXI_100: - case MEDIA_TAXI_140: - print_fore200_taxi(stats); - break; - case MEDIA_OC3C: - print_fore200_oc3(stats); - break; - case MEDIA_OC12C: - break; - default: - break; - } - break; - case SHOW_DEV: - print_fore200_dev(stats); - break; - case SHOW_ATM: - print_fore200_atm(stats); - break; - case SHOW_AAL0: - print_fore200_aal0(stats); - break; - case SHOW_AAL4: - print_fore200_aal4(stats); - break; - case SHOW_AAL5: - print_fore200_aal5(stats); - break; - case SHOW_DRIVER: - print_fore200_driver(stats); - break; - } - - free(stats); - free(cfg); -} - - -/* - * Print Fore ASX-200 TAXI statistics - * - * Arguments: - * vi pointer to vendor-specific statistics to print - * - * Returns: - * none - * - */ -void -print_fore200_taxi(vi) - struct air_vinfo_rsp *vi; -{ - Fore_stats *stats; - - /* - * Bump stats pointer past header info - */ - stats = (Fore_stats *) - ((u_long) vi + sizeof(struct air_vinfo_rsp)); - - /* - * Print a header - */ - printf(TAXI_STATS_HDR, get_adapter_name(vi->avsp_intf)); - - /* - * Print the physical layer info - */ - printf("%10ld %12ld\n", - stats->st_taxi.taxi_bad_crc, - stats->st_taxi.taxi_framing); -} - - -/* - * Print Fore ASX-200 OC-3c statistics - * - * Arguments: - * vi pointer to vendor-specific statistics to print - * - * Returns: - * none - * - */ -void -print_fore200_oc3(vi) - struct air_vinfo_rsp *vi; -{ - Fore_stats *stats; - - /* - * Bump stats pointer past header info - */ - stats = (Fore_stats *) - ((u_long) vi + sizeof(struct air_vinfo_rsp)); - - /* - * Print a header - */ - printf(OC3_STATS_HDR, get_adapter_name(vi->avsp_intf)); - - /* - * Print the OC-3c info - */ - printf("%7ld %7ld %7ld %7ld %7ld %7ld %7ld\n", - stats->st_oc3.oc3_sect_bip8, - stats->st_oc3.oc3_path_bip8, - stats->st_oc3.oc3_line_bip24, - stats->st_oc3.oc3_line_febe, - stats->st_oc3.oc3_path_febe, - stats->st_oc3.oc3_hec_corr, - stats->st_oc3.oc3_hec_uncorr); -} - - -/* - * Print Fore ASX-200 device statistics - * - * Arguments: - * vi pointer to vendor-specific statistics to print - * - * Returns: - * none - * - */ -void -print_fore200_dev(vi) - struct air_vinfo_rsp *vi; -{ - Fore_stats *stats; - - /* - * Bump stats pointer past header info - */ - stats = (Fore_stats *) - ((u_long) vi + sizeof(struct air_vinfo_rsp)); - - /* - * Print a header - */ - printf(DEV_STATS_HDR, get_adapter_name(vi->avsp_intf)); - - /* - * Print the device info - */ - printf("%10ld %10ld %10ld %10ld %10ld %s\n", - stats->st_misc.buf1_sm_fail, - stats->st_misc.buf1_lg_fail, - stats->st_misc.buf2_sm_fail, - stats->st_misc.buf2_lg_fail, - stats->st_misc.rcvd_pdu_fail, - (stats->st_misc.carrier_status ? "On" : "Off")); -} - - -/* - * Print Fore ASX-200 ATM statistics - * - * Arguments: - * vi pointer to vendor-specific statistics to print - * - * Returns: - * none - * - */ -void -print_fore200_atm(vi) - struct air_vinfo_rsp *vi; -{ - Fore_stats *stats; - - /* - * Bump stats pointer past header info - */ - stats = (Fore_stats *) - ((u_long) vi + sizeof(struct air_vinfo_rsp)); - - /* - * Print a header - */ - printf(ATM_STATS_HDR, get_adapter_name(vi->avsp_intf)); - - /* - * Print the ATM layer info - */ - printf("%10ld %10ld %10ld %10ld %10ld %10ld\n", - stats->st_atm.atm_rcvd, - stats->st_atm.atm_xmit, - stats->st_atm.atm_vpi_range, - stats->st_atm.atm_vpi_noconn, - stats->st_atm.atm_vci_range, - stats->st_atm.atm_vci_noconn); -} - - -/* - * Print Fore ASX-200 AAL 0 statistics - * - * Arguments: - * vi pointer to vendor-specific statistics to print - * - * Returns: - * none - * - */ -void -print_fore200_aal0(vi) - struct air_vinfo_rsp *vi; -{ - Fore_stats *stats; - - /* - * Bump stats pointer past header info - */ - stats = (Fore_stats *) - ((u_long) vi + sizeof(struct air_vinfo_rsp)); - - /* - * Print a header - */ - printf(AAL0_STATS_HDR, get_adapter_name(vi->avsp_intf)); - - /* - * Print the AAL 0 info - */ - printf("%10ld %10ld %10ld\n", - stats->st_aal0.aal0_rcvd, - stats->st_aal0.aal0_xmit, - stats->st_aal0.aal0_drops); -} - - -/* - * Print Fore ASX-200 AAL 4 statistics - * - * Arguments: - * vi pointer to vendor-specific statistics to print - * - * Returns: - * none - * - */ -void -print_fore200_aal4(vi) - struct air_vinfo_rsp *vi; -{ - Fore_stats *stats; - - /* - * Bump stats pointer past header info - */ - stats = (Fore_stats *) - ((u_long) vi + sizeof(struct air_vinfo_rsp)); - - /* - * Print a header - */ - printf(AAL4_STATS_HDR, get_adapter_name(vi->avsp_intf)); - - /* - * Print the AAL 4 info - */ - printf("%10ld %10ld %5ld %5ld %5ld %9ld %9ld %5ld %5ld\n", - stats->st_aal4.aal4_rcvd, - stats->st_aal4.aal4_xmit, - stats->st_aal4.aal4_crc, - stats->st_aal4.aal4_sar_cs, - stats->st_aal4.aal4_drops, - stats->st_aal4.aal4_pdu_rcvd, - stats->st_aal4.aal4_pdu_xmit, - stats->st_aal4.aal4_pdu_errs, - stats->st_aal4.aal4_pdu_drops); -} - - -/* - * Print Fore ASX-200 AAL 5 statistics - * - * Arguments: - * vi pointer to vendor-specific statistics to print - * - * Returns: - * none - * - */ -void -print_fore200_aal5(vi) - struct air_vinfo_rsp *vi; -{ - Fore_stats *stats; - - /* - * Bump stats pointer past header info - */ - stats = (Fore_stats *) - ((u_long) vi + sizeof(struct air_vinfo_rsp)); - - /* - * Print a header - */ - printf(AAL5_STATS_HDR, get_adapter_name(vi->avsp_intf)); - - /* - * Print the AAL 5 info - */ - printf("%10ld %10ld %5ld %5ld %9ld %9ld %5ld %5ld %5ld\n", - stats->st_aal5.aal5_rcvd, - stats->st_aal5.aal5_xmit, - stats->st_aal5.aal5_crc_len, - stats->st_aal5.aal5_drops, - stats->st_aal5.aal5_pdu_rcvd, - stats->st_aal5.aal5_pdu_xmit, - stats->st_aal5.aal5_pdu_crc, - stats->st_aal5.aal5_pdu_errs, - stats->st_aal5.aal5_pdu_drops); -} - - -/* - * Print Fore ASX-200 device driver statistics - * - * Arguments: - * vi pointer to vendor-specific statistics to print - * - * Returns: - * none - * - */ -void -print_fore200_driver(vi) - struct air_vinfo_rsp *vi; -{ - Fore_stats *stats; - - /* - * Bump stats pointer past header info - */ - stats = (Fore_stats *) - ((u_long) vi + sizeof(struct air_vinfo_rsp)); - - /* - * Print a header - */ - printf(DRIVER_STATS_HDR, get_adapter_name(vi->avsp_intf)); - - /* - * Print the driver info - */ - printf("%4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld %4ld\n", - stats->st_drv.drv_xm_notact, - stats->st_drv.drv_xm_full, - stats->st_drv.drv_xm_maxpdu, - stats->st_drv.drv_xm_segnoal, - stats->st_drv.drv_xm_seglen, - stats->st_drv.drv_xm_segdma, - stats->st_drv.drv_rv_novcc, - stats->st_drv.drv_rv_nosbf, - stats->st_drv.drv_rv_nomb, - stats->st_drv.drv_rv_ifull, - stats->st_drv.drv_bf_segdma, - stats->st_drv.drv_cm_full, - stats->st_drv.drv_cm_nodma); - -} diff --git a/sbin/atm/atm/atm_inet.c b/sbin/atm/atm/atm_inet.c deleted file mode 100644 index 2f916a0..0000000 --- a/sbin/atm/atm/atm_inet.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * User configuration and display program - * -------------------------------------- - * - * IP support - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "atm.h" - -#ifndef lint -__RCSID("@(#) $FreeBSD$"); -#endif - - -/* - * Process add command for a TCP/IP PVC - * - * Command format: - * atm add pvc IP - * | dynamic - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * app pointer to AIOCAPVC structure - * intp pointer to air_int_rsp structure with information - * about the physical interface that is the PVC is for. - * - * Returns: - * none - * - */ -void -ip_pvcadd(int argc, char **argv, const struct cmd *cmdp, - struct atmaddreq *app, struct air_int_rsp *intp) -{ - char *cp; - char nhelp[128]; - u_int netif_no; - u_int i, netif_pref_len; - - /* - * Yet more validation - */ - if (argc < 2) { - strcpy(nhelp, cmdp->help); - cp = strstr(nhelp, ""); - if (cp) - strcpy(cp, "ip {dyn|}"); - fprintf(stderr, "%s: Invalid number of arguments:\n", - prog); - fprintf(stderr, "\tformat is: %s%s %s\n", - prefix, cmdp->name, nhelp); - exit(1); - } - - /* - * Validate and set network interface - */ - bzero(app->aar_pvc_intf, sizeof(app->aar_pvc_intf)); - netif_pref_len = strlen(intp->anp_nif_pref); - cp = &argv[0][netif_pref_len]; - netif_no = (u_int)strtoul(cp, NULL, 10); - for (i = 0; i < strlen(cp); i++) { - if (cp[i] < '0' || cp[i] > '9') { - netif_no = -1; - break; - } - } - if (strlen(argv[0]) > sizeof(app->aar_pvc_intf) - 1) - errx(1, "Illegal network interface name '%s'", argv[0]); - - if (strncasecmp(intp->anp_nif_pref, argv[0], netif_pref_len) || - strlen(argv[0]) <= netif_pref_len || netif_no >= intp->anp_nif_cnt) - errx(1, "network interface %s is not associated with " - "interface %s", argv[0], intp->anp_intf); - - strcpy(app->aar_pvc_intf, argv[0]); - argc--; - argv++; - - /* - * Set PVC destination address - */ - bzero(&app->aar_pvc_dst, sizeof(struct sockaddr)); - if (strcasecmp(argv[0], "dynamic") == 0 || - strcasecmp(argv[0], "dyn") == 0) { - - /* - * Destination is dynamically determined - */ - app->aar_pvc_flags |= PVC_DYN; - } else { - - /* - * Get destination IP address - */ - struct sockaddr_in *sain, *ret; - - sain = (struct sockaddr_in *)(void *)&app->aar_pvc_dst; - ret = get_ip_addr(argv[0]); - if (ret == NULL) - errx(1, "%s: bad ip address '%s'", argv[-1], argv[0]); - sain->sin_addr.s_addr = ret->sin_addr.s_addr; - } - argc--; argv++; -} - diff --git a/sbin/atm/atm/atm_print.c b/sbin/atm/atm/atm_print.c deleted file mode 100644 index a3f0ce3..0000000 --- a/sbin/atm/atm/atm_print.c +++ /dev/null @@ -1,891 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * User configuration and display program - * -------------------------------------- - * - * Print routines for "show" subcommand - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "atm.h" - -#ifndef lint -__RCSID("@(#) $FreeBSD$"); -#endif - - -#define ARP_HDR \ -"Net Intf Flags Age Origin\n" - -#define ASRV_HDR \ -"Net Intf State ATM Address\n" - -#define CFG_HDR \ -"Intf Vendor Model Media Bus Serial No\n" - -#define IP_VCC_HDR \ -"Net Intf VPI VCI State Flags IP Address\n" - -#define INTF_HDR \ -"Interface Sigmgr State\n" - -#define NETIF_HDR \ -"Net Intf Phy Intf IP Address\n" - -#define VCC_HDR \ -"Interface VPI VCI AAL Type Dir State Encaps Owner\n" - -#define VCC_STATS_HDR \ -" Input Input Input Output Output Output\n\ -Interface VPI VCI PDUs Bytes Errs PDUs Bytes Errs\n" - -#define VERSION_HDR \ -"Version\n" - -#define PHY_STATS_HDR \ -" Input Input Input Output Output Output Cmd\n\ -Interface PDUs Bytes Errs PDUs Bytes Errs Errs\n" - -/* - * Local variables - */ -static int arp_hdr = 0; -static int asrv_hdr = 0; -static int cfg_hdr = 0; -static int ip_vcc_hdr = 0; -static int netif_hdr = 0; -static int vcc_hdr = 0; -static int vcc_stats_hdr = 0; -static int phy_stats_hdr = 0; -static int version_hdr = 0; - -/* - * SIGPVC state definitions - */ -static const struct state sigpvc_states[] = { - { "ACTIVE", SIGPVC_ACTIVE }, - { "DETACH", SIGPVC_DETACH }, - { 0, 0 } -}; - -/* - * SPANS state definitions - */ -static const struct state spans_states[] = { - { "ACTIVE", SPANS_ACTIVE }, - { "DETACH", SPANS_DETACH }, - { "INIT", SPANS_INIT }, - { "PROBE", SPANS_PROBE }, - { 0, 0 } -}; - -/* - * UNISIG state definitions - */ -static const struct state unisig_states[] = { - { "NULL", UNISIG_NULL }, - { "ADR_WAIT", UNISIG_ADDR_WAIT }, - { "INIT", UNISIG_INIT }, - { "ACTIVE", UNISIG_ACTIVE }, - { "DETACH", UNISIG_DETACH }, - { 0, 0 } -}; - -/* - * SIGPVC VCC state definitions - */ -static const struct state sigpvc_vcc_states[] = { - { "NULL", VCCS_NULL }, - { "ACTIVE", VCCS_ACTIVE }, - { "FREE", VCCS_FREE }, - { 0, 0 } -}; - -/* - * SPANS VCC state definitions - */ -static const struct state spans_vcc_states[] = { - { "NULL", SPANS_VC_NULL }, - { "ACTIVE", SPANS_VC_ACTIVE }, - { "ACT_DOWN", SPANS_VC_ACT_DOWN }, - { "POPEN", SPANS_VC_POPEN }, - { "R_POPEN", SPANS_VC_R_POPEN }, - { "OPEN", SPANS_VC_OPEN }, - { "CLOSE", SPANS_VC_CLOSE }, - { "ABORT", SPANS_VC_ABORT }, - { "FREE", SPANS_VC_FREE }, - {0, 0 } -}; - -/* - * UNISIG VCC state definitions - */ -static const struct state unisig_vcc_states[] = { - { "NULL", UNI_NULL }, - { "C_INIT", UNI_CALL_INITIATED }, - { "C_OUT_PR", UNI_CALL_OUT_PROC }, - { "C_DELIV", UNI_CALL_DELIVERED }, - { "C_PRES", UNI_CALL_PRESENT }, - { "C_REC", UNI_CALL_RECEIVED }, - { "CONN_REQ", UNI_CONNECT_REQUEST }, - { "C_IN_PR", UNI_CALL_IN_PROC }, - { "ACTIVE", UNI_ACTIVE }, - { "REL_REQ", UNI_RELEASE_REQUEST }, - { "REL_IND", UNI_RELEASE_IND }, - { "SSCF_REC", UNI_SSCF_RECOV }, - { "FREE", UNI_FREE }, - { "ACTIVE", UNI_PVC_ACTIVE }, - { "ACT_DOWN", UNI_PVC_ACT_DOWN }, - {0, 0 } -}; - -/* - * IP VCC state definitions - */ -static const struct state ip_vcc_states[] = { - { "FREE", IPVCC_FREE }, - { "PMAP", IPVCC_PMAP }, - { "POPEN", IPVCC_POPEN }, - { "PACCEPT", IPVCC_PACCEPT }, - { "ACTPENT", IPVCC_ACTPENT }, - { "ACTIVE", IPVCC_ACTIVE }, - { "CLOSED", IPVCC_CLOSED }, - { 0, 0 } -}; - -/* - * ARP server state definitions - */ -static const struct state arpserver_states[] = { - { "NOT_CONF", UIAS_NOTCONF }, - { "SERVER", UIAS_SERVER_ACTIVE }, - { "PEND_ADR", UIAS_CLIENT_PADDR }, - { "POPEN", UIAS_CLIENT_POPEN }, - { "REGISTER", UIAS_CLIENT_REGISTER }, - { "ACTIVE", UIAS_CLIENT_ACTIVE }, - { 0, 0 } -}; - -/* - * Supported signalling managers - */ -static const struct proto_state proto_states[] = { - { "SIGPVC", sigpvc_states, sigpvc_vcc_states, ATM_SIG_PVC }, - { "SPANS", spans_states, spans_vcc_states, ATM_SIG_SPANS }, - { "UNI 3.0", unisig_states, unisig_vcc_states, ATM_SIG_UNI30 }, - { "UNI 3.1", unisig_states, unisig_vcc_states, ATM_SIG_UNI31 }, - { "UNI 4.0", unisig_states, unisig_vcc_states, ATM_SIG_UNI40 }, - { 0, 0, 0, 0 } -}; - -/* - * ATMARP origin values - */ -static const struct state arp_origins[] = { - { "LOCAL", UAO_LOCAL }, - { "PERM", UAO_PERM }, - { "REG", UAO_REGISTER }, - { "SCSP", UAO_SCSP }, - { "LOOKUP", UAO_LOOKUP }, - { "PEER_RSP", UAO_PEER_RSP }, - { "PEER_REQ", UAO_PEER_REQ }, - { 0, 0 } -}; - - -/* - * Print ARP table information - * - * Arguments: - * ai pointer to a struct air_arp_rsp - * - * Returns: - * none - * - */ -void -print_arp_info(ai) - struct air_arp_rsp *ai; -{ - int i; - const char *atm_addr, *ip_addr, *origin; - char age[8], flags[32]; - struct sockaddr_in *sain; - - /* - * Print a header if it hasn't been done yet. - */ - if (!arp_hdr) { - printf(ARP_HDR); - arp_hdr = 1; - } - - /* - * Format the addresses - */ - atm_addr = format_atm_addr(&ai->aap_addr); - sain = (struct sockaddr_in *)(void *)&ai->aap_arp_addr; - ip_addr = format_ip_addr(&sain->sin_addr); - - /* - * Decode the flags - */ - bzero(flags, sizeof(flags)); - if (ai->aap_flags & ARPF_VALID) { - strcat(flags, "V"); - } - if (ai->aap_flags & ARPF_REFRESH) { - strcat(flags, "R"); - } - - /* - * Format the origin - */ - for (i=0; arp_origins[i].s_name != NULL && - ai->aap_origin != arp_origins[i].s_id; - i++); - if (arp_origins[i].s_name) { - origin = arp_origins[i].s_name; - } else { - origin = "-"; - } - - /* - * Format the age - */ - bzero(age, sizeof(age)); - if (!(ai->aap_flags & ARPF_VALID)) { - strcpy(age, "-"); - } else { - sprintf(age, "%d", ai->aap_age); - } - - /* - * Print the ARP information - */ - printf("%-8s %-5s %3s %s\n ATM address = %s\n IP address = %s\n", - ai->aap_intf, - flags, - age, - origin, - atm_addr, - ip_addr); -} - - -/* - * Print ARP server information - * - * Arguments: - * si pointer to a struct air_asrv_rsp - * - * Returns: - * none - * - */ -void -print_asrv_info(si) - struct air_asrv_rsp *si; -{ - int i; - const char *atm_addr, *state; - struct in_addr *addr; - - /* - * Print a header if it hasn't been done yet. - */ - if (!asrv_hdr) { - printf(ASRV_HDR); - asrv_hdr = 1; - } - - /* - * Format the ATM address of the ARP server - */ - atm_addr = format_atm_addr(&si->asp_addr); - - /* - * Format the server state - */ - for (i=0; arpserver_states[i].s_name != NULL && - si->asp_state != arpserver_states[i].s_id; - i++); - if (arpserver_states[i].s_name) { - state = arpserver_states[i].s_name; - } else { - state = "-"; - } - - /* - * Print the ARP server information - */ - printf("%-8s %-8s %s\n", - si->asp_intf, - state, - atm_addr); - - /* - * Format and print the LIS prefixes - */ - if (si->asp_nprefix) { - addr = (struct in_addr *)((u_long)si + - sizeof(struct air_asrv_rsp)); - printf(" LIS = "); - for (i = 0; i < si->asp_nprefix; i++) { - printf("%s", inet_ntoa(*addr)); - addr++; - printf("/0x%0lx", (u_long)ntohl(addr->s_addr)); - addr++; - if (i < si->asp_nprefix -1) - printf(", "); - } - printf("\n"); - } -} - - -/* - * Print adapter configuration information - * - * Arguments: - * si pointer to a struct air_cfg_rsp - * - * Returns: - * none - * - */ -void -print_cfg_info(si) - struct air_cfg_rsp *si; -{ - const char *adapter, *bus, *media, *vendor; - - /* - * Print a header if it hasn't been done yet. - */ - if (!cfg_hdr) { - printf(CFG_HDR); - cfg_hdr = 1; - } - - /* - * Format the vendor name and adapter type - */ - vendor = get_vendor(si->acp_vendor); - adapter = get_adapter(si->acp_device); - - /* - * Format the communications medium - */ - media = get_media_type(si->acp_media); - bus = get_bus_type(si->acp_bustype); - - /* - * Print the ARP server information - */ - printf("%-8s %-8s %-8s %-14s %-4s %ld\n", - si->acp_intf, - vendor, - adapter, - media, - bus, - si->acp_serial); - printf(" MAC address = %s\n", - format_mac_addr(&si->acp_macaddr)); - printf(" Hardware version = %s\n", si->acp_hard_vers); - printf(" Firmware version = %s\n", si->acp_firm_vers); -} - - -/* - * Print interface information - * - * Arguments: - * ni pointer to a struct air_int_rsp - * - * Returns: - * none - * - */ -void -print_intf_info(ni) - struct air_int_rsp *ni; -{ - int i; - char nif_names[(IFNAMSIZ *2)+4]; - char *atm_addr; - const char *sigmgr = "-"; - const char *state_name = "-"; - const struct state *s_t; - - /* - * Print a header - */ - printf(INTF_HDR); - - /* - * Translate signalling manager name - */ - for (i=0; proto_states[i].p_state != NULL; i++) - if (ni->anp_sig_proto == proto_states[i].p_id) - break; - if (proto_states[i].p_state != NULL) - sigmgr = proto_states[i].p_name; - - /* - * Get the signalling manager state - */ - if (proto_states[i].p_state != NULL) { - s_t = proto_states[i].p_state; - for (i=0; s_t[i].s_name != NULL; i++) - if (ni->anp_sig_state == s_t[i].s_id) - break; - if (s_t[i].s_name != NULL) - state_name = s_t[i].s_name; - } - - /* - * Format the ATM address - */ - atm_addr = format_atm_addr(&ni->anp_addr); - - /* - * Get the range of NIFs on the physical interface - */ - bzero(nif_names, sizeof(nif_names)); - if (strlen(ni->anp_nif_pref) == 0) { - strcpy(nif_names, "-"); - } else { - strcpy(nif_names, ni->anp_nif_pref); - strcat(nif_names, "0"); - if (ni->anp_nif_cnt > 1) { - strcat(nif_names, " - "); - strcat(nif_names, ni->anp_nif_pref); - sprintf(&nif_names[strlen(nif_names)], "%d", - ni->anp_nif_cnt-1); - } - } - - - /* - * Print the interface information - */ - printf("%-9s %-7s %s\n", - ni->anp_intf, - sigmgr, - state_name); - printf(" ATM address = %s\n", atm_addr); - printf(" Network interfaces: %s\n", nif_names); -} - - -/* - * Print IP address map information - * - * Arguments: - * ai pointer to a struct air_arp_rsp - * - * Returns: - * none - * - */ -void -print_ip_vcc_info(ai) - struct air_ip_vcc_rsp *ai; -{ - int i; - const char *ip_addr, *state; - char flags[32], vpi_vci[16]; - struct sockaddr_in *sain; - - /* - * Print a header if it hasn't been done yet. - */ - if (!ip_vcc_hdr) { - printf(IP_VCC_HDR); - ip_vcc_hdr = 1; - } - - /* - * Format the IP address - */ - sain = (struct sockaddr_in *)(void *)&ai->aip_dst_addr; - ip_addr = format_ip_addr(&sain->sin_addr); - - /* - * Format the VPI/VCI - */ - if (ai->aip_vpi == 0 && ai->aip_vci == 0) { - strcpy(vpi_vci, " - -"); - } else { - sprintf(vpi_vci, "%3d %5d", ai->aip_vpi, ai->aip_vci); - } - - /* - * Decode VCC flags - */ - bzero(flags, sizeof(flags)); - if (ai->aip_flags & IVF_PVC) { - strcat(flags, "P"); - } - if (ai->aip_flags & IVF_SVC) { - strcat(flags, "S"); - } - if (ai->aip_flags & IVF_LLC) { - strcat(flags, "L"); - } - if (ai->aip_flags & IVF_MAPOK) { - strcat(flags, "M"); - } - if (ai->aip_flags & IVF_NOIDLE) { - strcat(flags, "N"); - } - - /* - * Get the state of the VCC - */ - for (i=0; ip_vcc_states[i].s_name != NULL && - ai->aip_state != ip_vcc_states[i].s_id; - i++); - if (ip_vcc_states[i].s_name) { - state = ip_vcc_states[i].s_name; - } else { - state = "-"; - } - - /* - * Print the IP VCC information - */ - printf("%-8s %9s %-7s %-5s %s\n", - ai->aip_intf, - vpi_vci, - state, - flags, - ip_addr); -} - - -/* - * Print network interface information - * - * Arguments: - * ni pointer to a struct air_int_rsp - * - * Returns: - * none - * - */ -void -print_netif_info(ni) - struct air_netif_rsp *ni; -{ - const char *ip_addr; - struct sockaddr_in *sain; - - /* - * Print a header - */ - if (!netif_hdr) { - netif_hdr++; - printf(NETIF_HDR); - } - - /* - * Format the protocol address - */ - sain = (struct sockaddr_in *)(void *)&ni->anp_proto_addr; - ip_addr = format_ip_addr(&sain->sin_addr); - - /* - * Print the network interface information - */ - printf("%-8s %-8s %s\n", - ni->anp_intf, - ni->anp_phy_intf, - ip_addr); -} - - -/* - * Print physical interface statistics - * - * Arguments: - * pi pointer to a struct air_phy_stat_rsp - * - * Returns: - * none - * - */ -void -print_intf_stats(pi) - struct air_phy_stat_rsp *pi; -{ - /* - * Print a header if it hasn't already been done - */ - if (!phy_stats_hdr) { - printf(PHY_STATS_HDR); - phy_stats_hdr = 1; - } - - /* - * Print the interface statistics - */ - printf("%-9s %7lld %8lld %5lld %7lld %8lld %5lld %5lld\n", - pi->app_intf, - (unsigned long long)pi->app_ipdus, - (unsigned long long)pi->app_ibytes, - (unsigned long long)pi->app_ierrors, - (unsigned long long)pi->app_opdus, - (unsigned long long)pi->app_obytes, - (unsigned long long)pi->app_oerrors, - (unsigned long long)pi->app_cmderrors); -} - - -/* - * Print VCC statistics - * - * Arguments: - * vi pointer to VCC statistics to print - * - * Returns: - * none - * - */ -void -print_vcc_stats(vi) - struct air_vcc_rsp *vi; -{ - - /* - * Print a header if it hasn't already been done - */ - if (!vcc_stats_hdr) { - printf(VCC_STATS_HDR); - vcc_stats_hdr = 1; - } - - /* - * Print the VCC statistics - */ - printf("%-9s %3d %4d", - vi->avp_intf, - vi->avp_vpi, - vi->avp_vci); - if ( vi->avp_type & VCC_IN ) - printf ( " %7ld %8ld %5ld", - vi->avp_ipdus, - vi->avp_ibytes, - vi->avp_ierrors); - else - printf ( " - - -" ); - - if ( vi->avp_type & VCC_OUT ) - printf ( " %7ld %8ld %5ld\n", - vi->avp_opdus, - vi->avp_obytes, - vi->avp_oerrors); - else - printf ( " - - -\n" ); -} - - -/* - * Print VCC information - * - * Arguments: - * vi pointer to a struct air_vcc_rsp - * - * Returns: - * none - * - */ -void -print_vcc_info(vi) - struct air_vcc_rsp *vi; -{ - int i; - const char *aal_name = "-" , *encaps_name = "-", *owner_name = "-"; - const char *state_name = "-", *type_name = "-"; - char dir_name[10]; - const struct state *s_t; - - /* - * Print a header if it hasn't already been done - */ - if (!vcc_hdr) { - printf(VCC_HDR); - vcc_hdr = 1; - } - - /* - * Translate AAL - */ - for (i=0; aals[i].a_name != NULL; i++) - if (vi->avp_aal == aals[i].a_id) - break; - if (aals[i].a_name) - aal_name = aals[i].a_name; - - /* - * Translate VCC type - */ - if (vi->avp_type & VCC_PVC) - type_name = "PVC"; - else if (vi->avp_type & VCC_SVC) - type_name = "SVC"; - /* - * Translate VCC direction - */ - bzero(dir_name, sizeof(dir_name)); - if (vi->avp_type & VCC_IN) - strcat(dir_name, "In"); - if (vi->avp_type & VCC_OUT) - strcat(dir_name, "Out"); - if (strlen(dir_name) == 0) - strcpy(dir_name, "-"); - - /* - * Translate state - */ - for (i=0; proto_states[i].p_state != NULL; i++) - if (vi->avp_sig_proto == proto_states[i].p_id) - break; - if (proto_states[i].p_state) { - s_t = proto_states[i].v_state; - for (i=0; s_t[i].s_name != NULL; i++) - if (vi->avp_state == s_t[i].s_id) - break; - if (s_t[i].s_name) - state_name = s_t[i].s_name; - } - - /* - * Translate encapsulation - */ - for (i=0; encaps[i].e_name != NULL; i++) - if (vi->avp_encaps == encaps[i].e_id) - break; - if (encaps[i].e_name) - encaps_name = encaps[i].e_name; - - /* - * Print the VCC information - */ - printf("%-9s %3d %5d %-4s %-4s %-5s %-8s %-8s ", - vi->avp_intf, - vi->avp_vpi, - vi->avp_vci, - aal_name, - type_name, - dir_name, - state_name, - encaps_name); - - /* - * Print VCC owners' names - */ - for (i = 0, owner_name = vi->avp_owners; - i < O_CNT - 1 && strlen(owner_name); - i++, owner_name += (T_ATM_APP_NAME_LEN + 1)) { - if (i > 0) - printf(", "); - printf("%s", owner_name); - } - if (i == 0) - printf("-"); - printf("\n"); - - /* - * Print destination address if it's an SVC - */ - if (vi->avp_type & VCC_SVC) { - printf(" Dest = %s\n", - format_atm_addr(&vi->avp_daddr)); - } -} - - -/* - * Print network interface information - * - * Arguments: - * ni pointer to a struct air_int_rsp - * - * Returns: - * none - * - */ -void -print_version_info(vi) - struct air_version_rsp *vi; -{ - char version_str[80]; - - /* - * Print a header - */ - if (!version_hdr) { - version_hdr++; - printf(VERSION_HDR); - } - - /* - * Print the interface information - */ - sprintf(version_str, "%d.%d", - ATM_VERS_MAJ(vi->avp_version), - ATM_VERS_MIN(vi->avp_version)); - printf("%7s\n", version_str); -} diff --git a/sbin/atm/atm/atm_set.c b/sbin/atm/atm/atm_set.c deleted file mode 100644 index 790bfc1..0000000 --- a/sbin/atm/atm/atm_set.c +++ /dev/null @@ -1,528 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * User configuration and display program - * -------------------------------------- - * - * Routines for "set" subcommand - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "atm.h" - -#ifndef lint -__RCSID("@(#) $FreeBSD$"); -#endif - - -/* - * Process ATM ARP server set command - * - * Command format: - * atm set arpserver ... - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -set_arpserver(int argc, char **argv, const struct cmd *cmdp __unused) -{ - int rc, s; - u_int i; - ssize_t len; - size_t prefix_len = 0; - char *intf; - Atm_addr server; - struct sockaddr_in *lis; - struct sockaddr_in if_mask; - struct atmsetreq asr; - struct atminfreq air; - struct air_netif_rsp *int_info; - struct { - struct in_addr ip_addr; - struct in_addr ip_mask; - } prefix_buf[64];; - - /* - * Validate interface name - */ - check_netif_name(argv[0]); - intf = argv[0]; - argc--; argv++; - - /* - * Get the ARP server's ATM address - */ - bzero(&server, sizeof(server)); - if (strcasecmp(argv[0], "local")) { - /* - * ARP server NSAP address is provided - */ - server.address_format = T_ATM_ENDSYS_ADDR; - server.address_length = sizeof(Atm_addr_nsap); - if (get_hex_atm_addr(argv[0], - (u_char *)server.address, - sizeof(Atm_addr_nsap)) != - sizeof(Atm_addr_nsap)) { - fprintf(stderr, "%s: Invalid ARP server address\n", - prog); - exit(1); - } - if (argc > 1) { - fprintf(stderr, "%s: Invalid number of arguments\n", - prog); - exit(1); - } - prefix_len = 0; - } else { - argc--; argv++; - - /* - * This host is the ARP server - */ - server.address_format = T_ATM_ABSENT; - server.address_length = 0; - - /* - * Get interface information from the kernel. We need - * to get the IP address and the subnet mask associated - * with the network interface and insert them into the - * list of permitted LIS prefixes. - */ - bzero(&air, sizeof(air)); - air.air_opcode = AIOCS_INF_NIF; - strcpy(air.air_int_intf, intf); - len = do_info_ioctl(&air, sizeof(struct air_netif_rsp)); - if (len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - intf); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - int_info = (struct air_netif_rsp *) air.air_buf_addr; - lis = (struct sockaddr_in *)(void *)&int_info->anp_proto_addr; - prefix_buf[0].ip_addr = lis->sin_addr; - free(int_info); - - rc = get_subnet_mask(intf, &if_mask); - if (rc) { - fprintf(stderr, "%s: Can't get subnet mask for %s\n", - prog, intf); - } - prefix_buf[0].ip_mask = if_mask.sin_addr; - prefix_buf[0].ip_addr.s_addr &= - prefix_buf[0].ip_mask.s_addr; - - /* - * Get the prefixes of the LISs that we'll support - */ - for (i = 1; argc; i++, argc--, argv++) { - rc = parse_ip_prefix(argv[0], - (struct in_addr *)&prefix_buf[i]); - if (rc != 0) { - fprintf(stderr, "%s: Invalid IP prefix value \'%s\'\n", - prog, argv[0]); - exit(1); - } - } - - /* - * Compress the prefix list - */ - prefix_len = compress_prefix_list((struct in_addr *)prefix_buf, - i * sizeof(struct in_addr) * 2); - } - - /* - * Build ioctl request - */ - bzero(&asr, sizeof(asr)); - asr.asr_opcode = AIOCS_SET_ASV; - strncpy(asr.asr_arp_intf, intf, sizeof(asr.asr_arp_intf)); - asr.asr_arp_addr = server; - asr.asr_arp_subaddr.address_format = T_ATM_ABSENT; - asr.asr_arp_subaddr.address_length = 0; - if (prefix_len) - asr.asr_arp_pbuf = (caddr_t)prefix_buf; - else - asr.asr_arp_pbuf = (caddr_t)0; - asr.asr_arp_plen = prefix_len; - - /* - * Pass the new ARP server address to the kernel - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCSET, (caddr_t)&asr) < 0) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case EOPNOTSUPP: - case EPROTONOSUPPORT: - perror("Internal error"); - break; - case EINVAL: - fprintf(stderr, "Invalid parameter\n"); - break; - case ENOMEM: - fprintf(stderr, "Kernel memory exhausted\n"); - break; - case ENETDOWN: - fprintf(stderr, "ATM network is inoperable\n"); - break; - case EPERM: - fprintf(stderr, "Must be super user to use set subcommand\n"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM interface\n", intf); - break; - case ENOENT: - fprintf(stderr, "Signalling manager not attached\n"); - break; - case ENOPROTOOPT: - fprintf(stderr, - "%s does not have an IP address configured\n", - intf); - break; - default: - perror("Ioctl (AIOCSET) ARPSERVER address"); - break; - } - exit(1); - } - - (void)close(s); -} - - -/* - * Process set MAC address command - * - * Command format: - * atm set mac - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -set_macaddr(int argc, char **argv, const struct cmd *cmdp __unused) -{ - int s; - char *intf; - struct mac_addr mac; - struct atmsetreq asr; - - /* - * Validate interface name - */ - if (strlen(argv[0]) > sizeof(asr.asr_mac_intf) - 1) { - fprintf(stderr, "%s: Illegal interface name\n", prog); - exit(1); - } - intf = argv[0]; - argc--; argv++; - - /* - * Get the MAC address provided by the user - */ - if (get_hex_atm_addr(argv[0], (u_char *)&mac, sizeof(mac)) != - sizeof(mac)) { - fprintf(stderr, "%s: Invalid MAC address\n", prog); - exit(1); - } - - /* - * Build ioctl request - */ - asr.asr_opcode = AIOCS_SET_MAC; - strncpy(asr.asr_mac_intf, intf, sizeof(asr.asr_mac_intf)); - bcopy(&mac, &asr.asr_mac_addr, sizeof(asr.asr_mac_addr)); - - /* - * Pass the new address to the kernel - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCSET, (caddr_t)&asr) < 0) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case EOPNOTSUPP: - case EPROTONOSUPPORT: - perror("Internal error"); - break; - case EADDRINUSE: - fprintf(stderr, "Interface must be detached to set MAC addres\n"); - break; - case EINVAL: - fprintf(stderr, "Invalid parameter\n"); - break; - case ENOMEM: - fprintf(stderr, "Kernel memory exhausted\n"); - break; - case ENETDOWN: - fprintf(stderr, "ATM network is inoperable\n"); - break; - case EPERM: - fprintf(stderr, "Must be super user to use set subcommand\n"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - argv[0]); - break; - default: - perror("Ioctl (AIOCSET) MAC address"); - break; - } - exit(1); - } - - (void)close(s); -} - - -/* - * Process network interface set command - * - * Command format: - * atm set netif - * - * Arguments: - * argc number of arguments to command - * argv pointer to argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -set_netif(int argc, char **argv, const struct cmd *cmdp __unused) -{ - struct atmsetreq anr; - char str[16]; - char *cp; - int s; - u_long nifs; - - /* - * Set IOCTL opcode - */ - anr.asr_opcode = AIOCS_SET_NIF; - - /* - * Validate interface name - */ - if (strlen(argv[0]) > sizeof(anr.asr_nif_intf) - 1) { - fprintf(stderr, "%s: Illegal interface name\n", prog); - exit(1); - } - strcpy(anr.asr_nif_intf, argv[0]); - argc--; argv++; - - /* - * Validate network interface name prefix - */ - if ((strlen(argv[0]) > sizeof(anr.asr_nif_pref) - 1) || - (strpbrk(argv[0], "0123456789"))) { - fprintf(stderr, "%s: Illegal network interface prefix\n", prog); - exit(1); - } - strcpy(anr.asr_nif_pref, argv[0]); - argc--; argv++; - - /* - * Validate interface count - */ - errno = 0; - nifs = strtoul(argv[0], &cp, 0); - if (errno != 0 || *cp != '\0' || nifs > MAX_NIFS) { - fprintf(stderr, "%s: Invalid interface count\n", prog); - exit(1); - } - anr.asr_nif_cnt = nifs; - - /* - * Make sure the resulting name won't be too long - */ - sprintf(str, "%lu", nifs - 1); - if ((strlen(str) + strlen(anr.asr_nif_pref)) > - sizeof(anr.asr_nif_intf) - 1) { - fprintf(stderr, "%s: Network interface prefix too long\n", prog); - exit(1); - } - - /* - * Tell the kernel to do it - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCSET, (caddr_t)&anr) < 0) { - fprintf(stderr, "%s: ", prog); - perror("ioctl (AIOCSET) set NIF"); - exit(1); - } - (void)close(s); -} - - -/* - * Process set NSAP prefix command - * - * Command format: - * atm set nsap - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -set_prefix(int argc, char **argv, const struct cmd *cmdp __unused) -{ - int s; - char *intf; - u_char pfx[13]; - struct atmsetreq asr; - - /* - * Validate interface name - */ - if (strlen(argv[0]) > sizeof(asr.asr_prf_intf) - 1) { - fprintf(stderr, "%s: Illegal interface name\n", prog); - exit(1); - } - intf = argv[0]; - argc--; argv++; - - /* - * Get the prefix provided by the user - */ - if (get_hex_atm_addr(argv[0], pfx, sizeof(pfx)) != sizeof(pfx)) { - fprintf(stderr, "%s: Invalid NSAP prefix\n", prog); - exit(1); - } - - /* - * Build ioctl request - */ - asr.asr_opcode = AIOCS_SET_PRF; - strncpy(asr.asr_prf_intf, intf, sizeof(asr.asr_prf_intf)); - bcopy(pfx, asr.asr_prf_pref, sizeof(asr.asr_prf_pref)); - - /* - * Pass the new prefix to the kernel - */ - s = socket(AF_ATM, SOCK_DGRAM, 0); - if (s < 0) { - sock_error(errno); - } - if (ioctl(s, AIOCSET, (caddr_t)&asr) < 0) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case EOPNOTSUPP: - case EPROTONOSUPPORT: - perror("Internal error"); - break; - case EALREADY: - fprintf(stderr, "NSAP prefix is already set\n"); - break; - case EINVAL: - fprintf(stderr, "Invalid parameter\n"); - break; - case ENOMEM: - fprintf(stderr, "Kernel memory exhausted\n"); - break; - case ENETDOWN: - fprintf(stderr, "ATM network is inoperable\n"); - break; - case EPERM: - fprintf(stderr, "Must be super user to use set subcommand\n"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - argv[0]); - break; - default: - perror("Ioctl (AIOCSET) NSAP prefix"); - break; - } - exit(1); - } - - (void)close(s); -} diff --git a/sbin/atm/atm/atm_show.c b/sbin/atm/atm/atm_show.c deleted file mode 100644 index e744c75..0000000 --- a/sbin/atm/atm/atm_show.c +++ /dev/null @@ -1,1144 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * User configuration and display program - * -------------------------------------- - * - * Routines for "show" subcommand - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "atm.h" - -#ifndef lint -__RCSID("@(#) $FreeBSD$"); -#endif - - -/* - * Local functions - */ -static int vcc_compare(const void *, const void *); -static int ip_vcc_compare(const void *, const void *); -static int arp_compare(const void *, const void *); - - -/* - * Process show ARP command - * - * Command format: - * atm show ARP [] - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_arp(int argc, char **argv, const struct cmd *cmdp __unused) -{ - size_t arp_info_len; - struct atminfreq air; - struct air_arp_rsp *arp_info, *arp_info_base; - struct sockaddr_in *sain; - union { - struct sockaddr_in sain; - struct sockaddr sa; - } host_addr; - - /* - * Get IP address of specified host name - */ - bzero(&host_addr, sizeof(host_addr)); - host_addr.sa.sa_family = AF_INET; - if (argc) { - sain = get_ip_addr(argv[0]); - if (!sain) { - fprintf(stderr, "%s: host \'%s\' not found\n", - prog, argv[0]); - exit(1); - } - host_addr.sain.sin_addr.s_addr = sain->sin_addr.s_addr; - } else { - host_addr.sain.sin_addr.s_addr = INADDR_ANY; - } - - /* - * Get ARP information from the kernel - */ - bzero(&air, sizeof(air)); - air.air_opcode = AIOCS_INF_ARP; - air.air_arp_addr = host_addr.sa; - arp_info_len = do_info_ioctl(&air, sizeof(struct air_arp_rsp) * 10); - if ((ssize_t)arp_info_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "not an ATM device\n"); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - arp_info_base = arp_info = - (struct air_arp_rsp *) air.air_buf_addr; - - /* - * Sort the ARP table - */ - qsort((void *) arp_info, - arp_info_len / sizeof(struct air_arp_rsp), - sizeof(struct air_arp_rsp), - arp_compare); - - /* - * Print the relevant information - */ - while (arp_info_len >= sizeof(struct air_arp_rsp)) { - print_arp_info(arp_info); - arp_info++; - arp_info_len -= sizeof(struct air_arp_rsp); - } - - /* - * Release the information from the kernel - */ - free(arp_info_base); -} - - -/* - * Process show ATM ARP server command - * - * Command format: - * atm show arpserver [] - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_arpserv(int argc, char **argv, const struct cmd *cmdp __unused) -{ - size_t buf_len, asrv_info_len; - struct atminfreq air; - struct air_asrv_rsp *asrv_info, *asrv_info_base; - - /* - * Validate interface name - */ - bzero(air.air_int_intf, sizeof(air.air_int_intf)); - if (argc) { - if (strlen(argv[0]) > IFNAMSIZ - 1) { - fprintf(stderr, "%s: Illegal interface name\n", - prog); - exit(1); - } - strcpy(air.air_int_intf, argv[0]); - argc--; argv++; - } - - /* - * Get interface information from the kernel - */ - air.air_opcode = AIOCS_INF_ASV; - buf_len = do_info_ioctl(&air, sizeof(struct air_asrv_rsp) * 3); - if ((ssize_t)buf_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - argv[0]); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - - /* - * Print the interface information - */ - asrv_info_base = asrv_info = - (struct air_asrv_rsp *)(void *)air.air_buf_addr; - while (buf_len >= sizeof(struct air_asrv_rsp)) { - print_asrv_info(asrv_info); - asrv_info_len = sizeof(struct air_asrv_rsp) + - asrv_info->asp_nprefix * sizeof(struct in_addr) * 2; - asrv_info = (struct air_asrv_rsp *)(void *) - ((char *)asrv_info + asrv_info_len); - buf_len -= asrv_info_len; - } - free(asrv_info_base); -} - - -/* - * Process show ATM adapter configuration command - * - * Command format: - * atm show config [] - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_config(int argc, char **argv, const struct cmd *cmdp __unused) -{ - size_t buf_len; - struct atminfreq air; - struct air_cfg_rsp *cfg_info, *cfg_info_base; - - /* - * Validate interface name - */ - bzero(air.air_cfg_intf, sizeof(air.air_cfg_intf)); - if (argc) { - if (strlen(argv[0]) > IFNAMSIZ - 1) { - fprintf(stderr, "%s: Illegal interface name\n", - prog); - exit(1); - } - strcpy(air.air_cfg_intf, argv[0]); - argc--; argv++; - } - - /* - * Get configuration information from the kernel - */ - air.air_opcode = AIOCS_INF_CFG; - buf_len = do_info_ioctl(&air, sizeof(struct air_asrv_rsp) * 3); - if ((ssize_t)buf_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - argv[0]); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - - /* - * Print the interface information - */ - cfg_info_base = cfg_info = - (struct air_cfg_rsp *)(void *)air.air_buf_addr; - for (; buf_len >= sizeof(struct air_cfg_rsp); cfg_info++, - buf_len -= sizeof(struct air_cfg_rsp)) { - print_cfg_info(cfg_info); - } - free(cfg_info_base); -} - - -/* - * Process show interface command - * - * Command format: - * atm show interface [] - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_intf(int argc, char **argv, const struct cmd *cmdp __unused) -{ - size_t buf_len; - struct atminfreq air; - struct air_int_rsp *int_info, *int_info_base; - - /* - * Validate interface name - */ - bzero(&air, sizeof(air)); - if (argc) { - if (strlen(argv[0]) > IFNAMSIZ - 1) { - fprintf(stderr, "%s: Illegal interface name\n", - prog); - exit(1); - } - strcpy(air.air_int_intf, argv[0]); - argc--; argv++; - } - - /* - * Get interface information from the kernel - */ - air.air_opcode = AIOCS_INF_INT; - buf_len = do_info_ioctl(&air, sizeof(struct air_int_rsp) * 3); - if ((ssize_t)buf_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - argv[0]); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - - /* - * Print the interface information - */ - int_info_base = int_info = - (struct air_int_rsp *)(void *)air.air_buf_addr; - for (; buf_len >= sizeof(struct air_int_rsp); int_info++, - buf_len -= sizeof(struct air_int_rsp)) { - print_intf_info(int_info); - } - free(int_info_base); -} - - -/* - * Process show IP VCCs command - * - * Command format: - * atm show ipvcc [] - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_ip_vcc(int argc, char **argv, const struct cmd *cmdp __unused) -{ - int rc; - size_t ip_info_len; - char *if_name = (char *)0; - struct atminfreq air; - struct air_ip_vcc_rsp *ip_info, *ip_info_base; - struct sockaddr_in *sain; - union { - struct sockaddr_in sain; - struct sockaddr sa; - } host_addr; - - /* - * First parameter can be a netif name, an IP host name, or - * an IP address. Figure out which it is. - */ - bzero(&host_addr, sizeof(host_addr)); - host_addr.sa.sa_family = AF_INET; - if (argc) { - rc = verify_nif_name(argv[0]); - if (rc < 0) { - /* - * Error occured - */ - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - argv[0]); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } else if (rc > 0) { - /* - * Parameter is a valid netif name - */ - if_name = argv[0]; - } else { - /* - * Get IP address of specified host name - */ - sain = get_ip_addr(argv[0]); - host_addr.sain.sin_addr.s_addr = - sain->sin_addr.s_addr; - } - } else { - host_addr.sain.sin_addr.s_addr = INADDR_ANY; - } - - /* - * Get IP map information from the kernel - */ - air.air_opcode = AIOCS_INF_IPM; - air.air_ip_addr = host_addr.sa; - ip_info_len = do_info_ioctl(&air, sizeof(struct air_ip_vcc_rsp) * 10); - if ((ssize_t)ip_info_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "not an ATM device\n"); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - ip_info_base = ip_info = - (struct air_ip_vcc_rsp *)(void *)air.air_buf_addr; - - /* - * Sort the information - */ - qsort((void *) ip_info, - ip_info_len / sizeof(struct air_ip_vcc_rsp), - sizeof(struct air_ip_vcc_rsp), - ip_vcc_compare); - - /* - * Print the relevant information - */ - while (ip_info_len >= sizeof(struct air_ip_vcc_rsp)) { - if (!if_name || !strcmp(if_name, ip_info->aip_intf)) { - print_ip_vcc_info(ip_info); - } - ip_info++; - ip_info_len -= sizeof(struct air_ip_vcc_rsp); - } - - /* - * Release the information from the kernel - */ - free(ip_info_base); -} - - -/* - * Process show network interface command - * - * Command format: - * atm show netif [] - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_netif(int argc, char **argv, const struct cmd *cmdp __unused) -{ - size_t buf_len; - struct atminfreq air; - struct air_netif_rsp *int_info, *int_info_base; - - /* - * Validate network interface name - */ - bzero(air.air_int_intf, sizeof(air.air_int_intf)); - if (argc) { - if (strlen(argv[0]) > IFNAMSIZ - 1) { - fprintf(stderr, "%s: Illegal interface name\n", prog); - exit(1); - } - strcpy(air.air_int_intf, argv[0]); - argc--; argv++; - } - - /* - * Get network interface information from the kernel - */ - air.air_opcode = AIOCS_INF_NIF; - buf_len = do_info_ioctl(&air, sizeof(struct air_netif_rsp) * 3); - if ((ssize_t)buf_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - argv[0]); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - - /* - * Print the network interface information - */ - int_info_base = int_info = - (struct air_netif_rsp *) air.air_buf_addr; - for (; buf_len >= sizeof(struct air_netif_rsp); int_info++, - buf_len -= sizeof(struct air_netif_rsp)) { - print_netif_info(int_info); - } - free(int_info_base); -} - - -/* - * Process interface statistics command - * - * Command format: - * atm show stats interface [] - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_intf_stats(int argc, char **argv, const struct cmd *cmdp __unused) -{ - size_t buf_len; - char intf[IFNAMSIZ]; - struct atminfreq air; - struct air_phy_stat_rsp *pstat_info, *pstat_info_base; - struct air_cfg_rsp *cfg_info; - - /* - * Validate interface name - */ - bzero(intf, sizeof(intf)); - if (argc) { - if (strlen(argv[0]) > IFNAMSIZ - 1) { - fprintf(stderr, "%s: Illegal interface name\n", - prog); - exit(1); - } - strcpy(intf, argv[0]); - argc--; argv++; - } - - /* - * If there are parameters remaining, the request is for - * vendor-specific adaptor statistics - */ - if (argc) { - /* - * Get adapter configuration information - */ - air.air_opcode = AIOCS_INF_CFG; - strcpy(air.air_cfg_intf, intf); - buf_len = do_info_ioctl(&air, sizeof(struct air_cfg_rsp)); - if ((ssize_t)buf_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - intf); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - cfg_info = (struct air_cfg_rsp *)(void *)air.air_buf_addr; - - /* - * Call the appropriate vendor-specific routine - */ - switch(cfg_info->acp_vendor) { - case VENDOR_FORE: - show_fore200_stats(intf, argc, argv); - break; - default: - fprintf(stderr, "%s: Unknown adapter vendor\n", - prog); - break; - } - - free(cfg_info); - } else { - /* - * Get generic interface statistics - */ - air.air_opcode = AIOCS_INF_PIS; - strcpy(air.air_physt_intf, intf); - buf_len = do_info_ioctl(&air, - sizeof(struct air_phy_stat_rsp) * 3); - if ((ssize_t)buf_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - intf); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - - /* - * Display the interface statistics - */ - pstat_info_base = pstat_info = (struct air_phy_stat_rsp *) - (void *)air.air_buf_addr; - for (; buf_len >= sizeof(struct air_phy_stat_rsp); - pstat_info++, - buf_len-=sizeof(struct air_phy_stat_rsp)) { - print_intf_stats(pstat_info); - } - free((caddr_t)pstat_info_base); - } -} - - -/* - * Process VCC statistics command - * - * Command format: - * atm show stats VCC [ [ []]] - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_vcc_stats(int argc, char **argv, const struct cmd *cmdp __unused) -{ - size_t vcc_info_len; - int vpi = -1, vci = -1; - char *cp, *intf = NULL; - struct air_vcc_rsp *vcc_info, *vcc_info_base; - - /* - * Validate interface name - */ - if (argc) { - if (strlen(argv[0]) > IFNAMSIZ - 1) { - fprintf(stderr, "%s: Illegal interface name\n", - prog); - exit(1); - } - intf = argv[0]; - argc--; argv++; - } - - /* - * Validate VPI value - */ - if (argc) { - vpi = strtol(argv[0], &cp, 0); - if ((*cp != '\0') || (vpi < 0) || (vpi >= 1 << 8)) { - fprintf(stderr, "%s: Invalid VPI value\n", prog); - exit(1); - } - argc--; argv++; - } - - /* - * Validate VCI value - */ - if (argc) { - vci = strtol(argv[0], &cp, 0); - if ((*cp != '\0') || (vci <= 0) || (vci >= 1 << 16)) { - fprintf(stderr, "%s: Invalid VCI value\n", - prog); - exit(1); - } - argc--; argv++; - } - - /* - * Get VCC information - */ - vcc_info_len = get_vcc_info(intf, &vcc_info); - if (vcc_info_len == 0) - exit(1); - else if ((ssize_t)vcc_info_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "Not an ATM device\n"); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - - /* - * Sort the VCC information - */ - qsort((void *) vcc_info, - vcc_info_len / sizeof(struct air_vcc_rsp), - sizeof(struct air_vcc_rsp), - vcc_compare); - - /* - * Display the VCC statistics - */ - vcc_info_base = vcc_info; - for (; vcc_info_len >= sizeof(struct air_vcc_rsp); - vcc_info_len-=sizeof(struct air_vcc_rsp), - vcc_info++) { - if (vpi != -1 && vcc_info->avp_vpi != vpi) - continue; - if (vci != -1 && vcc_info->avp_vci != vci) - continue; - print_vcc_stats(vcc_info); - } - free(vcc_info_base); -} - - -/* - * Process VCC information command - * - * Command format: - * atm show VCC [ [ [] | PVC | SVC]] - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_vcc(int argc, char **argv, const struct cmd *cmdp __unused) -{ - size_t vcc_info_len; - int vpi = -1, vci = -1, show_pvc = 0, show_svc = 0; - char *cp, *intf = NULL; - struct air_vcc_rsp *vcc_info, *vcc_info_base; - - /* - * Validate interface name - */ - if (argc) { - if (strlen(argv[0]) > IFNAMSIZ - 1) { - fprintf(stderr, "%s: Illegal interface name\n", - prog); - exit(1); - } - intf = argv[0]; - argc--; argv++; - } - - /* - * Validate VPI value - */ - if (argc) { - if (strcasecmp(argv[0], "pvc")) - show_pvc = 1; - else if (strcasecmp(argv[0], "svc")) - show_svc = 1; - else { - vpi = strtol(argv[0], &cp, 0); - if ((*cp != '\0') || (vpi < 0) || - (vpi >= 1 << 8)) { - fprintf(stderr, "%s: Invalid VPI value\n", prog); - exit(1); - } - } - argc--; argv++; - } - - /* - * Validate VCI value - */ - if (argc) { - vci = strtol(argv[0], &cp, 0); - if ((*cp != '\0') || (vci <= 0) || (vci >= 1 << 16)) { - fprintf(stderr, "%s: Invalid VCI value\n", - prog); - exit(1); - } - argc--; argv++; - } - - /* - * Get VCC information - */ - vcc_info_len = get_vcc_info(intf, &vcc_info); - if (vcc_info_len == 0) - exit(1); - else if ((ssize_t)vcc_info_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "Not an ATM device\n"); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - - /* - * Sort the VCC information - */ - qsort((void *) vcc_info, - vcc_info_len/sizeof(struct air_vcc_rsp), - sizeof(struct air_vcc_rsp), - vcc_compare); - - /* - * Display the VCC information - */ - vcc_info_base = vcc_info; - for (; vcc_info_len >= sizeof(struct air_vcc_rsp); - vcc_info_len-=sizeof(struct air_vcc_rsp), - vcc_info++) { - if (vpi != -1 && vcc_info->avp_vpi != vpi) - continue; - if (vci != -1 && vcc_info->avp_vci != vci) - continue; - if (show_pvc && vcc_info->avp_type & VCC_PVC) - continue; - if (show_svc && vcc_info->avp_type & VCC_SVC) - continue; - print_vcc_info(vcc_info); - } - free(vcc_info_base); -} - - -/* - * Process version command - * - * Command format: - * atm show version - * - * Arguments: - * argc number of remaining arguments to command - * argv pointer to remaining argument strings - * cmdp pointer to command description - * - * Returns: - * none - * - */ -void -show_version(int argc __unused, char **argv __unused, - const struct cmd *cmdp __unused) -{ - size_t buf_len; - struct atminfreq air; - struct air_version_rsp *ver_info, *ver_info_base; - - /* - * Get network interface information from the kernel - */ - air.air_opcode = AIOCS_INF_VER; - buf_len = do_info_ioctl(&air, sizeof(struct air_version_rsp)); - if ((ssize_t)buf_len == -1) { - fprintf(stderr, "%s: ", prog); - switch (errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "Not an ATM device\n"); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - exit(1); - } - - /* - * Print the network interface information - */ - ver_info_base = ver_info = - (struct air_version_rsp *)(void *)air.air_buf_addr; - for (; buf_len >= sizeof(struct air_version_rsp); ver_info++, - buf_len -= sizeof(struct air_version_rsp)) { - print_version_info(ver_info); - } - free(ver_info_base); -} - - -/* - * Comparison function for qsort - * - * Arguments: - * p1 pointer to the first VCC response - * p2 pointer to the second VCC response - * - * Returns: - * int a number less than, greater than, or equal to zero, - * depending on whether *p1 is less than, greater than, or - * equal to *p2 - * - */ -static int -vcc_compare(p1, p2) - const void *p1, *p2; -{ - int rc; - const struct air_vcc_rsp *c1, *c2; - - c1 = (const struct air_vcc_rsp *) p1; - c2 = (const struct air_vcc_rsp *) p2; - - /* - * Compare the interface names - */ - rc = strcmp(c1->avp_intf, c2->avp_intf); - if (rc) - return(rc); - - /* - * Compare the VPI values - */ - rc = c1->avp_vpi - c2->avp_vpi; - if (rc) - return(rc); - - /* - * Compare the VCI values - */ - rc = c1->avp_vci - c2->avp_vci; - if (rc) - return(rc); - - /* - * Compare the types - */ - rc = c1->avp_type - c2->avp_type; - return(rc); -} - - -/* - * Comparison function for qsort - * - * Arguments: - * p1 pointer to the first VCC response - * p2 pointer to the second VCC response - * - * Returns: - * int a number less than, greater than, or equal to zero, - * depending on whether *p1 is less than, greater than, or - * equal to *p2 - * - */ -static int -ip_vcc_compare(p1, p2) - const void *p1, *p2; -{ - int rc; - const struct air_ip_vcc_rsp *c1, *c2; - - c1 = (const struct air_ip_vcc_rsp *) p1; - c2 = (const struct air_ip_vcc_rsp *) p2; - - /* - * Compare the interface names - */ - rc = strcmp(c1->aip_intf, c2->aip_intf); - if (rc) - return(rc); - - /* - * Compare the VPI values - */ - rc = c1->aip_vpi - c2->aip_vpi; - if (rc) - return(rc); - - /* - * Compare the VCI values - */ - rc = c1->aip_vci - c2->aip_vci; - return(rc); -} - - -/* - * Comparison function for qsort - * - * Arguments: - * p1 pointer to the first ARP or IP map entry - * p2 pointer to the second ARP or IP map entry - * - * Returns: - * int a number less than, greater than, or equal to zero, - * depending on whether *p1 is less than, greater than, or - * equal to *p2 - * - */ -static int -arp_compare(p1, p2) - const void *p1, *p2; -{ - int rc; - const struct air_arp_rsp *c1, *c2; - const struct sockaddr_in *sin1, *sin2; - - c1 = (const struct air_arp_rsp *)p1; - c2 = (const struct air_arp_rsp *)p2; - sin1 = (const struct sockaddr_in *)(const void *)&c1->aap_arp_addr; - sin2 = (const struct sockaddr_in *)(const void *)&c2->aap_arp_addr; - - /* - * Compare the IP addresses - */ - if ((rc = sin1->sin_family - sin2->sin_family) != 0) - return(rc); - if ((rc = sin1->sin_addr.s_addr - sin2->sin_addr.s_addr) != 0) - return(rc); - - /* - * Compare the ATM addresses - */ - if ((rc = c1->aap_addr.address_format - c2->aap_addr.address_format) != 0) - return(rc); - if ((rc = c1->aap_addr.address_length - c2->aap_addr.address_length) != 0) - return(rc); - switch(c1->aap_addr.address_format) { - case T_ATM_ABSENT: - rc = 0; - break; - case T_ATM_ENDSYS_ADDR: - rc = bcmp(c1->aap_addr.address, c2->aap_addr.address, - sizeof(Atm_addr_nsap)); - break; - case T_ATM_E164_ADDR: - rc = bcmp(c1->aap_addr.address, c2->aap_addr.address, - sizeof(Atm_addr_e164)); - break; - case T_ATM_SPANS_ADDR: - rc = bcmp(c1->aap_addr.address, c2->aap_addr.address, - sizeof(Atm_addr_spans)); - break; - } - - return(rc); -} diff --git a/sbin/atm/atm/atm_subr.c b/sbin/atm/atm/atm_subr.c deleted file mode 100644 index a612bee..0000000 --- a/sbin/atm/atm/atm_subr.c +++ /dev/null @@ -1,626 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * User configuration and display program - * -------------------------------------- - * - * General subroutines - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "atm.h" - -#ifndef lint -__RCSID("@(#) $FreeBSD$"); -#endif - - -/* - * Table entry definition - */ -typedef struct { - int type; - const char *name; -} tbl_ent; - - -/* - * Table to translate vendor codes to ASCII - */ -static const tbl_ent vendors[] = { - { VENDOR_UNKNOWN, "Unknown" }, - { VENDOR_FORE, "Fore" }, - { VENDOR_ENI, "ENI" }, - { VENDOR_IDT, "IDT" }, - { VENDOR_PROSUM, "ProSum" }, - { VENDOR_NETGRAPH, "Netgraph" }, - { 0, 0 }, -}; - - -/* - * Table to translate adapter codes to ASCII - */ -static const tbl_ent adapter_types[] = { - { DEV_UNKNOWN, "Unknown" }, - { DEV_FORE_SBA200E, "SBA-200E" }, - { DEV_FORE_SBA200, "SBA-200" }, - { DEV_FORE_PCA200E, "PCA-200E" }, - { DEV_FORE_ESA200E, "ESA-200E" }, - { DEV_ENI_155P, "ENI-155p" }, - { DEV_IDT_155, "IDT" }, - { DEV_PROATM_25, "PROATM-25" }, - { DEV_PROATM_155, "PROATM-155" }, - { DEV_VATMPIF, "VATMPIF" }, - { DEV_FORE_LE25, "ForeLE-25" }, - { DEV_FORE_LE155, "ForeLE-155" }, - { DEV_IDT_25, "NICStAR-25" }, - { DEV_IDTABR_25, "IDT77252-25" }, - { DEV_IDTABR_155, "IDT77252-155" }, - { DEV_FORE_HE155, "ForeHE-155" }, - { DEV_FORE_HE622, "ForeHE-622" }, - { 0, 0 }, -}; - -/* - * Table to translate medium types to ASCII - */ -static const tbl_ent media_types[] = { - { MEDIA_UNKNOWN, "Unknown" }, - { MEDIA_TAXI_100, "100 Mbps 4B/5B" }, - { MEDIA_TAXI_140, "140 Mbps 4B/5B" }, - { MEDIA_OC3C, "OC-3c" }, - { MEDIA_OC12C, "OC-12c" }, - { MEDIA_UTP155, "155 Mbps UTP" }, - { MEDIA_UTP25, "25.6 Mbps UTP" }, - { MEDIA_VIRTUAL, "Virtual Link" }, - { MEDIA_DSL, "xDSL" }, - { 0, 0 }, -}; - -/* - * Table to translate bus types to ASCII - */ -static const tbl_ent bus_types[] = { - { BUS_UNKNOWN, "Unknown" }, - { BUS_SBUS_B16, "SBus" }, - { BUS_SBUS_B32, "SBus" }, - { BUS_PCI, "PCI" }, - { BUS_EISA, "EISA" }, - { BUS_USB, "USB" }, - { BUS_VIRTUAL, "Virtual" }, - { 0, 0 }, -}; - - -/* - * Get interface vendor name - * - * Return a character string with a vendor name, given a vendor code. - * - * Arguments: - * vendor vendor ID - * - * Returns: - * char * pointer to a string with the vendor name - * - */ -const char * -get_vendor(int vendor) -{ - int i; - - for(i=0; vendors[i].name; i++) { - if (vendors[i].type == vendor) - return(vendors[i].name); - } - - return("-"); -} - - -/* - * Get adapter type - * - * Arguments: - * dev adapter code - * - * Returns: - * char * pointer to a string with the adapter type - * - */ -const char * -get_adapter(int dev) -{ - int i; - - for(i=0; adapter_types[i].name; i++) { - if (adapter_types[i].type == dev) - return(adapter_types[i].name); - } - - return("-"); -} - - -/* - * Get communication medium type - * - * Arguments: - * media medium code - * - * Returns: - * char * pointer to a string with the name of the medium - * - */ -const char * -get_media_type(int media) -{ - int i; - - for(i=0; media_types[i].name; i++) { - if (media_types[i].type == media) - return(media_types[i].name); - } - - return("-"); -} - - -/* - * Get bus type - * - * Arguments: - * bus bus type code - * - * Returns: - * char * pointer to a string with the bus type - * - */ -const char * -get_bus_type(int bus) -{ - int i; - - for(i=0; bus_types[i].name; i++) { - if (bus_types[i].type == bus) - return(bus_types[i].name); - } - - return("-"); -} - - -/* - * Get adapter ID - * - * Get a string giving the adapter's vendor and type. - * - * Arguments: - * intf interface name - * - * Returns: - * char * pointer to a string identifying the adapter - * - */ -const char * -get_adapter_name(const char *intf) -{ - size_t buf_len; - struct atminfreq air; - struct air_cfg_rsp *cfg; - static char name[256]; - - /* - * Initialize - */ - bzero(&air, sizeof(air)); - bzero(name, sizeof(name)); - - /* - * Get configuration information from the kernel - */ - air.air_opcode = AIOCS_INF_CFG; - strcpy(air.air_cfg_intf, intf); - buf_len = do_info_ioctl(&air, sizeof(struct air_cfg_rsp)); - if (buf_len < sizeof(struct air_cfg_rsp)) - return("-"); - cfg = (struct air_cfg_rsp *)(void *)air.air_buf_addr; - - /* - * Build a string describing the adapter - */ - strcpy(name, get_vendor(cfg->acp_vendor)); - strcat(name, " "); - strcat(name, get_adapter(cfg->acp_device)); - - free(cfg); - - return(name); -} - - -/* - * Format a MAC address into a string - * - * Arguments: - * addr pointer to a MAC address - * - * Returns: - * the address of a string representing the MAC address - * - */ -const char * -format_mac_addr(const Mac_addr *addr) -{ - static char str[256]; - - /* - * Check for null pointer - */ - if (!addr) - return("-"); - - /* - * Clear the returned string - */ - bzero(str, sizeof(str)); - - /* - * Format the address - */ - sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", - addr->ma_data[0], - addr->ma_data[1], - addr->ma_data[2], - addr->ma_data[3], - addr->ma_data[4], - addr->ma_data[5]); - - return(str); -} - - -/* - * Parse an IP prefix designation in the form nnn.nnn.nnn.nnn/mm - * - * Arguments: - * cp pointer to prefix designation string - * op pointer to a pair of in_addrs for the result - * - * Returns: - * 0 success - * -1 prefix was invalid - * - */ -int -parse_ip_prefix(const char *cp, struct in_addr *op) -{ - int len; - char *mp; - struct in_addr ip_addr; - - static u_long masks[33] = { - 0x0, - 0x80000000, - 0xc0000000, - 0xe0000000, - 0xf0000000, - 0xf8000000, - 0xfc000000, - 0xfe000000, - 0xff000000, - 0xff800000, - 0xffc00000, - 0xffe00000, - 0xfff00000, - 0xfff80000, - 0xfffc0000, - 0xfffe0000, - 0xffff0000, - 0xffff8000, - 0xffffc000, - 0xffffe000, - 0xfffff000, - 0xfffff800, - 0xfffffc00, - 0xfffffe00, - 0xffffff00, - 0xffffff80, - 0xffffffc0, - 0xffffffe0, - 0xfffffff0, - 0xfffffff8, - 0xfffffffc, - 0xfffffffe, - 0xffffffff - }; - - /* - * Find the slash that marks the start of the mask - */ - mp = strchr(cp, '/'); - if (mp) { - *mp = '\0'; - mp++; - } - - /* - * Convert the IP-address part of the prefix - */ - ip_addr.s_addr = inet_addr(cp); - if (ip_addr.s_addr == INADDR_NONE) - return(-1); - - /* - * Set the default mask length - */ - if (IN_CLASSA(ntohl(ip_addr.s_addr))) - len = 8; - else if (IN_CLASSB(ntohl(ip_addr.s_addr))) - len = 16; - else if (IN_CLASSC(ntohl(ip_addr.s_addr))) - len = 24; - else - return(-1); - - /* - * Get the mask length - */ - if (mp) { - len = atoi(mp); - if (len < 1 || len > 32) - return(-1); - } - - /* - * Select the mask and copy the IP address into the - * result buffer, ANDing it with the mask - */ - op[1].s_addr = htonl(masks[len]); - op[0].s_addr = ip_addr.s_addr & op[1].s_addr; - - return(0); -} - - -/* - * Compress a list of IP network prefixes - * - * Arguments: - * ipp pointer to list of IP address/mask pairs - * ipc length of list - * - * Returns: - * length of compressed list - * - */ -size_t -compress_prefix_list(struct in_addr *ipp, size_t ilen) -{ - u_int i, j, n; - struct in_addr *ip1, *ip2, *m1, *m2; - - /* - * Figure out how many pairs there are - */ - n = ilen / (sizeof(struct in_addr) * 2); - - /* - * Check each pair of address/mask pairs to make sure - * none contains the other - */ - for (i = 0; i < n; i++) { - ip1 = &ipp[i*2]; - m1 = &ipp[i*2+1]; - - /* - * If we've already eliminated this address, - * skip the checks - */ - if (ip1->s_addr == 0) - continue; - - /* - * Try all possible second members of the pair - */ - for (j = i + 1; j < n; j++) { - ip2 = &ipp[j*2]; - m2 = &ipp[j*2+1]; - - /* - * If we've already eliminated the second - * address, just skip the checks - */ - if (ip2->s_addr == 0) - continue; - - /* - * Compare the address/mask pairs - */ - if (m1->s_addr == m2->s_addr) { - /* - * Masks are equal - */ - if (ip1->s_addr == ip2->s_addr) { - ip2->s_addr = 0; - m2->s_addr = 0; - } - } else if (ntohl(m1->s_addr) < - ntohl(m2->s_addr)) { - /* - * m1 is shorter - */ - if ((ip2->s_addr & m1->s_addr) == - ip1->s_addr) { - ip2->s_addr = 0; - m2->s_addr = 0; - } - } else { - /* - * m1 is longer - */ - if ((ip1->s_addr & m2->s_addr) == - ip2->s_addr) { - ip1->s_addr = 0; - m1->s_addr = 0; - break; - } - } - } - } - - /* - * Now pull up the list, eliminating zeroed entries - */ - for (i = 0, j = 0; i < n; i++) { - ip1 = &ipp[i*2]; - m1 = &ipp[i*2+1]; - ip2 = &ipp[j*2]; - m2 = &ipp[j*2+1]; - if (ip1->s_addr != 0) { - if (i != j) { - *ip2 = *ip1; - *m2 = *m1; - } - j++; - } - } - - return(j * sizeof(struct in_addr) * 2); -} - - -/* - * Make sure a user-supplied parameter is a valid network interface - * name - * - * When a socket call fails, print an error message and exit - * - * Arguments: - * nif pointer to network interface name - * - * Returns: - * none exits if name is not valid - * - */ -void -check_netif_name(const char *nif) -{ - int rc; - - /* - * Look up the name in the kernel - */ - rc = verify_nif_name(nif); - - /* - * Check the result - */ - if (rc > 0) { - /* - * Name is OK - */ - return; - } else if (rc == 0) { - /* - * Name is not valid - */ - fprintf(stderr, "%s: Invalid network interface name %s\n", - prog, nif); - } else { - /* - * Error performing IOCTL - */ - fprintf(stderr, "%s: ", prog); - switch(errno) { - case ENOPROTOOPT: - case EOPNOTSUPP: - perror("Internal error"); - break; - case ENXIO: - fprintf(stderr, "%s is not an ATM device\n", - nif); - break; - default: - perror("ioctl (AIOCINFO)"); - break; - } - } - - exit(1); -} - - -/* - * Socket error handler - * - * When a socket call fails, print an error message and exit - * - * Arguments: - * err an errno describing the error - * - * Returns: - * none - * - */ -void -sock_error(int err) -{ - fprintf(stderr, "%s: ", prog); - - switch (err) { - - case EPROTONOSUPPORT: - fprintf(stderr, "ATM protocol support not loaded\n"); - break; - - default: - perror("socket"); - break; - } - - exit(1); -} diff --git a/sbin/atm/fore_dnld/COPYRIGHT b/sbin/atm/fore_dnld/COPYRIGHT deleted file mode 100644 index f934d42..0000000 --- a/sbin/atm/fore_dnld/COPYRIGHT +++ /dev/null @@ -1,38 +0,0 @@ -$FreeBSD$ - -This copyright applies to the microcode image in the file pca200e.c. - -(Copyright Notice) - -Copyright (c) 1995-2000 FORE Systems, Inc., as an unpublished work. - -This notice does not imply unrestricted or public access to these -materials which are a trade secret of FORE Systems, Inc. or its -subsidiaries or affiliates (together referred to as "FORE"), and -which may not be reproduced, used, sold or transferred to any third -party without FORE's prior written consent. All rights reserved. - -U.S. Government Restricted Rights. - -If you are licensing the Software on behalf of the U.S. Government -("Government"), the following provisions apply to you. If the -software is supplied to the Department of Defense ("DoD"), it is -classified as "Commercial Computer Software" under paragraph -252.227-7014 of the DoD Supplement to the Federal Acquisition -Regulations ("DFARS") (or any successor regulations) and the -Government is acquiring only the license rights granted herein (the -license rights customarily provided to non-Government users). If -the Software is supplied to any unit or agency of the Government -other than the DoD, it is classified as "Restricted Computer -Software" and the Government's rights in the Software are defined -in paragraph 52.227-19 of the Federal Acquisition Regulations -("FAR") (or any successor regulations) or, in the cases of NASA, -in paragraph 18.52.227-86 of the NASA Supplement to the FAR (or -any successor regulations). - -FORE Systems is a registered trademark, and ForeRunner, ForeRunnerLE, -and ForeThought are trademarks of FORE Systems, Inc. All other -brands or product names are trademarks or registered trademarks of -their respective holders. - -(End Copyright Notice) diff --git a/sbin/atm/fore_dnld/Makefile b/sbin/atm/fore_dnld/Makefile deleted file mode 100644 index abcec31..0000000 --- a/sbin/atm/fore_dnld/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# =================================== -# HARP | Host ATM Research Platform -# =================================== -# -# This Host ATM Research Platform ("HARP") file (the "Software") is -# made available by Network Computing Services, Inc. ("NetworkCS") -# "AS IS". NetworkCS does not provide maintenance, improvements or -# support of any kind. -# -# NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, -# INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE -# SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. -# In no event shall NetworkCS be responsible for any damages, including -# but not limited to consequential damages, arising from or relating to -# any use of the Software or related support. -# -# Copyright 1994-1998 Network Computing Services, Inc. -# -# Copies of this Software may be made, however, the above copyright -# notice must be reproduced on all copies. -# -# @(#) $Id: Makefile,v 1.5 1998/07/10 16:01:58 jpt Exp $ -# $FreeBSD$ - -PROG= fore_dnld -MAN= fore_dnld.8 -SRCS= fore_dnld.c pca200e.c - -WARNS?= 6 -CFLAGS+= -I${.CURDIR}/../../../sys - -DPADD= ${LIBATM} -LDADD= -latm - -.include diff --git a/sbin/atm/fore_dnld/fore_dnld.8 b/sbin/atm/fore_dnld/fore_dnld.8 deleted file mode 100644 index c7afb78..0000000 --- a/sbin/atm/fore_dnld/fore_dnld.8 +++ /dev/null @@ -1,114 +0,0 @@ -.\" -.\" =================================== -.\" HARP | Host ATM Research Platform -.\" =================================== -.\" -.\" -.\" This Host ATM Research Platform ("HARP") file (the "Software") is -.\" made available by Network Computing Services, Inc. ("NetworkCS") -.\" "AS IS". NetworkCS does not provide maintenance, improvements or -.\" support of any kind. -.\" -.\" NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, -.\" INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY -.\" AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE -.\" SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. -.\" In no event shall NetworkCS be responsible for any damages, including -.\" but not limited to consequential damages, arising from or relating to -.\" any use of the Software or related support. -.\" -.\" Copyright 1994-1998 Network Computing Services, Inc. -.\" -.\" Copies of this Software may be made, however, the above copyright -.\" notice must be reproduced on all copies. -.\" -.\" $FreeBSD$ -.\" -.Dd December 3, 1996 -.Dt FORE_DNLD 8 -.Os -.Sh NAME -.Nm fore_dnld -.Nd "download FORE Systems' microcode into host ATM adapter" -.Sh SYNOPSIS -.Nm -.Op Fl 3 -.Op Fl i Ar intf -.Op Fl d Ar path -.Op Fl f Ar objfile -.Op Fl r -.Sh DESCRIPTION -The -.Nm -utility downloads FORE Systems' microcode into the host ATM adapter(s). -.Sh OPTIONS -.Bl -tag -width indent -.It Fl i Ar intf -Specify which ATM interface to download microcode to. -Default is to load microcode into all FORE Systems host adapters. -.It Fl d Ar path -Specify the path to prepend to the -.Ar objfile -name. -Default is to use current directory. -.It Fl f Ar objfile -Specify the microcode binary file. -Defaults are: -.Pa sba200.obj -for SBA-200 adapters, -.Pa sba200e.obj -for SBA-200E adapters, and -.Pa pca200e.bin -for PCA-200E adapters. -.El -.Sh NOTES -For the PCA200E adapter, if no file is specified on the command -line a built-in copy of version 4.1.12 microcode is used. -When the -option -.Fl 3 -is specified version 3.0.1 microcode is used instead. -.Pp -Microcode as distributed by FORE Systems is not ready for downloading -directly into SBA host ATM adapters. -Instead, the supplied microcode needs -to be processed with the -.Xr objcopy 1 -command to create an image suitable -for downloading. -Arguments to -.Xr objcopy 1 -are -.Dq Li "-S -l -Fcoff" . -.Pp -Microcode as -distributed by FORE Systems for the PCA host ATM adapter does not need -to be processed. -.Sh FILES -.Bl -tag -width indent -.It Pa ~fore/etc/objcopy -command to process FORE Systems supplied microcode. -.It Pa ~fore/etc/sba200*.ucode* -microcode as supplied by FORE Systems for SBA -adapters. -.It Pa ~fore/i386/pca200e.bin -microcode as supplied by FORE Systems for PCA -adapters. -.It Pa ~harp/doc/Install -HARP installation instructions. -.El -.Sh COPYRIGHT -Copyright (c) 1994-1998, Network Computing Services, Inc. -.Sh AUTHORS -.An John Cavanaugh , -Minnesota Supercomputer Center, Inc. -.An Mike Spengler , -Minnesota Supercomputer Center, Inc. -.An Joe Thomas , -Minnesota Supercomputer Center, Inc. -.Sh ACKNOWLEDGMENTS -This software was developed under the sponsorship of the -Defense Advanced Research Projects Agency (DARPA) under -contract numbers F19628-92-C-0072 and F19628-95-C-0215. -.Sh BUGS -None known. diff --git a/sbin/atm/fore_dnld/fore_dnld.c b/sbin/atm/fore_dnld/fore_dnld.c deleted file mode 100644 index dc52eff..0000000 --- a/sbin/atm/fore_dnld/fore_dnld.c +++ /dev/null @@ -1,1346 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * User utilities - * -------------- - * - * Download (pre)processed microcode into Fore Series-200 host adapter - * Interact with i960 uart on Fore Series-200 host adapter - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#if (defined(BSD) && (BSD >= 199103)) -#include -#else -#include -#endif /* !BSD */ -#include - -#ifndef lint -__RCSID("@(#) $FreeBSD$"); -#endif - -extern u_char pca200e_microcode_3[]; -extern int pca200e_microcode_size_3; -extern u_char pca200e_microcode_4[]; -extern int pca200e_microcode_size_4; - -#ifdef sun -#define DEV_NAME "/dev/sbus%d" -#endif /* sun */ -#if (defined(BSD) && (BSD >= 199103)) -#define DEV_NAME _PATH_KMEM -#endif /* BSD */ - -#define MAX_CHECK 60 - -static int comm_mode = 0; -static const char *progname; - -static int tty; -static cc_t vmin, vtime; -#if (defined(BSD) && (BSD >= 199103)) -static struct termios sgtty; -#define TCSETA TIOCSETA -#define TCGETA TIOCGETA -#else -static struct termio sgtty; -#endif /* !BSD */ - -static int endian = 0; -static int verbose = 0; -static int reset = 0; - -static char line[132]; -static u_int lineptr; - -static Mon960 *Uart; - -static void -delay(int cnt) -{ - usleep(cnt); -} - -static uint32_t -CP_READ(uint32_t val) -{ - if ( endian ) - return ( ntohl ( val ) ); - else - return ( val ); -} - -static uint32_t -CP_WRITE(uint32_t val) -{ - if ( endian ) - return ( htonl ( val ) ); - else - return ( val ); -} - -/* - * Print an error message and exit. - * - * Arguments: - * none - * - * Returns: - * none - */ -static void -error(const char *msg) -{ - printf ( "%s\n", msg ); - exit (1); -} - -/* - * Get a byte for the uart and if printing, display it. - * - * Returns: - * c Character from uart - */ -static char -getbyte(void) -{ - char c; - - while ( ! ( CP_READ(Uart->mon_xmithost) & UART_VALID ) ) - delay(10); - - c = CP_READ(Uart->mon_xmithost) & UART_DATAMASK; - Uart->mon_xmithost = CP_WRITE(UART_READY); - - /* - * We need to introduce a delay in here or things tend to hang... - */ - delay(10000); - - if ( lineptr >= sizeof(line) ) - lineptr = 0; - - /* - * Save character into line - */ - line[lineptr++] = c; - - if (verbose) { - if (isprint(c) || (c == '\n') || (c == '\r')) - putc(c, stdout); - } - return (c); -} - -/* - * Loop getting characters from uart into static string until eol. If printing, - * display the line retrieved. - * - * Arguments: - * prn Are we displaying characters - * - * Returns: - * none Line in global string 'line[]' - */ -static void -getline(int prn) -{ - char c = '\0'; - u_int i = 0; - - while ( c != '>' && c != '\n' && c != '\r' ) - { - c = getbyte(); - if ( ++i >= sizeof(line) ) - { - if ( prn ) - printf ( "%s", line ); - i = 0; - } - } - - /* - * Terminate line - */ - line[lineptr] = 0; - lineptr = 0; - -} - -/* - * Send a byte to the i960 - * - * Arguments: - * c Character to send - * - * Returns: - * none - */ -static void -xmit_byte(u_char c, int dn) -{ - int val; - - while ( CP_READ(Uart->mon_xmitmon) != UART_READY ) - { - if ( CP_READ(Uart->mon_xmithost) & UART_VALID ) - getbyte(); - if ( !dn ) delay ( 10000 ); - } - val = (int)c | UART_VALID; - Uart->mon_xmitmon = CP_WRITE( val ); - if ( !dn ) delay ( 10000 ); - if ( CP_READ(Uart->mon_xmithost) & UART_VALID ) - getbyte(); - -} - -/* - * Transmit a line to the i960. Eol must be included as part of text to transmit. - * - * Arguments: - * msg Character string to transmit - * len len of string. This allows us to include NULL's - * in the string/block to be transmitted. - * - * Returns: - * none - */ -static void -xmit_to_i960(const char *msg, int len, int dn) -{ - int i; - - for (i = 0; i < len; i++) - xmit_byte(msg[i], dn); -} - -/* - * Send autobaud sequence to i960 monitor - * - * Arguments: - * none - * - * Returns: - * none - */ -static void -autobaud(void) -{ - if ( strncmp ( line, "Mon960", 6 ) == 0 ) - xmit_to_i960 ( "\r\n\r\n\r\n\r\n", 8, 0 ); -} - -/* - * Reset tty to initial state - * - * Arguments: - * ret error code for exit() - * - * Returns: - * none - * - */ -static void -finish(int ret) -{ - sgtty.c_lflag |= ( ICANON | ECHO ); - sgtty.c_cc[VMIN] = vmin; - sgtty.c_cc[VTIME] = vtime; - ioctl ( tty, TCSETA, &sgtty ); - exit ( ret ); -} - -/* - * Utility to strip off any leading path information from a filename - * - * Arguments: - * path pathname to strip - * - * Returns: - * fname striped filename - * - */ -static const char * -basename(const char *path) -{ - const char *fname; - - if ( ( fname = strrchr ( path, '/' ) ) != NULL ) - fname++; - else - fname = path; - - return ( fname ); -} - -/* - * ASCII constants - */ -#define SOH 001 -#define STX 002 -#define ETX 003 -#define EOT 004 -#define ENQ 005 -#define ACK 006 -#define LF 012 -#define CR 015 -#define NAK 025 -#define SYN 026 -#define CAN 030 -#define ESC 033 - -#define NAKMAX 2 -#define ERRORMAX 10 -#define RETRYMAX 5 - -#define CRCCHR 'C' -#define CTRLZ 032 - -#define BUFSIZE 128 - -#define W 16 -#define B 8 - -/* - * crctab - CRC-16 constant array... - * from Usenet contribution by Mark G. Mendel, Network Systems Corp. - * (ihnp4!umn-cs!hyper!mark) - */ -static unsigned short crctab[1< NAKMAX ) - error ( "Remote system not responding" ); - - if ( c == CRCCHR ) - crcmode = 1; - - } while ( c != NAK && c != CRCCHR ); - - sectnum = 1; - attempts = errors = sendfin = extrachr = 0; - - /* - * Loop over each sector to be sent - */ - do { - if ( extrachr >= 128 ) - { - extrachr = 0; - numsect++; - } - - if ( sectnum > 0 ) - { - /* - * Read a sectors worth of data from the file into - * an internal buffer. - */ - for ( bufcntr = 0; bufcntr < bufsize; ) - { - int n; - /* - * Check for EOF - */ - if ( ( n = read ( fd, &c, 1 ) ) == 0 ) - { - sendfin = 1; - if ( !bufcntr ) - break; - buf[bufcntr++] = CTRLZ; - continue; - } - buf[bufcntr++] = c; - } - if ( !bufcntr ) - break; - } - - /* - * Fill in xmodem protocol values. Block size and sector number - */ - bbufcntr = 0; - blockbuf[bbufcntr++] = (bufsize == 1024) ? STX : SOH; - blockbuf[bbufcntr++] = sectnum; - blockbuf[bbufcntr++] = ~sectnum; - - checksum = 0; - - /* - * Loop over the internal buffer computing the checksum of the - * sector - */ - for ( bufcntr = 0; bufcntr < bufsize; bufcntr++ ) - { - blockbuf[bbufcntr++] = buf[bufcntr]; - - if ( crcmode ) - checksum = (checksum<>(W-B)) ^ buf[bufcntr]]; - else - checksum = ((checksum + buf[bufcntr]) & 0xff); - - } - - /* - * Place the checksum at the end of the transmit buffer - */ - if ( crcmode ) - { - checksum &= 0xffff; - blockbuf[bbufcntr++] = ((checksum >> 8) & 0xff); - blockbuf[bbufcntr++] = (checksum & 0xff); - } else - blockbuf[bbufcntr++] = checksum; - - attempts = 0; - - /* - * Make several attempts to send the data to the i960 - */ - do - { - /* - * Transmit the sector + protocol to the i960 - */ - xmit_to_i960 ( blockbuf, bbufcntr, 1 ); - - /* - * Inform user where we're at - */ - if ( verbose ) - printf ( "Sector %3d %3dk\r", - sectnum, (sectnum * bufsize) / 1024 ); - - attempts++; - /* - * Get response from i960 - */ - sendresp = getbyte(); - - /* - * If i960 didn't like the sector - */ - if ( sendresp != ACK ) - { - errors++; - - /* - * Are we supposed to cancel the transfer? - */ - if ( ( sendresp & 0x7f ) == CAN ) - if (getbyte() == CAN) - error ( "Send canceled at user's request" ); - } - - } while ( ( sendresp != ACK ) && ( attempts < RETRYMAX ) && ( errors < ERRORMAX ) ); - - /* - * Next sector - */ - sectnum++; - - } while ( !sendfin && ( attempts < RETRYMAX ) && ( errors < ERRORMAX ) ); - - /* - * Did we expire all our allows attempts? - */ - if ( attempts >= RETRYMAX ) - { - xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 ); - error ( "Remote system not responding" ); - } - - /* - * Check for too many transmission errors - */ - if ( errors >= ERRORMAX ) - { - xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 ); - error ( "Too many errors in transmission" ); - } - - attempts = 0; - - /* - * Indicate the transfer is complete - */ - xmit_byte ( EOT, 1 ); - - /* - * Wait until i960 acknowledges us - */ - while ((c = getbyte()) != ACK && (++attempts < RETRYMAX)) - xmit_byte ( EOT, 1 ); - - if ( attempts >= RETRYMAX ) - error ( "Remote system not responding on completion" ); - - /* - * After download, we'll see a few more command - * prompts as the CP does its stuff. Ignore them. - */ - while ( strncmp ( line, "=>", 2 ) != 0 ) - getline ( verbose ); - - while ( strncmp ( line, "=>", 2 ) != 0 ) - getline ( verbose ); - - while ( strncmp ( line, "=>", 2 ) != 0 ) - getline ( verbose ); - - /* - * Tell the i960 to start executing the downloaded code - */ - xmit_to_i960 ( "go\r\n", 4, 0 ); - - /* - * Get the messages the CP will spit out - * after the GO command. - */ - getline ( verbose ); - getline ( verbose ); - - close ( fd ); - - return ( 0 ); -} - - -static int -loadmicrocode(u_char *ucode, int size, u_char *ram) -{ - struct { - uint32_t Id; - uint32_t fver; - uint32_t start; - uint32_t entry; - } binhdr; -#ifdef sun - union { - uint32_t w; - char c[4]; - } w1, w2; - int n; -#endif - u_char *bufp; - uint32_t *lp; - - - /* - * Check that we understand this header - */ - memcpy(&binhdr, ucode, sizeof(binhdr)); - if ( strncmp ( (caddr_t)&binhdr.Id, "fore", 4 ) != 0 ) { - fprintf ( stderr, "Unrecognized format in micorcode file." ); - return ( -1 ); - } - -#ifdef sun - /* - * We always swap the SunOS microcode file... - */ - endian = 1; - - /* - * We need to swap the header start/entry words... - */ - w1.w = binhdr.start; - for ( n = 0; n < sizeof(uint32_t); n++ ) - w2.c[3-n] = w1.c[n]; - binhdr.start = w2.w; - w1.w = binhdr.entry; - for ( n = 0; n < sizeof(uint32_t); n++ ) - w2.c[3-n] = w1.c[n]; - binhdr.entry = w2.w; -#endif /* sun */ - - /* - * Set pointer to RAM load location - */ - bufp = (ram + binhdr.start); - - /* - * Load file - */ - if ( endian ) { - u_int i; - - lp = (uint32_t *)(void *)ucode; - /* Swap buffer */ - for ( i = 0; i < size / sizeof(uint32_t); i++ ) -#ifndef sun - lp[i] = CP_WRITE(lp[i]); -#else - { - int j; - - w1.w = lp[i]; - for ( j = 0; j < 4; j++ ) - w2.c[3-j] = w1.c[j]; - lp[i] = w2.w; - } -#endif - } - bcopy ( (caddr_t)ucode, bufp, size ); - - /* - * With .bin extension, we need to specify start address on 'go' - * command. - */ - { - char cmd[80]; - - sprintf ( cmd, "go %x\r\n", binhdr.entry ); - - xmit_to_i960 ( cmd, strlen ( cmd ), 0 ); - - while ( strncmp ( line, cmd, strlen(cmd) - 3 ) != 0 ) - getline ( verbose ); - - if ( verbose ) - printf("\n"); - } - return ( 0 ); -} - -static int -sendbinfile(const char *fname, u_char *ram) -{ - struct { - uint32_t Id; - uint32_t fver; - uint32_t start; - uint32_t entry; - } binhdr; -#ifdef sun - union { - uint32_t w; - char c[4]; - } w1, w2; -#endif - int fd; - int n; - int cnt = 0; - u_char *bufp; - uint32_t buffer[1024]; - - /* - * Try opening file - */ - if ( ( fd = open ( fname, O_RDONLY ) ) < 0 ) - return ( -1 ); - - /* - * Read the .bin header from the file - */ - if ( ( read ( fd, &binhdr, sizeof(binhdr) ) ) != sizeof(binhdr) ) - { - close ( fd ); - return ( -1 ); - } - - /* - * Check that we understand this header - */ - if ( strncmp ( (caddr_t)&binhdr.Id, "fore", 4 ) != 0 ) { - fprintf ( stderr, "Unrecognized format in micorcode file." ); - close ( fd ); - return ( -1 ); - } - -#ifdef sun - /* - * We always swap the SunOS microcode file... - */ - endian = 1; - - /* - * We need to swap the header start/entry words... - */ - w1.w = binhdr.start; - for ( n = 0; n < sizeof(uint32_t); n++ ) - w2.c[3-n] = w1.c[n]; - binhdr.start = w2.w; - w1.w = binhdr.entry; - for ( n = 0; n < sizeof(uint32_t); n++ ) - w2.c[3-n] = w1.c[n]; - binhdr.entry = w2.w; -#endif /* sun */ - - /* - * Rewind the file - */ - lseek ( fd, 0, 0 ); - - /* - * Set pointer to RAM load location - */ - bufp = (ram + binhdr.start); - - /* - * Load file - */ - if ( endian ) { - /* - * Need to swap longs - copy file into temp buffer - */ - while ( ( n = read ( fd, (char *)buffer, sizeof(buffer))) > 0 ) - { - u_int i; - - /* Swap buffer */ - for (i = 0; i < sizeof(buffer) / sizeof(uint32_t); i++) -#ifndef sun - buffer[i] = CP_WRITE(buffer[i]); -#else - { - int j; - - w1.w = buffer[i]; - for ( j = 0; j < 4; j++ ) - w2.c[3-j] = w1.c[j]; - buffer[i] = w2.w; - } -#endif - - /* - * Copy swapped buffer into CP RAM - */ - cnt++; - bcopy ( (caddr_t)buffer, bufp, n ); - if ( verbose ) - printf ( "%d\r", cnt ); - bufp += n; - } - } else { - while ( ( n = read ( fd, bufp, 128 ) ) > 0 ) - { - cnt++; - if ( verbose ) - printf ( "%d\r", cnt ); - bufp += n; - } - } - - /* - * With .bin extension, we need to specify start address on 'go' - * command. - */ - { - char cmd[80]; - - sprintf ( cmd, "go %x\r\n", binhdr.entry ); - - xmit_to_i960 ( cmd, strlen ( cmd ), 0 ); - - while ( strncmp ( line, cmd, strlen(cmd) - 3 ) != 0 ) - getline ( verbose ); - - if ( verbose ) - printf("\n"); - } - - close ( fd ); - return ( 0 ); -} - - -/* - * Program to download previously processed microcode to series-200 host adapter - */ -int -main(int argc, char *argv[]) -{ - int fd; /* mmap for Uart */ - u_char *ram; /* pointer to RAM */ - Mon960 *Mon; /* Uart */ - Aali *aap; - int c, i, err; - int binary = 0; /* Send binary file */ - caddr_t buf; /* Ioctl buffer */ - char bus_dev[80]; /* Bus device to mmap on */ - struct atminfreq req; - struct air_cfg_rsp *air; /* Config info response structure */ - int buf_len; /* Size of ioctl buffer */ - const char *dev = "\0"; /* Device to download */ - char *dirname = NULL; /* Directory path to objd files */ - char *objfile = NULL; /* Command line object filename */ - u_char *ucode = NULL; /* Pointer to microcode */ - int ucode_size = 0; /* Length of microcode */ - char *sndfile = NULL; /* Object filename to download */ - char filename[64]; /* Constructed object filename */ - char base[64]; /* sba200/sba200e/pca200e basename */ - int ext = 0; /* 0 == bin 1 == objd */ - struct stat sbuf; /* Used to find if .bin or .objd */ - int pca_vers = 4; - - progname = basename(argv[0]); - comm_mode = strcmp ( progname, "fore_comm" ) == 0; - - while ( ( c = getopt ( argc, argv, "3i:d:f:berv" ) ) != -1 ) - switch ( c ) { - case '3': - pca_vers = 3; - break; - case 'b': - binary++; - break; - case 'd': - dirname = (char *)strdup ( optarg ); - break; - case 'e': - endian++; - break; - case 'i': - dev = (char *)strdup(optarg); - break; - case 'f': - objfile = (char *)strdup ( optarg ); - break; - case 'v': - verbose++; - break; - case 'r': - reset++; - break; - case '?': - printf ( "usage: %s [-v] [-i intf] [-d dirname] [-f objfile]\n", argv[0] ); - exit ( 2 ); - } - - /* - * Unbuffer stdout - */ - setbuf ( stdout, NULL ); - - if ( ( fd = socket ( AF_ATM, SOCK_DGRAM, 0 ) ) < 0 ) - { - perror ( "Cannot create ATM socket" ); - exit ( 1 ); - } - /* - * Over allocate memory for returned data. This allows - * space for IOCTL reply info as well as config info. - */ - buf_len = 4 * sizeof(struct air_cfg_rsp); - if ( ( buf = (caddr_t)malloc(buf_len) ) == NULL ) - { - perror ( "Cannot allocate memory for reply" ); - exit ( 1 ); - } - /* - * Fill in request paramaters - */ - req.air_opcode = AIOCS_INF_CFG; - req.air_buf_addr = buf; - req.air_buf_len = buf_len; - - /* - * Copy interface name into ioctl request - */ - strcpy(req.air_cfg_intf, dev); - - /* - * Issue ioctl - */ - if ( ( ioctl ( fd, AIOCINFO, (caddr_t)&req ) ) ) { - perror ( "ioctl (AIOCSINFO)" ); - exit ( 1 ); - } - /* - * Reset buffer pointer - */ - req.air_buf_addr = buf; - - /* - * Close socket - */ - close ( fd ); - - /* - * Loop through all attached adapters - */ - for (; req.air_buf_len >= sizeof(struct air_cfg_rsp); - buf += sizeof(struct air_cfg_rsp), - req.air_buf_len -= sizeof(struct air_cfg_rsp)) { - - /* - * Point to vendor info - */ - air = (struct air_cfg_rsp *)(void *)buf; - - if (air->acp_vendapi == VENDAPI_FORE_1 && air->acp_ram != 0) - { - /* - * Create /dev name - */ -#ifdef sun - sprintf ( bus_dev, DEV_NAME, air->acp_busslot ); -#else - sprintf ( bus_dev, DEV_NAME ); -#endif - - /* - * Setup signal handlers - */ - signal ( SIGINT, SIG_IGN ); - signal ( SIGQUIT, SIG_IGN ); - - /* - * If comm_mode, setup terminal for single char I/O - */ - if ( comm_mode ) { - tty = open ( _PATH_TTY, O_RDWR ); - ioctl ( tty, TCGETA, &sgtty ); - sgtty.c_lflag &= ~( ICANON | ECHO ); - vmin = sgtty.c_cc[VMIN]; - vtime = sgtty.c_cc[VTIME]; - sgtty.c_cc[VMIN] = 0; - sgtty.c_cc[VTIME] = 0; - ioctl ( tty, TCSETA, &sgtty ); - } - - /* - * Open bus for memory access - */ - if ( ( fd = open ( bus_dev, O_RDWR ) ) < 0 ) - { - perror ( "open bus_dev" ); - fprintf(stderr, "%s download failed (%s)\n", - air->acp_intf, bus_dev); - continue; - } - - /* - * Map in the RAM memory to get access to the Uart - */ -#ifdef __FreeBSD__ /*XXX*/ - ram = (u_char *) mmap(0, PCA200E_MMAP_SIZE, -#else - ram = (u_char *) mmap(0, air->acp_ramsize, -#endif - PROT_READ | PROT_WRITE, MAP_SHARED | MAP_HASSEMAPHORE, - fd, air->acp_ram); - if (ram == (u_char *)-1) { - perror ( "mmap ram" ); - fprintf(stderr, "%s download failed\n", - air->acp_intf); - (void) close(fd); - continue; - } - Mon = (Mon960 *)(volatile void *)(ram + MON960_BASE); - Uart = (Mon960 *)(volatile void *)&(Mon->mon_xmitmon); - - /* - * Determine endianess - */ - switch ( Mon->mon_bstat ) { - case BOOT_COLDSTART: - case BOOT_MONREADY: - case BOOT_FAILTEST: - case BOOT_RUNNING: - break; - - default: - switch (ntohl(Mon->mon_bstat)) { - case BOOT_COLDSTART: - case BOOT_MONREADY: - case BOOT_FAILTEST: - case BOOT_RUNNING: - endian++; - break; - - default: - fprintf(stderr, "%s unknown status\n", - air->acp_intf); - (void) close(fd); - continue; - } - break; - } - -#ifdef __FreeBSD__ - if (reset) { - u_int *hcr = (u_int *)(void *)(ram + PCA200E_HCR_OFFSET); - PCA200E_HCR_INIT(*hcr, PCA200E_RESET_BD); - delay(10000); - PCA200E_HCR_CLR(*hcr, PCA200E_RESET_BD); - delay(10000); - } -#endif - - if ( comm_mode ) { - static struct timeval timeout = { 0, 0 }; - int esc_seen = 0; - - /* - * We want to talk with the i960 monitor - */ - - /* - * Loop forever accepting characters - */ - for ( ; ; ) { - fd_set fdr; - int ns; - - /* - * Check for data from the terminal - */ - FD_ZERO ( &fdr ); - FD_SET ( fileno(stdin), &fdr ); - - if ( ( ns = select ( FD_SETSIZE, &fdr, NULL, NULL, - &timeout ) ) < 0 ) { - perror ( "select" ); - finish( -1 ); - } - - if ( ns ) { - char c1; - int nr; - - nr = read ( fileno(stdin), &c1, 1 ); - c1 &= 0xff; - if ( !esc_seen ) { - if ( c1 == 27 ) - esc_seen++; - else - xmit_byte ( c1, 0 ); - } else { - if ( c1 == 27 ) - finish( -1 ); - else { - xmit_byte ( 27, 0 ); - esc_seen = 0; - } - xmit_byte ( c1, 0 ); - } - } - - /* - * Check for data from the i960 - */ - if ( CP_READ(Uart->mon_xmithost) & UART_VALID ) { - c = getbyte(); - putchar ( c ); - } - if ( strcmp ( line, "Mon960" ) == 0 ) - autobaud(); - - } - } else { - /* - * Make sure the driver is loaded and that the CP - * is ready for commands - */ - if ( CP_READ(Mon->mon_bstat) == BOOT_RUNNING ) - { - fprintf ( stderr, - "%s is up and running - no download allowed.\n", - air->acp_intf ); - (void) close(fd); - continue; - } - - if ( CP_READ(Mon->mon_bstat) != BOOT_MONREADY ) - { - fprintf ( stderr, - "%s is not ready for downloading.\n", - air->acp_intf ); - (void) close(fd); - continue; - } - - /* - * Indicate who we're downloading - */ - if ( verbose ) - printf ( "Downloading code for %s\n", - air->acp_intf ); - - /* - * Look for the i960 monitor message. - * We should see this after a board reset. - */ - while ( strncmp ( line, "Mon960", 6 ) != 0 && - strncmp ( line, "=>", 2 ) != 0 ) - getline( verbose ); /* Verbose */ - - /* - * Autobaud fakery - */ - if ( strncmp ( line, "Mon960", 6 ) == 0 ) { - xmit_to_i960 ( "\r\n\r\n\r\n\r\n", 8, 0 ); - delay ( 10000 ); - } - - /* - * Keep reading until we get a command prompt - */ - while ( strncmp ( line, "=>", 2 ) != 0 ) - getline( verbose ); /* Verbose */ - - /* - * Choose the correct microcode file based on the - * adapter type the card claims to be. - */ - switch ( air->acp_device ) - { - case DEV_FORE_SBA200: - sprintf ( base, "sba200" ); - break; - - case DEV_FORE_SBA200E: - sprintf ( base, "sba200e" ); - break; - - case DEV_FORE_PCA200E: - sprintf ( base, "pca200e" ); - break; - - default: - err = 1; - fprintf(stderr, "Unknown adapter type: %d\n", - air->acp_device ); - } - - sndfile = NULL; - - if ( objfile == NULL ) { - switch ( air->acp_device ) { - case DEV_FORE_SBA200: - case DEV_FORE_SBA200E: - sprintf ( filename, "%s.bin%d", base, - air->acp_bustype ); - if ( stat ( filename, &sbuf ) == -1 ) { - sprintf ( filename, "%s/%s.bin%d", - dirname, base, - air->acp_bustype ); - if ( stat ( filename, &sbuf ) == -1 ) { - ext = 1; - sprintf ( filename, "%s.objd%d", - base, air->acp_bustype ); - if ( stat(filename, &sbuf) == -1 ) { - sprintf ( filename, - "%s/%s.objd%d", dirname, - base, - air->acp_bustype ); - if ( stat ( filename, &sbuf ) != -1 ) - sndfile = filename; - } else - sndfile = filename; - } else - sndfile = filename; - } else - sndfile = filename; - break; - case DEV_FORE_PCA200E: - /* Use compiled in microcode */ - if (pca_vers == 3) { - ucode = pca200e_microcode_3; - ucode_size = pca200e_microcode_size_3; - } else { - ucode = pca200e_microcode_4; - ucode_size = pca200e_microcode_size_4; - } - break; - default: - break; - } - } else - sndfile = objfile; - - if ( ext && !binary ) - err = xmitfile ( sndfile ); - else if (sndfile != NULL) - err = sendbinfile ( sndfile, ram ); - else - err = loadmicrocode( ucode, ucode_size, ram ); - - if ( err ) { - fprintf(stderr, "%s download failed\n", - air->acp_intf); - (void) close(fd); - continue; - } - - /* - * Download completed - wait around a while for - * the driver to initialize the adapter - */ - aap = (Aali *)(void *)(ram + CP_READ(Mon->mon_appl)); - for (i = 0; i < MAX_CHECK; i++, sleep(1)) { - uint32_t hb1, hb2, hb3; - - hb3 = CP_READ(Mon->mon_bstat); - if (hb3 != BOOT_RUNNING) { - if (verbose) - printf("bstat %x\n", hb3); - continue; - } - - hb1 = CP_READ(aap->aali_heartbeat); - delay(1); - hb2 = CP_READ(aap->aali_heartbeat); - if (verbose) - printf("hb %x %x\n", hb1, hb2); - if (hb1 < hb2) - break; - } - } - - close ( fd ); - } - } - - /* - * Exit - */ - exit (0); -} diff --git a/sbin/atm/fore_dnld/pca200e.c b/sbin/atm/fore_dnld/pca200e.c deleted file mode 100644 index c208a4d..0000000 --- a/sbin/atm/fore_dnld/pca200e.c +++ /dev/null @@ -1,3796 +0,0 @@ -/* - * (Copyright Notice) - * - * Copyright (c) 1995-2000 FORE Systems, Inc., as an unpublished work. - * - * This notice does not imply unrestricted or public access to these - * materials which are a trade secret of FORE Systems, Inc. or its - * subsidiaries or affiliates (together referred to as "FORE"), and - * which may not be reproduced, used, sold or transferred to any third - * party without FORE's prior written consent. All rights reserved. - * - * U.S. Government Restricted Rights. - * If you are licensing the Software on behalf of the U.S. Government - * ("Government"), the following provisions apply to you. If the - * software is supplied to the Department of Defense ("DoD"), it is - * classified as "Commercial Computer Software" under paragraph - * 252.227-7014 of the DoD Supplement to the Federal Acquisition - * Regulations ("DFARS") (or any successor regulations) and the - * Government is acquiring only the license rights granted herein (the - * license rights customarily provided to non-Government users). If - * the Software is supplied to any unit or agency of the Government - * other than the DoD, it is classified as "Restricted Computer - * Software" and the Government's rights in the Software are defined - * in paragraph 52.227-19 of the Federal Acquisition Regulations - * ("FAR") (or any successor regulations) or, in the cases of NASA, - * in paragraph 18.52.227-86 of the NASA Supplement to the FAR (or - * any successor regulations). - * - * FORE Systems is a registered trademark, and ForeRunner, ForeRunnerLE, - * and ForeThought are trademarks of FORE Systems, Inc. All other - * brands or product names are trademarks or registered trademarks of - * their respective holders. - * - * (End Copyright Notice) - * - * This are binary copies of the PCA200E firmware versions 3.0.1 and - * 4.1.12 - * - * $FreeBSD$ - */ - -#include - -u_char pca200e_microcode_3[] = { -102,111,114,101,0,1,0,0,0,82,0,0,208,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,77,0,0,0,4,0,0,0,0,0,0,0,0,0,0,3, -0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,96,244,0,0,0,0,0,0,1,255,128,255, -0,0,0,0,1,255,255,255,113,0,0,0,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0, -0,0,0,0,0,1,231,167,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,223,111,223,0,0,0,0,1, -127,0,0,0,0,0,0,1,255,0,0,0,0,0,0,1,255,0,0,0,0,0,0,1,127,65,127,0,0,0, -0,1,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,251,0,251,0,0,0,0,1, -255,240,240,0,0,0,0,1,255,0,0,0,0,0,0,1,255,0,0,0,0,0,0,1,15,0,0,0,0,0, -0,1,255,0,0,0,0,0,0,1,255,0,0,0,0,0,0,1,15,0,0,0,0,0,0,1,127,1,127,0,0, -0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,173,0,129,0,0,0,0,1,175,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,255,175,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,255,0,0,0,0,0,0,1,255,255,0,0,0,0,0,1,255,0,0,0,0,0,0,1,255,0, -0,0,0,0,0,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,135,3,135,0,0,0,0,1,63,62,63,0,0,0,0,1,127,127,127, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,255,255,255,0,0,0,0,1,255,255, -255,144,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,255,255,255,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,191,63,63,4,0,0,0,1,255,224,224,0,0,0,0,1,255,255, -255,0,0,0,0,1,255,255,255,0,0,0,0,1,255,0,0,0,0,0,0,1,255,255,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,255,159,159,4,0,0,0,1,255,255,255,0,0,0,0,1,255,255,255, -106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,31,5,0,0,0,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,130,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,144,86,0,0,176, -86,0,0,208,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0, -0,0,0,0,160,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,250,0,0,0,0,0,0,64,156,0,0, -0,0,0,0,80,195,0,0,0,0,0,0,36,244,0,0,0,0,0,128,150,152,0,0,0,0,0,32,188, -190,0,0,0,0,0,40,107,238,0,0,0,0,0,249,2,149,0,0,0,0,64,183,67,186,0,0, -0,0,16,165,212,232,0,0,0,0,42,231,132,145,0,0,0,128,244,32,230,181,0,0, -0,160,49,169,95,227,0,0,0,0,4,0,0,0,7,0,0,0,10,0,0,0,14,0,0,0,17,0,0,0, -20,0,0,0,24,0,0,0,27,0,0,0,30,0,0,0,34,0,0,0,37,0,0,0,40,0,0,0,44,0,0,0, -47,0,0,0,50,0,0,0,255,255,255,255,255,255,255,255,0,0,0,4,191,201,27,142, -157,181,112,43,168,173,197,157,214,149,67,14,5,141,41,175,213,166,207,255, -73,31,120,194,251,247,218,135,143,122,231,215,162,20,155,197,22,171,179, -239,158,50,35,153,192,173,15,133,223,140,233,128,201,71,186,147,231,166, -211,168,197,185,2,164,170,23,230,127,43,161,22,182,147,191,155,133,145, -162,40,202,106,85,39,57,141,247,112,224,69,97,130,55,53,12,46,249,47,201, -60,227,255,150,82,138,101,23,191,214,243,166,145,153,141,222,249,157,251, -235,126,170,130,188,157,167,74,209,73,189,140,47,106,92,25,252,38,210,253, -131,124,36,32,223,80,233,0,0,0,0,54,0,0,0,107,0,0,0,160,0,0,0,213,0,0,0, -10,1,0,0,63,1,0,0,117,1,0,0,170,1,0,0,223,1,0,0,20,2,0,0,73,2,0,0,126,2, -0,0,179,2,0,0,233,2,0,0,30,3,0,0,83,3,0,0,136,3,0,0,189,3,0,0,242,3,0,0, -255,255,255,255,255,255,255,255,204,204,204,204,204,204,204,204,10,215, -163,112,61,10,215,163,59,223,79,141,151,110,18,131,43,101,25,226,88,23, -183,209,35,132,71,27,71,172,197,167,181,105,108,175,5,189,55,134,188,66, -122,229,213,148,191,214,252,206,97,132,17,119,204,171,151,165,180,54,65, -95,112,137,190,213,237,189,206,254,230,219,254,170,36,203,11,255,235,175, -203,136,80,111,9,204,188,140,19,14,180,75,66,19,46,225,15,216,92,9,53,220, -36,180,217,172,176,58,247,124,29,144,0,0,0,0,253,255,255,255,250,255,255, -255,247,255,255,255,243,255,255,255,240,255,255,255,237,255,255,255,233, -255,255,255,230,255,255,255,227,255,255,255,223,255,255,255,220,255,255, -255,217,255,255,255,213,255,255,255,210,255,255,255,207,255,255,255,255, -255,255,255,255,255,255,255,91,225,77,196,190,148,149,230,186,148,57,69, -173,30,177,207,89,193,126,177,83,124,18,187,165,233,57,165,39,234,127,168, -165,25,9,107,186,96,197,151,155,83,117,253,247,2,180,136,125,211,101,240, -188,53,67,246,160,228,188,100,124,70,208,221,200,130,83,124,110,186,202, -199,147,160,115,219,147,224,244,179,47,0,203,56,219,39,23,162,6,204,35, -84,119,131,255,145,96,188,164,61,169,222,128,131,189,78,49,74,236,60,229, -236,214,225,50,207,205,95,96,213,57,25,122,99,37,67,49,192,102,59,228,94, -171,142,28,173,119,197,106,131,98,206,236,155,37,73,11,186,217,220,113, -140,0,0,0,0,203,255,255,255,150,255,255,255,97,255,255,255,44,255,255,255, -247,254,255,255,194,254,255,255,140,254,255,255,87,254,255,255,34,254,255, -255,237,253,255,255,184,253,255,255,131,253,255,255,78,253,255,255,24,253, -255,255,227,252,255,255,174,252,255,255,121,252,255,255,68,252,255,255, -15,252,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,10,0,0, -0,0,0,0,0,100,0,0,0,0,0,0,0,232,3,0,0,0,0,0,0,16,39,0,0,0,0,0,0,160,134, -1,0,0,0,0,0,64,66,15,0,0,0,0,0,128,150,152,0,0,0,0,0,0,225,245,5,0,0,0, -0,0,202,154,59,0,0,0,0,0,228,11,84,2,0,0,0,0,232,118,72,23,0,0,0,0,16,165, -212,232,0,0,0,0,160,114,78,24,9,0,0,0,64,122,16,243,90,0,0,0,128,198,164, -126,141,3,0,0,0,193,111,242,134,35,0,0,0,138,93,120,69,99,1,0,0,100,167, -179,182,224,13,0,0,232,137,4,35,199,138,1,0,0,0,10,0,0,0,100,0,0,0,232, -3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5,0,202, -154,59,0,0,0,0,0,0,0,0,0,48,128,140,112,218,3,0,12,192,135,50,16,22,8,92, -4,0,0,9,128,62,0,102,0,0,0,140,0,30,240,92,0,48,128,140,32,242,0,0,0,48, -136,140,112,202,3,0,0,16,244,146,4,8,132,89,248,95,132,52,0,48,128,140, -0,16,0,59,204,129,0,9,252,148,0,9,20,128,0,9,112,98,0,9,140,119,0,9,0,48, -48,144,32,242,0,0,40,160,1,50,16,22,32,93,0,20,128,140,0,0,0,0,0,48,136, -140,64,93,0,0,17,1,132,89,16,128,49,89,0,144,1,134,4,22,128,93,72,0,0,9, -228,97,0,8,84,65,88,73,45,49,48,48,0,0,0,0,0,0,0,0,84,65,88,73,45,49,52, -48,0,0,0,0,0,0,0,0,83,79,78,69,84,95,79,67,51,0,0,0,0,0,0,0,85,78,75,78, -79,87,78,0,0,0,0,0,0,0,0,0,32,96,8,140,188,46,0,9,104,43,0,9,0,48,160,144, -68,20,0,80,63,0,40,140,64,224,47,130,8,222,40,89,148,64,33,88,65,224,247, -130,4,22,128,92,4,42,0,9,136,25,40,88,78,64,33,58,18,64,33,49,30,32,1,58, -16,1,0,8,0,0,0,0,137,25,40,88,102,64,33,58,0,1,0,8,0,0,0,0,0,48,160,144, -84,82,0,0,13,30,40,92,64,224,135,140,0,48,40,130,80,243,0,0,0,48,136,140, -96,93,0,0,5,30,40,92,40,0,0,8,0,48,160,144,84,82,0,0,9,30,40,92,64,224, -135,140,0,48,40,130,80,243,0,0,0,48,136,140,112,93,0,0,4,30,40,92,176,32, -45,146,16,106,0,11,180,0,0,8,0,48,160,136,2,4,0,136,8,30,40,92,0,48,40, -130,80,243,0,0,148,208,169,88,26,96,13,55,0,48,160,144,84,82,0,0,6,30,40, -92,92,0,0,8,0,0,0,0,149,16,161,88,46,32,21,48,26,96,5,48,0,48,160,144,84, -82,0,0,22,30,40,92,60,0,0,8,0,0,0,0,0,48,160,144,84,82,0,0,31,216,41,89, -40,0,0,8,26,96,5,48,0,48,160,144,84,82,0,0,31,216,45,89,20,0,0,8,0,0,0, -0,0,48,160,144,84,82,0,0,70,0,40,140,176,32,45,146,64,224,135,140,0,48, -136,140,128,93,0,0,116,105,0,11,24,0,0,8,0,0,0,0,64,224,135,140,0,48,136, -140,144,93,0,0,92,105,0,11,32,44,0,9,44,50,0,9,168,39,0,9,108,41,0,11,137, -25,40,88,54,64,33,61,0,30,128,92,80,224,143,140,136,89,0,11,38,32,4,58, -80,224,167,144,0,48,168,144,84,82,0,0,127,0,40,140,148,64,161,88,180,96, -165,146,24,0,0,8,0,0,0,0,0,48,160,144,84,82,0,0,1,25,40,89,180,32,45,146, -0,48,40,140,80,242,0,0,0,48,40,146,48,242,0,0,152,42,0,9,0,48,48,140,255, -255,0,0,31,88,62,89,0,48,64,140,96,0,0,32,0,48,72,140,112,243,0,0,0,48, -80,140,128,243,0,0,0,48,88,140,144,243,0,0,0,48,96,140,160,243,0,0,0,48, -104,140,176,243,0,0,0,48,112,140,192,243,0,0,0,48,120,140,208,243,0,0,0, -48,24,140,224,243,0,0,0,48,168,144,64,244,0,0,0,80,165,144,20,80,160,89, -0,80,165,146,0,48,160,144,48,242,0,0,0,16,133,144,0,13,0,9,0,48,160,144, -48,242,0,0,0,48,168,144,32,20,0,80,4,32,165,144,149,48,0,90,0,48,160,146, -48,242,0,0,42,0,0,21,0,48,160,144,36,20,0,80,30,32,5,61,0,48,160,144,40, -20,0,80,18,32,5,61,0,48,160,144,44,20,0,80,8,32,5,58,148,56,0,9,0,48,128, -144,16,82,0,0,18,32,4,58,36,13,0,9,0,48,240,146,16,82,0,0,0,48,136,144, -128,180,3,0,0,80,164,144,102,33,5,58,0,80,132,144,0,80,140,144,0,48,144, -144,52,242,0,0,31,29,40,88,144,208,131,88,145,64,137,88,220,28,0,9,0,48, -168,144,52,242,0,0,4,96,165,144,24,222,43,89,6,96,141,128,148,128,145,88, -148,64,161,88,24,12,165,89,74,32,37,58,14,32,37,60,18,32,5,58,140,0,0,8, -98,32,45,58,132,0,0,8,0,48,176,144,52,242,0,0,0,30,152,92,0,144,41,140, -8,160,165,144,0,144,133,144,22,16,180,89,148,64,169,88,16,12,165,89,28, -78,0,9,88,0,0,8,0,0,0,0,0,48,176,144,52,242,0,0,0,30,152,92,8,160,165,144, -0,144,133,144,22,16,180,89,148,128,169,88,16,12,165,89,192,79,0,9,44,0, -0,8,0,48,176,144,52,242,0,0,0,30,152,92,0,144,41,140,8,160,165,144,0,144, -133,144,22,16,180,89,148,64,169,88,16,12,165,89,196,72,0,9,0,48,160,144, -128,180,3,0,4,32,181,144,0,16,245,146,0,48,168,144,132,180,3,0,20,16,162, -89,0,48,160,146,128,180,3,0,22,64,165,54,0,48,160,144,136,180,3,0,0,48, -160,146,128,180,3,0,0,48,160,144,52,242,0,0,0,48,176,146,56,0,0,32,2,30, -40,92,0,48,40,146,96,0,0,48,4,32,165,144,28,12,165,89,46,32,5,58,0,48,168, -144,40,82,0,0,255,0,40,140,21,80,168,89,149,64,161,88,136,9,165,88,0,48, -168,146,40,82,0,0,0,48,160,146,4,0,0,32,0,48,160,144,56,242,0,0,0,16,165, -144,127,0,40,140,148,64,161,88,246,61,5,58,2,9,165,89,102,34,61,52,20,57, -160,144,232,97,0,0,0,16,5,132,0,0,0,0,8,98,0,0,108,100,0,0,32,98,0,0,108, -100,0,0,56,98,0,0,144,99,0,0,176,99,0,0,216,99,0,0,0,48,128,144,56,242, -0,0,80,47,0,9,16,22,232,92,88,2,0,8,0,0,0,0,0,48,128,144,56,242,0,0,168, -49,0,9,16,22,232,92,64,2,0,8,0,0,0,0,0,48,160,144,68,20,0,80,2,30,232,92, -30,32,157,48,147,9,165,88,0,48,240,146,52,244,0,0,0,48,160,146,68,20,0, -80,16,0,0,8,1,30,40,92,0,48,40,146,52,244,0,0,0,48,160,144,56,242,0,0,4, -32,165,144,0,48,184,140,96,243,0,0,0,48,160,146,84,0,0,32,0,48,56,146,96, -0,0,32,0,208,133,176,0,16,130,178,0,80,130,176,0,16,130,178,0,144,130,176, -0,16,130,178,0,208,130,176,0,16,130,178,0,16,131,176,0,16,130,178,0,80, -131,176,0,16,130,178,0,144,131,176,0,16,130,178,0,208,131,176,0,16,130, -178,0,208,128,176,0,16,130,178,0,48,160,140,240,243,0,0,0,16,133,176,0, -16,130,178,0,48,160,140,0,244,0,0,0,16,133,176,0,16,130,178,0,48,160,140, -16,244,0,0,0,16,133,176,0,48,184,140,32,244,0,0,0,16,130,178,0,208,165, -144,0,48,160,146,96,0,0,32,23,16,169,89,0,80,165,144,0,48,160,146,96,0, -0,32,23,16,170,89,0,80,165,144,23,16,171,89,0,48,160,146,96,0,0,32,0,80, -165,144,0,48,160,146,96,0,0,32,23,16,172,89,0,80,165,144,0,48,160,146,96, -0,0,32,23,16,173,89,0,80,165,144,0,48,160,146,96,0,0,32,23,16,174,89,0, -80,165,144,23,16,175,89,0,48,160,146,96,0,0,32,0,80,165,144,0,48,160,146, -96,0,0,32,228,0,0,8,0,48,128,144,56,242,0,0,80,89,0,11,2,30,232,92,210, -32,4,61,10,30,232,92,200,0,0,8,0,0,0,0,128,90,0,9,0,48,160,144,56,242,0, -0,4,32,141,144,16,30,128,92,0,48,144,140,240,193,3,0,228,25,0,9,2,30,232, -92,156,0,0,8,0,48,160,144,56,242,0,0,4,32,165,144,0,48,160,146,64,0,0,32, -0,48,160,144,0,225,1,240,0,48,160,146,96,0,0,48,0,48,160,144,4,225,1,240, -0,48,160,146,96,0,0,48,0,48,160,144,100,224,1,240,0,48,160,146,96,0,0,48, -0,48,160,144,104,224,1,240,2,30,232,92,0,48,160,146,96,0,0,48,64,0,0,8, -0,0,0,0,0,48,160,144,56,242,0,0,0,16,165,144,0,48,40,140,94,208,94,208, -34,64,161,61,0,48,160,144,64,244,0,0,0,30,128,92,0,48,40,140,13,0,173,222, -0,16,45,146,216,90,0,9,8,30,232,92,0,48,176,144,56,242,0,0,0,144,165,144, -118,32,61,48,16,160,189,144,0,144,245,146,0,48,168,144,60,242,0,0,32,160, -165,140,0,48,160,146,56,242,0,0,22,64,165,54,0,48,160,144,64,242,0,0,0, -48,160,146,56,242,0,0,0,48,168,144,40,82,0,0,0,48,184,146,56,0,0,32,255, -0,40,140,0,48,232,146,96,0,0,48,21,80,168,89,149,64,161,88,136,9,165,88, -0,48,168,146,40,82,0,0,0,48,160,146,4,0,0,32,80,0,0,8,0,0,0,0,0,48,160, -144,56,242,0,0,16,32,181,144,0,16,245,146,0,48,168,144,60,242,0,0,32,32, -165,140,0,48,160,146,56,242,0,0,22,64,165,54,0,48,160,144,64,242,0,0,0, -48,160,146,56,242,0,0,0,48,176,146,56,0,0,32,0,48,232,146,96,0,0,48,0,48, -160,144,56,242,0,0,0,16,165,144,127,0,40,140,148,64,161,88,132,60,5,61, -112,250,255,8,0,0,0,0,0,0,0,0,0,0,0,0,16,22,32,93,44,27,0,9,132,208,163, -88,255,0,144,140,148,128,164,88,62,32,5,61,133,48,0,90,0,48,232,140,0,0, -0,48,42,0,0,22,0,80,167,176,0,16,161,178,0,80,167,176,4,73,41,89,16,32, -33,140,133,48,0,90,0,16,161,178,4,16,36,89,224,255,255,17,0,0,0,10,0,48, -160,140,0,0,0,48,0,16,165,152,4,73,41,89,133,48,0,90,0,16,161,154,4,16, -34,89,0,48,152,140,0,0,0,48,42,0,0,22,0,208,164,176,0,16,161,178,0,208, -164,176,4,73,41,89,16,32,33,140,133,48,0,90,0,16,161,178,4,16,36,89,224, -255,255,17,0,48,160,140,0,0,0,48,0,16,165,176,0,16,161,178,0,48,160,140, -0,0,0,48,0,16,165,152,4,16,36,89,0,16,161,154,0,0,0,10,0,0,0,0,0,0,0,0, -0,0,0,0,28,32,180,144,12,32,172,144,0,48,160,144,40,82,0,0,0,144,181,144, -20,80,160,89,0,48,160,146,40,82,0,0,145,48,0,90,255,0,184,140,149,56,168, -140,0,0,0,0,0,48,176,146,48,0,0,32,0,48,168,146,96,0,0,32,148,192,165,88, -0,48,160,146,4,0,0,32,10,0,0,18,224,6,0,8,0,48,128,146,16,82,0,0,0,0,0, -10,0,48,160,144,16,82,0,0,16,22,40,92,16,32,36,144,22,32,5,58,20,22,128, -92,184,6,0,9,0,48,240,146,16,82,0,0,12,96,161,144,0,48,168,144,112,180, -3,0,20,1,161,89,14,64,165,52,1,30,128,92,0,0,0,10,0,48,160,144,112,242, -0,0,154,32,5,58,0,48,128,176,112,242,0,0,0,48,48,152,136,242,0,0,1,9,164, -89,0,16,133,140,0,48,160,146,112,242,0,0,148,160,4,90,148,157,185,140,6, -1,0,19,0,208,161,144,254,32,5,58,0,208,177,144,0,48,168,144,124,242,0,0, -0,48,160,144,40,82,0,0,0,48,176,146,48,0,0,32,0,48,232,140,112,242,0,0, -0,48,232,146,16,82,0,0,255,0,232,140,149,56,168,140,0,0,0,0,20,80,160,89, -0,48,168,146,96,0,0,32,148,64,183,88,0,48,160,146,40,82,0,0,0,48,176,146, -4,0,0,32,160,0,0,8,0,0,0,0,0,48,160,144,32,244,0,0,0,48,176,144,140,242, -0,0,20,80,160,89,0,48,160,146,32,244,0,0,0,144,165,144,146,32,5,58,0,144, -181,144,0,48,168,144,40,82,0,0,0,48,160,144,124,242,0,0,0,48,176,146,48, -0,0,32,148,56,160,140,0,0,0,0,0,48,160,146,96,0,0,32,21,80,168,89,255,0, -232,140,0,48,168,146,40,82,0,0,149,64,175,88,0,48,128,140,112,242,0,0,0, -48,168,146,4,0,0,32,124,5,0,9,0,48,160,144,112,242,0,0,0,48,168,144,136, -242,0,0,1,9,165,89,0,48,160,146,112,242,0,0,148,93,189,140,0,208,165,144, -0,16,161,146,4,16,34,89,16,96,33,146,4,224,133,144,0,0,0,10,168,254,255, -8,0,0,0,0,0,0,0,0,0,0,0,0,0,48,160,144,16,82,0,0,16,22,40,92,16,32,36,144, -22,32,5,58,20,22,128,92,24,5,0,9,0,48,240,146,16,82,0,0,12,96,161,144,0, -48,168,144,112,180,3,0,20,1,161,89,14,64,165,52,1,30,128,92,0,0,0,10,0, -48,160,144,160,242,0,0,146,32,5,58,0,48,128,176,160,242,0,0,0,48,48,152, -184,242,0,0,1,9,164,89,0,16,133,140,0,48,160,146,160,242,0,0,148,160,4, -90,148,157,185,140,250,0,0,19,0,208,161,144,242,32,5,58,0,208,177,144,0, -48,168,144,172,242,0,0,0,48,160,144,40,82,0,0,0,48,176,146,48,0,0,32,0, -48,232,140,160,242,0,0,0,48,232,146,16,82,0,0,255,0,232,140,1,78,173,89, -1,32,165,140,0,48,168,146,96,0,0,32,148,64,183,88,0,48,160,146,40,82,0, -0,0,48,176,146,4,0,0,32,152,0,0,8,0,48,160,144,36,244,0,0,0,48,176,144, -188,242,0,0,20,80,160,89,0,48,160,146,36,244,0,0,0,144,165,144,146,32,5, -58,0,144,181,144,0,48,168,144,40,82,0,0,0,48,160,144,172,242,0,0,0,48,176, -146,48,0,0,32,1,14,165,89,0,48,160,146,96,0,0,32,21,80,168,89,255,0,232, -140,0,48,168,146,40,82,0,0,149,64,175,88,0,48,128,140,160,242,0,0,0,48, -168,146,4,0,0,32,232,3,0,9,0,48,160,144,160,242,0,0,0,48,168,144,184,242, -0,0,1,9,165,89,0,48,160,146,160,242,0,0,148,93,189,140,0,208,165,144,0, -16,161,146,4,16,34,89,16,96,33,146,4,224,133,144,0,0,0,10,0,0,0,0,176,254, -255,8,0,0,0,0,0,48,160,144,16,82,0,0,16,22,40,92,16,32,36,144,22,32,5,58, -20,22,128,92,136,3,0,9,0,48,240,146,16,82,0,0,12,96,161,144,0,48,168,144, -112,180,3,0,20,1,161,89,14,64,165,52,1,30,128,92,0,0,0,10,0,48,160,144, -208,242,0,0,146,32,5,58,0,48,128,176,208,242,0,0,0,48,48,152,232,242,0, -0,1,9,164,89,0,16,133,140,0,48,160,146,208,242,0,0,148,160,4,90,148,157, -185,140,250,0,0,19,0,208,161,144,242,32,5,58,0,208,177,144,0,48,168,144, -220,242,0,0,0,48,160,144,40,82,0,0,0,48,176,146,48,0,0,32,0,48,232,140, -208,242,0,0,0,48,232,146,16,82,0,0,255,0,232,140,1,78,173,89,1,32,165,140, -0,48,168,146,96,0,0,32,148,64,183,88,0,48,160,146,40,82,0,0,0,48,176,146, -4,0,0,32,152,0,0,8,0,48,160,144,40,244,0,0,0,48,176,144,236,242,0,0,20, -80,160,89,0,48,160,146,40,244,0,0,0,144,165,144,146,32,5,58,0,144,181,144, -0,48,168,144,40,82,0,0,0,48,160,144,220,242,0,0,0,48,176,146,48,0,0,32, -1,14,165,89,0,48,160,146,96,0,0,32,21,80,168,89,255,0,232,140,0,48,168, -146,40,82,0,0,149,64,175,88,0,48,128,140,208,242,0,0,0,48,168,146,4,0,0, -32,88,2,0,9,0,48,160,144,208,242,0,0,0,48,168,144,232,242,0,0,1,9,165,89, -0,48,160,146,208,242,0,0,148,93,189,140,0,208,165,144,0,16,161,146,4,16, -34,89,16,96,33,146,4,224,133,144,0,0,0,10,0,0,0,0,176,254,255,8,0,0,0,0, -0,48,160,144,16,82,0,0,16,22,40,92,16,32,36,144,22,32,5,58,20,22,128,92, -248,1,0,9,0,48,240,146,16,82,0,0,12,96,161,144,0,48,168,144,112,180,3,0, -20,1,161,89,14,64,165,52,1,30,128,92,0,0,0,10,0,48,160,144,0,243,0,0,146, -32,5,58,0,48,128,176,0,243,0,0,0,48,48,152,24,243,0,0,1,9,164,89,0,16,133, -140,0,48,160,146,0,243,0,0,148,160,4,90,148,157,185,140,250,0,0,19,0,208, -161,144,242,32,5,58,0,208,177,144,0,48,168,144,12,243,0,0,0,48,160,144, -40,82,0,0,0,48,176,146,48,0,0,32,0,48,232,140,0,243,0,0,0,48,232,146,16, -82,0,0,255,0,232,140,1,78,173,89,1,32,165,140,0,48,168,146,96,0,0,32,148, -64,183,88,0,48,160,146,40,82,0,0,0,48,176,146,4,0,0,32,152,0,0,8,0,48,160, -144,44,244,0,0,0,48,176,144,28,243,0,0,20,80,160,89,0,48,160,146,44,244, -0,0,0,144,165,144,146,32,5,58,0,144,181,144,0,48,168,144,40,82,0,0,0,48, -160,144,12,243,0,0,0,48,176,146,48,0,0,32,1,14,165,89,0,48,160,146,96,0, -0,32,21,80,168,89,255,0,232,140,0,48,168,146,40,82,0,0,149,64,175,88,0, -48,128,140,0,243,0,0,0,48,168,146,4,0,0,32,200,0,0,9,0,48,160,144,0,243, -0,0,0,48,168,144,24,243,0,0,1,9,165,89,0,48,160,146,0,243,0,0,148,93,189, -140,0,208,165,144,0,16,161,146,4,16,34,89,16,96,33,146,4,224,133,144,0, -0,0,10,0,0,0,0,176,254,255,8,0,0,0,0,16,22,32,92,0,48,128,144,16,82,0,0, -18,32,4,58,112,0,0,9,0,48,240,146,16,82,0,0,28,32,177,144,0,144,165,144, -86,32,5,58,0,16,161,152,78,64,165,57,0,144,181,144,12,32,169,144,0,48,160, -144,40,82,0,0,0,48,32,146,16,82,0,0,0,48,176,146,48,0,0,32,255,0,184,140, -1,78,173,89,1,32,165,140,0,48,168,146,96,0,0,32,148,192,181,88,0,48,160, -146,40,82,0,0,0,48,176,146,4,0,0,32,0,0,0,10,0,0,0,0,0,16,68,176,24,32, -164,144,16,22,40,92,136,29,37,140,32,19,0,9,255,0,136,140,132,208,163,88, -148,64,164,88,148,48,0,90,0,208,130,140,66,0,0,21,139,48,0,90,0,48,152, -140,0,0,0,48,162,0,0,22,0,208,164,176,0,16,161,178,0,208,164,176,4,9,132, -89,16,32,33,140,144,48,0,90,0,16,161,178,4,16,36,89,224,255,255,17,120, -0,0,8,0,0,0,0,0,48,160,140,0,0,0,48,0,16,165,152,4,201,130,89,144,48,0, -90,0,16,161,154,4,16,34,89,0,48,144,140,0,0,0,48,42,0,0,22,0,144,164,176, -0,16,161,178,0,144,164,176,4,9,132,89,16,32,33,140,144,48,0,90,0,16,161, -178,4,16,36,89,224,255,255,17,0,48,160,140,0,0,0,48,0,16,165,176,0,16,161, -178,0,48,160,140,0,0,0,48,0,16,165,152,4,16,36,89,0,16,161,154,5,16,175, -89,0,80,165,144,4,32,133,144,0,16,245,146,0,80,165,144,32,96,177,152,20, -16,162,89,10,192,165,54,22,22,160,92,0,80,165,146,0,48,128,146,56,0,0,32, -2,30,136,92,0,48,136,146,96,0,0,48,0,80,161,176,20,192,165,89,0,80,161, -146,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,64,96,8,140,0,116,192,178,240,255, -255,255,120,32,164,144,0,48,160,146,128,242,0,0,136,32,172,144,0,48,168, -146,176,242,0,0,152,32,180,144,0,48,176,146,224,242,0,0,16,22,104,92,168, -32,188,144,64,32,132,140,148,48,0,90,0,48,184,146,16,243,0,0,34,0,0,21, -30,96,5,61,26,160,5,61,22,224,5,61,8,30,128,92,0,116,192,176,240,255,255, -255,0,0,0,10,52,32,180,144,0,48,176,146,132,242,0,0,68,32,164,144,0,48, -160,146,180,242,0,0,84,32,164,144,0,48,160,146,228,242,0,0,0,48,160,144, -128,242,0,0,100,32,172,144,148,48,0,90,0,48,168,146,20,243,0,0,14,0,0,18, -63,0,24,140,174,223,176,62,0,48,160,144,176,242,0,0,22,32,5,58,0,48,160, -144,180,242,0,0,63,0,24,140,146,223,160,62,0,48,160,144,224,242,0,0,22, -32,5,58,0,48,160,144,228,242,0,0,63,0,24,140,118,223,160,62,0,48,160,144, -16,243,0,0,22,32,5,58,0,48,160,144,20,243,0,0,63,0,24,140,90,223,160,62, -0,48,160,144,128,242,0,0,38,32,5,58,0,48,160,144,176,242,0,0,26,32,5,58, -0,48,168,144,132,242,0,0,0,48,160,144,180,242,0,0,46,31,173,57,0,48,160, -144,224,242,0,0,38,32,5,58,0,48,160,144,16,243,0,0,26,32,5,58,0,48,168, -144,228,242,0,0,0,48,160,144,20,243,0,0,2,31,173,57,0,48,160,144,128,242, -0,0,46,32,5,61,0,48,160,144,180,242,0,0,0,48,24,140,48,104,0,0,0,48,24, -146,48,243,0,0,0,48,160,146,132,242,0,0,24,0,0,8,0,0,0,0,0,48,24,140,144, -102,0,0,0,48,24,146,48,243,0,0,0,48,160,144,224,242,0,0,42,32,5,61,0,48, -160,144,20,243,0,0,0,48,24,140,80,107,0,0,0,48,24,146,52,243,0,0,0,48,160, -146,228,242,0,0,20,0,0,8,0,48,24,140,192,105,0,0,0,48,24,146,52,243,0,0, -60,32,180,144,0,48,176,146,124,242,0,0,76,32,164,144,0,48,160,146,172,242, -0,0,92,32,164,144,0,48,160,146,220,242,0,0,0,48,160,144,128,242,0,0,108, -32,172,144,148,48,0,90,0,48,168,146,12,243,0,0,10,0,0,18,58,190,5,59,0, -48,160,144,124,242,0,0,31,216,31,89,42,222,160,49,0,48,160,128,124,242, -0,0,255,0,24,140,148,208,160,88,148,192,160,88,18,62,5,61,0,48,160,144, -176,242,0,0,18,32,5,58,0,48,160,144,172,242,0,0,250,61,5,59,0,48,160,144, -172,242,0,0,31,216,31,89,234,221,160,49,0,48,160,128,172,242,0,0,255,0, -24,140,148,208,160,88,148,192,160,88,210,61,5,61,0,48,160,144,224,242,0, -0,18,32,5,58,0,48,160,144,220,242,0,0,186,61,5,59,0,48,160,144,220,242, -0,0,31,216,31,89,170,221,160,49,0,48,160,128,220,242,0,0,255,0,24,140,148, -208,160,88,148,192,160,88,146,61,5,61,0,48,160,144,16,243,0,0,18,32,5,58, -0,48,160,144,12,243,0,0,122,61,5,59,0,48,160,144,12,243,0,0,31,216,31,89, -106,221,160,49,0,48,160,128,12,243,0,0,255,0,24,140,148,208,160,88,148, -192,160,88,82,61,5,61,0,48,168,144,128,242,0,0,18,96,5,58,0,48,160,144, -124,242,0,0,58,29,173,60,0,48,168,144,176,242,0,0,18,96,5,58,0,48,160,144, -172,242,0,0,34,29,173,60,0,48,168,144,224,242,0,0,18,96,5,58,0,48,160,144, -220,242,0,0,10,29,173,60,0,48,168,144,16,243,0,0,18,96,5,58,0,48,160,144, -12,243,0,0,242,28,173,60,0,48,176,144,176,242,0,0,0,48,32,176,160,242,0, -0,0,48,96,144,128,242,0,0,0,48,128,176,112,242,0,0,0,48,232,144,16,243, -0,0,0,48,192,176,0,243,0,0,0,48,184,144,224,242,0,0,0,48,64,176,208,242, -0,0,19,1,163,89,1,13,171,89,0,16,141,140,21,22,144,92,0,48,128,146,112, -242,0,0,0,48,168,146,120,242,0,0,0,48,160,146,116,242,0,0,7,129,165,89, -0,48,152,146,124,242,0,0,1,141,181,89,0,16,45,140,22,22,48,92,0,48,32,146, -160,242,0,0,0,48,160,146,164,242,0,0,11,193,165,89,0,48,176,146,168,242, -0,0,1,205,189,89,0,16,77,140,23,22,80,92,0,48,64,146,208,242,0,0,0,48,184, -146,216,242,0,0,0,48,160,146,212,242,0,0,27,65,167,89,0,48,88,146,220,242, -0,0,1,77,239,89,0,16,205,140,29,22,208,92,0,48,192,146,0,243,0,0,0,48,56, -146,172,242,0,0,0,30,32,92,0,48,160,146,4,243,0,0,0,48,232,146,8,243,0, -0,0,48,216,146,12,243,0,0,98,32,3,58,112,96,139,144,0,48,112,140,112,242, -0,0,0,48,120,140,88,242,0,0,0,48,112,154,80,242,0,0,0,48,128,140,112,242, -0,0,8,37,0,9,1,30,32,92,184,59,68,58,0,48,160,144,140,242,0,0,12,96,163, -146,0,48,128,144,128,242,0,0,144,57,128,140,0,0,0,0,48,67,0,9,0,48,128, -146,136,242,0,0,140,59,4,58,0,48,160,144,176,242,0,0,126,32,5,58,0,48,24, -140,160,242,0,0,132,57,160,140,0,0,0,0,96,224,31,146,0,52,173,140,80,242, -0,0,0,52,165,140,88,242,0,0,128,96,139,144,100,224,167,146,96,224,31,144, -4,96,165,146,0,48,128,140,160,242,0,0,0,80,29,146,132,36,0,9,4,80,32,89, -52,59,68,58,0,48,160,144,188,242,0,0,16,96,163,146,0,48,128,144,176,242, -0,0,144,57,128,140,0,0,0,0,172,66,0,9,0,48,128,146,184,242,0,0,8,59,4,58, -0,48,160,144,224,242,0,0,126,32,5,58,0,48,24,140,208,242,0,0,132,57,160, -140,0,0,0,0,80,224,31,146,0,52,173,140,80,242,0,0,0,52,165,140,88,242,0, -0,144,96,139,144,84,224,167,146,80,224,31,144,4,96,165,146,0,48,128,140, -208,242,0,0,0,80,29,146,0,36,0,9,4,80,32,89,176,58,68,58,0,48,160,144,236, -242,0,0,20,96,163,146,0,48,128,144,224,242,0,0,144,57,128,140,0,0,0,0,40, -66,0,9,0,48,128,146,232,242,0,0,132,58,4,58,0,48,160,144,16,243,0,0,126, -32,5,58,0,48,24,140,0,243,0,0,132,57,160,140,0,0,0,0,64,224,31,146,0,52, -173,140,80,242,0,0,0,52,165,140,88,242,0,0,160,96,139,144,68,224,167,146, -64,224,31,144,4,96,165,146,0,48,128,140,0,243,0,0,0,80,29,146,124,35,0, -9,4,80,32,89,44,58,68,58,0,48,160,144,28,243,0,0,24,96,163,146,0,48,128, -144,16,243,0,0,144,57,128,140,0,0,0,0,164,65,0,9,0,48,128,146,24,243,0, -0,0,58,4,58,0,48,24,140,80,242,0,0,2,30,128,92,132,57,24,146,76,242,0,0, -0,116,192,176,240,255,255,255,0,0,0,10,0,0,0,0,0,48,128,146,76,243,0,0, -16,22,32,92,144,64,132,112,0,80,44,140,92,65,0,9,0,48,128,146,64,243,0, -0,18,32,4,61,8,30,128,92,0,0,0,10,0,0,0,0,4,57,128,140,0,0,0,0,56,65,0, -9,0,48,128,146,68,243,0,0,14,32,4,61,8,30,128,92,0,0,0,10,0,48,160,144, -64,243,0,0,132,48,0,90,0,48,168,144,68,243,0,0,0,30,176,92,82,0,0,22,0, -47,1,90,0,80,189,140,0,32,165,140,28,0,0,16,1,30,176,92,0,80,165,146,150, -32,1,90,20,64,161,89,4,96,189,140,42,0,0,19,23,22,168,92,0,80,165,146,20, -64,161,89,2,160,181,140,4,96,165,146,150,32,1,90,20,64,161,89,8,96,173, -140,228,255,255,20,4,57,128,140,0,0,0,0,176,64,0,9,0,48,128,146,72,243, -0,0,14,32,4,61,8,30,128,92,0,0,0,10,132,48,0,90,0,48,160,144,72,243,0,0, -0,30,176,92,66,0,0,22,0,47,1,90,0,16,173,140,24,0,0,16,1,30,176,92,150, -32,1,90,0,16,245,146,20,16,169,89,34,0,0,19,21,22,160,92,0,16,245,146,22, -144,176,89,4,32,245,146,150,32,1,90,8,32,165,140,236,255,255,20,2,30,128, -92,0,0,0,10,0,48,184,144,24,82,0,0,0,48,160,144,68,243,0,0,23,29,173,140, -0,80,181,144,16,22,32,93,62,160,5,58,0,48,160,144,76,243,0,0,0,144,141, -146,0,80,245,146,22,16,170,89,16,32,172,146,23,80,168,89,12,32,180,146, -1,9,165,89,148,64,165,88,1,0,128,140,0,48,160,146,24,82,0,0,0,0,0,10,0, -48,160,144,20,82,0,0,98,32,5,59,188,1,0,9,0,48,168,144,24,82,0,0,0,48,160, -144,68,243,0,0,21,29,189,140,0,208,181,144,66,160,5,58,0,48,160,144,76, -243,0,0,0,208,245,146,21,80,168,89,1,9,165,89,148,64,165,88,0,48,160,146, -24,82,0,0,0,144,45,146,22,16,162,89,16,32,161,146,1,30,128,92,12,32,177, -146,0,0,0,10,0,0,0,0,0,48,160,144,48,244,0,0,20,80,160,89,0,0,128,140,0, -48,160,146,48,244,0,0,0,0,0,10,0,0,0,0,0,48,136,144,112,180,3,0,16,22,32, -92,116,57,0,9,0,48,160,144,96,180,3,0,0,48,184,144,28,82,0,0,20,58,160, -140,16,0,0,0,0,16,161,146,0,48,168,144,68,243,0,0,0,48,160,144,76,243,0, -0,23,80,176,89,23,93,37,146,1,9,165,89,148,128,165,88,0,48,160,146,28,82, -0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,48,240,140,216,119,0,0,30,22,136,92,0,0, -240,140,0,48,184,144,32,82,0,0,0,48,128,144,72,243,0,0,0,48,160,144,76, -243,0,0,0,48,168,144,20,82,0,0,23,80,176,89,1,9,165,89,148,128,165,88,23, -29,132,144,1,73,173,89,0,48,160,146,32,82,0,0,0,48,168,146,20,82,0,0,0, -80,4,132,0,0,0,10,0,0,0,0,0,48,240,140,80,120,0,0,30,22,144,92,0,0,240, -140,0,48,160,144,48,244,0,0,0,48,184,144,36,82,0,0,0,48,136,144,72,243, -0,0,0,48,168,144,76,243,0,0,0,48,176,144,20,82,0,0,20,80,160,89,0,48,160, -146,48,244,0,0,23,80,160,89,1,73,173,89,149,0,173,88,23,93,132,146,22,80, -176,89,0,48,168,146,36,82,0,0,0,48,176,146,20,82,0,0,0,144,4,132,0,0,0, -0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,255,0,48,140,0,48,56,140,255,255,0,0, -0,48,160,144,140,180,3,0,0,16,165,144,74,33,5,58,0,48,168,144,32,82,0,0, -0,48,184,144,72,243,0,0,0,48,160,144,76,243,0,0,0,48,176,144,20,82,0,0, -21,221,37,144,1,137,181,89,0,48,176,146,20,82,0,0,21,80,168,89,1,9,165, -89,148,64,165,88,0,48,160,146,32,82,0,0,4,16,161,89,0,16,181,144,0,48,168, -144,140,180,3,0,150,192,129,88,0,16,133,146,0,80,141,144,4,22,144,92,144, -141,45,89,144,56,128,140,9,0,0,0,3,12,132,89,192,4,0,9,0,48,168,144,140, -180,3,0,0,48,160,144,144,180,3,0,4,96,181,144,0,80,245,146,21,16,170,89, -14,0,173,54,0,48,168,144,148,180,3,0,0,48,168,146,140,180,3,0,0,48,168, -144,40,82,0,0,0,48,136,144,112,180,3,0,0,48,176,146,56,0,0,32,129,73,161, -88,0,48,160,146,96,0,0,48,21,80,168,89,0,48,168,146,40,82,0,0,149,128,169, -88,136,73,173,88,0,16,129,140,0,48,168,146,4,0,0,32,56,55,0,9,0,48,160, -144,96,180,3,0,0,48,128,144,68,243,0,0,20,58,160,140,16,0,0,0,0,16,161, -146,0,48,176,144,28,82,0,0,0,48,160,144,76,243,0,0,0,48,184,144,20,82,0, -0,22,80,168,89,1,9,165,89,148,64,165,88,22,29,36,146,0,48,160,146,28,82, -0,0,180,254,5,60,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,16,36,176, -18,22,232,92,0,208,68,140,30,32,33,58,18,32,33,60,214,32,1,58,4,1,0,8,0, -0,0,0,106,32,41,58,248,0,0,8,50,224,20,61,0,48,160,144,196,243,0,0,0,48, -168,144,216,243,0,0,17,0,141,89,1,96,173,140,0,48,136,146,196,243,0,0,0, -48,168,146,216,243,0,0,200,0,0,8,0,48,160,144,208,243,0,0,0,48,168,144, -224,243,0,0,17,0,141,89,1,96,173,140,0,48,136,146,208,243,0,0,0,48,168, -146,224,243,0,0,156,0,0,8,0,0,0,0,50,224,20,61,0,48,160,144,244,243,0,0, -0,48,168,144,4,244,0,0,17,0,141,89,1,96,173,140,0,48,136,146,244,243,0, -0,0,48,168,146,4,244,0,0,104,0,0,8,0,48,160,144,248,243,0,0,0,48,168,144, -16,244,0,0,17,0,141,89,1,96,173,140,0,48,136,146,248,243,0,0,0,48,168,146, -16,244,0,0,60,0,0,8,0,0,0,0,34,224,20,61,0,48,160,144,180,243,0,0,17,0, -141,89,0,48,136,146,180,243,0,0,28,0,0,8,0,0,0,0,0,48,160,144,184,243,0, -0,17,0,141,89,0,48,136,146,184,243,0,0,16,32,164,144,7,1,165,89,8,9,165, -89,3,12,165,89,4,224,161,146,40,32,180,152,7,16,162,89,18,128,149,62,7, -16,164,89,22,129,236,89,12,224,177,146,26,192,237,60,23,65,239,89,4,32, -189,146,157,224,5,90,8,32,165,140,240,255,255,19,10,96,7,59,4,32,237,146, -0,48,160,144,20,82,0,0,10,32,5,59,28,253,255,9,0,48,136,144,140,180,3,0, -0,80,164,144,118,32,5,61,4,224,169,144,0,48,184,144,36,82,0,0,0,48,176, -144,72,243,0,0,16,14,162,89,148,67,165,88,4,224,161,146,23,157,61,146,0, -48,168,144,48,244,0,0,0,48,160,144,76,243,0,0,0,48,176,144,20,82,0,0,23, -80,184,89,1,96,173,140,1,9,165,89,148,192,165,88,0,48,168,146,48,244,0, -0,22,80,176,89,0,48,160,146,36,82,0,0,0,48,176,146,20,82,0,0,0,0,0,10,0, -0,0,0,4,224,129,144,0,80,140,144,7,22,144,92,144,56,128,140,9,0,0,0,131, -13,132,89,208,1,0,9,0,48,168,144,140,180,3,0,0,48,160,144,144,180,3,0,4, -96,181,144,0,80,245,146,21,16,170,89,14,0,173,54,0,48,168,144,148,180,3, -0,0,48,160,144,40,82,0,0,0,48,136,144,112,180,3,0,0,48,176,146,56,0,0,32, -0,48,168,146,140,180,3,0,129,9,170,88,0,48,168,146,96,0,0,48,20,80,160, -89,255,0,72,140,0,48,160,146,40,82,0,0,148,64,162,88,136,9,165,88,0,208, -129,140,0,48,160,146,4,0,0,32,68,52,0,9,0,48,160,144,96,180,3,0,0,48,184, -144,28,82,0,0,20,58,160,140,16,0,0,0,0,208,161,146,0,48,168,144,68,243, -0,0,0,48,160,144,76,243,0,0,23,80,176,89,23,93,61,146,1,9,165,89,148,128, -165,88,0,48,160,146,28,82,0,0,0,0,0,10,144,68,148,101,0,0,0,10,5,56,0,102, -0,0,0,10,33,22,128,92,0,0,0,10,16,54,8,92,16,22,128,92,16,22,128,92,16, -22,128,92,16,22,128,92,16,22,128,92,16,22,128,92,16,22,128,92,16,22,128, -92,0,0,0,10,16,54,0,92,0,0,0,10,32,22,128,92,0,0,0,10,0,48,32,140,0,0,31, -0,16,14,44,89,132,2,41,101,5,22,128,92,0,0,0,10,144,18,128,101,0,0,0,10, -0,48,32,140,255,255,255,255,16,64,36,97,4,22,128,92,0,0,0,10,16,64,148, -97,18,22,128,92,0,0,0,10,16,65,36,97,4,22,128,92,0,0,0,10,0,0,0,0,0,0,0, -0,0,0,0,0,0,48,136,146,48,0,0,32,144,57,160,140,0,0,0,0,0,30,136,92,144, -48,0,90,0,48,160,146,96,0,0,32,0,48,152,140,0,0,0,48,54,0,0,22,0,48,160, -144,8,0,0,16,248,63,61,51,0,208,164,176,0,144,164,178,0,208,164,176,17, -80,136,89,16,160,148,140,145,32,4,90,0,144,164,178,18,16,148,89,212,255, -255,20,0,0,0,10,18,22,184,92,144,57,160,140,0,0,0,0,0,48,136,146,84,0,0, -32,144,48,0,90,0,48,160,146,96,0,0,32,0,30,136,92,146,0,0,22,56,32,4,48, -0,144,36,176,0,48,160,140,96,0,0,48,1,30,136,92,0,16,37,178,18,16,188,89, -0,48,168,140,96,0,0,48,0,208,37,176,23,16,188,89,145,32,4,90,0,80,37,178, -90,0,0,19,0,48,176,140,96,0,0,48,0,48,168,140,96,0,0,48,0,48,152,140,96, -0,0,48,0,208,37,176,0,208,36,178,23,16,164,89,0,16,37,176,0,208,36,178, -32,224,165,140,0,16,37,176,0,144,37,178,48,224,165,140,0,16,37,176,17,144, -136,89,64,224,189,140,145,32,4,90,0,80,37,178,200,255,255,20,0,0,0,10,0, -0,0,0,0,0,0,0,0,48,240,140,144,127,0,0,30,22,184,92,0,0,240,140,16,22,176, -92,0,48,136,146,84,0,0,32,144,176,0,90,0,48,128,146,96,0,0,32,18,22,168, -92,42,0,0,18,18,32,20,60,50,32,12,58,64,0,0,8,0,0,0,0,56,32,28,61,0,144, -164,144,18,16,169,89,0,48,160,146,96,0,0,32,0,80,165,144,21,16,169,89,0, -48,160,146,96,0,0,32,0,80,165,144,0,48,160,146,96,0,0,32,0,208,5,132,0, -0,0,0,146,208,163,88,50,32,69,58,18,32,69,52,22,32,37,58,76,0,0,8,0,0,0, -0,50,32,101,58,64,0,0,8,0,144,164,144,18,16,169,89,1,9,180,89,0,48,160, -146,96,0,0,32,0,80,165,144,21,16,169,89,1,137,181,89,0,48,160,146,96,0, -0,32,0,80,165,144,21,16,169,89,1,137,181,89,0,48,160,146,96,0,0,32,150, -240,0,90,0,48,160,140,96,0,0,32,30,0,0,22,0,80,133,176,4,137,181,89,16, -96,173,140,150,240,0,90,0,16,133,178,236,255,255,17,34,160,5,59,0,80,165, -144,1,137,181,89,4,96,173,140,150,48,0,90,0,48,160,146,96,0,0,32,232,255, -255,17,0,208,5,132,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,255,0,176,140,144,128, -133,88,0,0,168,140,0,48,128,146,4,0,0,32,0,48,160,144,4,0,0,16,255,0,176, -140,148,128,165,88,188,0,164,58,0,48,160,144,4,0,0,16,148,128,165,88,172, -0,164,58,0,48,160,144,4,0,0,16,148,128,165,88,156,0,164,58,0,48,160,144, -4,0,0,16,148,128,165,88,140,0,164,58,0,48,160,144,4,0,0,16,148,128,165, -88,124,0,164,58,0,48,160,144,4,0,0,16,148,128,165,88,108,0,164,58,0,48, -160,144,4,0,0,16,148,128,165,88,92,0,164,58,0,48,160,144,4,0,0,16,148,128, -165,88,76,0,164,58,0,48,160,144,4,0,0,16,148,128,165,88,60,0,164,58,0,48, -160,144,4,0,0,16,148,128,165,88,44,0,164,58,21,144,170,89,0,48,176,140, -255,179,196,4,82,159,173,62,0,48,160,144,64,244,0,0,0,48,176,140,6,0,173, -222,0,16,181,146,148,62,0,8,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,30,176,92, -0,48,168,128,40,82,0,0,0,48,160,144,4,0,0,16,255,0,184,140,148,192,165, -88,188,64,165,58,0,48,160,144,4,0,0,16,148,192,165,88,172,64,165,58,0,48, -160,144,4,0,0,16,148,192,165,88,156,64,165,58,0,48,160,144,4,0,0,16,148, -192,165,88,140,64,165,58,0,48,160,144,4,0,0,16,148,192,165,88,124,64,165, -58,0,48,160,144,4,0,0,16,148,192,165,88,108,64,165,58,0,48,160,144,4,0, -0,16,148,192,165,88,92,64,165,58,0,48,160,144,4,0,0,16,148,192,165,88,76, -64,165,58,0,48,160,144,4,0,0,16,148,192,165,88,60,64,165,58,0,48,160,144, -4,0,0,16,148,192,165,88,44,64,165,58,22,144,178,89,0,48,184,140,255,179, -196,4,82,223,181,62,0,48,160,144,64,244,0,0,0,48,184,140,7,0,173,222,0, -16,189,146,172,61,0,8,0,0,0,10,0,0,0,0,0,48,240,140,176,129,0,0,30,22,128, -92,0,0,240,140,0,48,168,144,40,82,0,0,255,0,176,140,21,80,168,89,149,128, -165,88,136,9,165,88,0,48,168,146,40,82,0,0,0,48,160,146,4,0,0,32,0,16,4, -132,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,22,40,92,1,9,52,89,0,0, -32,140,0,48,56,140,16,39,0,0,28,251,255,9,5,1,132,88,12,251,255,9,4,22, -160,92,148,224,1,90,1,32,33,140,10,0,0,22,32,61,0,9,252,250,255,9,144,64, -129,88,216,63,4,61,1,30,128,92,0,0,0,10,0,0,0,0,0,0,0,0,64,96,8,140,0,116, -128,178,192,255,255,255,0,116,160,178,208,255,255,255,0,116,192,178,224, -255,255,255,0,116,224,178,240,255,255,255,0,48,160,144,52,82,0,0,34,32, -5,61,0,48,160,144,64,244,0,0,0,48,176,140,1,0,173,222,0,16,181,146,188, -60,0,9,232,60,0,9,0,48,160,144,0,0,0,16,210,0,176,140,148,128,165,88,40, -0,176,140,0,48,40,140,16,39,0,0,148,131,165,88,0,0,32,140,0,48,160,146, -0,0,0,16,104,250,255,9,0,14,132,88,88,250,255,9,4,22,160,92,148,96,1,90, -1,32,33,140,10,0,0,22,108,60,0,9,72,250,255,9,220,63,4,55,0,48,160,144, -60,82,0,0,0,48,168,144,64,82,0,0,20,80,160,89,0,48,160,146,60,82,0,0,54, -96,5,58,0,48,168,144,40,82,0,0,255,0,176,140,21,80,168,89,149,128,165,88, -136,9,165,88,0,48,168,146,40,82,0,0,0,48,160,146,4,0,0,32,16,0,0,8,0,0, -0,0,0,48,240,146,52,82,0,0,0,116,128,176,192,255,255,255,0,116,160,176, -208,255,255,255,0,116,192,176,224,255,255,255,0,116,224,176,240,255,255, -255,3,54,8,92,0,0,0,10,64,96,8,140,0,116,128,178,192,255,255,255,0,116, -160,178,208,255,255,255,0,116,192,178,224,255,255,255,0,116,224,178,240, -255,255,255,0,48,160,128,68,20,0,80,22,32,37,48,0,48,160,144,68,20,0,80, -10,32,133,48,180,3,0,9,0,48,160,128,68,20,0,80,22,32,45,48,0,48,160,144, -68,20,0,80,10,32,141,48,184,3,0,9,0,48,160,128,68,20,0,80,22,32,53,48,0, -48,160,144,68,20,0,80,10,32,149,48,188,3,0,9,0,48,160,128,68,12,0,80,14, -32,21,48,10,32,29,48,200,3,0,9,0,30,32,92,0,48,40,140,16,39,0,0,40,249, -255,9,4,14,132,88,24,249,255,9,4,22,160,92,148,96,1,90,1,32,33,140,10,0, -0,22,44,59,0,9,8,249,255,9,220,63,36,55,0,116,128,176,192,255,255,255,0, -116,160,176,208,255,255,255,0,116,192,176,224,255,255,255,0,116,224,176, -240,255,255,255,3,54,8,92,0,0,0,10,0,0,0,0,0,0,0,0,64,96,8,140,0,116,128, -178,192,255,255,255,0,116,160,178,208,255,255,255,0,116,192,178,224,255, -255,255,0,116,224,178,240,255,255,255,0,48,160,144,76,82,0,0,34,32,5,61, -0,48,160,144,64,244,0,0,0,48,168,140,2,0,173,222,0,16,173,146,172,58,0, -9,216,58,0,9,68,4,0,9,0,30,32,92,0,48,40,140,16,39,0,0,116,248,255,9,5, -14,132,88,100,248,255,9,4,22,160,92,148,96,1,90,1,32,33,140,10,0,0,22,120, -58,0,9,84,248,255,9,220,63,44,55,0,116,128,176,192,255,255,255,0,116,160, -176,208,255,255,255,0,116,192,176,224,255,255,255,0,116,224,176,240,255, -255,255,3,54,8,92,0,0,0,10,0,0,0,0,64,96,8,140,0,116,128,178,192,255,255, -255,0,116,160,178,208,255,255,255,0,116,192,178,224,255,255,255,0,116,224, -178,240,255,255,255,0,48,160,144,48,82,0,0,34,32,5,61,0,48,160,144,64,244, -0,0,0,48,168,140,3,0,173,222,0,16,173,146,252,57,0,9,40,58,0,9,0,48,160, -144,0,0,0,16,210,0,168,140,0,48,40,140,16,39,0,0,148,64,165,88,128,9,165, -88,0,0,32,140,0,48,160,146,0,0,0,16,172,247,255,9,2,14,132,88,156,247,255, -9,4,22,160,92,148,96,1,90,1,32,33,140,10,0,0,22,176,57,0,9,140,247,255, -9,220,63,20,55,0,116,128,176,192,255,255,255,0,116,160,176,208,255,255, -255,0,116,192,176,224,255,255,255,0,116,224,176,240,255,255,255,3,54,8, -92,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,64,96,8,140,0,116,128,178,192,255,255, -255,0,116,160,178,208,255,255,255,0,116,192,178,224,255,255,255,0,116,224, -178,240,255,255,255,0,48,160,144,44,82,0,0,34,32,5,61,0,48,160,144,64,244, -0,0,0,48,168,140,4,0,173,222,0,16,173,146,44,57,0,9,88,57,0,9,0,116,128, -176,192,255,255,255,0,116,160,176,208,255,255,255,0,116,192,176,224,255, -255,255,0,116,224,176,240,255,255,255,3,54,8,92,0,0,0,10,0,0,0,0,0,0,0, -0,0,0,0,0,144,246,255,9,4,32,44,144,16,32,36,144,0,30,128,92,144,246,255, -9,0,30,128,92,0,48,64,140,1,50,0,0,168,246,255,9,4,30,72,92,0,48,88,140, -32,88,0,0,28,96,89,146,16,96,65,154,0,48,160,140,16,130,0,0,1,4,128,140, -76,32,161,146,0,48,160,140,208,132,0,0,0,30,136,92,140,32,161,146,0,48, -160,140,160,133,0,0,0,30,144,92,204,32,161,146,0,48,160,140,48,131,0,0, -12,33,161,146,20,246,255,9,0,30,128,92,76,246,255,9,255,15,128,140,28,246, -255,9,1,30,128,92,76,246,255,8,0,246,255,9,4,32,36,144,16,32,44,144,0,30, -128,92,0,246,255,9,0,30,128,92,32,246,255,9,84,0,160,140,1,4,128,140,20, -32,161,146,0,48,160,140,0,88,0,0,0,30,136,92,28,32,161,146,0,48,160,140, -48,131,0,0,0,30,144,92,12,97,161,146,0,48,160,140,32,132,0,0,76,97,161, -146,164,245,255,9,0,30,128,92,220,245,255,9,255,15,128,140,172,245,255, -9,1,30,128,92,220,245,255,8,0,48,160,144,64,244,0,0,0,48,168,140,16,0,173, -222,0,16,173,146,220,55,0,9,1,30,128,92,4,56,0,8,0,48,160,144,64,244,0, -0,0,48,168,140,17,0,173,222,0,16,173,146,188,55,0,9,1,30,128,92,228,55, -0,8,0,48,160,144,64,244,0,0,0,48,168,140,18,0,173,222,0,16,173,146,156, -55,0,9,1,30,128,92,196,55,0,8,0,48,160,144,64,244,0,0,0,48,168,140,19,0, -173,222,0,16,173,146,124,55,0,9,1,30,128,92,164,55,0,8,0,48,240,140,200, -135,0,0,30,22,136,92,0,0,240,140,255,0,160,140,144,0,133,88,0,48,128,146, -8,28,0,80,0,80,4,132,0,0,0,0,0,0,0,10,0,0,0,0,136,25,176,88,144,160,5,90, -0,0,160,140,0,30,168,92,58,0,0,18,14,128,133,49,26,32,4,58,84,0,0,8,137, -25,176,88,62,128,133,58,72,0,0,8,0,0,0,0,0,48,160,140,130,184,97,202,0, -48,168,140,118,116,210,62,48,0,0,8,0,0,0,0,0,48,160,140,222,153,139,252, -0,48,168,140,59,93,202,62,24,0,0,8,0,0,0,0,0,48,160,140,216,182,122,157, -0,48,168,140,98,194,199,62,20,22,128,93,0,0,144,140,0,48,152,140,132,215, -119,65,80,103,0,9,220,88,0,9,255,0,176,140,144,128,133,88,0,48,128,146, -8,28,0,80,0,0,0,10,0,0,0,0,0,48,240,140,160,136,0,0,30,22,128,92,0,0,240, -140,0,48,160,144,4,28,0,80,0,48,240,146,76,82,0,0,1,14,165,88,0,48,160, -146,4,28,0,80,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,160,144, -76,82,0,0,10,32,5,61,132,54,0,9,0,48,168,144,4,28,0,80,137,73,165,88,0, -48,160,146,4,28,0,80,0,48,160,136,4,28,0,80,22,32,85,48,9,222,176,89,149, -131,165,88,0,48,160,146,4,28,0,80,0,48,160,144,68,82,0,0,20,80,160,89,0, -48,160,146,68,82,0,0,0,0,0,10,0,0,0,0,0,0,0,0,30,22,32,92,0,48,128,144, -84,82,0,0,6,222,136,89,0,54,0,9,0,48,168,144,0,0,0,16,210,0,184,140,149, -192,165,88,128,9,173,88,0,48,168,146,0,0,0,16,0,48,160,144,84,82,0,0,20, -16,175,89,0,48,168,146,68,244,0,0,0,48,160,144,84,82,0,0,32,32,173,140, -0,48,168,146,72,244,0,0,0,48,160,144,84,82,0,0,48,32,173,140,0,48,168,146, -64,244,0,0,0,48,160,144,84,82,0,0,44,32,173,140,0,48,168,146,76,244,0,0, -2,30,160,92,0,48,160,146,80,244,0,0,0,48,160,144,84,82,0,0,0,48,168,140, -0,184,2,0,40,32,173,146,0,48,160,144,84,82,0,0,0,48,168,140,96,244,0,0, -36,32,173,146,0,48,160,144,84,82,0,0,0,48,168,140,1,0,3,0,52,32,173,146, -0,48,160,144,84,82,0,0,0,48,168,144,88,82,0,0,16,96,181,144,16,142,173, -89,56,32,173,146,0,0,0,10,0,0,0,0,0,0,0,0,16,72,8,89,30,22,32,92,0,48,160, -144,88,82,0,0,0,48,168,140,237,254,17,206,8,32,173,146,0,48,160,144,64, -244,0,0,0,16,173,144,1,73,181,89,0,16,181,146,0,48,160,144,84,82,0,0,64, -32,173,144,127,0,184,140,149,192,165,88,148,48,0,90,186,0,0,18,148,112, -0,90,10,0,0,18,180,0,0,8,0,48,128,144,84,82,0,0,0,10,0,9,64,224,135,146, -0,48,160,144,84,82,0,0,64,224,175,144,129,73,181,88,68,32,181,146,0,48, -160,144,84,82,0,0,64,32,173,144,21,22,160,92,0,48,184,140,128,255,255,255, -148,192,173,88,255,0,184,140,149,192,165,88,148,48,0,90,50,0,0,18,0,48, -160,144,40,82,0,0,20,80,168,89,0,48,168,146,40,82,0,0,0,48,168,144,40,82, -0,0,149,192,165,88,136,9,173,88,0,48,168,146,4,0,0,32,0,48,160,144,84,82, -0,0,0,30,168,92,64,32,173,146,64,224,167,144,148,176,0,90,14,0,0,21,0,0, -0,10,0,0,0,0,16,0,0,8,0,0,0,0,8,0,0,8,0,0,0,0,20,255,255,8,0,0,0,0,0,0, -0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,72,8,89,30,22,160,92,0,48,168,144,68,12, -0,80,128,73,181,88,0,48,176,146,68,12,0,80,0,48,168,144,68,12,0,80,0,78, -181,88,0,48,176,146,68,12,0,80,0,48,168,144,68,12,0,80,2,78,181,88,0,48, -176,146,68,12,0,80,0,30,168,92,0,48,168,146,72,16,0,80,1,30,168,92,0,48, -168,146,68,16,0,80,0,30,168,92,64,224,175,146,64,224,175,144,21,240,0,90, -78,0,0,17,64,224,175,144,21,57,176,140,0,0,0,0,0,160,173,140,15,30,176, -92,0,116,181,146,16,16,0,80,64,224,175,144,21,57,176,140,0,0,0,0,0,160, -173,140,0,30,176,92,0,116,181,146,0,16,0,80,64,224,175,144,21,80,176,89, -64,224,183,146,176,255,255,8,0,48,168,144,4,28,0,80,2,78,181,88,0,48,176, -146,4,28,0,80,0,48,168,144,68,20,0,80,1,78,181,88,0,48,176,146,68,20,0, -80,244,1,168,140,0,48,168,146,48,20,0,80,0,48,168,144,68,20,0,80,135,73, -181,88,0,48,176,146,68,20,0,80,0,48,168,144,68,20,0,80,134,73,181,88,0, -48,176,146,68,20,0,80,0,48,168,144,68,20,0,80,4,78,181,88,0,48,176,146, -68,20,0,80,0,48,168,144,68,20,0,80,5,78,181,88,0,48,176,146,68,20,0,80, -0,0,0,10,16,72,8,89,30,22,32,92,0,0,160,140,0,48,160,146,0,0,0,16,0,48, -168,144,0,0,0,16,210,0,184,140,149,192,165,88,129,9,173,88,0,48,168,146, -0,0,0,16,0,48,160,144,0,0,0,16,208,0,184,140,148,192,173,88,0,48,168,146, -0,0,0,16,0,48,168,144,0,0,0,16,210,0,184,140,149,192,165,88,128,9,173,88, -0,48,168,146,0,0,0,16,0,48,168,144,0,0,0,16,149,192,165,88,40,0,184,140, -148,195,173,88,0,48,168,146,0,0,0,16,10,30,128,92,4,50,0,11,0,48,160,144, -4,28,0,80,131,9,173,88,0,48,168,146,4,28,0,80,31,216,132,89,232,49,0,11, -0,48,168,144,4,28,0,80,11,222,184,89,149,195,165,88,0,48,184,140,56,24, -0,0,148,224,5,90,14,0,0,18,1,30,128,92,24,50,0,9,0,48,160,144,68,12,0,80, -148,48,0,90,14,0,0,18,1,30,128,92,0,50,0,9,0,48,168,144,68,20,0,80,8,222, -184,89,149,195,165,88,148,224,5,90,14,0,0,18,1,30,128,92,224,49,0,9,0,48, -160,144,68,12,0,80,129,9,173,88,0,48,168,146,68,12,0,80,0,48,160,144,68, -12,0,80,128,9,173,88,0,48,168,146,68,12,0,80,0,48,160,144,68,20,0,80,130, -9,173,88,0,48,168,146,68,20,0,80,0,48,160,144,68,20,0,80,128,9,173,88,0, -48,168,146,68,20,0,80,0,48,160,144,68,20,0,80,10,14,173,88,0,48,168,146, -68,20,0,80,0,48,160,144,4,28,0,80,133,9,173,88,0,48,168,146,4,28,0,80,0, -48,160,144,4,28,0,80,132,9,173,88,0,48,168,146,4,28,0,80,0,48,160,144,4, -28,0,80,3,14,173,88,0,48,168,146,4,28,0,80,10,30,128,92,224,48,0,11,0,30, -160,92,64,224,167,146,64,224,167,144,20,240,0,90,110,0,0,17,64,224,167, -144,20,57,168,140,0,0,0,0,0,96,165,140,64,224,175,144,10,78,181,89,0,48, -168,144,80,82,0,0,21,128,181,89,0,52,181,146,0,12,0,144,64,224,167,144, -20,57,168,140,0,0,0,0,0,96,165,140,64,224,175,144,10,78,181,89,0,48,168, -144,80,82,0,0,21,128,181,89,0,52,181,146,16,12,0,144,64,224,167,144,20, -80,168,89,64,224,175,146,144,255,255,8,0,48,160,144,80,244,0,0,148,112, -0,90,110,0,0,21,0,48,160,144,80,82,0,0,0,52,173,140,0,32,0,0,0,48,168,146, -0,20,0,144,0,48,160,144,80,82,0,0,0,52,173,140,0,32,0,0,0,48,168,146,16, -20,0,144,0,48,160,144,80,82,0,0,0,52,173,140,0,16,0,0,0,48,168,146,0,24, -0,144,0,48,160,144,80,82,0,0,0,52,173,140,0,16,0,0,0,48,168,146,16,24,0, -144,24,1,0,8,0,0,0,0,0,30,160,92,64,224,167,146,64,224,167,144,20,240,0, -90,2,1,0,17,64,224,167,144,20,57,168,140,0,0,0,0,0,96,165,140,64,224,183, -144,150,56,168,140,0,0,0,0,21,128,173,89,11,78,173,89,0,116,181,140,0,32, -0,0,0,48,168,144,80,82,0,0,21,128,181,89,0,52,181,146,0,20,0,144,64,224, -167,144,20,57,168,140,0,0,0,0,0,96,165,140,64,224,183,144,150,56,168,140, -0,0,0,0,21,128,173,89,11,78,173,89,0,116,181,140,0,32,0,0,0,48,168,144, -80,82,0,0,21,128,181,89,0,52,181,146,16,20,0,144,64,224,167,144,20,57,168, -140,0,0,0,0,0,96,165,140,64,224,175,144,10,78,181,89,0,180,173,140,0,16, -0,0,0,48,176,144,80,82,0,0,22,64,173,89,0,52,173,146,0,24,0,144,64,224, -167,144,20,57,168,140,0,0,0,0,0,96,165,140,64,224,175,144,10,78,181,89, -0,180,173,140,0,16,0,0,0,48,176,144,80,82,0,0,22,64,173,89,0,52,173,146, -16,24,0,144,64,224,167,144,20,80,168,89,64,224,175,146,0,255,255,8,0,0, -0,0,1,30,160,92,0,48,160,146,68,16,0,80,0,30,160,92,64,224,167,146,64,224, -167,144,20,240,0,90,78,0,0,17,64,224,167,144,20,57,168,140,0,0,0,0,0,96, -165,140,15,30,168,92,0,52,173,146,16,16,0,80,64,224,167,144,20,57,168,140, -0,0,0,0,0,96,165,140,0,30,168,92,0,52,173,146,0,16,0,80,64,224,167,144, -20,80,168,89,64,224,175,146,176,255,255,8,0,48,160,144,68,12,0,80,1,14, -173,88,0,48,168,146,68,12,0,80,0,48,160,144,68,12,0,80,0,14,173,88,0,48, -168,146,68,12,0,80,0,48,160,144,68,20,0,80,2,14,173,88,0,48,168,146,68, -20,0,80,0,48,160,144,68,20,0,80,0,14,173,88,0,48,168,146,68,20,0,80,0,48, -160,144,68,20,0,80,138,9,173,88,0,48,168,146,68,20,0,80,0,48,160,144,4, -28,0,80,5,14,173,88,0,48,168,146,4,28,0,80,0,48,160,144,4,28,0,80,4,14, -173,88,0,48,168,146,4,28,0,80,0,48,160,144,68,20,0,80,147,9,173,88,0,48, -168,146,68,20,0,80,0,30,128,92,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0, -0,30,22,160,92,0,48,168,128,80,243,0,0,0,48,168,146,68,16,0,80,0,30,168, -92,0,48,168,146,0,16,0,80,1,30,168,92,0,48,168,146,16,16,0,80,0,0,0,10, -24,22,40,92,16,72,8,89,0,116,200,146,240,255,255,255,0,116,208,154,248, -255,255,255,0,16,164,144,0,48,232,140,0,255,0,0,0,16,172,144,148,64,167, -88,8,78,239,89,4,32,180,144,136,13,141,89,149,64,175,88,144,77,149,89,42, -96,36,58,38,96,44,58,10,30,128,92,5,22,192,92,0,116,200,144,240,255,255, -255,0,116,208,152,248,255,255,255,0,0,0,10,0,0,0,0,10,160,4,58,220,191, -12,61,0,48,160,144,100,180,3,0,210,31,181,52,0,48,160,144,96,180,3,0,198, -31,181,49,0,48,160,144,224,193,3,0,22,157,173,140,21,30,37,140,4,32,161, -144,172,63,69,58,138,96,36,58,14,96,36,60,18,96,4,58,156,255,255,8,138, -96,44,58,148,255,255,8,8,32,164,144,31,88,236,89,157,5,165,112,72,32,161, -146,14,32,5,61,1,30,232,92,72,32,233,146,4,32,161,144,98,32,69,61,8,32, -137,144,72,32,161,144,38,0,141,60,145,92,148,140,18,58,144,140,0,0,0,0, -4,22,128,92,2,0,152,140,116,231,255,9,8,32,241,146,24,32,241,146,2,30,128, -92,5,22,192,92,0,116,200,144,240,255,255,255,0,116,208,152,248,255,255, -255,0,0,0,10,0,0,0,0,31,88,187,89,4,0,128,140,16,0,0,8,0,0,0,0,31,88,188, -89,0,0,128,140,18,160,4,58,134,160,12,58,0,255,255,8,0,0,0,0,0,48,160,144, -176,242,0,0,240,62,5,58,0,48,160,144,48,243,0,0,48,32,169,140,20,22,48, -92,0,48,56,140,48,104,0,0,0,80,165,146,4,96,61,146,0,48,160,144,132,242, -0,0,151,5,165,116,32,32,161,146,0,48,160,144,180,242,0,0,151,5,165,116, -32,32,177,140,0,144,69,144,20,22,72,92,151,0,170,112,151,0,189,112,4,160, -165,146,16,65,173,89,0,80,85,140,23,22,88,92,0,144,69,146,120,0,0,8,0,0, -0,0,0,48,160,144,16,243,0,0,120,62,5,58,0,48,160,144,52,243,0,0,48,32,169, -140,20,22,192,92,0,48,200,140,80,107,0,0,0,80,165,146,4,96,205,146,0,48, -160,144,228,242,0,0,151,5,165,116,32,32,161,146,0,48,160,144,20,243,0,0, -151,5,165,116,32,32,177,140,0,144,101,144,20,22,104,92,151,0,171,112,151, -0,189,112,4,160,165,146,16,65,173,89,0,80,117,140,23,22,120,92,0,144,101, -146,8,160,173,146,12,160,189,146,17,22,208,92,20,32,145,146,8,30,216,92, -0,16,137,146,2,30,128,92,4,32,217,146,5,22,192,92,0,116,200,144,240,255, -255,255,0,116,208,152,248,255,255,255,0,0,0,10,4,32,180,144,0,48,160,144, -100,180,3,0,42,0,181,52,0,48,160,144,96,180,3,0,30,0,181,49,0,48,160,144, -224,193,3,0,22,157,173,140,21,62,165,144,4,0,0,0,18,32,77,61,10,30,128, -92,0,0,0,10,0,0,0,0,0,48,168,144,224,193,3,0,22,157,165,140,20,94,37,140, -8,32,137,144,22,96,4,59,4,22,128,92,0,0,144,140,8,30,152,92,156,229,255, -9,4,22,128,92,80,0,136,140,224,42,0,9,9,30,184,92,4,32,185,146,159,25,184, -88,2,0,128,140,56,32,185,146,0,0,0,10,0,0,0,0,96,32,164,144,0,48,160,146, -116,180,3,0,96,32,164,144,148,57,160,140,32,0,0,0,0,48,160,146,120,180, -3,0,0,48,160,128,120,180,3,0,16,22,96,92,64,32,92,140,255,0,104,140,148, -208,167,88,148,64,163,88,14,32,5,58,8,30,128,92,0,0,0,10,0,48,128,144,120, -180,3,0,208,33,0,9,0,48,128,146,52,242,0,0,14,32,4,61,8,30,128,92,0,0,0, -10,28,224,162,144,148,57,160,140,32,0,0,0,0,48,160,146,112,180,3,0,0,48, -160,128,112,180,3,0,148,208,167,88,148,64,163,88,14,32,5,58,8,30,128,92, -0,0,0,10,24,224,162,144,148,208,160,88,148,64,163,88,14,32,5,58,8,30,128, -92,0,0,0,10,16,224,170,144,20,224,74,144,24,224,82,144,24,224,146,144,24, -224,154,144,48,224,234,144,56,224,34,144,64,224,42,144,72,224,50,144,80, -224,58,144,88,224,66,144,0,48,176,144,120,180,3,0,96,224,138,144,0,48,160, -144,112,180,3,0,104,224,130,144,12,224,186,144,22,16,178,89,150,64,178, -112,8,32,165,140,148,128,162,112,21,93,173,140,23,221,189,140,149,157,173, -140,21,0,173,89,18,93,149,140,19,157,156,140,157,221,236,140,132,93,39, -140,133,29,41,140,134,93,49,140,135,157,57,140,136,221,65,140,145,29,138, -140,144,93,132,140,0,48,104,140,0,192,2,0,23,30,188,140,14,64,187,62,8, -30,128,92,0,0,0,10,12,22,128,92,164,0,0,9,18,32,68,61,8,30,128,92,0,0,0, -10,0,0,0,0,12,22,128,92,28,1,0,9,18,32,68,61,8,30,128,92,0,0,0,10,0,0,0, -0,12,22,128,92,164,1,0,9,18,32,68,61,8,30,128,92,0,0,0,10,0,0,0,0,12,22, -128,92,140,216,255,9,18,32,68,61,8,30,128,92,0,0,0,10,0,0,0,0,24,224,130, -144,0,48,136,144,112,180,3,0,236,222,255,9,18,32,68,61,8,30,128,92,0,0, -0,10,0,0,0,0,64,32,131,140,196,15,0,9,18,32,68,61,8,30,128,92,0,0,0,10, -0,0,0,0,0,30,128,92,76,233,255,9,2,30,128,92,0,0,0,10,16,22,32,92,80,32, -132,144,0,48,128,146,152,180,3,0,5,14,132,89,12,32,0,9,0,48,128,146,56, -242,0,0,18,32,4,61,8,30,128,92,0,0,0,10,0,0,0,0,0,48,184,144,56,242,0,0, -0,16,185,146,0,48,168,144,152,180,3,0,0,30,176,92,0,48,184,146,64,242,0, -0,5,78,165,89,23,60,165,140,224,255,255,255,0,48,160,146,60,242,0,0,34, -96,5,59,23,22,168,92,0,80,245,146,0,48,160,144,152,180,3,0,32,96,173,140, -22,80,176,89,236,31,181,60,2,30,128,92,0,0,0,10,0,0,0,0,88,32,36,144,16, -22,40,92,132,57,128,140,0,0,0,0,128,31,0,9,0,48,128,146,140,180,3,0,14, -32,4,61,8,30,128,92,0,0,0,10,0,48,176,144,140,180,3,0,0,30,168,92,132,48, -0,90,8,96,177,146,0,48,176,146,148,180,3,0,132,189,165,140,248,255,255, -255,0,48,160,146,144,180,3,0,62,0,0,22,0,47,1,90,0,144,165,140,24,0,0,16, -1,30,168,92,149,32,1,90,0,144,245,146,22,16,162,89,30,0,0,19,0,16,245,146, -21,144,168,89,8,32,245,146,149,32,1,90,16,32,165,140,236,255,255,20,2,30, -128,92,0,0,0,10,0,0,0,0,0,0,0,0,84,32,36,144,16,22,40,92,132,57,128,140, -0,0,0,0,224,30,0,9,0,48,128,146,128,180,3,0,14,32,4,61,8,30,128,92,0,0, -0,10,0,48,176,144,128,180,3,0,0,30,168,92,132,48,0,90,4,96,177,146,0,48, -176,146,136,180,3,0,132,189,165,140,248,255,255,255,0,48,160,146,132,180, -3,0,62,0,0,22,0,47,1,90,0,144,165,140,24,0,0,16,1,30,168,92,149,32,1,90, -0,144,245,146,22,16,162,89,30,0,0,19,0,16,245,146,21,144,168,89,8,32,245, -146,149,32,1,90,16,32,165,140,236,255,255,20,2,30,128,92,0,0,0,10,0,0,0, -0,0,0,0,0,16,22,32,92,145,57,128,140,0,0,0,0,17,22,40,92,64,30,0,9,28,32, -129,146,18,32,4,61,8,30,128,92,0,0,0,10,0,0,0,0,28,32,185,144,32,32,169, -140,0,30,176,92,133,48,0,90,133,253,165,140,248,255,255,255,0,80,189,146, -4,96,165,146,62,0,0,22,0,111,1,90,0,208,165,140,24,0,0,16,1,30,176,92,150, -96,1,90,0,208,245,146,23,16,162,89,30,0,0,19,0,16,245,146,22,144,176,89, -8,32,245,146,150,96,1,90,16,32,165,140,236,255,255,20,2,30,128,92,0,0,0, -10,0,0,0,0,80,96,8,140,0,116,192,178,240,255,255,255,0,30,88,92,0,48,192, -140,32,20,0,80,0,48,24,140,252,4,0,96,0,48,200,140,132,8,0,64,0,48,208, -140,255,63,0,0,1,25,216,89,0,16,166,144,222,44,5,58,8,206,114,89,0,180, -163,140,128,8,0,64,0,16,101,144,0,80,166,144,142,137,238,88,148,64,79,88, -0,48,232,140,255,255,255,0,4,12,171,89,149,64,167,88,16,12,165,89,148,44, -5,61,0,48,160,144,96,180,3,0,8,76,239,89,149,64,175,88,128,12,173,49,0, -48,160,144,224,193,3,0,21,93,173,140,21,30,45,140,4,96,161,144,0,80,169, -144,46,32,77,61,11,22,128,92,0,80,138,140,64,16,0,11,0,48,160,144,164,243, -0,0,20,80,160,89,0,48,160,146,164,243,0,0,76,12,0,8,0,0,0,0,140,144,163, -88,2,12,165,89,10,32,21,61,44,108,5,61,28,96,81,144,24,96,65,144,8,96,49, -144,78,100,37,58,18,96,37,60,142,105,5,58,16,12,0,8,0,0,0,0,8,108,45,61, -246,32,2,61,106,160,1,61,5,22,128,92,0,16,139,140,116,220,255,9,172,43, -4,58,48,96,161,144,5,22,128,92,0,16,5,134,144,112,0,90,0,16,84,140,50,0, -0,21,0,48,160,144,248,243,0,0,11,22,128,92,9,0,165,89,0,80,138,140,0,48, -160,146,248,243,0,0,160,15,0,11,12,96,129,144,16,221,255,9,116,11,0,8,32, -96,161,144,68,96,217,146,140,0,0,8,0,0,0,0,86,5,232,140,62,64,55,54,0,48, -160,144,252,243,0,0,11,22,128,92,1,32,165,140,9,22,136,92,0,48,160,146, -252,243,0,0,92,15,0,11,5,22,128,92,0,144,137,140,0,30,144,92,8,0,152,140, -112,223,255,9,36,11,0,8,52,96,161,144,5,22,128,92,0,16,5,134,144,112,0, -90,0,16,84,140,46,0,0,21,11,22,128,92,0,80,138,140,32,15,0,11,5,22,128, -92,0,144,137,140,0,30,144,92,8,0,152,140,52,223,255,9,232,10,0,8,0,0,0, -0,36,96,161,144,24,96,161,146,86,5,232,140,126,64,55,54,0,48,160,144,252, -243,0,0,11,22,128,92,1,32,165,140,9,22,136,92,0,48,160,146,252,243,0,0, -212,14,0,11,5,22,128,92,0,144,137,140,0,30,144,92,8,0,152,140,232,222,255, -9,156,10,0,8,11,22,128,92,0,80,138,140,176,14,0,11,24,0,0,8,11,22,128,92, -0,80,138,140,160,14,0,11,12,96,129,144,16,220,255,9,0,48,160,144,248,243, -0,0,9,0,165,89,0,48,160,146,248,243,0,0,36,1,0,8,0,0,0,0,42,33,11,48,26, -97,2,59,0,180,35,140,112,4,0,96,0,180,67,140,120,4,0,96,0,180,59,140,64, -4,0,64,68,96,161,144,0,48,80,146,84,0,0,32,10,30,232,92,0,48,232,146,96, -0,0,32,0,48,160,146,64,20,0,80,0,16,161,176,0,16,161,176,0,16,162,152,0, -208,161,152,64,224,167,154,0,48,160,144,64,20,0,80,6,80,48,89,0,48,232, -140,123,221,4,199,64,224,151,136,102,64,167,58,0,48,168,144,8,244,0,0,134, -156,161,140,20,58,160,140,0,0,0,0,18,1,165,89,8,9,165,89,47,0,232,140,21, -80,168,89,20,96,7,90,0,48,168,146,8,244,0,0,26,0,0,22,0,48,160,144,252, -243,0,0,20,80,160,89,0,48,160,146,252,243,0,0,5,22,128,92,0,144,137,140, -0,30,144,92,8,0,152,140,216,221,255,9,20,0,0,8,5,22,128,92,0,144,137,140, -2,30,152,92,196,221,255,9,129,75,74,90,54,0,0,18,5,22,128,92,68,96,217, -146,12,22,136,92,28,218,255,9,0,30,48,92,198,62,4,58,48,96,161,144,5,22, -128,92,0,16,5,134,144,112,0,90,0,16,84,140,190,254,255,18,8,127,2,60,8, -96,241,146,24,96,241,146,120,9,0,8,24,96,137,144,0,180,35,140,112,4,0,96, -86,64,76,62,11,22,128,92,0,144,146,140,68,96,153,140,92,10,0,9,24,96,161, -144,8,96,169,144,52,96,177,144,21,0,173,89,0,80,129,140,8,96,169,146,20, -65,74,89,0,144,5,134,144,112,0,90,0,16,84,140,202,8,0,18,36,96,161,144, -137,32,5,90,24,96,161,146,20,22,136,92,180,255,255,17,68,96,161,144,0,48, -160,146,64,20,0,80,8,96,161,144,24,96,169,144,137,48,0,90,9,0,165,89,9, -65,173,89,8,96,161,146,24,96,169,146,250,0,0,22,137,176,2,90,0,80,130,140, -10,0,0,22,10,30,128,92,144,28,164,140,144,28,172,140,20,57,160,140,0,0, -0,0,0,48,80,146,84,0,0,32,1,9,180,89,0,48,160,146,96,0,0,32,22,112,2,90, -21,158,82,140,178,0,0,17,22,57,160,144,48,157,0,0,0,16,5,132,196,157,0, -0,184,157,0,0,172,157,0,0,160,157,0,0,148,157,0,0,136,157,0,0,124,157,0, -0,112,157,0,0,100,157,0,0,88,157,0,0,0,16,161,176,0,16,161,176,0,16,161, -176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,0, -16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161, -176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,0, -16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161, -176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,0,16,161,176,16, -65,74,89,16,127,2,60,0,48,160,144,64,20,0,80,28,96,81,146,68,96,161,146, -228,7,0,8,0,0,0,0,0,180,123,140,192,4,0,64,137,48,0,90,56,96,33,144,0,30, -104,92,34,5,0,18,0,208,163,144,0,48,232,140,255,255,0,0,148,64,63,88,146, -0,57,61,74,32,2,61,210,5,232,140,22,64,55,54,11,22,128,92,140,16,0,11,44, -2,0,8,0,0,0,0,52,96,161,144,5,22,128,92,0,16,5,134,144,112,0,90,0,16,84, -140,22,0,0,21,11,22,128,92,100,16,0,11,4,2,0,8,0,0,0,0,36,96,65,144,0,48, -80,146,68,0,0,32,0,180,163,140,240,4,0,96,0,16,133,176,0,16,165,176,1,9, -66,89,44,160,82,140,6,80,48,89,138,48,0,90,0,208,160,144,0,208,160,144, -0,208,160,144,196,1,0,18,0,36,161,140,148,128,38,88,120,4,0,8,14,204,161, -89,102,32,13,58,18,32,13,49,254,33,21,58,234,34,29,58,68,4,0,8,11,22,128, -92,244,15,0,11,34,160,1,58,5,22,128,92,0,144,137,140,0,30,144,92,8,0,152, -140,244,218,255,9,28,0,0,8,0,0,0,0,0,48,160,144,208,243,0,0,20,80,160,89, -0,48,160,146,208,243,0,0,159,25,32,88,0,0,64,140,0,30,48,92,20,4,0,8,0, -0,0,0,42,160,1,61,11,22,128,92,160,15,0,11,0,48,160,144,208,243,0,0,159, -25,32,88,1,32,165,140,0,30,64,92,228,3,0,8,0,0,0,0,142,9,161,88,135,32, -5,90,1,160,49,140,46,0,0,18,5,22,128,92,0,144,137,140,0,30,144,92,8,0,152, -140,120,218,255,9,11,22,128,92,0,0,48,140,84,15,0,11,20,2,0,8,0,0,0,0,11, -22,128,92,80,224,143,140,128,14,0,11,0,48,128,144,76,20,0,80,28,12,164, -89,20,253,151,144,76,0,0,0,60,96,169,144,0,48,232,140,0,0,255,0,26,12,36, -89,146,64,167,88,54,0,173,58,0,48,160,144,204,243,0,0,5,22,128,92,0,144, -137,140,0,30,144,92,8,0,152,140,20,80,160,89,0,0,48,140,0,48,160,146,204, -243,0,0,0,218,255,9,168,1,0,8,146,208,160,88,44,0,232,140,20,57,160,144, -96,82,0,0,134,64,175,112,0,48,232,140,255,255,0,0,146,64,63,88,4,9,33,89, -7,0,165,89,4,124,173,140,208,255,255,255,58,64,165,58,0,48,160,144,204, -243,0,0,5,22,128,92,0,144,137,140,0,30,144,92,8,0,152,140,20,80,160,89, -0,0,48,140,0,48,160,146,204,243,0,0,156,217,255,9,68,1,0,8,0,0,0,0,66,32, -2,61,48,96,161,144,5,22,128,92,0,16,5,134,144,112,0,90,0,16,84,140,42,0, -0,21,5,22,128,92,0,144,137,140,0,30,144,92,8,0,152,140,100,217,255,9,0, -30,48,92,159,25,32,88,164,2,0,8,0,0,0,0,26,32,1,58,4,208,128,89,2,12,132, -89,0,144,138,140,80,224,151,140,228,221,255,11,5,22,128,92,0,144,137,140, -7,22,144,92,2,0,152,140,204,0,0,8,0,0,0,0,26,160,1,58,11,22,128,92,0,14, -0,11,5,22,128,92,0,144,137,140,168,0,0,8,5,22,128,92,0,16,139,140,112,213, -255,9,38,32,4,61,11,22,128,92,220,13,0,11,0,48,160,144,208,243,0,0,20,80, -160,89,159,25,32,88,36,2,0,8,0,0,0,0,48,96,161,144,5,22,128,92,0,16,5,134, -144,112,0,90,0,16,84,140,46,0,0,21,12,96,129,144,12,214,255,9,11,22,128, -92,156,13,0,11,0,48,160,144,208,243,0,0,20,80,160,89,159,25,32,88,228,1, -0,8,0,0,0,0,0,208,163,144,11,22,128,92,0,48,232,140,0,0,255,0,148,64,167, -88,0,144,138,140,60,96,161,146,60,12,0,9,144,48,0,90,0,16,84,140,42,0,0, -21,5,22,128,92,0,0,136,140,0,30,144,92,8,0,152,140,0,30,48,92,88,216,255, -9,0,30,64,92,159,25,32,88,152,1,0,8,32,96,169,144,0,228,161,140,148,128, -38,88,1,0,48,140,1,73,69,89,128,1,0,8,38,160,1,58,5,22,128,92,0,144,137, -140,0,30,144,92,8,0,152,140,28,216,255,9,0,30,48,92,0,0,64,140,159,25,32, -88,11,22,128,92,80,224,143,140,140,12,0,11,0,48,128,144,76,20,0,80,26,12, -60,89,64,225,1,58,28,12,164,89,20,253,151,144,76,0,0,0,80,224,167,144,0, -48,232,140,0,0,255,0,146,64,175,88,148,64,167,88,40,0,173,61,146,208,160, -88,20,57,176,144,96,82,0,0,0,48,232,140,255,255,0,0,146,64,55,88,8,201, -169,89,6,128,165,89,46,64,165,58,0,48,160,144,204,243,0,0,0,30,48,92,0, -0,64,140,20,80,160,89,159,25,32,88,0,48,160,146,204,243,0,0,212,0,0,8,0, -0,0,0,22,16,162,89,20,193,57,89,0,80,129,140,12,22,136,92,224,211,255,9, -38,32,4,61,0,48,160,144,208,243,0,0,0,30,48,92,0,0,64,140,20,80,160,89, -159,25,32,88,148,0,0,8,0,0,0,0,48,96,161,144,5,22,128,92,0,16,5,134,144, -112,0,90,0,16,84,140,54,0,0,21,0,48,160,144,208,243,0,0,20,80,160,89,0, -48,160,146,208,243,0,0,12,96,129,144,0,30,48,92,0,0,64,140,159,25,32,88, -92,212,255,9,84,0,0,8,0,0,0,0,7,208,128,89,2,12,132,89,0,144,138,140,84, -224,151,140,152,219,255,11,5,22,128,92,1,0,136,140,6,22,144,92,2,0,152, -140,220,214,255,9,0,30,48,92,32,0,0,8,11,22,128,92,180,11,0,11,0,48,160, -144,208,243,0,0,20,80,160,89,0,48,160,146,208,243,0,0,13,80,104,89,232, -90,106,52,8,96,49,146,28,96,81,146,24,96,65,146,56,96,33,146,152,2,0,8, -76,96,161,144,50,0,101,58,42,160,1,59,8,96,137,144,134,156,145,140,18,58, -144,140,0,0,0,0,5,22,128,92,2,0,152,140,116,214,255,9,8,96,241,146,24,96, -241,146,76,96,97,146,98,98,2,59,24,96,161,144,230,32,5,61,8,96,161,144, -134,32,5,61,5,22,128,92,0,16,139,140,184,210,255,9,14,34,4,58,72,96,169, -144,32,96,161,144,26,0,173,62,52,96,161,144,5,22,128,92,0,16,5,134,36,96, -161,144,20,0,0,8,48,96,161,144,5,22,128,92,0,16,5,134,32,96,161,144,24, -96,161,146,16,22,80,92,146,32,12,61,0,48,160,144,184,243,0,0,9,0,165,89, -0,48,160,146,184,243,0,0,12,96,129,144,60,211,255,9,11,22,128,92,0,80,138, -140,184,5,0,11,24,96,241,146,212,1,0,8,0,0,0,0,52,96,161,144,5,22,128,92, -0,16,5,134,144,112,0,90,0,16,84,140,62,0,0,21,0,48,160,144,184,243,0,0, -11,22,128,92,9,0,165,89,0,80,138,140,0,48,160,146,184,243,0,0,116,5,0,11, -8,96,137,144,5,22,128,92,0,0,144,140,2,30,152,92,136,213,255,9,8,96,241, -146,36,96,161,144,24,96,161,146,8,96,177,144,72,96,169,144,9,22,32,92,9, -128,165,89,10,64,165,60,22,65,37,89,24,96,137,144,4,65,74,89,130,64,36, -62,11,22,128,92,0,144,146,140,68,96,153,140,72,2,0,9,24,96,161,144,8,96, -169,144,52,96,177,144,21,0,173,89,0,80,129,140,8,96,169,146,20,1,33,89, -0,144,5,134,144,112,0,90,0,16,84,140,54,0,0,21,8,96,137,144,5,22,128,92, -0,0,144,140,8,30,152,92,8,213,255,9,11,22,128,92,0,16,137,140,212,4,0,11, -24,96,241,146,8,96,241,146,16,0,0,8,0,0,0,0,36,96,161,144,24,96,161,146, -24,96,137,144,136,95,36,57,30,32,1,58,11,22,128,92,0,16,137,140,10,22,144, -92,68,96,153,140,196,1,0,9,16,22,80,92,8,96,161,144,72,96,169,144,4,0,141, -89,8,96,137,146,46,64,141,61,145,92,148,140,18,58,144,140,0,0,0,0,5,22, -128,92,2,0,152,140,148,212,255,9,8,96,241,146,24,96,241,146,24,0,0,8,0, -0,0,0,24,96,161,144,28,96,81,146,4,1,165,89,24,96,161,146,16,126,2,60,104, -0,0,8,8,96,137,144,5,22,128,92,0,0,144,140,8,30,152,92,88,212,255,9,11, -22,128,92,0,80,138,140,36,4,0,11,24,96,241,146,8,96,241,146,60,0,0,8,0, -0,0,0,0,48,160,144,184,243,0,0,11,22,128,92,9,0,165,89,0,80,138,140,0,48, -160,146,184,243,0,0,244,3,0,11,20,0,0,8,0,0,0,0,11,22,128,92,0,80,138,140, -224,3,0,11,0,16,166,144,48,51,5,61,11,80,88,89,11,240,0,90,4,32,198,140, -0,225,24,140,0,97,206,140,12,243,255,22,0,116,192,176,240,255,255,255,0, -0,0,10,0,0,0,0,0,0,0,0,12,32,36,144,4,29,129,140,16,58,128,140,0,0,0,0, -112,16,0,9,0,48,128,146,224,193,3,0,14,32,4,61,8,30,128,92,0,0,0,10,0,48, -128,144,224,193,3,0,4,29,41,140,5,58,40,140,0,0,0,0,5,22,136,92,224,24, -0,9,1,9,161,89,0,48,240,146,100,180,3,0,0,48,160,146,96,180,3,0,110,32, -1,59,0,47,1,90,0,0,176,140,40,0,0,16,0,48,168,144,224,193,3,0,80,0,176, -140,150,96,1,90,9,0,184,140,4,96,189,146,159,25,184,88,56,96,189,146,62, -0,0,19,9,30,144,92,159,25,152,88,0,48,168,144,224,193,3,0,22,64,165,89, -4,32,149,146,56,32,157,146,21,188,165,140,80,0,0,0,160,160,181,140,150, -96,1,90,4,32,149,146,56,32,157,146,212,255,255,20,2,30,128,92,0,0,0,10, -0,0,0,0,0,208,172,144,17,58,160,140,0,0,0,0,17,57,136,140,0,0,0,0,17,1, -237,89,127,0,64,140,29,32,2,90,0,48,168,146,64,20,0,80,190,0,0,22,8,14, -164,89,0,52,141,140,112,4,0,96,135,25,72,88,127,0,80,140,0,48,144,146,84, -0,0,32,0,48,72,146,96,0,0,32,0,80,164,176,0,80,164,176,0,80,164,176,0,80, -164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176, -0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164, -176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176,0, -80,164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164, -176,0,80,164,176,0,80,164,176,0,80,164,176,0,116,239,140,128,255,255,255, -0,162,148,140,29,160,2,90,0,80,164,176,0,80,164,176,0,80,164,176,96,255, -255,17,63,0,64,140,114,0,234,54,0,48,144,146,84,0,0,32,134,25,64,88,0,48, -64,146,96,0,0,32,8,14,164,89,0,52,165,140,112,4,0,96,0,16,37,176,0,16,37, -176,0,16,37,176,0,16,37,176,0,16,37,176,0,16,37,176,0,16,37,176,0,16,37, -176,0,16,37,176,0,16,37,176,0,16,37,176,0,16,37,176,0,16,37,176,0,161,148, -140,0,116,239,140,192,255,255,255,0,16,37,176,0,16,37,176,0,16,165,176, -82,96,255,51,0,48,144,146,84,0,0,32,31,88,64,89,0,48,64,146,96,0,0,32,8, -14,164,89,0,52,165,140,112,4,0,96,0,16,37,176,0,16,37,176,0,16,37,176,0, -16,37,176,0,16,37,176,128,160,148,140,0,116,239,140,224,255,255,255,0,16, -37,176,0,16,37,176,0,16,165,176,58,96,191,51,0,48,144,146,80,0,0,32,8,14, -164,89,0,52,165,140,112,4,0,96,0,16,37,176,0,16,37,176,0,16,37,176,96,160, -148,140,24,73,239,89,0,16,37,176,0,16,37,176,0,16,165,176,46,96,95,51,8, -14,164,89,0,48,144,146,72,0,0,32,0,52,165,140,112,4,0,96,48,160,148,140, -12,73,239,89,0,16,37,176,0,16,37,176,0,16,165,176,46,96,31,51,8,14,164, -89,0,52,141,140,112,4,0,96,0,48,144,146,64,0,0,32,4,73,239,89,16,160,148, -140,29,240,0,90,0,80,164,176,232,255,255,17,46,96,7,58,8,14,132,89,0,52, -132,140,124,4,0,96,0,48,144,146,56,0,0,32,1,73,239,89,4,160,148,140,157, -48,0,90,0,16,164,144,232,255,255,21,0,48,160,144,64,20,0,80,18,22,128,92, -0,208,164,146,0,0,0,10,0,0,0,0,0,0,0,0,0,48,240,140,144,169,0,0,30,22,144, -92,0,0,240,140,8,78,140,89,0,116,140,140,64,4,0,64,0,80,164,176,0,16,164, -178,0,80,164,176,16,16,132,89,0,16,164,178,0,80,164,176,16,16,132,89,0, -16,164,178,0,144,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,240,140,224, -169,0,0,30,22,152,92,0,0,240,140,8,14,132,89,145,48,0,90,0,80,148,140,0, -52,132,140,64,4,0,64,26,0,0,18,0,16,164,176,0,16,164,176,1,137,148,89,0, -16,164,176,240,191,4,61,0,208,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,55, -160,172,140,31,88,76,89,137,69,173,116,1,25,72,89,0,48,72,146,64,12,0,80, -0,48,160,144,0,244,0,0,8,206,236,89,0,48,184,144,240,243,0,0,17,22,56,92, -0,144,53,140,20,80,160,89,145,48,0,90,0,48,160,146,0,244,0,0,21,192,173, -89,0,48,168,146,240,243,0,0,0,116,135,146,64,8,0,64,0,116,71,140,64,0,0, -112,0,30,232,92,2,222,87,89,255,0,88,140,146,0,0,22,4,160,161,144,0,144, -41,144,6,16,50,89,1,201,57,89,130,13,37,89,118,32,1,58,29,129,170,89,4, -96,5,90,0,16,161,140,10,0,0,22,21,22,160,92,29,0,237,89,0,48,40,146,48, -0,0,32,20,1,33,89,0,48,160,146,96,0,0,32,29,240,2,90,20,93,41,140,202,255, -255,22,0,48,160,128,8,0,0,16,148,192,138,88,34,96,92,51,0,16,162,176,12, -73,140,89,0,16,162,176,17,240,2,90,0,16,162,176,12,73,239,89,232,255,255, -17,212,127,95,52,148,255,255,8,0,0,0,0,120,255,1,60,255,0,72,140,0,48,160, -128,8,0,0,16,148,64,162,88,244,95,167,52,18,98,95,52,29,57,160,144,16,171, -0,0,0,16,5,132,96,171,0,0,208,172,0,0,176,172,0,0,136,172,0,0,104,172,0, -0,64,172,0,0,24,172,0,0,240,171,0,0,200,171,0,0,160,171,0,0,128,171,0,0, -64,171,0,0,0,16,162,176,0,16,162,176,0,16,162,152,8,206,164,89,0,16,170, -144,0,52,165,140,64,0,0,64,0,16,245,146,8,206,164,89,129,9,132,88,0,52, -133,146,64,8,0,64,0,52,165,140,64,0,0,64,0,16,245,146,112,1,0,8,8,206,164, -89,129,9,132,88,0,52,133,146,64,8,0,64,0,16,162,176,0,16,162,176,0,16,162, -152,116,1,0,8,8,206,164,89,129,9,132,88,0,52,133,146,64,8,0,64,0,16,34, -176,0,52,165,140,64,0,0,64,0,16,34,176,0,16,170,144,72,1,0,8,8,206,164, -89,129,9,132,88,0,52,133,146,64,8,0,64,0,16,34,176,0,52,165,140,64,0,0, -64,0,16,34,176,32,1,0,8,0,0,0,0,8,206,164,89,129,9,132,88,0,52,133,146, -64,8,0,64,0,16,34,176,0,16,178,152,0,16,170,144,0,52,165,140,64,0,0,64, -240,0,0,8,8,206,164,89,129,9,132,88,0,52,133,146,64,8,0,64,0,16,34,176, -0,16,178,152,0,52,165,140,64,0,0,64,200,0,0,8,0,0,0,0,8,206,164,89,129, -9,132,88,0,52,133,146,64,8,0,64,0,16,34,176,0,16,170,144,0,52,165,140,64, -0,0,64,156,0,0,8,0,0,0,0,8,206,164,89,129,9,132,88,0,52,133,146,64,8,0, -64,0,16,34,176,0,52,165,140,64,0,0,64,116,0,0,8,8,206,164,89,129,9,132, -88,0,52,133,146,64,8,0,64,0,16,178,152,0,16,170,144,0,52,165,140,64,0,0, -64,76,0,0,8,0,0,0,0,8,206,164,89,129,9,132,88,0,52,133,146,64,8,0,64,0, -16,178,152,0,52,165,140,64,0,0,64,36,0,0,8,8,206,164,89,129,9,132,88,0, -52,133,146,64,8,0,64,0,16,170,144,0,52,165,140,64,0,0,64,0,16,245,146,0, -16,245,146,0,16,245,146,0,16,245,146,0,16,245,146,0,16,245,146,0,16,245, -146,0,16,245,146,0,16,245,146,8,206,156,89,0,244,156,140,64,0,0,64,0,208, -148,146,0,48,160,144,64,12,0,80,20,21,160,88,0,208,164,146,0,0,0,10,0,0, -0,0,0,0,0,0,0,0,0,0,0,48,240,140,136,173,0,0,30,22,144,92,0,0,240,140,1, -9,132,89,1,25,168,89,42,64,133,58,8,78,140,89,0,116,164,140,80,8,0,64,0, -116,140,140,96,8,0,64,0,16,245,146,1,9,132,89,0,80,244,146,244,95,133,61, -0,144,4,132,0,0,0,0,0,0,0,10,0,0,0,0,0,48,136,146,64,0,0,32,8,14,172,89, -0,116,181,140,240,4,0,96,0,144,37,176,17,16,164,89,0,48,160,146,64,0,0, -32,0,144,37,176,32,96,132,140,0,48,128,146,56,0,0,32,0,116,173,140,252, -4,0,96,16,16,129,89,0,80,165,144,0,48,128,146,56,0,0,32,16,16,129,89,0, -80,165,144,0,0,0,10,0,0,0,0,0,0,0,0,0,48,240,140,64,174,0,0,30,22,144,92, -0,0,240,140,8,14,132,89,0,52,132,140,192,4,0,64,0,16,164,144,1,30,176,92, -4,96,172,140,0,80,164,146,0,16,164,144,0,80,165,146,0,16,164,144,22,144, -176,89,150,176,2,90,4,96,165,146,21,16,170,89,228,255,255,22,0,144,4,132, -0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,240,140,160,174,0,0,30,22,144,92, -0,0,240,140,8,14,132,89,0,52,132,140,192,4,0,64,0,16,164,144,1,30,176,92, -4,96,172,140,0,80,164,146,0,16,164,144,0,80,165,146,0,16,164,144,22,144, -176,89,150,176,2,90,4,96,165,146,21,16,170,89,228,255,255,22,0,144,4,132, -0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,240,140,232,174,0,0,30,22,136,92, -0,0,240,140,8,14,132,89,0,52,132,140,192,4,0,64,0,16,164,176,0,16,164,176, -0,16,164,144,0,16,164,144,0,16,164,144,0,80,4,132,0,0,0,0,0,0,0,10,0,0, -0,0,21,22,80,92,48,0,232,140,0,48,184,144,176,243,0,0,157,133,172,116,0, -208,92,140,8,206,156,89,3,160,148,140,21,192,173,89,130,141,68,89,0,48, -168,146,176,243,0,0,0,244,132,146,64,8,0,64,22,22,72,92,148,48,0,90,0,144, -181,152,20,22,96,92,0,0,32,140,0,244,52,140,64,0,0,112,0,30,128,92,130, -205,45,89,0,144,61,140,162,0,0,21,136,48,0,90,2,222,119,89,255,0,24,140, -138,0,0,22,22,96,1,61,9,16,74,89,0,80,162,152,130,77,45,89,0,16,61,140, -4,129,171,89,133,96,5,90,0,80,161,140,10,0,0,22,21,22,160,92,4,0,37,89, -20,1,66,89,0,48,56,146,48,0,0,32,20,65,41,89,0,48,160,146,96,0,0,32,132, -240,2,90,20,221,57,140,54,0,0,22,0,48,160,128,8,0,0,16,28,0,0,8,0,144,161, -176,0,144,161,176,0,144,161,176,0,48,160,128,8,0,0,16,12,9,33,89,148,192, -160,88,228,63,93,52,212,63,89,60,128,63,2,60,0,0,0,10,0,0,0,0,136,48,0, -90,2,222,111,89,255,0,120,140,158,0,0,22,22,96,1,61,9,16,74,89,0,80,162, -152,130,77,45,89,0,16,61,140,4,65,171,89,133,96,5,90,0,80,161,140,10,0, -0,22,21,22,160,92,4,0,37,89,20,1,66,89,0,48,56,146,48,0,0,32,20,65,41,89, -0,48,160,146,96,0,0,32,132,240,2,90,20,221,57,140,74,0,0,22,48,0,0,8,0, -0,0,0,0,144,161,176,16,80,128,89,0,144,161,176,144,32,3,90,0,144,161,176, -12,9,33,89,18,0,0,21,10,22,128,93,208,252,255,11,0,30,128,92,0,48,160,128, -8,0,0,16,148,192,163,88,204,63,93,52,240,63,89,60,108,63,2,60,10,22,128, -93,164,252,255,8,0,30,32,92,0,16,36,146,132,73,140,89,16,16,129,89,244, -127,36,62,0,0,0,10,0,0,0,0,0,0,0,0,16,72,8,89,0,116,192,178,240,255,255, -255,18,208,136,89,4,25,216,89,145,192,142,88,51,96,188,140,31,88,219,89, -155,197,189,112,0,80,197,140,0,48,168,144,212,243,0,0,0,48,232,144,192, -243,0,0,18,22,208,92,1,96,173,140,19,22,120,92,0,48,168,146,212,243,0,0, -23,64,191,89,0,48,184,146,192,243,0,0,20,22,24,92,130,77,84,89,0,144,37, -152,22,22,104,92,0,0,232,140,17,16,114,89,2,222,223,89,130,77,73,89,137, -224,6,90,0,80,138,140,10,0,0,22,2,222,143,89,18,208,144,89,4,25,216,89, -146,192,150,88,0,48,184,144,112,82,0,0,17,22,64,92,44,0,216,140,14,224, -6,90,0,48,168,144,116,82,0,0,255,3,216,140,23,80,184,89,151,192,190,88, -0,48,216,140,0,0,255,255,149,192,174,88,0,48,216,140,255,255,255,0,0,48, -32,146,48,0,0,32,149,131,172,88,0,116,173,140,0,0,1,0,149,192,182,88,0, -48,216,140,0,0,255,0,0,48,136,146,96,0,0,32,17,129,82,89,17,29,97,140,17, -65,74,89,0,48,184,146,112,82,0,0,0,48,176,146,116,82,0,0,149,192,206,88, -250,0,0,17,42,160,2,59,13,16,106,89,0,80,163,152,130,77,77,89,0,48,160, -146,48,0,0,32,9,129,82,89,0,48,72,146,96,0,0,32,224,191,2,60,8,206,36,89, -0,52,161,140,64,8,0,64,0,16,133,146,0,48,160,144,112,82,0,0,0,48,176,144, -116,82,0,0,14,222,216,89,148,195,166,88,0,52,169,140,192,0,0,64,0,48,160, -146,76,12,0,80,0,80,181,146,80,206,255,9,0,48,160,128,8,0,0,16,30,32,5, -58,0,52,153,140,192,0,0,112,0,208,164,144,0,48,160,128,8,0,0,16,244,63, -5,61,8,206,163,89,153,131,182,88,44,0,216,140,14,193,174,89,0,52,165,140, -192,0,0,64,2,76,173,89,0,16,181,146,149,48,0,90,0,0,176,140,34,0,0,18,12, -96,5,48,1,30,176,92,12,0,0,8,0,16,245,146,22,144,176,89,0,16,245,146,244, -95,181,52,8,206,163,89,26,142,171,89,0,52,165,140,192,0,0,64,0,16,173,146, -0,116,192,176,240,255,255,255,0,0,0,10,145,112,2,90,2,222,223,89,78,0,0, -17,13,16,106,89,0,80,35,152,8,193,190,89,130,77,73,89,137,224,5,90,0,80, -138,140,10,0,0,22,23,22,136,92,8,64,68,89,17,65,74,89,0,48,32,146,48,0, -0,32,17,129,82,89,0,48,136,146,96,0,0,32,136,112,2,90,17,29,97,140,188, -255,255,22,0,48,184,144,112,82,0,0,8,206,180,89,0,180,173,140,64,8,0,64, -0,80,133,146,0,48,168,144,116,82,0,0,255,0,216,140,143,201,93,88,0,180, -181,140,192,0,0,64,0,48,88,146,76,12,0,80,0,144,173,146,0,48,168,128,8, -0,0,16,149,192,174,88,244,127,77,51,8,206,180,89,0,180,173,140,192,0,0, -112,0,80,37,176,0,80,37,176,148,48,0,90,0,80,165,152,0,180,181,140,192, -0,0,64,0,48,216,140,0,0,0,176,10,9,66,89,0,144,221,146,0,180,115,140,212, -255,255,255,230,1,0,21,14,160,2,61,31,88,219,89,252,193,118,54,82,160,2, -59,22,96,2,61,13,16,106,89,0,80,163,152,130,77,77,89,0,16,101,140,2,222, -223,89,8,193,166,89,137,32,5,90,0,80,138,140,10,0,0,22,20,22,136,92,8,64, -68,89,0,48,96,146,48,0,0,32,17,65,74,89,17,29,99,140,17,129,82,89,0,48, -136,146,96,0,0,32,134,32,82,59,8,206,164,89,0,52,133,140,192,0,0,112,0, -52,141,140,192,0,0,64,0,48,160,128,8,0,0,16,255,0,216,140,84,0,0,8,0,0, -0,0,0,228,162,140,0,48,216,140,255,63,0,0,148,192,94,88,0,48,88,146,76, -12,0,80,0,16,164,176,0,16,164,176,0,16,164,152,0,16,164,144,0,48,216,140, -0,0,0,176,0,80,220,146,0,48,160,128,8,0,0,16,255,0,216,140,11,9,66,89,0, -180,115,140,212,255,255,255,148,192,166,88,176,63,85,52,152,63,82,60,46, -191,2,61,31,88,219,89,36,223,118,49,24,1,0,8,82,160,2,59,22,96,2,61,13, -16,106,89,0,80,163,152,130,77,77,89,0,16,101,140,2,222,223,89,8,193,166, -89,137,32,5,90,0,80,138,140,10,0,0,22,20,22,136,92,8,64,68,89,0,48,96,146, -48,0,0,32,17,65,74,89,17,29,99,140,17,129,82,89,0,48,136,146,96,0,0,32, -162,32,82,59,8,206,163,89,0,52,37,140,192,0,0,112,0,52,53,140,192,0,0,64, -0,48,160,128,8,0,0,16,255,0,216,140,148,192,166,88,118,32,85,51,0,160,41, -140,29,80,232,89,22,192,232,61,24,22,128,92,0,208,139,140,24,248,255,11, -0,30,232,92,0,228,162,140,0,48,216,140,255,63,0,0,148,192,94,88,0,48,88, -146,76,12,0,80,0,16,161,176,0,16,161,176,0,16,161,152,0,16,161,144,0,48, -216,140,0,0,0,176,0,80,217,146,0,48,160,128,8,0,0,16,255,0,216,140,11,9, -66,89,0,180,115,140,212,255,255,255,148,192,166,88,152,63,85,52,124,63, -82,60,18,191,2,61,31,88,219,89,8,223,118,49,29,80,232,89,22,192,232,61, -24,22,128,92,0,208,139,140,156,247,255,11,0,30,232,92,0,228,162,140,0,48, -216,140,255,63,0,0,148,192,166,88,142,9,165,88,0,48,160,146,76,12,0,80, -255,0,216,140,0,48,160,128,8,0,0,16,148,192,166,88,244,31,162,60,0,48,160, -128,8,0,0,16,34,32,5,58,8,206,163,89,0,52,173,140,192,0,0,112,0,80,165, -144,0,48,160,128,8,0,0,16,244,63,5,61,8,206,163,89,153,131,182,88,44,0, -216,140,14,193,174,89,2,76,173,89,0,52,165,140,192,0,0,64,1,73,173,89,1, -25,216,89,0,16,181,146,18,192,174,58,1,73,173,89,0,16,245,146,248,223,174, -61,8,206,163,89,26,142,171,89,0,52,165,140,192,0,0,64,0,16,173,146,26,224, -0,58,29,80,232,89,18,192,232,61,24,22,128,92,0,208,139,140,220,246,255, -11,0,116,192,176,240,255,255,255,0,0,0,10,0,0,0,0,0,48,160,144,124,82,0, -0,16,16,180,89,0,48,184,140,0,192,2,0,0,48,32,144,120,82,0,0,22,0,165,89, -18,192,165,62,0,30,128,92,0,0,0,10,0,0,0,0,0,48,168,144,120,82,0,0,0,48, -160,144,124,82,0,0,4,22,128,92,0,144,141,140,21,188,173,140,0,0,0,0,22, -0,165,89,0,48,168,146,120,82,0,0,0,48,160,146,124,82,0,0,60,8,0,9,4,208, -131,89,16,25,184,89,144,192,133,88,0,32,132,140,0,0,0,10,0,0,0,0,0,48,160, -140,128,82,0,0,20,16,153,89,3,32,149,140,0,48,136,140,0,4,0,136,0,30,128, -92,0,0,232,140,255,0,104,140,135,25,112,88,0,16,173,128,36,96,5,58,0,80, -172,144,0,144,180,128,0,208,188,128,8,76,173,89,149,128,173,88,149,64,171, -88,8,192,173,58,16,80,128,89,8,32,173,128,36,96,5,58,4,96,172,144,8,160, -180,128,8,224,188,128,8,76,173,89,149,128,173,88,149,64,171,88,8,192,173, -58,16,80,128,89,16,32,173,128,36,96,5,58,8,96,172,144,16,160,180,128,16, -224,188,128,8,76,173,89,149,128,173,88,149,64,171,88,8,192,173,58,16,80, -128,89,29,208,232,89,157,160,3,90,12,96,140,140,20,16,166,89,24,224,156, -140,18,16,150,89,112,255,255,22,14,32,4,58,0,30,128,92,0,0,0,10,0,30,80, -92,0,0,72,140,0,30,32,92,0,0,40,140,0,30,48,92,52,1,0,9,0,30,64,92,0,0, -56,140,0,48,64,154,128,243,0,0,0,48,32,178,112,243,0,0,1,30,128,92,0,48, -240,146,136,243,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,48,240,140,152,184,0,0,30, -22,152,92,0,0,240,140,135,25,184,88,14,192,133,54,0,30,128,92,0,208,4,132, -144,57,168,140,128,82,0,0,0,80,165,128,14,32,5,61,0,30,128,92,0,208,4,132, -2,96,165,128,255,0,184,140,16,57,176,140,0,4,0,136,145,0,141,88,145,192, -141,88,8,78,164,89,146,48,0,90,0,144,165,146,38,0,0,18,0,144,165,144,1, -96,173,128,8,12,165,89,148,64,165,88,148,192,165,88,14,64,164,58,0,30,128, -92,0,208,4,132,1,30,128,92,0,208,4,132,0,0,0,10,0,0,0,0,0,48,240,140,0, -185,0,0,30,22,144,92,0,0,240,140,135,25,176,88,14,128,133,54,0,30,128,92, -0,144,4,132,144,57,168,140,128,82,0,0,0,80,165,128,14,32,5,61,0,30,128, -92,0,144,4,132,16,57,128,140,0,4,0,136,0,16,164,144,1,96,173,128,8,12,165, -89,148,64,165,88,1,0,128,140,0,80,164,130,0,144,4,132,0,0,0,0,0,0,0,10, -0,0,0,0,0,0,0,0,0,0,0,0,16,72,8,89,0,48,160,128,64,84,0,0,1,30,136,92,64, -224,143,130,32,32,5,58,0,48,160,128,66,84,0,0,136,25,136,88,8,14,165,89, -148,64,164,88,0,48,160,146,224,4,0,136,232,3,128,140,160,5,0,11,0,48,160, -128,16,83,0,0,32,32,5,58,0,48,160,144,72,4,0,136,0,48,168,128,17,83,0,0, -8,12,165,89,148,64,165,88,64,224,167,130,0,48,160,128,24,83,0,0,65,224, -183,140,32,32,5,58,0,48,160,144,76,4,0,136,0,48,168,128,25,83,0,0,8,12, -165,89,148,64,165,88,0,144,165,130,65,224,167,128,64,224,175,128,0,48,176, -144,112,243,0,0,0,48,184,128,80,83,0,0,8,14,165,89,148,67,165,88,20,128, -165,89,0,48,160,146,112,243,0,0,32,224,5,58,0,48,160,144,104,4,0,136,0, -48,168,128,81,83,0,0,8,12,165,89,148,64,165,88,64,224,167,130,0,48,160, -128,88,83,0,0,66,224,183,140,32,32,5,58,0,48,160,144,108,4,0,136,0,48,168, -128,89,83,0,0,8,12,165,89,148,64,165,88,0,144,165,130,0,48,160,128,96,83, -0,0,65,224,183,140,32,32,5,58,0,48,160,144,112,4,0,136,0,48,168,128,97, -83,0,0,8,12,165,89,148,64,165,88,0,144,165,130,65,224,167,128,66,224,175, -128,64,224,183,128,0,48,184,144,120,243,0,0,0,48,128,128,104,83,0,0,16, -14,165,89,8,78,173,89,148,67,165,88,148,131,165,88,20,192,165,89,0,48,160, -146,120,243,0,0,32,32,4,58,0,48,160,144,116,4,0,136,0,48,168,128,105,83, -0,0,8,12,165,89,148,64,165,88,64,224,167,130,0,48,160,128,112,83,0,0,66, -224,183,140,32,32,5,58,0,48,160,144,120,4,0,136,0,48,168,128,113,83,0,0, -8,12,165,89,148,64,165,88,0,144,165,130,0,48,160,128,120,83,0,0,65,224, -183,140,32,32,5,58,0,48,160,144,124,4,0,136,0,48,168,128,121,83,0,0,8,12, -165,89,148,64,165,88,0,144,165,130,65,224,167,128,66,224,175,128,64,224, -183,128,0,48,184,144,124,243,0,0,0,48,128,128,64,84,0,0,16,14,165,89,8, -78,173,89,148,67,165,88,148,131,165,88,20,192,165,89,0,48,160,146,124,243, -0,0,32,32,4,58,0,48,160,144,224,4,0,136,0,48,168,128,65,84,0,0,8,12,165, -89,148,64,165,88,64,224,167,130,0,48,160,128,72,84,0,0,65,224,183,140,32, -32,5,58,0,48,160,144,228,4,0,136,0,48,168,128,73,84,0,0,8,12,165,89,148, -64,165,88,0,144,165,130,65,224,167,128,64,224,175,128,0,48,176,144,116, -243,0,0,0,48,184,128,80,84,0,0,8,14,165,89,148,67,165,88,20,128,165,89, -0,48,160,146,116,243,0,0,32,224,5,58,0,48,160,144,232,4,0,136,0,48,168, -128,81,84,0,0,8,12,165,89,148,64,165,88,64,224,167,130,0,48,160,128,88, -84,0,0,65,224,183,140,32,32,5,58,0,48,160,144,236,4,0,136,0,48,168,128, -89,84,0,0,8,12,165,89,148,64,165,88,0,144,165,130,65,224,167,128,64,224, -135,128,0,48,176,144,128,243,0,0,255,0,136,140,0,48,184,128,40,85,0,0,8, -14,165,89,144,64,172,88,148,67,165,88,20,128,165,89,0,48,160,146,128,243, -0,0,32,224,5,58,0,48,160,128,42,85,0,0,144,0,165,88,148,64,164,88,8,14, -165,89,0,48,160,146,84,5,0,136,232,3,128,140,160,2,0,11,0,48,160,128,32, -85,0,0,148,48,0,90,65,224,183,140,32,0,0,18,0,48,160,144,80,5,0,136,0,48, -168,128,33,85,0,0,8,12,165,89,148,64,165,88,0,144,165,130,65,224,167,128, -0,48,168,144,132,243,0,0,0,48,176,128,40,85,0,0,20,64,165,89,65,224,191, -140,0,48,160,146,132,243,0,0,32,160,5,58,0,48,160,144,84,5,0,136,0,48,168, -128,41,85,0,0,8,12,165,89,148,64,165,88,0,208,165,130,65,224,167,128,0, -48,168,144,136,243,0,0,20,64,165,89,0,48,160,146,136,243,0,0,0,0,0,10,0, -0,0,0,0,48,240,140,32,190,0,0,30,22,152,92,0,0,240,140,16,72,8,89,0,16, -164,144,0,16,172,144,0,48,144,140,0,0,255,0,149,128,172,88,255,0,144,140, -0,16,180,144,8,12,189,89,144,77,141,89,151,128,172,88,135,25,144,88,24, -140,133,89,14,128,172,54,0,30,176,92,64,0,0,8,149,57,176,140,128,82,0,0, -0,144,165,128,14,32,5,61,0,30,176,92,40,0,0,8,21,57,160,140,0,4,0,136,0, -16,165,144,1,160,173,128,8,12,165,89,148,64,165,88,1,0,176,140,0,116,160, -130,240,255,255,255,22,160,5,61,0,30,128,92,16,73,8,89,0,208,4,132,0,0, -0,0,16,73,176,89,0,144,165,128,145,0,172,88,255,0,144,140,151,128,188,88, -135,25,144,88,16,1,165,88,148,67,141,88,23,160,4,90,0,144,141,130,80,0, -0,17,151,57,128,140,128,82,0,0,0,16,164,128,64,32,5,58,2,32,172,128,255, -0,144,140,23,57,176,140,0,4,0,136,145,64,173,88,149,128,172,88,8,78,165, -89,0,144,165,146,0,144,165,144,1,32,180,128,1,30,184,92,8,12,165,89,148, -128,165,88,148,128,164,88,10,64,165,58,0,30,184,92,22,224,5,61,0,30,128, -92,16,73,8,89,0,208,4,132,0,0,0,0,1,30,128,92,16,73,8,89,0,208,4,132,0, -0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,160,140,240,193,3,0,20,22,128, -92,0,48,184,140,0,4,0,136,0,48,176,140,128,82,0,0,0,30,136,92,255,0,152, -140,1,25,232,89,135,25,144,88,0,144,173,128,18,96,5,61,0,16,237,146,24, -0,0,8,0,0,0,0,0,208,173,144,8,76,173,89,149,192,172,88,0,16,172,146,8,160, -173,128,14,96,5,61,4,32,237,146,20,0,0,8,4,224,173,144,8,76,173,89,149, -192,172,88,4,32,172,146,16,160,173,128,14,96,5,61,8,32,237,146,20,0,0,8, -8,224,173,144,8,76,173,89,149,192,172,88,8,32,172,146,17,208,136,89,145, -160,4,90,12,32,132,140,20,16,163,89,12,224,189,140,22,16,182,89,132,255, -255,22,0,0,0,10,0,48,240,140,8,191,0,0,30,22,136,92,0,0,240,140,16,22,160, -92,148,48,0,90,1,9,132,89,244,255,255,19,0,80,4,132,0,0,0,0,0,0,0,10,0, -0,0,0,3,30,128,92,188,5,0,8,0,0,0,0,0,0,0,0,17,22,144,92,0,0,136,140,136, -0,0,8,0,0,0,0,1,30,128,92,12,30,0,9,12,32,244,146,0,0,0,10,16,22,48,92, -108,1,0,9,88,30,0,9,12,32,36,144,4,22,160,92,1,9,33,89,38,32,5,59,4,29, -44,140,16,96,161,144,0,16,5,134,4,22,160,92,148,48,0,90,4,73,41,89,1,9, -33,89,232,255,255,17,132,10,0,9,6,22,128,92,92,24,0,8,0,0,0,0,0,0,0,0,160, -255,255,9,76,6,0,9,16,9,0,11,1,30,128,92,192,4,0,8,0,0,0,0,0,0,0,0,0,0, -0,0,144,208,163,88,255,0,152,140,148,192,164,88,148,48,0,90,0,16,180,140, -18,22,184,92,42,0,0,18,38,160,4,58,0,144,141,130,22,80,176,89,150,208,163, -88,148,192,164,88,148,48,0,90,1,201,189,89,10,0,0,18,228,255,5,61,10,224, -5,61,0,0,0,10,58,224,125,51,145,192,164,88,8,14,173,89,149,3,173,88,16, -78,165,89,148,67,165,88,0,144,165,146,4,160,165,146,8,160,165,146,16,201, -189,89,12,160,165,146,23,240,3,90,16,160,181,140,228,255,255,17,26,224, -5,58,1,201,189,89,0,144,141,130,151,48,0,90,1,160,181,140,240,255,255,21, -0,0,0,10,0,0,0,0,0,48,240,140,112,192,0,0,30,22,136,92,0,0,240,140,0,16, -164,144,20,80,160,89,0,16,164,146,0,80,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0, -0,0,0,100,101,102,97,117,108,116,46,112,102,0,0,0,0,0,0,112,114,111,102, -105,108,101,32,99,111,108,108,101,99,116,105,111,110,32,101,114,114,111, -114,46,10,0,0,0,0,0,0,0,48,160,144,136,86,0,0,10,32,5,61,0,0,0,10,0,48, -160,144,200,92,0,0,0,48,48,140,200,92,0,0,0,30,32,92,0,0,64,140,34,32,5, -58,8,160,169,144,6,16,51,89,0,144,161,144,8,80,64,89,148,48,0,90,4,64,37, -89,232,255,255,21,0,48,128,140,128,192,0,0,182,1,136,140,28,25,0,9,144, -48,0,90,0,16,44,140,224,2,0,20,136,13,161,89,0,48,160,130,241,195,3,0,144, -13,169,89,0,48,32,130,240,195,3,0,152,13,161,89,0,48,168,130,242,195,3, -0,0,48,136,140,240,195,3,0,0,48,160,130,243,195,3,0,4,30,144,92,36,27,0, -9,18,32,36,58,158,98,1,57,144,2,0,8,0,0,0,0,0,48,160,144,200,92,0,0,0,48, -48,140,200,92,0,0,162,32,5,58,0,144,161,144,8,160,57,144,0,32,37,140,4, -192,137,89,4,96,4,90,0,16,185,140,66,0,0,19,4,208,128,89,0,208,165,144, -0,208,165,130,23,16,185,89,23,96,4,90,136,13,173,89,144,13,181,89,0,52, -172,130,254,255,255,255,152,13,165,89,0,52,180,130,255,255,255,255,0,16, -164,130,16,16,129,89,204,255,255,20,5,22,128,92,0,16,137,140,7,22,144,92, -152,26,0,9,14,192,129,58,18,98,1,57,4,2,0,8,4,192,145,89,4,160,4,90,0,16, -185,140,18,0,0,19,0,208,245,146,23,16,185,89,248,159,188,52,6,16,51,89, -0,144,161,144,104,63,5,61,0,48,72,144,136,86,0,0,8,80,64,89,136,28,170, -140,2,78,173,89,21,65,74,89,136,93,178,140,0,48,176,146,136,86,0,0,0,116, -85,140,200,92,0,0,0,48,168,128,136,86,0,0,5,22,128,92,0,48,136,140,240, -195,3,0,136,141,165,89,4,0,144,140,0,48,160,130,241,195,3,0,144,141,165, -89,152,141,181,89,0,48,160,130,242,195,3,0,0,48,176,130,243,195,3,0,0,48, -168,130,240,195,3,0,240,25,0,9,14,32,36,58,106,97,1,57,92,1,0,8,0,48,160, -144,200,92,0,0,0,48,48,140,200,92,0,0,0,30,32,92,210,32,5,58,6,16,58,89, -0,244,169,144,252,255,255,255,2,14,162,89,20,65,173,89,0,80,129,140,0,48, -168,130,240,195,3,0,0,48,136,140,240,195,3,0,4,30,144,92,136,77,165,89, -144,77,181,89,0,48,160,130,241,195,3,0,152,77,173,89,0,48,176,130,242,195, -3,0,0,48,168,130,243,195,3,0,120,25,0,9,14,32,36,58,242,96,1,57,228,0,0, -8,136,13,161,89,0,48,160,130,241,195,3,0,5,22,128,92,144,13,169,89,0,48, -32,130,240,195,3,0,152,13,161,89,0,48,168,130,242,195,3,0,0,48,136,140, -240,195,3,0,0,48,160,130,243,195,3,0,4,30,144,92,44,25,0,9,18,32,36,58, -166,96,1,57,152,0,0,8,0,0,0,0,6,16,51,89,0,144,161,144,0,208,169,144,7, -16,59,89,148,48,0,90,4,64,37,89,60,255,255,21,0,48,240,130,240,195,3,0, -0,48,240,130,241,195,3,0,5,22,128,92,0,48,240,130,242,195,3,0,0,48,136, -140,240,195,3,0,0,48,240,130,243,195,3,0,4,30,144,92,204,24,0,9,30,32,36, -61,5,22,128,92,0,48,136,140,240,195,3,0,4,30,144,92,180,24,0,9,16,32,36, -58,46,96,1,57,32,0,0,8,0,0,0,0,5,22,128,92,0,144,138,140,9,22,144,92,148, -24,0,9,38,64,130,58,14,96,1,57,5,22,128,92,164,21,0,9,2,30,128,92,0,48, -136,140,144,192,0,0,26,30,144,92,112,24,0,8,5,22,128,92,136,21,0,8,0,0, -0,0,0,48,240,140,88,196,0,0,30,22,144,92,0,0,240,140,0,48,136,144,140,86, -0,0,0,48,168,140,101,139,88,93,21,64,180,103,31,175,5,90,23,192,165,91, -20,128,165,89,31,14,165,88,0,16,133,140,0,48,160,146,140,86,0,0,0,144,4, -132,0,0,0,0,0,0,0,10,0,0,0,0,0,48,240,140,128,196,0,0,30,22,136,92,0,0, -240,140,0,48,128,146,140,86,0,0,0,80,4,132,0,0,0,0,0,0,0,10,0,0,0,0,0,0, -0,0,0,0,0,0,10,32,4,59,28,32,52,59,104,25,0,9,31,216,168,89,0,16,172,146, -0,48,128,140,255,255,255,255,0,0,0,10,16,57,128,140,252,195,3,0,0,16,164, -144,0,16,140,146,20,22,128,92,0,0,0,10,0,0,0,0,0,0,0,0,144,48,0,90,0,16, -44,140,10,0,0,22,12,32,52,59,1,25,128,89,0,0,0,10,16,57,32,144,252,195, -3,0,18,32,1,61,1,30,128,92,232,18,0,9,32,0,0,8,1,0,160,140,14,0,37,61,0, -30,128,92,0,0,0,10,16,57,240,146,252,195,3,0,0,16,1,134,0,30,128,92,5,57, -32,146,252,195,3,0,0,0,0,10,0,0,0,0,0,48,240,140,112,197,0,0,30,22,128, -92,0,0,240,140,0,48,160,140,16,196,3,0,8,32,245,146,0,16,245,146,4,32,245, -146,0,48,160,140,0,196,3,0,0,16,245,146,4,32,245,146,8,32,245,146,12,32, -245,146,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,130,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -130,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,32,96,8,140,0,116,192,178,240,255,255, -255,0,48,128,176,128,197,0,0,0,48,32,176,144,197,0,0,0,48,64,176,160,197, -0,0,0,48,128,178,144,86,0,0,0,48,128,176,192,197,0,0,0,48,192,176,176,197, -0,0,0,48,128,178,208,86,0,0,0,48,136,140,144,86,0,0,0,116,136,146,224,255, -255,255,0,48,96,176,208,197,0,0,0,48,144,140,176,86,0,0,0,116,144,146,228, -255,255,255,0,48,152,140,208,86,0,0,0,116,152,146,232,255,255,255,0,48, -160,140,240,86,0,0,0,116,128,144,232,255,255,255,12,32,245,146,8,32,133, -146,0,116,144,152,224,255,255,255,0,48,32,178,160,86,0,0,4,30,168,92,0, -16,149,154,0,48,160,140,0,87,0,0,0,48,64,178,176,86,0,0,0,48,192,178,192, -86,0,0,0,48,96,178,224,86,0,0,0,16,245,146,4,32,245,146,8,32,245,146,21, -16,169,89,12,32,245,146,149,240,4,90,16,32,165,140,228,255,255,22,0,116, -192,176,240,255,255,255,0,0,0,10,0,0,0,0,0,0,0,0,0,16,164,152,30,0,173, -51,4,32,172,144,21,80,160,89,4,32,164,146,0,80,133,128,12,0,0,8,0,0,0,0, -192,1,0,8,0,0,0,10,0,0,0,0,0,0,0,0,0,48,128,144,240,86,0,0,0,16,164,152, -30,0,173,51,4,32,172,144,21,80,160,89,4,32,164,146,0,80,133,128,12,0,0, -8,0,0,0,0,136,1,0,8,0,0,0,10,0,80,164,152,38,0,173,51,4,96,164,144,16,22, -168,92,255,0,184,140,20,80,176,89,149,192,173,88,4,96,180,146,0,16,133, -130,12,0,0,8,248,2,0,9,16,22,168,92,21,22,128,92,0,0,0,10,0,0,0,0,0,0,0, -0,0,48,136,144,244,86,0,0,0,80,164,152,38,0,173,51,4,96,164,144,16,22,168, -92,255,0,184,140,20,80,176,89,149,192,173,88,4,96,180,146,0,16,133,130, -12,0,0,8,176,2,0,9,16,22,168,92,21,22,128,92,0,0,0,10,0,48,240,140,232, -199,0,0,30,22,136,92,0,0,240,140,16,32,164,136,0,48,168,140,207,255,255, -255,148,64,165,88,16,32,164,138,0,80,4,132,0,0,0,10,0,0,0,0,0,48,240,140, -24,200,0,0,30,22,136,92,0,0,240,140,16,32,164,128,14,32,37,48,1,30,128, -92,0,80,4,132,0,30,128,92,0,80,4,132,0,0,0,10,0,0,0,0,0,48,240,140,72,200, -0,0,30,22,136,92,0,0,240,140,16,32,164,128,14,32,45,48,1,30,128,92,0,80, -4,132,0,30,128,92,0,80,4,132,0,0,0,10,0,0,0,0,0,48,240,140,152,200,0,0, -30,22,144,92,0,0,240,140,144,48,0,90,0,80,180,140,10,0,0,18,14,96,4,61, -0,30,128,92,0,144,4,132,1,9,172,89,0,144,165,128,21,80,168,89,1,160,181, -140,0,80,165,130,240,63,5,61,0,144,4,132,0,0,0,0,0,0,0,10,0,0,0,0,0,48, -240,140,184,200,0,0,30,22,128,92,0,0,240,140,0,16,4,132,0,0,0,0,0,0,0,10, -0,0,0,0,16,16,180,89,0,144,173,136,16,22,32,92,3,1,152,140,149,192,164, -88,136,25,152,88,10,192,164,61,128,73,173,88,113,0,152,140,149,192,164, -88,0,144,173,138,14,32,13,58,1,25,128,89,0,0,0,10,8,32,164,144,30,32,5, -61,144,10,0,9,22,32,4,62,16,32,161,136,133,9,165,88,168,0,0,8,0,0,0,0,0, -48,128,152,240,86,0,0,22,0,36,61,16,96,164,128,14,32,61,48,17,22,128,92, -96,3,0,9,204,20,0,9,4,16,50,89,1,25,56,89,0,16,44,140,16,32,161,128,18, -32,129,128,1,30,144,92,0,144,177,152,10,32,21,55,23,22,144,92,22,22,136, -92,80,18,0,9,14,192,129,61,0,80,161,144,216,63,37,58,8,32,81,144,1,25,152, -89,144,224,4,90,0,144,74,140,10,22,64,92,10,0,0,18,10,0,68,89,0,16,65,146, -4,32,81,146,14,192,132,58,26,32,4,58,44,0,0,8,16,32,161,136,133,9,165,88, -16,0,0,8,0,0,0,0,16,32,161,136,132,9,165,88,1,25,128,89,16,32,161,138,0, -0,0,10,0,0,0,0,4,32,169,144,21,80,160,89,4,32,161,146,0,80,133,128,0,0, -0,10,0,0,0,0,0,48,240,140,248,201,0,0,30,22,128,92,0,0,240,140,0,16,4,132, -0,0,0,0,0,0,0,10,0,0,0,0,0,48,32,140,240,86,0,0,0,30,40,92,0,16,129,144, -10,32,4,58,252,1,0,9,4,32,129,144,10,32,4,58,240,1,0,9,8,32,129,144,10, -32,4,58,228,1,0,9,12,32,129,144,10,32,4,58,216,1,0,9,16,32,129,144,10,32, -4,58,204,1,0,9,5,80,41,89,133,240,4,90,20,32,33,140,184,255,255,22,0,0, -0,10,0,0,0,0,16,96,180,128,16,22,56,92,0,80,36,140,38,160,53,48,4,96,164, -144,255,0,232,140,20,80,168,89,135,64,183,88,4,96,172,146,0,16,133,130, -22,22,128,92,0,0,0,10,17,16,188,89,0,208,173,136,2,1,232,140,149,64,167, -88,136,25,232,88,30,64,167,61,18,160,5,55,129,73,173,88,16,0,0,8,0,0,0, -0,10,160,37,48,21,211,172,88,31,216,232,89,149,64,167,88,0,208,173,138, -14,32,21,58,1,25,128,89,0,0,0,10,8,96,164,144,30,32,5,61,17,22,128,92,172, -8,0,9,18,32,4,62,1,25,128,89,0,0,0,10,0,0,0,0,16,32,161,128,132,0,232,140, -148,64,167,88,92,32,5,58,16,32,161,128,30,32,21,48,4,32,169,144,21,80,160, -89,0,0,48,140,4,32,161,146,0,80,61,130,64,0,0,8,0,16,129,176,18,192,164, -89,50,0,141,51,4,32,161,144,255,0,232,140,135,64,175,88,1,32,181,140,149, -176,2,90,4,32,177,146,0,16,61,130,174,0,0,21,0,30,48,92,12,0,0,8,0,0,0, -0,1,30,48,92,0,16,161,176,22,65,45,89,70,96,1,58,18,32,129,128,8,32,137, -144,5,22,144,92,244,16,0,9,50,64,129,58,16,32,161,136,8,32,113,144,1,25, -128,89,133,9,165,88,0,144,107,140,14,22,96,92,16,32,161,138,0,16,113,146, -4,32,113,146,0,0,0,10,0,0,0,0,16,32,161,128,8,32,81,152,132,0,232,140,148, -64,167,88,148,48,0,90,0,144,74,140,10,22,160,92,10,0,0,21,10,192,162,89, -20,22,64,92,0,16,161,146,255,0,232,140,134,64,167,88,4,32,81,146,22,32, -5,58,4,32,169,144,21,80,160,89,4,32,161,146,0,80,61,130,135,64,135,88,0, -0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,22,32,92,68,8,0,11,144,48,0,90,0,16,44, -140,18,0,0,21,1,25,128,89,0,0,0,10,0,0,0,0,0,48,168,140,240,86,0,0,21,1, -164,89,130,13,165,89,10,32,21,59,0,16,244,146,4,22,128,92,68,0,0,9,18,32, -129,128,60,13,0,9,18,32,4,58,1,25,128,89,0,0,0,10,0,0,0,0,16,32,161,128, -14,32,29,48,8,32,129,144,244,3,0,11,0,80,161,144,14,32,5,61,4,22,128,92, -228,3,0,11,0,30,128,92,0,0,0,10,16,32,164,128,16,22,40,92,18,32,45,48,1, -25,128,89,0,0,0,10,0,0,0,0,26,32,13,55,8,32,164,144,122,32,5,58,0,16,164, -146,4,32,164,146,108,0,0,8,50,32,21,55,0,16,164,176,22,65,37,89,38,32,1, -58,18,32,132,128,8,96,137,144,4,22,144,92,148,15,0,9,18,0,129,58,1,25,128, -89,0,0,0,10,0,0,0,0,8,96,161,144,54,32,5,58,16,96,161,128,8,96,81,152,132, -0,152,140,148,192,164,88,148,48,0,90,0,144,74,140,10,22,160,92,10,0,0,21, -10,192,162,89,20,22,64,92,0,80,161,146,4,96,81,146,0,30,128,92,0,0,0,10, -26,32,28,51,16,208,128,89,4,25,144,89,144,128,132,88,12,0,0,8,0,0,0,0,4, -30,128,92,16,48,2,90,16,0,56,140,10,0,0,17,16,22,56,92,7,17,48,89,4,32, -68,140,7,208,73,89,0,0,40,140,0,48,160,144,32,196,3,0,54,32,5,61,8,30,128, -92,212,10,0,9,4,25,144,89,3,32,132,140,144,128,132,88,4,32,132,140,0,48, -128,146,32,196,3,0,0,48,128,146,36,196,3,0,0,52,244,146,252,255,255,255, -0,48,128,144,40,196,3,0,0,30,136,92,178,32,4,58,7,60,164,140,255,255,255, -255,148,128,169,88,0,96,173,140,0,52,188,144,252,255,255,255,18,0,172,58, -16,64,162,89,148,128,169,88,0,96,173,140,21,0,178,89,116,192,181,49,22, -0,172,58,0,116,189,146,252,255,255,255,0,52,172,146,252,255,255,255,22, -16,161,89,34,192,165,51,0,180,189,146,252,255,255,255,0,116,181,146,252, -255,255,255,0,16,164,144,0,144,165,146,0,16,180,146,0,48,160,144,32,196, -3,0,182,0,173,52,34,0,172,61,18,96,4,58,0,16,164,144,0,80,164,146,16,0, -0,8,0,16,164,144,0,48,160,146,40,196,3,0,21,22,128,92,0,0,0,10,0,0,0,0, -16,22,136,92,0,16,132,144,88,63,4,61,0,48,168,144,36,196,3,0,0,48,144,140, -0,252,255,255,21,60,162,140,19,4,0,0,148,128,36,88,0,32,33,140,18,64,37, -52,4,22,128,92,148,10,0,9,16,32,4,58,0,30,160,92,48,0,0,8,0,0,0,0,0,48, -128,144,36,196,3,0,0,52,36,146,252,255,255,255,0,52,241,146,252,255,255, -255,176,1,0,11,1,30,160,92,0,48,32,146,36,196,3,0,22,32,5,58,5,80,40,89, -16,78,161,89,144,25,144,88,148,158,164,62,0,30,128,92,0,0,0,10,0,0,0,0, -0,0,0,0,0,0,0,0,144,48,0,90,0,16,60,140,14,0,0,21,17,22,128,92,48,254,255, -8,22,96,28,51,17,208,136,89,4,25,152,89,145,192,44,88,8,0,0,8,4,30,40,92, -5,48,2,90,16,0,184,140,10,0,0,17,5,22,184,92,0,52,180,144,252,255,255,255, -0,48,160,144,40,196,3,0,5,16,137,89,0,0,168,140,16,129,53,89,86,32,5,58, -82,128,165,49,66,128,165,61,0,180,165,144,252,255,255,255,0,52,164,146, -252,255,255,255,149,48,0,90,0,144,165,144,14,0,0,18,0,80,165,146,12,0,0, -8,0,48,160,146,40,196,3,0,0,52,180,144,252,255,255,255,20,0,0,8,0,0,0,0, -20,22,168,92,0,16,165,144,180,63,5,61,23,17,168,89,23,60,164,140,255,255, -255,255,148,64,165,88,0,32,165,140,58,0,164,61,16,64,36,89,50,128,37,49, -4,16,161,89,30,128,165,51,0,52,177,146,252,255,255,255,0,52,36,146,252, -255,255,255,4,22,128,92,144,0,0,11,7,22,128,92,0,0,0,10,0,0,0,0,5,22,128, -92,68,253,255,9,144,48,0,90,0,16,36,140,18,0,0,21,0,30,128,92,0,0,0,10, -0,0,0,0,10,64,49,54,5,22,48,92,7,22,128,92,0,16,137,140,6,22,144,92,212, -2,0,9,7,22,128,92,68,0,0,11,4,22,128,92,0,0,0,10,144,64,36,112,0,16,129, -140,248,252,255,9,144,48,0,90,0,16,44,140,14,0,0,21,0,30,128,92,0,0,0,10, -4,22,136,92,204,238,255,9,5,22,128,92,0,0,0,10,0,48,240,140,8,209,0,0,30, -22,136,92,0,0,240,140,10,32,4,61,0,80,4,132,0,48,168,144,40,196,3,0,0,30, -176,92,22,96,5,58,18,64,133,52,21,22,176,92,0,80,173,144,244,127,5,61,0, -16,172,146,14,160,5,58,0,144,133,146,12,0,0,8,0,48,128,146,40,196,3,0,42, -96,5,58,0,52,164,144,252,255,255,255,30,64,165,61,0,116,165,144,252,255, -255,255,0,52,164,146,252,255,255,255,0,80,165,144,0,16,164,146,42,160,5, -58,0,180,165,144,252,255,255,255,30,0,164,61,0,52,164,144,252,255,255,255, -0,180,165,146,252,255,255,255,0,16,164,144,0,144,165,146,0,80,4,132,0,0, -0,0,0,0,0,10,0,0,0,0,16,96,4,90,0,16,36,140,17,22,184,92,1,137,164,89,17, -0,181,89,16,0,173,89,10,0,0,20,28,128,133,54,10,64,172,52,20,128,173,54, -120,0,0,9,4,22,128,92,0,0,0,10,0,0,0,0,50,64,132,51,1,137,148,89,1,25,152, -89,78,192,148,58,0,208,165,128,23,80,184,89,1,137,148,89,146,224,4,90,0, -16,161,130,4,80,32,89,232,255,255,21,44,0,0,8,1,137,148,89,1,25,152,89, -34,192,148,58,0,144,165,128,1,137,181,89,1,137,148,89,146,224,4,90,0,80, -165,130,1,73,173,89,232,255,255,21,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,144, -67,164,88,148,208,163,88,255,0,32,140,148,0,161,88,148,48,0,90,0,16,156, -140,17,22,184,92,0,144,180,140,16,22,232,92,70,0,0,21,4,140,156,89,34,224, -4,59,0,80,164,176,1,201,156,89,16,96,140,140,147,48,0,90,0,80,167,178,29, -16,236,89,232,255,255,17,146,208,179,88,150,48,0,90,0,80,159,140,17,22, -184,92,14,0,0,21,0,0,0,10,0,0,0,0,147,195,165,88,148,208,161,88,148,0,161, -88,46,32,5,61,34,160,61,51,0,208,165,152,8,137,181,89,22,240,1,90,0,208, -164,154,19,16,154,89,8,224,189,140,232,255,255,17,10,160,5,61,0,0,0,10, -147,195,165,88,148,208,160,88,148,0,161,88,46,32,5,61,34,160,29,51,0,208, -165,144,4,137,181,89,22,240,0,90,0,208,164,146,19,16,153,89,4,224,189,140, -232,255,255,17,10,160,5,61,0,0,0,10,147,195,165,88,46,32,5,55,34,160,13, -51,0,208,165,136,2,137,181,89,22,112,0,90,0,208,164,138,19,144,152,89,2, -224,189,140,232,255,255,17,10,160,5,61,0,0,0,10,1,137,181,89,1,25,32,89, -34,0,177,58,0,208,165,128,23,80,184,89,1,137,181,89,150,32,1,90,0,208,164, -130,19,80,152,89,232,255,255,21,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,17,32, -4,90,0,16,236,140,17,22,152,92,0,16,188,140,1,137,164,89,16,0,181,89,17, -0,173,89,10,0,0,20,24,128,141,54,10,0,172,52,16,128,173,54,17,22,128,92, -0,80,143,140,140,254,255,8,50,0,140,51,1,137,148,89,1,25,32,89,34,0,145, -58,0,208,165,128,23,80,184,89,1,137,148,89,146,32,1,90,0,208,164,130,19, -80,152,89,232,255,255,21,0,0,0,10,1,137,148,89,1,25,32,89,34,0,145,58,0, -144,165,128,1,137,181,89,1,137,148,89,146,32,1,90,0,80,165,130,1,73,173, -89,232,255,255,21,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,32,164,128,16,22, -64,92,34,32,21,48,16,208,164,89,0,16,181,140,16,16,130,89,1,0,184,140,0, -16,164,146,4,32,188,146,80,0,0,8,138,25,128,88,116,249,255,9,8,32,130,146, -14,32,4,61,1,25,128,89,0,0,0,10,16,32,162,136,131,9,165,88,16,32,162,138, -16,32,162,128,138,25,168,88,12,32,170,146,30,32,5,55,18,32,130,128,96,6, -0,9,18,32,4,58,16,32,162,136,135,9,165,88,16,32,162,138,16,32,162,128,0, -16,34,176,46,32,13,48,132,0,168,140,148,64,165,88,148,48,0,90,0,144,41, -140,6,22,160,92,10,0,0,21,6,192,161,89,20,22,32,92,16,0,0,8,0,0,0,0,6,22, -40,92,0,144,33,140,0,16,34,146,7,22,128,92,4,32,50,146,0,0,0,10,0,48,240, -140,160,212,0,0,30,22,136,92,0,0,240,140,0,48,160,144,240,86,0,0,20,30, -176,92,0,48,168,140,240,86,0,0,26,0,164,58,1,137,181,89,30,160,5,57,21, -16,169,89,0,80,165,144,240,31,164,61,21,22,128,92,0,80,4,132,0,0,0,0,0, -30,128,92,0,80,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,72,8,89,30,22, -32,92,0,48,128,140,48,196,3,0,138,25,136,88,220,2,0,9,16,22,160,92,148, -48,0,90,36,0,0,19,0,30,160,92,64,224,167,146,0,48,160,140,64,87,0,0,68, -224,167,146,0,30,160,92,72,224,167,146,20,0,0,8,64,224,135,140,0,48,136, -140,48,196,3,0,32,0,0,9,72,224,167,144,0,48,160,146,0,201,3,0,64,224,135, -176,0,0,0,10,0,0,0,10,0,0,0,0,32,96,8,140,30,22,32,92,64,224,135,146,68, -224,143,146,68,224,135,144,28,2,0,9,16,22,160,92,68,224,175,144,20,64,165, -89,1,32,173,140,76,224,175,146,64,224,167,144,0,30,168,92,0,16,173,146, -64,224,167,144,0,48,168,140,48,200,3,0,4,32,173,146,68,224,167,144,72,224, -167,146,72,224,167,144,0,16,173,128,149,48,0,90,52,1,0,18,64,224,167,144, -0,16,173,144,149,176,4,90,36,1,0,17,72,224,167,144,0,16,173,128,149,48, -0,90,92,0,0,18,72,224,167,144,0,16,173,128,31,88,184,89,149,224,5,90,56, -0,0,18,72,224,167,144,0,16,173,128,149,112,2,90,40,0,0,18,72,224,167,144, -0,16,173,128,149,112,3,90,24,0,0,18,72,224,167,144,0,16,173,128,149,176, -2,90,8,0,0,18,20,0,0,8,72,224,167,144,20,80,168,89,72,224,175,146,156,255, -255,8,72,224,167,144,0,16,173,128,149,48,0,90,168,0,0,18,64,224,175,144, -0,80,165,144,20,80,176,89,0,80,181,146,72,224,175,144,20,57,168,146,48, -200,3,0,72,224,167,144,0,16,173,128,149,48,0,90,88,0,0,18,72,224,167,144, -0,16,173,128,31,88,184,89,149,224,5,90,68,0,0,18,72,224,167,144,0,16,173, -128,149,112,2,90,52,0,0,18,72,224,167,144,0,16,173,128,149,112,3,90,36, -0,0,18,72,224,167,144,0,16,173,128,149,176,2,90,20,0,0,18,72,224,167,144, -20,80,168,89,72,224,175,146,160,255,255,8,72,224,167,144,0,16,173,128,149, -48,0,90,24,0,0,18,72,224,167,144,20,80,168,89,72,224,175,146,0,30,168,92, -0,16,173,130,196,254,255,8,64,224,167,144,0,16,173,144,0,30,160,92,21,57, -160,146,48,200,3,0,0,30,160,92,80,224,167,146,76,224,167,144,0,16,173,128, -149,48,0,90,72,0,0,18,80,224,167,144,148,48,7,90,60,0,0,17,80,224,167,144, -20,80,168,89,80,224,175,146,76,224,175,144,20,57,168,146,128,200,3,0,76, -224,135,144,76,0,0,9,16,22,160,92,1,32,173,140,76,224,167,144,21,0,173, -89,76,224,175,146,176,255,255,8,80,224,167,144,0,30,168,92,20,57,168,146, -128,200,3,0,64,224,167,144,0,48,168,140,128,200,3,0,8,32,173,146,0,0,0, -10,0,0,0,0,0,0,0,0,0,0,0,0,16,72,8,89,30,22,160,92,64,224,135,146,0,30, -168,92,68,224,175,146,64,224,175,144,21,80,176,89,64,224,183,146,0,80,173, -128,149,48,0,90,20,0,0,18,68,224,175,144,21,80,176,89,68,224,183,146,220, -255,255,8,68,224,135,144,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,16,72,8,89,30, -22,32,92,16,22,40,92,17,22,48,92,242,0,56,140,64,224,63,146,5,22,128,92, -6,22,136,92,7,48,0,102,16,22,72,92,68,224,79,146,68,224,135,144,0,0,0,10, -0,0,0,10,0,0,0,10,0,0,0,0,16,72,8,89,30,22,32,92,64,224,135,146,64,224, -135,144,16,0,0,9,0,0,0,10,0,0,0,0,0,0,0,0,16,72,8,89,30,22,32,92,16,22, -40,92,1,1,48,140,64,224,55,146,5,22,128,92,6,48,0,102,0,0,0,10,0,0,0,10, -0,0,0,0,0,0,0,0,0,0,0,0,30,22,160,92,0,48,168,140,112,202,3,0,0,48,168, -146,16,201,3,0,0,0,0,10,0,0,0,0,0,0,0,0,16,72,8,89,30,22,32,92,64,224,135, -146,64,224,167,144,148,48,0,90,16,0,0,21,0,48,128,144,16,201,3,0,0,0,0, -10,0,48,160,144,16,201,3,0,20,208,43,89,16,25,176,89,133,128,45,88,5,22, -160,92,0,32,45,140,64,224,175,144,1,73,165,89,5,0,53,89,0,48,160,144,16, -201,3,0,5,32,5,90,32,0,0,20,6,96,1,90,24,0,0,20,0,48,176,140,111,218,3, -0,6,160,5,90,8,0,0,17,36,0,0,8,56,5,0,9,16,22,160,92,20,22,168,92,12,30, -160,92,0,80,165,146,0,48,128,140,255,255,255,255,0,0,0,10,6,80,160,89,0, -48,160,146,16,201,3,0,0,48,160,144,16,201,3,0,20,160,1,90,20,0,0,19,0,48, -160,140,111,218,3,0,0,48,160,146,16,201,3,0,5,22,128,92,0,0,0,10,0,0,0, -10,16,72,8,89,30,22,32,92,64,224,135,146,64,224,167,144,0,48,176,140,112, -202,3,0,20,160,5,90,32,0,0,20,64,224,175,144,1,73,165,89,0,48,176,140,111, -218,3,0,20,160,5,90,8,0,0,17,32,0,0,8,164,4,0,9,16,22,160,92,20,22,168, -92,12,30,160,92,0,80,165,146,1,25,128,89,0,0,0,10,64,224,167,144,0,48,160, -146,16,201,3,0,0,30,128,92,0,0,0,10,0,0,0,10,16,72,8,89,30,22,32,92,64, -224,135,146,64,224,135,144,64,0,0,9,68,224,135,146,68,224,167,144,148,48, -0,90,32,0,0,18,76,4,0,9,16,22,160,92,20,22,168,92,68,224,167,144,0,80,165, -146,1,25,128,89,0,0,0,10,0,30,128,92,0,0,0,10,0,0,0,10,0,0,0,0,16,72,8, -89,30,22,32,92,16,22,40,92,234,0,48,140,64,224,55,146,5,22,128,92,6,48, -0,102,16,22,64,92,68,224,71,146,68,224,135,144,0,0,0,10,0,0,0,10,0,0,0, -10,0,0,0,0,0,0,0,0,0,0,0,0,16,72,8,89,30,22,32,92,64,224,135,146,68,224, -143,146,64,224,135,144,1,3,136,140,68,224,151,144,180,0,0,9,0,0,0,10,0, -0,0,10,0,0,0,0,0,0,0,0,16,72,8,89,30,22,32,92,64,224,135,146,68,224,167, -140,64,224,135,144,20,22,136,92,72,0,0,9,72,224,135,146,72,224,167,144, -148,48,0,90,32,0,0,18,132,3,0,9,16,22,160,92,20,22,168,92,72,224,167,144, -0,80,165,146,1,25,128,89,0,0,0,10,68,224,135,144,0,0,0,10,0,0,0,10,0,0, -0,0,0,0,0,0,0,0,0,0,16,72,8,89,30,22,32,92,16,22,40,92,17,22,48,92,235, -0,56,140,64,224,63,146,5,22,128,92,6,22,136,92,7,48,0,102,16,22,72,92,68, -224,79,146,68,224,135,144,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,0,32,96,8,140, -30,22,32,92,64,224,135,146,68,224,143,146,72,224,151,146,76,224,167,140, -64,224,135,144,68,224,143,144,72,224,151,144,20,22,152,92,72,0,0,9,80,224, -135,146,80,224,167,144,148,48,0,90,32,0,0,18,212,2,0,9,16,22,160,92,20, -22,168,92,80,224,167,144,0,80,165,146,1,25,128,89,0,0,0,10,76,224,135,144, -0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,72,8,89,30,22,32,92,16,22, -40,92,17,22,48,92,18,22,56,92,19,22,64,92,230,0,72,140,64,224,79,146,5, -22,128,92,6,22,136,92,7,22,144,92,8,22,152,92,9,48,0,102,16,22,88,92,68, -224,95,146,68,224,135,144,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,0,32,96,8,140, -30,22,32,92,64,224,135,146,68,224,143,146,72,224,151,146,76,224,167,140, -64,224,135,144,68,224,143,144,72,224,151,144,20,22,152,92,72,0,0,9,80,224, -135,146,80,224,167,144,148,48,0,90,32,0,0,18,20,2,0,9,16,22,160,92,20,22, -168,92,80,224,167,144,0,80,165,146,1,25,128,89,0,0,0,10,76,224,135,144, -0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,72,8,89,30,22,32,92,16,22, -40,92,17,22,48,92,18,22,56,92,19,22,64,92,231,0,72,140,64,224,79,146,5, -22,128,92,6,22,136,92,7,22,144,92,8,22,152,92,9,48,0,102,16,22,88,92,68, -224,95,146,68,224,135,144,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,0,32,96,8,140, -30,22,32,92,64,224,135,146,68,224,143,146,72,224,151,146,76,224,167,140, -64,224,135,144,68,224,143,144,72,224,151,144,20,22,152,92,72,0,0,9,80,224, -135,146,80,224,167,144,148,48,0,90,32,0,0,18,84,1,0,9,16,22,160,92,20,22, -168,92,80,224,167,144,0,80,165,146,1,25,128,89,0,0,0,10,76,224,135,144, -0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,72,8,89,30,22,32,92,16,22, -40,92,17,22,48,92,18,22,56,92,19,22,64,92,232,0,72,140,64,224,79,146,5, -22,128,92,6,22,136,92,7,22,144,92,8,22,152,92,9,48,0,102,16,22,88,92,68, -224,95,146,68,224,135,144,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,0,30,22,32,92, -252,250,255,9,0,0,0,10,0,0,0,0,16,72,8,89,30,22,160,92,64,224,135,146,0, -48,128,140,32,201,3,0,0,0,0,10,0,0,0,10,0,0,0,0,16,72,8,89,30,22,160,92, -64,224,135,146,0,48,128,140,176,201,3,0,0,0,0,10,0,0,0,10,0,0,0,0,16,72, -8,89,30,22,160,92,64,224,135,146,0,48,128,140,16,202,3,0,0,0,0,10,0,0,0, -10,0,0,0,0,30,22,160,92,0,48,128,140,32,201,3,0,0,0,0,10,0,0,0,10,0,0,0, -0,0,0,0,0,0,0,0,0,30,22,160,92,0,48,128,140,176,201,3,0,0,0,0,10,0,0,0, -10,0,0,0,0,0,0,0,0,0,0,0,0,30,22,160,92,0,48,128,140,16,202,3,0,0,0,0,10, -0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,30,22,160,92,0,48,128,140,16,202,3,0,0, -0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,30,22,32,92,16,22,40,92,4,96,161, -144,0,80,169,144,20,96,5,90,24,0,0,19,4,96,161,144,20,80,168,89,4,96,169, -146,0,16,133,128,12,0,0,8,5,22,128,92,112,234,255,9,0,0,0,10,0,0,0,10,0, -0,0,10,30,22,32,92,16,22,40,92,17,22,48,92,4,160,161,144,0,144,169,144, -20,96,5,90,36,0,0,19,4,160,161,144,20,80,168,89,4,160,169,146,5,22,168, -92,0,16,173,130,255,0,176,140,149,128,133,88,16,0,0,8,5,22,128,92,6,22, -136,92,188,235,255,9,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0, -30,22,32,92,108,254,255,9,0,0,0,10,0,0,0,0,30,22,160,92,0,0,0,10,0,0,0, -0,0,0,0,0,30,22,160,92,1,25,136,89,145,2,132,100,0,0,0,10,144,48,0,90,19, -4,32,140,86,0,0,20,16,22,40,92,133,16,96,100,66,0,0,16,12,17,101,89,140, -48,0,90,18,0,0,20,12,70,137,89,0,30,128,92,20,0,0,8,12,17,104,89,13,68, -137,89,32,32,107,140,13,70,129,89,20,78,140,88,12,1,33,89,20,14,33,89,132, -67,140,88,0,0,0,10,0,30,128,93,248,255,255,8,16,17,40,89,133,16,96,100, -12,17,101,89,140,48,0,90,18,0,0,20,12,70,137,89,0,30,128,92,20,0,0,8,12, -17,104,89,13,68,137,89,32,32,107,140,13,70,129,89,20,78,140,88,12,1,33, -89,20,14,33,89,132,67,140,88,159,73,140,88,176,255,255,8,1,78,36,89,21, -12,33,89,19,4,104,140,4,65,107,89,32,96,99,140,140,48,0,90,46,0,0,22,145, -48,0,90,50,0,0,20,141,48,5,90,34,0,0,17,12,4,132,89,12,6,132,89,141,48, -0,90,14,0,0,22,13,68,140,89,13,70,140,89,0,0,0,10,0,30,128,93,248,255,255, -8,141,48,5,90,58,0,0,17,0,56,0,90,16,17,128,91,17,17,136,91,12,4,132,89, -12,6,132,89,141,48,0,90,14,0,0,22,13,68,140,89,13,70,140,89,0,56,0,90,16, -17,128,91,17,17,136,91,188,255,255,8,0,48,136,140,0,0,240,191,0,30,128, -92,172,255,255,8,1,78,36,89,0,48,96,140,0,0,224,255,4,32,3,90,106,0,0,17, -21,12,33,89,10,78,44,89,158,73,41,88,31,78,41,88,22,12,100,89,133,3,43, -88,145,48,0,90,29,4,96,140,38,0,0,20,4,32,3,90,4,1,35,89,14,0,0,17,4,68, -129,89,0,0,0,10,1,25,128,89,31,14,132,88,244,255,255,8,4,32,3,90,4,1,35, -89,18,0,0,17,5,17,40,89,132,69,129,89,220,255,255,8,31,94,128,89,212,255, -255,8,0,30,128,93,204,255,255,8,1,78,36,89,0,48,96,140,0,0,224,255,4,32, -3,90,106,0,0,17,21,12,33,89,10,78,44,89,158,73,41,88,31,78,41,88,22,12, -100,89,133,3,43,88,145,48,0,90,29,4,96,140,38,0,0,20,4,32,3,90,4,1,35,89, -14,0,0,17,4,68,129,89,0,0,0,10,1,25,128,89,31,14,132,88,244,255,255,8,4, -32,3,90,4,1,35,89,18,0,0,17,4,68,41,89,5,17,128,89,220,255,255,8,31,94, -128,89,212,255,255,8,0,30,128,92,204,255,255,8,1,78,36,89,0,48,96,140,0, -0,224,255,4,32,3,90,66,0,0,17,21,12,33,89,11,78,44,89,159,73,41,88,21,12, -100,89,133,3,43,88,145,48,0,90,38,0,0,20,30,4,96,140,4,32,3,90,18,0,0,17, -4,1,35,89,4,68,129,89,0,0,0,10,1,25,128,89,248,255,255,8,0,30,128,92,240, -255,255,8,1,78,36,89,0,48,96,140,255,255,223,255,12,32,1,90,4,49,0,90,82, -0,0,22,21,12,33,89,128,3,96,140,12,1,33,89,255,0,96,140,4,32,3,90,46,0, -0,19,23,14,33,89,12,78,44,89,9,76,41,89,132,67,33,88,29,12,44,89,28,47, -4,90,5,0,129,91,31,111,4,90,159,15,132,88,0,0,0,10,132,48,0,90,48,0,0,20, -24,0,0,8,42,0,0,18,0,48,96,140,0,0,224,255,4,32,3,90,18,0,0,17,0,48,128, -140,0,0,128,127,204,255,255,8,1,25,128,89,204,255,255,8,0,30,128,92,188, -255,255,8,31,12,84,89,31,142,82,89,1,14,36,89,0,48,96,140,255,255,255,254, -12,32,1,90,4,49,0,90,58,0,0,22,24,12,33,89,0,48,96,140,128,252,255,255, -12,1,33,89,20,14,33,89,9,14,44,89,12,76,41,89,132,67,137,88,29,14,132,89, -145,131,138,88,0,0,0,10,0,30,128,93,244,255,255,8,250,255,255,18,0,48,96, -140,0,0,0,255,12,32,1,90,22,0,0,20,0,48,136,140,0,0,240,127,0,30,128,92, -208,255,255,8,1,25,128,89,1,25,136,89,200,255,255,8,15,140,84,89,31,142, -82,89,17,142,36,89,17,12,33,89,31,111,4,90,90,0,0,16,0,48,96,140,0,60,0, -0,12,1,33,89,255,7,96,140,4,32,3,90,46,0,0,19,31,78,140,88,11,76,60,89, -21,78,52,89,20,14,33,89,135,3,137,88,10,47,4,90,11,12,132,89,6,0,132,91, -138,67,140,88,0,0,0,10,34,0,0,17,0,48,136,140,0,0,240,127,0,30,128,92,232, -255,255,8,144,67,140,88,17,48,0,90,220,255,255,18,1,25,128,89,1,25,136, -89,212,255,255,8,31,72,84,88,8,0,0,8,31,78,84,88,1,78,36,89,0,48,96,140, -0,0,224,255,4,32,3,90,10,0,0,17,10,22,136,92,0,0,0,10,16,22,24,92,0,30, -48,93,0,30,64,93,0,30,80,93,47,0,144,140,57,0,152,140,3,206,57,88,0,16, -36,128,1,8,132,89,19,32,1,90,4,161,4,90,134,0,0,22,143,8,33,88,4,239,1, -90,82,0,0,18,8,22,112,93,2,78,74,89,30,12,106,89,2,14,66,89,137,67,75,88, -0,120,0,90,14,0,66,91,15,64,74,91,8,0,66,91,9,64,74,91,4,0,66,91,0,72,74, -91,9,193,123,88,143,48,0,90,254,1,0,20,134,201,57,88,2,239,1,90,0,136,49, -91,148,255,255,8,10,22,88,92,2,142,82,89,11,128,82,89,1,142,82,89,4,128, -82,89,10,193,90,88,139,48,0,90,214,1,0,20,135,201,57,88,108,255,255,8,46, -0,88,140,4,224,2,90,234,1,0,18,45,0,88,140,4,224,2,90,238,1,0,18,43,0,88, -140,4,224,2,90,6,2,0,18,69,0,88,140,5,14,97,88,12,224,2,90,14,2,0,18,68, -0,88,140,12,224,2,90,2,2,0,18,3,1,28,89,1,201,24,89,0,80,28,146,6,239,1, -90,102,1,0,16,144,0,96,140,135,0,99,88,16,40,3,90,86,1,0,18,5,239,1,90, -8,0,0,16,10,17,80,89,6,129,82,89,54,1,96,140,12,17,104,89,1,73,107,89,140, -160,2,90,138,97,3,90,58,1,0,22,255,3,32,140,137,16,112,100,32,0,0,18,136, -16,112,100,54,1,0,16,14,209,119,89,14,6,74,89,0,30,64,92,32,160,115,140, -28,0,0,8,1,136,123,89,14,209,119,89,15,4,122,89,14,6,66,89,14,70,74,89, -143,67,74,88,14,1,33,89,0,48,40,140,0,88,0,0,138,48,0,90,18,0,0,19,0,48, -40,140,176,89,0,0,10,17,80,89,143,136,90,88,139,93,97,152,13,64,114,103, -12,64,146,103,0,120,0,90,14,192,116,91,15,16,120,91,13,0,146,103,14,192, -116,91,15,16,120,91,11,125,89,144,128,0,0,0,132,192,34,89,4,140,90,89,139, -125,65,152,192,0,0,0,15,64,98,103,14,64,146,103,0,120,0,90,12,192,100,91, -13,16,104,91,15,0,146,103,12,192,100,91,13,16,104,91,11,125,89,144,96,1, -0,0,132,192,34,89,63,32,33,140,31,111,3,90,20,0,0,18,12,0,99,91,13,64,107, -91,1,9,33,89,236,255,255,8,132,48,0,90,90,0,0,20,12,22,88,92,31,78,107, -88,11,12,131,89,21,78,115,89,11,76,139,89,142,3,132,88,20,14,33,89,145, -3,137,88,10,239,2,90,0,8,132,91,0,72,140,91,1,239,1,90,159,79,140,88,0, -0,0,10,1,25,128,89,1,25,136,89,244,255,255,8,16,0,0,18,28,0,0,8,5,239,1, -90,22,0,0,16,0,30,128,93,212,255,255,8,138,48,0,90,244,255,255,20,0,48, -136,140,0,0,240,127,0,30,128,92,188,255,255,8,2,239,1,90,194,255,255,18, -130,201,57,88,108,253,255,8,1,9,100,89,12,224,0,90,14,0,0,21,129,201,57, -88,88,253,255,8,3,239,1,90,158,255,255,16,133,201,57,88,72,253,255,8,1, -9,100,89,12,224,0,90,62,253,255,18,3,239,1,90,54,253,255,18,124,255,255, -8,4,239,1,90,118,255,255,18,132,201,57,88,131,201,57,88,32,253,255,8,0, -0,0,0,0,48,96,140,0,0,224,255,1,78,36,89,12,32,1,90,202,4,0,22,21,12,33, -89,32,0,96,140,145,48,0,90,8,0,0,19,45,0,96,140,0,144,100,130,1,136,148, -89,51,4,96,140,12,1,49,89,16,22,32,92,11,78,44,89,11,76,41,89,148,73,41, -88,1,78,100,89,144,3,99,88,12,48,0,90,12,0,0,21,0,30,32,93,0,30,48,92,0, -48,96,140,151,117,0,0,140,128,57,116,0,48,96,140,160,134,1,0,1,12,107,89, -159,205,113,89,14,67,107,88,7,64,59,89,140,197,57,116,7,22,24,92,134,48, -0,90,10,2,0,19,9,30,96,92,140,192,105,89,141,48,0,90,8,0,0,22,135,17,96, -89,140,192,57,89,12,57,104,144,160,92,0,0,5,64,83,103,4,64,35,103,0,120, -0,90,10,64,41,91,0,200,90,91,139,16,96,100,54,0,0,16,12,128,49,89,1,136, -49,89,12,4,33,89,0,47,1,90,1,12,33,89,12,68,81,89,1,140,82,89,12,209,103, -89,12,70,41,89,4,64,33,91,12,198,90,89,10,192,42,91,135,48,0,90,146,255, -255,20,6,48,0,90,38,0,0,18,32,160,97,140,6,17,48,89,1,137,121,89,15,39, -1,90,6,4,33,89,12,70,97,89,6,68,41,89,12,0,33,91,19,30,120,92,143,57,96, -152,0,92,0,0,1,201,123,89,5,96,3,90,240,255,255,20,22,0,0,17,12,112,0,90, -14,0,0,18,4,32,3,90,220,255,255,20,2,200,123,89,15,192,112,89,142,48,0, -90,8,0,0,17,1,30,112,92,1,136,107,89,20,64,107,89,20,48,0,90,0,0,96,33, -12,64,107,89,13,224,4,90,34,2,0,17,19,176,4,90,8,0,0,22,18,30,152,92,14, -17,100,89,20,32,3,90,8,0,0,22,12,22,160,92,0,30,64,92,14,224,3,90,8,0,0, -22,15,129,67,89,15,192,96,89,140,48,0,90,8,0,0,17,3,81,120,89,159,205,96, -89,3,3,107,88,12,65,107,89,140,64,107,88,13,32,5,90,132,0,0,22,20,65,107, -89,13,240,4,90,16,0,0,22,0,30,32,93,1,30,120,92,108,0,0,8,141,57,80,152, -0,92,0,0,1,140,82,89,31,206,130,89,1,204,90,89,144,131,82,88,0,120,0,90, -10,0,33,91,11,64,41,91,13,176,2,90,32,0,0,20,0,48,80,140,0,202,154,59,138, -0,33,103,5,22,32,92,0,30,40,92,9,73,107,89,9,201,123,89,13,57,80,144,160, -92,0,0,10,68,137,112,138,69,41,112,4,22,128,92,138,0,132,103,17,22,32,92, -13,193,123,89,4,22,128,93,184,2,0,11,136,48,0,90,24,0,0,22,48,0,96,140, -0,144,100,130,1,136,148,89,1,9,66,89,232,255,255,8,0,30,104,92,0,144,108, -130,1,136,148,89,0,30,240,92,0,0,0,10,0,48,96,140,16,91,0,0,0,30,104,92, -0,16,131,144,16,17,128,89,16,160,1,90,20,0,0,17,4,8,99,89,1,72,107,89,13, -48,4,90,228,255,255,20,4,9,99,89,1,73,107,89,0,16,131,144,16,48,0,90,70, -0,0,18,16,128,49,89,4,78,99,89,12,193,57,89,141,57,96,152,112,90,0,0,13, -64,81,103,12,64,129,103,0,120,0,90,10,64,84,91,11,16,88,91,13,0,129,103, -10,64,36,91,11,16,40,91,53,0,96,140,6,32,3,90,134,255,255,19,0,48,96,140, -48,90,0,0,0,30,104,92,0,16,131,144,16,17,128,89,16,160,1,90,20,0,0,17,4, -8,99,89,1,72,107,89,13,48,4,90,228,255,255,20,4,9,99,89,1,73,107,89,0,16, -131,144,16,48,0,90,54,0,0,18,16,128,49,89,13,193,57,89,141,57,96,152,176, -89,0,0,13,64,81,103,12,64,129,103,0,120,0,90,10,64,84,91,11,16,88,91,13, -0,129,103,10,64,36,91,11,16,40,91,6,70,41,89,32,0,96,140,6,1,99,89,12,4, -97,89,6,6,33,89,140,67,41,88,7,193,24,89,140,253,255,8,19,176,1,90,22,1, -0,20,15,192,24,89,1,201,24,89,0,30,104,92,19,240,1,90,22,0,0,22,7,201,108, -89,141,240,3,90,8,0,0,22,15,30,104,92,1,72,107,89,15,96,3,90,148,0,0,22, -13,193,115,89,142,57,80,152,0,92,0,0,1,140,82,89,31,206,130,89,1,204,90, -89,144,131,82,88,0,120,0,90,10,0,33,91,11,64,41,91,14,176,2,90,32,0,0,20, -0,48,80,140,0,202,154,59,138,0,33,103,5,22,32,92,0,30,40,92,9,137,115,89, -9,201,123,89,14,57,80,144,160,92,0,0,10,68,137,112,138,69,41,112,4,22,128, -92,138,0,132,103,17,22,32,92,14,193,123,89,143,57,96,152,0,92,0,0,5,96, -3,90,24,0,0,20,14,0,0,17,4,32,3,90,12,0,0,20,1,200,123,89,1,200,24,89,4, -22,128,93,1,30,112,92,164,0,0,11,69,0,96,140,0,144,100,130,1,136,148,89, -43,0,96,140,131,48,0,90,12,0,0,19,3,17,24,89,45,0,96,140,0,144,100,130, -1,136,148,89,3,22,128,92,0,30,136,92,3,30,120,92,15,22,112,92,15,22,104, -92,100,0,0,11,200,253,255,8,42,0,96,140,0,144,100,130,1,136,148,89,2,203, -156,90,240,255,255,20,176,253,255,8,0,48,96,140,78,97,78,0,36,0,0,21,43, -0,96,140,145,48,0,90,8,0,0,19,45,0,96,140,0,144,100,130,1,136,148,89,0, -48,96,140,73,78,70,0,0,144,100,130,1,136,148,89,12,48,0,90,8,12,99,89,240, -255,255,21,120,253,255,8,143,57,96,140,248,91,0,0,14,48,0,90,16,0,0,21, -46,0,120,140,0,144,124,130,1,136,148,89,0,16,83,152,8,9,99,89,47,0,120, -140,1,200,123,89,0,56,0,90,10,1,132,91,11,65,140,91,240,255,255,18,10,0, -132,91,11,64,140,91,0,144,124,130,1,136,148,89,1,137,115,89,144,67,124, -88,15,48,0,90,12,0,0,21,142,48,0,90,14,0,0,20,10,112,0,90,160,255,255,17, -0,144,7,132,0,0,0,0,31,200,156,88,1,78,36,89,1,206,44,89,21,94,96,89,4, -0,107,89,13,32,3,90,154,1,0,22,5,0,107,89,13,32,3,90,142,1,0,22,11,78,60, -89,21,12,100,89,11,14,52,89,140,195,57,88,159,201,57,88,11,206,76,89,21, -140,100,89,11,142,68,89,140,67,74,88,159,73,74,88,21,12,33,89,21,76,41, -89,31,76,84,89,31,142,82,89,4,96,1,90,32,0,104,140,52,0,0,20,5,1,97,89, -12,96,3,90,16,0,0,20,9,22,64,92,0,30,72,92,13,1,99,89,12,4,66,89,12,65, -107,89,13,70,106,89,12,68,74,89,141,3,66,88,52,0,0,8,4,65,97,89,12,96,3, -90,16,0,0,20,7,22,48,92,0,30,56,92,13,1,99,89,12,132,49,89,12,65,107,89, -13,198,105,89,12,196,57,89,141,131,49,88,5,22,32,92,17,195,100,88,31,47, -3,90,62,0,0,18,8,128,49,91,9,192,57,91,150,0,0,16,1,140,49,89,31,206,97, -89,1,204,57,89,140,131,49,88,1,8,33,89,255,7,96,140,4,32,3,90,116,0,0,20, -12,22,32,92,0,30,48,93,104,0,0,8,8,129,49,91,9,193,57,91,22,0,0,18,0,56, -0,90,6,17,48,91,7,17,56,91,31,136,82,88,135,16,96,100,32,0,0,18,134,16, -96,100,102,0,0,16,12,209,103,89,12,134,57,89,0,30,48,92,32,32,99,140,28, -0,0,8,12,132,105,89,1,76,107,89,12,209,103,89,12,198,57,89,12,134,49,89, -141,195,57,88,12,1,33,89,132,48,0,90,54,0,0,20,10,175,1,90,31,206,57,88, -11,140,129,89,21,206,105,89,11,204,137,89,20,14,33,89,145,3,137,88,13,0, -132,91,10,64,140,91,0,0,0,10,0,30,128,93,248,255,255,8,0,30,128,92,10,22, -136,92,236,255,255,8,0,48,96,140,0,0,224,255,12,32,1,90,70,0,0,18,90,0, -0,20,12,96,1,90,50,0,0,18,78,0,0,20,132,3,108,88,13,48,0,90,22,0,0,18,133, -131,108,88,13,48,0,90,70,254,255,21,176,255,255,8,133,131,108,88,13,48, -0,90,50,0,0,18,18,22,128,93,156,255,255,8,12,96,1,90,22,0,0,20,146,255, -255,17,17,195,100,88,140,48,0,90,134,255,255,19,1,25,128,89,1,25,136,89, -120,255,255,8,145,192,140,88,0,30,128,92,108,255,255,8,17,195,28,88,31, -204,24,89,31,206,24,89,1,78,36,89,1,206,44,89,21,94,96,89,4,0,107,89,13, -32,3,90,238,0,0,22,5,0,107,89,13,32,3,90,226,0,0,22,11,78,60,89,1,204,57, -89,10,14,52,89,22,12,108,89,141,195,57,88,158,201,57,88,11,206,76,89,11, -142,68,89,21,140,108,89,141,67,74,88,159,73,74,88,21,12,33,89,21,76,41, -89,137,128,81,103,10,22,104,92,0,30,96,92,137,0,99,103,13,22,80,92,1,12, -106,89,0,30,96,92,137,0,99,103,11,64,99,103,0,56,0,90,13,129,82,91,0,201, -90,91,13,129,82,91,0,201,90,91,31,239,2,90,16,0,0,18,10,128,82,91,11,192, -90,91,1,9,33,89,255,35,33,140,5,1,33,89,254,7,96,140,12,32,1,90,46,0,0, -20,10,175,2,90,11,140,130,89,21,206,106,89,11,204,138,89,20,78,140,88,20, -14,33,89,145,3,137,88,13,0,132,91,3,64,140,91,0,0,0,10,132,48,0,90,16,0, -0,20,1,8,35,89,0,30,80,93,200,255,255,8,0,30,32,92,0,30,80,93,188,255,255, -8,0,48,96,140,0,0,224,255,12,32,1,90,90,0,0,18,94,0,0,20,12,96,1,90,66, -0,0,18,82,0,0,20,132,3,108,88,13,48,0,90,38,0,0,18,133,131,108,88,13,48, -0,90,242,254,255,21,0,48,136,140,0,0,240,127,0,30,128,92,131,67,140,88, -148,255,255,8,133,131,108,88,13,48,0,90,26,0,0,18,0,30,128,93,131,67,140, -88,124,255,255,8,12,96,1,90,210,255,255,17,1,25,128,89,1,25,136,89,104, -255,255,8,0,0,0,0,0,0,0,0,0,0,0,0,17,195,28,88,31,204,24,89,31,206,24,89, -1,78,36,89,1,206,44,89,21,94,96,89,4,0,107,89,13,32,3,90,214,0,0,22,5,0, -107,89,13,32,3,90,202,0,0,22,11,78,60,89,11,14,52,89,21,12,108,89,141,195, -57,88,11,206,76,89,11,142,68,89,21,140,108,89,141,67,74,88,159,201,57,88, -159,73,74,88,21,12,33,89,21,76,41,89,7,64,98,103,6,64,82,103,0,120,0,90, -12,192,98,91,13,16,104,91,7,0,114,103,10,128,115,91,12,192,99,91,13,16, -104,91,31,111,3,90,16,0,0,18,12,0,99,91,13,64,107,91,1,9,33,89,4,124,33, -140,2,252,255,255,254,7,80,140,10,32,1,90,46,0,0,20,10,47,3,90,11,12,131, -89,21,78,83,89,11,76,139,89,20,78,140,88,20,14,33,89,145,3,137,88,10,0, -132,91,3,64,140,91,0,0,0,10,132,48,0,90,16,0,0,20,1,136,34,89,0,30,96,93, -200,255,255,8,0,30,32,92,0,30,96,93,188,255,255,8,31,204,24,89,31,206,24, -89,0,48,96,140,0,0,224,255,12,32,1,90,58,0,0,18,70,0,0,20,12,96,1,90,62, -0,0,20,70,0,0,18,132,3,108,88,13,48,0,90,18,0,0,18,133,131,108,88,13,48, -0,90,2,255,255,21,0,30,128,93,131,67,140,88,148,255,255,8,12,96,1,90,14, -0,0,20,5,48,0,90,30,0,0,21,1,25,128,89,1,25,136,89,120,255,255,8,132,3, -108,88,13,48,0,90,238,255,255,18,0,48,136,140,0,0,240,127,131,67,140,88, -0,30,128,92,88,255,255,8,0,0,0,0,1,78,36,89,1,206,52,89,0,48,96,140,0,0, -224,255,12,32,1,90,126,0,0,22,12,160,1,90,198,0,0,22,132,131,49,88,6,48, -0,90,98,0,0,18,159,77,100,89,31,78,60,88,16,3,51,88,7,3,59,88,0,56,0,90, -12,129,49,91,0,201,57,91,159,205,100,89,31,206,76,88,18,3,67,88,9,3,75, -88,0,56,0,90,12,1,66,91,0,73,74,91,135,96,2,90,1,25,128,89,34,0,0,20,1, -30,128,92,26,0,0,17,6,32,2,90,18,0,0,17,1,25,128,89,10,0,0,20,0,30,128, -92,0,0,0,10,12,32,1,90,30,0,0,18,3,30,128,92,240,255,255,8,1,30,128,92, -232,255,255,8,1,25,128,89,224,255,255,8,12,160,1,90,230,255,255,20,30,0, -0,17,17,195,100,88,140,48,0,90,198,255,255,19,31,111,4,90,214,255,255,16, -216,255,255,8,145,48,0,90,208,255,255,20,196,255,255,8,12,160,1,90,182, -255,255,20,31,239,4,90,182,255,255,18,184,255,255,8,0,0,0,10 -}; - -int pca200e_microcode_size_3 = sizeof(pca200e_microcode_3); - -u_char pca200e_microcode_4[] = { -102,111,114,101,0,1,0,0,64,81,0,0,192,86,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,64,77,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,80,45,3,0,0,0,0,0,1,255,128,255,48,0,0,0,1,126,255, -126,112,0,0,0,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -15,0,0,0,0,0,0,1,231,167,167,32,0,0,0,1,11,3,3,0,0,0, -0,1,11,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -223,111,223,0,0,0,0,1,127,0,0,0,0,0,0,1,255,0,0,0,0, -0,0,1,255,0,0,0,0,0,0,1,127,65,127,0,0,0,0,1,7,7,7, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,251,0, -251,0,0,0,0,1,255,240,240,0,0,0,0,1,255,0,0,0,0,0,0, -1,255,0,0,0,0,0,0,1,15,0,0,0,0,0,0,1,255,0,0,0,0,0, -0,1,255,0,0,0,0,0,0,1,15,0,0,0,0,0,0,1,127,1,127,0, -0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -173,0,129,0,0,0,0,1,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,255,175,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,1,255,0,0,0,0,0,0,1,255,255,0,0,0, -0,0,1,255,0,0,0,0,0,0,1,255,0,0,0,0,0,0,1,255,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,7,3,7,0,0,0,0,1,127,126,127,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,255,255,255,0,0,0,0,1,255,255,255,144,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,255,255,255,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,255, -127,127,4,0,0,0,1,254,224,224,0,0,0,0,1,255,255,255,0, -0,0,0,1,255,255,255,0,0,0,0,1,255,0,0,0,0,0,0,1,255, -255,0,0,0,0,0,1,255,0,0,0,0,0,0,1,255,0,0,0,0,0,0,1, -3,0,0,0,0,0,0,1,255,255,255,252,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,255,159,159,4,0,0, -0,1,255,255,255,0,0,0,0,1,255,255,255,106,0,0,0,1,222, -206,207,0,0,0,0,1,255,0,0,0,0,0,0,1,255,0,0,0,0,0,0, -1,7,0,0,0,0,0,0,1,255,255,255,8,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,5,31,5,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255, -0,48,128,140,80,221,3,0,12,192,135,50,16,22,8,92,4,0,0, -9,128,62,0,102,0,0,0,140,0,30,240,92,0,48,128,140,0,228, -0,0,0,48,136,140,80,237,0,0,0,16,244,146,4,8,132,89,248, -95,132,52,0,48,128,140,0,16,0,59,60,131,0,9,236,140,0,9, -244,127,0,9,96,105,0,9,60,123,0,9,0,48,48,144,0,228,0, -0,40,160,1,50,16,22,32,93,0,20,128,140,0,0,0,0,0,48, -136,140,48,87,0,0,17,1,132,89,16,128,49,89,0,144,1,134, -4,22,128,93,8,0,0,9,116,107,0,8,16,72,8,89,12,38,0,9, -56,34,0,9,0,48,160,144,68,20,0,80,8,222,144,89,148,128, -36,88,0,16,129,140,240,32,0,9,136,25,160,88,66,0,37,58, -14,0,37,49,26,32,1,58,212,0,0,8,137,25,144,88,78,128,36, -58,200,0,0,8,0,0,0,0,0,48,168,144,140,81,0,0,13,30,144, -92,0,48,144,130,108,228,0,0,5,30,160,92,164,0,0,8,0,0, -0,0,0,48,168,144,140,81,0,0,9,30,144,92,0,48,144,130, -108,228,0,0,4,30,160,92,132,0,0,8,0,0,0,0,0,48,160,136, -2,4,0,136,8,30,144,92,1,47,5,90,0,48,144,130,108,228,0, -0,26,0,0,18,0,48,168,144,140,81,0,0,6,30,160,92,84,0,0, -8,0,0,0,0,42,32,21,48,22,32,5,48,0,48,168,144,140,81,0, -0,22,30,160,92,56,0,0,8,0,48,168,144,140,81,0,0,31,216, -161,89,40,0,0,8,26,32,5,48,0,48,168,144,140,81,0,0,31, -216,165,89,20,0,0,8,0,0,0,0,0,48,168,144,140,81,0,0,70, -0,160,140,176,96,165,146,136,35,0,9,180,42,0,9,224,30,0, -9,164,32,0,11,137,25,144,88,78,128,36,61,240,69,0,9,30, -32,4,61,0,48,168,144,112,228,0,0,0,48,160,140,20,0,173, -222,0,80,165,146,196,106,0,9,0,30,128,92,64,224,143,140, -16,71,0,11,30,32,4,58,64,224,167,144,0,48,168,144,140,81, -0,0,127,0,144,140,148,128,164,88,16,0,0,8,0,48,168,144, -140,81,0,0,1,25,160,89,180,96,165,146,0,48,160,140,48,3, -0,0,0,48,160,146,4,228,0,0,168,33,0,9,196,81,0,9,48,85, -0,9,1,30,128,92,216,105,0,9,0,0,0,10,0,48,128,144,8, -228,0,0,0,16,164,144,127,0,232,140,148,64,167,88,10,35,5, -58,2,9,165,89,238,33,77,52,20,57,160,144,32,89,0,0,0,16, -5,132,0,0,0,0,72,89,0,0,44,91,0,0,88,89,0,0,40,90,0, -0,104,89,0,0,240,89,0,0,8,90,0,0,248,90,0,0,48,90,0,0, -144,90,0,0,88,42,0,9,16,22,152,92,224,1,0,8,0,0,0,0, -24,45,0,9,16,22,152,92,208,1,0,8,0,0,0,0,0,48,160,144, -68,20,0,80,19,47,5,90,2,0,152,140,34,0,0,16,147,9,165, -88,0,48,240,146,164,86,0,0,0,48,160,146,68,20,0,80,20,0, -0,8,0,0,0,0,1,30,160,92,0,48,160,146,164,86,0,0,4,32, -172,144,0,48,128,140,96,0,0,32,31,88,166,89,0,48,144,140, -208,85,0,0,14,30,136,92,0,48,168,146,84,0,0,32,0,48,160, -146,96,0,0,32,1,73,140,89,0,144,164,176,145,48,0,90,16, -160,148,140,0,16,164,178,236,255,255,21,72,1,0,8,0,0,0, -0,24,74,0,11,144,48,0,90,2,0,152,140,54,1,0,21,10,30, -152,92,44,1,0,8,232,74,0,9,0,48,160,144,8,228,0,0,4,32, -141,144,16,30,128,92,0,48,144,140,176,228,0,0,236,20,0,9, -2,30,152,92,4,1,0,8,0,48,160,144,8,228,0,0,4,32,165, -144,0,48,160,146,64,0,0,32,0,48,160,144,0,225,1,240,0, -48,160,146,96,0,0,48,0,48,160,144,4,225,1,240,0,48,160, -146,96,0,0,48,0,48,160,144,100,224,1,240,0,48,160,146,96, -0,0,48,0,48,160,144,104,224,1,240,2,30,152,92,0,48,160, -146,96,0,0,48,168,0,0,8,0,0,0,0,0,48,160,144,8,228,0, -0,4,32,165,144,20,144,169,89,0,48,232,140,240,255,15,0,0, -48,168,146,252,2,0,0,149,69,175,89,0,48,232,140,0,240,15, -0,20,70,167,89,0,48,232,140,0,0,240,15,148,64,167,88,0, -48,232,140,240,255,15,0,0,48,160,146,248,2,0,0,149,64, -175,88,21,4,165,88,0,48,168,146,244,2,0,0,0,48,160,146, -240,2,0,0,60,0,0,8,0,48,160,144,8,228,0,0,0,16,165,144, -0,48,232,140,94,208,94,208,34,64,167,61,0,48,168,144,112, -228,0,0,0,48,160,140,13,0,173,222,0,30,128,92,0,80,165, -146,152,103,0,9,8,30,152,92,0,48,168,144,8,228,0,0,0,80, -165,144,150,32,61,48,0,48,160,144,12,228,0,0,16,96,189, -144,32,96,181,140,22,32,5,90,0,80,245,146,14,0,0,22,0, -48,176,144,16,228,0,0,0,48,160,144,116,228,0,0,0,48,184, -146,56,0,0,32,0,48,152,146,96,0,0,48,0,16,165,144,148, -48,0,90,0,48,176,146,8,228,0,0,66,0,0,18,0,48,168,144, -120,228,0,0,0,80,165,144,20,80,160,89,0,80,165,146,0,48, -168,144,96,81,0,0,255,1,232,140,21,80,168,89,149,64,167, -88,136,9,165,88,0,48,168,146,96,81,0,0,0,48,160,146,4,0, -0,32,0,0,0,10,0,48,160,144,12,228,0,0,16,96,189,144,32, -96,181,140,22,32,5,90,0,80,245,146,14,0,0,22,0,48,176, -144,16,228,0,0,0,48,184,146,56,0,0,32,0,48,176,146,8, -228,0,0,0,48,152,146,96,0,0,48,0,0,0,10,24,32,36,152,0, -48,168,144,140,228,0,0,4,65,161,89,20,96,5,90,0,16,52, -140,18,0,0,20,1,30,128,92,0,0,0,10,0,0,0,0,0,48,168, -144,80,3,0,0,58,96,5,58,0,48,160,144,104,3,0,0,1,73, -173,89,0,48,168,146,80,3,0,0,149,29,181,140,0,144,165, -144,5,16,170,89,0,80,161,146,28,32,172,146,4,160,133,144, -0,0,0,10,0,0,0,0,0,48,128,140,80,3,0,0,208,92,0,9,0, -48,168,144,80,3,0,0,54,96,5,58,0,48,160,144,104,3,0,0, -1,73,173,89,0,48,168,146,80,3,0,0,149,29,181,140,0,144, -165,144,5,16,170,89,0,80,161,146,28,160,169,146,4,160,133, -144,0,0,0,10,0,48,160,144,144,86,0,0,20,80,160,89,1,0, -128,140,0,48,160,146,144,86,0,0,0,0,0,10,0,0,0,0,24,32, -36,152,0,48,168,144,140,228,0,0,4,65,161,89,20,96,5,90, -0,16,52,140,18,0,0,20,1,30,128,92,0,0,0,10,0,0,0,0,0, -48,168,144,128,3,0,0,58,96,5,58,0,48,160,144,152,3,0,0, -1,73,173,89,0,48,168,146,128,3,0,0,149,29,181,140,0,144, -165,144,5,16,170,89,0,80,161,146,28,32,172,146,4,160,133, -144,0,0,0,10,0,0,0,0,0,48,128,140,128,3,0,0,0,92,0,9, -0,48,168,144,128,3,0,0,54,96,5,58,0,48,160,144,152,3,0, -0,1,73,173,89,0,48,168,146,128,3,0,0,149,29,181,140,0, -144,165,144,5,16,170,89,0,80,161,146,28,160,169,146,4,160, -133,144,0,0,0,10,0,48,160,144,148,86,0,0,20,80,160,89,1, -0,128,140,0,48,160,146,148,86,0,0,0,0,0,10,0,0,0,0,24, -32,36,152,0,48,168,144,140,228,0,0,4,65,161,89,20,96,5, -90,0,16,52,140,18,0,0,20,1,30,128,92,0,0,0,10,0,0,0,0, -0,48,168,144,176,3,0,0,58,96,5,58,0,48,160,144,200,3,0, -0,1,73,173,89,0,48,168,146,176,3,0,0,149,29,181,140,0, -144,165,144,5,16,170,89,0,80,161,146,28,32,172,146,4,160, -133,144,0,0,0,10,0,0,0,0,0,48,128,140,176,3,0,0,48,91, -0,9,0,48,168,144,176,3,0,0,54,96,5,58,0,48,160,144,200, -3,0,0,1,73,173,89,0,48,168,146,176,3,0,0,149,29,181,140, -0,144,165,144,5,16,170,89,0,80,161,146,28,160,169,146,4, -160,133,144,0,0,0,10,0,48,160,144,152,86,0,0,20,80,160, -89,1,0,128,140,0,48,160,146,152,86,0,0,0,0,0,10,0,0,0, -0,24,32,36,152,0,48,168,144,140,228,0,0,4,65,161,89,20, -96,5,90,0,16,52,140,18,0,0,20,1,30,128,92,0,0,0,10,0, -0,0,0,0,48,168,144,32,228,0,0,58,96,5,58,0,48,160,144, -56,228,0,0,1,73,173,89,0,48,168,146,32,228,0,0,149,29, -181,140,0,144,165,144,5,16,170,89,0,80,161,146,28,32,172, -146,4,160,133,144,0,0,0,10,0,0,0,0,0,48,128,140,32,228, -0,0,96,90,0,9,0,48,168,144,32,228,0,0,54,96,5,58,0,48, -160,144,56,228,0,0,1,73,173,89,0,48,168,146,32,228,0,0, -149,29,181,140,0,144,165,144,5,16,170,89,0,80,161,146,28, -160,169,146,4,160,133,144,0,0,0,10,0,48,160,144,156,86,0, -0,20,80,160,89,1,0,128,140,0,48,160,146,156,86,0,0,0,0, -0,10,0,0,0,0,64,96,8,140,112,224,199,178,16,22,192,92,0, -48,128,140,80,3,0,0,31,88,140,89,232,96,0,9,0,48,128, -140,128,3,0,0,31,88,140,89,216,96,0,9,0,48,128,140,176, -3,0,0,31,88,140,89,200,96,0,9,0,48,128,140,32,228,0,0, -31,88,140,89,184,96,0,9,0,48,160,140,144,86,0,0,0,48, -160,146,120,3,0,0,0,48,160,140,148,86,0,0,0,48,160,146, -168,3,0,0,0,48,160,140,152,86,0,0,0,48,160,146,216,3,0, -0,0,48,160,140,156,86,0,0,0,48,160,146,72,228,0,0,120, -32,166,144,0,48,160,146,96,3,0,0,136,32,174,144,0,48,168, -146,144,3,0,0,152,32,182,144,0,48,176,146,192,3,0,0,168, -32,190,144,64,32,38,140,148,48,0,90,0,48,184,146,48,228, -0,0,30,0,0,21,26,96,5,61,22,160,5,61,18,224,5,61,8,30, -128,92,112,224,199,176,0,0,0,10,52,32,169,144,0,48,168, -146,100,3,0,0,68,32,177,144,0,48,176,146,148,3,0,0,84, -32,185,144,0,48,184,146,196,3,0,0,0,48,160,144,96,3,0,0, -100,32,129,144,148,48,0,90,0,48,128,146,52,228,0,0,14,0, -0,18,63,0,200,140,178,95,174,62,0,48,160,144,144,3,0,0, -14,32,5,58,63,0,200,140,158,95,182,62,0,48,160,144,192,3, -0,0,14,32,5,58,63,0,200,140,138,95,190,62,0,48,160,144, -48,228,0,0,14,32,5,58,63,0,200,140,118,95,134,62,0,48, -160,144,96,3,0,0,38,32,5,58,0,48,160,144,144,3,0,0,26, -32,5,58,0,48,168,144,100,3,0,0,0,48,160,144,148,3,0,0, -74,31,173,57,0,48,160,144,192,3,0,0,38,32,5,58,0,48,160, -144,48,228,0,0,26,32,5,58,0,48,168,144,196,3,0,0,0,48, -160,144,52,228,0,0,30,31,173,57,0,48,160,144,96,3,0,0, -46,32,5,61,0,48,168,144,148,3,0,0,0,48,160,140,224,92,0, -0,0,48,160,146,80,228,0,0,0,48,168,146,100,3,0,0,24,0, -0,8,0,0,0,0,0,48,160,140,16,92,0,0,0,48,160,146,80,228, -0,0,0,48,160,144,192,3,0,0,42,32,5,61,0,48,168,144,52, -228,0,0,0,48,160,140,128,94,0,0,0,48,160,146,84,228,0,0, -0,48,168,146,196,3,0,0,20,0,0,8,0,48,160,140,176,93,0, -0,0,48,160,146,84,228,0,0,60,32,185,144,0,48,184,146,92, -3,0,0,76,32,129,144,0,48,128,146,140,3,0,0,92,32,145, -144,0,48,144,146,188,3,0,0,0,48,232,144,96,3,0,0,108,32, -153,144,157,48,0,90,0,48,152,146,44,228,0,0,10,0,0,18, -86,254,5,59,31,216,39,89,78,30,185,49,151,208,160,88,70, -62,5,61,0,48,136,144,144,3,0,0,10,96,4,58,54,62,4,59, -50,30,129,49,144,208,160,88,42,62,5,61,0,48,176,144,192, -3,0,0,10,160,5,58,26,190,4,59,22,30,145,49,146,208,160, -88,14,62,5,61,0,48,168,144,48,228,0,0,10,96,5,58,254, -253,4,59,250,29,153,49,147,208,160,88,242,61,5,61,10,96, -7,58,234,221,237,60,10,96,4,58,226,29,140,60,10,160,5,58, -218,157,180,60,10,96,5,58,210,221,172,60,0,48,104,144,144, -3,0,0,0,48,128,176,128,3,0,0,0,48,24,144,96,3,0,0,0, -48,160,176,80,3,0,0,0,48,120,144,48,228,0,0,0,48,64,176, -32,228,0,0,0,48,112,144,192,3,0,0,0,48,32,176,176,3,0, -0,23,193,232,89,1,205,96,89,0,80,175,140,12,22,176,92,0, -48,160,146,80,3,0,0,0,48,232,146,84,3,0,0,0,48,184,146, -92,3,0,0,0,48,96,146,88,3,0,0,19,65,163,89,1,77,107,89, -0,16,141,140,13,22,144,92,0,48,128,146,128,3,0,0,0,48, -160,146,132,3,0,0,0,48,104,146,136,3,0,0,0,48,152,146, -140,3,0,0,7,129,163,89,1,141,115,89,0,16,45,140,14,22, -48,92,0,48,32,146,176,3,0,0,0,48,160,146,180,3,0,0,0, -48,112,146,184,3,0,0,0,48,56,146,188,3,0,0,11,193,163, -89,1,205,123,89,0,16,77,140,15,22,80,92,0,48,64,146,32, -228,0,0,0,48,160,146,36,228,0,0,131,48,0,90,0,48,120, -146,40,228,0,0,0,48,128,140,80,3,0,0,0,30,32,92,0,48, -88,146,44,228,0,0,98,0,0,18,112,32,142,144,16,22,208,92, -0,48,216,140,56,3,0,0,0,48,128,146,48,3,0,0,0,48,216, -146,52,3,0,0,228,38,0,9,144,48,2,90,1,0,32,140,142,252, -255,18,0,48,160,144,108,3,0,0,12,32,166,146,0,48,128,144, -96,3,0,0,3,14,132,89,76,58,0,9,144,48,0,90,0,48,128, -146,104,3,0,0,98,252,255,18,0,48,160,144,144,3,0,0,148, -48,0,90,0,48,128,140,144,3,0,0,126,0,0,18,16,9,204,89, -132,57,160,140,0,0,0,0,0,48,168,140,48,3,0,0,96,224,207, -146,20,124,181,140,8,0,0,0,100,224,183,146,96,224,207,144, -128,32,142,144,20,64,165,89,16,9,132,89,0,16,205,146,4, -32,181,146,84,38,0,9,144,48,2,90,1,32,33,140,254,251,255, -18,0,48,160,144,156,3,0,0,16,32,166,146,0,48,128,144,144, -3,0,0,3,14,132,89,188,57,0,9,144,48,0,90,0,48,128,146, -152,3,0,0,210,251,255,18,0,48,160,144,192,3,0,0,148,48, -0,90,0,48,128,140,192,3,0,0,126,0,0,18,16,9,204,89,132, -57,160,140,0,0,0,0,0,48,168,140,48,3,0,0,80,224,207,146, -20,124,181,140,8,0,0,0,84,224,183,146,80,224,207,144,144, -32,142,144,20,64,165,89,16,9,132,89,0,16,205,146,4,32, -181,146,196,37,0,9,144,48,2,90,1,32,33,140,110,251,255, -18,0,48,160,144,204,3,0,0,20,32,166,146,0,48,128,144,192, -3,0,0,3,14,132,89,44,57,0,9,144,48,0,90,0,48,128,146, -200,3,0,0,66,251,255,18,0,48,160,144,48,228,0,0,148,48, -0,90,0,48,128,140,48,228,0,0,126,0,0,18,16,9,204,89,132, -57,160,140,0,0,0,0,0,48,168,140,48,3,0,0,64,224,207,146, -20,124,181,140,8,0,0,0,68,224,183,146,64,224,207,144,160, -32,142,144,20,64,165,89,16,9,132,89,0,16,205,146,4,32, -181,146,52,37,0,9,144,48,2,90,1,32,33,140,222,250,255,18, -0,48,160,144,60,228,0,0,24,32,166,146,0,48,128,144,48, -228,0,0,3,14,132,89,156,56,0,9,144,48,0,90,0,48,128,146, -56,228,0,0,178,250,255,18,0,48,160,140,48,3,0,0,2,30, -128,92,132,61,165,146,252,255,255,255,112,224,199,176,0,0, -0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,22,32,92,0,48,128, -146,104,228,0,0,1,9,164,89,0,80,44,140,144,64,129,112,0, -48,240,146,8,3,0,0,0,48,240,146,4,3,0,0,0,48,160,146, -12,3,0,0,48,56,0,9,144,48,0,90,0,48,128,146,96,228,0,0, -18,0,0,21,8,30,128,92,0,0,0,10,0,0,0,0,4,57,128,140,0, -0,0,0,8,56,0,9,144,48,0,90,0,48,128,146,0,3,0,0,18,0, -0,21,8,30,128,92,0,0,0,10,0,0,0,0,0,0,176,140,150,32, -1,90,0,48,184,144,96,228,0,0,98,0,0,19,0,47,1,90,0,0, -136,140,30,0,0,16,1,30,176,92,150,32,1,90,23,64,164,89, -23,64,185,89,0,16,164,146,62,0,0,19,0,48,168,144,0,3,0, -0,23,64,164,89,22,93,165,146,0,48,168,144,0,3,0,0,23,64, -185,89,23,64,164,89,22,125,165,146,4,0,0,0,22,144,176,89, -150,32,1,90,23,64,185,89,204,255,255,20,2,14,129,89,116, -55,0,9,144,48,0,90,0,48,128,146,100,228,0,0,14,0,0,21, -8,30,128,92,0,0,0,10,0,0,176,140,62,0,177,59,22,32,1, -48,1,30,176,92,150,32,1,90,0,16,244,146,42,0,0,19,0,48, -160,144,100,228,0,0,22,29,245,146,0,48,160,144,100,228,0, -0,22,61,245,146,4,0,0,0,22,144,176,89,224,31,177,60,2, -30,128,92,0,0,0,10,0,48,168,144,4,3,0,0,0,48,160,144,0, -3,0,0,21,29,165,140,0,16,149,144,146,48,0,90,0,16,44, -140,17,22,32,92,54,0,0,18,0,16,245,146,0,48,160,144,4,3, -0,0,0,48,168,144,104,228,0,0,0,144,140,146,16,16,134,89, -8,160,180,140,0,16,148,146,4,32,180,146,92,0,0,8,0,0,0, -0,0,48,160,144,84,81,0,0,106,32,5,59,188,1,0,9,0,48, -168,144,4,3,0,0,0,48,160,144,0,3,0,0,21,29,165,140,0, -16,149,144,74,160,4,58,0,16,245,146,0,48,160,144,4,3,0, -0,0,48,168,144,104,228,0,0,0,144,36,146,5,16,182,89,8, -160,188,140,0,144,149,146,4,160,189,146,1,73,173,89,1,32, -165,140,148,64,165,88,1,0,128,140,0,48,160,146,4,3,0,0, -0,0,0,10,0,48,160,144,160,86,0,0,20,80,160,89,0,0,128, -140,0,48,160,146,160,86,0,0,0,0,0,10,0,0,0,0,0,0,0,0, -0,0,0,0,0,48,136,144,140,228,0,0,16,22,32,92,16,47,0,9, -0,48,176,144,132,228,0,0,0,48,128,144,8,3,0,0,0,48,160, -144,8,3,0,0,0,48,168,144,104,228,0,0,0,48,184,144,0,3, -0,0,20,80,160,89,22,58,176,140,16,0,0,0,1,73,173,89,0, -16,177,146,148,64,165,88,16,221,37,146,0,48,160,146,8,3, -0,0,0,0,0,10,0,48,240,140,152,104,0,0,30,22,136,92,0,0, -240,140,0,48,168,144,88,81,0,0,0,48,184,144,100,228,0,0, -0,48,160,144,104,228,0,0,0,48,176,144,84,81,0,0,21,221, -133,144,1,9,165,89,1,96,173,140,149,0,173,88,1,137,181, -89,0,48,168,146,88,81,0,0,0,48,176,146,84,81,0,0,0,80, -4,132,0,0,0,10,0,0,0,0,0,48,240,140,12,105,0,0,30,22, -144,92,0,0,240,140,0,48,160,144,160,86,0,0,0,48,184,144, -92,81,0,0,0,48,136,144,100,228,0,0,0,48,168,144,104,228, -0,0,0,48,176,144,84,81,0,0,20,80,160,89,0,48,160,146, -160,86,0,0,1,73,173,89,1,224,165,140,148,64,165,88,23,93, -132,146,22,80,176,89,0,48,160,146,92,81,0,0,0,48,176,146, -84,81,0,0,0,144,4,132,0,0,0,10,0,48,64,140,88,81,0,0, -0,48,56,140,16,3,0,0,0,48,72,140,4,0,0,32,0,48,48,140, -8,3,0,0,0,48,136,144,16,3,0,0,0,80,164,144,110,33,5,58, -0,16,162,144,0,48,176,144,100,228,0,0,0,48,168,144,104, -228,0,0,20,157,37,144,1,73,173,89,1,32,165,140,148,64, -165,88,0,16,162,146,4,16,169,89,0,80,181,144,0,48,160, -144,84,81,0,0,0,48,128,140,255,255,0,0,150,0,132,88,0, -80,133,146,0,80,140,144,1,9,165,89,0,48,160,146,84,81,0, -0,4,22,144,92,144,56,128,140,9,0,0,0,3,12,132,89,144, -141,45,89,100,5,0,9,0,208,161,144,0,48,168,144,20,3,0,0, -20,16,178,89,4,32,189,144,22,96,5,90,0,16,245,146,14,0, -0,22,0,48,176,144,24,3,0,0,0,48,160,144,116,228,0,0,0, -48,184,146,56,0,0,32,129,73,169,88,0,48,168,146,96,0,0, -48,0,16,165,144,148,48,0,90,0,208,177,146,62,0,0,18,0, -48,168,144,120,228,0,0,0,80,165,144,20,80,160,89,0,80, -165,146,0,48,168,144,96,81,0,0,255,1,152,140,21,80,168, -89,149,192,164,88,0,48,168,146,96,81,0,0,136,9,165,88,0, -80,162,146,0,48,136,144,140,228,0,0,4,22,128,92,180,44,0, -9,0,48,160,144,132,228,0,0,0,48,128,144,8,3,0,0,0,48, -184,144,0,3,0,0,0,48,176,144,104,228,0,0,0,48,168,144, -84,81,0,0,20,58,160,140,16,0,0,0,0,16,161,146,0,144,161, -144,149,48,0,90,16,221,37,146,1,137,181,89,1,32,165,140, -148,128,165,88,0,144,161,146,148,254,255,17,0,0,0,10,0,0, -0,0,0,0,0,10,0,0,0,0,88,32,164,144,148,48,1,90,0,144, -236,140,19,22,48,92,26,0,0,18,14,32,37,52,210,32,5,58,0, -1,0,8,106,32,45,58,248,0,0,8,50,224,20,61,0,48,160,144, -52,86,0,0,0,48,168,144,72,86,0,0,17,0,141,89,1,96,173, -140,0,48,136,146,52,86,0,0,0,48,168,146,72,86,0,0,200,0, -0,8,0,48,160,144,64,86,0,0,0,48,168,144,80,86,0,0,17,0, -141,89,1,96,173,140,0,48,136,146,64,86,0,0,0,48,168,146, -80,86,0,0,156,0,0,8,0,0,0,0,50,224,20,61,0,48,160,144, -100,86,0,0,0,48,168,144,116,86,0,0,17,0,141,89,1,96,173, -140,0,48,136,146,100,86,0,0,0,48,168,146,116,86,0,0,104, -0,0,8,0,48,160,144,104,86,0,0,0,48,168,144,128,86,0,0, -17,0,141,89,1,96,173,140,0,48,136,146,104,86,0,0,0,48, -168,146,128,86,0,0,60,0,0,8,0,0,0,0,34,224,20,61,0,48, -160,144,36,86,0,0,17,0,141,89,0,48,136,146,36,86,0,0,28, -0,0,8,0,0,0,0,0,48,160,144,40,86,0,0,17,0,141,89,0,48, -136,146,40,86,0,0,24,32,36,152,4,65,161,89,8,9,165,89,3, -12,165,89,4,32,161,146,88,32,164,144,4,16,138,89,148,48, -0,90,48,32,164,176,22,0,0,18,18,64,149,62,4,16,140,89, -21,129,236,89,12,32,169,146,26,128,237,60,22,65,239,89,4, -96,180,146,157,160,5,90,8,96,140,140,240,255,255,19,10,96, -7,59,4,96,236,146,0,48,160,144,84,81,0,0,10,32,5,59,224, -252,255,9,0,48,136,144,16,3,0,0,0,80,164,144,122,32,5, -61,4,32,129,144,0,48,144,144,92,81,0,0,0,48,136,144,100, -228,0,0,0,48,168,144,92,81,0,0,0,48,176,144,104,228,0,0, -0,48,184,144,84,81,0,0,16,142,161,89,148,3,164,88,4,32, -161,146,18,93,36,146,0,48,160,144,160,86,0,0,1,137,181, -89,1,96,173,140,149,128,173,88,1,224,189,140,0,48,168,146, -92,81,0,0,0,48,184,146,84,81,0,0,20,80,160,89,0,48,160, -146,160,86,0,0,0,0,0,10,4,32,129,144,0,80,140,144,4,22, -144,92,144,56,128,140,9,0,0,0,131,13,132,89,64,2,0,9,0, -48,160,144,16,3,0,0,0,48,168,144,20,3,0,0,20,16,178,89, -4,32,189,144,22,96,5,90,0,16,245,146,14,0,0,22,0,48,176, -144,24,3,0,0,134,48,2,90,0,48,184,146,56,0,0,32,129,137, -161,88,0,48,176,146,16,3,0,0,0,48,160,146,96,0,0,48,34, -0,0,21,0,144,165,144,102,32,5,61,0,48,160,144,116,228,0, -0,0,16,165,144,86,32,5,58,20,0,0,8,0,48,160,144,116,228, -0,0,0,16,165,144,66,32,5,58,0,48,168,144,120,228,0,0,0, -80,165,144,20,80,160,89,0,80,165,146,0,48,168,144,96,81, -0,0,255,1,56,140,21,80,168,89,149,192,161,88,136,9,165, -88,0,48,168,146,96,81,0,0,0,48,160,146,4,0,0,32,0,48, -136,144,140,228,0,0,4,22,128,92,100,41,0,9,0,48,176,144, -132,228,0,0,0,48,128,144,8,3,0,0,0,48,160,144,8,3,0,0, -0,48,168,144,104,228,0,0,0,48,184,144,0,3,0,0,20,80,160, -89,22,58,176,140,16,0,0,0,1,73,173,89,0,16,177,146,148, -64,165,88,16,221,37,146,0,48,160,146,8,3,0,0,0,0,0,10, -144,68,148,101,0,0,0,10,5,56,0,102,0,0,0,10,33,22,128, -92,0,0,0,10,16,54,8,92,16,22,128,92,16,22,128,92,16,22, -128,92,16,22,128,92,16,22,128,92,16,22,128,92,16,22,128, -92,16,22,128,92,0,0,0,10,16,54,0,92,0,0,0,10,32,22,128, -92,0,0,0,10,0,48,32,140,0,0,31,0,16,14,44,89,132,2,41, -101,5,22,128,92,0,0,0,10,144,18,128,101,0,0,0,10,0,48, -32,140,255,255,255,255,16,64,36,97,4,22,128,92,0,0,0,10, -16,64,148,97,18,22,128,92,0,0,0,10,16,65,36,97,4,22,128, -92,0,0,0,10,0,0,0,0,0,0,0,0,0,30,152,92,0,48,136,146, -48,0,0,32,147,32,4,90,144,57,160,140,0,0,0,0,0,48,160, -146,96,0,0,32,82,0,0,19,0,48,232,140,8,0,0,16,0,48,136, -140,0,0,0,48,0,80,167,144,22,32,61,52,0,48,168,140,8,0, -0,16,0,80,165,144,252,63,61,51,0,80,164,176,0,144,164, -178,0,80,164,176,19,80,152,89,16,160,148,140,147,32,4,90, -0,144,164,178,18,16,148,89,200,255,255,20,0,0,0,10,0,0, -0,0,0,0,0,0,0,0,0,0,0,30,152,92,0,48,136,146,84,0,0, -32,147,32,4,90,144,57,160,140,0,0,0,0,0,48,160,146,96,0, -0,32,50,0,0,19,0,48,136,140,96,0,0,48,0,144,164,176,18, -16,148,89,1,224,156,140,147,32,4,90,0,80,164,178,0,144, -164,176,18,16,148,89,0,80,164,178,224,255,255,20,0,0,0, -10,0,0,0,0,0,0,0,0,0,0,0,0,144,176,0,90,0,48,136,146, -84,0,0,32,16,22,152,92,0,144,140,140,0,48,128,146,96,0, -0,32,42,0,0,18,18,32,20,60,50,32,12,58,64,0,0,8,0,0,0, -0,58,32,28,61,0,144,164,144,18,16,137,89,0,48,160,146,96, -0,0,32,0,80,164,144,17,16,137,89,0,48,160,146,96,0,0,32, -0,80,164,144,0,48,160,146,96,0,0,32,0,0,0,10,0,0,0,0, -146,208,163,88,50,32,69,58,18,32,69,52,22,32,37,58,76,0, -0,8,0,0,0,0,50,32,101,58,64,0,0,8,0,144,164,144,18,16, -137,89,1,9,156,89,0,48,160,146,96,0,0,32,0,80,164,144, -17,16,137,89,1,201,156,89,0,48,160,146,96,0,0,32,0,80, -164,144,17,16,137,89,1,201,156,89,0,48,160,146,96,0,0,32, -38,224,28,59,0,48,128,140,96,0,0,32,4,201,156,89,0,80, -164,176,147,240,0,90,16,96,140,140,0,16,164,178,236,255, -255,17,38,224,4,59,0,48,168,140,96,0,0,32,1,201,156,89, -0,80,164,144,147,48,0,90,4,96,140,140,0,80,165,146,236, -255,255,17,0,0,0,10,255,0,176,140,144,128,133,88,0,0,168, -140,0,48,136,140,255,179,196,4,0,48,184,140,4,0,0,16,0, -48,128,146,4,0,0,32,0,208,165,144,148,128,165,88,38,0, -164,58,21,80,168,89,240,95,172,62,0,48,168,144,112,228,0, -0,0,48,160,140,6,0,173,222,0,80,165,146,132,82,0,8,0,0, -0,10,0,0,0,0,0,0,0,0,0,0,0,0,255,0,184,140,0,30,168, -92,0,48,136,140,255,179,196,4,0,48,128,140,4,0,0,16,0, -48,176,128,96,81,0,0,0,16,164,144,148,192,165,88,42,128, -165,58,21,80,168,89,240,95,172,62,0,48,168,144,112,228,0, -0,0,48,160,140,7,0,173,222,0,80,165,146,40,82,0,8,0,0, -0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,240,140, -160,113,0,0,30,22,128,92,0,0,240,140,0,48,160,144,116, -228,0,0,0,16,165,144,66,32,5,58,0,48,168,144,120,228,0, -0,0,80,165,144,20,80,160,89,0,80,165,146,0,48,168,144,96, -81,0,0,255,1,176,140,21,80,168,89,149,128,165,88,136,9, -165,88,0,48,168,146,96,81,0,0,0,48,160,146,4,0,0,32,0, -16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,22,40, -92,1,73,49,89,0,0,32,140,0,48,64,140,16,39,0,0,2,142, -57,89,108,252,255,9,5,1,132,88,92,252,255,9,4,22,160,92, -148,32,2,90,1,32,33,140,158,0,0,22,150,160,249,52,0,244, -161,144,248,113,0,0,0,16,5,132,0,0,0,0,120,114,0,0,120, -114,0,0,120,114,0,0,120,114,0,0,120,114,0,0,120,114,0,0, -120,114,0,0,120,114,0,0,120,114,0,0,120,114,0,0,120,114, -0,0,120,114,0,0,120,114,0,0,120,114,0,0,120,114,0,0,120, -114,0,0,120,114,0,0,120,114,0,0,120,114,0,0,120,114,0,0, -120,114,0,0,120,114,0,0,120,114,0,0,120,114,0,0,120,114, -0,0,120,114,0,0,120,114,0,0,120,114,0,0,120,114,0,0,120, -114,0,0,120,114,0,0,120,114,0,0,216,80,0,9,184,251,255, -9,144,64,129,88,68,63,4,61,1,30,128,92,0,0,0,10,64,96, -8,140,0,116,128,178,192,255,255,255,0,116,160,178,208,255, -255,255,0,116,192,178,224,255,255,255,0,116,224,178,240, -255,255,255,0,48,160,144,108,81,0,0,34,32,5,61,0,48,168, -144,112,228,0,0,0,48,160,140,1,0,173,222,0,80,165,146, -124,80,0,9,232,79,0,9,0,48,160,144,0,0,0,16,210,0,136, -140,148,64,164,88,40,0,136,140,148,67,164,88,0,0,32,140, -0,48,40,140,16,39,0,0,0,48,160,146,0,0,0,16,44,251,255, -9,0,14,132,88,28,251,255,9,4,22,160,92,148,96,1,90,1,32, -33,140,10,0,0,22,44,80,0,9,12,251,255,9,220,63,4,55,0, -48,168,144,120,81,0,0,0,48,160,144,116,81,0,0,149,48,0, -90,1,32,165,140,0,48,160,146,116,81,0,0,90,0,0,18,0,48, -160,144,116,228,0,0,0,16,165,144,82,32,5,58,0,48,168,144, -120,228,0,0,0,80,165,144,20,80,160,89,0,80,165,146,0,48, -168,144,96,81,0,0,255,1,136,140,21,80,168,89,149,64,164, -88,136,9,165,88,0,48,168,146,96,81,0,0,0,48,160,146,4,0, -0,32,16,0,0,8,0,0,0,0,0,48,240,146,108,81,0,0,0,116, -128,176,192,255,255,255,0,116,160,176,208,255,255,255,0, -116,192,176,224,255,255,255,0,116,224,176,240,255,255,255, -3,54,8,92,0,0,0,10,0,0,0,0,0,0,0,0,64,96,8,140,0,116, -128,178,192,255,255,255,0,116,160,178,208,255,255,255,0, -116,192,178,224,255,255,255,0,116,224,178,240,255,255,255, -0,48,160,144,68,20,0,80,14,32,37,48,10,32,133,48,156,3, -0,9,0,48,160,144,68,20,0,80,14,32,45,48,10,32,141,48, -168,3,0,9,0,48,160,144,68,20,0,80,14,32,53,48,10,32,149, -48,180,3,0,9,0,48,160,144,68,12,0,80,14,32,21,48,10,32, -29,48,192,3,0,9,0,30,32,92,0,48,40,140,16,39,0,0,212, -249,255,9,4,14,132,88,196,249,255,9,4,22,160,92,148,96,1, -90,1,32,33,140,10,0,0,22,212,78,0,9,180,249,255,9,220, -63,36,55,0,116,128,176,192,255,255,255,0,116,160,176,208, -255,255,255,0,116,192,176,224,255,255,255,0,116,224,176, -240,255,255,255,3,54,8,92,0,0,0,10,64,96,8,140,0,116, -128,178,192,255,255,255,0,116,160,178,208,255,255,255,0, -116,192,178,224,255,255,255,0,116,224,178,240,255,255,255, -0,48,160,144,132,81,0,0,34,32,5,61,0,48,168,144,112,228, -0,0,0,48,160,140,2,0,173,222,0,80,165,146,92,78,0,9,200, -77,0,9,0,30,32,92,0,48,40,140,16,39,0,0,56,4,0,9,40, -249,255,9,5,14,132,88,24,249,255,9,4,22,160,92,148,96,1, -90,1,32,33,140,10,0,0,22,40,78,0,9,8,249,255,9,220,63, -44,55,0,116,128,176,192,255,255,255,0,116,160,176,208,255, -255,255,0,116,192,176,224,255,255,255,0,116,224,176,240, -255,255,255,3,54,8,92,0,0,0,10,0,0,0,0,64,96,8,140,0, -116,128,178,192,255,255,255,0,116,160,178,208,255,255,255, -0,116,192,178,224,255,255,255,0,116,224,178,240,255,255, -255,0,48,160,144,104,81,0,0,34,32,5,61,0,48,168,144,112, -228,0,0,0,48,160,140,3,0,173,222,0,80,165,146,172,77,0, -9,24,77,0,9,0,48,160,144,0,0,0,16,210,0,136,140,148,64, -164,88,128,9,165,88,0,0,32,140,0,48,40,140,16,39,0,0,0, -48,160,146,0,0,0,16,96,248,255,9,2,14,132,88,80,248,255, -9,4,22,160,92,148,96,1,90,1,32,33,140,10,0,0,22,96,77, -0,9,64,248,255,9,220,63,20,55,0,116,128,176,192,255,255, -255,0,116,160,176,208,255,255,255,0,116,192,176,224,255, -255,255,0,116,224,176,240,255,255,255,3,54,8,92,0,0,0,10, -0,0,0,0,0,0,0,0,0,0,0,0,64,96,8,140,0,116,128,178,192, -255,255,255,0,116,160,178,208,255,255,255,0,116,192,178, -224,255,255,255,0,116,224,178,240,255,255,255,0,48,160,144, -100,81,0,0,34,32,5,61,0,48,168,144,112,228,0,0,0,48,160, -140,4,0,173,222,0,80,165,146,220,76,0,9,72,76,0,9,0,116, -128,176,192,255,255,255,0,116,160,176,208,255,255,255,0, -116,192,176,224,255,255,255,0,116,224,176,240,255,255,255, -3,54,8,92,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,68,247, -255,9,4,32,36,144,16,32,44,144,0,30,128,92,0,48,64,140, -1,50,0,0,60,247,255,9,0,30,128,92,4,0,72,140,88,247,255, -9,0,48,88,140,32,88,0,0,28,32,89,146,16,32,65,154,0,48, -160,140,144,114,0,0,76,96,161,146,0,48,160,140,96,117,0, -0,0,48,168,140,48,118,0,0,0,48,176,140,224,115,0,0,1,4, -128,140,0,30,136,92,0,0,144,140,140,96,161,146,204,96,169, -146,12,97,177,146,200,246,255,9,0,30,128,92,0,247,255,9, -255,15,128,140,208,246,255,9,1,30,128,92,0,247,255,8,180, -246,255,9,4,32,36,144,16,32,44,144,0,30,128,92,180,246, -255,9,0,30,128,92,212,246,255,9,84,0,160,140,20,32,161, -146,0,48,160,140,0,88,0,0,0,48,168,140,224,115,0,0,0,48, -176,140,176,116,0,0,1,4,128,140,0,30,136,92,0,0,144,140, -28,32,161,146,12,97,169,146,76,97,177,146,88,246,255,9,0, -30,128,92,144,246,255,9,255,15,128,140,96,246,255,9,1,30, -128,92,144,246,255,8,0,48,168,144,112,228,0,0,0,48,160, -140,16,0,173,222,0,80,165,146,140,75,0,9,1,30,128,92,244, -74,0,8,0,48,168,144,112,228,0,0,0,48,160,140,17,0,173, -222,0,80,165,146,108,75,0,9,1,30,128,92,212,74,0,8,0,48, -168,144,112,228,0,0,0,48,160,140,18,0,173,222,0,80,165, -146,76,75,0,9,1,30,128,92,180,74,0,8,0,48,168,144,112, -228,0,0,0,48,160,140,19,0,173,222,0,80,165,146,44,75,0, -9,1,30,128,92,148,74,0,8,0,48,240,140,84,120,0,0,30,22, -136,92,0,0,240,140,255,0,160,140,144,0,133,88,0,48,128, -146,8,28,0,80,0,80,4,132,0,0,0,10,0,0,0,0,0,0,0,0, -136,25,176,88,144,160,5,90,0,30,160,93,62,0,0,18,18,128, -133,49,30,32,4,58,88,0,0,8,0,0,0,0,137,25,232,88,62,64, -135,58,72,0,0,8,0,0,0,0,0,48,160,140,130,184,97,202,0, -48,168,140,118,116,210,62,48,0,0,8,0,0,0,0,0,48,160,140, -222,153,139,252,0,48,168,140,59,93,202,62,24,0,0,8,0,0, -0,0,0,48,160,140,216,182,122,157,0,48,168,140,98,194,199, -62,0,30,144,92,0,48,152,140,132,215,119,65,20,22,128,93, -160,104,0,9,192,98,0,9,255,0,160,140,144,0,133,88,0,48, -128,146,8,28,0,80,0,0,0,10,0,0,0,0,0,48,240,140,48,121, -0,0,30,22,128,92,0,0,240,140,0,48,160,144,4,28,0,80,0, -48,240,146,132,81,0,0,1,14,165,88,0,48,160,146,4,28,0, -80,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48, -160,144,132,81,0,0,10,32,5,61,116,73,0,9,0,48,168,144,4, -28,0,80,137,73,173,88,10,96,85,48,138,73,173,88,0,48,160, -144,124,81,0,0,0,48,168,146,4,28,0,80,20,80,160,89,0,48, -160,146,124,81,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0, -30,22,32,92,0,48,128,144,140,81,0,0,6,222,136,89,176,70, -0,9,16,22,160,92,0,48,160,144,0,0,0,16,210,0,168,140, -148,64,165,88,128,9,173,88,0,48,168,146,0,0,0,16,0,48, -160,144,140,81,0,0,20,16,175,89,0,48,168,146,116,228,0,0, -0,48,160,144,140,81,0,0,32,32,173,140,0,48,168,146,120, -228,0,0,0,48,160,144,140,81,0,0,48,32,173,140,0,48,168, -146,112,228,0,0,0,48,160,144,140,81,0,0,44,32,173,140,0, -48,168,146,124,228,0,0,1,30,160,92,0,48,160,146,128,228, -0,0,0,48,160,144,140,81,0,0,0,48,168,140,0,184,0,0,40, -32,173,146,0,48,160,144,140,81,0,0,0,48,168,140,80,45,3, -0,36,32,173,146,0,48,160,144,140,81,0,0,0,48,168,140,12, -1,4,0,52,32,173,146,0,48,160,144,140,81,0,0,0,48,168, -144,144,81,0,0,16,96,181,144,16,142,173,89,56,32,173,146, -0,0,0,10,0,0,0,0,16,72,8,89,0,144,39,140,0,48,160,144, -144,81,0,0,0,48,168,140,237,254,17,206,8,32,173,146,0,48, -168,144,112,228,0,0,0,48,160,144,112,228,0,0,0,48,168, -144,112,228,0,0,0,80,181,144,1,137,173,89,0,16,173,146,0, -16,165,144,0,48,160,144,140,81,0,0,64,32,173,144,127,0, -176,140,149,128,165,88,148,48,0,90,222,0,0,18,148,112,0, -90,14,0,0,18,216,0,0,8,0,0,0,0,0,48,128,144,140,81,0, -0,40,12,0,9,16,22,160,92,64,224,167,146,0,48,160,144,140, -81,0,0,64,224,175,144,129,73,181,88,68,32,181,146,0,48, -160,144,140,81,0,0,64,32,173,144,135,25,136,88,149,64,164, -88,148,48,0,90,96,0,0,18,0,48,160,144,116,228,0,0,0,16, -173,144,149,48,0,90,76,0,0,18,0,48,160,144,120,228,0,0, -0,48,168,144,120,228,0,0,0,80,181,144,22,80,168,89,0,16, -173,146,0,48,160,144,96,81,0,0,20,80,168,89,0,80,165,140, -0,48,160,146,96,81,0,0,255,0,168,140,148,64,165,88,136,9, -173,88,0,48,168,146,4,0,0,32,0,48,160,144,140,81,0,0,0, -30,168,92,64,32,173,146,64,224,167,144,148,176,0,90,8,0, -0,21,0,0,0,10,16,0,0,8,0,0,0,0,8,0,0,8,0,0,0,0,16, -0,0,8,0,0,0,0,16,0,0,8,0,0,0,0,204,254,255,8,0,0,0, -0,0,0,0,10,0,0,0,0,16,72,8,89,0,144,167,140,0,48,168, -144,68,12,0,80,128,73,181,88,0,48,176,146,68,12,0,80,0, -48,168,144,68,12,0,80,0,78,181,88,0,48,176,146,68,12,0, -80,0,48,168,144,68,12,0,80,2,78,181,88,0,48,176,146,68, -12,0,80,0,30,168,92,0,48,168,146,72,16,0,80,1,30,168,92, -0,48,168,146,68,16,0,80,0,30,168,92,64,224,175,146,64, -224,175,144,21,240,0,90,14,0,0,22,128,0,0,8,0,0,0,0,64, -224,175,144,21,22,176,92,22,57,168,140,0,0,0,0,0,48,176, -140,16,16,0,80,21,128,173,89,0,0,176,140,21,128,173,89,0, -80,181,140,15,30,168,92,0,144,173,146,64,224,175,144,21, -22,176,92,22,57,168,140,0,0,0,0,0,48,176,140,0,16,0,80, -21,128,173,89,0,0,176,140,21,128,173,89,0,80,181,140,0, -30,168,92,0,144,173,146,64,224,183,144,22,80,168,89,0,80, -181,140,64,224,183,146,124,255,255,8,0,0,0,0,0,48,168, -144,4,28,0,80,130,73,181,88,0,48,176,146,4,28,0,80,0,48, -168,144,68,20,0,80,1,78,181,88,0,48,176,146,68,20,0,80, -244,1,168,140,0,48,168,146,48,20,0,80,0,48,168,144,68,20, -0,80,135,73,181,88,0,48,176,146,68,20,0,80,0,48,168,144, -68,20,0,80,134,73,181,88,0,48,176,146,68,20,0,80,0,48, -168,144,68,20,0,80,4,78,181,88,0,48,176,146,68,20,0,80, -0,48,168,144,68,20,0,80,5,78,181,88,0,48,176,146,68,20, -0,80,0,0,0,10,0,0,0,0,0,0,0,0,16,72,8,89,0,144,39, -140,0,30,160,92,0,48,160,146,0,0,0,16,0,48,160,144,0,0, -0,16,210,0,168,140,148,64,165,88,129,9,173,88,0,48,168, -146,0,0,0,16,0,48,160,144,0,0,0,16,208,0,168,140,148,64, -165,88,0,48,160,146,0,0,0,16,0,48,160,144,0,0,0,16,210, -0,168,140,148,64,165,88,128,9,173,88,0,48,168,146,0,0,0, -16,0,48,160,144,0,0,0,16,210,0,168,140,148,64,165,88,40, -0,168,140,148,67,165,88,0,48,160,146,0,0,0,16,10,30,128, -92,128,39,0,11,16,22,160,92,0,48,160,144,4,28,0,80,131, -9,173,88,0,48,168,146,4,28,0,80,31,216,132,89,96,39,0, -11,16,22,160,92,0,48,160,144,4,28,0,80,11,222,168,89,148, -67,165,88,0,48,168,140,56,24,0,0,148,96,5,90,16,0,0,18, -1,30,128,92,140,68,0,9,16,22,160,92,0,48,160,144,68,12, -0,80,148,48,0,90,16,0,0,18,1,30,128,92,112,68,0,9,16, -22,160,92,0,48,160,144,68,20,0,80,8,222,168,89,148,67, -165,88,8,222,168,89,148,96,5,90,16,0,0,18,1,30,128,92, -72,68,0,9,16,22,160,92,0,48,160,144,68,12,0,80,129,9, -173,88,0,48,168,146,68,12,0,80,0,48,160,144,68,12,0,80, -128,9,173,88,0,48,168,146,68,12,0,80,0,48,160,144,68,20, -0,80,130,9,173,88,0,48,168,146,68,20,0,80,0,48,160,144, -68,20,0,80,128,9,173,88,0,48,168,146,68,20,0,80,0,48, -160,144,68,20,0,80,10,14,173,88,0,48,168,146,68,20,0,80, -0,48,160,144,4,28,0,80,133,9,173,88,0,48,168,146,4,28,0, -80,0,48,160,144,4,28,0,80,132,9,173,88,0,48,168,146,4, -28,0,80,0,48,160,144,4,28,0,80,3,14,173,88,0,48,168,146, -4,28,0,80,0,48,128,140,176,30,4,0,64,38,0,11,16,22,160, -92,0,0,160,140,64,224,167,146,64,224,167,144,20,240,0,90, -10,0,0,22,164,0,0,8,64,224,167,144,20,22,168,92,21,57, -160,140,0,0,0,0,0,48,168,140,0,12,0,144,20,64,165,89,0, -0,176,140,20,128,173,89,0,80,165,140,64,224,175,144,21,22, -176,92,10,142,173,89,0,48,176,144,136,81,0,0,22,64,173, -89,0,16,173,146,64,224,167,144,20,22,168,92,21,57,160,140, -0,0,0,0,0,48,168,140,16,12,0,144,20,64,165,89,0,0,176, -140,20,128,173,89,0,80,165,140,64,224,175,144,21,22,176, -92,10,142,173,89,0,48,176,144,136,81,0,0,22,64,173,89,0, -16,173,146,64,224,175,144,21,80,160,89,0,16,173,140,64, -224,175,146,88,255,255,8,0,0,0,0,0,48,160,144,128,228,0, -0,148,112,0,90,108,0,0,21,0,48,160,144,136,81,0,0,141, -25,168,88,20,64,165,89,0,48,160,146,0,20,0,144,0,48,160, -144,136,81,0,0,141,25,168,88,20,64,165,89,0,48,160,146, -16,20,0,144,0,48,160,144,136,81,0,0,140,25,168,88,20,64, -165,89,0,48,160,146,0,24,0,144,0,48,160,144,136,81,0,0, -140,25,168,88,20,64,165,89,0,48,160,146,16,24,0,144,104, -1,0,8,0,0,0,0,0,30,160,92,64,224,167,146,64,224,167,144, -20,240,0,90,10,0,0,22,76,1,0,8,64,224,167,144,20,22,168, -92,21,57,160,140,0,0,0,0,0,48,168,140,0,20,0,144,20,64, -165,89,0,0,176,140,20,128,173,89,0,80,165,140,64,224,175, -144,11,222,176,89,149,128,173,112,141,25,176,88,21,128,173, -89,0,48,176,144,136,81,0,0,22,64,173,89,0,16,173,146,64, -224,167,144,20,22,168,92,21,57,160,140,0,0,0,0,0,48,168, -140,16,20,0,144,20,64,165,89,0,0,176,140,20,128,173,89,0, -80,165,140,64,224,175,144,11,222,176,89,149,128,173,112, -141,25,176,88,21,128,173,89,0,48,176,144,136,81,0,0,22, -64,173,89,0,16,173,146,64,224,167,144,20,22,168,92,21,57, -160,140,0,0,0,0,0,48,168,140,0,24,0,144,20,64,165,89,0, -0,176,140,20,128,173,89,0,80,165,140,64,224,175,144,21,22, -176,92,10,142,173,89,140,25,176,88,21,128,173,89,0,48,176, -144,136,81,0,0,22,64,173,89,0,16,173,146,64,224,167,144, -20,22,168,92,21,57,160,140,0,0,0,0,0,48,168,140,16,24,0, -144,20,64,165,89,0,0,176,140,20,128,173,89,0,80,165,140, -64,224,175,144,21,22,176,92,10,142,173,89,140,25,176,88, -21,128,173,89,0,48,176,144,136,81,0,0,22,64,173,89,0,16, -173,146,64,224,175,144,21,80,160,89,0,16,173,140,64,224, -175,146,176,254,255,8,0,0,0,0,1,30,160,92,0,48,160,146, -68,16,0,80,0,30,160,92,64,224,167,146,64,224,167,144,20, -240,0,90,14,0,0,22,128,0,0,8,0,0,0,0,64,224,167,144,20, -22,168,92,21,57,160,140,0,0,0,0,0,48,168,140,16,16,0,80, -20,64,165,89,0,0,168,140,20,64,165,89,0,16,173,140,15,30, -160,92,0,80,165,146,64,224,167,144,20,22,168,92,21,57,160, -140,0,0,0,0,0,48,168,140,0,16,0,80,20,64,165,89,0,0, -168,140,20,64,165,89,0,16,173,140,0,30,160,92,0,80,165, -146,64,224,175,144,21,80,160,89,0,16,173,140,64,224,175, -146,124,255,255,8,0,0,0,0,0,48,160,144,68,12,0,80,1,14, -173,88,0,48,168,146,68,12,0,80,0,48,160,144,68,12,0,80, -0,14,173,88,0,48,168,146,68,12,0,80,0,48,160,144,68,20, -0,80,2,14,173,88,0,48,168,146,68,20,0,80,0,48,160,144, -68,20,0,80,0,14,173,88,0,48,168,146,68,20,0,80,0,48,160, -144,68,20,0,80,138,9,173,88,0,48,168,146,68,20,0,80,0, -48,160,144,4,28,0,80,5,14,173,88,0,48,168,146,4,28,0,80, -0,48,160,144,4,28,0,80,4,14,173,88,0,48,168,146,4,28,0, -80,0,48,160,144,68,20,0,80,147,9,173,88,0,48,168,146,68, -20,0,80,0,30,128,92,0,0,0,10,0,0,0,10,0,0,0,0,30,22, -160,92,0,0,168,140,0,48,168,146,68,16,0,80,31,30,168,92, -0,48,168,146,72,16,0,80,0,48,168,128,108,228,0,0,0,48, -168,146,0,16,0,80,1,30,168,92,0,48,168,146,16,16,0,80,0, -48,168,128,108,228,0,0,0,48,168,146,4,16,0,80,1,30,168, -92,0,48,168,146,20,16,0,80,0,48,168,128,108,228,0,0,0, -48,168,146,8,16,0,80,1,30,168,92,0,48,168,146,24,16,0, -80,0,48,168,128,108,228,0,0,0,48,168,146,12,16,0,80,1, -30,168,92,0,48,168,146,28,16,0,80,0,0,0,10,0,16,188,144, -0,16,140,144,4,32,164,144,0,48,176,144,244,2,0,0,0,48, -144,144,248,2,0,0,0,48,152,144,252,2,0,0,0,48,168,144, -240,2,0,0,0,48,48,140,0,255,0,0,4,14,165,89,148,128,181, -88,148,128,164,88,19,4,165,89,150,3,181,88,150,64,173,88, -149,48,0,90,151,128,185,88,8,204,237,89,0,48,48,140,0,0, -255,0,145,128,137,88,16,76,140,89,18,0,0,18,10,30,128,92, -0,0,0,10,0,0,0,0,145,48,0,90,4,140,181,89,18,0,0,18, -118,96,12,58,228,255,255,8,0,0,0,0,0,48,160,144,144,3,0, -0,214,63,5,58,0,48,160,144,96,3,0,0,26,32,5,58,0,48, -160,144,144,228,0,0,34,32,5,61,10,160,253,52,26,160,117, -61,0,48,136,140,224,92,0,0,0,48,184,140,128,3,0,0,20,0, -0,8,0,48,184,140,80,3,0,0,0,48,136,144,80,228,0,0,0,48, -144,140,224,92,0,0,0,48,152,140,128,3,0,0,104,0,0,8,0, -0,0,0,0,48,160,144,48,228,0,0,110,63,5,58,0,48,160,144, -192,3,0,0,26,32,5,58,0,48,160,144,144,228,0,0,34,32,13, -61,10,160,253,52,26,160,117,61,0,48,136,140,128,94,0,0,0, -48,184,140,32,228,0,0,20,0,0,8,0,48,184,140,176,3,0,0, -0,48,136,144,84,228,0,0,0,48,144,140,128,94,0,0,0,48, -152,140,32,228,0,0,0,48,168,144,160,228,0,0,157,48,1,90, -7,142,165,89,20,64,37,89,166,0,0,18,18,96,39,60,22,96,7, -58,244,254,255,8,0,0,0,0,210,96,47,58,232,254,255,8,8, -32,164,144,31,88,132,89,144,5,173,112,10,96,5,61,1,30, -168,92,16,32,161,144,0,48,48,140,0,183,0,0,148,160,1,90, -84,32,169,146,50,0,0,18,4,16,45,89,0,80,137,144,30,64, -141,60,145,0,148,112,0,16,129,140,2,30,152,92,68,229,255, -9,0,80,241,146,36,32,241,146,2,30,128,92,0,0,0,10,60,32, -137,146,64,32,145,146,20,224,165,144,144,5,165,116,44,32, -161,146,0,48,168,140,176,183,0,0,20,224,164,144,16,32,169, -146,144,5,165,116,0,16,148,140,132,0,0,8,16,32,161,144,0, -48,48,140,0,183,0,0,82,158,161,61,60,32,137,146,64,32, -145,146,20,224,165,144,31,88,147,89,146,5,165,116,44,32, -161,146,20,224,164,144,146,5,165,116,0,48,168,140,128,183, -0,0,4,30,40,92,64,0,0,8,16,32,161,144,0,48,48,140,0, -183,0,0,18,158,161,61,64,32,153,146,60,32,185,146,20,224, -165,144,31,88,148,89,146,5,165,116,44,32,161,146,20,224, -164,144,146,5,165,116,0,48,168,140,80,178,0,0,0,30,40,92, -16,32,169,146,48,32,161,146,44,32,129,144,48,32,137,140,0, -80,164,176,146,0,132,112,88,32,233,146,5,1,132,89,0,16, -172,140,146,0,149,112,4,96,132,146,18,22,176,92,2,0,128, -140,0,80,164,146,8,96,148,146,12,96,188,146,0,0,0,10,4, -32,164,144,0,48,176,144,244,2,0,0,0,48,184,144,248,2,0, -0,0,48,128,144,252,2,0,0,0,48,168,144,240,2,0,0,4,14, -165,89,148,128,181,88,148,192,165,88,16,4,165,89,150,3, -181,88,150,64,173,88,14,96,5,58,10,30,128,92,0,0,0,10,0, -48,160,144,160,228,0,0,4,140,181,89,7,142,173,89,21,0,37, -89,16,32,161,144,0,48,40,140,0,183,0,0,18,64,161,61,10, -30,128,92,0,0,0,10,0,0,0,0,20,32,137,144,22,96,4,59,4, -22,128,92,0,0,144,140,8,30,152,92,180,227,255,9,4,22,128, -92,135,25,136,88,72,57,0,9,159,25,160,88,16,32,41,146,2, -30,128,92,68,32,161,146,0,0,0,10,96,32,180,144,96,32,172, -144,64,32,84,140,16,22,72,92,149,57,168,140,32,0,0,0,149, -208,167,88,148,48,0,90,0,48,176,146,148,228,0,0,0,48,168, -146,152,228,0,0,18,0,0,18,8,30,128,92,0,0,0,10,0,0,0, -0,92,32,164,144,3,14,189,89,32,224,173,140,149,208,167,88, -148,48,0,90,0,48,168,146,140,228,0,0,14,0,0,18,8,30,128, -92,0,0,0,10,88,32,164,144,148,208,160,88,18,32,5,58,8, -30,128,92,0,0,0,10,0,0,0,0,80,32,148,144,84,32,172,144, -88,32,180,144,88,32,156,144,88,32,236,144,112,32,36,144, -120,32,44,144,128,32,52,144,136,32,60,144,144,32,68,144, -31,88,98,89,146,0,147,112,40,224,165,140,148,128,165,112, -152,32,180,144,160,32,188,144,168,32,140,144,149,157,172, -140,21,0,173,89,19,93,157,140,29,221,236,140,132,93,39, -140,133,29,41,140,134,93,49,140,135,157,57,140,136,221,65, -140,150,29,178,140,0,48,88,140,79,205,3,0,0,48,96,140,80, -45,3,0,151,157,189,140,12,193,162,89,145,221,141,140,18,0, -141,54,8,30,128,92,0,0,0,10,0,0,0,0,184,0,0,9,14,32, -68,61,8,30,128,92,0,0,0,10,0,80,130,140,36,1,0,9,18,32, -68,61,8,30,128,92,0,0,0,10,0,0,0,0,0,80,130,140,140,1, -0,9,18,32,68,61,8,30,128,92,0,0,0,10,0,0,0,0,0,80,130, -140,212,214,255,9,18,32,68,61,8,30,128,92,0,0,0,10,0,0, -0,0,88,96,130,144,0,48,136,144,140,228,0,0,4,221,255,9, -18,32,68,61,8,30,128,92,0,0,0,10,0,0,0,0,0,144,130,140, -252,10,0,9,18,32,68,61,8,30,128,92,0,0,0,10,0,0,0,0,0, -0,128,140,180,231,255,9,36,160,162,144,2,30,128,92,0,48, -160,146,144,228,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0, -16,22,32,92,80,32,161,144,5,14,133,89,0,48,160,146,156, -228,0,0,252,20,0,9,144,48,0,90,0,48,128,146,8,228,0,0, -14,0,0,21,8,30,128,92,0,0,0,10,0,48,176,144,156,228,0, -0,0,16,129,146,0,48,128,146,16,228,0,0,0,30,168,92,5, -142,165,89,149,160,5,90,16,60,165,140,224,255,255,255,0, -48,160,146,12,228,0,0,26,0,0,19,21,80,168,89,0,16,244, -146,149,160,5,90,32,32,132,140,240,255,255,20,2,30,128,92, -0,0,0,10,16,22,40,92,88,96,33,144,3,14,49,89,0,144,129, -140,128,20,0,9,144,48,0,90,0,48,128,146,16,3,0,0,18,0, -0,21,8,30,128,92,0,0,0,10,0,0,0,0,8,96,129,146,0,30, -168,92,0,48,128,146,24,3,0,0,149,32,1,90,16,188,161,140, -248,255,255,255,0,48,160,146,20,3,0,0,26,0,0,19,21,80, -168,89,0,16,244,146,149,32,1,90,8,32,132,140,240,255,255, -20,2,30,128,92,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16, -22,40,92,84,96,33,144,3,14,49,89,0,144,129,140,0,20,0,9, -144,48,0,90,0,48,128,146,32,3,0,0,18,0,0,21,8,30,128, -92,0,0,0,10,0,0,0,0,4,96,129,146,0,30,168,92,0,48,128, -146,28,3,0,0,149,32,1,90,16,188,161,140,248,255,255,255, -0,48,160,146,36,3,0,0,26,0,0,19,21,80,168,89,0,16,244, -146,149,32,1,90,8,32,132,140,240,255,255,20,2,30,128,92, -0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,17,22,32,92,132,57, -48,140,0,0,0,0,16,22,40,92,0,144,129,140,124,19,0,9,144, -48,0,90,28,96,129,146,18,0,0,21,8,30,128,92,0,0,0,10,0, -0,0,0,16,188,169,140,248,255,255,255,32,96,161,140,0,30, -176,92,0,16,133,146,150,32,1,90,4,32,173,146,22,0,0,19, -28,96,161,144,150,29,245,146,22,80,176,89,244,31,177,60,2, -30,128,92,0,0,0,10,0,0,0,0,0,0,0,0,0,48,240,140,76, -139,0,0,30,22,144,92,0,0,240,140,1,9,132,89,1,25,184,89, -82,192,133,58,8,78,140,89,0,0,168,140,16,81,160,88,21, -124,180,140,80,8,0,64,148,48,0,90,21,124,164,140,96,8,0, -64,26,0,0,18,1,9,132,89,144,224,5,90,0,144,245,146,0,16, -245,146,26,0,0,18,2,9,132,89,144,224,5,90,0,144,245,146, -0,16,245,146,240,255,255,21,0,144,4,132,0,0,0,10,20,22, -96,92,48,0,24,140,131,133,164,116,0,144,85,140,0,48,176, -144,32,86,0,0,19,22,88,92,8,206,138,89,0,0,184,140,21, -22,104,92,23,124,172,140,64,8,0,64,20,128,165,89,0,48, -160,146,32,86,0,0,0,80,133,146,0,144,162,152,18,208,144, -89,0,0,32,140,140,48,0,90,23,124,52,140,64,0,0,112,130, -141,76,89,0,0,128,140,20,22,56,92,130,77,45,89,210,0,0, -21,198,96,2,59,2,222,71,89,0,48,232,140,48,0,0,32,0,48, -152,140,96,0,0,32,0,48,144,140,4,0,0,32,0,48,136,140,8, -0,0,16,22,96,1,61,10,16,82,89,0,144,162,152,130,77,45, -89,0,16,61,140,4,1,162,89,133,32,5,90,0,80,177,140,10,0, -0,22,20,22,176,92,0,80,63,146,0,48,160,144,96,81,0,0,4, -128,37,89,255,0,168,140,132,240,2,90,22,221,57,140,22,65, -74,89,0,208,180,146,22,65,41,89,1,32,165,140,148,64,173, -88,0,48,160,146,96,81,0,0,0,144,172,146,54,0,0,22,0,80, -164,128,42,32,93,51,0,48,128,140,8,0,0,16,0,144,161,176, -0,144,161,176,0,144,161,176,0,16,164,128,20,240,2,90,12, -9,33,89,232,255,255,17,212,63,89,60,106,127,2,60,0,0,0, -10,0,0,0,0,214,96,2,59,0,48,120,140,4,0,0,32,0,48,112, -140,8,0,0,16,22,96,1,61,10,16,82,89,0,144,162,152,130, -77,45,89,0,16,61,140,2,222,31,89,4,193,160,89,133,32,5, -90,0,80,177,140,10,0,0,22,20,22,176,92,0,48,56,146,48,0, -0,32,0,48,160,144,96,81,0,0,4,128,37,89,255,0,168,140, -132,240,2,90,0,48,176,146,96,0,0,32,22,65,74,89,22,221, -57,140,22,65,41,89,1,32,165,140,148,64,173,88,0,48,160, -146,96,81,0,0,0,208,171,146,78,0,0,22,0,144,163,128,66, -32,93,51,0,48,64,140,8,0,0,16,16,80,128,89,0,144,161, -176,144,32,3,90,0,144,161,176,12,9,33,89,0,144,161,176, -22,0,0,21,13,22,128,92,0,208,138,140,164,253,255,11,0,30, -128,92,0,16,162,128,208,63,93,52,188,63,89,60,68,127,2, -60,13,22,128,92,0,208,138,140,124,253,255,8,0,0,0,0,0,0, -0,0,0,48,136,146,64,0,0,32,8,14,172,89,0,0,184,140,23, -124,181,140,240,4,0,96,0,144,37,176,17,16,164,89,0,48, -160,146,64,0,0,32,0,144,37,176,32,96,132,140,23,124,173, -140,252,4,0,96,0,48,128,146,56,0,0,32,16,16,129,89,0,80, -165,144,0,48,128,146,56,0,0,32,16,16,129,89,0,80,165,144, -0,0,0,10,0,0,0,0,0,48,240,140,12,142,0,0,30,22,144,92, -0,0,240,140,8,14,132,89,0,0,168,140,0,52,132,140,192,4, -0,64,0,16,164,144,21,80,168,89,149,176,2,90,0,80,164,146, -17,16,137,89,236,255,255,22,0,144,4,132,0,0,0,10,0,48, -240,140,76,142,0,0,30,22,144,92,0,0,240,140,8,14,132,89, -0,0,168,140,0,52,132,140,192,4,0,64,0,16,164,144,21,80, -168,89,149,176,2,90,0,80,164,146,17,16,137,89,236,255,255, -22,0,144,4,132,0,0,0,10,0,48,240,140,132,142,0,0,30,22, -136,92,0,0,240,140,8,14,132,89,0,52,132,140,192,4,0,64, -0,16,164,176,0,16,164,176,0,16,164,144,0,16,164,144,0,16, -164,144,0,80,4,132,0,0,0,10,0,0,0,0,0,0,0,0,112,96,8, -140,160,224,199,146,16,22,56,92,32,224,161,176,18,22,120, -92,0,0,104,140,20,224,33,144,13,224,3,90,68,224,41,144, -17,22,112,92,0,48,192,140,192,4,0,64,22,22,72,92,0,80, -69,140,198,4,0,19,0,48,88,140,64,86,0,0,4,201,98,89,0, -48,24,140,76,20,0,80,0,16,166,144,0,48,80,140,255,255,0, -0,148,128,50,88,170,64,49,61,74,32,2,61,210,5,232,140,22, -64,39,54,0,30,128,92,84,255,255,11,244,1,0,8,0,0,0,0, -64,224,137,144,7,22,128,92,0,80,4,134,144,112,0,90,0,16, -76,140,22,0,0,21,0,30,128,92,44,255,255,11,204,1,0,8,0, -0,0,0,48,224,65,144,0,48,72,146,68,0,0,32,0,48,160,176, -240,4,0,96,0,48,160,176,240,4,0,96,44,96,74,140,137,48, -0,90,1,32,33,140,1,9,66,89,0,48,160,144,252,4,0,96,0, -48,160,144,252,4,0,96,0,48,160,144,252,4,0,96,130,1,0, -18,0,48,232,140,255,63,0,0,0,100,161,140,148,64,47,88, -244,3,0,8,0,0,0,0,14,140,161,89,94,32,13,58,18,32,13, -49,174,33,21,58,146,34,29,58,196,3,0,8,0,30,128,92,164, -254,255,11,34,32,1,58,7,22,128,92,0,16,137,140,0,30,144, -92,8,0,152,140,228,218,255,9,20,0,0,8,0,0,0,0,0,208, -162,144,20,80,160,89,0,208,162,146,159,25,40,88,0,0,64, -140,0,30,32,92,148,3,0,8,0,0,0,0,34,32,1,61,0,30,128, -92,88,254,255,11,0,208,162,144,20,80,160,89,159,25,40,88, -0,0,64,140,108,3,0,8,142,73,161,88,134,32,5,90,1,32,33, -140,38,0,0,18,7,22,128,92,0,16,137,140,0,30,144,92,8,0, -152,140,120,218,255,9,0,30,128,92,24,254,255,11,196,1,0, -8,0,30,128,92,64,224,143,140,136,253,255,11,0,208,128,144, -28,12,164,89,20,253,151,144,60,0,0,0,72,224,169,144,0,48, -232,140,0,0,255,0,146,64,167,88,149,32,5,90,26,12,44,89, -50,0,0,21,146,208,160,88,44,0,232,140,132,64,175,112,20, -57,160,144,160,81,0,0,4,73,41,89,146,128,50,88,6,0,165, -89,5,124,173,140,208,255,255,255,58,64,165,58,0,16,163, -144,7,22,128,92,0,0,144,140,8,30,152,92,1,32,165,140,4, -22,136,92,0,0,32,140,0,30,64,92,159,25,40,88,0,16,163, -146,220,217,255,9,172,2,0,8,0,0,0,0,66,32,2,61,60,224, -137,144,7,22,128,92,0,80,4,134,144,112,0,90,0,16,76,140, -42,0,0,21,7,22,128,92,0,16,137,140,0,30,144,92,8,0,152, -140,164,217,255,9,0,30,32,92,159,25,40,88,108,2,0,8,0,0, -0,0,26,96,1,58,5,208,128,89,0,80,138,140,2,12,132,89,64, -224,151,140,60,222,255,9,7,22,128,92,0,16,137,140,6,22, -144,92,2,0,152,140,188,0,0,8,0,0,0,0,26,32,1,58,0,30, -128,92,0,253,255,11,7,22,128,92,0,16,137,140,152,0,0,8, -7,22,128,92,0,144,139,140,128,213,255,9,30,32,4,61,0,30, -128,92,220,252,255,11,0,208,162,144,20,80,160,89,159,25, -40,88,244,1,0,8,60,224,137,144,7,22,128,92,0,80,4,134, -144,112,0,90,0,16,76,140,38,0,0,21,24,224,129,144,52,214, -255,9,0,30,128,92,164,252,255,11,0,208,162,144,20,80,160, -89,159,25,40,88,188,1,0,8,0,16,166,144,0,30,128,92,0,80, -138,140,0,48,232,140,0,0,255,0,148,64,167,88,72,224,161, -146,140,251,255,9,144,48,0,90,0,16,76,140,42,0,0,21,7, -22,128,92,0,0,136,140,0,30,144,92,8,0,152,140,172,216, -255,9,0,30,32,92,0,0,64,140,159,25,40,88,112,1,0,8,44, -224,169,144,0,48,232,140,255,63,0,0,0,164,161,140,148,64, -47,88,1,0,32,140,1,73,69,89,80,1,0,8,38,32,1,58,7,22, -128,92,0,0,144,140,8,30,152,92,0,16,137,140,0,30,32,92, -0,0,64,140,159,25,40,88,88,216,255,9,0,30,128,92,112,224, -143,140,180,251,255,11,0,208,128,144,26,12,52,89,22,161,1, -58,28,12,164,89,20,253,151,144,108,0,0,0,112,224,167,144, -0,48,168,140,0,0,255,0,146,64,181,88,148,64,165,88,34,0, -181,61,146,208,160,88,20,57,176,144,160,81,0,0,146,128,34, -88,8,137,169,89,4,128,165,89,34,64,165,58,0,16,163,144, -20,80,160,89,0,0,32,140,0,30,64,92,159,25,40,88,0,16, -163,146,184,0,0,8,22,16,162,89,0,208,129,140,14,22,136, -92,20,129,49,89,16,212,255,9,30,32,4,61,0,208,162,144,20, -80,160,89,0,0,32,140,0,30,64,92,159,25,40,88,132,0,0,8, -60,224,137,144,7,22,128,92,0,80,4,134,144,112,0,90,0,16, -76,140,46,0,0,21,0,208,162,144,24,224,129,144,20,80,160, -89,0,0,32,140,0,30,64,92,159,25,40,88,0,208,162,146,172, -212,255,9,76,0,0,8,0,0,0,0,6,208,128,89,0,80,138,140,2, -12,132,89,116,224,151,140,32,220,255,9,7,22,128,92,1,0, -136,140,4,22,144,92,2,0,152,140,76,215,255,9,0,30,32,92, -24,0,0,8,0,30,128,92,228,250,255,11,0,208,162,144,20,80, -160,89,0,208,162,146,13,80,104,89,88,219,107,52,20,224,33, -146,40,224,73,146,36,224,65,146,68,224,41,146,160,224,199, -144,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,160,140,80, -237,0,0,148,48,0,90,12,32,36,144,0,48,160,146,160,228,0, -0,18,0,0,21,8,30,128,92,0,0,0,10,0,0,0,0,0,16,133,140, -7,14,137,89,112,44,0,9,0,30,168,92,149,32,1,90,1,9,161, -89,0,48,240,146,136,228,0,0,0,48,160,146,132,228,0,0,94, -0,0,19,0,48,176,144,160,228,0,0,0,47,1,90,0,48,128,140, -0,183,0,0,159,25,184,88,0,144,165,140,30,0,0,16,16,160, -133,146,1,30,168,92,68,160,189,146,149,32,1,90,128,160, -165,140,38,0,0,19,16,32,133,146,68,32,189,146,144,32,133, -146,21,144,168,89,196,32,189,146,149,32,1,90,0,33,165,140, -228,255,255,20,2,30,128,92,0,0,0,10,0,0,0,0,0,0,0,0,0, -0,0,0,92,32,164,144,17,22,80,92,138,32,5,90,0,16,36,140, -18,22,56,92,40,32,52,144,46,0,0,18,16,16,45,89,0,80,137, -144,30,96,4,59,31,88,236,89,145,64,151,112,2,0,152,140, -12,214,255,9,0,80,241,146,36,32,241,146,92,32,81,146,230, -225,1,59,4,16,77,89,36,32,65,140,36,32,161,144,222,32,5, -61,20,32,161,144,182,32,5,61,4,22,128,92,0,144,138,140, -24,210,255,9,198,33,4,58,84,32,169,144,44,32,161,144,26, -0,173,62,64,32,137,144,4,22,128,92,0,80,4,134,48,32,161, -144,20,0,0,8,60,32,137,144,4,22,128,92,0,80,4,134,44,32, -161,144,16,22,48,92,36,32,161,146,136,32,12,61,0,48,160, -144,40,86,0,0,24,32,129,144,7,0,165,89,0,48,160,146,40, -86,0,0,172,210,255,9,135,16,139,112,0,0,128,140,40,19,0, -11,36,32,241,146,0,0,0,10,0,0,0,0,20,32,137,144,4,22, -128,92,0,0,144,140,8,30,152,92,80,213,255,9,0,30,128,92, -133,16,139,112,0,0,40,140,248,18,0,11,0,16,242,146,20,32, -241,146,188,0,0,8,64,32,137,144,4,22,128,92,0,80,4,134, -144,112,0,90,0,16,52,140,46,1,0,18,48,32,161,144,36,32, -161,146,20,32,177,144,84,32,169,144,7,128,165,89,148,96,5, -90,0,208,41,140,10,0,0,20,22,65,45,89,36,32,161,144,133, -32,5,90,5,193,57,89,86,0,0,22,36,32,137,144,0,30,128,92, -0,144,145,140,80,32,153,140,196,15,0,9,0,16,162,144,20, -32,169,144,64,32,137,144,4,22,128,92,21,0,173,89,20,65, -41,89,20,32,169,146,0,80,4,134,144,112,0,90,0,16,52,140, -74,255,255,18,48,32,161,144,133,32,5,90,0,16,162,146,180, -255,255,17,30,96,1,58,0,30,128,92,0,80,137,140,6,22,144, -92,80,32,153,140,112,15,0,9,16,22,48,92,0,80,162,144,84, -32,169,144,5,0,141,89,145,96,5,90,0,80,138,146,38,0,0, -21,31,88,236,89,145,64,151,112,0,16,129,140,2,30,152,92, -80,212,255,9,0,80,242,146,36,32,241,146,40,0,0,8,32,32, -161,140,0,16,133,176,8,32,53,146,5,65,172,89,0,80,141, -140,6,22,144,92,0,16,133,146,4,32,173,146,12,32,157,146, -44,254,1,60,0,0,0,10,0,0,0,0,0,48,160,144,40,86,0,0, -135,16,139,112,0,0,128,140,7,0,165,89,0,48,160,146,40,86, -0,0,164,17,0,8,0,48,160,144,40,86,0,0,135,16,139,112,0, -0,128,140,7,0,165,89,0,48,160,146,40,86,0,0,140,17,0,11, -20,32,137,144,4,22,128,92,0,0,144,140,2,30,152,92,192, -211,255,9,20,32,241,146,0,0,0,10,0,30,32,92,0,16,36,146, -132,73,140,89,16,16,129,89,244,127,36,62,0,0,0,10,0,0,0, -0,0,0,0,0,0,0,0,0,80,96,8,140,112,224,199,178,128,224, -231,146,21,22,216,92,3,160,172,140,21,210,232,88,0,144, -101,140,31,88,115,89,51,96,183,140,142,133,181,112,0,48, -168,144,68,86,0,0,0,48,184,144,48,86,0,0,21,80,168,89,0, -48,168,146,68,86,0,0,22,192,181,89,0,48,176,146,48,86,0, -0,4,32,171,144,19,22,200,92,0,16,213,140,0,30,24,92,8, -96,127,140,2,222,63,89,64,224,151,146,130,77,95,89,0,16, -83,144,130,77,77,89,137,224,1,90,0,80,138,140,10,0,0,22, -7,22,136,92,0,48,80,146,48,0,0,32,0,48,136,146,96,0,0, -32,0,48,176,144,96,81,0,0,0,48,184,144,176,81,0,0,0,48, -40,140,48,0,0,32,0,48,168,144,180,81,0,0,17,22,64,92,0, -48,104,140,4,0,0,32,255,0,32,140,0,48,224,140,0,0,255, -255,255,3,192,140,48,96,49,140,15,160,3,90,17,157,82,140, -17,193,90,89,1,160,181,140,17,65,74,89,0,48,176,146,96, -81,0,0,150,0,177,88,1,224,189,140,149,0,175,88,0,48,224, -140,252,255,255,0,149,67,175,88,0,48,176,146,4,0,0,32, -151,0,190,88,0,116,173,140,0,0,1,0,149,0,183,88,0,48, -192,140,0,0,255,0,149,0,198,88,0,48,184,146,176,81,0,0, -80,224,199,146,0,48,176,146,180,81,0,0,38,1,0,17,139,48, -0,90,17,192,66,89,70,0,0,22,12,16,98,89,4,32,163,144,0, -16,83,144,0,48,168,144,96,81,0,0,0,80,81,146,130,13,77, -89,1,96,173,140,9,193,90,89,0,144,73,146,149,0,161,88,0, -48,168,146,96,81,0,0,139,48,0,90,0,80,163,146,196,255, -255,17,8,206,180,89,0,180,133,146,64,8,0,64,0,48,160,144, -176,81,0,0,0,48,168,144,180,81,0,0,14,222,224,89,148,3, -167,88,0,48,160,146,76,12,0,80,0,180,173,146,192,0,0,64, -0,48,160,128,8,0,0,16,148,32,2,90,0,48,176,140,8,0,0, -16,255,0,168,140,18,0,0,18,0,144,165,128,148,64,165,88, -248,31,162,61,30,32,2,58,8,206,164,89,0,52,173,140,192,0, -0,112,129,11,66,90,0,80,165,144,248,255,255,21,80,224,231, -144,31,88,195,89,15,1,166,89,0,0,168,140,2,12,181,89,8, -206,164,89,21,160,5,90,0,52,165,140,192,0,0,64,156,131, -148,88,0,16,149,146,22,0,0,19,21,80,168,89,21,160,5,90, -0,16,245,146,244,255,255,20,8,206,156,89,26,206,163,89,0, -244,164,146,192,0,0,64,112,224,199,176,128,224,231,144,0, -0,0,10,102,96,76,60,12,16,98,89,4,32,171,144,8,193,177, -89,0,16,83,144,130,77,77,89,137,160,5,90,0,80,138,140,10, -0,0,22,22,22,136,92,0,80,81,146,0,48,176,144,96,81,0,0, -8,64,68,89,136,112,2,90,17,157,82,140,17,65,74,89,0,144, -137,146,17,193,90,89,1,160,181,140,150,0,169,88,0,48,176, -146,96,81,0,0,0,80,171,146,164,255,255,22,0,48,184,144, -176,81,0,0,8,206,180,89,0,180,133,146,64,8,0,64,0,48, -168,144,180,81,0,0,143,201,109,88,0,48,104,146,76,12,0, -80,0,180,173,146,192,0,0,64,0,48,168,128,8,0,0,16,21, -112,2,90,0,48,184,140,8,0,0,16,255,0,176,140,18,0,0,17, -0,208,173,128,149,128,173,88,248,127,77,51,8,206,180,89,0, -0,184,140,23,188,173,140,192,0,0,112,0,80,37,176,0,80,37, -176,0,80,133,152,0,48,168,140,0,0,0,176,23,188,181,140, -192,0,0,64,148,48,0,90,0,144,173,146,10,9,66,89,0,244, -123,140,212,255,255,255,38,1,0,21,14,224,2,61,31,88,195, -89,106,2,126,54,118,224,2,59,22,96,2,61,12,16,98,89,4, -32,163,144,0,16,83,144,130,13,77,89,2,222,231,89,8,1,167, -89,137,32,5,90,0,80,138,140,10,0,0,22,20,22,136,92,0,48, -80,146,48,0,0,32,0,48,160,144,96,81,0,0,255,0,168,140, -17,65,74,89,0,48,136,146,96,0,0,32,8,64,68,89,17,157,82, -140,17,193,90,89,1,32,165,140,148,64,173,88,0,48,160,146, -96,81,0,0,0,48,168,146,4,0,0,32,146,32,82,59,8,206,236, -89,0,48,32,140,8,0,0,16,255,0,144,140,0,48,56,140,255, -63,0,0,0,48,48,140,76,12,0,80,0,116,47,140,192,0,0,112, -0,16,161,128,148,128,164,88,90,32,85,51,0,30,160,92,5,0, -133,89,20,124,143,140,192,0,0,64,0,100,163,140,148,192, -105,88,0,144,105,146,0,16,164,176,0,16,164,176,0,16,164, -152,0,16,164,144,0,48,176,140,0,0,0,176,0,80,180,146,0, -16,161,128,148,128,164,88,20,176,2,90,11,9,66,89,0,244, -123,140,212,255,255,255,192,255,255,17,160,63,82,60,254, -254,2,61,31,88,195,89,246,30,126,49,84,1,0,8,14,224,2, -61,31,88,227,89,50,1,127,54,118,224,2,59,22,96,2,61,12, -16,98,89,4,32,163,144,0,16,83,144,130,13,77,89,2,222,199, -89,8,1,166,89,137,32,5,90,0,80,138,140,10,0,0,22,20,22, -136,92,0,48,80,146,48,0,0,32,0,48,160,144,96,81,0,0,255, -0,168,140,17,65,74,89,0,48,136,146,96,0,0,32,8,64,68,89, -17,157,82,140,17,193,90,89,1,32,165,140,148,64,173,88,0, -48,160,146,96,81,0,0,0,48,168,146,4,0,0,32,174,32,82,59, -8,78,62,89,0,48,112,140,8,0,0,16,255,0,48,140,0,244,233, -140,192,0,0,112,0,144,163,128,148,128,161,88,134,32,85,51, -0,30,160,92,29,0,37,89,20,252,41,140,192,0,0,64,3,80,24, -89,30,128,30,61,27,22,128,92,0,80,142,140,96,224,239,146, -116,238,255,11,0,30,24,92,96,224,239,144,0,48,224,140,255, -63,0,0,0,100,163,140,148,0,111,88,0,48,104,146,76,12,0, -80,0,16,161,176,0,16,161,176,0,16,161,152,0,16,161,144,0, -48,176,140,0,0,0,176,0,80,177,146,0,144,163,128,148,128, -161,88,20,176,2,90,11,9,66,89,0,244,123,140,212,255,255, -255,148,255,255,17,116,63,82,60,226,254,2,61,31,88,195,89, -216,30,126,49,3,80,24,89,22,128,30,61,27,22,128,92,0,80, -142,140,248,237,255,11,0,30,24,92,0,48,224,140,255,63,0, -0,0,100,163,140,148,0,167,88,142,9,165,88,0,48,160,146, -76,12,0,80,0,48,160,128,8,0,0,16,148,32,2,90,0,48,176, -140,8,0,0,16,255,0,168,140,18,0,0,19,0,144,165,128,148, -64,165,88,248,31,162,60,0,48,160,128,8,0,0,16,148,48,0, -90,0,48,184,140,8,0,0,16,255,0,176,140,34,0,0,18,8,78, -166,89,0,52,173,140,192,0,0,112,0,80,165,144,0,208,165, -128,148,128,165,88,244,63,5,61,31,88,195,89,80,224,231, -144,15,1,166,89,64,224,199,144,2,12,181,89,1,25,184,89,1, -137,181,89,8,78,166,89,150,224,5,90,0,52,165,140,192,0,0, -64,156,3,174,88,0,16,173,146,22,0,0,18,1,137,181,89,150, -224,5,90,0,16,245,146,244,255,255,21,8,78,174,89,154,48, -0,90,26,206,163,89,0,116,165,146,192,0,0,64,26,0,0,18,3, -80,24,89,18,128,30,61,27,22,128,92,0,80,142,140,4,237, -255,11,112,224,199,176,128,224,231,144,0,0,0,10,0,0,0,0, -0,0,0,0,0,0,0,0,0,48,160,144,188,81,0,0,16,16,140,89, -14,222,144,89,17,0,173,89,149,160,4,90,0,48,32,144,184, -81,0,0,18,0,0,22,0,30,128,92,0,0,0,10,0,0,0,0,17,0, -161,89,0,16,129,140,0,48,160,146,184,81,0,0,0,48,168,146, -188,81,0,0,8,34,0,9,4,208,131,89,16,210,131,88,0,0,0, -10,0,0,0,0,0,0,0,0,0,30,144,92,0,0,136,140,135,25,152, -88,0,48,128,140,0,4,0,136,0,48,184,140,192,81,0,0,0,208, -165,128,34,32,5,58,0,16,164,144,3,224,173,128,4,224,181, -128,8,12,165,89,148,64,165,88,10,128,165,58,18,80,144,89, -1,96,140,140,145,224,4,90,4,32,132,140,23,16,186,89,204, -255,255,22,14,160,4,58,0,30,128,92,0,0,0,10,0,0,80,140, -0,30,32,92,120,1,0,9,0,30,72,92,0,0,40,140,0,30,48,92, -0,0,64,140,0,48,160,140,240,85,0,0,0,48,240,146,248,85, -0,0,0,30,56,92,0,16,69,154,1,30,128,92,0,48,32,178,224, -85,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,240, -140,144,159,0,0,30,22,152,92,0,0,240,140,135,25,184,88, -14,192,133,54,0,30,128,92,0,208,4,132,144,57,168,140,192, -81,0,0,0,80,165,128,14,32,5,61,0,30,128,92,0,208,4,132, -2,96,165,128,16,57,176,140,0,4,0,136,145,0,141,88,146,48, -0,90,8,78,164,89,0,144,165,146,38,0,0,18,0,144,165,144, -1,96,173,128,8,12,165,89,148,64,165,88,18,64,164,58,0,30, -128,92,0,208,4,132,0,0,0,0,1,30,128,92,0,208,4,132,0,0, -0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,240,140,248,159,0, -0,30,22,144,92,0,0,240,140,135,25,176,88,14,128,133,54,0, -30,128,92,0,144,4,132,144,57,168,140,192,81,0,0,0,80,165, -128,14,32,5,61,0,30,128,92,0,144,4,132,16,57,160,144,0, -4,0,136,1,96,173,128,8,12,165,89,148,64,165,88,1,0,128, -140,0,80,164,130,0,144,4,132,0,0,0,10,0,0,0,0,0,30,160, -92,0,0,176,140,0,30,184,92,0,0,168,140,0,30,136,92,0,0, -144,140,0,48,160,178,224,85,0,0,0,30,128,92,0,48,160,140, -240,85,0,0,0,48,240,146,248,85,0,0,0,16,133,154,0,0,0, -10,0,0,0,0,16,72,8,89,0,48,160,128,128,83,0,0,1,30,144, -92,148,48,0,90,64,224,151,130,30,0,0,18,0,48,160,128,130, -83,0,0,148,80,160,88,8,14,165,89,0,48,160,146,224,4,0, -136,232,3,128,140,240,4,0,11,0,48,160,128,80,82,0,0,148, -48,0,90,64,224,143,140,34,0,0,18,0,48,160,144,72,4,0, -136,0,48,168,128,81,82,0,0,8,12,165,89,148,64,165,88,0, -80,164,130,0,48,160,128,88,82,0,0,34,32,5,58,0,48,160, -144,76,4,0,136,0,48,168,128,89,82,0,0,8,12,165,89,148, -64,165,88,65,224,167,130,65,224,167,128,0,48,168,128,144, -82,0,0,64,224,183,128,0,48,184,144,224,85,0,0,149,48,0, -90,8,14,165,89,148,131,165,88,20,192,165,89,0,48,160,146, -224,85,0,0,34,0,0,18,0,48,160,144,104,4,0,136,0,48,168, -128,145,82,0,0,8,12,165,89,148,64,165,88,0,80,164,130,0, -48,160,128,152,82,0,0,34,32,5,58,0,48,160,144,108,4,0, -136,0,48,168,128,153,82,0,0,8,12,165,89,148,64,165,88,66, -224,167,130,0,48,160,128,160,82,0,0,34,32,5,58,0,48,160, -144,112,4,0,136,0,48,168,128,161,82,0,0,8,12,165,89,148, -64,165,88,65,224,167,130,65,224,167,128,66,224,175,128,0, -48,176,128,168,82,0,0,64,224,191,128,0,48,128,144,232,85, -0,0,16,14,165,89,150,48,0,90,8,78,173,89,148,67,165,88, -148,195,165,88,20,0,164,89,0,48,160,146,232,85,0,0,34,0, -0,18,0,48,160,144,116,4,0,136,0,48,168,128,169,82,0,0,8, -12,165,89,148,64,165,88,0,80,164,130,0,48,160,128,176,82, -0,0,34,32,5,58,0,48,160,144,120,4,0,136,0,48,168,128, -177,82,0,0,8,12,165,89,148,64,165,88,66,224,167,130,0,48, -160,128,184,82,0,0,34,32,5,58,0,48,160,144,124,4,0,136, -0,48,168,128,185,82,0,0,8,12,165,89,148,64,165,88,65,224, -167,130,65,224,167,128,66,224,175,128,0,48,176,128,128,83, -0,0,64,224,191,128,0,48,128,144,236,85,0,0,16,14,165,89, -150,48,0,90,8,78,173,89,148,67,165,88,148,195,165,88,20, -0,164,89,0,48,160,146,236,85,0,0,34,0,0,18,0,48,160,144, -224,4,0,136,0,48,168,128,129,83,0,0,8,12,165,89,148,64, -165,88,0,80,164,130,0,48,160,128,136,83,0,0,34,32,5,58, -0,48,160,144,228,4,0,136,0,48,168,128,137,83,0,0,8,12, -165,89,148,64,165,88,65,224,167,130,65,224,167,128,0,48, -168,128,144,83,0,0,64,224,183,128,0,48,184,144,228,85,0, -0,149,48,0,90,8,14,165,89,148,131,165,88,20,192,165,89,0, -48,160,146,228,85,0,0,34,0,0,18,0,48,160,144,232,4,0, -136,0,48,168,128,145,83,0,0,8,12,165,89,148,64,165,88,0, -80,164,130,0,48,160,128,152,83,0,0,34,32,5,58,0,48,160, -144,236,4,0,136,0,48,168,128,153,83,0,0,8,12,165,89,148, -64,165,88,65,224,167,130,65,224,167,128,0,48,168,128,104, -84,0,0,0,80,188,128,0,48,176,144,240,85,0,0,149,48,0,90, -8,14,165,89,148,195,165,88,20,128,165,89,0,48,160,146,240, -85,0,0,30,0,0,18,0,48,160,128,106,84,0,0,151,0,165,88, -8,14,165,89,0,48,160,146,84,5,0,136,232,3,128,140,252,1, -0,11,0,48,160,128,96,84,0,0,34,32,5,58,0,48,160,144,80, -5,0,136,0,48,168,128,97,84,0,0,8,12,165,89,148,64,165, -88,65,224,167,130,65,224,167,128,0,48,168,128,104,84,0,0, -0,48,176,144,244,85,0,0,149,48,0,90,20,128,165,89,0,48, -160,146,244,85,0,0,34,0,0,18,0,48,160,144,84,5,0,136,0, -48,168,128,105,84,0,0,8,12,165,89,148,64,165,88,65,224, -167,130,65,224,167,128,0,48,168,144,248,85,0,0,20,64,165, -89,0,48,160,146,248,85,0,0,0,0,0,10,0,0,0,0,0,0,0,0, -0,48,240,140,228,164,0,0,30,22,152,92,0,0,240,140,16,72, -8,89,0,16,164,144,0,16,172,144,0,48,144,140,0,255,0,0,0, -16,180,144,148,128,164,88,8,12,133,89,135,25,144,88,16, -160,4,90,16,76,189,89,24,140,181,89,142,0,0,17,144,57, -168,140,192,81,0,0,0,80,165,128,126,32,5,58,16,57,160, -144,0,4,0,136,1,96,173,128,8,12,165,89,148,64,165,88,135, -25,144,88,16,160,4,90,22,1,165,88,151,128,173,88,148,67, -165,88,255,0,168,140,148,64,141,88,0,116,160,130,240,255, -255,255,66,0,0,17,144,57,184,140,192,81,0,0,0,208,165, -128,50,32,5,58,2,224,173,128,16,57,176,140,0,4,0,136,145, -64,173,88,8,78,165,89,0,144,165,146,0,144,165,144,1,224, -181,128,8,12,165,89,148,128,165,88,18,64,165,58,0,30,128, -92,16,73,8,89,0,208,4,132,1,30,128,92,16,73,8,89,0,208, -4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,30,128,92,135,25,152, -88,1,25,144,89,255,0,136,140,0,48,168,140,176,228,0,0,0, -48,184,140,0,4,0,136,0,48,176,140,192,81,0,0,0,144,165, -128,14,32,5,61,0,80,149,146,20,0,0,8,0,208,165,144,8,12, -165,89,148,64,164,88,0,80,165,146,16,80,128,89,144,224,4, -90,4,96,173,140,23,16,185,89,8,160,181,140,204,255,255,22, -0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,48,240,140,144, -165,0,0,30,22,136,92,0,0,240,140,144,48,0,90,1,9,132,89, -22,0,0,20,16,22,160,92,148,48,0,90,1,9,132,89,244,255, -255,19,0,80,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0, -0,208,172,144,4,78,164,89,17,57,136,140,0,0,0,0,17,1, -237,89,127,0,64,140,29,32,2,90,0,48,168,146,64,20,0,80, -198,0,0,22,8,14,164,89,0,48,48,140,84,0,0,32,0,48,40, -140,96,0,0,32,135,25,32,88,0,52,141,140,112,4,0,96,0, -144,145,146,0,80,33,146,0,80,164,176,0,80,164,176,0,80, -164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164, -176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176, -0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80, -164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164, -176,0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176, -0,80,164,176,0,80,164,176,0,80,164,176,0,80,164,176,0,80, -164,176,0,162,148,140,127,0,64,140,0,116,239,140,128,255, -255,255,29,32,2,90,0,80,164,176,0,80,164,176,0,80,164, -176,100,255,255,17,63,0,64,140,110,0,234,54,0,48,144,146, -84,0,0,32,134,25,168,88,0,48,168,146,96,0,0,32,8,14,164, -89,0,52,165,140,112,4,0,96,0,16,37,176,0,16,37,176,0,16, -37,176,0,16,37,176,0,16,37,176,0,16,37,176,0,16,37,176, -0,16,37,176,0,16,37,176,0,16,37,176,0,16,37,176,0,16,37, -176,0,16,37,176,0,161,148,140,21,65,239,89,0,16,37,176,0, -16,37,176,0,16,165,176,78,96,255,51,0,48,144,146,84,0,0, -32,31,88,168,89,0,48,168,146,96,0,0,32,8,14,164,89,0,52, -165,140,112,4,0,96,0,16,37,176,0,16,37,176,0,16,37,176, -0,16,37,176,0,16,37,176,128,160,148,140,21,65,239,89,0, -16,37,176,0,16,37,176,0,16,165,176,58,96,191,51,0,48,144, -146,80,0,0,32,8,14,164,89,0,52,165,140,112,4,0,96,0,16, -37,176,0,16,37,176,0,16,37,176,96,160,148,140,24,73,239, -89,0,16,37,176,0,16,37,176,0,16,165,176,46,96,95,51,8, -14,164,89,0,48,144,146,72,0,0,32,0,52,165,140,112,4,0, -96,48,160,148,140,12,73,239,89,0,16,37,176,0,16,37,176,0, -16,165,176,50,96,31,51,8,14,164,89,0,48,32,140,64,0,0, -32,0,52,141,140,112,4,0,96,4,73,239,89,0,16,145,146,29, -240,0,90,16,160,148,140,0,80,164,176,236,255,255,17,50,96, -7,58,8,14,132,89,0,48,168,140,56,0,0,32,0,52,132,140, -124,4,0,96,1,73,239,89,0,80,149,146,157,48,0,90,4,160, -148,140,0,16,164,144,236,255,255,21,0,48,160,144,64,20,0, -80,18,22,128,92,0,208,164,146,0,0,0,10,0,0,0,0,0,48, -240,140,92,168,0,0,30,22,144,92,0,0,240,140,8,78,140,89, -0,116,140,140,64,4,0,64,0,80,164,176,0,16,164,178,0,80, -164,176,16,16,132,89,0,16,164,178,0,80,164,176,16,32,164, -178,0,144,4,132,0,0,0,10,0,48,240,140,148,168,0,0,30,22, -144,92,0,0,240,140,34,96,4,58,8,14,132,89,0,52,132,140, -64,4,0,64,4,73,140,89,145,48,0,90,0,16,164,176,244,255, -255,21,0,144,4,132,0,0,0,10,0,0,0,0,0,0,0,0,8,0,188, -9,221,4,62,3,110,2,242,1,158,1,99,1,55,1,20,1,248,0, -226,0,207,0,191,0,177,0,165,0,155,0,146,0,137,0,130,0, -124,0,118,0,112,0,107,0,103,0,99,0,95,0,91,0,88,0,85,0, -82,0,79,0,77,0,75,0,72,0,70,0,68,0,66,0,65,0,63,0,61, -0,60,0,58,0,57,0,56,0,54,0,53,0,52,0,51,0,50,0,49,0, -48,0,47,0,46,0,45,0,44,0,44,0,43,0,42,0,41,0,41,0,40, -0,39,0,39,0,38,0,37,0,37,0,36,0,36,0,35,0,35,0,34,0, -34,0,33,0,33,0,32,0,32,0,31,0,31,0,31,0,30,0,30,0,29, -0,29,0,29,0,28,0,28,0,28,0,27,0,27,0,27,0,26,0,26,0, -26,0,26,0,25,0,25,0,25,0,24,0,24,0,24,0,24,0,23,0,23, -0,23,0,23,0,23,0,22,0,22,0,22,0,22,0,21,0,21,0,21,0, -21,0,21,0,20,0,20,0,20,0,20,0,20,0,20,0,19,0,19,0,19, -0,19,0,19,0,19,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0, -17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,16,0,16,0,16, -0,16,0,16,0,16,0,16,0,16,0,16,0,15,0,15,0,15,0,15,0, -15,0,15,0,15,0,15,0,15,0,14,0,14,0,14,0,14,0,14,0,14, -0,14,0,14,0,14,0,14,0,14,0,13,0,13,0,13,0,13,0,13,0, -13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,12,0,12,0,12, -0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, -12,0,12,0,11,0,11,0,11,0,11,0,11,0,11,0,11,0,11,0,11, -0,11,0,11,0,11,0,11,0,11,0,11,0,11,0,11,0,10,0,10,0, -10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10, -0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,9,0,9,0,9, -0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0, -9,0,9,0,8,0,0,48,32,140,0,178,0,0,0,48,40,140,32,12,0, -80,0,30,48,92,0,30,56,92,80,0,32,178,0,48,40,140,36,12, -0,80,144,0,32,178,0,48,40,140,40,12,0,80,208,0,32,178,0, -48,40,140,44,12,0,80,16,1,32,178,0,30,32,92,0,30,40,92, -80,0,64,140,144,0,72,140,208,0,80,140,16,1,88,140,16,32, -34,178,16,96,34,178,16,160,34,178,16,224,34,178,0,48,32, -140,64,8,0,64,0,48,40,140,64,0,0,112,32,32,34,178,0,48, -32,140,64,9,0,64,0,48,40,140,64,1,0,112,32,96,34,178,0, -48,32,140,64,10,0,64,0,48,40,140,64,2,0,112,32,160,34, -178,0,48,32,140,64,11,0,64,0,48,40,140,64,3,0,112,32, -224,34,178,0,30,40,92,0,48,32,140,0,16,0,80,48,32,34, -178,0,48,32,140,4,16,0,80,48,96,34,178,0,48,32,140,8,16, -0,80,48,160,34,178,0,48,32,140,12,16,0,80,48,224,34,178, -80,1,64,140,0,48,32,140,176,174,0,0,8,32,42,140,0,32,34, -154,5,22,56,92,0,48,32,140,80,3,0,0,16,32,49,144,18,160, -1,50,8,200,41,89,0,208,33,154,8,200,57,89,0,48,32,140, -128,3,0,0,16,32,49,144,18,160,1,50,8,200,41,89,0,208,33, -154,8,200,57,89,0,48,32,140,176,3,0,0,16,32,49,144,18, -160,1,50,8,200,41,89,0,208,33,154,8,200,57,89,0,48,32, -140,32,228,0,0,16,32,49,144,14,160,1,50,0,208,33,146,8, -200,57,89,4,201,57,89,8,32,42,140,0,208,41,146,0,30,32, -92,0,30,40,92,0,30,48,92,0,30,56,92,48,32,34,178,208,1, -64,140,0,48,32,140,16,176,0,0,0,48,40,144,32,3,0,0,0, -48,48,144,36,3,0,0,0,32,34,178,0,30,32,92,0,30,48,92, -16,32,34,178,32,32,34,178,16,2,64,140,0,48,32,140,224, -183,0,0,0,32,34,178,0,0,32,140,60,32,34,146,144,1,64, -140,0,48,32,140,0,185,0,0,0,32,34,178,80,2,64,140,80,0, -32,140,0,16,34,146,4,8,66,89,0,16,34,146,4,8,66,89,0, -16,34,146,4,8,66,89,0,16,34,146,4,8,66,89,80,1,32,140, -0,16,34,146,4,8,66,89,208,1,32,140,0,16,34,146,4,8,66, -89,16,2,32,140,0,16,34,146,4,8,66,89,144,1,32,140,0,16, -34,146,0,48,32,140,0,192,255,15,0,48,32,146,240,2,0,0,0, -48,32,140,240,63,0,0,0,48,32,146,244,2,0,0,0,0,32,140, -0,48,32,146,248,2,0,0,6,0,32,140,0,48,32,146,252,2,0,0, -0,2,40,140,32,0,48,140,0,48,56,140,80,237,2,0,132,2,56, -146,7,22,32,92,4,64,57,89,240,33,57,146,1,137,181,89,240, -191,5,53,0,30,56,92,240,33,57,146,0,48,64,140,192,2,0,0, -12,0,56,140,0,48,64,146,44,3,0,0,144,0,48,140,8,32,50, -146,7,0,42,89,0,16,42,146,5,22,64,92,208,0,48,140,8,32, -50,146,7,0,42,89,0,16,42,146,5,22,64,92,16,1,48,140,8, -32,50,146,0,32,242,146,0,48,240,146,40,3,0,0,0,0,0,10, -0,0,0,0,0,0,0,0,0,48,32,144,40,3,0,0,0,48,40,140,40, -3,0,0,94,32,1,50,4,32,49,144,16,128,129,50,4,22,40,92, -0,16,33,144,236,255,255,8,0,16,49,144,0,48,56,144,44,3, -0,0,0,80,49,146,0,16,57,146,0,48,32,146,44,3,0,0,80,2, -24,140,8,32,41,144,208,0,48,140,4,200,24,89,16,128,41,52, -4,200,24,89,8,128,41,50,4,200,24,89,80,0,48,140,0,208, -48,146,0,0,0,10,80,2,24,140,0,48,40,140,64,4,0,64,0,48, -48,140,128,8,0,64,0,48,56,140,64,20,0,80,0,48,64,140,64, -4,0,96,255,15,72,140,0,48,80,144,96,86,0,0,0,48,88,140, -8,0,0,16,0,48,96,140,64,12,0,80,0,48,104,140,0,0,0,48, -0,48,112,140,96,0,0,48,0,0,120,140,0,30,240,92,0,48,136, -144,112,228,0,0,0,48,128,140,255,255,15,0,0,80,132,146,0, -80,132,144,144,0,132,88,1,9,132,89,0,80,132,146,242,63,4, -53,0,208,130,144,12,32,4,50,0,80,131,144,244,255,255,8,0, -208,32,144,0,16,161,176,0,16,5,132,0,0,0,0,44,224,3,50, -0,0,120,140,0,48,136,144,120,228,0,0,0,0,120,140,0,80, -148,144,136,25,128,88,1,160,148,140,0,80,148,146,0,48,128, -146,4,0,0,32,0,80,197,152,4,200,24,89,28,32,150,144,4, -32,201,146,0,144,132,144,64,32,4,53,174,95,174,50,0,80, -198,152,28,32,150,144,0,144,132,144,44,32,4,53,154,95,174, -50,0,80,198,152,28,32,150,144,0,144,132,144,24,32,4,53, -134,95,174,50,0,80,198,152,28,32,150,144,0,144,132,144, -116,63,4,50,0,16,230,152,110,95,231,49,0,0,208,140,12,32, -222,144,120,0,200,140,28,65,231,89,90,31,223,49,155,56, -232,140,0,0,0,0,0,48,128,146,48,0,0,32,29,128,214,89,0, -48,232,146,96,0,0,32,29,65,206,89,4,160,164,144,2,30,168, -92,32,32,182,152,0,144,244,146,8,136,148,89,0,48,160,146, -56,0,0,32,8,192,149,54,22,22,144,92,0,144,132,144,0,144, -171,146,27,1,231,89,12,32,4,50,10,0,223,49,176,95,238,54, -28,32,150,146,0,16,222,144,24,32,206,144,1,140,142,89,155, -93,230,140,27,64,140,89,0,16,142,146,0,208,130,128,254,63, -68,49,8,137,214,89,0,80,131,176,0,168,6,90,0,80,163,176, -8,8,239,89,0,16,135,154,8,72,231,89,0,80,151,154,8,8, -239,89,0,16,167,154,8,72,231,89,0,80,183,154,200,255,255, -21,160,254,255,8,0,0,0,0,0,0,0,0,0,0,0,0,0,80,213,152, -132,2,200,144,4,200,24,89,120,0,192,140,128,190,6,50,126, -126,6,50,0,30,184,92,154,208,155,88,26,210,151,88,3,206, -212,89,70,0,214,49,26,192,189,89,0,80,245,146,0,48,144, -146,48,0,0,32,0,48,208,146,96,0,0,32,21,16,170,89,244, -97,222,146,26,1,198,89,0,80,214,146,8,128,173,54,20,32, -169,144,0,80,213,152,240,97,206,144,8,160,6,50,180,127,6, -53,0,48,160,140,16,176,0,0,0,16,161,178,132,2,160,144,0, -16,181,144,0,208,130,128,250,159,133,52,22,193,189,89,0, -16,229,140,0,80,131,176,16,8,239,89,0,80,195,176,8,137, -181,89,0,16,135,178,16,72,231,89,0,80,199,178,230,191,5, -53,10,32,141,136,255,0,144,140,7,32,133,128,145,128,140, -88,1,78,140,89,240,33,213,144,0,116,140,140,160,168,0,0, -143,8,132,88,0,80,140,136,240,33,245,146,10,32,141,138, -238,32,44,53,80,0,144,140,124,96,68,50,0,48,176,144,40,3, -0,0,0,16,173,144,4,160,157,144,18,160,5,50,96,192,172,50, -0,144,181,144,240,255,255,8,0,48,176,144,44,3,0,0,82,160, -5,50,4,160,173,146,0,144,133,144,0,48,136,144,40,3,0,0, -0,48,128,146,44,3,0,0,0,144,141,146,0,48,176,146,40,3,0, -0,80,2,144,140,8,160,141,144,208,0,128,140,4,136,148,89, -16,0,140,52,4,136,148,89,8,0,140,50,4,136,148,89,0,144, -140,146,8,160,149,144,0,48,192,144,112,86,0,0,24,160,132, -144,1,8,198,89,0,48,192,146,112,86,0,0,44,32,4,53,0,48, -128,140,200,191,0,0,24,160,164,146,80,0,136,140,0,160,132, -146,42,128,140,53,0,48,128,140,192,191,0,0,0,160,132,146, -24,0,0,8,240,33,140,144,12,96,4,50,17,22,128,92,244,255, -255,8,240,33,164,146,26,22,160,92,188,254,5,53,132,2,160, -146,200,252,255,8,16,2,144,140,60,160,132,144,214,63,4,53, -0,48,152,140,240,183,0,0,60,160,164,146,0,160,156,146,212, -255,255,8,0,0,0,0,0,48,136,144,12,0,0,16,48,0,144,140, -214,133,140,52,0,144,193,152,0,48,160,176,240,2,0,0,137, -64,206,88,194,101,6,50,152,0,133,88,152,128,149,88,238,36, -4,53,152,64,141,88,23,132,148,89,145,131,140,88,145,57, -216,140,80,237,0,0,16,224,150,152,42,37,30,55,0,144,4, -132,0,48,128,176,0,3,0,0,17,29,132,140,0,16,148,144,28, -160,4,53,0,48,128,144,160,86,0,0,1,8,132,89,0,48,128, -146,160,86,0,0,40,4,0,8,60,224,230,144,1,72,140,89,0, -144,196,146,145,192,140,88,0,16,244,146,8,160,156,140,0, -16,135,144,0,48,136,146,4,3,0,0,24,224,150,146,28,224, -158,146,40,32,4,53,28,22,128,92,160,6,0,9,0,16,135,144, -24,32,4,53,40,32,135,144,0,16,140,144,1,72,140,89,0,16, -140,146,180,3,0,8,24,32,143,144,1,9,132,89,144,93,140, -140,28,224,158,144,0,80,148,144,4,96,180,144,52,224,190, -144,0,16,135,146,0,208,148,146,8,200,156,89,28,224,158, -146,2,204,165,89,0,48,144,140,112,186,0,0,25,22,152,92,0, -48,184,140,255,255,255,255,4,78,134,89,16,224,150,154,2, -78,142,89,104,7,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,208, -129,144,0,48,136,140,123,221,4,199,150,1,140,53,0,48,128, -144,100,86,0,0,20,224,166,144,0,48,152,140,255,255,0,0,0, -48,136,144,116,86,0,0,20,0,132,89,1,96,140,140,0,48,128, -146,100,86,0,0,0,48,136,146,116,86,0,0,146,192,148,88,24, -224,134,152,48,224,166,160,16,65,140,89,8,73,140,89,3,76, -140,89,4,32,140,146,12,8,164,89,0,80,156,140,40,64,149, -54,0,16,173,146,21,129,148,89,8,32,165,140,24,128,149,54, -0,16,181,146,22,129,148,89,8,32,165,140,1,201,156,89,236, -255,255,8,0,16,149,146,20,224,12,50,8,32,165,140,0,16, -245,146,8,0,0,8,0,0,0,0,0,48,152,144,16,3,0,0,2,72, -140,89,0,208,148,144,36,160,4,53,0,48,160,144,120,228,0, -0,1,0,168,140,136,25,176,88,0,16,173,146,0,48,176,146,4, -0,0,32,220,255,255,8,1,76,140,89,0,48,160,176,0,3,0,0, -1,136,173,89,22,29,133,146,151,64,181,88,0,48,176,146,8, -3,0,0,1,75,140,90,0,16,164,176,16,8,132,89,0,48,144,146, -64,0,0,32,16,136,148,89,0,144,163,178,228,255,255,21,0, -48,136,144,20,3,0,0,4,224,132,144,0,208,244,146,8,200, -156,89,17,224,4,90,12,0,0,19,0,48,152,144,24,3,0,0,2, -30,136,92,0,48,128,146,56,0,0,32,0,144,139,146,0,48,152, -146,16,3,0,0,1,224,123,140,40,224,35,49,0,0,120,140,0, -48,136,144,120,228,0,0,136,25,128,88,0,80,148,144,1,160, -148,140,0,48,128,146,4,0,0,32,0,80,148,146,0,104,6,90, -20,224,246,146,0,48,128,140,80,178,0,0,16,224,134,146,138, -253,255,21,52,253,255,8,0,48,152,140,255,255,0,0,146,192, -148,88,20,224,142,144,2,140,148,89,17,58,128,140,0,0,0,0, -2,78,140,89,17,1,132,89,12,0,148,51,12,9,132,89,26,0, -148,49,0,48,128,144,108,86,0,0,1,8,132,89,0,48,128,146, -108,86,0,0,0,48,136,144,120,86,0,0,0,30,232,92,1,72,140, -89,0,48,136,146,120,86,0,0,4,0,0,8,0,48,128,144,104,86, -0,0,20,224,166,144,20,0,132,89,0,48,128,146,104,86,0,0, -24,224,134,152,16,65,140,89,8,73,140,89,3,76,140,89,4,32, -140,146,4,72,140,89,0,48,152,144,16,3,0,0,1,76,140,89,0, -48,160,176,0,3,0,0,1,136,173,89,22,29,133,146,151,64,181, -88,0,48,176,146,8,3,0,0,0,208,148,144,36,160,4,53,0,48, -160,144,120,228,0,0,1,0,168,140,136,25,176,88,0,16,173, -146,0,48,176,146,4,0,0,32,220,255,255,8,1,75,140,90,0, -48,144,146,64,0,0,32,16,136,148,89,0,16,164,176,16,8,132, -89,0,144,163,178,228,255,255,21,0,48,136,144,20,3,0,0,4, -224,132,144,0,208,244,146,8,200,156,89,17,224,4,90,12,0, -0,19,0,48,152,144,24,3,0,0,10,30,136,92,0,48,152,146,16, -3,0,0,0,48,128,146,56,0,0,32,0,144,139,146,1,224,123, -140,40,224,35,49,0,0,120,140,0,48,136,144,120,228,0,0, -136,25,128,88,0,80,148,144,1,160,148,140,0,80,148,146,0, -48,128,146,4,0,0,32,20,224,246,146,0,48,128,140,192,182, -0,0,12,32,14,48,0,48,128,140,80,178,0,0,16,224,134,146, -18,96,39,49,4,73,239,89,0,80,129,176,248,127,39,54,16,96, -7,50,0,80,129,144,1,73,239,89,244,255,255,8,140,123,6,50, -216,251,255,8,0,0,0,0,0,48,128,176,0,3,0,0,24,224,142, -144,18,29,140,146,1,136,148,89,146,192,148,88,0,48,144, -146,8,3,0,0,0,48,128,140,192,182,0,0,20,224,246,146,16, -224,134,146,16,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,48, -128,144,104,86,0,0,25,0,132,89,0,48,128,146,104,86,0,0, -124,32,14,48,0,48,136,140,80,178,0,0,0,48,128,144,128,86, -0,0,16,224,142,146,1,32,132,140,0,48,128,146,128,86,0,0, -88,0,0,8,0,0,0,0,0,48,128,144,20,86,0,0,25,0,132,89,0, -48,128,146,20,86,0,0,60,0,0,8,0,48,160,140,0,0,240,15, -152,0,165,88,0,48,128,140,8,86,0,0,20,129,165,88,12,32, -5,53,0,48,128,140,16,86,0,0,0,16,140,144,25,64,140,89,0, -16,140,146,8,0,0,8,0,0,0,0,0,80,129,176,1,104,6,90,0, -80,129,176,1,73,206,89,0,80,129,176,236,255,255,20,152, -250,255,8,0,0,0,0,224,255,255,8,0,0,0,0,0,0,0,0,0,0, -0,0,27,22,128,92,24,22,136,92,25,22,144,92,32,0,160,178, -48,0,192,178,64,0,224,178,248,214,255,9,64,0,224,176,48, -0,192,176,32,0,160,176,88,250,255,8,0,0,0,0,27,22,128, -92,24,22,136,92,25,22,144,92,32,0,160,178,48,0,192,178, -64,0,224,178,168,220,255,9,64,0,224,176,48,0,192,176,32, -0,160,176,40,250,255,8,0,0,0,0,4,200,24,89,188,246,255, -8,0,0,0,0,0,0,0,0,0,48,160,144,0,16,0,80,32,0,160,178, -48,0,192,178,64,0,224,178,0,48,128,140,32,12,0,80,0,16, -140,144,254,127,4,53,60,32,129,144,7,32,188,128,143,200, -189,88,6,32,140,128,4,32,148,136,0,30,152,92,10,32,196, -136,0,0,160,140,0,30,168,92,0,48,192,146,0,16,0,80,16, -32,180,140,0,32,132,144,12,224,37,50,4,211,255,9,8,0,0, -8,204,222,255,9,0,48,128,140,32,12,0,80,0,16,140,144,254, -127,4,53,64,0,224,176,48,0,192,176,32,0,160,176,0,48,160, -146,0,16,0,80,60,32,153,144,244,225,140,144,2,30,144,92, -0,48,136,146,56,0,0,32,0,144,147,146,4,224,132,144,0,48, -136,140,0,0,0,240,145,0,132,88,50,32,4,50,1,224,123,140, -40,224,35,49,0,0,120,140,0,48,136,144,120,228,0,0,136,25, -128,88,0,80,148,144,1,160,148,140,0,80,148,146,0,48,128, -146,4,0,0,32,240,225,148,144,132,2,136,144,0,168,4,90, -240,225,140,146,132,2,152,146,60,32,145,146,246,254,255,21, -0,48,128,140,224,183,0,0,0,32,129,146,228,254,255,8,0,48, -144,144,112,228,0,0,0,48,128,144,8,228,0,0,0,144,156,144, -80,2,24,140,1,200,156,89,0,16,140,144,0,144,156,146,124, -117,4,50,0,48,80,146,96,86,0,0,48,0,192,178,64,0,224, -178,184,159,255,9,64,0,224,176,48,0,192,176,92,245,255,8, -0,0,0,0,0,0,0,0,28,32,36,144,16,22,24,92,0,16,129,144, -204,32,4,50,120,0,96,140,0,224,48,152,0,0,64,140,12,224, -40,144,6,193,49,89,182,128,41,49,133,56,56,140,0,0,0,0, -0,48,128,146,48,0,0,32,7,0,66,89,0,48,56,146,96,0,0,32, -7,1,99,89,4,32,73,144,32,224,80,152,0,16,241,146,8,8,33, -89,0,48,72,146,56,0,0,32,8,192,34,54,10,22,32,92,2,30, -88,92,0,16,129,144,0,48,88,146,96,0,0,48,5,129,49,89,14, -64,49,52,10,32,4,50,172,31,59,54,28,224,32,146,0,208,40, -144,24,224,48,144,1,12,58,89,133,157,49,140,5,192,57,89, -0,208,56,146,0,48,32,140,8,0,0,16,0,48,72,140,0,0,0,48, -0,16,129,128,254,63,36,49,4,9,66,89,0,80,98,176,0,144, -97,154,8,136,49,89,0,144,113,154,8,136,49,89,224,63,2,53, -0,0,0,10,0,0,0,0,0,48,24,144,116,228,0,0,0,48,40,144, -120,228,0,0,1,0,48,140,136,25,56,88,0,208,32,144,26,32, -1,48,0,48,240,146,4,0,0,32,0,80,49,146,0,48,56,146,4,0, -0,32,0,0,0,10,0,0,0,0,0,0,0,0,0,208,166,176,25,192, -156,89,25,57,136,140,0,0,0,0,20,224,158,146,4,78,134,89, -0,208,185,146,17,1,228,89,50,33,14,55,0,30,200,92,0,0, -232,140,16,0,229,54,20,1,239,89,142,32,5,50,0,16,229,140, -48,0,168,140,28,1,165,89,21,22,184,92,8,64,229,51,28,22, -184,92,2,206,149,89,0,48,176,146,84,0,0,32,23,65,141,89, -0,48,184,146,96,0,0,32,0,48,128,140,232,186,0,0,18,128, -181,89,17,28,4,132,0,16,130,176,0,16,130,176,0,16,130, -176,0,16,130,176,0,16,130,176,0,16,130,176,0,16,130,176, -0,16,130,176,0,16,130,176,0,16,130,176,0,16,130,176,23,1, -231,89,0,16,130,176,152,63,7,52,18,96,7,53,0,208,185,144, -0,224,166,178,212,246,255,8,28,224,150,144,24,224,142,144, -0,48,128,144,140,228,0,0,17,129,148,89,236,25,148,51,64, -224,230,144,20,224,142,144,85,5,144,140,0,16,135,144,218, -153,140,49,40,32,4,53,28,22,128,92,236,253,255,9,0,16, -135,144,24,32,4,53,40,32,135,144,0,16,140,144,1,72,140, -89,0,16,140,146,176,249,255,8,24,32,143,144,1,9,132,89, -144,93,140,140,28,224,158,144,0,80,148,144,4,96,180,144, -56,224,190,144,0,16,135,146,0,208,148,146,8,200,156,89,28, -224,158,146,2,204,165,89,0,80,231,140,224,254,255,8,0,0, -0,0,1,73,206,89,0,0,232,140,8,33,101,54,10,30,184,92,0, -0,232,140,16,0,189,54,20,193,237,89,0,16,189,140,82,32,5, -50,151,56,144,140,0,0,0,0,0,48,176,146,84,0,0,32,22,128, -180,89,0,48,184,146,96,0,0,32,22,224,37,49,8,232,5,90,0, -16,130,176,4,201,189,89,244,255,255,22,26,224,13,49,0,16, -130,144,18,224,21,49,0,16,130,144,10,224,29,49,0,16,130, -144,144,96,7,50,28,224,150,144,24,224,142,144,0,48,128, -144,140,228,0,0,17,129,148,89,12,0,148,52,2,72,239,89, -228,248,255,8,64,224,230,144,0,16,135,144,44,32,4,53,28, -22,128,92,240,252,255,9,0,16,135,144,28,32,4,53,40,32, -135,144,0,16,140,144,1,72,140,89,0,16,140,146,2,72,239, -89,176,248,255,8,24,32,143,144,1,9,132,89,144,93,140,140, -28,224,158,144,0,80,148,144,4,96,180,144,56,224,190,144,0, -16,135,146,0,208,148,146,8,200,156,89,28,224,158,146,2, -204,165,89,29,22,184,92,24,255,255,8,0,80,145,152,112,246, -255,8,0,0,0,0,0,0,0,0,0,0,0,0,0,48,176,146,72,0,0,32, -0,16,130,176,0,16,130,176,0,16,130,176,76,246,255,8,0,0, -0,0,0,0,0,0,0,80,149,144,74,0,152,140,84,0,128,140,6, -213,148,51,32,32,193,176,0,0,224,140,18,1,164,89,0,16, -214,146,20,57,136,140,0,0,0,0,4,14,133,89,0,16,219,146, -120,0,216,140,17,1,236,89,0,0,160,140,27,65,239,89,48, -192,190,52,27,57,144,140,0,0,0,0,27,0,231,89,0,48,176, -146,48,0,0,32,27,193,189,89,0,48,216,146,96,0,0,32,18, -128,181,89,0,208,162,144,76,0,0,8,30,224,5,50,0,48,176, -146,48,0,0,32,23,193,222,89,0,48,184,146,96,0,0,32,23,0, -231,89,16,32,129,152,128,11,132,90,0,208,162,144,108,0,0, -18,0,80,180,152,8,96,140,140,3,200,189,89,16,32,129,154, -2,204,189,89,144,255,6,53,0,208,162,144,40,32,101,54,0, -208,162,144,120,0,216,140,244,63,7,53,116,95,223,54,0,16, -219,144,8,32,177,154,44,32,217,146,56,244,255,8,0,0,0,0, -0,80,134,176,12,9,165,89,1,160,82,140,0,80,134,176,12,9, -231,89,0,80,134,176,232,63,101,54,0,208,162,144,184,255, -255,8,20,32,101,54,0,208,162,144,248,63,103,54,46,0,167, -50,240,255,255,8,0,80,134,176,12,9,231,89,0,80,134,176,1, -160,82,140,12,9,165,89,0,80,134,176,232,63,101,54,0,208, -162,144,204,255,255,8,130,139,214,88,48,32,87,51,0,80,134, -176,0,48,160,140,255,255,255,79,0,80,134,176,153,0,165,88, -0,80,134,160,0,16,245,146,1,160,82,140,10,30,160,92,0,16, -214,146,56,0,0,8,28,145,162,89,0,16,214,146,26,32,39,49, -4,9,231,89,0,80,134,176,14,32,39,49,4,9,231,89,0,80,134, -176,14,32,23,49,2,9,231,89,0,80,134,152,10,32,15,49,0, -80,134,144,2,14,165,89,0,48,144,140,255,255,255,79,2,158, -138,89,0,48,128,140,192,190,0,0,20,65,140,89,146,64,166, -88,16,64,132,89,24,32,153,144,0,16,4,132,0,16,245,146,0, -16,245,146,0,16,245,146,0,16,245,146,0,16,245,146,0,16, -245,146,0,16,245,146,0,16,245,146,0,16,245,146,0,16,245, -146,4,224,132,136,1,136,82,89,0,16,133,146,0,16,131,144, -244,225,140,144,16,21,128,88,0,48,136,146,56,0,0,32,2,30, -144,92,0,16,133,146,0,144,147,146,4,224,132,144,0,48,136, -140,0,0,0,240,145,0,132,88,50,32,4,50,1,224,123,140,40, -224,35,49,0,0,120,140,0,48,136,144,120,228,0,0,0,80,148, -144,1,160,148,140,136,25,128,88,0,80,148,146,0,48,128,146, -4,0,0,32,240,225,148,144,132,2,136,144,0,168,4,90,132,2, -152,146,240,225,140,146,52,0,0,21,0,48,144,144,112,228,0, -0,0,48,128,140,32,192,0,0,0,144,156,144,0,48,136,140,0, -0,32,0,24,32,241,146,19,64,140,89,0,32,129,146,8,32,137, -146,104,242,255,8,10,160,140,136,10,224,132,136,52,64,132, -50,0,48,128,140,192,191,0,0,24,32,145,146,0,32,129,146, -72,242,255,8,0,0,0,0,0,80,133,144,60,50,4,53,0,48,128, -140,240,188,0,0,24,32,145,144,0,32,129,146,48,32,153,144, -10,160,140,136,0,160,228,144,1,25,232,89,0,208,140,146,24, -0,136,140,6,160,132,128,18,64,140,89,16,160,180,152,1,9, -132,89,3,224,189,140,24,32,145,146,2,204,189,89,16,32,129, -154,40,32,225,154,8,32,177,154,216,252,255,8,0,0,0,0,0, -48,144,144,112,228,0,0,0,144,156,144,212,145,157,53,40,32, -129,144,108,237,255,9,0,48,128,140,0,178,0,0,0,32,129, -146,188,241,255,8,0,0,0,0,0,0,0,0,17,22,144,92,0,0,136, -140,8,3,0,8,0,0,0,0,160,22,0,9,12,0,0,9,232,17,0,8,0, -0,0,0,128,5,0,9,84,1,0,11,120,3,0,9,196,3,0,8,128,192, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,215,0,0,16,216,0,0, -48,216,0,0,80,216,0,0,112,216,0,0,144,216,0,0,176,216,0, -0,208,216,0,0,240,216,0,0,16,217,0,0,48,217,0,0,240,215, -0,0,145,48,0,90,0,20,32,140,0,0,0,0,0,48,160,140,204, -192,0,0,20,1,33,89,10,0,0,18,38,32,92,51,0,52,241,133, -216,215,0,0,31,152,153,89,0,208,236,140,0,16,236,146,0, -52,129,140,96,194,0,0,0,0,0,10,0,52,161,140,160,194,0,0, -145,32,5,90,16,57,144,140,192,230,0,0,0,144,188,144,16, -22,128,92,22,0,0,21,0,52,137,140,240,215,0,0,52,0,0,8, -0,0,0,0,0,52,161,140,128,194,0,0,38,0,141,61,0,52,161, -140,128,192,0,0,16,61,169,144,144,192,0,0,0,16,181,144, -21,0,173,89,22,65,173,89,0,96,141,140,0,52,161,140,240, -215,0,0,151,32,5,90,0,144,140,146,16,22,128,92,18,0,0, -21,0,52,185,140,160,194,0,0,48,0,0,8,0,52,161,140,128, -192,0,0,16,61,169,144,144,192,0,0,0,16,181,144,21,0,173, -89,22,65,173,89,0,96,173,140,14,64,189,61,0,52,185,140, -128,194,0,0,23,22,128,92,0,0,0,10,0,0,0,0,0,0,0,0,0, -0,0,0,0,20,240,140,148,0,0,0,30,22,152,92,0,0,240,140, -0,30,136,92,0,20,160,140,0,0,0,0,0,48,168,140,220,193,0, -0,21,1,165,89,0,52,189,140,128,192,0,0,0,0,144,140,0,48, -176,140,192,230,0,0,0,52,165,140,144,192,0,0,0,208,133, -144,0,16,173,144,21,192,173,89,16,65,173,89,21,128,172,89, -0,144,173,146,4,32,173,144,21,192,173,89,16,65,173,89,21, -128,172,89,4,160,173,146,8,32,173,144,17,208,136,89,145, -240,2,90,21,192,173,89,16,65,173,89,21,128,172,89,8,160, -173,146,22,16,179,89,12,32,165,140,180,255,255,22,0,208,4, -132,0,0,0,10,0,20,240,140,12,0,0,0,30,22,128,92,0,0, -240,140,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,20,240, -140,12,0,0,0,30,22,128,92,0,0,240,140,0,16,4,132,0,0,0, -10,0,0,0,0,0,0,0,0,0,20,240,140,12,0,0,0,30,22,128,92, -0,0,240,140,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,16, -22,56,92,180,20,0,11,16,22,40,92,236,20,0,11,5,16,50,89, -28,0,0,8,12,96,33,146,6,22,128,92,248,22,0,11,4,125,129, -144,16,0,0,0,0,16,4,134,6,22,128,92,164,22,0,11,12,96, -161,144,1,9,37,89,216,63,1,62,5,16,130,89,208,22,0,11,5, -22,128,92,136,22,0,11,4,96,33,144,34,32,1,58,32,32,161, -144,5,22,128,92,4,96,161,146,176,22,0,11,4,22,128,92,144, -3,0,9,216,255,255,8,7,22,128,92,44,23,0,11,7,22,128,92, -140,17,0,8,0,0,0,0,0,0,0,0,10,30,128,92,236,2,0,9,1, -30,128,92,116,17,0,8,0,20,240,140,132,0,0,0,7,168,4,90, -0,144,239,140,16,210,153,88,0,0,240,140,24,78,164,89,0, -16,180,140,8,12,173,89,78,0,0,19,19,32,4,90,7,224,156, -140,148,67,165,88,28,0,0,18,22,224,4,90,0,144,141,130,1, -137,148,89,1,160,181,140,240,255,255,21,42,160,60,51,16, -12,173,89,148,67,165,88,20,22,168,92,15,168,4,90,0,144, -165,154,8,137,148,89,8,160,181,140,240,255,255,20,24,160, -4,51,1,168,4,90,0,144,141,130,1,137,148,89,1,160,181,140, -240,255,255,21,0,80,7,132,0,0,0,10,144,0,128,140,36,19, -0,11,144,48,0,90,0,16,36,140,16,22,128,92,22,0,0,21,208, -19,0,11,0,16,132,144,0,0,0,10,0,0,0,0,4,32,244,146,92, -21,0,11,12,32,241,146,4,16,130,89,80,21,0,11,0,30,128, -92,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,24,22,40,92,64, -96,8,140,112,224,207,146,120,224,215,154,4,222,129,89,228, -18,0,11,144,48,0,90,0,16,36,140,16,22,128,92,30,0,0,21, -112,19,0,11,0,16,132,144,5,22,192,92,112,224,207,144,120, -224,215,152,0,0,0,10,138,25,128,88,76,4,0,9,0,16,129, -146,16,22,64,92,0,0,72,140,8,32,129,146,16,22,80,92,0,0, -128,140,1,30,88,92,4,32,73,146,12,32,89,146,76,21,0,11, -4,16,164,89,0,16,133,146,16,22,192,92,28,32,129,140,24, -32,241,146,138,25,200,88,0,0,208,140,68,224,247,146,4,32, -205,146,72,224,247,146,160,20,0,11,76,224,247,146,72,224, -55,152,1,30,128,92,36,32,241,146,40,32,49,154,8,21,0,11, -52,32,129,146,24,17,0,9,48,32,161,140,144,48,0,90,0,16, -101,152,16,22,128,92,14,0,0,18,66,0,96,140,8,0,0,8,2, -30,96,92,138,25,112,88,0,0,120,140,64,32,129,140,96,224, -247,146,0,16,101,178,80,224,247,146,100,224,247,146,64,20, -0,11,6,30,144,92,0,144,60,140,84,224,63,146,96,224,55, -152,80,224,151,152,2,30,128,92,72,32,49,154,80,32,145,154, -156,20,0,11,88,32,129,146,172,16,0,9,144,48,0,90,0,0, -160,140,16,22,128,92,10,0,0,21,138,25,160,88,92,32,161, -146,96,32,241,146,100,32,129,140,240,19,0,11,236,17,0,11, -8,20,0,11,228,17,0,11,4,32,164,144,32,32,161,146,248,17, -0,11,68,32,129,146,240,17,0,11,36,32,132,140,104,32,129, -146,196,17,0,11,16,22,32,92,220,17,0,11,72,32,132,140,4, -32,129,146,176,17,0,11,12,20,0,11,0,30,128,92,5,22,192, -92,112,224,207,144,120,224,215,152,0,0,0,10,0,0,0,0,0,0, -0,0,0,0,0,0,5,222,128,89,100,17,0,11,18,32,4,61,3,30, -128,92,0,0,0,10,0,0,0,0,48,32,164,140,1,30,136,92,0,80, -148,140,0,16,244,146,8,32,164,146,16,32,148,146,0,30,128, -92,0,0,0,10,0,0,0,0,0,0,0,0,48,198,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,16,72,8,89,16,48,3,90,0,20,136,140,0,0,0, -0,0,48,160,140,80,198,0,0,20,65,140,89,70,0,0,17,2,14, -172,89,0,116,180,140,48,198,0,0,0,144,189,144,21,124,164, -144,144,192,0,0,0,116,173,140,192,230,0,0,0,80,141,144, -20,128,165,89,23,1,165,89,0,32,165,140,0,80,165,146,0,80, -4,134,0,30,128,92,0,0,0,10,0,116,244,133,216,215,0,0,31, -152,145,89,0,144,156,140,0,16,156,146,1,25,128,89,0,0,0, -10,0,0,0,0,16,22,32,92,188,0,0,9,16,32,129,144,20,15,0, -9,24,32,129,144,10,32,4,58,152,1,0,9,8,32,129,144,18,32, -4,58,12,32,161,144,10,32,29,55,68,7,0,9,28,32,161,144, -14,32,5,58,4,16,135,89,188,18,0,11,152,16,0,11,110,0,36, -58,144,16,0,11,36,32,132,140,98,0,36,58,132,16,0,11,72, -32,132,140,30,0,36,61,80,0,0,8,0,0,0,0,32,32,161,144,0, -80,165,146,0,7,0,9,52,0,0,8,64,16,0,11,92,18,0,11,56, -16,0,11,16,16,169,89,24,0,0,8,0,0,0,0,0,80,133,144,214, -31,129,58,0,80,165,144,32,32,173,140,0,80,165,144,236,63, -5,61,16,16,0,11,108,18,0,11,0,30,128,92,0,0,0,10,0,0, -0,0,0,0,0,0,144,48,0,90,0,16,36,140,0,30,48,92,22,0,0, -21,240,0,0,9,0,30,128,92,0,0,0,10,0,0,0,0,12,32,164, -144,131,0,232,140,148,64,167,88,30,32,5,61,40,16,0,11,9, -30,232,92,0,80,159,140,0,16,156,146,1,25,128,89,0,0,0, -10,16,16,135,89,204,17,0,11,4,16,42,89,0,80,137,144,134, -96,4,58,0,16,145,144,126,64,148,58,12,32,161,144,9,47,5, -90,16,32,129,144,16,22,128,92,54,0,0,16,17,129,148,89, -196,14,0,9,0,16,161,144,0,80,169,144,21,1,165,89,58,0, -133,58,12,32,161,144,1,25,48,89,133,9,165,88,12,32,161, -146,36,0,0,8,0,0,0,0,0,16,137,144,4,32,145,144,40,17,0, -11,16,17,136,89,16,32,129,144,1,30,144,92,16,14,0,9,12, -32,161,144,8,32,169,144,4,32,241,146,9,14,165,88,12,32, -161,146,0,16,169,146,4,16,135,89,120,17,0,11,6,22,128,92, -0,0,0,10,0,0,0,0,32,14,0,8,0,0,0,0,0,0,0,0,0,0,0,0, -248,14,0,11,20,17,0,11,240,14,0,11,4,32,36,144,132,48,0, -90,0,0,40,140,16,22,128,92,34,0,0,18,4,22,128,92,220, -254,255,9,1,25,144,89,10,128,132,58,5,80,40,89,32,32,33, -144,232,63,1,61,188,14,0,11,24,17,0,11,5,22,128,92,0,0, -0,10,0,0,0,0,18,32,4,61,0,30,128,92,0,0,0,10,0,0,0,0, -0,48,32,144,240,230,0,0,16,208,131,89,132,48,0,90,16,210, -43,88,0,0,168,140,30,0,0,18,16,0,0,8,4,22,168,92,4,32, -33,144,14,32,1,58,12,32,161,144,240,95,161,52,94,32,1,58, -149,48,0,90,4,32,161,144,16,22,128,92,22,0,0,21,0,48, -160,146,240,230,0,0,12,0,0,8,0,0,0,0,4,96,165,146,12, -32,169,144,32,96,161,140,0,48,144,140,255,255,255,255,18, -22,152,92,20,96,5,90,4,32,153,146,16,22,128,92,14,0,0, -17,4,22,128,93,76,4,0,9,4,16,132,89,0,0,0,10,0,48,168, -144,244,230,0,0,218,96,5,58,4,96,165,144,0,48,152,140, -255,255,255,255,202,192,164,58,12,96,165,144,20,65,41,89, -0,80,129,140,120,11,0,9,6,33,4,58,0,48,144,140,255,255, -255,255,250,128,132,58,0,48,32,144,240,230,0,0,0,48,160, -144,244,230,0,0,132,48,0,90,0,0,168,140,16,22,128,92,26, -0,0,18,22,0,37,58,4,22,168,92,4,32,33,144,10,32,1,58, -244,31,37,61,34,32,1,61,244,13,0,11,31,216,145,89,0,144, -156,140,0,16,156,146,4,30,128,92,72,252,255,9,216,254,255, -8,149,48,0,90,4,32,161,144,16,22,128,92,22,0,0,21,0,48, -160,146,240,230,0,0,12,0,0,8,0,0,0,0,4,96,165,146,0,16, -161,176,4,16,132,89,0,48,168,140,255,255,255,255,5,192, -141,89,0,80,188,140,0,16,161,154,8,32,177,146,12,32,137, -146,0,0,0,10,0,0,0,0,5,16,132,89,188,10,0,9,74,32,4, -58,0,48,152,140,255,255,255,255,62,192,132,58,12,32,44, -146,0,48,160,144,244,230,0,0,0,48,64,140,203,173,219,172, -0,48,72,140,255,255,255,255,5,22,88,92,0,16,68,154,0,48, -128,146,244,230,0,0,8,32,164,146,16,16,132,89,0,0,0,10, -52,254,255,8,0,0,0,0,0,0,0,0,0,0,0,0,144,48,0,90,0, -16,68,140,16,22,128,92,14,0,0,21,17,22,128,92,12,254,255, -8,18,96,4,61,100,3,0,9,0,30,128,92,0,0,0,10,16,9,44, -89,0,80,161,144,0,48,152,140,203,173,219,172,26,192,164, -61,0,52,164,144,244,255,255,255,0,48,232,140,255,255,255, -255,30,64,167,58,216,12,0,11,31,216,233,89,0,80,159,140, -0,16,156,146,180,1,0,8,0,0,0,0,12,96,161,144,17,208,139, -89,17,210,51,88,20,129,57,89,26,224,1,60,5,22,128,92,0, -144,137,140,124,2,0,9,8,22,128,92,0,0,0,10,0,48,160,144, -244,230,0,0,50,0,45,61,7,22,128,92,192,9,0,9,6,33,4,58, -0,48,152,140,255,255,255,255,250,192,132,58,12,96,161,144, -8,22,128,92,7,0,165,89,12,96,161,146,0,0,0,10,12,96,161, -144,5,60,37,140,16,0,0,0,4,32,161,144,0,48,232,140,255, -255,255,255,202,64,167,58,0,48,184,144,240,230,0,0,151,32, -1,90,0,0,128,140,16,22,128,92,26,0,0,18,22,224,5,58,23, -22,128,92,4,224,189,144,10,0,185,58,244,255,5,61,26,224, -5,61,20,12,0,11,31,216,233,89,0,80,159,140,0,16,156,146, -240,0,0,8,144,48,0,90,4,224,165,144,16,22,128,92,22,0,0, -21,0,48,160,146,240,230,0,0,12,0,0,8,0,0,0,0,4,32,164, -146,12,96,161,144,0,48,168,144,244,230,0,0,12,224,181,144, -149,224,5,90,22,60,165,140,16,0,0,0,12,96,161,146,16,22, -128,92,18,0,0,21,0,48,40,146,244,230,0,0,16,0,0,8,12, -96,161,144,5,60,45,146,24,0,0,0,12,96,161,144,26,128,161, -52,5,22,128,92,0,144,137,140,100,1,0,9,5,16,132,89,0,0, -0,10,8,96,33,144,14,33,1,58,4,32,161,144,0,48,152,140, -255,255,255,255,254,192,164,58,12,96,161,144,12,32,169,144, -21,60,165,140,16,0,0,0,234,128,161,52,0,48,184,144,240, -230,0,0,151,32,1,90,0,0,128,140,16,22,128,92,26,0,0,18, -22,224,5,58,23,22,128,92,4,224,189,144,10,0,185,58,244, -255,5,61,34,224,5,61,36,11,0,11,31,216,153,89,0,208,236, -140,0,16,236,146,4,30,128,92,120,249,255,9,4,254,255,8, -12,32,161,144,0,48,168,144,244,230,0,0,12,96,177,144,149, -96,1,90,22,60,165,140,16,0,0,0,12,32,161,146,16,22,128, -92,22,0,0,21,0,48,32,146,244,230,0,0,20,0,0,8,0,0,0,0, -12,96,161,144,5,60,37,146,24,0,0,0,144,48,0,90,4,32,161, -144,16,22,128,92,18,0,0,21,0,48,160,146,240,230,0,0,8,0, -0,8,4,32,164,146,0,48,152,140,255,255,255,255,19,22,232, -92,16,32,129,140,4,32,233,146,7,129,145,89,0,16,138,140, -212,2,0,11,4,22,128,92,0,144,137,140,84,0,0,9,4,16,132, -89,0,0,0,10,6,22,128,92,100,251,255,9,144,48,0,90,0,16, -36,140,16,22,128,92,38,0,0,18,7,129,145,89,0,16,138,140, -156,2,0,11,8,22,128,92,160,0,0,9,4,22,128,92,0,0,0,10, -0,0,0,0,48,253,255,8,0,0,0,0,0,0,0,0,0,0,0,0,12,32, -172,144,32,96,164,140,118,64,165,49,16,124,180,140,16,0,0, -0,8,160,133,146,0,48,168,144,244,230,0,0,0,48,144,140, -203,173,219,172,18,22,152,92,0,144,157,146,0,48,144,140, -255,255,255,255,18,22,152,92,12,32,164,144,4,160,157,146, -149,32,4,90,16,9,165,89,17,1,165,89,12,160,165,146,12,32, -140,146,18,0,0,21,0,48,176,146,244,230,0,0,16,0,0,8,12, -160,165,144,22,60,181,146,24,0,0,0,22,16,132,89,8,0,0,8, -0,0,0,10,10,32,4,61,0,0,0,10,16,9,140,89,0,80,164,144, -0,48,232,140,203,173,219,172,34,65,167,61,0,52,164,144, -244,255,255,255,0,48,152,140,255,255,255,255,14,193,164,61, -0,48,168,144,240,230,0,0,98,97,5,58,0,48,160,144,244,230, -0,0,190,0,141,58,12,96,164,144,17,60,133,140,16,0,0,0,4, -32,164,144,0,48,232,140,255,255,255,255,162,64,167,58,149, -32,4,90,0,0,144,140,21,22,184,92,26,0,0,18,22,96,5,58, -23,22,144,92,4,224,189,144,10,0,188,58,244,255,5,61,26, -224,5,61,28,9,0,11,31,216,233,89,0,80,159,140,0,16,156, -146,172,0,0,8,12,96,164,144,0,48,168,144,244,230,0,0,12, -32,180,144,149,32,4,90,22,60,165,140,16,0,0,0,12,96,164, -146,16,22,128,92,22,0,0,21,0,48,136,146,244,230,0,0,20, -0,0,8,0,0,0,0,12,96,164,144,17,60,141,146,24,0,0,0,22, -160,4,61,4,224,165,144,0,48,160,146,240,230,0,0,12,0,0, -8,4,224,165,144,4,160,164,146,8,96,132,144,150,32,4,58,4, -32,164,144,0,48,152,140,255,255,255,255,134,192,164,58,0, -48,184,144,240,230,0,0,22,0,188,58,18,224,5,58,4,224,189, -144,10,0,188,58,248,255,5,61,30,224,5,61,112,8,0,11,31, -216,153,89,0,208,236,140,0,16,236,146,4,30,128,92,196,246, -255,8,12,32,164,144,0,48,168,144,244,230,0,0,12,96,180, -144,149,96,4,90,22,60,165,140,16,0,0,0,12,32,164,146,16, -22,128,92,22,0,0,21,0,48,128,146,244,230,0,0,0,0,0,10, -0,0,0,0,12,32,164,144,16,60,133,146,24,0,0,0,0,0,0,10, -0,48,160,144,240,230,0,0,0,48,136,146,240,230,0,0,4,96, -164,146,0,0,0,10,144,64,132,112,14,32,4,61,0,30,128,92, -0,0,0,10,224,248,255,9,144,48,0,90,0,16,36,140,16,22, -128,92,22,0,0,18,0,52,148,144,252,255,255,255,0,30,136, -92,88,243,255,11,4,22,128,92,0,0,0,10,0,20,240,140,220, -0,0,0,34,162,4,59,16,96,4,90,0,144,239,140,18,64,172,89, -198,0,0,18,21,33,4,90,17,210,152,88,2,1,0,17,19,96,4, -90,0,208,180,144,16,210,160,88,4,224,156,140,178,0,0,21, -16,32,5,90,4,9,165,89,108,0,0,18,8,8,165,89,0,16,140, -140,22,22,184,92,32,0,240,140,128,139,148,90,130,0,0,18, -8,136,247,89,0,80,188,130,8,204,189,89,1,96,140,140,232, -31,141,53,0,208,188,144,146,48,1,90,4,224,156,140,30,132, -141,93,62,0,0,20,23,22,176,92,0,208,188,144,132,137,148, -89,0,16,141,146,4,8,165,89,220,255,255,8,132,137,148,89, -0,208,180,144,4,200,156,89,0,16,141,146,146,48,1,90,4,8, -165,89,0,144,141,140,228,255,255,19,30,160,4,58,129,137, -148,89,0,16,141,130,128,168,4,90,1,32,165,140,8,76,140, -89,236,255,255,21,0,30,240,92,0,80,7,132,0,0,0,10,16,32, -5,90,0,208,188,144,131,72,140,88,3,78,244,89,128,255,255, -18,148,67,140,88,16,96,4,90,4,32,165,140,30,132,173,93,0, -16,140,140,14,0,0,17,23,22,176,92,4,224,156,140,21,22, -184,92,56,255,255,8,21,210,184,88,23,96,5,90,4,201,157, -89,18,0,140,89,17,210,160,88,182,0,0,21,17,32,5,90,0, -208,188,144,4,201,156,89,112,0,0,18,23,22,176,92,32,0, -240,140,128,139,148,90,134,255,255,18,136,142,181,89,0,116, -140,140,255,255,255,255,17,32,5,90,0,80,180,130,8,137,247, -89,224,255,255,21,0,208,180,144,146,48,1,90,0,244,156,140, -252,255,255,255,30,132,141,93,0,144,189,140,4,9,165,89,54, -0,0,20,0,208,180,144,132,137,148,89,0,16,141,146,216,255, -255,8,132,137,148,89,0,208,188,144,4,201,156,89,0,16,141, -146,146,48,1,90,4,9,165,89,0,208,141,140,228,255,255,19, -22,191,4,58,136,78,140,89,4,32,165,140,129,9,165,89,148, -32,4,90,0,16,141,130,136,78,140,89,240,255,255,21,244,254, -255,8,17,32,5,90,0,208,189,144,131,72,173,88,0,208,180, -144,3,78,245,89,124,255,255,18,148,67,173,88,17,96,5,90, -30,132,173,93,16,0,0,20,22,22,184,92,8,0,0,18,4,201,156, -89,21,22,176,92,48,255,255,8,30,22,232,92,176,254,255,8, -0,0,0,0,16,72,8,89,0,48,128,140,0,231,0,0,138,25,136, -88,242,0,232,140,29,48,0,102,36,32,4,62,0,30,32,92,0,48, -40,140,176,86,0,0,64,224,167,140,0,30,48,92,72,224,247, -146,0,16,37,154,20,0,0,8,64,224,135,140,0,48,136,140,0, -231,0,0,24,0,0,9,64,224,135,176,0,48,144,146,208,235,0, -0,0,0,0,10,0,0,0,0,16,22,64,92,17,22,32,92,4,22,128, -92,220,1,0,11,0,30,48,92,0,48,56,140,0,235,0,0,0,16,50, -154,0,16,161,192,128,40,5,90,1,8,44,89,4,64,41,89,164,0, -0,18,152,0,0,8,0,16,161,192,31,88,152,89,16,192,164,58, -12,32,77,58,8,32,109,58,16,32,85,61,4,80,32,89,0,16,161, -192,224,63,5,61,0,16,161,192,100,32,5,58,0,16,170,144,21, -80,160,89,21,57,32,146,0,235,0,0,0,16,162,146,0,16,161, -192,56,32,5,58,31,88,144,89,48,128,164,58,44,32,77,58,40, -32,109,58,36,32,85,58,4,80,32,89,0,16,161,192,24,32,5, -58,31,88,152,89,16,192,164,58,12,32,77,58,8,32,109,58, -228,63,85,61,0,16,161,192,12,32,5,58,0,16,241,130,4,80, -32,89,0,16,161,192,12,32,5,58,0,16,162,144,132,63,149,59, -0,16,162,144,20,57,240,146,0,235,0,0,0,80,161,192,128,40, -5,90,0,30,32,92,204,0,0,18,0,48,40,146,80,235,0,0,5,22, -128,92,236,0,0,11,1,72,41,89,16,64,41,89,0,80,161,192, -128,40,5,90,1,30,32,92,164,0,0,18,0,48,48,140,84,235,0, -0,0,144,41,146,5,22,128,92,192,0,0,11,1,72,41,89,16,64, -41,89,0,80,161,192,128,40,5,90,4,80,32,89,120,0,0,18,4, -160,41,146,5,22,128,92,156,0,0,11,1,72,41,89,16,64,41, -89,0,80,161,192,128,40,5,90,4,80,32,89,84,0,0,18,8,160, -41,146,5,22,128,92,120,0,0,11,1,72,41,89,16,64,41,89,0, -80,161,192,128,40,5,90,4,80,32,89,48,0,0,18,12,160,41, -146,5,22,128,92,84,0,0,11,1,72,41,89,16,64,41,89,0,80, -161,192,6,16,52,89,148,48,0,90,4,80,32,89,8,0,0,18,108, -63,225,59,0,48,152,140,80,235,0,0,4,57,240,146,80,235,0, -0,19,22,144,92,8,32,146,146,0,0,0,10,0,0,0,0,0,0,0,0, -0,0,0,0,0,20,240,140,48,0,0,0,30,22,136,92,0,30,240,92, -0,16,164,192,0,30,168,92,12,0,0,8,0,16,164,192,21,80, -168,89,148,48,0,90,16,80,128,89,240,255,255,21,21,22,128, -92,0,80,4,132,0,0,0,10,0,0,0,0,1,1,232,140,29,48,0, -102,0,0,0,10,0,0,0,0,0,20,240,140,32,0,0,0,30,22,128, -92,0,30,240,92,0,48,160,140,80,205,3,0,20,22,168,92,0, -48,168,146,224,235,0,0,0,16,4,132,0,0,0,10,0,0,0,0,144, -48,0,90,0,48,168,144,224,235,0,0,12,0,0,21,21,22,128,92, -0,0,0,10,21,208,163,89,20,210,163,88,0,32,165,140,21,32, -5,90,20,60,180,140,255,255,255,255,20,0,0,17,16,0,181,52, -0,48,144,140,79,221,3,0,32,128,180,54,132,2,0,11,12,30, -144,92,18,22,136,92,0,16,140,146,0,48,128,140,255,255,255, -255,0,0,0,10,22,80,168,89,12,128,173,51,0,48,168,140,79, -221,3,0,20,22,128,92,0,48,168,146,224,235,0,0,0,0,0,10, -0,48,136,140,80,205,3,0,20,64,132,52,1,9,164,89,0,48, -144,140,79,221,3,0,28,128,164,54,44,2,0,11,12,30,144,92, -18,22,136,92,0,16,140,146,1,25,128,89,0,0,0,10,0,48,128, -146,224,235,0,0,0,30,128,92,0,0,0,10,0,0,0,0,0,0,0,0, -0,0,0,0,234,0,232,140,29,48,0,102,144,48,0,90,16,22,32, -92,20,0,0,18,228,1,0,11,0,16,36,146,1,25,128,89,0,0,0, -10,0,30,128,92,0,0,0,10,0,0,0,0,16,72,8,89,64,224,143, -140,235,0,232,140,29,48,0,102,144,48,0,90,16,22,32,92,20, -0,0,18,172,1,0,11,0,16,36,146,1,25,128,89,0,0,0,10,64, -224,135,144,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,16,72,8, -89,64,224,159,140,233,0,232,140,29,48,0,102,144,48,0,90, -16,22,32,92,20,0,0,18,108,1,0,11,0,16,36,146,1,25,128, -89,0,0,0,10,64,224,135,144,0,0,0,10,0,0,0,0,0,0,0,0, -0,0,0,0,239,0,232,140,29,48,0,102,144,48,0,90,16,22,32, -92,20,0,0,18,52,1,0,11,0,16,36,146,1,25,128,89,0,0,0, -10,0,30,128,92,0,0,0,10,0,0,0,0,16,72,8,89,64,224,159, -140,232,0,232,140,29,48,0,102,144,48,0,90,16,22,32,92,20, -0,0,18,252,0,0,11,0,16,36,146,1,25,128,89,0,0,0,10,64, -224,135,144,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,224,253, -255,8,0,0,0,0,0,0,0,0,0,0,0,0,0,20,240,140,20,0,0,0, -30,22,136,92,0,30,240,92,0,48,128,140,240,235,0,0,0,80, -4,132,0,0,0,10,0,20,240,140,20,0,0,0,30,22,136,92,0,30, -240,92,0,48,128,140,128,236,0,0,0,80,4,132,0,0,0,10,0, -20,240,140,20,0,0,0,30,22,136,92,0,30,240,92,0,48,128, -140,240,236,0,0,0,80,4,132,0,0,0,10,0,20,240,140,20,0, -0,0,30,22,136,92,0,30,240,92,0,48,128,140,240,235,0,0,0, -80,4,132,0,0,0,10,0,20,240,140,20,0,0,0,30,22,136,92,0, -30,240,92,0,48,128,140,128,236,0,0,0,80,4,132,0,0,0,10, -0,20,240,140,20,0,0,0,30,22,136,92,0,30,240,92,0,48,128, -140,240,236,0,0,0,80,4,132,0,0,0,10,0,20,240,140,20,0, -0,0,30,22,136,92,0,30,240,92,0,48,128,140,240,236,0,0,0, -80,4,132,0,0,0,10,0,20,240,140,12,0,0,0,30,22,128,92,0, -30,240,92,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,20, -240,140,12,0,0,0,30,22,128,92,0,30,240,92,0,16,4,132,0, -0,0,10,0,0,0,0,0,0,0,0,0,20,240,140,12,0,0,0,30,22, -128,92,0,30,240,92,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0, -0,0,20,240,140,12,0,0,0,30,22,128,92,0,30,240,92,0,16, -4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,20,240,140,12,0,0,0, -30,22,128,92,0,30,240,92,0,16,4,132,0,0,0,10,0,0,0,0, -0,0,0,0,0,20,240,140,12,0,0,0,30,22,128,92,0,30,240,92, -0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,20,240,140,12, -0,0,0,30,22,128,92,0,30,240,92,0,16,4,132,0,0,0,10,0, -0,0,0,0,0,0,0,0,20,240,140,12,0,0,0,30,22,128,92,0,30, -240,92,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,20,240, -140,12,0,0,0,30,22,128,92,0,30,240,92,0,16,4,132,0,0,0, -10,0,0,0,0,0,0,0,0,0,20,240,140,12,0,0,0,30,22,128,92, -0,30,240,92,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,20, -240,140,12,0,0,0,30,22,128,92,0,30,240,92,0,16,4,132,0, -0,0,10,0,0,0,0,0,0,0,0,0,20,240,140,16,0,0,0,30,22, -136,92,0,30,240,92,18,22,128,92,0,80,4,132,0,0,0,10,0, -0,0,0,0,20,240,140,12,0,0,0,30,22,128,92,0,30,240,92,0, -16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,20,240,140,12,0, -0,0,30,22,128,92,0,30,240,92,0,16,4,132,0,0,0,10,0,0, -0,0,0,0,0,0,0,20,240,140,12,0,0,0,30,22,128,92,0,30, -240,92,0,16,4,132,0,0,0,10,0,0,0,0,0,0,0,0,0,20,240, -140,12,0,0,0,30,22,128,92,0,30,240,92,0,16,4,132,0,0,0, -10,0,0,0,0,0,0,0,0,0,20,240,140,12,0,0,0,30,22,136,92, -0,30,240,92,0,80,4,132,0,0,0,10,0,0,0,0,0,0,0,0,240, -252,255,8,0,0,0,0,0,0,0,0,0,0,0,0,0,20,240,140,12,0, -0,0,30,22,128,92,0,30,240,92,0,16,4,132,0,0,0,10,0,0, -0,0,0,0,0,0,0,20,240,140,20,0,0,0,30,22,136,92,0,30, -240,92,1,25,168,89,149,2,132,100,0,80,4,132,0,0,0,10,0, -20,240,140,12,0,0,0,30,22,128,92,0,30,240,92,0,16,4,132, -0,0,0,10,0,0,0,0,0,0,0,0,144,48,0,90,19,4,32,140,86, -0,0,20,16,22,40,92,133,16,96,100,66,0,0,16,12,17,101,89, -140,48,0,90,18,0,0,20,12,70,137,89,0,30,128,92,20,0,0, -8,12,17,104,89,13,68,137,89,32,32,107,140,13,70,129,89, -20,78,140,88,12,1,33,89,20,14,33,89,132,67,140,88,0,0,0, -10,0,30,128,93,248,255,255,8,16,17,40,89,133,16,96,100, -12,17,101,89,140,48,0,90,18,0,0,20,12,70,137,89,0,30, -128,92,20,0,0,8,12,17,104,89,13,68,137,89,32,32,107,140, -13,70,129,89,20,78,140,88,12,1,33,89,20,14,33,89,132,67, -140,88,159,73,140,88,176,255,255,8,1,78,36,89,0,48,96, -140,0,0,224,255,4,32,3,90,106,0,0,17,21,12,33,89,10,78, -44,89,158,73,41,88,31,78,41,88,22,12,100,89,133,3,43,88, -145,48,0,90,29,4,96,140,38,0,0,20,4,32,3,90,4,1,35,89, -14,0,0,17,4,68,129,89,0,0,0,10,1,25,128,89,31,14,132, -88,244,255,255,8,4,32,3,90,4,1,35,89,18,0,0,17,4,68,41, -89,5,17,128,89,220,255,255,8,31,94,128,89,212,255,255,8, -0,30,128,92,204,255,255,8,1,78,36,89,0,48,96,140,0,0, -224,255,4,32,3,90,66,0,0,17,21,12,33,89,11,78,44,89,159, -73,41,88,21,12,100,89,133,3,43,88,145,48,0,90,38,0,0,20, -30,4,96,140,4,32,3,90,18,0,0,17,4,1,35,89,4,68,129,89, -0,0,0,10,1,25,128,89,248,255,255,8,0,30,128,92,240,255, -255,8,1,78,36,89,0,48,96,140,255,255,223,255,12,32,1,90, -4,49,0,90,82,0,0,22,21,12,33,89,128,3,96,140,12,1,33, -89,255,0,96,140,4,32,3,90,46,0,0,19,23,14,33,89,12,78, -44,89,9,76,41,89,132,67,33,88,29,12,44,89,28,47,4,90,5, -0,129,91,31,111,4,90,159,15,132,88,0,0,0,10,132,48,0,90, -48,0,0,20,24,0,0,8,42,0,0,18,0,48,96,140,0,0,224,255, -4,32,3,90,18,0,0,17,0,48,128,140,0,0,128,127,204,255, -255,8,1,25,128,89,204,255,255,8,0,30,128,92,188,255,255, -8,31,12,84,89,31,142,82,89,1,14,36,89,0,48,96,140,255, -255,255,254,12,32,1,90,4,49,0,90,58,0,0,22,24,12,33,89, -0,48,96,140,128,252,255,255,12,1,33,89,20,14,33,89,9,14, -44,89,12,76,41,89,132,67,137,88,29,14,132,89,145,131,138, -88,0,0,0,10,0,30,128,93,244,255,255,8,250,255,255,18,0, -48,96,140,0,0,0,255,12,32,1,90,22,0,0,20,0,48,136,140, -0,0,240,127,0,30,128,92,208,255,255,8,1,25,128,89,1,25, -136,89,200,255,255,8,15,140,84,89,31,142,82,89,17,142,36, -89,17,12,33,89,31,111,4,90,90,0,0,16,0,48,96,140,0,60, -0,0,12,1,33,89,255,7,96,140,4,32,3,90,46,0,0,19,31,78, -140,88,11,76,60,89,21,78,52,89,20,14,33,89,135,3,137,88, -10,47,4,90,11,12,132,89,6,0,132,91,138,67,140,88,0,0,0, -10,34,0,0,17,0,48,136,140,0,0,240,127,0,30,128,92,232, -255,255,8,144,67,140,88,17,48,0,90,220,255,255,18,1,25, -128,89,1,25,136,89,212,255,255,8,31,72,84,88,8,0,0,8,31, -78,84,88,1,78,36,89,0,48,96,140,0,0,224,255,4,32,3,90, -10,0,0,17,10,22,136,92,0,0,0,10,31,200,156,88,1,78,36, -89,1,206,44,89,21,94,96,89,4,0,107,89,13,32,3,90,154,1, -0,22,5,0,107,89,13,32,3,90,142,1,0,22,11,78,60,89,21, -12,100,89,11,14,52,89,140,195,57,88,159,201,57,88,11,206, -76,89,21,140,100,89,11,142,68,89,140,67,74,88,159,73,74, -88,21,12,33,89,21,76,41,89,31,76,84,89,31,142,82,89,4, -96,1,90,32,0,104,140,52,0,0,20,5,1,97,89,12,96,3,90,16, -0,0,20,9,22,64,92,0,30,72,92,13,1,99,89,12,4,66,89,12, -65,107,89,13,70,106,89,12,68,74,89,141,3,66,88,52,0,0,8, -4,65,97,89,12,96,3,90,16,0,0,20,7,22,48,92,0,30,56,92, -13,1,99,89,12,132,49,89,12,65,107,89,13,198,105,89,12, -196,57,89,141,131,49,88,5,22,32,92,17,195,100,88,31,47,3, -90,62,0,0,18,8,128,49,91,9,192,57,91,150,0,0,16,1,140, -49,89,31,206,97,89,1,204,57,89,140,131,49,88,1,8,33,89, -255,7,96,140,4,32,3,90,116,0,0,20,12,22,32,92,0,30,48, -93,104,0,0,8,8,129,49,91,9,193,57,91,22,0,0,18,0,56,0, -90,6,17,48,91,7,17,56,91,31,136,82,88,135,16,96,100,32, -0,0,18,134,16,96,100,102,0,0,16,12,209,103,89,12,134,57, -89,0,30,48,92,32,32,99,140,28,0,0,8,12,132,105,89,1,76, -107,89,12,209,103,89,12,198,57,89,12,134,49,89,141,195,57, -88,12,1,33,89,132,48,0,90,54,0,0,20,10,175,1,90,31,206, -57,88,11,140,129,89,21,206,105,89,11,204,137,89,20,14,33, -89,145,3,137,88,13,0,132,91,10,64,140,91,0,0,0,10,0,30, -128,93,248,255,255,8,0,30,128,92,10,22,136,92,236,255,255, -8,0,48,96,140,0,0,224,255,12,32,1,90,70,0,0,18,90,0,0, -20,12,96,1,90,50,0,0,18,78,0,0,20,132,3,108,88,13,48,0, -90,22,0,0,18,133,131,108,88,13,48,0,90,70,254,255,21,176, -255,255,8,133,131,108,88,13,48,0,90,50,0,0,18,18,22,128, -93,156,255,255,8,12,96,1,90,22,0,0,20,146,255,255,17,17, -195,100,88,140,48,0,90,134,255,255,19,1,25,128,89,1,25, -136,89,120,255,255,8,145,192,140,88,0,30,128,92,108,255, -255,8,17,195,28,88,31,204,24,89,31,206,24,89,1,78,36,89, -1,206,44,89,21,94,96,89,4,0,107,89,13,32,3,90,238,0,0, -22,5,0,107,89,13,32,3,90,226,0,0,22,11,78,60,89,1,204, -57,89,10,14,52,89,22,12,108,89,141,195,57,88,158,201,57, -88,11,206,76,89,11,142,68,89,21,140,108,89,141,67,74,88, -159,73,74,88,21,12,33,89,21,76,41,89,137,128,81,103,10, -22,104,92,0,30,96,92,137,0,99,103,13,22,80,92,1,12,106, -89,0,30,96,92,137,0,99,103,11,64,99,103,0,56,0,90,13, -129,82,91,0,201,90,91,13,129,82,91,0,201,90,91,31,239,2, -90,16,0,0,18,10,128,82,91,11,192,90,91,1,9,33,89,255,35, -33,140,5,1,33,89,254,7,96,140,12,32,1,90,46,0,0,20,10, -175,2,90,11,140,130,89,21,206,106,89,11,204,138,89,20,78, -140,88,20,14,33,89,145,3,137,88,13,0,132,91,3,64,140,91, -0,0,0,10,132,48,0,90,16,0,0,20,1,8,35,89,0,30,80,93, -200,255,255,8,0,30,32,92,0,30,80,93,188,255,255,8,0,48, -96,140,0,0,224,255,12,32,1,90,90,0,0,18,94,0,0,20,12, -96,1,90,66,0,0,18,82,0,0,20,132,3,108,88,13,48,0,90,38, -0,0,18,133,131,108,88,13,48,0,90,242,254,255,21,0,48,136, -140,0,0,240,127,0,30,128,92,131,67,140,88,148,255,255,8, -133,131,108,88,13,48,0,90,26,0,0,18,0,30,128,93,131,67, -140,88,124,255,255,8,12,96,1,90,210,255,255,17,1,25,128, -89,1,25,136,89,104,255,255,8,0,0,0,0,0,0,0,0,0,0,0,0, -17,195,28,88,31,204,24,89,31,206,24,89,1,78,36,89,1,206, -44,89,21,94,96,89,4,0,107,89,13,32,3,90,214,0,0,22,5,0, -107,89,13,32,3,90,202,0,0,22,11,78,60,89,11,14,52,89,21, -12,108,89,141,195,57,88,11,206,76,89,11,142,68,89,21,140, -108,89,141,67,74,88,159,201,57,88,159,73,74,88,21,12,33, -89,21,76,41,89,7,64,98,103,6,64,82,103,0,120,0,90,12, -192,98,91,13,16,104,91,7,0,114,103,10,128,115,91,12,192, -99,91,13,16,104,91,31,111,3,90,16,0,0,18,12,0,99,91,13, -64,107,91,1,9,33,89,4,124,33,140,2,252,255,255,254,7,80, -140,10,32,1,90,46,0,0,20,10,47,3,90,11,12,131,89,21,78, -83,89,11,76,139,89,20,78,140,88,20,14,33,89,145,3,137,88, -10,0,132,91,3,64,140,91,0,0,0,10,132,48,0,90,16,0,0,20, -1,136,34,89,0,30,96,93,200,255,255,8,0,30,32,92,0,30,96, -93,188,255,255,8,31,204,24,89,31,206,24,89,0,48,96,140,0, -0,224,255,12,32,1,90,58,0,0,18,70,0,0,20,12,96,1,90,62, -0,0,20,70,0,0,18,132,3,108,88,13,48,0,90,18,0,0,18,133, -131,108,88,13,48,0,90,2,255,255,21,0,30,128,93,131,67, -140,88,148,255,255,8,12,96,1,90,14,0,0,20,5,48,0,90,30, -0,0,21,1,25,128,89,1,25,136,89,120,255,255,8,132,3,108, -88,13,48,0,90,238,255,255,18,0,48,136,140,0,0,240,127, -131,67,140,88,0,30,128,92,88,255,255,8,0,0,0,0,1,78,36, -89,1,206,52,89,0,48,96,140,0,0,224,255,12,32,1,90,126,0, -0,22,12,160,1,90,198,0,0,22,132,131,49,88,6,48,0,90,98, -0,0,18,159,77,100,89,31,78,60,88,16,3,51,88,7,3,59,88, -0,56,0,90,12,129,49,91,0,201,57,91,159,205,100,89,31,206, -76,88,18,3,67,88,9,3,75,88,0,56,0,90,12,1,66,91,0,73, -74,91,135,96,2,90,1,25,128,89,34,0,0,20,1,30,128,92,26, -0,0,17,6,32,2,90,18,0,0,17,1,25,128,89,10,0,0,20,0,30, -128,92,0,0,0,10,12,32,1,90,30,0,0,18,3,30,128,92,240, -255,255,8,1,30,128,92,232,255,255,8,1,25,128,89,224,255, -255,8,12,160,1,90,230,255,255,20,30,0,0,17,17,195,100,88, -140,48,0,90,198,255,255,19,31,111,4,90,214,255,255,16,216, -255,255,8,145,48,0,90,208,255,255,20,196,255,255,8,12,160, -1,90,182,255,255,20,31,239,4,90,182,255,255,18,184,255, -255,8,0,0,0,10 -}; - -int pca200e_microcode_size_4 = sizeof(pca200e_microcode_4); diff --git a/sbin/atm/ilmid/Makefile b/sbin/atm/ilmid/Makefile deleted file mode 100644 index 67d9bab..0000000 --- a/sbin/atm/ilmid/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -# =================================== -# HARP | Host ATM Research Platform -# =================================== -# -# This Host ATM Research Platform ("HARP") file (the "Software") is -# made available by Network Computing Services, Inc. ("NetworkCS") -# "AS IS". NetworkCS does not provide maintenance, improvements or -# support of any kind. -# -# NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, -# INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE -# SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. -# In no event shall NetworkCS be responsible for any damages, including -# but not limited to consequential damages, arising from or relating to -# any use of the Software or related support. -# -# Copyright 1994-1998 Network Computing Services, Inc. -# -# Copies of this Software may be made, however, the above copyright -# notice must be reproduced on all copies. -# -# @(#) $Id: Makefile,v 1.5 1998/07/10 16:01:58 jpt Exp $ -# $FreeBSD$ - -PROG= ilmid -MAN= ilmid.8 - -.if ${MACHINE_ARCH} == "arm" -WARNS?= 3 -.else -WARNS?= 6 -.endif - -CFLAGS+= -I${.CURDIR}/../../../sys - -DPADD= ${LIBATM} -LDADD= -latm - -.include diff --git a/sbin/atm/ilmid/ilmid.8 b/sbin/atm/ilmid/ilmid.8 deleted file mode 100644 index 8ffa9fe..0000000 --- a/sbin/atm/ilmid/ilmid.8 +++ /dev/null @@ -1,110 +0,0 @@ -.\" -.\" =================================== -.\" HARP | Host ATM Research Platform -.\" =================================== -.\" -.\" -.\" This Host ATM Research Platform ("HARP") file (the "Software") is -.\" made available by Network Computing Services, Inc. ("NetworkCS") -.\" "AS IS". NetworkCS does not provide maintenance, improvements or -.\" support of any kind. -.\" -.\" NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, -.\" INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY -.\" AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE -.\" SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. -.\" In no event shall NetworkCS be responsible for any damages, including -.\" but not limited to consequential damages, arising from or relating to -.\" any use of the Software or related support. -.\" -.\" Copyright 1994-1998 Network Computing Services, Inc. -.\" -.\" Copies of this Software may be made, however, the above copyright -.\" notice must be reproduced on all copies. -.\" -.\" $FreeBSD$ -.\" -.Dd September 14, 1998 -.Dt ILMID 8 -.Os -.Sh NAME -.Nm ilmid -.Nd "simple ILMI ATM address registration daemon" -.Sh SYNOPSIS -.Nm -.Op Fl d Ar level -.Op Fl f -.Op Fl r -.Sh DESCRIPTION -The -.Nm -utility is a HARP ATM daemon that performs the ILMI ATM address registration -procedures with an ATM network switch. -It is normally invoked at boot time -from the ATM startup script. -.Pp -For each ATM interface with a UNI signalling manager attached, -.Nm -will open an ILMI PVC (VPI = 0, VCI = 16) and register the interface's -ATM address with the switch. -As part of the address registration procedure, -the ATM switch will notify the endsystem (local host) of the -.Dq "network prefix" -portion of the endsystem's ATM address and -.Nm -will notify the switch of the endsystem's -.Dq "user part" -of its address -(typically the interface card MAC address). -.Sh OPTIONS -.Bl -tag -width indent -.It Fl d Ar level -Specify the debug level for optional protocol tracing. -Messages are -written to -.Pa /var/log/ilmid . -.It Fl f -Causes -.Nm -to run in the foreground. -.It Fl r -Causes -.Nm -to issue a coldStart TRAP on all ATM interfaces it is able to open and exit. -.El -.Sh NOTES -This daemon does not fully conform to the ATM Forum ILMI specifications. -In particular, it -does not make any queries of the network side to ensure -that the ATM Address table is empty. -It also does not implement any -of the ATM Forum MIB that is specified as part of ILMI. -.Pp -The -.Nm -utility will increment the debug level when it receives a -.Dv SIGUSR1 -signal and will -decrement the debug level when it receives a -.Dv SIGUSR2 -signal. -.Sh SEE ALSO -The ATM Forum, -.%T "ATM User-Network Interface, Version 3.1 (UNI 3.1) Specification" -for details on the ILMI protocols and address registration -procedures. -.Sh COPYRIGHT -Copyright (c) 1994-1998, Network Computing Services, Inc. -.Sh AUTHORS -.An John Cavanaugh , -Network Computing Services, Inc. -.An Mike Spengler , -Network Computing Services, Inc. -.An Joseph Thomas , -Network Computing Services, Inc. -.Sh ACKNOWLEDGMENTS -This software was developed with the support of the -Defense Advanced Research Projects Agency (DARPA). -.Sh BUGS -Please report any bugs to -.Aq harp\-bugs@magic.net . diff --git a/sbin/atm/ilmid/ilmid.c b/sbin/atm/ilmid/ilmid.c deleted file mode 100644 index 4a1e5ec..0000000 --- a/sbin/atm/ilmid/ilmid.c +++ /dev/null @@ -1,2725 +0,0 @@ -/* - * - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * User utilities - * -------------- - * - * Implement very minimal ILMI address registration. - * - * Implement very crude and basic support for "cracking" and - * "encoding" SNMP PDU's to support ILMI prefix and NSAP address - * registration. Code is not robust nor is it meant to provide any - * "real" SNMP support. Much of the code expects predetermined values - * and will fail if anything else is found. Much of the "encoding" is - * done with pre-computed PDU's. - * - * See "The Simple Book", Marshall T. Rose, particularly chapter 5, - * for ASN and BER information. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef lint -__RCSID("@(#) $FreeBSD$"); -#endif - - -#define MAX_LEN 9180 - -#define MAX_UNITS 8 - -/* - * Define some ASN types - */ -#define ASN_INTEGER 0x02 -#define ASN_OCTET 0x04 -#define ASN_NULL 0x05 -#define ASN_OBJID 0x06 -#define ASN_SEQUENCE 0x30 -#define ASN_IPADDR 0x40 -#define ASN_TIMESTAMP 0x43 - -static const char *Var_Types[] = { - "", - "", - "ASN_INTEGER", - "", - "ASN_OCTET", - "ASN_NULL", - "ASN_OBJID" -}; - -/* - * Define SNMP PDU types - */ -#define PDU_TYPE_GET 0xA0 -#define PDU_TYPE_GETNEXT 0xA1 -#define PDU_TYPE_GETRESP 0xA2 -#define PDU_TYPE_SET 0xA3 -#define PDU_TYPE_TRAP 0xA4 - -static const char *const PDU_Types[] = { - "GET REQUEST", - "GETNEXT REQUEST", - "GET RESPONSE", - "SET REQUEST", - "TRAP", - " ?? ", - " ??? " -}; - -/* - * Define TRAP codes - */ -#define TRAP_COLDSTART 0 -#define TRAP_WARMSTART 1 -#define TRAP_LINKDOWN 2 -#define TRAP_LINKUP 3 -#define TRAP_AUTHFAIL 4 -#define TRAP_EGPLOSS 5 -#define TRAP_ENTERPRISE 6 - -/* - * Define SNMP Version numbers - */ -#define SNMP_VERSION_1 1 -#define SNMP_VERSION_2 2 - -/* - * SNMP Error-status values - */ -#define SNMP_ERR_NOERROR 0 -#define SNMP_ERR_TOOBIG 1 -#define SNMP_ERR_NOSUCHNAME 2 -#define SNMP_ERR_BADVALUE 3 -#define SNMP_ERR_READONLY 4 -#define SNMP_ERR_GENERR 5 - -/* - * Max string length for Variable - */ -#define STRLEN 128 - -/* - * Unknown variable - */ -#define VAR_UNKNOWN -1 - -/* - * Define our internal representation of an OBJECT IDENTIFIER - */ -struct objid { - int oid[128]; -}; -typedef struct objid Objid; - -/* - * Define a Veriable classso that we can handle multiple GET/SET's - * per PDU. - */ -typedef struct variable Variable; -struct variable { - Objid oid; - int type; - union { - int ival; /* INTEGER/TIMESTAMP */ - Objid oval; /* OBJID */ - long aval; /* IPADDR */ - char sval[STRLEN]; /* OCTET */ - } var; - Variable *next; -}; - -/* - * Every SNMP PDU has the first four fields of this header. The only type - * which doesn't have the last three fields is the TRAP type. - */ -struct snmp_header { - int pdulen; - int version; - char community[64]; - int pdutype; - - /* GET/GETNEXT/GETRESP/SET */ - int reqid; - int error; - int erridx; - - /* TRAP */ - Objid enterprise; - int ipaddr; - int generic_trap; - int specific_trap; - - int varlen; - Variable *head, - *tail; -}; -typedef struct snmp_header Snmp_Header; - -Snmp_Header *ColdStart_Header; -Snmp_Header *PDU_Header; - -/* - * Define some OBJET IDENTIFIERS that we'll try to reply to: - * - * sysUpTime: number of time ticks since this deamon came up - * netpfx_oid: network prefix table - * unitype: is this a PRIVATE or PUBLIC network link - * univer: which version of UNI are we running - * devtype: is this a USER or NODE ATM device - * setprefix: used when the switch wants to tell us its NSAP prefix - * foresiggrp: FORE specific Objid we see alot of (being connected to FORE - * switches...) - */ -Objid Objids[] = { -#define SYS_OBJID 0 - {{ 8, 43, 6, 1, 2, 1, 1, 2, 0 }}, -#define UPTIME_OBJID 1 - {{ 8, 43, 6, 1, 2, 1, 1, 3, 0 }}, -#define PORT_OBJID 2 - {{ 12, 43, 6, 1, 4, 1, 353, 2, 1, 1, 1, 1, 0 }}, -#define IPNM_OBJID 3 - {{ 10, 43, 6, 1, 4, 1, 353, 2, 1, 2, 0 }}, -#define LAYER_OBJID 4 - {{ 12, 43, 6, 1, 4, 1, 353, 2, 2, 1, 1, 1, 0 }}, -#define MAXVCC_OBJID 5 - {{ 12, 43, 6, 1, 4, 1, 353, 2, 2, 1, 1, 3, 0 }}, -#define UNITYPE_OBJID 6 - {{ 12, 43, 6, 1, 4, 1, 353, 2, 2, 1, 1, 8, 0 }}, -#define UNIVER_OBJID 7 - {{ 12, 43, 6, 1, 4, 1, 353, 2, 2, 1, 1, 9, 0 }}, -#define DEVTYPE_OBJID 8 - {{ 12, 43, 6, 1, 4, 1, 353, 2, 2, 1, 1, 10, 0 }}, -#define ADDRESS_OBJID 9 - {{ 8, 43, 6, 1, 4, 1, 353, 2, 6 }}, -#define NETPFX_OBJID 10 - {{ 9, 43, 6, 1, 4, 1, 353, 2, 7, 1 }}, -#define MY_OBJID 11 - {{ 7, 43, 6, 1, 4, 1, 9999, 1 }}, -#define SETPFX_OBJID 12 /* ATM Forum says 1=valid, 2=invalid, not 0! */ - {{ 12, 43, 6, 1, 4, 1, 353, 2, 7, 1, 1, 3, 0 }}, -#define ENTERPRISE_OBJID 13 - {{ 8, 43, 6, 1, 4, 1, 3, 1, 1 }}, -#define ATMF_PORTID 14 - {{ 10, 43, 6, 1, 4, 1, 353, 2, 1, 4, 0 }}, -#define ATMF_SYSID 15 - {{ 12, 43, 6, 1, 4, 1, 353, 2, 1, 1, 1, 8, 0 }}, -#define MADGE_OBJECT1 16 /* I don't have a clue ... -RH */ - {{ 9, 43, 6, 1, 4, 1, 353, 2, 7, 99 }}, -}; - -#define NUM_OIDS (sizeof(Objids)/sizeof(Objid)) - -#define UNIVER_UNI20 1 -#define UNIVER_UNI30 2 -#define UNIVER_UNI31 3 -#define UNIVER_UNI40 4 -#define UNIVER_UNKNOWN 5 - -#define UNITYPE_PUBLIC 1 -#define UNITYPE_PRIVATE 2 - -#define DEVTYPE_USER 1 -#define DEVTYPE_NODE 2 - -/* For print_pdu() */ -#define PDU_SEND 1 -#define PDU_RECV 2 - -/* - * ILMI protocol states - */ -enum ilmi_states { - ILMI_UNKNOWN, /* Uninitialized */ - ILMI_COLDSTART, /* We need to send a COLD_START trap */ - ILMI_INIT, /* Ensure that switch has reset */ - ILMI_REG, /* Looking for SET message */ - ILMI_RUNNING /* Normal processing */ -}; - -static const char *ILMI_State[] = { - "UNKNOWN", - "COLDSTART", - "INIT", - "REG", - "RUNNING" -}; - -/* - * Our (incrementing) Request ID - */ -int Req_ID; - -/* - * Temporary buffer for building response packets. Should help ensure - * that we aren't accidently overwriting some other memory. - */ -u_char Resp_Buf[1024]; - -/* - * Copy the reponse into a buffer we can modify without - * changing the original... - */ -#define COPY_RESP(resp) \ - bcopy ( (resp), Resp_Buf, (resp)[0] + 1 ) - -int NUnits; - -/* - * fd for units which have seen a coldStart TRAP and are now exchaning SNMP requests - */ -int ilmi_fd[MAX_UNITS + 1]; -/* - * enum ilmi_states for this unit - */ -int ilmi_state[MAX_UNITS + 1]; -/* - * Local copy for HARP physical configuration information - */ -struct air_cfg_rsp Cfg[MAX_UNITS + 1]; -/* - * Local copy for HARP interface configuration information - */ -struct air_int_rsp Intf[MAX_UNITS + 1]; - -/* - * addressEntry table - */ -Objid addressEntry[MAX_UNITS + 1]; - -/* - * When this daemon started - */ -struct timeval starttime; - -int Debug_Level = 0; -int foregnd = 0; /* run in the foreground? */ - -char *progname; -char hostname[80]; - - /* File to write debug messages to */ -#define LOG_FILE "/var/log/ilmid" -FILE *Log; /* File descriptor for log messages */ - -static const char *Months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - -/* - * function declarations - */ -static void write_timestamp (void); -static void hexdump (FILE *, u_int8_t *, int, char *); -static int asn_get_pdu_len (u_char **, int *); -static int asn_get_encoded (u_char **, int *); -static int asn_get_int (u_char **, int *); -static void asn_set_int (u_char **, int); -static void print_objid (Objid *); -static void asn_get_objid (u_char **, Objid *, int *); -static int asn_put_objid (u_char **, Objid *); -static void asn_get_octet (u_char **, char *, int *); -static void print_header (Snmp_Header *); -static void parse_oids (Snmp_Header *, u_char **); -static int oid_cmp (Objid *, Objid *); -static int oid_ncmp (Objid *, Objid *, int); -static int find_var (Variable *); -static int get_ticks (void); -static void build_pdu (Snmp_Header *, int); -static void free_pdu (Snmp_Header *); -static void print_pdu (int, int, Snmp_Header *, int, u_char *); -static void send_resp (int, Snmp_Header *, u_char *); -static void init_ilmi (void); -static void ilmi_open (void); -static void get_local_ip (int, long *); -static void set_prefix (Objid *, Snmp_Header *, int); -static void set_address (Snmp_Header *, int); -static void process_get (Snmp_Header *, int); -static int lmi_object_find (Variable *); -static int lmi_rcvcmd_getnext(Snmp_Header *, int); -static int lmi_rcvcmd_trap (Snmp_Header *, int); -static void ilmi_do_state (void); -static void Increment_DL (int); -static void Decrement_DL (int); - -static Snmp_Header * asn_get_header (u_char **); -static Snmp_Header * build_cold_start (void); -static Snmp_Header * build_generic_header (void); - -/* - * Write a syslog() style timestamp - * - * Write a syslog() style timestamp with month, day, time and hostname - * to the log file. - * - * Arguments: - * none - * - * Returns: - * none - * - */ -static void -write_timestamp (void) -{ - time_t clk; - struct tm *tm; - - clk = time ( (time_t)NULL ); - tm = localtime ( &clk ); - - if ( Log && Debug_Level > 1 ) - if ( Log != stderr ) - fprintf ( Log, "%.3s %2d %.2d:%.2d:%.2d %s: ", - Months[tm->tm_mon], tm->tm_mday, tm->tm_hour, tm->tm_min, - tm->tm_sec, hostname ); - - return; - -} - -/* - * Utility to pretty print buffer as hex dumps - * - * Arguments: - * out - file handle - * ptr - buffer pointer - * len - length to pretty print - * desc - output header - * - * Returns: - * none - * - */ -static void -hexdump (out, ptr, len, desc) - FILE * out; - u_int8_t * ptr; - int len; - char * desc; -{ - char line[17]; - int i, j; - - if (out == NULL) - out = stdout; - - if (desc != NULL) - fprintf(out, "[ %s (%d bytes)]\n", desc, len); - - bzero(line, sizeof(line)); - - for (i = 0, j = 0; i < len; i++) { - - if (j == 0) fprintf(out, "%04x: ", i); - if (j == 8) fprintf(out, "| "); - - fprintf(out, "%02x ", ptr[i]); - line[j] = isalnum(ptr[i]) ? ptr[i] : '.' ; - if (j == 15) { - fprintf(out, " |%16s|\n", line); - bzero(line, sizeof(line)); - j = 0; - } else - j++; - } - - if (j != 0) { - if (j <= 8) fprintf(out, " "); - for (; j < 16; j++) fprintf(out, " "); - fprintf(out, " |%-16s|\n", line); - } - fflush(out); - - return; -} - -/* - * Get lengths from PDU encodings - * - * Lengths are sometimes encoded as a single byte if the length - * is less the 127 but are more commonly encoded as one byte with - * the high bit set and the lower seven bits indicating the nuber - * of bytes which make up the length value. Trailing data is (to my - * knowledge) not 7-bit encoded. - * - * Arguments: - * bufp - pointer to buffer pointer - * plen - pointer to PDU length or NULL if not a concern - * - * Returns: - * bufp - updated buffer pointer - * plen - (possibly) adjusted pdu length - * - decoded length - * - */ -static int -asn_get_pdu_len (u_char **bufp, int *plen) -{ - u_char *bp = *bufp; - int len = 0; - int i, b; - - b = *bp++; - if ( plen ) - (*plen)--; - if ( b & 0x80 ) { - for ( i = 0; i < (b & ~0x80); i++ ) { - len = len * 256 + *bp++; - if ( plen ) - (*plen)--; - } - } else - len = b; - - *bufp = bp; - return ( len ); -} - -/* - * Get an 7-bit encoded value. - * - * Get a value which is represented using a 7-bit encoding. The last - * byte in the stream has the high-bit clear. - * - * Arguments: - * bufp - pointer to the buffer pointer - * len - pointer to the buffer length - * - * Returns: - * bufp - updated buffer pointer - * len - updated buffer length - * - value encoding represented - * - */ -static int -asn_get_encoded (u_char **bufp, int *len) -{ - u_char *bp = *bufp; - int val = 0; - int l = *len; - - /* - * Keep going while high bit is set - */ - do { - /* - * Each byte can represent 7 bits - */ - val = ( val << 7 ) + ( *bp & ~0x80 ); - l--; - } while ( *bp++ & 0x80 ); - - *bufp = bp; /* update buffer pointer */ - *len = l; /* update buffer length */ - - return ( val ); -} - -/* - * Get a BER encoded integer - * - * Intergers are encoded as one byte length followed by data bytes - * - * Arguments: - * bufp - pointer to the buffer pointer - * plen - pointer to PDU length or NULL if not a concern - * - * Returns: - * bufp - updated buffer pointer - * plen - (possibly) updated PDU length - * - value of encoded integer - * - */ -static int -asn_get_int (u_char **bufp, int *plen) -{ - int i; - int len; - int v = 0; - u_char *bp = *bufp; - - len = *bp++; - if ( plen ) - (*plen)--; - for ( i = 0; i < len; i++ ) { - v = (v * 256) + *bp++; - if ( plen ) - (*plen)--; - } - *bufp = bp; - return ( v ); -} - -/* - * Set a BER encoded integer - * - * Arguments: - * bufp - pointer to buffer pointer where we are to set int in - * val - integer value to set - * - * Returns: - * none - * - updated buffer pointer - * - */ -static void -asn_set_int (u_char **bufp, int val) -{ - union { - int i; - u_char c[4]; - } u; - int len = sizeof(int); - size_t i = 0; - u_char *bp = *bufp; - - /* Check for special case where val == 0 */ - if ( val == 0 ) { - *bp++ = 1; - *bp++ = 0; - *bufp = bp; - return; - } - - u.i = htonl ( val ); - - while ( u.c[i] == 0 && i++ < sizeof(int) ) - len--; - - if ( u.c[i] > 0x7f ) { - i--; - len++; - } - - *bp++ = len; - bcopy ( (caddr_t)&u.c[sizeof(int)-len], bp, len ); - bp += len; - *bufp = bp; - - return; -} - -/* - * Utility to print an object identifier. - * - * Arguments: - * objid - pointer to objid representation - * - * Returns: - * none - * - */ -static void -print_objid (Objid *objid) -{ - int i; - - /* - * First oid coded as 40 * X + Y - */ - if ( Log ) { - write_timestamp(); - fprintf ( Log, ".%d.%d", objid->oid[1] / 40, - objid->oid[1] % 40 ); - } - for ( i = 2; i <= objid->oid[0]; i++ ) - if ( Log ) - fprintf ( Log, ".%d", objid->oid[i] ); - if ( Log ) - fprintf ( Log, "\n" ); - - return; -} - -/* - * Get Object Identifier - * - * Arguments: - * bufp - pointer to buffer pointer - * objid - pointer to objid buffer - * plen - pointer to PDU length or NULL of not a concern - * - * Returns: - * bufp - updated buffer pointer - * objid - internal representation of encoded objid - * plen - (possibly) adjusted PDU length - * - */ -static void -asn_get_objid (u_char **bufp, Objid *objid, int *plen) -{ - int len; - u_char *bp = *bufp; - int *ip = (int *)objid + 1; /* First byte will contain length */ - int oidlen = 0; - - len = *bp++; - if ( plen ) - (*plen)--; - while ( len ) { - *ip++ = asn_get_encoded ( &bp, &len ); - if ( plen ) - (*plen)--; - oidlen++; - } - objid->oid[0] = oidlen; - *bufp = bp; - - return; -} - -/* - * Put OBJID - assumes elements <= 16383 for two byte coding - * - */ -static int -asn_put_objid (u_char **bufp, Objid *objid) -{ - int len = 0; - u_char *bp = *bufp; - u_char *cpp; - int i; - - cpp = bp; - *bp++ = objid->oid[0]; - len++; - for ( i = 1; i <= objid->oid[0]; i++ ) { - u_int c = objid->oid[i]; - - while ( c > 127 ) { - *bp++ = ( ( c >> 7 ) & 0x7f ) | 0x80; - len++; - c &= 0x7f; /* XXX - assumption of two bytes */ - (*cpp)++; - } - *bp++ = c; - len++; - } - - *bufp = bp; - return ( len ); - -} - -/* - * Get OCTET STRING - * - * Octet strings are encoded as a 7-bit encoded length followed by - * data bytes; - * - * Arguments: - * bufp - pointer to buffer pointer - * octet - pointer to octet buffer - * plen - pointer to PDU length - * - * Returns: - * bufp - updated buffer pointer - * octet - encoded Octet String - * plen - (possibly) adjusted PDU length - * - */ -static void -asn_get_octet (u_char **bufp, char *octet, int *plen) -{ - u_char *bp = *bufp; - int i = 0; - int len = 0; - - /* - * &i is really a dummy value here as we don't keep track - * of the ongoing buffer length - */ - len = asn_get_encoded ( &bp, &i ); - - for ( i = 0; i < len; i++ ) { - *octet++ = *bp++; - if ( plen ) - (*plen)--; - } - - *bufp = bp; - - return; - -} - -/* - * Utility to print SNMP PDU header information - * - * Arguments: - * Hdr - pointer to internal SNMP header structure - * - * Returns: - * none - * - */ -static void -print_header (Snmp_Header *Hdr) -{ - Variable *var; - - if ( Log ) { - write_timestamp(); - fprintf(Log, - " PDU Type: 0x%x (%s)\n" - " PDU len: %d\n" - " Version: %d\n" - " Community: \"%s\"\n", - Hdr->pdutype, PDU_Types[Hdr->pdutype & 7], - Hdr->pdulen, - Hdr->version + 1, - Hdr->community); - - if (Hdr->pdutype != PDU_TYPE_TRAP) { - write_timestamp(); - fprintf(Log, - " Req Id: 0x%x\n" - " Error: %d\n" - " Error Index: %d\n", - Hdr->reqid, - Hdr->error, - Hdr->erridx); - } - } - - var = Hdr->head; - while ( var ) { - if ( Log ) { - write_timestamp(); - fprintf ( Log, "Variable Type: %d", var->type ); - if ( Var_Types[var->type] ) - fprintf ( Log, " (%s)", Var_Types[var->type] ); - fprintf ( Log, "\n Object: "); - print_objid ( &var->oid ); - fprintf ( Log, " Value: "); - switch ( var->type ) { - case ASN_INTEGER: - fprintf ( Log, "%d (0x%x)\n", var->var.ival, var->var.ival ); - break; - case ASN_NULL: - fprintf ( Log, "NULL" ); - break; - default: - fprintf ( Log, "[0x%x]", var->type ); - break; - } - fprintf ( Log, "\n" ); - } - var = var->next; - } - - return; - -} - -/* - * Pull OID's from GET/SET message - * - * Arguments: - * h - pointer to Snmp_Header - * bp - pointer to input PDU - * - * Returns: - * none - * - */ -static void -parse_oids (Snmp_Header *h, u_char **bp) -{ - int len = h->varlen; - int sublen; - Variable *var; - u_char *bufp = *bp; - - while ( len > 0 ) { - if ( *bufp++ == ASN_SEQUENCE ) { - len--; - - /* Create new Variable instance */ - if ( ( var = (Variable *)malloc(sizeof(Variable)) ) == NULL ) - { - *bp = bufp; - return; - } - bzero(var, sizeof(Variable)); - /* Link to tail */ - if ( h->tail ) - h->tail->next = var; - /* Set head iff NULL */ - if ( h->head == NULL ) { - h->head = var; - } - /* Adjust tail */ - h->tail = var; - - /* Get length of variable sequence */ - sublen = asn_get_pdu_len ( &bufp, &len ); - /* Should be OBJID type */ - if ( *bufp++ != ASN_OBJID ) { - *bp = bufp; - return; - } - asn_get_objid ( (u_char **)&bufp, &var->oid, &len ); - var->type = *bufp++; - len--; - switch ( var->type ) { - case ASN_INTEGER: - var->var.ival = asn_get_int ( &bufp, &len ); - break; - case ASN_NULL: - bufp++; - len--; - break; - case ASN_OBJID: - asn_get_objid ( &bufp, &var->var.oval, &len ); - break; - case ASN_OCTET: - asn_get_octet ( &bufp, var->var.sval, &len ); - break; - default: - if ( Log ) { - write_timestamp(); - fprintf ( Log, "Unknown variable type: %d\n", - var->type ); - } - break; - } - var->next = NULL; - } else - break; - } - - *bp = bufp; - return; -} - -/* - * Crack the SNMP header - * - * Pull the PDU length, SNMP version, SNMP community and PDU type. - * If present, also pull out the Request ID, Error status, and Error - * index values. - * - * Arguments: - * bufp - pointer to buffer pointer - * - * Returns: - * bufp - updated buffer pointer - * - generated SNMP header - * - */ -static Snmp_Header * -asn_get_header (u_char **bufp) -{ - Snmp_Header *h; - u_char *bp = *bufp; - int len = 0; - int dummy = 0; - - /* - * Allocate memory to hold the SNMP header - */ - if ( ( h = (Snmp_Header *)malloc(sizeof(Snmp_Header)) ) == NULL ) - return ( (Snmp_Header *)NULL ); - - /* - * Ensure that we wipe the slate clean - */ - bzero(h, sizeof(Snmp_Header)); - - /* - * PDU has to start as SEQUENCE OF - */ - if ( *bp++ != ASN_SEQUENCE ) /* Class == Universial, f == 1, tag == SEQUENCE */ - return ( (Snmp_Header *)NULL ); - - /* - * Get the length of remaining PDU data - */ - h->pdulen = asn_get_pdu_len ( &bp, NULL ); - - /* - * We expect to find an integer encoding Version-1 - */ - if ( *bp++ != ASN_INTEGER ) { - return ( (Snmp_Header *)NULL ); - } - h->version = asn_get_int ( &bp, NULL ); - - /* - * After the version, we need the community name - */ - if ( *bp++ != ASN_OCTET ) { - return ( (Snmp_Header *)NULL ); - } - asn_get_octet ( &bp, h->community, NULL ); - - /* - * Single byte PDU type - */ - h->pdutype = *bp++; - - /* - * If this isn't a TRAP PDU, then look for the rest of the header - */ - if ( h->pdutype != PDU_TYPE_TRAP ) { /* TRAP uses different format */ - - (void) asn_get_pdu_len ( &bp, &dummy ); - - /* Request ID */ - if ( *bp++ != ASN_INTEGER ) { - free( h ); - return ( (Snmp_Header *)NULL ); - } - h->reqid = asn_get_int ( &bp, NULL ); - - /* Error Status */ - if ( *bp++ != ASN_INTEGER ) { - free ( h ); - return ( (Snmp_Header *)NULL ); - } - h->error = asn_get_int ( &bp, NULL ); - - /* Error Index */ - if ( *bp++ != ASN_INTEGER ) { - free ( h ); - return ( (Snmp_Header *)NULL ); - } - h->erridx = asn_get_int ( &bp, NULL ); - - /* Sequence of... */ - if ( *bp++ != ASN_SEQUENCE ) { - free ( h ); - return ( (Snmp_Header *)NULL ); - } - h->varlen = ( asn_get_pdu_len ( &bp, &len ) - 1 ); - h->varlen += ( len - 1 ); - - parse_oids ( h, &bp ); - } - - *bufp = bp; - - return ( h ); - -} - -/* - * Compare two internal OID representations - * - * Arguments: - * oid1 - Internal Object Identifier - * oid2 - Internal Object Identifier - * - * Returns: - * 0 - Objid's match - * 1 - Objid's don't match - * - */ -static int -oid_cmp (Objid *oid1, Objid *oid2) -{ - int i; - int len; - - /* - * Compare lengths - */ - if ( !(oid1->oid[0] == oid2->oid[0] ) ) - /* Different lengths */ - return ( 1 ); - - len = oid1->oid[0]; - - /* - * value by value compare - */ - for ( i = 1; i <= len; i++ ) { - if ( !(oid1->oid[i] == oid2->oid[i]) ) - /* values don't match */ - return ( 1 ); - } - - /* Objid's are identical */ - return ( 0 ); -} - -/* - * Compare two internal OID representations - * - * Arguments: - * oid1 - Internal Object Identifier - * oid2 - Internal Object Identifier - * len - Length of OID to compare - * - * Returns: - * 0 - Objid's match - * 1 - Objid's don't match - * - */ -static int -oid_ncmp (Objid *oid1, Objid *oid2, int len) -{ - int i; - - /* - * value by value compare - */ - for ( i = 1; i <= len; i++ ) { - if ( !(oid1->oid[i] == oid2->oid[i]) ) - /* values don't match */ - return ( 1 ); - } - - /* Objid's are identical */ - return ( 0 ); -} - -/* - * Find the index of an OBJID which matches this Variable instance. - * - * Arguments: - * var - pointer to Variable instance - * - * Returns: - * idx - index of matched Variable instance - * -1 - no matching Variable found - * - */ -static int -find_var (Variable *var) -{ - size_t i; - - for ( i = 0; i < NUM_OIDS; i++ ) - if ( oid_cmp ( &var->oid, &Objids[i] ) == 0 ) { - return ( i ); - } - - return ( -1 ); - -} - -/* - * Return the time process has been running as a number of ticks - * - * Arguments: - * none - * - * Returns: - * number of ticks - * - */ -static int -get_ticks (void) -{ - struct timeval timenow; - struct timeval timediff; - - (void) gettimeofday ( &timenow, NULL ); - /* - * Adjust for subtraction - */ - timenow.tv_sec--; - timenow.tv_usec += 1000000; - - /* - * Compute time since 'starttime' - */ - timediff.tv_sec = timenow.tv_sec - starttime.tv_sec; - timediff.tv_usec = timenow.tv_usec - starttime.tv_usec; - - /* - * Adjust difference timeval - */ - if ( timediff.tv_usec >= 1000000 ) { - timediff.tv_usec -= 1000000; - timediff.tv_sec++; - } - - /* - * Compute number of ticks - */ - return ( ( timediff.tv_sec * 100 ) + ( timediff.tv_usec / 10000 ) ); - -} - -/* - * Build a response PDU - * - * Arguments: - * hdr - pointer to PDU Header with completed Variable list - * - * Returns: - * none - * - */ -static void -build_pdu (Snmp_Header *hdr, int type) -{ - u_char *bp = Resp_Buf; - u_char *vpp; - u_char *ppp; - int erridx = 0; - int varidx = 1; - int varlen = 0; - int pdulen = 0; - int traplen = 0; - Variable *var; - - /* - * Clear out the reply - */ - bzero ( Resp_Buf, sizeof(Resp_Buf) ); - - /* [0] is reserved for overall length */ - bp++; - - /* Start with SEQUENCE OF */ - *bp++ = ASN_SEQUENCE; - /* - assume we can code length in two octets */ - *bp++ = 0x82; - bp++; - bp++; - /* Version */ - *bp++ = ASN_INTEGER; - asn_set_int ( &bp, hdr->version ); - /* Community name */ - *bp++ = ASN_OCTET; - *bp++ = strlen ( hdr->community ); - bcopy ( hdr->community, bp, strlen ( hdr->community ) ); - bp += strlen ( hdr->community ); - /* PDU Type */ - *bp++ = type; - ppp = bp; - /* Length of OID data - assume it'll fit in one octet */ - bp++; - - if ( type != PDU_TYPE_TRAP ) { - /* Sequence ID */ - *bp++ = ASN_INTEGER; - asn_set_int ( &bp, hdr->reqid ); - /* - * Check to see if all the vaiables were resolved - we do this - * by looking for something which still has an ASN_NULL value. - */ - var = hdr->head; - if ( type == PDU_TYPE_GETRESP ) { - while ( var && erridx == 0 ) { - if ( var->type != ASN_NULL ) { - varidx++; - var = var->next; - } else - erridx = varidx; - } - } - - /* Error status */ - *bp++ = ASN_INTEGER; - *bp++ = 0x01; /* length = 1 */ - if ( erridx ) - *bp++ = SNMP_ERR_NOSUCHNAME; - else - *bp++ = SNMP_ERR_NOERROR; - /* Error Index */ - *bp++ = ASN_INTEGER; - *bp++ = 0x01; /* length = 1 */ - *bp++ = erridx; /* index == 0 if no error */ - } else { - /* type == PDU_TYPE_TRAP */ - - /* Fill in ENTERPRISE OBJID */ - *bp++ = ASN_OBJID; - (void) asn_put_objid ( &bp, &hdr->enterprise ); - - /* Fill in IP address */ - *bp++ = ASN_IPADDR; - *bp++ = sizeof ( hdr->ipaddr ); - bcopy ( (caddr_t)&hdr->ipaddr, bp, sizeof(hdr->ipaddr) ); - bp += sizeof(hdr->ipaddr); - - /* Fill in generic and specific trap types */ - *bp++ = ASN_INTEGER; - asn_set_int ( &bp, hdr->generic_trap ); - *bp++ = ASN_INTEGER; - asn_set_int ( &bp, hdr->specific_trap ); - - /* Fill in time-stamp - assume 0 for now */ - *bp++ = ASN_TIMESTAMP; - asn_set_int ( &bp, 0 ); - - /* encoded length */ - traplen = ( bp - ppp - 1 ); - - /* Continue with variable processing */ - } - - /* SEQUENCE OF */ - *bp++ = ASN_SEQUENCE; - *bp++ = 0x82; - /* - assume we can code length in two octets */ - vpp = bp; - varlen = 0; - bp++; - bp++; - - /* Install Variables */ - var = hdr->head; - varidx = 1; - while ( var ) { - u_char *bpp; - int len = 0; - - /* SEQUENCE OF */ - *bp++ = ASN_SEQUENCE; - *bp++ = 0x82; - /* - assume we can code length in two octets */ - bpp = bp; - bp++; - bp++; - /* OBJID */ - *bp++ = ASN_OBJID; - len++; - - len += asn_put_objid ( &bp, &var->oid ); - - if ( erridx && varidx >= erridx ) { - /* Code this variable as NULL */ - *bp++ = ASN_NULL; - len++; - bp++; - len++; - } else { - u_char *lpp; - /* Variable type */ - *bp++ = var->type; - len++; - lpp = bp; - switch ( var->type ) { - case ASN_INTEGER: - asn_set_int ( &bp, var->var.ival ); - len += ( *lpp + 1 ); - break; - case ASN_OCTET: - *bp++ = var->var.sval[0]; - len++; - bcopy ( (caddr_t)&var->var.sval[1], - bp, var->var.sval[0] ); - len += var->var.sval[0]; - bp += var->var.sval[0]; - break; - case ASN_NULL: - *bp++ = 0x00; - len++; - break; - case ASN_OBJID: - len += asn_put_objid ( &bp, &var->var.oval ); - break; - case ASN_SEQUENCE: - break; - case ASN_IPADDR: - *bp++ = 4; - len++; - bcopy ( (caddr_t)&var->var.aval, bp, 4 ); - len += 4; - bp += 4; - break; - case ASN_TIMESTAMP: - asn_set_int ( &bp, var->var.ival ); - len += ( *lpp + 1 ); - break; - default: - break; - } - } - - /* Accumulate total Variable sequence length */ - varlen += (len + 4); - - /* Fill in length of this sequence */ - bpp[1] = len & 0xff; - bpp[0] = len >> 8; - - var = var->next; - } - - - /* Fill in length of Variable sequence */ - vpp[1] = varlen & 0xff; - vpp[0] = varlen >> 8; - - if ( type != PDU_TYPE_TRAP ) { - /* Fill in length of data AFTER PDU type */ - *ppp = varlen + 12 + ppp[2]; /* + length of reqid */ - } else { - /* Fill in length of data AFTER PDU type */ - *ppp = varlen + traplen + 4; /* + length of initial sequence of */ - } - - /* Fill in overall sequence length */ - pdulen = *ppp + 7 + strlen ( hdr->community ); - Resp_Buf[4] = pdulen & 0x7f; - Resp_Buf[3] = pdulen >> 8; - - pdulen = bp - Resp_Buf - 1; - - Resp_Buf[0] = pdulen; - - hdr->pdutype = type; - hdr->pdulen = pdulen; - - return; -} - -static void -free_pdu (Snmp_Header *hdr) -{ - Variable *var; - - while ( hdr->head ) { - var = hdr->head->next; /* Save next link */ - free ( hdr->head ); /* Free current var */ - hdr->head = var; /* Set head to next link */ - } - - free ( hdr ); /* Free fixed portion */ -} - -static void -print_pdu (int dir, int intf, Snmp_Header *Hdr, int len, u_char *buf) -{ - const char * pdu_dir; - const char * pdu_type; - int pdu_num; - - write_timestamp(); - - switch (dir) { - case PDU_SEND: - pdu_dir = "SEND"; - break; - case PDU_RECV: - pdu_dir = "RECV"; - break; - default: - pdu_dir = "undefined"; - break; - } - - if (Hdr == NULL) { - pdu_type = "unknown"; - pdu_num = 0; - } else { - pdu_type = PDU_Types[Hdr->pdutype & 7]; - pdu_num = Hdr->pdutype; - } - - fprintf(Log, - "%s: %s(%d), ILMI %s(%d), PDU Type %s(0x%x) %d/%d bytes.\n", - pdu_dir, - Intf[intf].anp_intf, ilmi_fd[intf], - ILMI_State[intf], ilmi_state[intf], - pdu_type, pdu_num, - len, buf[0]); - - if (Hdr == NULL) - fprintf(Log, "Header seems to be invalid.\n"); - else - print_header(Hdr); - - hexdump(Log, (u_char *)&buf[1], len, NULL); - - return; -} - -/* - * Send a generic response packet - * - * Arguments: - * sd - socket to send the reply on - * reqid - original request ID from GET PDU - * resp - pointer to the response to send - * - * Returns: - * none - response sent - * - */ -static void -send_resp (int intf, Snmp_Header *Hdr, u_char *resp) -{ - int n; - - if ( ilmi_fd[intf] > 0 ) { - n = write ( ilmi_fd[intf], (caddr_t)&resp[1], resp[0] ); - if ( Log && Debug_Level > 1 ) { - print_pdu(PDU_SEND, intf, Hdr, n, resp); - } - } - - free_pdu ( Hdr ); - return; -} - -/* - * Build a COLD_START TRAP PDU - * - */ -static Snmp_Header * -build_cold_start (void) -{ - Snmp_Header *hdr; - Variable *var; - - hdr = (Snmp_Header *)malloc(sizeof(Snmp_Header)); - if (hdr == NULL) { - fprintf(stderr, "malloc() failed in %s()\n", __func__); - exit(1); - } - bzero(hdr, sizeof(Snmp_Header)); - - hdr->pdulen = 0; - hdr->version = SNMP_VERSION_1 - 1; - snprintf ( hdr->community, sizeof(hdr->community), "ILMI" ); - - hdr->ipaddr = 0x0; /* 0.0.0.0 */ - hdr->generic_trap = TRAP_COLDSTART; - hdr->specific_trap = 0; - bcopy ( (caddr_t)&Objids[ENTERPRISE_OBJID], (caddr_t)&hdr->enterprise, - sizeof(Objid) ); - - hdr->head = (Variable *)malloc(sizeof(Variable)); - if (hdr == NULL) { - fprintf(stderr, "malloc() failed in %s()\n", __func__); - exit(1); - } - bzero(hdr->head, sizeof(Variable)); - - var = hdr->head; - bcopy ( (caddr_t)&Objids[UPTIME_OBJID], (caddr_t)&var->oid, - sizeof(Objid) ); - var->type = ASN_NULL; - - return ( hdr ); -} - -/* - * Build a Generic PDU Header - * - */ -static Snmp_Header * -build_generic_header (void) -{ - Snmp_Header *hdr; - - hdr = (Snmp_Header *)malloc(sizeof(Snmp_Header)); - if (hdr == NULL) { - fprintf(stderr, "malloc() failed in %s()\n", __func__); - exit(1); - } - bzero(hdr, sizeof(Snmp_Header)); - - hdr->pdulen = 0; - hdr->version = SNMP_VERSION_1 - 1; - snprintf ( hdr->community, sizeof(hdr->community), "ILMI" ); - - return ( hdr ); -} - -/* - * Initialize information on what physical adapters HARP knows about - * - * Query the HARP subsystem about configuration and physical interface - * information for any currently registered ATM adapters. Store the information - * as arrays for easier indexing by SNMP port/index numbers. - * - * Arguments: - * none - * - * Returns: - * none Information from HARP available - * - */ -static void -init_ilmi (void) -{ - struct air_cfg_rsp *cfg_info = NULL; - struct air_int_rsp *intf_info = NULL; - int buf_len; - - /* - * Get configuration info - what's available with 'atm sh config' - */ - buf_len = get_cfg_info ( NULL, &cfg_info ); - /* - * If error occurred, clear out everything - */ - if ( buf_len <= 0 ) { - bzero ( Cfg, sizeof(Cfg) ); - bzero( Intf, sizeof(Intf) ); - NUnits = 0; - return; - } - - /* - * Move to local storage - */ - bcopy ( cfg_info, (caddr_t)Cfg, buf_len ); - /* - * Compute how many units information was returned for - */ - NUnits = buf_len / sizeof(struct air_cfg_rsp); - /* Housecleaning */ - free ( cfg_info ); - cfg_info = NULL; - /* - * Get the per interface information - */ - buf_len = get_intf_info ( NULL, &intf_info ); - /* - * If error occurred, clear out Intf info - */ - if ( buf_len <= 0 ) { - bzero ( Intf, sizeof(Intf) ); - return; - } - - /* - * Move to local storage - */ - bcopy ( intf_info, (caddr_t)Intf, buf_len ); - /* Housecleaning */ - free ( intf_info ); - intf_info = NULL; - - return; - -} - -/* - * Open a new SNMP session for ILMI - * - * Start by updating interface information, in particular, how many - * interfaces are in the system. While we'll try to open sessons on - * all interfaces, this deamon currently can only handle the first - * interface. - * - * Arguments: - * none - * - * Returns: - * none - * - */ -static void -ilmi_open (void) -{ - struct sockaddr_atm satm; - struct t_atm_aal5 aal5; - struct t_atm_traffic traffic; - struct t_atm_bearer bearer; - struct t_atm_qos qos; - struct t_atm_app_name appname; - Atm_addr subaddr; - char nifname[IFNAMSIZ]; - int optlen; - int unit = 0; - u_char sig_proto; - - init_ilmi(); - - for ( unit = 0; unit < NUnits; unit++ ) { - - /* - * ILMI only makes sense for UNI signalling protocols - */ - sig_proto = Intf[unit].anp_sig_proto; - if ( sig_proto != ATM_SIG_UNI30 && sig_proto != ATM_SIG_UNI31 && - sig_proto != ATM_SIG_UNI40 ) - continue; - - if ( ilmi_fd[unit] == -1 ) { - - ilmi_fd[unit] = socket ( AF_ATM, SOCK_SEQPACKET, ATM_PROTO_AAL5 ); - - if ( ilmi_fd[unit] < 0 ) { - perror ( "open" ); - continue; - } - - /* - * Set interface name. For now, we must have a netif to go on... - */ - if ( Intf[unit].anp_nif_cnt == 0 ) { - if ( Debug_Level > 1 && Log ) { - write_timestamp(); - fprintf ( Log, "No nif on unit %d\n", unit ); - } - close ( ilmi_fd[unit] ); - ilmi_fd[unit] = -1; - continue; - } - sprintf ( nifname, "%s0", Intf[unit].anp_nif_pref ); - optlen = sizeof ( nifname ); - if ( setsockopt ( ilmi_fd[unit], T_ATM_SIGNALING, - T_ATM_NET_INTF, (caddr_t)nifname, optlen ) < 0 ) { - perror ( "setsockopt" ); - if ( Log ) { - write_timestamp(); - fprintf ( Log, - "Couldn't set interface name \"%s\"\n", - nifname ); - } - if ( Debug_Level > 1 && Log ) { - write_timestamp(); - fprintf ( Log, "nifname: closing unit %d\n", unit ); - } - close ( ilmi_fd[unit] ); - ilmi_fd[unit] = -1; - continue; - } - - /* - * Set up destination SAP - */ - bzero ( (caddr_t) &satm, sizeof(satm) ); - satm.satm_family = AF_ATM; -#if (defined(BSD) && (BSD >= 199103)) - satm.satm_len = sizeof(satm); -#endif - - satm.satm_addr.t_atm_sap_addr.SVE_tag_addr = T_ATM_PRESENT; - satm.satm_addr.t_atm_sap_addr.SVE_tag_selector = T_ATM_ABSENT; - satm.satm_addr.t_atm_sap_addr.address_format = T_ATM_PVC_ADDR; - satm.satm_addr.t_atm_sap_addr.address_length = sizeof(Atm_addr_pvc); - ATM_PVC_SET_VPI((Atm_addr_pvc *)satm.satm_addr.t_atm_sap_addr.address, - 0 ); - ATM_PVC_SET_VCI((Atm_addr_pvc *)satm.satm_addr.t_atm_sap_addr.address, - 16 ); - - satm.satm_addr.t_atm_sap_layer2.SVE_tag = T_ATM_PRESENT; - satm.satm_addr.t_atm_sap_layer2.ID_type = T_ATM_SIMPLE_ID; - satm.satm_addr.t_atm_sap_layer2.ID.simple_ID = T_ATM_BLLI2_I8802; - - satm.satm_addr.t_atm_sap_layer3.SVE_tag = T_ATM_ABSENT; - - satm.satm_addr.t_atm_sap_appl.SVE_tag = T_ATM_ABSENT; - - /* - * Set up connection parameters - */ - aal5.forward_max_SDU_size = MAX_LEN; - aal5.backward_max_SDU_size = MAX_LEN; - aal5.SSCS_type = T_ATM_NULL; - optlen = sizeof(aal5); - if ( setsockopt ( ilmi_fd[unit], T_ATM_SIGNALING, T_ATM_AAL5, - (caddr_t) &aal5, optlen ) < 0 ) { - perror ( "setsockopt(aal5)" ); - if ( Debug_Level > 1 && Log ) { - write_timestamp(); - fprintf ( Log, "aal5: closing unit %d\n", unit ); - } - close ( ilmi_fd[unit] ); - ilmi_fd[unit] = -1; - continue; - } - - traffic.forward.PCR_high_priority = T_ATM_ABSENT; - traffic.forward.PCR_all_traffic = 100000; - traffic.forward.SCR_high_priority = T_ATM_ABSENT; - traffic.forward.SCR_all_traffic = T_ATM_ABSENT; - traffic.forward.MBS_high_priority = T_ATM_ABSENT; - traffic.forward.MBS_all_traffic = T_ATM_ABSENT; - traffic.forward.tagging = T_NO; - traffic.backward.PCR_high_priority = T_ATM_ABSENT; - traffic.backward.PCR_all_traffic = 100000; - traffic.backward.SCR_high_priority = T_ATM_ABSENT; - traffic.backward.SCR_all_traffic = T_ATM_ABSENT; - traffic.backward.MBS_high_priority = T_ATM_ABSENT; - traffic.backward.MBS_all_traffic = T_ATM_ABSENT; - traffic.backward.tagging = T_NO; - traffic.best_effort = T_YES; - optlen = sizeof(traffic); - if (setsockopt(ilmi_fd[unit], T_ATM_SIGNALING, T_ATM_TRAFFIC, - (caddr_t)&traffic, optlen) < 0) { - perror("setsockopt(traffic)"); - } - bearer.bearer_class = T_ATM_CLASS_X; - bearer.traffic_type = T_ATM_NULL; - bearer.timing_requirements = T_ATM_NULL; - bearer.clipping_susceptibility = T_NO; - bearer.connection_configuration = T_ATM_1_TO_1; - optlen = sizeof(bearer); - if (setsockopt(ilmi_fd[unit], T_ATM_SIGNALING, T_ATM_BEARER_CAP, - (caddr_t)&bearer, optlen) < 0) { - perror("setsockopt(bearer)"); - } - - qos.coding_standard = T_ATM_NETWORK_CODING; - qos.forward.qos_class = T_ATM_QOS_CLASS_0; - qos.backward.qos_class = T_ATM_QOS_CLASS_0; - optlen = sizeof(qos); - if (setsockopt(ilmi_fd[unit], T_ATM_SIGNALING, T_ATM_QOS, (caddr_t)&qos, - optlen) < 0) { - perror("setsockopt(qos)"); - } - - subaddr.address_format = T_ATM_ABSENT; - subaddr.address_length = 0; - optlen = sizeof(subaddr); - if (setsockopt(ilmi_fd[unit], T_ATM_SIGNALING, T_ATM_DEST_SUB, - (caddr_t)&subaddr, optlen) < 0) { - perror("setsockopt(dest_sub)"); - } - - strncpy(appname.app_name, "ILMI", T_ATM_APP_NAME_LEN); - optlen = sizeof(appname); - if (setsockopt(ilmi_fd[unit], T_ATM_SIGNALING, T_ATM_APP_NAME, - (caddr_t)&appname, optlen) < 0) { - perror("setsockopt(appname)"); - } - - /* - * Now try to connect to destination - */ - if ( connect ( ilmi_fd[unit], (struct sockaddr *) &satm, - sizeof(satm)) < 0 ) { - perror ( "connect" ); - if ( Debug_Level > 1 && Log ) { - write_timestamp(); - fprintf ( Log, "connect: closing unit %d\n", unit ); - } - close ( ilmi_fd[unit] ); - ilmi_fd[unit] = -1; - continue; - } - - if ( Debug_Level && Log ) { - write_timestamp(); - fprintf ( Log, "***** opened unit %d\n", unit ); - } - - ilmi_state[unit] = ILMI_COLDSTART; - - } - - } - - return; - -} - -/* - * Get our local IP address for this interface - * - * Arguments: - * s - socket to find address for - * aval - pointer to variable to store address in - * - * Returns: - * none - * - */ -static void -get_local_ip (int s, long *aval) -{ - char intf_name[IFNAMSIZ]; - socklen_t namelen = IFNAMSIZ; - struct air_netif_rsp *net_info = NULL; - struct sockaddr_in *sain; - - /* - * Get physical interface name - */ - if ( getsockopt ( s, T_ATM_SIGNALING, T_ATM_NET_INTF, - (caddr_t) intf_name, &namelen ) ) - return; - - /* - * Get network interface information for this physical interface - */ - get_netif_info ( intf_name, &net_info ); - if ( net_info == NULL ) - return; - - sain = (struct sockaddr_in *)(void *)&net_info->anp_proto_addr; - - /* - * Fill in answer - */ - bcopy ( (caddr_t)&sain->sin_addr.s_addr, aval, 4 ); - - free ( net_info ); - - return; - -} - -/* - * Set local NSAP prefix and then reply with our full NSAP address. - * - * Switch will send a SET message with the NSAP prefix after a coldStart. - * We'll set that prefix into HARP and then send a SET message of our own - * with our full interface NSAP address. - * - * Arguments: - * oid - objid from SET message - * hdr - pointer to internal SNMP header - * buf - pointer to SET buffer - * s - socket to send messages on - * - * Returns: - * none - * - */ -static void -set_prefix (Objid *oid, Snmp_Header *hdr __unused, int intf) -{ - struct atmsetreq asr; - Atm_addr *aa; - int fd; - int i; - - /* - * Build IOCTL request to set prefix - */ - asr.asr_opcode = AIOCS_SET_PRF; - strncpy ( asr.asr_prf_intf, Intf[intf].anp_intf, - sizeof(asr.asr_prf_intf ) ); - /* - * Pull prefix out of received Objid - * save in set_prefix IOCTL and addressEntry table - */ - for ( i = 0; i < oid->oid[13]; i++ ) { - asr.asr_prf_pref[i] = oid->oid[i + 14]; - } - - /* - * Pass new prefix to the HARP kernel - */ - fd = socket ( AF_ATM, SOCK_DGRAM, 0 ); - if ( fd < 0 ) - return; - if ( ioctl ( fd, AIOCSET, (caddr_t)&asr ) < 0 ) { - if ( errno != EALREADY ) { - syslog ( LOG_ERR, "ilmid: error setting prefix: %m" ); - if ( Log ) { - write_timestamp(); - fprintf ( Log, "errno %d setting prefix\n", - errno ); - } - close ( fd ); - return; - } - } - close ( fd ); - - /* - * Reload the cfg/intf info with newly set prefix - */ - init_ilmi(); - - aa = &Intf[intf].anp_addr; - - /* - * Copy our NSAP into addressEntry table - */ - - addressEntry[intf].oid[0] = 0; - for ( i = 0; i < aa->address_length; i++ ) { - addressEntry[intf].oid[0]++; /* Increment length */ - addressEntry[intf].oid[i + 1] = (int)((u_char *)(aa->address))[i]; - - } - - return; - -} - -static void -set_address (Snmp_Header *hdr __unused, int intf) -{ - Variable *var; - int i, j; - - PDU_Header = build_generic_header(); - - PDU_Header->head = (Variable *)malloc(sizeof(Variable)); - if (PDU_Header->head == NULL) { - fprintf(stderr, "malloc() failed in %s()\n", __func__); - exit(1); - } - bzero(PDU_Header->head, sizeof(Variable)); - - var = PDU_Header->head; - /* Copy generic addressEntry OBJID */ - bcopy ( (caddr_t)&Objids[ADDRESS_OBJID], (caddr_t)&var->oid, - sizeof(Objid) ); - /* Set specific instance */ - i = var->oid.oid[0] + 1; /* Get length */ - var->oid.oid[i++] = 1; - var->oid.oid[i++] = 1; - var->oid.oid[i++] = 3; - var->oid.oid[i++] = 0; - - /* Copy in address length */ - var->oid.oid[i++] = addressEntry[intf].oid[0]; - - /* Copy in address */ - for ( j = 0; j < addressEntry[intf].oid[0]; j++ ) - var->oid.oid[i++] = addressEntry[intf].oid[j + 1]; - var->oid.oid[0] = i - 1; /* Set new length */ - - /* Set == VALID */ - var->type = ASN_INTEGER; - var->var.ival = 1; - - build_pdu ( PDU_Header, PDU_TYPE_SET ); - send_resp ( intf, PDU_Header, Resp_Buf ); -} - -/* - * Increment Debug Level - * - * Catches SIGUSR1 signal and increments value of Debug_Level - * - * Arguments: - * sig - signal number - * - * Returns: - * none - Debug_Level incremented - * - */ -static void -Increment_DL (int sig __unused) -{ - Debug_Level++; - if ( Debug_Level && Log == (FILE *)NULL ) { - if ( foregnd ) { - Log = stderr; - } else { - if ( ( Log = fopen ( LOG_FILE, "a" ) ) == NULL ) - Log = NULL; - } - if ( Log ) { - setbuf ( Log, NULL ); - write_timestamp(); - fprintf ( Log, "Raised Debug_Level to %d\n", Debug_Level ); - } - } - signal ( SIGUSR1, Increment_DL ); - return; -} - -/* - * Decrement Debug Level - * - * Catches SIGUSR2 signal and decrements value of Debug_Level - * - * Arguments: - * sig - signal number - * - * Returns: - * none - Debug_Level decremented - * - */ -static void -Decrement_DL (int sig __unused) -{ - Debug_Level--; - if ( Debug_Level <= 0 ) { - Debug_Level = 0; - if ( Log ) { - write_timestamp(); - fprintf ( Log, "Lowered Debug_Level to %d\n", Debug_Level ); - if ( !foregnd ) - fclose ( Log ); - Log = NULL; - } - } - signal ( SIGUSR2, Decrement_DL ); - return; -} - -/* - * Loop through GET variable list looking for matches - * - */ -static void -process_get (Snmp_Header *hdr, int intf) -{ - Variable *var; - int idx; - int x; - int oidlen; - - var = hdr->head; - while ( var ) { - - /* Handle the 'GET PREFIX' request */ - oidlen = Objids[SETPFX_OBJID].oid[0]; - if (oid_ncmp(&var->oid, &Objids[SETPFX_OBJID], oidlen) == 0) { - var->var.ival = 2; /* assume not valid */ - for(x = 0; x < 13; x++) - if (var->oid.oid[oidlen + x + 2] != - addressEntry[intf].oid[x + 1]) - break; - - /* Address Match */ - if (x == 13) - hdr->head->var.ival = 1; - var = var->next; - continue; - } - - idx = find_var ( var ); - switch ( idx ) { - case MADGE_OBJECT1: - /* reply with NO SUCH OBJECT */ - var->type = ASN_NULL; - break; - case SYS_OBJID: - var->type = ASN_OBJID; - bcopy ( (caddr_t)&Objids[MY_OBJID], - (caddr_t)&var->var.oval, - sizeof(Objid) ); - break; - case UPTIME_OBJID: - var->type = ASN_TIMESTAMP; - var->var.ival = get_ticks(); - break; - case UNITYPE_OBJID: - var->type = ASN_INTEGER; - var->var.ival = UNITYPE_PRIVATE; - break; - case UNIVER_OBJID: - var->type = ASN_INTEGER; - switch ( Intf[intf].anp_sig_proto ) { - case ATM_SIG_UNI30: - var->var.ival = UNIVER_UNI30; - break; - case ATM_SIG_UNI31: - var->var.ival = UNIVER_UNI31; - break; - case ATM_SIG_UNI40: - var->var.ival = UNIVER_UNI40; - break; - default: - var->var.ival = UNIVER_UNKNOWN; - break; - } - break; - case DEVTYPE_OBJID: - var->type = ASN_INTEGER; - var->var.ival = DEVTYPE_USER; - break; - case MAXVCC_OBJID: - var->type = ASN_INTEGER; - var->var.ival = 1024; - break; - case PORT_OBJID: - var->type = ASN_INTEGER; - var->var.ival = intf + 1; - break; - case IPNM_OBJID: - var->type = ASN_IPADDR; - get_local_ip( ilmi_fd[intf], &var->var.aval ); - break; - case ADDRESS_OBJID: - break; - case ATMF_PORTID: - var->type = ASN_INTEGER; - var->var.ival = 0x30 + intf; - break; - case ATMF_SYSID: - var->type = ASN_OCTET; - var->var.sval[0] = 6; - bcopy ( (caddr_t)&Cfg[intf].acp_macaddr, - (caddr_t)&var->var.sval[1], 6 ); - break; - default: - /* NO_SUCH */ - break; - } - var = var->next; - } - build_pdu ( hdr, PDU_TYPE_GETRESP ); - send_resp ( intf, hdr, Resp_Buf ); - -} - -/****************************************************************************** - * - * Find an OBJID from known ones - * - * in: Variable with valid OID - * out: OID number (index), -1 = not found - */ -static int -lmi_object_find (Variable *var) -{ - Objid * obj_var; - Objid * obj_cur; - size_t x; - int y; - - obj_var = &var->oid; - - for (x = 0; x < NUM_OIDS; x++) { - obj_cur = &Objids[x]; - for (y = 0; y < 128; y++) { - if (obj_var->oid[y] != obj_cur->oid[y]) - break; - if (obj_var->oid[y] == 0) /* object ID endmark */ - return (x); - } - } - - return (-1); -} - -#if 0 -/****************************************************************************** - * - * Append instance number to OID - * - * in: Variable, instance number - * out: zero = success - * - */ -static int -lmi_object_instance (Variable *var, int instnum) -{ - int * oidptr; - int curlen; - - oidptr = var->oid.oid; - curlen = oidptr[0]; /* current length */ - if (curlen > 126) - return (1); - curlen++; - oidptr[curlen] = instnum; - oidptr[0] = curlen; - return (0); -} -#endif - -/****************************************************************************** - * - * Handle received GETNEXT - * - * in: Header with valid fields, interface number - * out: zero = success - * - */ -static int -lmi_rcvcmd_getnext (Snmp_Header *header, int intf) -{ - int * oidptr; - int oidlen; - int oidnum; - int x; - - oidnum = lmi_object_find(header->head); - oidptr = header->head->oid.oid; - oidlen = oidptr[0]; - - switch(oidnum) { - /* Should be because the remote side is attempting - * to verify that our table is empty - */ - case ADDRESS_OBJID: - if ( addressEntry[intf].oid[0] ) { - /* XXX - FIXME */ - /* Our table is not empty - return address */ - } - break; - - /* Madge Collage sends GETNEXT for this */ - case SETPFX_OBJID: - if(addressEntry[intf].oid[0]) { /* we have a prefix */ - oidptr[0] += 14; - oidptr += oidlen; /* skip to last number */ - oidptr++; - *oidptr++ = 13; /* length of prefix */ - - /* fill in the prefix */ - for(x = 0; x < 13; x++) { - *oidptr++ = addressEntry[intf].oid[x+1]; - } - header->head->type = ASN_INTEGER; - /* 1=valid, 2=invalid -- only 2 values */ - header->head->var.ival = 1; - } else { /* no prefix available */ - header->head->type = ASN_NULL; - } - break; - - default: - return (1); /* unknown object ID */ - } - - build_pdu(header, PDU_TYPE_GETRESP); - send_resp(intf, header, Resp_Buf); - - return (0); -} - - -/****************************************************************************** - * - * Handle received TRAP - * - * in: Header with valid fields, interface number - * out: zero = success - * - */ -static int -lmi_rcvcmd_trap (Snmp_Header *header __unused, int intf) -{ - - bzero((caddr_t)&addressEntry[intf], sizeof(Objid)); - return (0); -} - -/* - * ILMI State Processing Loop - * - * - */ -static void -ilmi_do_state(void) -{ - struct timeval tvp; - fd_set rfd; - u_char buf[1024]; - Variable *var; - int intf; - int maxfd = 0; - - /* - * Loop forever - */ - for ( ; ; ) { - int count; - int n; - u_char *bpp; - Snmp_Header *Hdr; - - /* - * SunOS CC doesn't allow automatic aggregate initialization. - * Initialize to zero which effects a poll operation. - */ - tvp.tv_sec = 15; - tvp.tv_usec = 0; - - /* - * Clear fd_set and initialize to check this interface - */ - FD_ZERO ( &rfd ); - for ( intf = 0; intf < MAX_UNITS; intf++ ) - if ( ilmi_fd[intf] > 0 ) { - FD_SET ( ilmi_fd[intf], &rfd ); - maxfd = MAX ( maxfd, ilmi_fd[intf] ); - } - - /* - * Check for new interfaces - */ - ilmi_open(); - - for ( intf = 0; intf < MAX_UNITS; intf++ ) { - /* - * Do any pre-message state processing - */ - switch ( ilmi_state[intf] ) { - case ILMI_COLDSTART: - /* - * Clear addressTable - */ - bzero ( (caddr_t)&addressEntry[intf], sizeof(Objid) ); - - /* - * Start by sending a COLD_START trap. This should cause the - * remote end to clear the associated prefix/address table(s). - */ - /* Build ColdStart TRAP header */ - ColdStart_Header = build_cold_start(); - build_pdu ( ColdStart_Header, PDU_TYPE_TRAP ); - send_resp ( intf, ColdStart_Header, Resp_Buf ); - - /* - * Start a timeout so that if the next state fails, we re-enter - * ILMI_COLDSTART. - */ - /* atm_timeout() */ - - /* Enter new state */ - ilmi_state[intf] = ILMI_INIT; - /* fall into ILMI_INIT */ - - case ILMI_INIT: - /* - * After a COLD_START, we need to check that the remote end has - * cleared any tables. Send a GET_NEXT request to check for this. - * In the event that the table is not empty, or that no reply is - * received, return to COLD_START state. - */ - PDU_Header = build_generic_header(); - - PDU_Header->head = (Variable *)malloc(sizeof(Variable)); - if (PDU_Header->head == NULL) { - fprintf(stderr, "malloc() failed in %s()\n", __func__); - exit(1); - } - bzero(PDU_Header->head, sizeof(Variable)); - - var = PDU_Header->head; - bcopy ( (caddr_t)&Objids[ADDRESS_OBJID], (caddr_t)&var->oid, - sizeof(Objid) ); - var->type = ASN_NULL; - var->next = NULL; - - /* - * Send GETNEXT request looking for empty ATM Address Table - */ - PDU_Header->reqid = Req_ID++; - build_pdu ( PDU_Header, PDU_TYPE_GETNEXT ); - send_resp ( intf, PDU_Header, Resp_Buf ); - - /* - * Start a timeout while looking for SET message. If we don't receive - * a SET, then go back to COLD_START state. - */ - /* atm_timeout() */ - break; - - case ILMI_RUNNING: - /* Normal SNMP processing */ - break; - - default: - break; - } - } - - count = select ( maxfd + 1, &rfd, NULL, NULL, &tvp ); - - for ( intf = 0; intf < MAX_UNITS; intf++ ) { - /* - * Check for received messages - */ - if ( ilmi_fd[intf] > 0 && FD_ISSET ( ilmi_fd[intf], & rfd ) ) { - - n = read ( ilmi_fd[intf], (caddr_t)&buf[1], sizeof(buf) - 1 ); - if ( n == -1 && ( errno == ECONNRESET || errno == EBADF ) ) { - ilmi_state[intf] = ILMI_COLDSTART; - close ( ilmi_fd[intf] ); - ilmi_fd[intf] = -1; - } else { - bpp = &buf[1]; - Hdr = asn_get_header(&bpp); - - if ( Log && Debug_Level > 1 ) - print_pdu(PDU_RECV, intf, Hdr, n, buf); - - if (Hdr == NULL) - continue; - - /* What we do with this messages depends upon the state we're in */ - switch ( ilmi_state[intf] ) { - case ILMI_COLDSTART: - /* We should never be in this state here */ - free_pdu ( Hdr ); - break; - case ILMI_INIT: - /* The only messages we care about are GETNEXTs, GETRESPs, and TRAPs */ - switch ( Hdr->pdutype ) { - case PDU_TYPE_GETNEXT: - lmi_rcvcmd_getnext(Hdr, intf); - break; - case PDU_TYPE_GETRESP: - /* - * This should be in response to our GETNEXT. - * Check the OIDs and go onto ILMI_RUNNING if - * the address table is empty. We can cheat and - * not check sequence numbers because we only send - * the one GETNEXT request and ILMI says we shouldn't - * have interleaved sessions. - */ - /* - * First look for empty table. If found, go to next state. - */ - if ((Hdr->error == SNMP_ERR_NOSUCHNAME) || - ((Hdr->error == SNMP_ERR_NOERROR) && - ( oid_ncmp ( &Objids[ADDRESS_OBJID], &Hdr->head->oid, - Objids[ADDRESS_OBJID].oid[0] ) == 1 ))) { - ilmi_state[intf] = ILMI_RUNNING; /* ILMI_REG; */ - } else if (Hdr->error == SNMP_ERR_NOERROR) { - /* - * Check to see if this matches our address - * and if so, that it's a VALID entry. - */ - Atm_addr *aa; - int l; - int match = 1; - - aa = &Intf[intf].anp_addr; - if ( aa->address_length == Hdr->head->oid.oid[13] ) { - for ( l = 0; l < aa->address_length; l++ ) { - if ( (int)((u_char *)(aa->address))[l] != - Hdr->head->oid.oid[14 + l] ) { - match = 0; - } - } - } - if ( match ) { - if ( Hdr->head->var.ival == 1 ) { - ilmi_state[intf] = ILMI_RUNNING; - } - } - } - free_pdu ( Hdr ); - break; - case PDU_TYPE_SET: - /* Look for SET_PREFIX Objid */ - if ( oid_ncmp ( &Hdr->head->oid, - &Objids[SETPFX_OBJID], - Objids[SETPFX_OBJID].oid[0] ) == 0 ) { - set_prefix ( &Hdr->head->oid, Hdr, intf ); - /* Reply to SET before sending our ADDRESS */ - build_pdu(Hdr, PDU_TYPE_GETRESP); - send_resp( intf, Hdr, Resp_Buf ); - set_address ( Hdr, intf ); - } else { - build_pdu(Hdr, PDU_TYPE_GETRESP); - send_resp( intf, Hdr, Resp_Buf ); - } - break; - case PDU_TYPE_TRAP: - /* Remote side wants us to start fresh */ - lmi_rcvcmd_trap(Hdr, intf); - free_pdu ( Hdr ); - break; - default: - /* Ignore */ - free_pdu ( Hdr ); - break; - } - break; - case ILMI_REG: - break; - case ILMI_RUNNING: - /* We'll take anything here */ - switch ( Hdr->pdutype ) { - case PDU_TYPE_GET: - process_get ( Hdr, intf ); - break; - case PDU_TYPE_GETRESP: - /* Ignore GETRESPs */ - free_pdu ( Hdr ); - break; - case PDU_TYPE_GETNEXT: - lmi_rcvcmd_getnext(Hdr, intf); - break; - case PDU_TYPE_SET: - /* Look for SET_PREFIX Objid */ - if ( oid_ncmp ( &Hdr->head->oid, - &Objids[SETPFX_OBJID], - Objids[SETPFX_OBJID].oid[0] ) == 0 ) { - set_prefix ( &Hdr->head->oid, Hdr, intf ); - /* Reply to SET before sending our ADDRESS */ - build_pdu(Hdr, PDU_TYPE_GETRESP); - send_resp( intf, Hdr, Resp_Buf ); - set_address ( Hdr, intf ); - } else { - build_pdu(Hdr, PDU_TYPE_GETRESP); - send_resp( intf, Hdr, Resp_Buf ); - } - break; - case PDU_TYPE_TRAP: - lmi_rcvcmd_trap(Hdr, intf); - free_pdu ( Hdr ); - break; - } - break; - default: - /* Unknown state */ - free_pdu ( Hdr ); - break; - } - } /* if n > 0 */ - } /* if received message */ - } /* for each interface */ - } /* for ever loop */ - -} - -int -main (int argc, char *argv[]) -{ - int c; - int i; - int Reset = 0; /* Should we send a coldStart and exit? */ - - /* - * What are we running as? (argv[0]) - */ - progname = strdup ( (char *)basename ( argv[0] ) ); - /* - * What host are we - */ - gethostname ( hostname, sizeof ( hostname ) ); - - /* - * Ilmid needs to run as root to set prefix - */ - if ( getuid() != 0 ) { - fprintf ( stderr, "%s: needs to run as root.\n", progname ); - exit ( -1 ); - } - - /* - * Parse arguments - */ - while ( ( c = getopt ( argc, argv, "d:fr" ) ) != -1 ) - switch ( c ) { - case 'd': - Debug_Level = atoi ( optarg ); - break; - case 'f': - foregnd++; - break; - case 'r': - Reset++; - break; - case '?': - fprintf ( stderr, "usage: %s [-d level] [-f] [-r]\n", - progname ); - exit ( -1 ); -/* NOTREACHED */ - break; - } - - /* - * If we're not doing debugging, run in the background - */ - if ( foregnd == 0 ) { - if ( daemon ( 0, 0 ) ) - err ( 1, "Can't fork" ); - } /* else - setbuf ( stdout, NULL ); */ - - signal ( SIGUSR1, Increment_DL ); - signal ( SIGUSR2, Decrement_DL ); - - /* - * Open log file - */ - if ( Debug_Level ) { - if ( foregnd ) { - Log = stderr; - } else { - if ( ( Log = fopen ( LOG_FILE, "a" ) ) == NULL ) - Log = NULL; - } - } - if ( Log ) - setbuf ( Log, NULL ); - - /* - * Get our startup time - */ - (void) gettimeofday ( &starttime, NULL ); - starttime.tv_sec--; - starttime.tv_usec += 1000000; - - /* Randomize starting request ID */ - Req_ID = starttime.tv_sec; - - /* - * Reset all the interface descriptors - */ - for ( i = 0; i < MAX_UNITS; i++ ) { - ilmi_fd[i] = -1; - } - /* - * Try to open all the interfaces - */ - ilmi_open (); - - /* - * If we're just sending a coldStart end exiting... - */ - if ( Reset ) { - for ( i = 0; i < MAX_UNITS; i++ ) - if ( ilmi_fd[i] >= 0 ) { - /* Build ColdStart TRAP header */ - ColdStart_Header = build_cold_start(); - build_pdu ( ColdStart_Header, PDU_TYPE_TRAP ); - send_resp ( i, ColdStart_Header, Resp_Buf ); - if ( Debug_Level > 1 && Log ) { - write_timestamp(); - fprintf ( Log, "Close ilmi_fd[%d]: %d\n", - i, ilmi_fd[i] ); - } - close ( ilmi_fd[i] ); - } - exit ( 2 ); - } - - ilmi_do_state(); - - exit(0); -} -- cgit v1.1