ntop-5.0.1+dfsg1/0000755000000000000000000000000012214067405012174 5ustar rootrootntop-5.0.1+dfsg1/ntop.html0000644000000000000000000016323411763357226014066 0ustar rootroot NTOP

NTOP

NAME
SYNOPSIS
DESCRIPTION
COMMAND−LINE OPTIONS
WEB VIEWS
NOTES
SEE ALSO
PRIVACY NOTICE
USER SUPPORT
AUTHOR
LICENCE
ACKNOWLEDGMENTS

NAME

ntop − display top network users

SYNOPSIS

ntop [@filename] [-a|--access-log-file <path>] [-b|--disable-decoders] [-c|--sticky-hosts] [-e|--max-table-rows] [-f|--traffic-dump-file file>] [-g|--track-local-hosts] [-h|--help] [-l|--pcap-log <path>] [-m|--local-subnets <addresses>] [-n|--numeric-ip-addresses] [-p|--protocols <list>] [-q|--create-suspicious-packets] [-r|--refresh-time <number>] [-s|--no-promiscuous] [-t|--trace-level <number>] [-x <max_num_hash_entries>] [-w|--http-server <port>] [-z|--disable-sessions] [-A|--set-admin-password password] [-B|--filter-expression expression] [-C <configmode>] [-D|--domain <name>] [-F|--flow-spec <specs>] [-M|--no-interface-merge] [-N|--wwn-map <path>] [-O|----output-packet-path <path>] [-P|--db-file-path <path>] [-Q|--spool-file-path <path>] [-U|--mapper <URL>] [-V|--version] [-X <max_num_TCP_sessions>] [--disable-instantsessionpurge] [--disable-mutexextrainfo] [--disable-ndpi] [--disable-python] [--instance] [--p3p-cp] [--p3p-uri] [--skip-version-check] [--w3c] [-4|--ipv4] [-6|--ipv6]

Unix options:

[-d|--daemon] [-i|--interface <name>] [-u|--user <user>] [-K|--enable-debug] [-L] [--pcap_setnonblock] [--use-syslog= <facility>] [--webserver-queue <number>]

Windows option:

[-i|--interface <number|name>]

OpenSSL options:

[-W|--https-server <port>] [--ssl-watchdog]

DESCRIPTION

ntop shows the current network usage. It displays a list of hosts that are currently using the network and reports information concerning the (IP and non-IP) traffic generated and received by each host. ntop may operate as a front-end collector (sFlow and/or netFlow plugins) or as a stand-alone collector/display program. A web browser is needed to access the information captured by the ntop program.

ntop is a hybrid layer 2 / layer 3 network monitor, that is by default it uses the layer 2 Media Access Control (MAC) addresses AND the layer 3 tcp/ip addresses. ntop is capable of associating the two, so that ip and non-ip traffic (e.g. arp, rarp) are combined for a complete picture of network activity.

COMMAND−LINE OPTIONS

@filename

The text of filename is copied - ignoring line breaks and comment lines (anything following a #) - into the command line. ntop behaves as if all of the text had simply been typed directly on the command line. For example, if the command line is "-t 3 @d -u ntop" and file d contains just the line ’-d’, then the effective command line is -t 3 -d -u ntop. Multiple @s are permitted. Nested @s (an @ inside the file) are not permitted.

Remember, most ntop options are "sticky", that is they just set an internal flag. Invoking them multiple times doesn’t change ntop’s behavior. However, options that set a value, such as --trace-level, will use the LAST value given: --trace-level 2 --trace-level 3 will run as --trace-level 3.

Beginning with 3.1, many command-line options may also be set via the web browser interface. These changes take effect on the next run of and on each subsequent run until changed.

-a | --access-log-file

By default ntop does not maintain a log of HTTP requests to the internal web server. Use this parameter to request logging and to specify the location of the file where these HTTP requests are logged.

Each log entry is in Apache-like style. The only difference between Apache and ntop logs is that an additional column has been added which has the time (in milliseconds) that ntop needed to serve the request. Log entries look like this:

192.168.1.1 - - [04/Sep/2003:20:38:55 -0500] - "GET / HTTP/1.1" 200 1489 4
192.168.1.1 - - [04/Sep/2003:20:38:55 -0500] - "GET /index_top.html HTTP/1.1" 200 1854 4
192.168.1.1 - - [04/Sep/2003:20:38:55 -0500] - "GET /index_inner.html HTTP/1.1" 200 1441 7
192.168.1.1 - - [04/Sep/2003:20:38:56 -0500] - "GET /index_left.html HTTP/1.1" 200 1356 4
192.168.1.1 - - [04/Sep/2003:20:38:56 -0500] - "GET /home_.html HTTP/1.1" 200 154/617 9
192.168.1.1 - - [04/Sep/2003:20:38:56 -0500] - "GET /home.html HTTP/1.1" 200 1100/3195 10
192.168.1.1 - - [04/Sep/2003:20:38:56 -0500] - "GET /About.html HTTP/1.1" 200 2010 10

This parameter is the complete file name of the access log. In prior releases it was erroneously called --access-log-path.

-b | --disable-decoders

This parameter disables protocol decoders.

Protocol decoders examine and collect information about layer 2 protocols such as NetBIOS or Netware SAP, as well as about specific tcp/ip (layer 3) protocols, such as DNS, http and ftp.

This support is specifically coded for each protocol and is different from the capability to count raw information (packets and bytes) by protocol specified by the -p | --protocols parameter, below.

Decoding protocols is a significant consumer of resources. If the ntop host is underpowered or monitoring a very busy network, you may wish to disable protocol decoding via this parameter. It may also be appropriate to use this parameter if you believe that ntop has problems handling some protocols that occur on your network.

Even if decoding is disabled, ftp-data traffic is still decoded to look for passive ftp port commands.

-c | --sticky-hosts

Use this parameter to prevent idle hosts from being purged from memory.

By default idle hosts are periodically purged from memory. An idle host is identified when no packets from or to that host have been monitored for the period of time defined by the value of PARM_HOST_PURGE_MINIMUM_IDLE in globals-defines.h.

If you use this option, all hosts - active and idle - are retained in memory for the duration of the ntop run.

P2P users, port scans, popular web servers and other activity will cause ntop to record data about a large number of hosts. On an active network, this will consume a significant - and always growing - amount of memory. It is strongly recommended that you use a filtering expression to limit the hosts which are stored if you use --sticky-hosts.

The idle purge is a statistical one - a random selection of the eligible hosts will be purged during each cycle. Thus it is possible on a busy system for an idle host to remain in the ntop tables and appear ’active’ for some considerable time after it is truly idle.

-d | --daemon

This parameter causes ntop to become a daemon, i.e. a task which runs in the background without connection to a specific terminal. To use ntop other than as a casual monitoring tool, you probably will want to use this option.

WARNING: If you are running as a daemon, the messages from ntop will be ’printed’ on to stdout and thus dropped. You probably don’t want to do this. So remember to also use the -L or --use-syslog options to save the messages into the system log.

-e | --max-table-rows

This defines the maximum number of lines that ntop will display on each generated ML page. If there are more lines to be displayed than this setting permits, only part of the data will be displayed. There will be page forward/back arrows placed at the bottom of the page for navigation between pages.

-f | --traffic-dump-file

By default, ntop captures traffic from network interface cards (NICs) or from netFlow/sFlow probes. However, ntop can also read data from a file - typically a tcpdump capture or the output from one of the ntop packet capture options.

if you specify -f, ntop will not capture any traffic from NICs during or after the file has been read. netFlow/sFlow capture - if enabled - would still be active.

This option is mostly used for debug purposes.

-g | --track-local-hosts

By default, ntop tracks all hosts that it sees from packets captured on the various NICs. Use this parameter to tell ntop to capture data only about local hosts. Local hosts are defined based on the addresses of the NICs and those networks identified as local via the -m | --local-subnets parameter.

This parameter is useful on large networks or those that see many hosts, (e.g. a border router or gateway), where information about remote hosts is not desired/required to be tracked.

-h | --help

Print help information for ntop, including usage and parameters.

-i | --interface

Specifies the network interface or interfaces to be used by ntop for network monitoring.

If multiple interfaces are used (this feature is available only if ntop is compiled with thread support) their names must be separated with a comma. For instance -i "eth0,lo".

If not specified, the default is the first Ethernet device, e.g. eth0. The specific device that is ’first’ is highly system dependent. Especially on systems where the device name reflects the driver name instead of the type of interface.

By default, traffic information obtained by all the interfaces is merged together as if the traffic was seen by only one interface. Use the -M parameter to keep traffic separate by interface.

If you do not want ntop to monitor any interfaces, use -i none.

Under Windows, the parameter value is either the number of the interface or its name, e.g. {6252C14C-44C9-49D9-BF59-B2DC18C7B811}. Run ntop -h to see a list of interface name-number mappings (at the end of the help information).

-l | --pcap-log

This parameter causes a dump file to be created of the network traffic captured by ntop in tcpdump (pcap) format. This file is useful for debug, and may be read back into ntop by the -f | --traffic-dump-file parameter. The dump is made after processing any filter expression ( never even sees filtered packets).

The output file will be named <path>/<log>.<device>.pcap (Windows: <path>/<log>.pcap ), where <path> is defined by the -O | --output-packet-path parameter and <log> is defined by this -l | --pcap-log parameter.

-m | --local-subnets

ntop determines the ip addresses and netmasks for each active interface. Any traffic on those networks is considered local. This parameter allows the user to define additional networks and subnetworks whose traffic is also considered local in ntop reports. All other hosts are considered remote.

Commas separate multiple network values. Both netmask and CIDR notation may be used, even mixed together, for instance "131.114.21.0/24,10.0.0.0/255.0.0.0".

The local subnet - as defined by the interface address(es) - is/are always local and do not need to be specified. If you do give the same value as a NIC’s local address, a harmless warning message is issued.

-n | --numeric-ip-addresses

By default, ntop resolves IP addresses using a combination of active (explicit) DNS queries and passive sniffing. Sniffing of DNS responses occurs when ntop receives a network packet containing the response to some other user’s DNS query. ntop captures this information and enters it into ntop’s DNS cache, in expectation of shortly seeing traffic addressed to that host. This way ntop significantly reduces the number of DNS queries it makes.

This parameter causes ntop to skip DNS resolution, showing only numeric IP addresses instead of the symbolic names. This option can useful when the DNS is not present or quite slow.

-p | --protocols

This parameter is used to specify the TCP/UDP protocols that ntop will monitor. The format is <label>=<protocol list> [, <label>=<protocol list>], where label is used to symbolically identify the <protocol list>. The format of <protocol list> is <protocol>[|<protocol>], where <protocol> is either a valid protocol specified inside the /etc/services file or a numeric port range (e.g. 80, or 6000-6500).

A simple example is --protocols="HTTP=http|www|https|3128,FTP=ftp|ftp-data", which reduces the protocols displayed on the "IP" pages to three:

Host Domain Data HTTP FTP Other IP
ns2.attbi.com <flag> 954 63.9 % 0 0 954
64.124.83.112.akamai.com <flag> 240 16.1 % 240 0 0
64.124.83.99.akamai.com <flag> 240 16.1 % 240 0 0
toolbarqueries.google.com <flag> 60 4.0 % 60 0 0

If the <protocol list> is very long you may store it in a file (for instance protocol.list). To do so, specify the file name instead of the <protocol list> on the command line. e.g. ntop -p protocol.list

If the -p parameter is omitted the following default value is used:

FTP=ftp|ftp-data
TP=http|www|https|3128 3128 is Squid, the HTTP cache
DNS=name|domain
Telnet=telnet|login
NBios-IP=netbios-ns|netbios-dgm|netbios-ssn
Mail=pop-2|pop-3|pop3|kpop|smtp|imap|imap2
DHCP-BOOTP=67-68
SNMP=snmp|snmp-trap
NNTP=nntp
NFS=mount|pcnfs|bwnfs|nfsd|nfsd-status
X11=6000-6010
SSH=22

Peer-to-Peer Protocols
----------------------
Gnutella=6346|6347|6348
Kazaa=1214
WinMX=6699|7730
DirectConnect=0 Dummy port as this is a pure P2P protocol
eDonkey=4661-4665

Instant Messenger
-----------------
Messenger=1863|5000|5001|5190-5193

NOTE: To resolve protocol names to port numbers, they must be specified in the system file used to list tcp/udp protocols and ports, which is typically /etc/services file. You will have to match the names in that file, exactly. Missing or unspecified (non-standard) ports must be specified by number, such as 3128 in our examples above.

If you have a file named /etc/protocols, don’t get confused by it, as that’s the Ethernet protocol numbers, which are not what you’re looking for.

-q | --create-suspicious-packets

This parameter tells ntop to create a dump file of suspicious packets.

There are many, many, things that cause a packet to be labeled as ’suspicious’, including:

Detected ICMP fragment
Detected Land Attack against host
Detected overlapping/tiny packet fragment
Detected traffic on a diagnostic port
Host performed ACK/FIN/NULL scan
Host rejected TCP session
TP/FTP/SMTP/SSH detected at wrong port
Malformed TCP/UDP/ICMP packet (packet too short)
Packet # %u too long
Received a ICMP protocol Unreachable from host
Sent ICMP Administratively Prohibited packet to host
Smurf packet detected for host
TCP connection with no data exchanged
TCP session reset without completing 3-way handshake
Two MAC addresses found for the same IP address
UDP data to a closed port
Unknown protocol (no HTTP/FTP/SMTP/SSH) detected (on port 80/21/25/22)
Unusual ICMP options

When this parameter is used, one file is created for each network interface where suspicious packets are found. The file is in tcpdump (pcap) format and is named <path>/ntop-suspicious-pkts.<device>.pcap, where <path> is defined by the -O | --output-packet-path parameter.

-r | --refresh-time

Specifies the delay (in seconds) between automatic screen updates for those generated HTML pages which support them. This parameter allows you to leave your browser window open and have it always displaying nearly real-time data from ntop.

The default is 3 seconds. Please note that if the delay is very short (1 second for instance), ntop might not be able to process all of the network traffic.

-s | --no-promiscuous

Use this parameter to prevent from setting the interface(s) into promiscuous mode.

An interface in promiscuous mode will accept ALL Ethernet frames, regardless of whether they directed (addressed) to the specific network interface (NIC) or not. This is an essential part of enabling ntop to monitor an entire network. (Without promiscuous mode, ntop will only see traffic directed to the specific host it is running on, plus broadcast traffic such as the arp and dhcp protocols.

Even if you use this parameter, the interface could well be in promiscuous mode if another application enabled it.

ntop passes this setting on to libpcap, the packet capture library. On many systems, a non-promiscuous open of the network interface will fail, since the libpcap function on most systems require it to capture raw packets ( ntop captures raw packets so that we may view and analyze the layer 2 - MAC - information).

Thus on most systems, ntop must probably still be started as root, and this option is largely ornamental. If it fails, you will see a ***FATALERROR*** message referring to pcap_open_live() and then an information message, "Sorry, but on this system, even with -s, it appears that ntop must be started as root".

-t | --trace-level

This parameter specifies the ’information’ level of messages that you wish ntop to display (on stdout or to the log). The higher the trace level number the more information that is displayed. The trace level ranges between 0 (no trace) and 5 (full debug tracings).

The default trace value is 3.

Trace level 0 is not quite zero messages. Fatal errors and certain startup/shutdown messages are always displayed. Trace level 1 is used to display errors only, level 2 for both errors and warnings, and level 3 displays error, warning and informational messages.

Trace level 4 is called ’noisy’ and it is - generating many messages about the internal functioning of ntop. Trace level 5 and above are ’noisy’ plus extra logs, i.e. all possible messages, with a file:line tag prepended to every message.

-u | --user

Specifies the user ntop should run as after it initializes.

ntop must normally be started as root so that it has sufficient privileges to open the network interfaces in promiscuous mode and to receive raw frames. See the discussion of -s | --no-promiscuous above, if you wish to try starting ntop as a non-root user.

Shortly after starting up, ntop becomes the user you specify here, which normally has substantially reduced privileges, such as no login shell. This is the userid which owns ntop’s database and output files.

The value specified may be either a username or a numeric user id. The group id used will be the primary group of the user specified.

If this parameter is not specified, ntop will try to switch first to ’nobody’ and then to ’anonymous’ before giving up.

NOTE: This should not be root unless you really understand the security risks. In order to prevent this by accident, the only way to run ntop as root is to explicitly specify -u root. Don’t do it.

-x
-X

ntop creates a new hash/list entry for each new host/TCP session seen. In case of DOS (Denial Of Service) an attacker can easily exhaust all the host available memory because ntop is creating entries for dummy hosts. In order to avoid this you can set an upper limit in order to limit the memory ntop can use.

-w | --http-server
-W | --https-server

ntop offers an embedded web server to present the information that has been so painstakingly gathered. An external HTTP server is NOT required NOR supported. The ntop web server is embedded into the application. These parameters specify the port (and optionally the address (i.e. interface)) of the ntop web server.

For example, if started with -w 3000 (the default port), the URL to access ntop is http://hostname:3000/. If started with a full specification, e.g. -w 192.168.1.1:3000, ntop listens on only that address/port combination.

If -w is set to 0 the web server will not listen for http:// connections.

-W operates similarly, but controls the port for the https:// connections.

Some examples:

ntop -w 3000 -W 0 (this is the default setting) HTTP requests on port 3000 and no HTTPS.

ntop -w 80 -W 443 Both HTTP and HTTPS have been enabled on their most common ports.

ntop -w 0 -W 443 HTTP disabled, HTTPS enabled on the common port.

Certain sensitive, configuration pages of the ntop web server are protected by a userid/password. By default, these are the user/URL administration, filter, shutdown and reset stats are password protected
and are accessible initially only to user admin with a password set during the first run of ntop.

Users can modify/add/delete users/URLs using ntop itself - see the Admin tab.

The passwords, userids and URLs to protect with passwords are stored in a database file. Passwords are stored in an encrypted form in the database for further security. Best practices call for securing that database so that only the ntop user can read it.

There is a discussion in docs/FAQ about further securing the ntop environment.

-z | --disable-sessions

This parameter disables TCP session tracking. Use it for better performance or when you don’t really need/care to track sessions.

-A | --set-admin-password

This parameter is used to start ntop , set the admin password and quit. It is quite useful for installers that need to automatically set the password for the admin user.

-A and --set-admin-password (without a value) will prompt the user for the password.

You may also use this parameter to set a specific value using --set-admin-password=value. The = is REQUIRED and no spaces are permitted!

If you attempt to run ntop as a daemon without setting a password, a FATAL ERROR message is generated and ntop stops.

-B | --filter-expression

Filters allows the user to restrict the traffic seen by ntop on just about any imaginable item.

The filter expression is set at run time by this parameter, but it may be changed during the ntop run on the Admin | Change Filter web page.

The basic format is -B filter , where the quotes are REQUIRED

The syntax of the filter expression uses the same BPF (Berkeley Packet Filter) expressions used by other packages such as tcpdump

For instance, suppose you are interested only in the traffic generated/received by the host jake.unipi.it. ntop can then be started with the following filter:

ntop -B src host jake.unipi.it or dst host jake.unipi.it

or in shorthand:

ntop -B host jake.unipi.it or host jake.unipi.it

See the ’expression’ section of the tcpdump man page - usually available at http://www.tcpdump.org/tcpdump_man.html - for further information and the best quick guide to BPF filters currently available.

WARNING: If you are using complex filter expressions, especially those with =s or meaningful spaces in them, be sure and use the long option format, --filter-expression="xxxx" and not -B "xxxx".

-C |

This instruments ntop to be used in two configurations: host and network mode. In host mode (default) ntop works as usual: the IP addresses received are those of real hosts. In host mode the IP addresses received are those of the C-class network to which the address belongs. Using ntop in network mode is extremely useful when installed in a traffic exchange (e.g. in the middle of the Internet) whereas the host mode should be used when ntop is installed on the edge of a network (e.g. inside a company). The network mode significantly reduces the amount of work ntop has to perform and it has to be used whenever ntop is used to find out how the network traffic flows and not to pin-point specific hosts.

-D | --domain

This identifies the local domain suffix, e.g. ntop.org. It may be necessary, if ntop is having difficulty determining it from the interface.

-F | --flow-spec

It is used to specify network flows similar to more powerful applications such as NeTraMet. A flow is a stream of captured packets that match a specified rule. The format is

<flow-label>=’<matching expression>’[,<flow-label>=’<matching expression>’]

, where the label is used to symbolically identify the flow specified by the expression. The expression is a bpf (Berkeley Packet Filter) expression. If an expression is specified, then the information concerning flows can be accessed following the ML link named ’List NetFlows’.

For instance define two flows with the following expression LucaHosts=’host jake.unipi.it or host pisanino.unipi.it’,GatewayRoutedPkts=’gateway gateway.unipi.it’ .

All the traffic sent/received by hosts jake.unipi.it or pisanino.unipi.it is collected by ntop and added to the LucaHosts flow, whereas all the packet routed by the gateway gateway.unipi.it are added to the GatewayRoutedPkts flow. If the flows list is very long you may store in a file (for instance flows.list) and specify the file name instead of the actual flows list (in the above example, this would be ’ntop -F flows.list’).

Note that the double quotations around the entire flow expression are required.

-K | --enable-debug

Use this parameter to simplify application debug. It does three things: 1. Does not fork() on the "read only" html pages. 2. Displays mutex values on the configuration (info.html) page. 3. (If available - glibc/gcc) Activates an automated backtrace on application errors.

-L | --use-syslog=facility

Use this parameter to send log messages to the system log instead of stdout.

-L and the simple form --use-syslog use the default log facility, defined as LOG_DAEMON in the #define symbol DEFAULT_SYSLOG_FACILITY in globals-defines.h.

The complex form, --use-syslog=facility will set the log facility to whatever value (e.g. local3, security) you specify. The = is REQUIRED and no spaces are allowed!

This setting applies both to ntop and to any child fork()ed for reporting. If this parameter is not specified, any fork()ed child will use the default value and will log it’s messages to the system log (this occurs because the fork()ed child must give up it’s access to the parents stdout).

Because various systems do not make the permissible names available, we have a table at the end of globals-core.c. Look for myFacilityNames.

-M | --no-interface-merge

By default, ntop merges the data collected from all of the interfaces (NICs) it is monitoring into a single set of counters.

If you have a simple network, say a small LAN with a connection to the internet, merging data is good as it gives you a better picture of the whole network. For larger, more complex networks, this may not be desirable. You may also have other reasons for wishing to monitor each interface separately, for example DMZ vs. LAN traffic.

This option instructs ntop not to merge network interfaces together. This means that ntop will collect statistics for each interface and report them separately.

Only ONE interface may be reported on at a time - use the Admin | Switch NIC option on the web server to select which interface to report upon.

Note that activating either the netFlow and/or sFlow plugins will force the setting of -M. Once enabled, you cannot go back.

-N | --wwn-map

This options names the file providing the map of WWN to FCID/VSAN ids.

-O | --output-packet-path

This parameter defines the base path for the ntop-suspicious-pkts.XXX.pcap and normal packet dump files.

If this parameter is not specified, the default value is the config.h parameter CFG_DBFILE_DIR, which is set during ./configure from the --localstatedir= parameter. If --localstatedir is not specified, it defaults to the --prefix value plus /var (e.g. /usr/local/var).

Be aware that this may not be what you expect when running ntop as a daemon or Windows service. Setting an explicit and absolute path value is STRONGLY recommended if you use this facility.

-P | --db-file-path
-Q | --spool-file-path

These parameters specify where ntop stores database files.

There are two types, ’temporary’ - that is ones which need not be retained from ntop run to ntop run, and ’permanent’, which must be retained (or recreated).

The ’permanent’ databases are the preferences, "prefsCache.db" and the password file, "ntop_pw.db". These are stored in the -P | --db-file-path specified location.

Certain plugins use the -P | --db-file-path specified location for their database ("LsWatch.db") or (as a default value) for files (.../rrd/...).

The ’temporary’ databases are the address queue, "addressQueue.db", the cached DNS resolutions, "dnsCache.db" and the MAC prefix (vendor table), "macPrefix.db".

If only -P | --db-file-path is specified, it is used for both types of databases.

The directories named must allow read/write and file creation by the ntop user. For security, nobody else should have even read access to these files.

Note that the default value is the config.h parameter CFG_DBFILE_DIR. This is set during ./configure from the --localstatedir= parameter. If --localstatedir is not specified, it defaults to the --prefix value plus /var (e.g. /usr/local/var).

This may not be what you expect when running ntop as a daemon or Windows service.

Note that on versions of ntop prior to 2.3, these parameters defaulted to "." (the current working directory, e.g. the value returned by the pwd command) and caused havoc as it was different when ntop was run from the command line, vs. run via cron, vs. run from an initialization script.

Setting an explicit and absolute path value is STRONGLY recommended.

-U | --mapper

Specifies the URL of the mapper.pl utility.

If provided, ntop creates a clickable hyperlink on the ’Info about host xxxxxx’ page to this URL by appending ?host=xxxxx. Any type of host lookup could be performed, but this is intended to lookup the geographical location of the host.

A cgi-based mapper interface to http://www.multimap.com is part of the ntop distribution [see www/Perl/mapper.pl]).

-V | --version

Prints ntop version information and then exits.

-W | --https-server

(See the joint documentation with the -w parameter, above)

--disable-instantsessionpurge

ntop sets completed sessions as ’timed out’ and then purge them almost instantly, which is not the behavior you might expect from the discussions about purge timeouts. This switch makes ntop respect the timeouts for completed sessions. It is NOT the default because a busy web server may have 100s or 1000s of completed sessions and this would significantly increase the amount of memory ntop uses.

--disable-mutexextrainfo

ntop stores extra information about the locks and unlocks of the protective mutexes it uses. Since ntop uses fine-grained locking, this information is updated frequently. On some OSes, the system calls used to collect this informatio (getpid() and gettimeofday()) are expensive. This option disables the extra information. It should have no processing impact on ntop
- however should ntop actually deadlock, we would lose the information that sometimes tells us why.

--disable-ndpi

ntop is started without nDPI support thus application protocols are not recognized.

--disable-python

ntop is started without the Python interpreter. Beware as some ntop reports are based on python, thus disabling it will prevent some reports to work properly.

--instance

You can run multiple instances of ntop simultaneously by specifying different -P values (typically through separate ntop.conf files). If you set a value for this parameter (available only on the command line), you (1) display the ’instance’ name on every web page and (2) alter the log prefix from "NTOP" to your chosen value.

If you want to make the tag more obvious, create a .instance class in style.css, e.g.:

.instance {
color: #666666;
font-size: 18pt;
}

Note (UNIX): To run completely different versions of the ntop binary, you need to compile and install into a different library (using ./configure --prefix) and then specify the LD_LIBRARY_PATH before invoking, e.g.

LD_LIBRARY_PATH=/devel/lib/ntop/:... /devel/bin/ntop ...args...

If present, a file of the form <instance>_ntop_logo.gif will be used instead of the normal ntop_logo.gif. This is tested for ONLY once, at the beginning of the run. The EXACT word(s) of the --instance flag are used, without testing if they make a proper file name. If - for any reason - the file is not found, an informational message is logged and the normal logo file is used. To construct your own logo, make it a 300x40 transparent gif.

NOTE: On the web pages, ntop uses the dladdr() function. The original Solaris routine had a bug, replicated in FreeBSD (and possibly other places) where it uses the ARGV[0] value - which might be erroneous - instead of the actual file name. If the ’running from’ value looks bogus but the ’libaries in’ value looks ok, go with the libarary.

--p3p-cp
--p3p-uri

P3P is a W3C recommendation - http://www.w3.org/TR/P3P/ - for specifying personal information a site collects and what it does with the information. These parameters allow to return P3P information. We do not supply samples.

--pcap_setnonblock

On some platforms, the ntop web server will hang or appear to hang (it actually just responds incredibly slowly to the first request from a browser session), while the rest of ntop runs just fine. This is known to be an issue under FreeBSD 4.x.

This option sets the non-blocking option (assuming it’s available in the version of libpcap that is installed).

While this works around the problem (by turing an interupt driven process into a poll), it also MAY signifcantly increases the cpu usage of ntop. Although it does not actually interfere with other work, seeing ntop use 80-90% or more of the cpu is not uncommon - don’t say we didn’t warn you.

THIS OPTION IS OFFICIALLY UNSUPPORTED and used at your own risk. Read the docs/FAQ write-up.

--skip-version-check

By default, ntop accesses a remote file to periodically check if the most current version is running. This option disables that check. Please review the privacy notice at the bottom of this page for more information. By default, the recheck period is slightly more than 15 days. This can be adjusted via a constant in globals-defines.h. If the result of the initial check indicates that the ntop version is a ’new development’ version (that is newer than the latest published development version), the recheck is disabled. This is because which fixes and enhancements were present/absent from the code.

NOTE: At present, the recheck does not work under Windows.

--ssl-watchdog

Enable a watchdog for webserver hangs. These usually happen when connecting with older browsers. The user gets nothing back and other users can’t connect. Internally, packet processing continues but there is no way to access the data through the web server or shutdown ntop cleanly. With the watchdog, a timeout occurs after 3 seconds, and processing continues with a log message. Unfortunately, the user sees nothing - it just looks like a failed connection. (also available as a ./configure option, --enable-sslwatchdog)

--w3c

By default, ntop generates displayable but not great html. There are a number of tags we do not generate because they cause problems with older browsers which are still commonly used or are important to look good on real-world browsers. This flag tells ntop to generate ’BETTER’ (but not perfect) w3c compliant html 4.01 output. This in no way addresses all of the compatibility and markup issues. Over time, we would like to make ntop more compatible, but it will never be 100%. If you find any issues, please report them to ntop-dev.

-4 | --ipv4

Use IPv4 connections.

-6 | --ipv6

Use IPv6 connections

WEB VIEWS

While ntop is running, multiple users can access the traffic information using their web browsers. ntop does not generate ’fancy’ or ’complex’ html, although it does use frames, shallowly nested tables and makes some use of JavaScript and Cascading Style Sheets.

Beginning with release 3.1, the menus are cascading dropdowns via JSCookMenu. With release 3.2, this extends to plugins.

We do not expect problems with any current web browser, but our ability to test with less common ones is very limited. Testing has included Firefox and Internet Explorer, with very limited testing on other current common browsers such as Opera.

In documentation and this man page, when we refer to a page such as Admin | Switch NIC, we mean the Broad category "Admin" and the detailed item "Switch NIC" on that Admin menu.

NOTES

ntop requires a number of external tools and libraries to operate. Certain other tools are optional, but add to the program’s capabilities.
--webserver-queue

Specifies the maximum number of web server requests for the tcp/ip stack to retain in it’s queue awaiting delivery to the ntop web server. Requests in excess of this queue may be dropped (allowing for retransmission) or rejected at the tcp/ip stack level, depending upon the OS. Whatever happens, happens at the OS level, without any information being delivered to ntop

Required libraries include:

libpcap from http://www.tcpdump.org/, version 0.7.2 or newer. 0.8.3 or newer is strongly recommended.

The Windows version makes use of WinPcap (libpcap for Windows) which may be downloaded from http://winpcap.polito.it/install/default.htm.

WARNING: The 2.x releases of WinPcap will NOT support SMP machines.

gdbm from http://www.gnu.org/software/gdbm/gdbm.html

ntop requires a POSIX threads library. As of ntop 3.2, the single-threaded version of ntop is no longer available.

The gd 2.x library, for the creation of png files, available at http://www.boutell.com/gd/.

The libpng 1.2.x library, for the creation of png files, available at http://www.libpng.org/pub/png/libpng.html.

ntop should support both gd 1.X and libpng 1.0.x libraries but this has not been tested. Note that there are incompatibilities if you compile with one version of these libraries and then run with the other. Please read the discussion in docs/FAQ before reporting ANY problems of this nature.

(if an https:// server is desired) openSSL from the OpenSSL project available at http://www.openssl.org.

The rrdtool library is required by the rrd plugin. rrdtool creates ’Round-Robin databases’ which are used to store and graph historical data in a format that permits long duration retention without growing larger over time. The rrdtool home page is http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/

ntop includes a limited version of rrdtool 1.0.49 in the myrrd/ directory. Users of ntop 3.2 should not need to specifically install rrdtool.

The sflow Plugin is courtesy of and supported by InMon Corporation, http://www.inmon.com/sflowTools.htm.

There are other optional libraries. See the output of ./configure for a fuller listing.

Tool locations are current as of August 2005 - please send email to report new locations or dead links.

SEE ALSO

top(1), tcpdump(8). pcap(3).

PRIVACY NOTICE

By default at startup and at periodic intervals, the ntop program will retrieve a file containing current ntop program version information. Retrieving this file allows this ntop instance to confirm that it is running the most current version.

The retrieval is done using standard http:// requests, which will create log records on the hosting system. These log records do contain information which identifies a specific ntop site. Accordingly, you are being notified that this individually identifiable information is being transmitted and recorded.

You may request - via the --skip-version-check run-time option - that this check be eliminated. If you use this option, no individually identifiable information is transmitted or recorded, because the entire retrieval and check is skipped.

We ask you to allow this retrieval and check, because it benefits both you and the ntop developers. It benefits you because you will be automatically notified if the ntop program version is obsolete, becomes unsupported or is no longer current. It benefits the developers of ntop because it allows us to determine the number of active ntop instances, and the operating system/versions that users are running ntop under. This allows us to focus development resources on systems like those our users are using ntop on.

The individually identifiable information is contained in the web server log records which are automatically created each time the version file is retrieved. This is a function of the web server and not of ntop , but we do take advantage of it. The log record shows the IP address of the requestor (the ntop instance) and a User-Agent header field. We place information in the User-Agent header as follows:

ntop/<version>
host/<name from config.guess>
distro/<if one>
release/<of the distro, also if one>
kernrlse/<kernel version or release>
GCC/<version>
config() <condensed parameters from ./configure>
run() <condensed flags - no data - from the execution line>
libpcap/<version>
gdbm/<version>
openssl/<version>
zlib/<version>
access/<http, https, both or none>
interfaces() <given interface names>

For example:

ntop/2.2.98 host/i686-pc-linux-gnu distro/redhat release/9 kernrlse/2.4.20-8smp
GCC/3.2.2 config(i18n) run(i; u; P; w; t; logextra; m; instantsessionpurge;
schedyield; d; usesyslog=; t) gdbm/1.8.0 openssl/0.9.7a zlib/1.1.4
access/http interfaces(eth0,eth1)

Distro and release information is determined at compile time and consists of information typically found in the /etc/release (or similar) file. See the ntop tool linuxrelease for how this is determined.

gcc compiler version (if available) is the internal version #s for the gcc compiler, e.g. 3.2.3.

kernrlse is the Linux Kernel version or the xBSD ’release’ such as 4.9-RELEASE and is determined from the uname data (if it’s available).

The ./configure parameters are stripped of directory paths, leading -s, etc. to create a short form that shows us what ./configure parameters people are using.

Similarly, the run time parameters are stripped of data and paths, just showing which flags are being used.

The libpcap, gdbm, openssl and zlib versions come from the strings returned by the various inquiry functions (if they’re availabe).

Here’s a sample log record:

67.xxx.xxx.xxx - - [28/Dec/2003:12:11:46 -0500] "GET /version.xml TP/1.0"
200 1568 www.burtonstrauss.com "-" "ntop/2.2.98 host/i686-pc-linux-gnu
distro/redhat release/9 kernrlse/2.4.20-8smp GCC/3.2.2 config(i18n)
run(i; u; P; w; t; logextra; m; instantsessionpurge; schedyield; d;
usesyslog=) libpcap/0.8 gdbm/1.8.0 openssl/0.9.7a zlib/1.1.4 access/http
interfaces(eth0,eth1,eth2)" "-"

USER SUPPORT

Please send bug reports to the ntop-dev <ntop-dev@ntop.org> mailing list. The ntop <ntop@ntop.org> mailing list is used for discussing ntop usage issues. In order to post messages on the lists a (free) subscription is required to limit/avoid spam. Please do NOT contact the author directly unless this is a personal question.

Commercial support is available upon request. Please see the ntop site for further info.

Please send code patches to <patch@ntop.org>.

AUTHOR

ntop’s author is Luca Deri (http://luca.ntop.org/) who can be reached at <deri@ntop.org>.

LICENCE

ntop is distributed under the GNU GPL licence (http://www.gnu.org/).

ACKNOWLEDGMENTS

The author acknowledges the Centro Serra of the University of Pisa, Italy (http://www-serra.unipi.it/) for hosting the ntop sites (both web and mailing lists), and Burton Strauss <burton@ntopsupport.com> for his help and user assistance. Many thanks to Stefano Suin <stefano@ntop.org> and Rocco Carbone <rocco@ntop.org> for contributing to the project.


ntop-5.0.1+dfsg1/MANIFESTO0000644000000000000000000000212207414541016013442 0ustar rootroot ___ __ _ _ _ |_ _|/ _| _ _ ___ _ _ ___ | |__ ___ _ _ | |_| |__ ___ | || |_ | | | |/ _ \| | | | / _ \| '_ \ / _ \ | | | | __| '_ \ / _ \ | || _| | |_| | (_) | |_| | | (_) | |_) | __/ |_| | | |_| | | | __/ |___|_| \__, |\___/ \__,_| \___/|_.__/ \___|\__, | \__|_| |_|\___| |___/ |___/ _ _ _ _ _ _ __ _ _| | ___ ___ _ _ ___ _ _( ) | | _ __ ___ (_)___ ___ | '__| | | | |/ _ \/ __| | | | |/ _ \| | | |/| | | | '_ ` _ \| / __/ __| | | | |_| | | __/\__ \ | |_| | (_) | |_| | | | | | | | | | | \__ \__ \ |_| \__,_|_|\___||___/ \__, |\___/ \__,_| |_|_| |_| |_| |_|_|___/___/ |___/ _ _ _ _ __ __ _| | | | |_| |__ ___ / _|_ _ _ __ / _` | | | | __| '_ \ / _ \ | |_| | | | '_ \ | (_| | | | | |_| | | | __/ | _| |_| | | | | \__,_|_|_| \__|_| |_|\___| |_| \__,_|_| |_| ntop-5.0.1+dfsg1/mkinstalldirs0000755000000000000000000000341110661423613015002 0ustar rootroot#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case "${1}" in -h | --help | --h* ) # -h for help echo "${usage}" 1>&2; exit 0 ;; -m ) # -m PERM arg shift test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } dirmode="${1}" shift ;; -- ) shift; break ;; # stop option processing -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option * ) break ;; # first non-opt arg esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 3 # End: # mkinstalldirs ends here ntop-5.0.1+dfsg1/globals-core.c0000644000000000000000000007226012010426113014705 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * http://www.ntop.org * * Copyright (C) 1998-2012 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-core.h" #include "globals-report.h" NtopGlobals myGlobals; #if !defined(HAVE_GETOPT_H) && !defined(DARWIN) char *optarg; int optind; int opterr; int optopt; #endif #ifdef WIN32 char *version, *osName, *ntop_author, *buildDate, *configureDate, *configure_parameters, *host_system_type, *target_system_type, *compiler_cppflags, *compiler_cflags, *include_path, *system_libs, *install_path, *force_runtime; #endif static u_short _mtuSize[MAX_DLT_ARRAY]; static u_short _headerSize[MAX_DLT_ARRAY]; #ifdef WIN32 extern char _wdir[]; #endif static char *_dataFileDirs[] = { ".", #ifdef WIN32 _wdir, #endif CFG_DATAFILE_DIR, DEFAULT_NTOP_HTML_INSTALL, NULL }; static char *_pluginDirs[] = { "./plugins", CFG_PLUGIN_DIR, DEFAULT_NTOP_PLUGINS_INSTALL, NULL }; static char *_configFileDirs[] = { ".", CFG_CONFIGFILE_DIR, DEFAULT_NTOP_CFG_CONFIGFILE_DIR, #ifdef WIN32 _wdir, #else "/etc", #endif NULL }; struct in6_addr _in6addr_linklocal_allnodes; /* ************************************************************ */ void initGdbm(char *prefDirectory, /* Directory with persistent files */ char *spoolDirectory, /* Directory with temporary files (that can be deleted when ntop is not running) */ int initPrefsOnly) { struct stat statbuf; traceEvent(CONST_TRACE_INFO, "Initializing gdbm databases"); if(initPrefsOnly) { initSingleGdbm(&myGlobals.prefsFile, "prefsCache.db", prefDirectory, FALSE, NULL); initSingleGdbm(&myGlobals.pwFile, "ntop_pw.db", prefDirectory, FALSE, NULL); return; } initSingleGdbm(&myGlobals.macPrefixFile, "macPrefix.db", spoolDirectory, FALSE, &statbuf); initSingleGdbm(&myGlobals.fingerprintFile, "fingerprint.db", spoolDirectory, FALSE, &statbuf); initSingleGdbm(&myGlobals.serialFile, "hostSerials.db", spoolDirectory, TRUE, &statbuf); initSingleGdbm(&myGlobals.resolverCacheFile,"resolverCache.db",spoolDirectory, TRUE, &statbuf); initSingleGdbm(&myGlobals.topTalkersFile, "topTalkers.db", spoolDirectory, FALSE, &statbuf); createVendorTable(&statbuf); checkCommunities(); /* Check if communities are defined */ } /* ******************************* */ static void allocateOtherHosts(void) { if(myGlobals.otherHostEntry != NULL) { traceEvent(CONST_TRACE_WARNING, "Attempting to call twice allocateOtherHosts()"); return; } myGlobals.otherHostEntry = (HostTraffic*)malloc(sizeof(HostTraffic)); memset(myGlobals.otherHostEntry, 0, sizeof(HostTraffic)); myGlobals.otherHostEntry->hostIp4Address.s_addr = 0x00112233; strncpy(myGlobals.otherHostEntry->hostNumIpAddress, " ", sizeof(myGlobals.otherHostEntry->hostNumIpAddress)); strncpy(myGlobals.otherHostEntry->hostResolvedName, "Remaining Host(s)", sizeof(myGlobals.otherHostEntry->hostResolvedName)); myGlobals.otherHostEntry->hostResolvedNameType = FLAG_HOST_SYM_ADDR_TYPE_FAKE; strcpy(myGlobals.otherHostEntry->ethAddressString, "00:00:00:00:00:00"); myGlobals.otherHostEntry->portsUsage = NULL; myGlobals.otherHostEntry->l7.traffic = (ProtoTraffic*)calloc(myGlobals.l7.numSupportedProtocols+1, sizeof(ProtoTraffic)); myGlobals.otherHostEntry->serialHostIndex = ++myGlobals.hostSerialCounter; /* Start from 1 (0 = UNKNOWN_SERIAL_INDEX) */ myGlobals.otherHostEntry->magic = CONST_MAGIC_NUMBER; } /* ************************************ */ void extend8021Qmtu(void) { #ifndef MAKE_WITH_JUMBO_FRAMES /* 1500 + 14 bytes header + 4 VLAN */ _mtuSize[DLT_EN10MB] = 1500+sizeof(struct ether_header)+4; #endif } /* ************************************ */ /* * Initialize all global run-time parameters to default (reasonable!!!) values */ void initNtopGlobals(int argc, char * argv[], int argc_started, char *argv_started[]) { int i, bufLen; char *startedAs, *defaultPath, *c; /* * Notice the program name */ if((c = strrchr(argv[0], CONST_PATH_SEP)) == NULL) myGlobals.program_name = argv[0]; else myGlobals.program_name = &c[1]; /* * save command line parameters */ myGlobals.ntop_argc = argc; myGlobals.ntop_argv = argv; initUserPrefs(&myGlobals.runningPref); /* Overrides for above */ if (strcmp(myGlobals.program_name, "ntopd") == 0) { myGlobals.runningPref.daemonMode = 1; } myGlobals.checkVersionStatus = FLAG_CHECKVERSION_NOTCHECKED; myGlobals.checkVersionStatusAgain = 1; /* Search paths */ myGlobals.dataFileDirs = _dataFileDirs; myGlobals.pluginDirs = _pluginDirs; myGlobals.configFileDirs = _configFileDirs; #ifdef WIN32 defaultPath = _wdir; #else defaultPath = CFG_DBFILE_DIR; #endif myGlobals.dbPath = strdup(defaultPath); /* a NULL pointer will break the logic */ /* NB: we can't init rrdPath here, because initGdbm hasn't been run */ /* list of available NICs */ myGlobals.allDevs = NULL; /* the table of enabled NICs */ myGlobals.numDevices = 0; myGlobals.device = calloc(MAX_NUM_DEVICES, sizeof(NtopInterface)); if(myGlobals.device == NULL) { traceEvent(CONST_TRACE_WARNING, "Not enough memory :-("); exit(-1); } /* Databases */ myGlobals.pwFile = NULL; /* the table of broadcast entries */ myGlobals.broadcastEntry = NULL; /* the table of other hosts entries */ myGlobals.otherHostEntry = NULL; /* administrative */ myGlobals.shortDomainName = NULL; myGlobals.numThreads = 0; /* # of running threads */ #ifdef HAVE_OPENSSL myGlobals.sslInitialized = 0; myGlobals.runningPref.sslPort = 0; /* Disabled by default: enabled via -W */ #endif myGlobals.dnsSniffCount = 0; myGlobals.dnsSniffRequestCount = 0; myGlobals.dnsSniffFailedCount = 0; myGlobals.dnsSniffARPACount = 0; myGlobals.dnsSniffStoredInCache = 0; /* Misc */ myGlobals.separator = " "; myGlobals.thisZone = gmt2local(0); /* seconds offset from gmt to local time */ myGlobals.numPurgedHosts = 0; myGlobals.numTerminatedSessions = 0; /* Time */ myGlobals.actTime = time(NULL); myGlobals.initialSniffTime = 0; myGlobals.lastRefreshTime = 0; myGlobals.lastPktTime.tv_sec = 0; myGlobals.lastPktTime.tv_usec = 0; /* Monitored Protocols */ myGlobals.numActServices = 0; myGlobals.udpSvc = NULL; myGlobals.tcpSvc = NULL; myGlobals.ipTrafficProtosNames = NULL; myGlobals.numIpProtosToMonitor = 0; myGlobals.ipPortMapper.numElements = 0; myGlobals.ipPortMapper.theMapper = NULL; myGlobals.ipPortMapper.numSlots = 0; myGlobals.numHandledSIGPIPEerrors = 0; for(i=0; i<=1; i++) { myGlobals.numHandledRequests[i] = 0; myGlobals.numHandledBadrequests[i] = 0; myGlobals.numSuccessfulRequests[i] = 0; myGlobals.numUnsuccessfulInvalidrequests[i] = 0; myGlobals.numUnsuccessfulInvalidmethod[i] = 0; myGlobals.numUnsuccessfulInvalidversion[i] = 0; myGlobals.numUnsuccessfulTimeout[i] = 0; myGlobals.numUnsuccessfulNotfound[i] = 0; myGlobals.numUnsuccessfulDenied[i] = 0; myGlobals.numUnsuccessfulForbidden[i] = 0; } myGlobals.numSSIRequests = 0; myGlobals.numBadSSIRequests = 0; myGlobals.numHandledSSIRequests = 0; createMutex(&myGlobals.geolocalizationMutex); /* GeoIP mutex */ /* create the logView stuff Mutex first... must be before the 1st traceEvent() call */ createMutex(&myGlobals.logViewMutex); /* synchronize logView buffer */ #ifdef FORPRENPTL #warning Making version for Pre NPTL Thread Library... createMutex(&myGlobals.preNPTLlogMutex); /* synchronize logView buffer */ #endif myGlobals.logViewNext = 0; myGlobals.logView = (char**)calloc(sizeof(char*), CONST_LOG_VIEW_BUFFER_SIZE); /* traceEvent(CONST_TRACE_INFO, "Initializing semaphores, mutexes and threads"); */ /* ============================================================ * Create semaphores and mutexes associated with packet capture * ============================================================ */ #ifdef HAVE_PTHREAD_ATFORK i = pthread_atfork(NULL, NULL, &reinitMutexes); /* traceEvent(CONST_TRACE_INFO, "NOTE: atfork() handler registered for mutexes, rc %d", i); */ #endif createMutex(&myGlobals.gdbmMutex); /* data to synchronize thread access to db files */ createMutex(&myGlobals.portsMutex); /* Avoid race conditions while handling ports */ for(i=0; i */ _mtuSize[DLT_EN10MB] = 1500+sizeof(struct ether_header) /* Ethernet (10Mb) */; #endif _headerSize[DLT_EN10MB] = sizeof(struct ether_header); _mtuSize[DLT_PRONET] = 17914 /* Proteon ProNET Token Ring */; _headerSize[DLT_PRONET] = sizeof(struct tokenRing_header); _mtuSize[DLT_IEEE802] = 4096+sizeof(struct tokenRing_header) /* IEEE 802 Networks */; _headerSize[DLT_IEEE802] = 1492; /* NOTE: This has to be wrong... */ /* _mtuSize[DLT_PPP] = ? Point-to-point Protocol */ _headerSize[DLT_PPP] = CONST_PPP_HDRLEN; /* Courtesy of Richard Parvass */ _mtuSize[DLT_FDDI] = 4470 /* FDDI */; _headerSize[DLT_FDDI] = sizeof(struct fddi_header); _mtuSize[DLT_ATM_RFC1483] = 9180 /* LLC/SNAP encapsulated atm */; _headerSize[DLT_ATM_RFC1483] = 0; /* _mtuSize[DLT_RAW] = ? raw IP */ _headerSize[DLT_RAW] = 0; /* Others defined in bpf.h at tcpdump.org as of the resync - it would be NICE to have values for these... */ /* _mtuSize[DLT_EN3MB] = ? Experimental Ethernet (3Mb) */ /* _mtuSize[DLT_AX25] = ? Amateur Radio AX.25 */ /* _mtuSize[DLT_CHAOS] = ? Chaos */ /* _mtuSize[DLT_ARCNET] = ? ARCNET */ /* _mtuSize[DLT_SLIP] = ? Serial Line IP */ /* _mtuSize[DLT_SLIP_BSDOS] = ? BSD/OS Serial Line IP */ /* _mtuSize[DLT_PPP_BSDOS] = ? BSD/OS Point-to-point Protocol */ /* _mtuSize[DLT_ATM_CLIP] = ? Linux Classical-IP over ATM */ /* _mtuSize[DLT_PPP_SERIAL] = ? PPP over serial with HDLC encapsulation */ /* _mtuSize[DLT_PPP_ETHER] = ? PPP over Ethernet */ /* _mtuSize[DLT_C_HDLC] = ? Cisco HDLC */ /* _mtuSize[DLT_IEEE802_11] = ? IEEE 802.11 wireless */ /* _mtuSize[DLT_FRELAY] = ? */ /* _mtuSize[DLT_LOOP] = ? */ /* _mtuSize[DLT_LINUX_SLL] = ? */ /* _mtuSize[DLT_LTALK] = ? */ /* _mtuSize[DLT_ECONET] = ? */ /* _mtuSize[DLT_IPFILTER] = ? */ /* _mtuSize[DLT_PFLOG] = ? */ /* _mtuSize[DLT_CISCO_IOS] = ? */ /* _mtuSize[DLT_PRISM_HEADER] = ? */ /* _mtuSize[DLT_AIRONET_HEADER] = ? */ /* _mtuSize[DLT_HHDLC] = ? */ /* _mtuSize[DLT_IP_OVER_FC] = ? */ /* _mtuSize[DLT_SUNATM] = ? Solaris+SunATM */ myGlobals.mtuSize = _mtuSize; myGlobals.headerSize = _headerSize; /* ********************************** */ myGlobals.numPurgedHosts = myGlobals.numTerminatedSessions = 0; /* Dummy value just to be safe: it will be set later on */ myGlobals.l7.numSupportedProtocols = 2 * IPOQUE_MAX_SUPPORTED_PROTOCOLS; myGlobals.broadcastEntry = (HostTraffic*)malloc(sizeof(HostTraffic)); memset(myGlobals.broadcastEntry, 0, sizeof(HostTraffic)); myGlobals.broadcastEntry->l7.traffic = (ProtoTraffic*)calloc(myGlobals.l7.numSupportedProtocols+1, sizeof(ProtoTraffic)); resetHostsVariables(myGlobals.broadcastEntry); /* Set address to FF:FF:FF:FF:FF:FF */ for(i=0; iethAddress[i] = 0xFF; myGlobals.broadcastEntry->hostIp4Address.s_addr = 0xFFFFFFFF; strncpy(myGlobals.broadcastEntry->hostNumIpAddress, "broadcast", sizeof(myGlobals.broadcastEntry->hostNumIpAddress)); strncpy(myGlobals.broadcastEntry->hostResolvedName, myGlobals.broadcastEntry->hostNumIpAddress, sizeof(myGlobals.broadcastEntry->hostNumIpAddress)); myGlobals.broadcastEntry->hostResolvedNameType = FLAG_HOST_SYM_ADDR_TYPE_FAKE; strcpy(myGlobals.broadcastEntry->ethAddressString, "FF:FF:FF:FF:FF:FF"); setHostFlag(FLAG_SUBNET_LOCALHOST, myGlobals.broadcastEntry); setHostFlag(FLAG_BROADCAST_HOST, myGlobals.broadcastEntry); setHostFlag(FLAG_SUBNET_PSEUDO_LOCALHOST, myGlobals.broadcastEntry); memset(&myGlobals.broadcastEntry->hostSerial, 0, sizeof(HostSerial)); myGlobals.broadcastEntry->serialHostIndex = ++myGlobals.hostSerialCounter; /* Start from 1 (0 = UNKNOWN_SERIAL_INDEX) */ myGlobals.broadcastEntry->magic = CONST_MAGIC_NUMBER; allocateOtherHosts(); /* ********************************** */ bufLen = 0; for (i=0; ihostSerial, myGlobals.broadcastEntry->serialHostIndex); dumpHostSerial(&myGlobals.otherHostEntry->hostSerial, myGlobals.otherHostEntry->serialHostIndex); if(myGlobals.runningPref.daemonMode) { /* Before bacoming a daemon we need o make sure that ntop has been installed properly and that all the html files are on the right place */ int idx, found = 0; for(idx=0; (!found) && (myGlobals.dataFileDirs[idx] != NULL); idx++) { char tmpStr[256]; struct stat statbuf; if(strcmp(myGlobals.dataFileDirs[idx], ".") /* ignore local paths */ ) { safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "%s/html/%s", myGlobals.dataFileDirs[idx], "ntop.gif" /* This file must always exist */); if(stat(tmpStr, &statbuf) == 0) { found = 1; break; } } } if(!found) { traceEvent(CONST_TRACE_WARNING, "ntop will not become a daemon as it has not been"); traceEvent(CONST_TRACE_WARNING, "installed properly (did you do 'make install')"); } else daemonizeUnderUnix(); } /* Handle local addresses (if any) */ handleLocalAddresses(myGlobals.runningPref.localAddresses); /* Handle known subnetworks (if any) */ handleKnownAddresses(myGlobals.runningPref.knownSubnets); if((myGlobals.pcap_file_list != NULL) && (myGlobals.runningPref.localAddresses == NULL)) { char *any_net = "0.0.0.0/0"; traceEvent(CONST_TRACE_WARNING, "-m | local-subnets must be specified when the -f option is used" "Assuming %s", any_net); myGlobals.runningPref.localAddresses = strdup(any_net); } if(myGlobals.runningPref.currentFilterExpression != NULL) parseTrafficFilter(); else myGlobals.runningPref.currentFilterExpression = strdup(""); /* so that it isn't NULL! */ /* Handle flows (if any) */ handleFlowsSpecs(); createPortHash(); initCounters(); initApps(); initThreads(); #ifndef MAKE_MICRO_NTOP traceEvent(CONST_TRACE_NOISY, "Starting Plugins"); startPlugins(); traceEvent(CONST_TRACE_NOISY, "Plugins started... continuing with initialization"); #endif #if defined(MEMORY_DEBUG) && defined(MAKE_WITH_SAFER_ROUTINES) resetLeaks(); #endif addNewIpProtocolToHandle("IGMP", 2, 0 /* no proto */); addNewIpProtocolToHandle("OSPF", 89, 0 /* no proto */); addNewIpProtocolToHandle("IPsec", 50, 51); init_maps(); loadGeoIP(); /* Note that by default ntop will merge network interfaces */ if(myGlobals.runningPref.mergeInterfaces == 0) traceEvent(CONST_TRACE_ALWAYSDISPLAY, "NOTE: Interface merge disabled by default"); else traceEvent(CONST_TRACE_ALWAYSDISPLAY, "NOTE: Interface merge enabled by default"); if(fetchPrefsValue("globals.displayPolicy", value, sizeof(value)) == -1) { myGlobals.hostsDisplayPolicy = showAllHosts /* 0 */; storePrefsValue("globals.displayPolicy", "0"); } else { myGlobals.hostsDisplayPolicy = atoi(value); /* Out of range check */ if((myGlobals.hostsDisplayPolicy < showAllHosts) || (myGlobals.hostsDisplayPolicy > showOnlyRemoteHosts)) myGlobals.hostsDisplayPolicy = showAllHosts; } if(fetchPrefsValue("globals.localityPolicy", value, sizeof(value)) == -1) { myGlobals.localityDisplayPolicy = showSentReceived /* 0 */; storePrefsValue("globals.localityPolicy", "0"); } else { myGlobals.localityDisplayPolicy = atoi(value); /* Out of range check */ if((myGlobals.localityDisplayPolicy < showSentReceived) || (myGlobals.localityDisplayPolicy > showOnlyReceived)) myGlobals.localityDisplayPolicy = showSentReceived; } if(myGlobals.runningPref.skipVersionCheck != TRUE) { pthread_t myThreadId; createThread(&myThreadId, checkVersion, NULL); } } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* This routine enforces the state change rules * * * Valid state transitions: * 0->1 When ntop first starts up, after memset(myGlobals) * 1->2 After the basic system protective environment is up... * 2->3 When ntop gives up root * 3->4 When ntop finishes initialization *Or 2->4 When ntop finishes initialization on systems w/o root, e.g. Win32 * 4->5, 6, 7 Stopcap to keep webserver up after a problem or Shutdown on user request * 5->6, 7 Shutdown requested * 6->7 Shutdown running * 7->8 Shutdown complete * 8->1 (restart) FUTURE... * */ short _setRunState(char *file, int line, short newRunState) { static short stateTransitionTable[FLAG_NTOPSTATE_TERM+1][FLAG_NTOPSTATE_TERM+1]; static char *stateTransitionTableNames[FLAG_NTOPSTATE_TERM+1]; static short stateTransitionTableLoaded=0; if(stateTransitionTableLoaded == 0) { /* One time load */ int i; for(i=0; i * * http://www.ntop.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" /* ***************************** */ static void handlePacket(const struct pcap_pkthdr *h, const u_char *p) { /* Put here the code for handling packets that match the specified BPF filter */ } /* ****************************** */ static void initFunct() { /* Put here all the code that should be called when this plugin is started up */ traceEvent(CONST_TRACE_ALWAYSDISPLAY, "XXXXXXXX: Welcome to ntop xxxxxxxx"); } /* ****************************** */ static void termFunct() { /* Put here all the code that should be called when this plugin is terminated */ traceEvent(CONST_TRACE_INFO, "XXXXXXXX: Thanks for using ntop xxxxxxxx"); traceEvent(CONST_TRACE_ALWAYSDISPLAY, "XXXXXXXX: Done"); } /* ****************************** */ static void handlePluginHTTPrequest(char* url) { /* handle HTTP requests here */ } /* ****************************** */ static PluginInfo pluginInfo[] = { { VERSION, /* current ntop version */ "put here the plugin name as it will appere", "describe what this plugin does", "1.0", /* plugin version */ "Put here the author name", "shortPluginName", /* http://:/plugins/shortPluginName */ 0, /* Active by default */ ViewConfigure, 1, /* Inactive setup */ initFunction, /* InitFunc */ termFunction, /* TermFunc */ handlePacket, /* PluginFunc */ handlePluginHTTPrequest, "", /* BPF filter */ NULL , /* no status */ NULL /* no extra pages */ } }; /* Plugin entry fctn */ #ifdef STATIC_PLUGIN PluginInfo* myPluginEntryFctn() { #else PluginInfo* PluginEntryFctn() { #endif /* Put here the initialization functions */ return(pluginInfo); } ntop-5.0.1+dfsg1/autotoolversions0000644000000000000000000000007210240473766015565 0ustar rootroot automake 1.9.2 Autoconf 2.59 libtool 1.5.6 ntop-5.0.1+dfsg1/missing0000755000000000000000000002415212010426113013564 0ustar rootroot#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ntop-5.0.1+dfsg1/report.c0000644000000000000000000067541412010426113013661 0ustar rootroot/* * Copyright (C) 1998-2012 Luca Deri * * http://www.ntop.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-report.h" static int network_mode_sort; /* *************************** */ void printBandwidthFooter(void) { sendString("

NOTE:

\n
    " "
  • You can define " "new communities.
  • \n" "
  • Click here " "for more information about host and domain sorting.
  • \n" "
  • Inbound and outbound values are the percentage of the total bytes that " "ntop has seen on the interface. Hover the mouse to see the actual " "value (rounded to the nearest full percentage point). The total of the " "values will NOT be 100% as local traffic will be counted TWICE (once as " "sent and again as received).
  • \n" "
  • The SENT bandwidth is shown as " "\"Sent\"" " and the RECEIVED bandwidth is shown as " "\"Received\"
  • \n" "

"); } /* ******************************* */ void checkReportDevice(void) { int i; char value[LEN_SMALL_WORK_BUFFER]; /* Show device table */ for(i=0; i= myGlobals.numDevices) { traceEvent(CONST_TRACE_WARNING, "INITWEB: Reporting device (%d) invalid (> max, %d), defaulting to 0", atoi(value), myGlobals.numDevices); storePrefsValue("actualReportDeviceId", "0"); } /* Retrieve it */ if(fetchPrefsValue("actualReportDeviceId", value, sizeof(value)) == -1) { myGlobals.actualReportDeviceId = 0; } else { myGlobals.actualReportDeviceId = atoi(value); } if(myGlobals.device[myGlobals.actualReportDeviceId].virtualDevice) { /* Bad idea, set to 1st non-virtual device */ traceEvent(CONST_TRACE_WARNING, "INITWEB: Reporting device (%d) invalid (virtual), using 1st non-virtual device", i); for(i=0; i= 1) { safe_snprintf(__FILE__, __LINE__, prevBuf, sizeof(prevBuf), "\"Back " "\"Prior", url, separator, netmode, shortBuf, url, separator, pageNum-1, netmode, shortBuf); } else prevBuf[0] = '\0'; if(actPage < numPages) { safe_snprintf(__FILE__, __LINE__, nextBuf, sizeof(nextBuf), "\"Next " "\"Forward", url, separator, pageNum+1, netmode, shortBuf, url, separator, numPages-1, netmode, shortBuf); } else nextBuf[0] = '\0'; sendString("

"); sendString("\n"); sendString(prevBuf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", actPage, numPages); sendString(buf); sendString(nextBuf); sendString("
[ %d / %d ]
\n"); sendString("
\n"); } /* ******************************* */ void printTrafficSummary (int revertOrder) { Counter unicastPkts; int i; char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32]; struct pcap_stat pcapStat; int beginUnique = (myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[0] == '/') ? 1 : 0; unicastPkts = 0; printHTMLheader("Global Traffic Summary", NULL, 0); sendString("

"TABLE_ON"\n"); sendString("" "\n"); if(myGlobals.runningPref.domainName[0] != '\0') { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", myGlobals.runningPref.domainName); sendString(buf); } if(myGlobals.pcap_file_list == NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", ctime(&myGlobals.initialSniffTime), formatSeconds(time(NULL)-myGlobals.initialSniffTime, formatBuf, sizeof(formatBuf))); sendString(buf); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", ctime(&myGlobals.initialSniffTime)); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", ctime((time_t *)&myGlobals.lastPktTime), formatSeconds(myGlobals.lastPktTime.tv_sec-myGlobals.initialSniffTime, formatBuf, sizeof(formatBuf))); sendString(buf); } if((i = numActiveSenders(myGlobals.actualReportDeviceId)) > 0) { /* Do NOT add a '/' at the end of the path because Win32 will complain about it */ struct stat statbuf; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/interfaces/%s", myGlobals.rrdPath != NULL ? myGlobals.rrdPath : ".", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique]); revertSlashIfWIN32(buf, 0); if(stat(buf, &statbuf) != 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", i, myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno); sendString(buf); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(myGlobals.actTime-3600), (unsigned int)myGlobals.actTime, "Total+Number+of+Hosts"); sendString(buf); } } if((myGlobals.runningPref.currentFilterExpression != NULL) && (myGlobals.runningPref.currentFilterExpression[0] != '\0')) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", myGlobals.runningPref.currentFilterExpression); sendString(buf); } if(myGlobals.numDevices > 1) { int found = 0; for(i=0; i 0) { found = 1; break; } if(found) { sendString("\n"); } } if(myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value > 0) { unicastPkts = myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value - myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value - myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value; if(myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value <= 0) myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value = 1; if(myGlobals.device[myGlobals.actualReportDeviceId].pcapPtr != NULL) { if(pcap_stats(myGlobals.device[myGlobals.actualReportDeviceId].pcapPtr, &pcapStat) >= 0) { Counter realDropped; /* Recent libpcap versions do not report total/cumulative values but their value is reset everytime is read */ if(myGlobals.device[myGlobals.actualReportDeviceId].receivedPkts.value > pcapStat.ps_recv) { /* The counter is reset at each run */ realDropped = (myGlobals.device[myGlobals.actualReportDeviceId].pcapDroppedPkts.value += pcapStat.ps_drop); } else { /* The counter is NOT reset at each run */ myGlobals.device[myGlobals.actualReportDeviceId].pcapDroppedPkts.value = pcapStat.ps_drop; realDropped = myGlobals.device[myGlobals.actualReportDeviceId].pcapDroppedPkts.value - myGlobals.device[myGlobals.actualReportDeviceId].initialPcapDroppedPkts.value; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(realDropped, formatBuf, sizeof(formatBuf)), (float)(realDropped*100) /(float)myGlobals.device[myGlobals.actualReportDeviceId].receivedPkts.value); sendString(buf); } } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].droppedPkts.value, formatBuf, sizeof(formatBuf)), (float)(myGlobals.device[myGlobals.actualReportDeviceId].droppedPkts.value*100) /(float)myGlobals.device[myGlobals.actualReportDeviceId].receivedPkts.value); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(unicastPkts, formatBuf, sizeof(formatBuf)), (float)(100*unicastPkts)/(float)myGlobals.device[myGlobals.actualReportDeviceId]. ethernetPkts.value); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value, formatBuf, sizeof(formatBuf)), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value, formatBuf, sizeof(formatBuf)), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), myGlobals.mtuSize[myGlobals.device[myGlobals.actualReportDeviceId].datalink], formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.tooLong.value, formatBuf, sizeof(formatBuf)), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.tooLong.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value); sendString(buf); /* ****************** */ if(!myGlobals.device[myGlobals.actualReportDeviceId].dummyDevice) { sendString("\n"); } } /* ********************* */ sendString("
Network Interface(s)"); sendString(""TABLE_ON"\n" "" "" ""); sendString(""); sendString("\n"); for(i=0; i", myGlobals.device[i].humanFriendlyName[0] != '\0' ? myGlobals.device[i].humanFriendlyName : " "); else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", custom_if_name, (custom_if_name[0] != '\0') ? custom_if_name : ((myGlobals.device[i].uniqueIfName[0] != '\0') ? myGlobals.device[i].uniqueIfName : " "), myGlobals.device[i].name); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.device[i].name); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getNwInterfaceType(i), myGlobals.device[i].virtualDevice ? " virtual" : ""); sendString(buf); sendString(""); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.device[i].samplingRate); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.mtuSize[myGlobals.device[i].datalink]); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.headerSize[myGlobals.device[i].datalink]); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", _intoa(myGlobals.device[i].ifAddr, buf1, sizeof(buf1))); sendString(buf); sendString(""); sendString("\n"); } } sendString("
NameDeviceTypeSpeedSampling RateMTUHeaderAddressIPv6 Addresses
" "%s
" "%s " "\"Change%s%s%s "); if(myGlobals.device[i].deviceSpeed > 0) { /* The speed is known */ sendString(formatAdapterSpeed(myGlobals.device[i].deviceSpeed, formatBuf, sizeof(formatBuf))); } else sendString(" "); sendString("%d%d%d%s"); #ifdef INET6 if(myGlobals.device[i].v6Addrs > 0) { NtopIfaceAddr *ifaddr; for(ifaddr = myGlobals.device[i].v6Addrs; ifaddr != NULL; ifaddr = ifaddr->next) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/%d
", _intop(&ifaddr->af.inet6.ifAddr, buf1, sizeof(buf1)), ifaddr->af.inet6.prefixlen); sendString(buf); } } else #endif sendString(" "); sendString("
"TABLE_OFF); sendString("
Local Domain Name%s 
Capturing Since%s [%s]
Capturing Since%s
Last Packet Seen%s [%s]
Hosts[%u active] [%u total]
Hosts" "[%u active " "]", i, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(myGlobals.actTime-3600), (unsigned int)myGlobals.actTime, "Active+End+Nodes"); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), " [%u total " "]" "
Traffic Filter%s
"); interfaceTrafficPie(); sendString("
Dropped (libpcap)%s(%.1f%%)
Dropped (ntop)%s(%.1f%%)
Unicast%s(%.1f%%)
Broadcast%s(%.1f%%)
Multicast%s(%.1f%%)
Packets too long [> %d]%s(%.1f%%)
Network Load\n"); updateThpt(0); drawThroughputMeter(); sendString(""); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].actualThpt, 1, formatBuf, sizeof(formatBuf)), myGlobals.device[myGlobals.actualReportDeviceId].actualPktsThpt); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].lastMinThpt, 1, formatBuf, sizeof(formatBuf)), myGlobals.device[myGlobals.actualReportDeviceId].lastMinPktsThpt); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].lastFiveMinsThpt, 1, formatBuf, sizeof(formatBuf)), myGlobals.device[myGlobals.actualReportDeviceId].lastFiveMinsPktsThpt); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].peakThroughput, 1, formatBuf, sizeof(formatBuf)), myGlobals.device[myGlobals.actualReportDeviceId].peakPacketThroughput); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value/ (myGlobals.actTime-myGlobals.initialSniffTime+1), 1, formatBuf, sizeof(formatBuf)), /* Bug below fixed courtesy of Eddy Lai */ ((float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value/ (float)(myGlobals.actTime-myGlobals.initialSniffTime+1))); sendString(buf); sendString("
Actual%s%.1f Pkt/s
Last Minute%s%.1f Pkt/s
Last 5 Minutes%s%.1f Pkt/s
Peak%s%.1f Pkt/s
Average%s%.1f Pkt/s
"TABLE_OFF"
\n"); printProtoTraffic(FALSE); sendString("

\n"); } /* ******************************* */ void printTrafficStatistics(int revertOrder) { Counter unicastPkts, avgPktLen; int i; char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32], formatBuf1[32]; struct stat statbuf; struct pcap_stat pcapStat; int beginUnique = (myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[0] == '/') ? 1 : 0; unicastPkts = 0; printHTMLheader("Global Traffic Statistics", NULL, BITFLAG_HTML_NO_HEADING); sendString("\n" "

\n" "
\n" " \n" "
\n"); sendString("
"TABLE_ON"\n"); sendString("" "\n"); if(myGlobals.runningPref.domainName[0] != '\0') { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", myGlobals.runningPref.domainName); sendString(buf); } if(myGlobals.pcap_file_list == NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", ctime(&myGlobals.initialSniffTime), formatSeconds(time(NULL)-myGlobals.initialSniffTime, formatBuf, sizeof(formatBuf))); sendString(buf); } else { time_t t = myGlobals.lastPktTime.tv_sec; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", ctime(&myGlobals.initialSniffTime)); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", ctime(&t), formatSeconds(myGlobals.lastPktTime.tv_sec-myGlobals.initialSniffTime, formatBuf, sizeof(formatBuf))); sendString(buf); } if((i = numActiveSenders(myGlobals.actualReportDeviceId)) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/interfaces/%s", myGlobals.rrdPath != NULL ? myGlobals.rrdPath : ".", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique]); revertSlashIfWIN32(buf, 0); if(stat(buf, &statbuf) != 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", i, myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno); sendString(buf); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(myGlobals.actTime-3600), (unsigned int)myGlobals.actTime, "Total+Number+of+Hosts"); sendString(buf); } } if((myGlobals.runningPref.currentFilterExpression != NULL) && (myGlobals.runningPref.currentFilterExpression[0] != '\0')) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", myGlobals.runningPref.currentFilterExpression); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", myGlobals.device[myGlobals.actualReportDeviceId].numSessions, myGlobals.device[myGlobals.actualReportDeviceId].maxNumSessions); sendString(buf); if(myGlobals.numDevices > 1) { int found = 0; for(i=0; i 0) { found = 1; break; } if(found) { sendString("\n"); } } sendString("
Network Interface(s)"); sendString(""TABLE_ON"\n" "" "" ""); sendString(""); sendString("\n"); for(i=0; i", myGlobals.device[i].humanFriendlyName[0] != '\0' ? myGlobals.device[i].humanFriendlyName : " "); else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", (custom_if_name[0] != '\0') ? custom_if_name : ((myGlobals.device[i].uniqueIfName[0] != '\0') ? myGlobals.device[i].uniqueIfName : " "), myGlobals.device[i].name); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.device[i].name); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getNwInterfaceType(i), myGlobals.device[i].virtualDevice ? " virtual" : ""); sendString(buf); sendString(""); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.device[i].samplingRate); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.mtuSize[myGlobals.device[i].datalink]); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.headerSize[myGlobals.device[i].datalink]); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", _intoa(myGlobals.device[i].ifAddr, buf1, sizeof(buf1))); sendString(buf); sendString(""); sendString("\n"); } } sendString("
NameDeviceTypeSpeedSampling RateMTUHeaderAddressIPv6 Addresses
" "%s
" "%s " "\"Change%s%s%s "); if(myGlobals.device[i].deviceSpeed > 0) { /* The speed is known */ sendString(formatAdapterSpeed(myGlobals.device[i].deviceSpeed, formatBuf, sizeof(formatBuf))); } else sendString(" "); sendString("%d%d%d%s"); #ifdef INET6 if(myGlobals.device[i].v6Addrs > 0) { NtopIfaceAddr *ifaddr; for(ifaddr = myGlobals.device[i].v6Addrs; ifaddr != NULL; ifaddr = ifaddr->next) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/%d
", _intop(&ifaddr->af.inet6.ifAddr, buf1, sizeof(buf1)), ifaddr->af.inet6.prefixlen); sendString(buf); } } else #endif sendString(" "); sendString("
"TABLE_OFF); sendString("
Local Domain Name%s 
Capturing Since%s [%s]
Capturing Since%s
Last Packet Seen%s [%s]
Hosts[%u active] [%u total]
Hosts" "[%u active " "]", i, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(myGlobals.actTime-3600), (unsigned int)myGlobals.actTime, "Active+End+Nodes"); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), " [%u total " "]" "
Traffic Filter%s
Active Sessions%u [Max: %u]
"); interfaceTrafficPie(); sendString("
"TABLE_OFF"
\n"); sendString("\n
\n"); sendString("\n\n
\n"); if(myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value > 0) { Counter dummyCounter; sendString("
"TABLE_ON"\n"); sendString("" ""); /* ************************ */ if(myGlobals.runningPref.enableSessionHandling && drawHostsDistanceGraph(1)) { sendString("\n"); } if(!myGlobals.device[myGlobals.actualReportDeviceId].dummyDevice) { updateThpt(0); sendString("\n"); } /* ********************* */ if(strcmp(myGlobals.device[0].name, "pcap-file")) { /* RRD */ /* Do NOT add a '/' at the end of the path because Win32 will complain about it */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/interfaces/%s", myGlobals.rrdPath != NULL ? myGlobals.rrdPath : ".", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique]); revertSlashIfWIN32(buf, 0); if((i = stat(buf, &statbuf)) == 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n" "\n", getRowColor(), &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique]); sendString(buf); } } /* ********************* */ sendString("
Packets\n" "\n"); unicastPkts = myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value - myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value - myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value; if(myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value <= 0) myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value = 1; if(myGlobals.device[myGlobals.actualReportDeviceId].pcapPtr != NULL) { if(pcap_stats(myGlobals.device[myGlobals.actualReportDeviceId].pcapPtr, &pcapStat) >= 0) { /* Recent libpcap versions do not report total/cumulative values but their value is reset everytime is read */ if(myGlobals.device[myGlobals.actualReportDeviceId].receivedPkts.value > pcapStat.ps_recv) { /* The counter is reset at each run */ myGlobals.device[myGlobals.actualReportDeviceId].pcapDroppedPkts.value += pcapStat.ps_drop; } else { /* The counter is NOT reset at each run */ myGlobals.device[myGlobals.actualReportDeviceId].pcapDroppedPkts.value = pcapStat.ps_drop; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(myGlobals.device[myGlobals.actualReportDeviceId].pcapDroppedPkts.value*100) /(float)myGlobals.device[myGlobals.actualReportDeviceId].receivedPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].pcapDroppedPkts.value, formatBuf, sizeof(formatBuf))); sendString(buf); } } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(myGlobals.device[myGlobals.actualReportDeviceId].droppedPkts.value*100) /(float)myGlobals.device[myGlobals.actualReportDeviceId].receivedPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].droppedPkts.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].receivedPkts.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*unicastPkts)/(float)myGlobals.device[myGlobals.actualReportDeviceId]. ethernetPkts.value, formatPkts(unicastPkts, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].broadcastPkts.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].multicastPkts.value, formatBuf, sizeof(formatBuf))); sendString(buf); if(myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value > 0) { sendString("\n"); } if(!myGlobals.device[myGlobals.actualReportDeviceId].dummyDevice) { /* Very rudimental formula. Note that as specified in RMON, packets smaller than 64 or larger than 1518 octets are not counted. */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.shortest.value, formatBuf, sizeof(formatBuf))); sendString(buf); avgPktLen = (96*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo128.value +192*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo256.value +384*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo512.value +768*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo1024.value +1271*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo1518.value)/ (myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value+1); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(avgPktLen, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.longest.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.upTo64.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo64.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.upTo128.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo128.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.upTo256.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo256.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.upTo512.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo512.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.upTo1024.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo1024.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.upTo1518.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo1518.value, formatBuf, sizeof(formatBuf))); sendString(buf); #ifdef MAKE_WITH_JUMBO_FRAMES safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.upTo2500.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo2500.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.upTo6500.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo6500.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.upTo9000.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.upTo9000.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.above9000.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.above9000.value, formatBuf, sizeof(formatBuf))); sendString(buf); #else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktStats.above1518.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.above1518.value, formatBuf, sizeof(formatBuf))); sendString(buf); #endif /* MAKE_WITH_JUMBO_FRAMES */ if(myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value > 0) { sendString("\n"); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), myGlobals.mtuSize[myGlobals.device[myGlobals.actualReportDeviceId].datalink], (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.tooLong.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktStats.tooLong.value, formatBuf, sizeof(formatBuf))); sendString(buf); } /* ****************** */ sendString("
Dropped (libpcap)%.1f%%%s
Dropped (ntop)%.1f%%%s
Total Received (ntop)%s
Total Packets Processed%s
Unicast%.1f%%%s
Broadcast%.1f%%%s
Multicast%.1f%%%s
"); pktCastDistribPie(); sendString("
Shortest%s bytes
Average Size%s bytes
Longest%s bytes
Size <= 64 bytes%.1f%%%s
64 < Size <= 128 bytes%.1f%%%s
128 < Size <= 256 bytes%.1f%%%s
256 < Size <= 512 bytes%.1f%%%s
512 < Size <= 1024 bytes%.1f%%%s
1024 < Size <= 1518 bytes%.1f%%%s
1518 < Size <= 2500 bytes%.1f%%%s
2500 < Size <= 6500 bytes%.1f%%%s
6500 < Size <= 9000 bytes%.1f%%%s
> 9000 bytes%.1f%%%s
Size > 1518 bytes%.1f%%%s
"); pktSizeDistribPie(); sendString("
Packets too long [> %d]%.1f%%%s
"TABLE_OFF"
Traffic\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatBytes(myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatBytes(myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value, formatBuf1, sizeof(formatBuf1))); sendString(buf); if(myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatBytes(myGlobals.device[myGlobals.actualReportDeviceId].fragmentedIpBytes.value, 1, formatBuf, sizeof(formatBuf)), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId].fragmentedIpBytes.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value); sendString(buf); } /* Just in case... */ if(myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value > myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value) dummyCounter = myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value- myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value; else dummyCounter = 0; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatBytes(dummyCounter, 1, formatBuf, sizeof(formatBuf))); sendString(buf); if(myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value > 0) { sendString("\n"); } /* ********************* */ if(myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value > 0) { int avgPktTTL; avgPktTTL = (int)((16*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo32.value +48*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo64.value +80*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo96.value +112*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo128.value +144*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo160.value +176*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo192.value +208*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo224.value +240*myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo255.value)/ myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value); if(avgPktTTL > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), avgPktTTL); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktTTLStats.upTo32.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo32.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktTTLStats.upTo64.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo64.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktTTLStats.upTo96.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo96.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktTTLStats.upTo128.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo128.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktTTLStats.upTo160.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo160.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktTTLStats.upTo192.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo192.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktTTLStats.upTo224.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo224.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), (float)(100*myGlobals.device[myGlobals.actualReportDeviceId]. rcvdPktTTLStats.upTo255.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value, formatPkts(myGlobals.device[myGlobals.actualReportDeviceId].rcvdPktTTLStats.upTo255.value, formatBuf, sizeof(formatBuf))); sendString(buf); sendString("\n"); } } sendString("
Total%s [%s Pkts]
IPv4 Traffic%s [%s Pkts]
Fragmented IPv4 Traffic%s [%.1f%%]
Non IPv4 Traffic%s
"); drawTrafficPie(); sendString("
Average TTL%d
TTL <= 32%.1f%%%s
32 < TTL <= 64%.1f%%%s
64 < TTL <= 96%.1f%%%s
96 < TTL <= 128%.1f%%%s
128 < TTL <= 160%.1f%%%s
160 < TTL <= 192%.1f%%%s
192 < TTL <= 224%.1f%%%s
224 < TTL <= 256%.1f%%%s
"); pktTTLDistribPie(); sendString("
"TABLE_OFF"
Remote Hosts Distance"); drawHostsDistanceGraph(0); sendString("
Network Load\n"); if(myGlobals.device[myGlobals.actualReportDeviceId].actualThpt > 0) { drawThroughputMeter(); } sendString(""); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].actualThpt, 1, formatBuf, sizeof(formatBuf)), myGlobals.device[myGlobals.actualReportDeviceId].actualPktsThpt); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].lastMinThpt, 1, formatBuf, sizeof(formatBuf)), myGlobals.device[myGlobals.actualReportDeviceId].lastMinPktsThpt); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].lastFiveMinsThpt, 1, formatBuf, sizeof(formatBuf)), myGlobals.device[myGlobals.actualReportDeviceId].lastFiveMinsPktsThpt); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].peakThroughput, 1, formatBuf, sizeof(formatBuf)), myGlobals.device[myGlobals.actualReportDeviceId].peakPacketThroughput); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n", getRowColor(), formatThroughput(myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value/ (myGlobals.actTime-myGlobals.initialSniffTime+1), 1, formatBuf, sizeof(formatBuf)), /* Bug below fixed courtesy of Eddy Lai */ ((float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value/ (float)(myGlobals.actTime-myGlobals.initialSniffTime+1))); sendString(buf); #if 0 sendString("\n"); #endif #if 0 sendString("\n"); #endif sendString("
Actual%s%.1f Pkt/s
Last Minute%s%.1f Pkt/s
Last 5 Minutes%s%.1f Pkt/s
Peak%s%.1f Pkt/s
Average%s%.1f Pkt/s
" "" "
"TABLE_OFF"
Historical Data" "[ " "\"View ]" "
\n"); sendString("\n
\n"); } sendString("\n\n
\n"); printProtoTraffic(TRUE); sendString("\n
\n"); sendString("
\n
\n"); } /* ******************************* */ int combineReportTypeLocality(int reportTypeReq, LocalityDisplayPolicy showLocalityMode) { int rc = reportTypeReq; switch(reportTypeReq) { case SORT_DATA_HOST_TRAFFIC: switch(showLocalityMode) { case showOnlySent: rc = SORT_DATA_SENT_HOST_TRAFFIC; break; case showOnlyReceived: rc = SORT_DATA_RCVD_HOST_TRAFFIC; default: /* Nothign to do */ break; } break; case SORT_DATA_PROTOS: switch(showLocalityMode) { case showOnlySent: rc = SORT_DATA_SENT_PROTOS; break; case showOnlyReceived: rc = SORT_DATA_RECEIVED_PROTOS; default: /* Nothign to do */ break; } break; case SORT_DATA_IP: switch(showLocalityMode) { case showOnlySent: rc = SORT_DATA_SENT_IP; break; case showOnlyReceived: rc = SORT_DATA_RECEIVED_IP; default: /* Nothign to do */ break; } break; case SORT_DATA_THPT: switch(showLocalityMode) { case showOnlySent: rc = SORT_DATA_SENT_THPT; break; case showOnlyReceived: rc = SORT_DATA_RECEIVED_THPT; default: /* Nothign to do */ break; } break; default: /* Nothing to do */ break; } return(rc); } /* ******************************* */ void printHostsTraffic(int reportTypeReq, int sortedColumn, int revertOrder, int pageNum, char* url, HostsDisplayPolicy showHostsMode, LocalityDisplayPolicy showLocalityMode, int vlanId) { u_int idx, idx1, numEntries=0; int printedEntries=0, hourId, maxHosts; char theDate[8]; struct tm t; HostTraffic *el; HostTraffic** tmpTable; char buf[LEN_GENERAL_WORK_BUFFER*2], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; float sentPercent=0, rcvdPercent=0, totPercent=0; Counter totIpBytesSent=0, totIpBytesRcvd=0, totIpBytes=0; Counter totEthBytesSent=0, totEthBytesRcvd=0, totEthBytes=0; ProtocolsList *protoList; char formatBuf[32], formatBuf1[32], formatBuf2[32], formatBuf3[32], formatBuf4[32], formatBuf7[32], formatBuf8[32]; int reportType; u_char *vlanList; vlanList = calloc(1, MAX_VLAN); if(vlanList == NULL) return; vlanId = abs(vlanId); /* traceEvent(CONST_TRACE_INFO, "---> VLAN: %d", vlanId); */ reportType = combineReportTypeLocality(reportTypeReq, showLocalityMode); memset(buf, 0, sizeof(buf)); switch(reportType) { case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_HOST_TRAFFIC: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Network Activity: "); break; case SORT_DATA_RECEIVED_PROTOS: case SORT_DATA_SENT_PROTOS: case SORT_DATA_PROTOS: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Network Traffic [All Protocols]: "); break; case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_IP: case SORT_DATA_IP: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Network Traffic [IP]: "); break; case SORT_DATA_RECEIVED_THPT: case SORT_DATA_SENT_THPT: case SORT_DATA_THPT: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Network Throughput: "); break; default: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "?: "); break; } switch(showHostsMode) { case showAllHosts: strncat(buf, "All L3 Hosts", (sizeof(buf) - strlen(buf) - 1)); break; case showOnlyLocalHosts: strncat(buf, "Local L3 Hosts", (sizeof(buf) - strlen(buf) - 1)); break; case showOnlyRemoteHosts: strncat(buf, "Remote L3 Hosts", (sizeof(buf) - strlen(buf) - 1)); break; } switch(showLocalityMode) { case showSentReceived: strncat(buf, " - Data Sent+Received", (sizeof(buf) - strlen(buf) - 1)); break; case showOnlySent: strncat(buf, " - Data Sent", (sizeof(buf) - strlen(buf) - 1)); break; case showOnlyReceived: strncat(buf, " - Data Received", (sizeof(buf) - strlen(buf) - 1)); break; } /* Compute VLANs */ for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) if((el->vlanId > 0) && (el->vlanId < MAX_VLAN)) vlanList[el->vlanId] = 1; printHTMLheader(buf, NULL, 0); printHeader(reportTypeReq, revertOrder, abs(sortedColumn), showHostsMode, showLocalityMode, (char*)vlanList, vlanId); strftime(theDate, 8, CONST_TOD_HOUR_TIMESPEC, localtime_r(&myGlobals.actTime, &t)); hourId = atoi(theDate); maxHosts = myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno; /* Save ths as it can change */ tmpTable = (HostTraffic**)mallocAndInitWithReportWarn(maxHosts*sizeof(HostTraffic*), "printHostsTraffic"); if(tmpTable == NULL) { free(vlanList); return; } for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { /* Ignore L2 hosts */ if(el->l2Host) continue; if(broadcastHost(el) == 0) { u_char addHost; if((vlanId > 0) && (vlanId < MAX_VLAN) && (el->vlanId != vlanId)) continue; if(el->community && (!isAllowedCommunity(el->community))) continue; if(((showLocalityMode == showOnlySent) && (el->bytesSent.value > 0)) || ((showLocalityMode == showOnlyReceived) && (el->bytesRcvd.value > 0)) || ((showLocalityMode == showSentReceived) && (el->bytesSent.value + el->bytesRcvd.value > 0))) { if(((reportType == SORT_DATA_RECEIVED_IP) || (reportType == SORT_DATA_SENT_IP) || (reportType == SORT_DATA_IP)) && (el->hostNumIpAddress[0] == '\0')) { continue; } if(el->ipProtosList == NULL) continue; addHost = 1; switch(myGlobals.hostsDisplayPolicy) { case showOnlyLocalHosts: if(!subnetPseudoLocalHost(el)) addHost = 0; break; case showOnlyRemoteHosts: if(subnetPseudoLocalHost(el)) addHost = 0; break; default: /* Nothign to do */ break; } if(addHost) { tmpTable[numEntries++] = el; if(numEntries >= (maxHosts-1)) break; } } } } /* for */ if(numEntries > 0) { /* The switch below is needed to: - sort data according to the selected column - 'recycle' (somebody would call this "code reuse") the cmpFctn function */ if(sortedColumn == FLAG_HOST_DUMMY_IDX) myGlobals.columnSort = FLAG_HOST_DUMMY_IDX; /* Host name */ else if(sortedColumn == FLAG_DOMAIN_DUMMY_IDX) myGlobals.columnSort = FLAG_DOMAIN_DUMMY_IDX; /* domain name */ else myGlobals.columnSort = sortedColumn; #ifdef DEBUG traceEvent(CONST_TRACE_INFO, ">reportType=%d/sortedColumn=%d/myGlobals.columnSort=%d<", reportType, sortedColumn, myGlobals.columnSort); #endif myGlobals.reportKind = reportType; /* if(myGlobals.columnSort == 0) myGlobals.reportKind = 0;*/ qsort(tmpTable, numEntries, sizeof(HostTraffic*), cmpFctn); if(0) { int i; for(i=0; ihostResolvedName); } switch(reportType) { case SORT_DATA_RECEIVED_PROTOS: case SORT_DATA_SENT_PROTOS: totEthBytesSent = totEthBytesRcvd = 0; for(idx=0; idxbytesSent.value; totEthBytesRcvd += tmpTable[idx]->bytesRcvd.value; } } /* Avoid core dumps */ if(totEthBytesSent == 0) totEthBytesSent = 1; if(totEthBytesRcvd == 0) totEthBytesRcvd = 1; break; case SORT_DATA_PROTOS: totEthBytes = 0; for(idx=0; idxbytesSent.value + tmpTable[idx]->bytesRcvd.value; } } /* Avoid core dumps */ if(totEthBytes == 0) totEthBytes = 1; break; case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_IP: totIpBytesSent = totIpBytesRcvd = 0; for(idx=0; idxipv4BytesSent.value; totIpBytesRcvd += tmpTable[idx]->ipv4BytesRcvd.value; } } /* Avoid core dumps */ if(totIpBytesSent == 0) totIpBytesSent = 1; if(totIpBytesRcvd == 0) totIpBytesRcvd = 1; break; case SORT_DATA_IP: totIpBytes = 0; for(idx=0; idxipv4BytesSent.value + tmpTable[idx]->ipv4BytesRcvd.value; } } /* Avoid core dumps */ if(totIpBytes == 0) totIpBytes = 1; break; } #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "totIpBytesSent=%u, totIpBytesRcvd=%u totIpBytes=%u", totIpBytesSent, totIpBytesRcvd, totIpBytes); #endif for(idx=pageNum*myGlobals.runningPref.maxNumLines; idxbytesSent.value)/totEthBytesSent; rcvdPercent = (100*(float)el->bytesRcvd.value)/totEthBytesRcvd; break; case SORT_DATA_PROTOS: totPercent = (100*(float) (el->bytesSent.value + el->bytesRcvd.value) )/totEthBytes; break; case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_IP: sentPercent = (100*(float)el->ipv4BytesSent.value)/totIpBytesSent; rcvdPercent = (100*(float)el->ipv4BytesRcvd.value)/totIpBytesRcvd; break; case SORT_DATA_IP: totPercent = (100*(float) (el->ipv4BytesSent.value + el->ipv4BytesRcvd.value) )/totIpBytes; break; case SORT_DATA_RECEIVED_THPT: case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_SENT_THPT: case TRAFFIC_STATS: case SORT_DATA_HOST_TRAFFIC: case SORT_DATA_THPT: sentPercent = rcvdPercent = 0; break; } /* Fixed buffer overflow. Courtesy of Rainer Tammer */ strncpy(webHostName, makeHostLink(el, FLAG_HOSTLINK_HTML_FORMAT, 0, 1, hostLinkBuf, sizeof(hostLinkBuf)), sizeof(webHostName)); switch(reportType) { case SORT_DATA_RECEIVED_PROTOS: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%s%%" "%s%s" "%s""%s" "%s" "%s", getRowColor(), webHostName, formatBytes(el->bytesRcvd.value, 1, formatBuf, sizeof(formatBuf)), rcvdPercent, myGlobals.separator, formatBytes(el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value, 1, formatBuf1, sizeof(formatBuf1)), formatBytes(el->udpRcvdLoc.value+el->udpRcvdFromRem.value, 1, formatBuf2, sizeof(formatBuf2)), formatBytes(el->icmpRcvd.value, 1, formatBuf3, sizeof(formatBuf3)), formatBytes(el->icmp6Rcvd.value, 1, formatBuf4, sizeof(formatBuf4)), formatBytes(el->ipsecRcvd.value, 1, formatBuf7, sizeof(formatBuf7)), formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->arp_rarpRcvd.value, 1, formatBuf8, sizeof(formatBuf8)) ); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s" "%s" "%s", formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->netbiosRcvd.value, 1, formatBuf1, sizeof(formatBuf1)), formatBytes(el->greRcvd.value, 1, formatBuf2, sizeof(formatBuf2)), formatBytes(el->ipv6BytesRcvd.value, 1, formatBuf3, sizeof(formatBuf3)), formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->stpRcvd.value, 1, formatBuf4, sizeof(formatBuf4))); sendString(buf); protoList = myGlobals.ipProtosList, idx1=0; while(protoList != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", el->ipProtosList[idx1] != NULL ? formatBytes(el->ipProtosList[idx1]->rcvd.value, 1, formatBuf, sizeof(formatBuf)) : "0"); sendString(buf); idx1++, protoList = protoList->next; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->otherRcvd.value, 1, formatBuf, sizeof(formatBuf))); sendString(buf); break; case SORT_DATA_SENT_PROTOS: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%s%%" "%s%s" "%s" "%s" "%s" "%s", getRowColor(), webHostName, formatBytes(el->bytesSent.value, 1, formatBuf, sizeof(formatBuf)), sentPercent, myGlobals.separator, formatBytes(el->tcpSentLoc.value+el->tcpSentRem.value, 1, formatBuf1, sizeof(formatBuf1)), formatBytes(el->udpSentLoc.value+el->udpSentRem.value, 1, formatBuf2, sizeof(formatBuf2)), formatBytes(el->icmpSent.value, 1, formatBuf3, sizeof(formatBuf3)), formatBytes(el->icmp6Sent.value, 1, formatBuf4, sizeof(formatBuf4)), formatBytes(el->ipsecSent.value, 1, formatBuf7, sizeof(formatBuf7)), formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->arp_rarpSent.value, 1, formatBuf8, sizeof(formatBuf8)) ); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s" "%s" "%s", formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->netbiosSent.value, 1, formatBuf, sizeof(formatBuf)), formatBytes(el->greSent.value, 1, formatBuf1, sizeof(formatBuf1)), formatBytes(el->ipv6BytesSent.value, 1, formatBuf2, sizeof(formatBuf2)), formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->stpSent.value, 1, formatBuf3, sizeof(formatBuf3))); sendString(buf); protoList = myGlobals.ipProtosList, idx1=0; while(protoList != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", el->ipProtosList[idx1] != NULL ? formatBytes(el->ipProtosList[idx1]->sent.value, 1, formatBuf, sizeof(formatBuf)) : "0"); sendString(buf); idx1++, protoList = protoList->next; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->otherSent.value, 1, formatBuf, sizeof(formatBuf)) ); sendString(buf); break; case SORT_DATA_PROTOS: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%s%%" "%s%s" "%s" "%s" "%s" "%s", getRowColor(), webHostName, formatBytes(el->bytesSent.value+el->bytesRcvd.value, 1, formatBuf, sizeof(formatBuf)), totPercent, myGlobals.separator, formatBytes(el->tcpSentLoc.value+el->tcpSentRem.value+ el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value, 1, formatBuf1, sizeof(formatBuf1)), formatBytes(el->udpSentLoc.value+el->udpSentRem.value+ el->udpRcvdLoc.value+el->udpRcvdFromRem.value, 1, formatBuf2, sizeof(formatBuf2)), formatBytes(el->icmpSent.value+el->icmpRcvd.value, 1, formatBuf3, sizeof(formatBuf3)), formatBytes(el->icmp6Sent.value+el->icmp6Rcvd.value, 1, formatBuf4, sizeof(formatBuf4)), formatBytes(el->ipsecSent.value+el->ipsecRcvd.value, 1, formatBuf7, sizeof(formatBuf7)), formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->arp_rarpSent.value+el->nonIPTraffic->arp_rarpRcvd.value, 1, formatBuf8, sizeof(formatBuf8)) ); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s" "%s" "%s", formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->netbiosSent.value+el->nonIPTraffic->netbiosRcvd.value, 1, formatBuf, sizeof(formatBuf)), formatBytes(el->greSent.value+el->greRcvd.value, 1, formatBuf1, sizeof(formatBuf1)), formatBytes(el->ipv6BytesSent.value+el->ipv6BytesRcvd.value, 1, formatBuf2, sizeof(formatBuf2)), formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->stpSent.value+el->nonIPTraffic->stpRcvd.value, 1, formatBuf3, sizeof(formatBuf3))); sendString(buf); protoList = myGlobals.ipProtosList, idx1=0; while(protoList != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", el->ipProtosList[idx1] != NULL ? formatBytes(el->ipProtosList[idx1]->sent.value +el->ipProtosList[idx1]->rcvd.value, 1, formatBuf, sizeof(formatBuf)) : "0"); sendString(buf); idx1++, protoList = protoList->next; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", formatBytes(el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->otherSent.value+el->nonIPTraffic->otherRcvd.value, 1, formatBuf, sizeof(formatBuf)) ); sendString(buf); break; case SORT_DATA_RECEIVED_IP: { int i; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%s%%", getRowColor(), webHostName, formatBytes(el->ipv4BytesRcvd.value, 1, formatBuf, sizeof(formatBuf)), rcvdPercent, myGlobals.separator); sendString(buf); for(i=0; i%s", formatBytes(el->l7.traffic[i].bytesRcvd, 1, formatBuf, sizeof(formatBuf))); sendString(buf); } } sendString("\n"); } break; case SORT_DATA_SENT_IP: { int i; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%s%%", getRowColor(), webHostName, formatBytes(el->ipv4BytesSent.value, 1, formatBuf, sizeof(formatBuf)), sentPercent, myGlobals.separator); sendString(buf); for(i=0; i 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", formatBytes(el->l7.traffic[i].bytesSent, 1, formatBuf, sizeof(formatBuf))); sendString(buf); } } sendString("\n"); } break; case SORT_DATA_IP: { int i; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%s%%", getRowColor(), webHostName, formatBytes(el->ipv4BytesSent.value+el->ipv4BytesRcvd.value, 1, formatBuf, sizeof(formatBuf)), totPercent, myGlobals.separator); sendString(buf); for(i=0; i 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", formatBytes(el->l7.traffic[i].bytesSent + el->l7.traffic[i].bytesRcvd, 1, formatBuf, sizeof(formatBuf))); sendString(buf); } } sendString("\n"); } break; case SORT_DATA_RECEIVED_THPT: { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s" "%s" "%s", getRowColor(), webHostName, formatThroughput(el->actualRcvdThpt, 1, formatBuf, sizeof(formatBuf)), formatThroughput(el->averageRcvdThpt, 1, formatBuf1, sizeof(formatBuf1)), formatThroughput(el->peakRcvdThpt, 1, formatBuf2, sizeof(formatBuf2))); sendString(buf); } break; case SORT_DATA_SENT_THPT: { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s" "%s" "%s", getRowColor(), webHostName, formatThroughput(el->actualSentThpt, 1, formatBuf, sizeof(formatBuf)), formatThroughput(el->averageSentThpt, 1, formatBuf1, sizeof(formatBuf1)), formatThroughput(el->peakSentThpt, 1, formatBuf2, sizeof(formatBuf2))); sendString(buf); } break; case SORT_DATA_THPT: { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s" "%s" "%s", getRowColor(), webHostName, formatThroughput(el->actualThpt, 1, formatBuf, sizeof(formatBuf)), formatThroughput(el->averageThpt, 1, formatBuf1, sizeof(formatBuf1)), formatThroughput(el->peakThpt, 1, formatBuf2, sizeof(formatBuf2))); sendString(buf); } break; case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_HOST_TRAFFIC: case TRAFFIC_STATS: { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", getRowColor(), webHostName); sendString(buf); printHostThtpShort(el, reportType, hourId); } break; } sendString("\n"); /* Avoid huge tables */ if(printedEntries++ > myGlobals.runningPref.maxNumLines) break; } } } else idx = 0; sendString("\n"TABLE_OFF"\n"); switch(reportType) { case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_HOST_TRAFFIC: case SORT_DATA_RECEIVED_THPT: case SORT_DATA_SENT_THPT: case SORT_DATA_THPT: break; case SORT_DATA_RECEIVED_PROTOS: case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_PROTOS: case SORT_DATA_SENT_IP: case SORT_DATA_PROTOS: case SORT_DATA_IP: sendString("

Note: These counters do not include broadcasts and will not equal the 'Global Protocol Distribution'

\n"); break; } sendString("\n"); printFooter(reportType); addPageIndicator(url, pageNum, numEntries, myGlobals.runningPref.maxNumLines, revertOrder, abs(sortedColumn), -1); sendString("

NOTE:

\n
    " "
  • Click here " "for more information about host and domain sorting.
  • \n" "

\n"); myGlobals.lastRefreshTime = myGlobals.actTime; free(vlanList); free(tmpTable); } /* ******************************* */ static int printTalker(HostTalker *t) { char formatBuf[64]; char buf[LEN_GENERAL_WORK_BUFFER]; HostTraffic *el, tmpEl; char webHostName[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; if(emptySerial(&t->hostSerial)) return(-1); el = quickHostLink(t->hostSerial, myGlobals.actualReportDeviceId, &tmpEl); strncpy(webHostName, makeHostLink(el, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf)), sizeof(webHostName)); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); sendString(webHostName); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", formatThroughput(t->bps, 1, formatBuf, sizeof(formatBuf))); sendString(buf); return(0); } /* ******************************* */ #define MAX_NUM_TALKERS 64 static int cmpTalkersFctn(const void *_a, const void *_b) { HostTalkerSeries *a = (HostTalkerSeries*)_a; HostTalkerSeries *b = (HostTalkerSeries*)_b; return((a->total_bps < b->total_bps) ? 1 : 0); } /* ******************************* */ void printTopTalkers(u_int8_t printHourTalkers, u_int8_t show_graph) { char buf[LEN_GENERAL_WORK_BUFFER]; u_int numTalkers, delta, i, j; TopTalkers *talkers; if(printHourTalkers) { talkers = myGlobals.device[myGlobals.actualReportDeviceId].last60MinTopTalkers, numTalkers = 60, delta = 60 - 1 /* sec */; } else { talkers = myGlobals.device[myGlobals.actualReportDeviceId].last24HoursTopTalkers, numTalkers = 24, delta = 3600 - 1; } if(show_graph) { HostTalkerSeries *ttalkers; int tot_talkers = 0, num_series = 0; ttalkers = (HostTalkerSeries*)calloc(sizeof(HostTalkerSeries), MAX_NUM_TALKERS); if(!ttalkers) { traceEvent(CONST_TRACE_WARNING, "Unable to allocate memory"); return; } for(i=0; i\n"); printTopTalkers(printHourTalkers ? 1 : 0, 1); sendString(TABLE_ON"\n"); sendString("" "\n" "\n" "\n" "\n"); for(i=0; i"); sendString("\n", getActualRowColor()); break; default: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "\n", percentageS, ratio*percentageS); break; } } else { /* Could happen because of rounding */ while(percentageR > maxPercentage) { if((percentageS+percentageR) > maxPercentage) percentageR--; } while(percentageS > maxPercentage) { if((percentageS+percentageR) > maxPercentage) percentageS--; } switch(percentageS+percentageR) { case 0: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "\n", getActualRowColor()); break; default: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "" "" "\n", percentageR, ratio*percentageR, percentageS, ratio*percentageS); break; } } sendString(buf); } /* ********************************** */ #if 0 static int cmpPortsFctn(const void *_a, const void *_b) { if((_a == NULL) || (_b == NULL)) return(0); else { PortCounter *a, *b; a = *((PortCounter**)_a); b = *((PortCounter**)_b); if((a == NULL) || (b == NULL)) return(0); if((a->sent+a->rcvd) > (b->sent+b->rcvd)) return(-1); else return(1); } } #endif /* ************************ */ void printProtoTraffic(int printGraph) { float total, perc; char buf[2*LEN_GENERAL_WORK_BUFFER], formatBuf[32]; int i; struct stat statbuf; int beginUnique = (myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[0] == '/') ? 1 : 0; total = myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value/1024; /* total is expressed in KBytes.value */ if(total == 0) return; sendString("
\n"); if(myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value > 0) { sendString("

"TABLE_ON"

Time PeriodTop SendersTop Receivers
"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%u.", i+1); sendString(buf); sendString(""); when = talkers[i].when; sendString(ctime(&when)); sendString("

"); when += delta; sendString(ctime(&when)); sendString("

"TABLE_ON""); for(j=0; j"TABLE_OFF""); sendString("\n", host); safe_snprintf(__FILE__, __LINE__, errorAdditionalText, sizeof(errorAdditionalText), "

\"Warning\"

\n" "

" "ntop does not currently have any information about host %s %s.

" "

 

" "

This is most likely because the host information has been " "purged as inactive. You may wish to consider the -c | --sticky-hosts " "option, although that option may substantially increase memory " "requirements.

\n", host, whois); returnHTTPpageNotFound(errorAdditionalText); return; } if(el->community && (!isAllowedCommunity(el->community))) { returnHTTPpageBadCommunity(); return; } if((myGlobals.device[actualDeviceId].sessions != NULL) && (myGlobals.device[actualDeviceId].numSessions > 0) && (el->numHostSessions > 0)) have_sessions = 1; else have_sessions = 0; fragments = el->tcpFragmentsSent.value + el->udpFragmentsSent.value + el->icmpFragmentsSent.value + el->tcpFragmentsRcvd.value + el->udpFragmentsRcvd.value + el->icmpFragmentsRcvd.value; if((el->protocolInfo == NULL) || ((el->protocolInfo->dnsStats == NULL) && (el->protocolInfo->httpStats == NULL))) showServices = 0; else showServices = 1; sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); /* ************************************ */ /* Read custom host name if any */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "hostname.%s", (el->hostNumIpAddress[0] != '\0') ? el->hostNumIpAddress : el->ethAddressString); if(fetchPrefsValue(buf, custom_host_name, sizeof(custom_host_name)) == -1) custom_host_name[0] = '\0'; if((el->hostResolvedName[0] != '\0') && (strcmp(el->hostResolvedName, el->hostNumIpAddress))) { char httpSiteIconBuf[512] = { 0 }; if(isHTTPhost(el)) httpSiteIcon((custom_host_name[0] != '\0') ? custom_host_name : el->hostResolvedName, httpSiteIconBuf, sizeof(httpSiteIconBuf), 0); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about " " %s%s\n", (custom_host_name[0] != '\0') ? custom_host_name : el->hostResolvedName, httpSiteIconBuf, (custom_host_name[0] != '\0') ? custom_host_name : el->hostResolvedName); safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", el->hostResolvedName); } else if(el->hostNumIpAddress[0] != '\0') { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about " " %s\n", el->hostIpAddress.hostFamily == AF_INET6 ? "[" : "", el->hostNumIpAddress, el->hostIpAddress.hostFamily == AF_INET6 ? "]" : "", (custom_host_name[0] != '\0') ? custom_host_name : el->hostNumIpAddress); safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", (custom_host_name[0] != '\0') ? custom_host_name : el->hostNumIpAddress); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Info about %s", (custom_host_name[0] != '\0') ? custom_host_name : el->ethAddressString); safe_snprintf(__FILE__, __LINE__, buf2, sizeof(buf2), "Info about %s", (custom_host_name[0] != '\0') ? custom_host_name : el->ethAddressString); } printHTMLheader(buf2, buf, 0); /* ************************************ */ sendString("\n" "
\n" "
\n" "
    \n"); if(have_sessions) sendString("
  • Overview
  • \n"); sendString("
  • Host Details
  • \n"); if(el->trafficDistribution) sendString("
  • Hourly Distribution
  • \n"); if(el->secHostPkts || el->nonIPTraffic) sendString("
  • Packet Stats
  • \n"); sendString("
  • Protocols
  • \n"); if(el->icmpInfo) sendString("
  • ICMP Stats
  • \n"); if(fragments > 0) sendString("
  • Fragment Stats
  • \n"); sendString("
  • Contacts
  • \n"); if((el->protocolInfo != NULL) && (el->protocolInfo->httpVirtualHosts != NULL)) sendString("
  • HTTP Stats
  • \n"); if(showServices) sendString("
  • Service Stats
  • \n"); if((el->portsUsage != NULL) || (el->otherIpPortsRcvd[MAX_NUM_RECENT_PORTS-1] >= 0) || (el->otherIpPortsSent[MAX_NUM_RECENT_PORTS-1] >= 0) || (el->recentlyUsedClientPorts[MAX_NUM_RECENT_PORTS-1] >= 0) || (el->recentlyUsedServerPorts[MAX_NUM_RECENT_PORTS-1] >= 0)) { sendString("
  • Monitored Ports
  • \n"); show_div_8 = 1; } if(el->clientDelay || el->serverDelay) sendString("
  • Network Delay
  • \n"); if(have_sessions) sendString("
  • Active Sessions
  • \n"); if(el->hostNumIpAddress[0] != '\0') { strncpy(linkName, el->hostNumIpAddress, sizeof(linkName)); } else { strncpy(linkName, el->ethAddressString, sizeof(linkName)); } /* For Ethernet and IPv6 addresses */ urlFixupToRFC1945Inplace(linkName); if(el->vlanId > 0) { safe_snprintf(__FILE__, __LINE__, vlanStr, sizeof(vlanStr), "-%d", el->vlanId); } else vlanStr[0] = '\0'; sendString("
\n"); if(have_sessions) { sendString("\n\n\n"); sendString("\n\n
\n"); { FILE *fd = NULL; char path[256]; for(idx=0; myGlobals.dataFileDirs[idx] != NULL; idx++) { safe_snprintf(__FILE__, __LINE__, path, sizeof(path), "%s/html/sankey.min.html", myGlobals.dataFileDirs[idx]); revertSlashIfWIN32(path, 0); if((fd = fopen(path, "r")) != NULL) break; } if(fd) { char line[LINE_MAX]; while(fgets(line, LINE_MAX, fd) != NULL) { char *token = strstr(line, "@HOST@"); if(token) { token[0] = '\0'; sendString(line); if(el->hostResolvedName[0] != '\0') sendString(el->hostResolvedName); else sendString(el->hostNumIpAddress); //sendString(host); sendString(&token[6]); } else sendString(line); } fclose(fd); } } sendString("\n
\n"); } sendString("\n\n\n"); sendString("\n\n
\n"); printHostDetailedInfo(el, actualDeviceId); sendString("\n
\n"); sendString("\n\n\n"); printHostTrafficStats(el, actualDeviceId); if(el->icmpInfo) { sendString("\n\n\n"); sendString("\n\n
\n"); printHostIcmpStats(el); sendString("\n
\n"); } if(fragments > 0) { sendString("\n\n\n"); sendString("\n\n
\n"); printHostFragmentStats(el, actualDeviceId); sendString("\n
\n"); } sendString("\n\n\n"); sendString("\n\n
\n"); printHostContactedPeers(el, actualDeviceId); sendString("\n
\n"); if((el->protocolInfo != NULL) && (el->protocolInfo->httpVirtualHosts != NULL)) { sendString("\n\n\n"); sendString("\n\n
\n"); printHostHTTPVirtualHosts(el, actualDeviceId); sendString("\n
\n"); } if(showServices) { sendString("\n\n\n"); sendString("\n\n
\n"); printHostUsedServices(el, actualDeviceId); printHostFingerprint(el); /* ----- **** ----- */ sendString("\n
\n"); } /* ***************************************************** */ i = 0; if(show_div_8) { sendString("\n\n\n"); sendString("\n\n
\n"); if(el->portsUsage != NULL) { for(idx=1; idx\n"); sendString(""TABLE_ON"
"TABLE_ON""); for(j=0; j"TABLE_OFF""); sendString("\n"); } sendString("
"TABLE_OFF"\n"); sendString("\n"); } } /* ******************************* */ void printMulticastStats(int sortedColumn /* ignored so far */, int revertOrder, int pageNum) { u_int idx, numEntries=0, maxHosts; int printedEntries=0, i; HostTraffic *el; HostTraffic** tmpTable; char buf[LEN_GENERAL_WORK_BUFFER], *sign, *theAnchor[6], *arrow[6], *arrowGif; char formatBuf[32], formatBuf1[32], formatBuf2[32], formatBuf3[32]; char htmlAnchor[64], htmlAnchor1[64], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; printHTMLheader("Multicast Statistics", NULL, 0); memset(buf, 0, sizeof(buf)); maxHosts = myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno; /* save it as it can change */ tmpTable = (HostTraffic**)mallocAndInitWithReportWarn(maxHosts*sizeof(HostTraffic*), "printMulticastStats"); if(tmpTable == NULL) return; /* All the ALT tags courtesy of "Burton M. Strauss III" */ if(revertOrder) { sign = ""; arrowGif = " " CONST_IMG_ARROW_UP; } else { sign = "-"; arrowGif = " " CONST_IMG_ARROW_DOWN; } for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if(((el->pktsMulticastSent.value > 0) || (el->pktsMulticastRcvd.value > 0)) && (!broadcastHost(el))) { if(el->community && (!isAllowedCommunity(el->community))) continue; tmpTable[numEntries++] = el; } if(numEntries >= maxHosts) break; } if(numEntries > 0) { myGlobals.columnSort = sortedColumn; /* Host name */ safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), "\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), ""TABLE_ON"\n" "" "" "" "" "" "\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2], theAnchor[3], arrow[3], theAnchor[4], arrow[4], theAnchor[5], arrow[5] ); sendString(buf); qsort(tmpTable, numEntries, sizeof(HostTraffic*), cmpMulticastFctn); for(idx=pageNum*myGlobals.runningPref.maxNumLines; idx%s" "" "" "\n", getRowColor(), makeHostLink(el, FLAG_HOSTLINK_HTML_FORMAT, 0, 1, hostLinkBuf, sizeof(hostLinkBuf)), formatPkts(el->pktsMulticastSent.value, formatBuf, sizeof(formatBuf)), formatBytes(el->bytesMulticastSent.value, 1, formatBuf1, sizeof(formatBuf1)), formatPkts(el->pktsMulticastRcvd.value, formatBuf2, sizeof(formatBuf2)), formatBytes(el->bytesMulticastRcvd.value, 1, formatBuf3, sizeof(formatBuf3))); sendString(buf); /* Avoid huge tables */ if(printedEntries++ > myGlobals.runningPref.maxNumLines) break; } } sendString("
%s0>Host%s%s1>Location%s%s2>Pkts Sent%s%s3>Data Sent%s%s4>Pkts Rcvd%s%s5>Data Rcvd%s
%s%s%s%s
"TABLE_OFF"\n"); sendString("\n"); addPageIndicator(CONST_MULTICAST_STATS_HTML, pageNum, numEntries, myGlobals.runningPref.maxNumLines, revertOrder, abs(sortedColumn), -1); printFooterHostLink(); } else printNoDataYet(); free(tmpTable); sendString("

List " "of multicast addresses

\n"); } /* ****************************************************************** */ //#if 0 static void makeHostName(HostTraffic *el, char *buf, int len) { if(el->hostResolvedName[0] != '\0') strcpy(buf, el->hostResolvedName); else if(el->hostNumIpAddress[0] != '\0') strcpy(buf, el->hostNumIpAddress); else if(el->ethAddressString[0] != '\0') strcpy(buf, el->ethAddressString); else { HostTraffic *el1; for(el1=getFirstHost(myGlobals.actualReportDeviceId); el1 != NULL; el1 = getNextHost(myGlobals.actualReportDeviceId, el1)) { if(((strcmp(el1->hostNumIpAddress, el->hostNumIpAddress) == 0) || (strcmp(el1->ethAddressString, el->ethAddressString) == 0)) && (el1->vlanId == el->vlanId)) { safe_snprintf (__FILE__, __LINE__, buf, len, "%s", el1->hostResolvedName); break; } } } } /* ****************************************************************** */ #define LOCAL_COLOR "mistyrose2" #define REMOTE_COLOR "lightsteelblue1" static int addNodeInfo(FILE *fd, HostTraffic *el) { char buf0[128], buf1[2*LEN_GENERAL_WORK_BUFFER]; makeHostName(el, buf0, sizeof(buf0)); makeHostLink(el, FLAG_HOSTLINK_TEXT_LITE_FORMAT, 0, 0, buf1, sizeof(buf1)); if(buf1[0] != '\0') { fprintf(fd, "\"%s\" [URL=\"%s\", color=%s];\n", buf0, buf1, subnetLocalHost(el) ? LOCAL_COLOR : REMOTE_COLOR); return(1); } return(0); } //#endif /* ****************************************************************** */ void makeDot() { // FIX - Reimplement host matrix //returnHTTPpageNotFound("This feature is not YET available on your platform: we're working for you"); //return; //#if 0 #ifdef WIN32 returnHTTPpageNotFound("This feature is not available on your platform"); return; #else HostTraffic *el, *el2, tmpEl; char buf[LEN_GENERAL_WORK_BUFFER], buf1[LEN_GENERAL_WORK_BUFFER], path[384], dotPath[256]; FILE *fd, *cmap, *in, *out, *make; struct stat statbuf; int rc; printHTMLheader("Local Network Traffic Map", NULL, 0); /* First of all let's see if the path of dot is inside the preferences */ if(fetchPrefsValue("dot.path", buf, sizeof(buf)) != -1) { snprintf(dotPath, sizeof(dotPath), "%s", buf); } else { snprintf(dotPath, sizeof(dotPath), "/usr/local/bin/dot"); storePrefsValue("dot.path", dotPath); /* Set the default */ } revertSlashIfWIN32(dotPath, 0); if(stat(dotPath, &statbuf) != 0) { snprintf(buf, sizeof(buf), "

ERROR

\n
Missing dot tool (expected %s). Please set its path (key dot.path) " "here.
", dotPath); sendString(buf); return; } snprintf(path, sizeof(path), "%s/ntop-all.dot", myGlobals.spoolPath); fd = fopen(path, "w"); if(fd != NULL) { for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { int i, urlSent = 0; if(el->community && (!isAllowedCommunity(el->community))) continue; if(subnetLocalHost(el)) { makeHostName(el, buf, sizeof(buf)); for(i=0; icontactedSentPeers.peersSerials[i]) && (!cmpSerial(&el->contactedSentPeers.peersSerials[i], &myGlobals.otherHostEntry->serialHostIndex))) { if((el2 = quickHostLink(el->contactedSentPeers.peersSerials[i], myGlobals.actualReportDeviceId, &tmpEl)) != NULL) { makeHostName(el2, buf1, sizeof(buf1)); if(addNodeInfo(fd, el2)) { fprintf(fd, "\"%s\" -> \"%s\";\n", buf, buf1); if(!urlSent) urlSent = addNodeInfo(fd, el); } } } /* ****************************** */ for(i=0; icontactedRcvdPeers.peersSerials[i]) && (!cmpSerial(&el->contactedRcvdPeers.peersSerials[i], &myGlobals.otherHostEntry->serialHostIndex))) { if((el2 = quickHostLink(el->contactedRcvdPeers.peersSerials[i], myGlobals.actualReportDeviceId, &tmpEl)) != NULL) { makeHostName(el2, buf1, sizeof(buf1)); for(i=0; i \"%s\";\n", buf1, buf); if(!urlSent) urlSent = addNodeInfo(fd, el); } } } } } fclose(fd); snprintf(path, sizeof(path), "sort -u %s/ntop-all.dot > %s/ntop-sort.dot", myGlobals.spoolPath, myGlobals.spoolPath); sendString("\n"); errno = 0; rc = system(path); if((rc == -1) && (errno != ECHILD)) { snprintf(buf, sizeof(buf), "

ERROR

\n
Sorting of ntop-all.dot failed, rc %d
", errno); sendString(buf); return; } snprintf(path, sizeof(path), "%s/ntop.dot", myGlobals.spoolPath); out = fopen(path, "w"); if(out != NULL) { fprintf(out, "digraph ntop {\n"); fprintf(out, "node [shape = polygon, sides=4, fontsize=9, style=filled" /* ", fontname=\"Helvetica\" */ "];\n"); snprintf(path, sizeof(path), "%s/ntop-sort.dot", myGlobals.spoolPath); if((in = fopen(path, "r")) != NULL) { while(!feof(in) && (fgets(buf, sizeof(buf), in) != NULL)) fprintf(out, "%s", buf); } fprintf(out, "}\n"); fclose(out); fclose(in); } /* Added -c courtesy of Max Waterman */ snprintf(path, sizeof(path), "%s -Tsvg -Goverlap=false %s/ntop.dot -o %s/"CONST_NETWORK_IMAGE_MAP " 2>&1 ", dotPath, myGlobals.spoolPath, myGlobals.spoolPath); sendString("\n"); errno = 0; make = popen(path, "r"); if(make == NULL) { snprintf(buf, sizeof(buf), "

ERROR

\n

Creation of network map failed, rc %s(%d)

\n" "

Command was:

\n
%s
", strerror(errno), errno, path); sendString(buf); return; } if(!feof(make) && (fgets(buf, sizeof(buf), make) != NULL)) { sendString("

ERROR

\n

Creation of network map failed

\n" "

Command was:

\n
");
      sendString(path);
      sendString("
\n

Results were:

\n
");
      sendString(buf);
      while(!feof(make) && (fgets(buf, sizeof(buf), make) != NULL)) {
	sendString(buf);
      }
      sendString("
\n"); return; } pclose(make); snprintf(path, sizeof(path), "%s -Tcmap -Goverlap=false %s/ntop.dot", dotPath, myGlobals.spoolPath); sendString("\n"); cmap = popen(path, "r"); if(cmap != NULL) { sendString("

"); sendString("
\n"); while(!feof(cmap) && (fgets(buf, sizeof(buf), cmap) != NULL)) sendString(buf); sendString("\n"); sendString("

Graph generated by Dot, part of Graphviz, created by " "AT&T Research.\n"); pclose(cmap); } else { returnHTTPpageNotFound("Unable to generate cmap file (Is dot installed?)"); } } else { returnHTTPpageNotFound("Unable to create temporary file"); } //#endif #endif } /* ******************************* */ #define NUM_TABLE_COLUMNS 13 void printHostsInfo(int sortedColumn, int revertOrder, int pageNum, int showBytes, int vlanId, int ifId, int knownSubnetId, int showL2Only) { u_int idx, numEntries=0, maxHosts; int printedEntries=0; unsigned short maxBandwidthUsage=1 /* avoid divisions by zero */; HostTraffic *el; HostTraffic** tmpTable; char buf[2*LEN_GENERAL_WORK_BUFFER], *arrowGif, *sign, *arrow[NUM_TABLE_COLUMNS], *theAnchor[NUM_TABLE_COLUMNS], osBuf[160]; char htmlAnchor[64], htmlAnchor1[64]; char formatBuf[32], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; char totalHosts[128]; u_char *vlanList, foundVlan = 0, vlanStr[16], ifStr[16], foundIf = 0, *ifList; u_int8_t *knownSubnets, selected; vlanList = calloc(1, MAX_VLAN); if(vlanList == NULL) { traceEvent(CONST_TRACE_WARNING, "Unable to allocate memory for vlan list"); return; } vlanId = abs(vlanId); ifList = calloc(1, MAX_INTERFACE); if(ifList == NULL) { traceEvent(CONST_TRACE_WARNING, "Unable to allocate memory for if list"); free(vlanList); return; } ifId = abs(ifId); knownSubnets = calloc(sizeof(u_int8_t), myGlobals.numKnownSubnets); if(ifList == NULL) { traceEvent(CONST_TRACE_WARNING, "Unable to allocate memory for if list"); free(vlanList); free(ifList); return; } ifId = abs(ifId); printHTMLheader("Host Information", NULL, 0); memset(buf, 0, sizeof(buf)); maxHosts = myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno; /* save it as it can change */ tmpTable = (HostTraffic**)mallocAndInitWithReportWarn(maxHosts*sizeof(HostTraffic*), "printHostsInfo"); if(tmpTable == NULL) { free(vlanList); free(ifList); free(knownSubnets); return; } if(revertOrder) sign = "", arrowGif = " " CONST_IMG_ARROW_UP; else sign = "-", arrowGif = " " CONST_IMG_ARROW_DOWN; myGlobals.columnSort = sortedColumn; for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { unsigned short actUsage, actUsageS, actUsageR; #if 0 traceEvent(CONST_TRACE_WARNING, "[%s][%s][%s]", el->ethAddressString, el->hostNumIpAddress, el->hostResolvedName); #endif if(showL2Only) { if(!el->l2Host) continue; } else { if(el->l2Host) continue; } if(broadcastHost(el)) continue; if(el->community && (!isAllowedCommunity(el->community))) continue; if((el->vlanId != NO_VLAN) && (el->vlanId < MAX_VLAN)) { vlanList[el->vlanId] = 1, foundVlan = 1; } if((vlanId != NO_VLAN) && (el->vlanId != vlanId)) continue; if((el->known_subnet_id < myGlobals.numKnownSubnets) && (el->known_subnet_id != UNKNOWN_SUBNET_ID) ) knownSubnets[el->known_subnet_id] = 1; if((knownSubnetId != UNKNOWN_SUBNET_ID) && (knownSubnetId != ALL_SUBNET_IDS) && (el->known_subnet_id != knownSubnetId)) continue; if((knownSubnetId == UNKNOWN_SUBNET_ID) && (el->known_subnet_id != UNKNOWN_SUBNET_ID)) continue; if((el->ifId != NO_INTERFACE) && (el->ifId < MAX_INTERFACE)) { ifList[el->ifId] = 1, foundIf = 1; } if((ifId != NO_INTERFACE) && (el->ifId != ifId)) continue; if(showBytes) { actUsage = (unsigned short)(0.5+100.0*(((float)el->bytesSent.value+(float)el->bytesRcvd.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value)); actUsageS = (unsigned short)(0.5+100.0*((float)el->bytesSent.value/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value)); actUsageR = (unsigned short)(0.5+100.0*((float)el->bytesRcvd.value/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value)); } else { actUsage = (unsigned short)(0.5+100.0*(((float)el->pktsSent.value+(float)el->pktsRcvd.value)/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value)); actUsageS = (unsigned short)(0.5+100.0*((float)el->pktsSent.value/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value)); actUsageR = (unsigned short)(0.5+100.0*((float)el->pktsRcvd.value/ (float)myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value)); } el->actBandwidthUsage = actUsage; if(el->actBandwidthUsage > maxBandwidthUsage) maxBandwidthUsage = actUsage; el->actBandwidthUsageS = actUsageS; el->actBandwidthUsageR = actUsageR; tmpTable[numEntries++] = el; getHostAS(el); if(numEntries >= maxHosts) break; } /* if(numEntries > 0) */ { int i; qsort(tmpTable, numEntries, sizeof(HostTraffic*), sortHostFctn); safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), ""); if(vlanId > 0) safe_snprintf(__FILE__, __LINE__, (char*)vlanStr, sizeof(vlanStr), "&vlan=%d", vlanId); else vlanStr[0] = '\0'; if(ifId > 0) safe_snprintf(__FILE__, __LINE__, (char*)ifStr, sizeof(ifStr), "&if=%d", ifId); else ifStr[0] = '\0'; sendString("

"); if(numEntries > 0) { sendString("" "\n"); } if(foundVlan) { u_char tmpBuf[64]; sendString("" "\n"); } sendString("" "\n", CONST_HOSTS_INFO_HTML, showL2Only, showBytes, ALL_SUBNET_IDS, selected ? " selected" : ""); sendString(buf); /* ********************** */ sendString("\n"); /* ********************** */ if(foundIf) { u_char found = 0; sendString("\n", CONST_HOSTS_INFO_HTML, showL2Only, showBytes, selected ? " selected" : "", i); sendString(buf); } sendString("
\nTraffic Unit:
\n", CONST_HOSTS_INFO_HTML, showL2Only, myGlobals.columnSort, vlanStr, ifStr, CONST_HOSTS_INFO_HTML, showL2Only, myGlobals.columnSort, vlanStr, ifStr); else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n" "\n\n", CONST_HOSTS_INFO_HTML, showL2Only, myGlobals.columnSort, vlanStr, ifStr, CONST_HOSTS_INFO_HTML, showL2Only, myGlobals.columnSort, vlanStr, ifStr); sendString(buf); sendString("
\nVLAN:\n
\nSubnet:
\n

\nFilter:
" "\n

\nInterface Id:
" "\n
\n"); if(numEntries > 0) { if(!myGlobals.device[myGlobals.actualReportDeviceId].dummyDevice) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "

"TABLE_ON"\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" #if 0 "\n" #endif "\n" "\n" "\n" "\n" "\n" "\n", theAnchor[1], arrow[1], theAnchor[0], arrow[0], theAnchor[2], arrow[2], theAnchor[3], arrow[3], theAnchor[11], arrow[11], theAnchor[6], arrow[6], theAnchor[4], arrow[4], #if 0 theAnchor[5], arrow[5], #endif theAnchor[7], arrow[7], theAnchor[8], arrow[8], theAnchor[9], arrow[9], theAnchor[10], arrow[10], theAnchor[12], arrow[12] ); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
"TABLE_ON"
%s1\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s%s2\">IP Address%s%s3\">MAC Address%s%s11\">Community%s%s6\">Other Name(s)%s%s4\">Inbound vs Outbound%s%s5\">Nw Board Vendor%s%s7\">Hops Distance%s%s8\">Host Contacts%s%s9\">Age/Inactivity%s%s10\">AS%s%s12\">Fingerprint%s
\n" "\n" "\n" "\n" "" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n", theAnchor[1], arrow[1], theAnchor[0], arrow[0], theAnchor[2], arrow[2], theAnchor[6], arrow[6], theAnchor[11], arrow[11], theAnchor[4], arrow[4], theAnchor[7], arrow[7], theAnchor[8], arrow[8], theAnchor[9], arrow[9], theAnchor[10], arrow[10], theAnchor[12], arrow[12] ); } sendString(buf); for(idx=pageNum*myGlobals.runningPref.maxNumLines; idxhostNumIpAddress; if((tmpName1[0] == '\0') || (strcmp(tmpName1, "0.0.0.0") == 0)) tmpName1 = myGlobals.separator; if(!myGlobals.device[myGlobals.actualReportDeviceId].dummyDevice) { tmpName2 = getVendorInfo(el->ethAddress, 1); if(tmpName2[0] == '\0') tmpName2 = myGlobals.separator; tmpName3 = el->ethAddressString; if((tmpName3[0] == '\0') || (strcmp(tmpName3, "00:00:00:00:00:00") == 0)) tmpName3 = myGlobals.separator; } else { tmpName2 = myGlobals.separator; tmpName3 = myGlobals.separator; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); sendString(makeHostLink(el, FLAG_HOSTLINK_HTML_FORMAT, 0, 1, hostLinkBuf, sizeof(hostLinkBuf))); if(!myGlobals.device[myGlobals.actualReportDeviceId].dummyDevice) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", macBuf, tmpName3); } else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s\n", tmpName3); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", tmpName1); } sendString(buf); if(el->community == NULL) safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), ""); else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", el->community, el->community); sendString(buf); sendString(""); printBar(buf, sizeof(buf), el->actBandwidthUsageS, el->actBandwidthUsageR, maxBandwidthUsage, 1); #if 0 if(!myGlobals.device[myGlobals.actualReportDeviceId].dummyDevice) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", tmpName2); sendString(buf); } #endif { char shortBuf[8]; if(!subnetPseudoLocalHost(el)) { i = guessHops(el); } else i = 0; safe_snprintf(__FILE__, __LINE__, shortBuf, sizeof(shortBuf), "%d", i % 256); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", (i == 0) ? "" : shortBuf); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", (unsigned long)(el->totContactedSentPeers+el->totContactedRcvdPeers)); sendString(buf); #if 0 /* Time distance */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", formatLatency(el->maxLatency, FLAG_STATE_ACTIVE)); sendString(buf); #endif if(el->lastSeen > myGlobals.actTime) el->lastSeen = myGlobals.actTime; if(el->firstSeen > myGlobals.actTime) el->firstSeen = myGlobals.actTime; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", formatSeconds(el->lastSeen - el->firstSeen, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", formatSeconds(myGlobals.actTime-el->lastSeen, formatBuf, sizeof(formatBuf))); sendString(buf); if(el->hostAS == 0) { sendString(""); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", el->hostAS, el->hostAS); sendString(buf); } { sendString(""); } sendString("\n"); printedEntries++; /* Avoid huge tables */ if(printedEntries > myGlobals.runningPref.maxNumLines) break; } else { traceEvent(CONST_TRACE_WARNING, "qsort() problem!"); } } sendString("
%s1\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s%s2\">IP Address%s%s11\">Community%s%s6\">Other Name(s)%s%s4\">Inbound vs Outbound%s%s7\">Hops Distance%s%s8\">Host Contacts%s%s9\">Age/Inactivity%s%s10\">AS%s%s11\">Fingerprint%s
%s", tmpName1); sendString(buf); if(tmpName3 != myGlobals.separator) { char macBuf[32]; safe_snprintf(__FILE__, __LINE__, macBuf, sizeof(macBuf), "%s", tmpName3); macBuf[2] = macBuf[5] = macBuf[8] = macBuf[11] = macBuf[14] = '_'; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s%s %s"); if(el->nonIPTraffic) { short numAddresses = 0; if(el->nonIPTraffic->nbHostName && el->nonIPTraffic->nbDomainName) { if((el->nonIPTraffic->nbAccountName != NULL) && ((el->nonIPTraffic->nbAccountName[0] != '0'))) { if((el->nonIPTraffic->nbDomainName != NULL) && (el->nonIPTraffic->nbDomainName[0] != '0')) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s %s@%s [%s]", getOSFlag(el, "Windows", 0, osBuf, sizeof(osBuf)), el->nonIPTraffic->nbAccountName, el->nonIPTraffic->nbHostName, el->nonIPTraffic->nbDomainName); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s %s@%s", getOSFlag(el, "Windows", 0, osBuf, sizeof(osBuf)), el->nonIPTraffic->nbAccountName, el->nonIPTraffic->nbHostName); } } else { if((el->nonIPTraffic->nbDomainName != NULL) && (el->nonIPTraffic->nbDomainName[0] != '0')) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s %s [%s]", getOSFlag(el, "Windows", 0, osBuf, sizeof(osBuf)), el->nonIPTraffic->nbHostName, el->nonIPTraffic->nbDomainName); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s %s", getOSFlag(el, "Windows", 0, osBuf, sizeof(osBuf)), el->nonIPTraffic->nbHostName); } } sendString(buf); numAddresses++; } else if(el->nonIPTraffic->nbHostName) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s %s", getOSFlag(el, "Windows", 0, osBuf, sizeof(osBuf)), el->nonIPTraffic->nbHostName); sendString(buf); numAddresses++; } if(el->nonIPTraffic->nbDescr) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), ": %s", el->nonIPTraffic->nbDescr); sendString(buf); } } sendString(" %s %s%lu%s-", formatLatency(el->minLatency, FLAG_STATE_ACTIVE)); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s%s%s " "%d" ""); for(i=0; iflags))) sendString("\n"); else sendString("\n"); } sendString("
"TABLE_OFF"

\n"); sendString("

\n"); printFooterHostLink(); printBandwidthFooter(); sprintf(totalHosts,"Total Filtered Host Count: %u. Total Hosts Seen on Interface: %u.",numEntries,maxHosts); sendString(totalHosts); addPageIndicator(CONST_HOSTS_INFO_HTML, pageNum, numEntries, myGlobals.runningPref.maxNumLines, revertOrder, abs(sortedColumn), -1); } } free(tmpTable); free(vlanList); free(ifList); free(knownSubnets); } /* ************************************ */ static void printHostNwDelay(HostTraffic *el, int actualDeviceId, NetworkDelay *delay, u_int clientDelay) { int i; char buf[2*LEN_GENERAL_WORK_BUFFER]; sendString(""TABLE_ON"\n" "" "\n"); for(i=0; i" "" "\n", getRowColor(), ctime(&when), myGlobals.ipTrafficProtosNames[i] ? myGlobals.ipTrafficProtosNames[i] : "???", webHostName, ((float)delay[i].min_nw_delay)/1000, delay[i].total_delay/(delay[i].num_samples*1000), ((float)delay[i].max_nw_delay)/1000); sendString(buf); } sendString("
Last TimeServiceLast "); if(!clientDelay) sendString("Client"); else sendString(" Server"); sendString(" Contact"); if(clientDelay) sendString("Client"); else sendString("Server"); sendString(" Delay [min/avg/max]
%s%s%s%.02f/%.02f/%.02f ms
"TABLE_OFF"\n"); } /* ************************************ */ static void printHostFingerprint(HostTraffic *el) { int idx; char fingerprint[4096] = { '\0' }; return; for(idx=1; idxclientUses > 0) && (ports->serverUses > 0)) value = 3; else if(ports->serverUses > 0) value = 2; else if(ports->clientUses > 0) value = 1; } if(value > 0) snprintf(&fingerprint[strlen(fingerprint)], sizeof(fingerprint)-strlen(fingerprint), "%d", value); } traceEvent(CONST_TRACE_WARNING, "[%s][%s][len=%d]", el->hostNumIpAddress, fingerprint, (int)sizeof(el->flags)); } /* ************************************ */ static u_int8_t isMacAddress(char* host) { int fields_num, fields[6]; if(strlen(host) != 17) return(0); fields_num = sscanf(host, "%X:%X:%X:%X:%X:%X", &fields[0], &fields[1], &fields[2], &fields[3], &fields[4], &fields[5]); return(fields_num == 6 ? 1 : 0); } /* ************************************ */ void printAllSessionsHTML(char* host, int actualDeviceId, int sortedColumn, int revertOrder, int pageNum, char *url) { u_int idx, i, cols = 0, show_div_8 = 0; u_int16_t vlanId = NO_VLAN; HostTraffic *el=NULL; char buf[LEN_GENERAL_WORK_BUFFER]; char formatBuf[32], portBuf[32], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER], custom_host_name[128], buf2[128], linkName[64], vlanStr[16]; u_short found = 0; char *tok; u_int8_t search_mac = isMacAddress(host), showServices, have_sessions; Counter fragments; /* Skip symbolic host names and handle only numeric ones */ if(isdigit(host[0]) && (strchr(host, '.') == NULL)) { if((tok = strchr(host, '-')) != NULL) { vlanId = atoi(&tok[1]); *tok = '\0'; } } unescape(buf, sizeof(buf), host); // traceEvent(CONST_TRACE_WARNING, "%s(%s)", __FUNCTION__, host); /* ****************************** */ for(el = getFirstHost(actualDeviceId); el != NULL; el = getNextHost(actualDeviceId, el)) { if(el->community && (!isAllowedCommunity(el->community))) continue; if( (((!search_mac) && (strcmp(el->hostNumIpAddress, buf) == 0)) || (search_mac && el->l2Host && (strcmp(el->ethAddressString, buf) == 0)) || (strstr(el->hostResolvedName, buf) != NULL) ) && ((vlanId == NO_VLAN) || ((el->vlanId <= 0) || (el->vlanId == vlanId)))) { found = 1; break; } } /* Dennis Schoen (dennis@cns.dnsalias.org) * * send 404 if we cannot generate the requested page */ if((el == NULL) || (!found)) { char errorAdditionalText[1024], whois[256]; safe_snprintf(__FILE__, __LINE__, whois, sizeof(whois), "[
Whois ]
\n" "" "" "" "" "" "" "\n"); i++; } if(svc != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", getRowColor(), svc, idx); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", getRowColor(), idx, idx); } sendString(buf); if(ports->clientUses > 0) { /* Fix below courtesy of Andreas Pfaller */ HostTraffic tmpEl; if(emptySerial(&ports->clientUsesLastPeer)) peerHost = NULL; else peerHost = quickHostLink(ports->clientUsesLastPeer, actualDeviceId, &tmpEl); if(peerHost == NULL) { /* Courtesy of Roberto De Luca */ strncpy(webHostName, " ", sizeof(webHostName)); } else strncpy(webHostName, makeHostLink(peerHost, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf)), sizeof(webHostName)); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", ports->clientUses, formatBytes(ports->clientTraffic.value, 1, formatBuf, sizeof(formatBuf)), webHostName); sendString(buf); } else sendString(""); if(ports->serverUses > 0) { HostTraffic tmpEl; if(emptySerial(&ports->serverUsesLastPeer)) peerHost = NULL; else peerHost = quickHostLink(ports->serverUsesLastPeer, actualDeviceId, &tmpEl); if(peerHost == NULL) { /* Courtesy of Roberto De Luca */ strncpy(webHostName, " ", sizeof(webHostName)); } else strncpy(webHostName, makeHostLink(peerHost, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf)), sizeof(webHostName)); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", ports->serverUses, formatBytes(ports->serverTraffic.value, 1, formatBuf, sizeof(formatBuf)), webHostName); sendString(buf); } else sendString(""); } } } if(i > 0) { sendString("
IP ServicePort# Client Sess.Last Client Peer# Server Sess.Last Server Peer
%s%d
%d%d%d/%s%s  %d/%s%s
  
"TABLE_OFF"

\n"); sendString("\n"); } if((el->otherIpPortsRcvd[MAX_NUM_RECENT_PORTS-1] >= 0) || (el->otherIpPortsSent[MAX_NUM_RECENT_PORTS-1] >= 0)) { /* We have something to show */ int numPrinted; printSectionTitle("Traffic on Other Port(s)\n"); sendString("

\n"); sendString(""TABLE_ON"\n" "" "\n"); sendString("
Client PortServer Port
    "); for(idx=0, numPrinted=0; idxotherIpPortsSent[idx] >= 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • %s\n", el->otherIpPortsSent[idx], getAllPortByNum(el->otherIpPortsSent[idx], portBuf, sizeof(portBuf))); sendString(buf); numPrinted++; } } if(numPrinted == 0) sendString(" "); sendString("
    "); for(idx=0, numPrinted=0; idxotherIpPortsRcvd[idx] >= 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • %s\n", el->otherIpPortsRcvd[idx], getAllPortByNum(el->otherIpPortsRcvd[idx], portBuf, sizeof(portBuf))); sendString(buf); numPrinted++; } } if(numPrinted == 0) sendString(" "); sendString("
"TABLE_OFF"
"); } /* ****************************************************************** */ if((el->recentlyUsedClientPorts[MAX_NUM_RECENT_PORTS-1] >= 0) || (el->recentlyUsedServerPorts[MAX_NUM_RECENT_PORTS-1] >= 0)) { /* We have something to show */ int numPrinted; printSectionTitle("Recently Used Ports\n"); sendString("
\n"); sendString(""TABLE_ON"\n" "" "\n"); sendString("
Client PortServer Port
    "); for(idx=0, numPrinted=0; idxrecentlyUsedClientPorts[idx] >= 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • %s\n", el->recentlyUsedClientPorts[idx], getAllPortByNum(el->recentlyUsedClientPorts[idx], portBuf, sizeof(portBuf))); sendString(buf); numPrinted++; } } if(numPrinted == 0) sendString(" "); sendString("
    "); for(idx=0, numPrinted=0; idxrecentlyUsedServerPorts[idx] >= 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • %s\n", el->recentlyUsedServerPorts[idx], getAllPortByNum(el->recentlyUsedServerPorts[idx], portBuf, sizeof(portBuf))); sendString(buf); numPrinted++; } } if(numPrinted == 0) sendString(" "); sendString("
"TABLE_OFF"
\n"); } sendString("\n\n"); } /* *************************************************** */ if(el->clientDelay || el->serverDelay) { sendString("\n\n
\n"); printSectionTitle("Recent Sessions: Network Delay"); sendString("

\n

\n"); sendString(""TABLE_ON"\n"); if(el->clientDelay) sendString(""); if(el ->serverDelay) sendString("\n"); sendString(""); if(el->clientDelay) { sendString(""); } if(el->serverDelay) { sendString(""); } sendString("\n

\n

1) sendString(" colspan=2"); sendString(" align=left>
  • Scenario: client <--> ntop <--> server" "
  • Client Delay: the network delay (computed as RTT/2) taken" "
    by a packet sent by the client to reach ntop" "
  • Server Delay: the network delay (computed as RTT/2) taken" "
    by a packet sent by the server to reach ntop" "
  • All times are majored during TCP 3-way handshake" "
\n"); sendString("
Client ModeServer Mode
"); printHostNwDelay(el, actualDeviceId, el->clientDelay, 1), cols++; sendString(""); printHostNwDelay(el, actualDeviceId, el->serverDelay, 0), cols++; sendString("
\n

\n"); sendString("\n

\n"); } if(have_sessions) { sendString("\n\n\n"); sendString("\n\n
\n"); printActiveSessions(actualDeviceId, 0, el); sendString("\n
\n"); } sendString("\n\n\n"); } /* ************************************ */ void printLocalRoutersList(int actualDeviceId) { char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; HostTraffic *el; u_int i, numEntries=0; HostTraffic *routerList[MAX_NUM_ROUTERS]; printHTMLheader("Local Subnet Routers", NULL, 0); for(el = getFirstHost(actualDeviceId); el != NULL; el = getNextHost(actualDeviceId, el)) { if(isSetHostFlag(FLAG_GATEWAY_HOST, el) && (numEntries < MAX_NUM_ROUTERS)) { routerList[numEntries++] = el; } } /* for */ if(numEntries == 0) { printNoDataYet(); return; } else { sendString("
\n"); sendString(""TABLE_ON"\n"); for(i=0; i\n", getRowColor(), makeHostLink(routerList[i], FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString(buf); sendString("
Router Name
%s
"TABLE_OFF"\n"); sendString("
\n"); printHostColorCode(FALSE, 0); printFooterHostLink(); } } } /* ************************************ */ void printIpAccounting(int remoteToLocal, int sortedColumn, int revertOrder, int pageNum) { u_int idx, numEntries=0, maxHosts; int printedEntries=0; HostTraffic *el, **tmpTable; char buf[LEN_GENERAL_WORK_BUFFER], *str=NULL, *sign, *title=NULL; Counter totalBytesSent, totalBytesRcvd, totalBytes, a=0, b=0; float sentpct, rcvdpct; time_t timeDiff = time(NULL)-myGlobals.initialSniffTime; char *arrowGif, *arrow[48], *theAnchor[48], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; char htmlAnchor[64], htmlAnchor1[64]; char formatBuf[32], formatBuf1[32], formatBuf2[32], formatBuf3[32]; switch(remoteToLocal) { case FLAG_REMOTE_TO_LOCAL_ACCOUNTING: str = CONST_IP_R_2_L_HTML; title = "Remote to Local IP Traffic"; break; case FLAG_REMOTE_TO_REMOTE_ACCOUNTING: str = CONST_IP_R_2_R_HTML; title = "Remote to Remote IP Traffic"; break; case FLAG_LOCAL_TO_REMOTE_ACCOUNTING: str = CONST_IP_L_2_R_HTML; title = "Local to Remote IP Traffic"; break; case FLAG_LOCAL_TO_LOCAL_ACCOUNTING: str = CONST_IP_L_2_L_HTML; title = "Local IP Traffic"; break; } printHTMLheader(title, NULL, 0); if(revertOrder) { sign = ""; arrowGif = " " CONST_IMG_ARROW_UP; } else { sign = "-"; arrowGif = " " CONST_IMG_ARROW_DOWN; } totalBytesSent=0, totalBytesRcvd=0; maxHosts = myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno; /* save it as it can change */ tmpTable = (HostTraffic**)mallocAndInitWithReportWarn(maxHosts*sizeof(HostTraffic*), "printIpAccounting"); if(tmpTable == NULL) return; for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if((broadcastHost(el) == 0) /* No broadcast addresses please */ && (multicastHost(el) == 0) /* No multicast addresses please */ && ((el->hostNumIpAddress[0] != '\0') && (!addrnull(&el->hostIpAddress)) /* This host speaks IP */)) { if(el->community && (!isAllowedCommunity(el->community))) continue; switch(remoteToLocal) { case FLAG_REMOTE_TO_LOCAL_ACCOUNTING: if(!subnetPseudoLocalHost(el)) { if((el->bytesSentLoc.value > 0) || (el->bytesRcvdLoc.value > 0)) { tmpTable[numEntries++]=el; totalBytesSent += el->bytesSentLoc.value; totalBytesRcvd += el->bytesRcvdLoc.value; } } break; case FLAG_REMOTE_TO_REMOTE_ACCOUNTING: if(!subnetPseudoLocalHost(el)) { if((el->bytesSentRem.value > 0) || (el->bytesRcvdFromRem.value > 0)) { tmpTable[numEntries++]=el; totalBytesSent += el->bytesSentRem.value; totalBytesRcvd += el->bytesRcvdFromRem.value; } } break; case FLAG_LOCAL_TO_REMOTE_ACCOUNTING: if(subnetPseudoLocalHost(el)) { if((el->bytesSentRem.value > 0) || (el->bytesRcvdFromRem.value > 0)) { tmpTable[numEntries++]=el; totalBytesSent += el->bytesSentRem.value; totalBytesRcvd += el->bytesRcvdFromRem.value; } } break; case FLAG_LOCAL_TO_LOCAL_ACCOUNTING: if(subnetPseudoLocalHost(el)) { if((el->bytesSentLoc.value > 0) || (el->bytesRcvdLoc.value > 0)) { tmpTable[numEntries++]=el; totalBytesSent += el->bytesSentLoc.value; totalBytesRcvd += el->bytesRcvdLoc.value; } } break; } if(numEntries >= maxHosts) break; } } if(numEntries > 0) { int i; myGlobals.columnSort = sortedColumn; myGlobals.sortFilter = remoteToLocal; qsort(tmpTable, numEntries, sizeof(HostTraffic*), cmpHostsFctn); safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), "\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), ""TABLE_ON"\n" "" "\n" "" "\n", theAnchor[1], arrow[1], theAnchor[2], arrow[2], theAnchor[3], arrow[3], theAnchor[4], arrow[4]); sendString(buf); for(idx=pageNum*myGlobals.runningPref.maxNumLines; idxhostNumIpAddress; if((tmpName1[0] == '\0') || (strcmp(tmpName1, "0.0.0.0") == 0)) tmpName1 = myGlobals.separator; switch(remoteToLocal) { case FLAG_REMOTE_TO_LOCAL_ACCOUNTING: a = el->bytesSentLoc.value; b = el->bytesRcvdLoc.value; break; case FLAG_REMOTE_TO_REMOTE_ACCOUNTING: a = el->bytesSentRem.value; b = el->bytesRcvdFromRem.value; break; case FLAG_LOCAL_TO_REMOTE_ACCOUNTING: a = el->bytesSentRem.value; b = el->bytesRcvdFromRem.value; break; case FLAG_LOCAL_TO_LOCAL_ACCOUNTING: a = el->bytesSentLoc.value; b = el->bytesRcvdLoc.value; break; } if(a < 100) /* Avoid very small decimal values */ sentpct = 0; else sentpct = (100*(float)a)/totalBytesSent; if(b < 100) /* Avoid very small decimal values */ rcvdpct = 0; else rcvdpct = (100*(float)b)/totalBytesRcvd; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "%s" "" "\n", getRowColor(), makeHostLink(el, FLAG_HOSTLINK_HTML_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf)), tmpName1, formatBytes(a, 1, formatBuf, sizeof(formatBuf)), sentpct, myGlobals.separator, formatBytes(b, 1, formatBuf1, sizeof(formatBuf1)), rcvdpct, myGlobals.separator); sendString(buf); /* Avoid huge tables */ if(printedEntries++ > myGlobals.runningPref.maxNumLines) break; } } sendString("
" "%s1>Host%s%s2>IP Address%s%s3>Data Sent%s%s4>Data Rcvd%s
%s%s%.1f%s%%%s%.1f%s%%
"TABLE_OFF"\n"); addPageIndicator(str, pageNum, numEntries, myGlobals.runningPref.maxNumLines, revertOrder, abs(sortedColumn), -1); sendString("

"TABLE_ON"\n" "\n" "\n"); totalBytes = totalBytesSent+totalBytesRcvd; /* In this case the total traffic is just half and the following statement holds: totalBytesSent == totalBytesRcvd Courtesy of Jac Engel */ if(remoteToLocal == FLAG_LOCAL_TO_LOCAL_ACCOUNTING) totalBytes /= 2; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "" "" "\n", formatBytes(totalBytes, 1, formatBuf, sizeof(formatBuf)), formatBytes(totalBytesSent, 1, formatBuf1, sizeof(formatBuf1)), formatBytes(totalBytesRcvd, 1, formatBuf2, sizeof(formatBuf2)), formatThroughput((float)(totalBytes/timeDiff), 1, formatBuf3, sizeof(formatBuf3))); sendString(buf); sendString("
Total TrafficData SentData RcvdUsed Bandwidth
%s%s%s%s
"TABLE_OFF"\n"); sendString("\n"); printFooterHostLink(); } else printNoDataYet(); free(tmpTable); } /* ********************************** */ #ifdef PRINT_SESSION_DETAILS static char* print_flags(IPSession *session, char *buf, int buf_len) { snprintf(buf, buf_len,"%s%s%s%s%s ", (session->lastFlags & TH_SYN) ? " SYN" : "", (session->lastFlags & TH_ACK) ? " ACK" : "", (session->lastFlags & TH_FIN) ? " FIN" : "", (session->lastFlags & TH_RST) ? " RST" : "", (session->lastFlags & TH_PUSH) ? " PUSH" : ""); return(buf); } #endif /* ********************************** */ void printActiveSessions(int actualDeviceId, int pageNum, HostTraffic *el) { int idx; char buf[1500], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER], hostLinkBuf1[3*LEN_GENERAL_WORK_BUFFER], *voipStr; #ifdef PRINT_SESSION_DETAILS char flags_buf[64]; #endif u_int numSessions, printedSessions; char formatBuf[64], formatBuf1[64], formatBuf2[64], formatBuf4[64], formatBuf5[64], formatBuf6[64], formatBuf7[64]; if(!myGlobals.runningPref.enableSessionHandling) { if(el != NULL) return; printHTMLheader("Active Sessions", NULL, 0); printNotAvailable("-z or --disable-sessions"); return; } if((myGlobals.device[actualDeviceId].sessions == NULL) || (myGlobals.device[actualDeviceId].numSessions == 0)) { printHTMLheader("Active Sessions", NULL, 0); printNoDataYet(); return; } if(myGlobals.device[actualDeviceId].numSessions < pageNum*myGlobals.runningPref.maxNumLines) pageNum = myGlobals.device[actualDeviceId].numSessions / pageNum*myGlobals.runningPref.maxNumLines; /* Due to the way sessions are handled, sessions before those to display need to be skipped */ for(idx=0, numSessions=0, printedSessions=0; idx= el->numHostSessions)) break; */ mutex_idx = idx % NUM_SESSION_MUTEXES; accessMutex(&myGlobals.sessionsMutex[mutex_idx], "printActiveSessions"); if(myGlobals.device[myGlobals.actualReportDeviceId].sessions[idx] != NULL) { char *sport, *dport; Counter dataSent, dataRcvd; IPSession *session = myGlobals.device[myGlobals.actualReportDeviceId].sessions[idx]; while(session != NULL) { if(printedSessions >= myGlobals.runningPref.maxNumLines) break; if((session->initiator->magic != CONST_MAGIC_NUMBER) || (session->remotePeer->magic != CONST_MAGIC_NUMBER)) { traceEvent(CONST_TRACE_WARNING, "Session with expired peer (%d/%d)", session->initiator->magic, session->remotePeer->magic); session = session->next; continue; } #ifndef PARM_PRINT_ALL_SESSIONS if(session->sessionState != FLAG_STATE_ACTIVE) { session = session->next; continue; } #endif if(el && (session->initiator != el) && (session->remotePeer != el)) { session = session->next; continue; } if((numSessions++) < pageNum*myGlobals.runningPref.maxNumLines) { session = session->next; continue; } if(printedSessions == 0) { if(el == NULL) { snprintf(buf, sizeof(buf), "%u Active Sessions", myGlobals.device[actualDeviceId].numSessions); printHTMLheader(buf, NULL, 0); } sendString("

\n" TABLE_ON"" "" "" "" "" "" "" "" "" "" ); #ifdef PRINT_SESSION_DETAILS sendString(""); #if defined(PARM_PRINT_ALL_SESSIONS) sendString(""); #endif #endif sendString("\n"); } sport = getPortByNum(session->sport, session->proto); dport = getPortByNum(session->dport, session->proto); dataSent = session->bytesSent.value; dataRcvd = session->bytesRcvd.value; if(sport == NULL) { static char _sport[8]; safe_snprintf(__FILE__, __LINE__, _sport, 8, "%d", session->sport); sport = _sport; } if(dport == NULL) { static char _dport[8]; safe_snprintf(__FILE__, __LINE__, _dport, 8, "%d", session->dport); dport = _dport; } /* Sanity check */ if((myGlobals.actTime < session->firstSeen) || (session->firstSeen == 0)) session->firstSeen = myGlobals.actTime; if((myGlobals.actTime < session->lastSeen) || (session->lastSeen == 0)) session->lastSeen = myGlobals.actTime; if(session->voipSession) voipStr = " <VoIP>"; else voipStr = ""; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "" "", dport); sendString(buf); /* Sanitize */ if(myGlobals.actTime < session->lastSeen) session->lastSeen = myGlobals.actTime; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "" "" "" "" "" #ifdef PRINT_SESSION_DETAILS "" #endif , formatBytes(dataSent, 1, formatBuf, sizeof(formatBuf)), formatBytes(dataRcvd, 1, formatBuf1, sizeof(formatBuf1)), formatTime(&session->firstSeen, formatBuf2, sizeof(formatBuf2)), formatSeconds(session->lastSeen-session->firstSeen, formatBuf4, sizeof(formatBuf4)), formatSeconds(myGlobals.actTime-session->lastSeen, formatBuf5, sizeof(formatBuf5)), formatLatency(session->clientNwDelay, session->sessionState, formatBuf6, sizeof(formatBuf6)), formatLatency(session->serverNwDelay, session->sessionState, formatBuf7, sizeof(formatBuf7)), getProtoName(session->proto, session->l7.major_proto) #ifdef PRINT_SESSION_DETAILS , session->session_info ? session->session_info : print_flags(session, flags_buf, sizeof(flags_buf)) /* " " */ #endif ); sendString(buf); #ifdef PRINT_SESSION_DETAILS #ifdef PARM_PRINT_ALL_SESSIONS safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getSessionState(session)); sendString(buf); #endif #endif sendString("\n"); session = session->next; printedSessions++; } } releaseMutex(&myGlobals.sessionsMutex[mutex_idx]); } /* for */ if(printedSessions > 0) { sendString("
ProtoClientServerData Sent/RcvdActive SinceDurationInactiveClient/Server Nw DelayL7 ProtoNoteState
%s", getRowColor(), proto2name(session->proto)); sendString(buf); sendString(makeHostLink(session->initiator, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), ":%s%s%s", sport, session->isP2P == 1 ? " <P2P>" : "", voipStr); sendString(buf); sendString(makeHostLink(session->remotePeer, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf1, sizeof(hostLinkBuf1))); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), ":%s%s%s%s%s%s%s%s%s%s%s
"TABLE_OFF"

\n"); sendString("

\n"); if(el && (printedSessions >= myGlobals.runningPref.maxNumLines)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Too many host sessions: Output limited to %d sessions

", myGlobals.runningPref.maxNumLines); sendString(buf); } if(el == NULL) addPageIndicator(CONST_ACTIVE_SESSIONS_HTML, pageNum, myGlobals.device[actualDeviceId].numSessions, myGlobals.runningPref.maxNumLines, -1, 0, -1); printHostColorCode(FALSE, 0); printFooterHostLink(); } else { if(el == NULL) { printHTMLheader("Active TCP/UDP Sessions", NULL, 0); printNoDataYet(); } } } /* ********************************** */ void printIpProtocolUsage(void) { HostTraffic **hosts, *el; u_short clientPorts[MAX_ASSIGNED_IP_PORTS], serverPorts[MAX_ASSIGNED_IP_PORTS]; u_int j, idx1, hostsNum=0, numPorts=0, maxHosts; char buf[LEN_GENERAL_WORK_BUFFER], portBuf[32], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; PortUsage *ports; printHTMLheader("TCP/UDP: Local Protocol Usage", NULL, 0); memset(clientPorts, 0, sizeof(clientPorts)); memset(serverPorts, 0, sizeof(serverPorts)); hosts = (HostTraffic**)mallocAndInitWithReportWarn(myGlobals.device[myGlobals.actualReportDeviceId]. hosts.hostsno*sizeof(HostTraffic*), "printIpProtocolUsage"); if(hosts == NULL) return; maxHosts = myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno; for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if(el->community && (!isAllowedCommunity(el->community))) continue; if(subnetPseudoLocalHost(el) && (el->hostNumIpAddress[0] != '\0')) { hosts[hostsNum++] = el; if(el->portsUsage != NULL) { ports = el->portsUsage; while(ports) { j = ports->port; if((clientPorts[j] == 0) && (serverPorts[j] == 0)) numPorts++; clientPorts[j] += ports->clientUses; serverPorts[j] += ports->serverUses; ports = ports->next; } } } if(hostsNum >= maxHosts) break; } /* for */ if(numPorts == 0) { printNoDataYet(); free(hosts); return; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "

Reporting on actual traffic for %d host(s) on %d service port(s)

\n", hostsNum, numPorts); sendString(buf); /* Hosts are now in a contiguous structure (hosts[])... */ sendString("
\n"); sendString(""TABLE_ON"" "\n"); for(j=0; j 0) || (serverPorts[j] > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" ""); } /* for */ sendString("
ServiceClientsServers
%s%d\n", getRowColor(), getAllPortByNum(j, portBuf, sizeof(portBuf)), j); sendString(buf); if(clientPorts[j] > 0) { sendString("
    "); for(idx1=0; idx1portsUsage != NULL) && ports && (ports->clientUses > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • %s\n", makeHostLink(hosts[idx1], FLAG_HOSTLINK_TEXT_FORMAT, 1, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString(buf); } } sendString("
"); } else sendString(" "); sendString("
"); if(serverPorts[j] > 0) { sendString("
    "); for(idx1=0; idx1portsUsage != NULL) && ports && (ports->serverUses > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • %s\n", makeHostLink(hosts[idx1], FLAG_HOSTLINK_TEXT_FORMAT, 1, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString(buf); } } sendString("
"); } else sendString(" "); sendString("
"TABLE_OFF"

\n"); sendString("

\n"); printHostColorCode(FALSE, 0); printFooterHostLink(); free(hosts); } /* ********************************** */ void printBar(char *buf, int bufLen, unsigned short percentageS, /* or the ONLY percentage if R = FLAG_NONSPLITBAR */ unsigned short percentageR, unsigned short maxPercentage, unsigned short ratio) { /* This shouldn't happen */ if(maxPercentage > 100) { maxPercentage = 100; } if(percentageR == FLAG_NONSPLITBAR) { /* Single bar */ if(percentageS > maxPercentage) { percentageS = maxPercentage; } switch(percentageS) { case 0: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "
 " "\"%d%%\"" "  \"Received  \"Sent
" "\n"); perc = 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value); if(perc > 100) perc = 100; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" ""); } else printGraph = 0; printTableEntry(buf, sizeof(buf), "(R)ARP", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].arpRarpBytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].arpRarpBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value), 0, 0, 0); printTableEntry(buf, sizeof(buf), "IPsec", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].ipsecBytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].ipsecBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value), 0, 0, 0); printTableEntry(buf, sizeof(buf), "NetBios", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].netbiosBytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].netbiosBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value), 0, 0, 0); printTableEntry(buf, sizeof(buf), "GRE", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].greBytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].greBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value), 0, 0, 0); printTableEntry(buf, sizeof(buf), "IPv6", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].ipv6Bytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].ipv6Bytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value), 0, 0, 0); printTableEntry(buf, sizeof(buf), "STP", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].stpBytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].stpBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value), 0, 0, 0); printTableEntry(buf, sizeof(buf), "Other", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].otherBytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].otherBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value), 0, 0, 0); if(printGraph) { sendString("\n"); } total = 0; for(i=0; i"TABLE_OFF"\n" "\n\n" "
\n"); if(total > 0) { sendString(TABLE_ON"
L2/L3 ProtocolDataPercentage
IP%s" "%.1f%%" "", getRowColor(), formatBytes(myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value, 1, formatBuf, sizeof(formatBuf)), perc); sendString(buf); printTableEntry(buf, sizeof(buf), "TCP", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].tcpBytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].tcpBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value), 0, 0, 0); printTableEntry(buf, sizeof(buf), "UDP", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].udpBytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].udpBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value), 0, 0, 0); printTableEntry(buf, sizeof(buf), "ICMP", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].icmpBytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].icmpBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value), 0, 0, 0); printTableEntry(buf, sizeof(buf), "ICMPv6", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].icmp6Bytes.value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].icmp6Bytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value), 0, 0, 0); if(myGlobals.device[myGlobals.actualReportDeviceId].ipProtosList) { ProtocolsList *protoList = myGlobals.ipProtosList; int idx = 0; while(protoList != NULL) { printTableEntry(buf, sizeof(buf), protoList->protocolName, CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].ipProtosList[idx].value/1024, 100*((float)myGlobals.device[myGlobals.actualReportDeviceId].ipProtosList[idx].value/ myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value), 0, 0, 0); idx++, protoList = protoList->next; } } printTableEntry(buf, sizeof(buf), "Other IP", CONST_COLOR_1, (float)myGlobals.device[myGlobals.actualReportDeviceId].otherIpBytes.value/1024, ((float)myGlobals.device[myGlobals.actualReportDeviceId].otherIpBytes.value/ myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value), 0, 0, 0); sendString("
"TABLE_OFF"
"); drawGlobalProtoDistribution(); sendString("
"); sendString("" "\n"); sendString("\n\n"); for(i=0; i 0) { float v1 = val/1024; float v2 = (val*100)/((float)total); /* traceEvent(CONST_TRACE_WARNING, "%s %f/%f %f/%f", getProtoName(0, i), val, total, v1, v2); */ printTableEntry(buf, sizeof(buf), getProtoName(0, i), (i % 2) ? CONST_COLOR_1 : CONST_COLOR_2, v1, v2, 0, 0, 1); } /* if */ } /* for */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/interfaces/%s", myGlobals.rrdPath != NULL ? myGlobals.rrdPath : ".", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique]); revertSlashIfWIN32(buf, 0); if(stat(buf, &statbuf) == 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (u_int)(myGlobals.actTime - 12 * 3600), (u_int)myGlobals.actTime); sendString(buf); } } else { printNoDataYet(); } sendString("
Application ProtocolDataPercentage
"); drawDeviceServiceDistribution(); sendString("
Aggregated View" "
", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique]); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
"TABLE_OFF"

\n"); } /* ************************ */ static void rrdNotOperational(void) { sendString("

NOTE: this page is not operational when

  • the RRD plugin " "is disabled, misconfigured or missing.
  • ntop reads packets from a pcap file
" "

Please check the ntop log file for additional information about this matter.

"); } /* ************************ */ #define RRD_THPT_URL "/plugins/rrdPlugin?action=arbreq&which=graph&arbfile=throughput&arbiface=%s&arbip=&start=%u&end=%u&counter=&title=%s" #define RRD_THPT_STR "\"Domain-wide " void printThptStats(int sortedColumn _UNUSED_) { char tmpBuf[1024], formatBuf[32], formatBuf1[32]; struct stat statbuf; int i; time_t now = time(NULL); int beginUnique = (myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[0] == '/') ? 1 : 0; printHTMLheader("Network Load Statistics", NULL, 0); if(!strcmp(myGlobals.device[0].name, "pcap-file")) { rrdNotOperational(); return; } /* Do NOT add a '/' at the end of the path because Win32 will complain about it */ #ifdef WIN32 { unsigned long driveSerial; get_serial(&driveSerial); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), "%s/%u/interfaces/%s/throughput.rrd", myGlobals.rrdPath != NULL ? myGlobals.rrdVolatilePath : ".", driveSerial, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique]); } #else safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), "%s/interfaces/%s/throughput.rrd", myGlobals.rrdPath != NULL ? myGlobals.rrdVolatilePath : ".", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique]); #endif revertSlashIfWIN32(tmpBuf, 0); if((i = stat(tmpBuf, &statbuf)) != 0) { rrdNotOperational(); return; } sendString("\n" "
\n" "
\n" " \n" ); sendString("
\n\n"); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), RRD_THPT_STR, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(now-600), (unsigned int)now, "Last+10+Minutes+Throughput", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(now-600), (unsigned int)now, "Throughput" ); sendString(tmpBuf); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), "", formatTimeStamp(0, 0, 10, formatBuf, sizeof(formatBuf)), formatTimeStamp(0, 0, 0, formatBuf1, sizeof(formatBuf1))); sendString(tmpBuf); sendString("\n"); sendString("

Time [ %s through %s]

[ Top Talkers ]
\n\n"); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), RRD_THPT_STR, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(now-3600), (unsigned int)now, "Last+Hour+Throughput", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(now-3600), (unsigned int)now, "Throughput"); sendString(tmpBuf); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), "", formatTimeStamp(0, 0, 60, formatBuf, sizeof(formatBuf)), formatTimeStamp(0, 0, 0, formatBuf1, sizeof(formatBuf1))); sendString(tmpBuf); sendString("\n"); sendString("

Time [ %s through %s]

[ Top Talkers ]
\n\n"); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), RRD_THPT_STR, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(now-86400), (unsigned int)now, "Current+Day+Throughput", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(now-86400), (unsigned int)now, "Throughput"); sendString(tmpBuf); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), "", formatTimeStamp(0, 24, 0, formatBuf, sizeof(formatBuf)), formatTimeStamp(0, 0, 0, formatBuf1, sizeof(formatBuf1))); sendString(tmpBuf); sendString("\n"); sendString("

Time [ %s through %s]

[ Top Talkers ]
\n\n"); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), RRD_THPT_STR, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(now-86400*30), (unsigned int)now, "Last+Month+Throughput", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(now-86400*30), (unsigned int)now, "Throughput"); sendString(tmpBuf); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), "", formatTimeStamp(30, 0, 0, formatBuf, sizeof(formatBuf)), formatTimeStamp( 0, 0, 0, formatBuf1, sizeof(formatBuf1))); sendString(tmpBuf); sendString("\n"); sendString("

Time [ %s through %s]

[ Top Talkers ]
\n
\n

\n"); safe_snprintf(__FILE__, __LINE__, tmpBuf, sizeof(tmpBuf), "

" "[ Change Throughput Granularity ]

", formatTimeStamp(0, 0, 10, formatBuf, sizeof(formatBuf)), formatTimeStamp(0, 0, 0, formatBuf1, sizeof(formatBuf1))); sendString(tmpBuf); } /* ************************ */ static int cmpStatsFctn(const void *_a, const void *_b) { DomainStats *a = (DomainStats *)_a; DomainStats *b = (DomainStats *)_b; Counter a_=0, b_=0; int rc; if((a == NULL) && (b != NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpStatsFctn() (1)"); return(1); } else if((a != NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpStatsFctn() (2)"); return(-1); } else if((a == NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpStatsFctn() (3)"); return(0); } /* traceEvent(CONST_TRACE_INFO, "--> [columnSort=%d][network_mode_sort=%d]", myGlobals.columnSort, network_mode_sort); */ switch(myGlobals.columnSort) { case 0: if(network_mode_sort == NETWORK_VIEW) { char buf1[64], buf2[64]; char *nw_name_a = subnetId2networkName(a->known_subnet_id, buf1, sizeof(buf1)); char *nw_name_b = subnetId2networkName(b->known_subnet_id, buf2, sizeof(buf2)); /* traceEvent(CONST_TRACE_INFO, "--> [%s][%s]", nw_name_a, nw_name_b); */ return(strcmp(nw_name_a, nw_name_b)); } else if(network_mode_sort == AS_VIEW) { a_ = a->domainHost->hostAS , b_ = b->domainHost->hostAS; } else { /* Host */ return(cmpFctnResolvedName(&(a->domainHost), &(b->domainHost))); } break; case 1: /* Domain Flag */ /* We don't worry about whether this is single or multi domain, since if it is a single domain, our fallback to hostResolvedName will rule anyway. */ rc = cmpFctnLocationName(a, b); return(rc); case 2: a_ = a->bytesSent.value, b_ = b->bytesSent.value; break; case 3: a_ = a->bytesRcvd.value, b_ = b->bytesRcvd.value; break; case 4: a_ = a->tcpSent.value , b_ = b->tcpSent.value; break; case 5: a_ = a->tcpRcvd.value , b_ = b->tcpRcvd.value; break; case 6: a_ = a->udpSent.value , b_ = b->udpSent.value; break; case 7: a_ = a->udpRcvd.value , b_ = b->udpRcvd.value; break; case 8: a_ = a->icmpSent.value , b_ = b->icmpSent.value; break; case 9: a_ = a->icmpRcvd.value , b_ = b->icmpRcvd.value; break; case 10:a_ = a->icmp6Sent.value , b_ = b->icmp6Sent.value; break; case 11:a_ = a->icmp6Rcvd.value , b_ = b->icmp6Rcvd.value; break; } if(a_ < b_) return(1); else if(a_ > b_) return(-1); else return(0); } /* ****************************************** */ #define COMMUNITY_HEADER "community." #define COMMUNITY_HEADER_LEN strlen(COMMUNITY_HEADER) #define MAX_NUM_COMMUNITIES 16 /* if myGlobals.runningPref.domainName == NULL -> print all domains */ void printDomainStats(char* domain_network_name, int network_mode, int communityMode, int sortedColumn, int revertOrder, int pageNum) { u_int idx, tmpIdx, numEntries=0, printedEntries=0, maxHosts; short keyValue=0, i; HostTraffic *el; char buf[3*LEN_GENERAL_WORK_BUFFER], buf1[64]; DomainStats **stats, *tmpStats = NULL, *statsEntry; char htmlAnchor[2*LEN_GENERAL_WORK_BUFFER], htmlAnchor1[2*LEN_GENERAL_WORK_BUFFER], *sign, *arrowGif, *arrow[48], *theAnchor[48]; Counter totBytesSent=0, totBytesRcvd=0; char formatBuf[32], formatBuf1[32], formatBuf2[32], formatBuf3[32], formatBuf4[32], formatBuf5[32], formatBuf6[32], formatBuf7[32], formatBuf8[32], formatBuf9[32], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; NetworkStats localNetworks[MAX_NUM_COMMUNITIES][MAX_NUM_NETWORKS]; /* [0]=network, [1]=mask, [2]=broadcast, [3]=mask_v6 */ u_short numLocalNetworks[MAX_NUM_COMMUNITIES], totNumCommunities=0; u_char *communityNames[MAX_NUM_COMMUNITIES], debug = 0; int beginUnique = (myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[0] == '/') ? 1 : 0; network_mode_sort = network_mode; if(!communityMode) { char sym_nw_name[256] = { 0 }; if(domain_network_name == NULL) safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Statistics for all %s", (network_mode == NETWORK_VIEW) ? "Networks" : ((network_mode == AS_VIEW) ? "ASs" : "Domains")); else { char link_name[256] = { 0 }; if(network_mode > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s.name.%s", (network_mode == NETWORK_VIEW) ? "network" : "as", domain_network_name); if(fetchPrefsValue(buf, sym_nw_name, sizeof(sym_nw_name)) == -1) sym_nw_name[0] = '\0'; safe_snprintf(__FILE__, __LINE__, link_name, sizeof(link_name), " %s", CONST_EDIT_PREFS, (network_mode == NETWORK_VIEW) ? "network" : "as", domain_network_name, "\"Change"); } if((network_mode == AS_VIEW) || (network_mode == AS_GRAPH_VIEW)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Statistics for hosts in AS %s %s", atoi(domain_network_name), (sym_nw_name[0] == '\0') ? domain_network_name : sym_nw_name, link_name); } else { char tmp_buf[64], key[64], my_domain_network_name[64], *placeholder = domain_network_name; if(network_mode == NETWORK_VIEW) { safe_snprintf(__FILE__, __LINE__, my_domain_network_name, sizeof(my_domain_network_name), "%s", subnetId2networkName(atoi(domain_network_name), tmp_buf, sizeof(tmp_buf))); safe_snprintf(__FILE__, __LINE__, key, sizeof(key), "subnet.name.%s", tmp_buf); domain_network_name = my_domain_network_name; sym_nw_name[0] = '\0'; fetchPrefsValue(key, sym_nw_name, sizeof(sym_nw_name)); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Statistics for hosts in %s '%s' %s", (network_mode == NETWORK_VIEW) ? "network" : ((network_mode == AS_VIEW) ? "AS" : "domain"), (sym_nw_name[0] == '\0') ? domain_network_name : sym_nw_name, link_name); domain_network_name = placeholder; } } } else { char localAddresses[1024]; datum key, nextkey; if(domain_network_name == NULL) { key = gdbm_firstkey(myGlobals.prefsFile); while (key.dptr) { char val[256]; if((fetchPrefsValue(key.dptr, val, sizeof(val)) == 0) && (!strncmp(key.dptr, COMMUNITY_HEADER, COMMUNITY_HEADER_LEN))) { localAddresses[0] = '\0'; numLocalNetworks[totNumCommunities] = 0; handleAddressLists(val, localNetworks[totNumCommunities], &numLocalNetworks[totNumCommunities], localAddresses, sizeof(localAddresses), CONST_HANDLEADDRESSLISTS_COMMUNITIES); communityNames[totNumCommunities] = (u_char*)strdup((char*)&key.dptr[COMMUNITY_HEADER_LEN]); totNumCommunities++; } nextkey = gdbm_nextkey (myGlobals.prefsFile, key); free (key.dptr); key = nextkey; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Statistics for all communities"); } else { char communityAddresses[256]; snprintf(buf, sizeof(buf), COMMUNITY_HEADER"%s", domain_network_name); if(fetchPrefsValue(buf, communityAddresses, sizeof(communityAddresses)) != -1) { localAddresses[0] = '\0'; numLocalNetworks[totNumCommunities] = 0; handleAddressLists(communityAddresses, localNetworks[totNumCommunities], &numLocalNetworks[totNumCommunities], localAddresses, sizeof(localAddresses), CONST_HANDLEADDRESSLISTS_COMMUNITIES); /* communityNames[totNumCommunities] = (u_char*)strdup((char*)&domain_network_name[COMMUNITY_HEADER_LEN]); */ communityNames[totNumCommunities] = (u_char*)strdup(domain_network_name); if(debug) traceEvent(CONST_TRACE_WARNING, "communityNames[%d]=[%s]", totNumCommunities, communityNames[totNumCommunities]); totNumCommunities++; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Statistics for hosts in community %s", domain_network_name); } if(totNumCommunities == 0) { printHTMLheader(buf, NULL, 0); printFlagedWarning("Empty community list. Jump to community definition."); if(tmpStats != NULL) free(tmpStats); goto free_communitys; } } if(debug) traceEvent(CONST_TRACE_WARNING, "totNumCommunities=%d", totNumCommunities); printHTMLheader(buf, NULL, 0); maxHosts = max(myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno, myGlobals.numKnownSubnets); tmpStats = (DomainStats*)mallocAndInitWithReportWarn(maxHosts*sizeof(DomainStats), "printDomainStats"); if(tmpStats == NULL) return; /* Fix below courtesy of Francis Pintos */ stats = (DomainStats**)mallocAndInitWithReportWarn(maxHosts*sizeof(DomainStats*), "printDomainStats(2)"); if(stats == NULL) { /* also free the block of memory allocated a few lines up */ if(tmpStats != NULL) free(tmpStats); goto free_communitys; return; } if(network_mode == AS_GRAPH_VIEW) { sendString("
"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], domain_network_name); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], domain_network_name); sendString(buf); sendString("
" "\n", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], domain_network_name); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "
" "\n", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], domain_network_name); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "
\n
\n"); } else { /* traceEvent(CONST_TRACE_INFO, "'%s' '%d' '%d'", domain_network_name, sortedColumn, revertOrder); */ if((network_mode == AS_VIEW) && (domain_network_name == NULL)) { struct stat statbuf; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/interfaces/%s/AS/numAS.rrd", myGlobals.rrdPath, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique]); if((i = stat(buf, &statbuf)) == 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
" "", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(myGlobals.actTime-3600), (unsigned int)myGlobals.actTime, "Active+ASs"); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" " ", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], (unsigned int)(myGlobals.actTime-3600), (unsigned int)myGlobals.actTime, "Active+ASs"); sendString(buf); sendString("

 

"); } } if(revertOrder) { sign = ""; arrowGif = " " CONST_IMG_ARROW_UP; } else { sign = "-"; arrowGif = " " CONST_IMG_ARROW_DOWN; } if((network_mode == NETWORK_VIEW) && (domain_network_name == NULL)) { for(i=0; iknown_subnet_id = i; statsEntry->domainHost = NULL; stats[i] = statsEntry; } } for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { fillDomainName(el); if(network_mode) { if(network_mode == NETWORK_VIEW) { if((el->known_subnet_id == UNKNOWN_SUBNET_ID) || (el->known_subnet_id >= myGlobals.numKnownSubnets)) continue; else if((domain_network_name != NULL) && (domain_network_name[0] != '\0')) { if(el->known_subnet_id != atoi(domain_network_name)) continue; } } else { getHostAS(el); if(el->hostAS == 0) continue; else if((domain_network_name != NULL) && (domain_network_name[0] != '\0')) { if(el->hostAS != atoi(domain_network_name)) continue; } } } else { /* Community */ if(communityMode) { if(domain_network_name) { if (el->community == NULL) continue; if(strcmp(el->community, domain_network_name)) continue; } if((el->community) && (!isAllowedCommunity(el->community))) continue; } else if(broadcastHost(el)) continue; else { if(domain_network_name && (!communityMode) && el->dnsDomainValue && (strcmp(el->dnsDomainValue, domain_network_name) != 0)) continue; if(domain_network_name && (!communityMode) && ((el->dnsDomainValue == NULL) || (el->dnsDomainValue[0] == '\0') || (el->hostResolvedName[0] == '\0') ) /* || (el->ip2ccValue == NULL) || (el->ip2ccValue == '\0') */ ) continue; } } if(domain_network_name == NULL) /* All entries */ { if(!communityMode) { if(network_mode == NETWORK_VIEW) { int s = (int)el->known_subnet_id; keyValue = (short)s; } else if(network_mode == AS_VIEW) { keyValue = (el->hostAS % maxHosts); while(stats[keyValue] != NULL) { if(stats[keyValue]->domainHost->hostAS == el->hostAS) break; else keyValue = (keyValue+1) % maxHosts; } /* traceEvent(CONST_TRACE_INFO, "--> [AS=%d]", el->hostAS); */ } else { if(el->dnsDomainValue == NULL) continue; /* Domain */ for(keyValue=0, tmpIdx=0; el->dnsDomainValue[tmpIdx] != '\0'; tmpIdx++) keyValue += (tmpIdx+1)*(u_short)el->dnsDomainValue[tmpIdx]; keyValue %= maxHosts; while((stats[keyValue] != NULL) && (strcasecmp(stats[keyValue]->domainHost->dnsDomainValue, el->dnsDomainValue) != 0)) keyValue = (keyValue+1) % maxHosts; } } else { int found; /* Community */ if(el->hostIpAddress.hostFamily != AF_INET) continue; /*fixed label position courtesy of Philip Clark*/ keyValue = 0; all_hosts_community: found = 0; if(debug) traceEvent(CONST_TRACE_WARNING, "[keyValue=%d][totNumCommunities=%d]", keyValue, totNumCommunities); for(; keyValuehostIpAddress.addr._hostIp4Address, localNetworks[keyValue], numLocalNetworks[keyValue], NULL, NULL)) { found = 1; break; } } if((!found) || (keyValue >= totNumCommunities /* due to the goto */)) continue; } if(stats[keyValue] != NULL) statsEntry = stats[keyValue]; else { statsEntry = &tmpStats[numEntries++]; memset(statsEntry, 0, sizeof(DomainStats)); if(communityMode) statsEntry->communityName = (char*)communityNames[keyValue]; else { if((network_mode == NETWORK_VIEW) && (domain_network_name == NULL) /* All entries */) statsEntry->known_subnet_id = el->known_subnet_id; else statsEntry->known_subnet_id = UNKNOWN_SUBNET_ID; statsEntry->domainHost = el; } stats[keyValue] = statsEntry; // traceEvent(CONST_TRACE_INFO, "[%d] %s/%s", numEntries, el->dnsDomainValue, el->ip2ccValue); } } else /* Only the selected items */ { /* if(communityMode) { if(!__pseudoLocalAddress(&el->hostIpAddress.addr._hostIp4Address, localNetworks[0], numLocalNetworks[0], NULL, NULL)) continue; } */ statsEntry = &tmpStats[numEntries++]; memset(statsEntry, 0, sizeof(DomainStats)); statsEntry->domainHost = el; if(debug) traceEvent(CONST_TRACE_INFO, "--> Adding %s [ptr=%p]", el->hostNumIpAddress, el); stats[keyValue++] = statsEntry; } if(statsEntry->domainHost == NULL) statsEntry->domainHost = el; totBytesSent += el->bytesSent.value; statsEntry->bytesSent.value += el->bytesSent.value; statsEntry->bytesRcvd.value += el->bytesRcvd.value; totBytesRcvd += el->bytesRcvd.value; statsEntry->tcpSent.value += el->tcpSentLoc.value + el->tcpSentRem.value; statsEntry->udpSent.value += el->udpSentLoc.value + el->udpSentRem.value; statsEntry->icmpSent.value += el->icmpSent.value; statsEntry->icmp6Sent.value += el->icmp6Sent.value; statsEntry->tcpRcvd.value += el->tcpRcvdLoc.value + el->tcpRcvdFromRem.value; statsEntry->udpRcvd.value += el->udpRcvdLoc.value + el->udpRcvdFromRem.value; statsEntry->icmpRcvd.value += el->icmpRcvd.value; statsEntry->icmp6Rcvd.value += el->icmp6Rcvd.value; /* Handle overlapping communitys */ if(keyValue < (totNumCommunities-1)) { keyValue++; goto all_hosts_community; } if(numEntries >= maxHosts) break; } /* for(;;) */ if(numEntries == 0) { printNoDataYet(); free(tmpStats); free(stats); goto free_communitys; return; } myGlobals.columnSort = sortedColumn; if(debug) traceEvent(CONST_TRACE_WARNING, "qsort(numEntries=%d)", numEntries); qsort(tmpStats, numEntries, sizeof(DomainStats), cmpStatsFctn); /* avoid division by zero */ if(totBytesSent == 0) totBytesSent = 1; if(totBytesRcvd == 0) totBytesRcvd = 1; /* NOTE: col= must be the last parameter */ if(domain_network_name == NULL) { safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), " */ sendString("

\n" TABLE_ON ""); if((network_mode == AS_VIEW) && ((domain_network_name == NULL) || (domain_network_name[0] == '\0'))) safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "" "" "" "" "\n", theAnchor[0], arrow[0], theAnchor[1], "Location", arrow[1]); else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "" "" "" "\n", theAnchor[0], arrow[0], theAnchor[1], "Location", arrow[1]); sendString(buf); sendString( "" "" "" "" "" "" "\n" "\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "" "" "" "" "" "" "" "" "" "" "\n", theAnchor[2], arrow[2], theAnchor[3], arrow[3], theAnchor[4], arrow[4], theAnchor[5], arrow[5], theAnchor[6], arrow[6], theAnchor[7], arrow[7], theAnchor[8], arrow[8], theAnchor[9], arrow[9], theAnchor[10], arrow[10], theAnchor[11], arrow[11]); sendString(buf); for(idx=pageNum*myGlobals.runningPref.maxNumLines; idxknown_subnet_id, buf1, sizeof(buf1)); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "network.name.%s", nw_name); if(fetchPrefsValue(buf, sym_nw_name, sizeof(sym_nw_name)) == -1) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "subnet.name.%s", nw_name); if(fetchPrefsValue(buf, sym_nw_name, sizeof(sym_nw_name)) == -1) sym_nw_name[0] = '\0'; } if(statsEntry->domainHost) safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), "%s%s%s%s", CONST_DOMAIN_STATS_HTML, statsEntry->known_subnet_id, network_mode, nw_name, (sym_nw_name[0] == '\0') ? "" : " [", sym_nw_name, (sym_nw_name[0] == '\0') ? "" : "]"); else { /* No traffic yet for this subnet */ safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), "%s%s%s%s", nw_name, (sym_nw_name[0] == '\0') ? "" : " [", sym_nw_name, (sym_nw_name[0] == '\0') ? "" : "]"); } } else if(network_mode == AS_VIEW) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "as.name.%d", statsEntry->domainHost->hostAS); if(fetchPrefsValue(buf, sym_as_name, sizeof(sym_as_name)) != -1) ; else if(statsEntry->domainHost->hostASDescr != NULL) snprintf(sym_as_name, sizeof(sym_as_name), "%s", statsEntry->domainHost->hostASDescr); else snprintf(sym_as_name, sizeof(sym_as_name), "No Info"); safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), "%d" "" "" "", getRowColor(), htmlAnchor, (network_mode == AS_VIEW) ? "" : "", ((communityMode && (!domain_network_name)) || (!statsEntry->domainHost)) ? " " : getHostCountryIconURL(statsEntry->domainHost), formatBytes(statsEntry->bytesSent.value, 1, formatBuf, sizeof(formatBuf)), (100*((float)statsEntry->bytesSent.value/(float)totBytesSent)), formatBytes(statsEntry->bytesRcvd.value, 1, formatBuf1, sizeof(formatBuf1)), (100*((float)statsEntry->bytesRcvd.value/(float)totBytesRcvd))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", formatBytes(statsEntry->tcpSent.value, 1, formatBuf2, sizeof(formatBuf2)), formatBytes(statsEntry->tcpRcvd.value, 1, formatBuf3, sizeof(formatBuf3)), formatBytes(statsEntry->udpSent.value, 1, formatBuf4, sizeof(formatBuf4)), formatBytes(statsEntry->udpRcvd.value, 1, formatBuf5, sizeof(formatBuf5)), formatBytes(statsEntry->icmpSent.value, 1, formatBuf6, sizeof(formatBuf6))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", formatBytes(statsEntry->icmpRcvd.value, 1, formatBuf7, sizeof(formatBuf7)), formatBytes(statsEntry->icmp6Sent.value, 1, formatBuf8, sizeof(formatBuf8)), formatBytes(statsEntry->icmp6Rcvd.value, 1, formatBuf9, sizeof(formatBuf9))); sendString(buf); if(sym_as_name[0] != '\0') { if(network_mode == AS_VIEW) snprintf(sym_as_name, sizeof(sym_as_name), "%d", statsEntry->domainHost->hostAS); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/interfaces/%s/AS/%s", myGlobals.rrdPath, &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], sym_as_name); } // traceEvent(CONST_TRACE_WARNING, "--> [%s][%s]", sym_as_name, buf); if((sym_as_name[0] != '\0') && ((i = stat(buf, &statbuf)) == 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", CONST_DOMAIN_STATS_HTML, AS_GRAPH_VIEW, sym_as_name); sendString(buf); } else if(communityMode && statsEntry && statsEntry->communityName) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", statsEntry->communityName); sendString(buf); } else if((network_mode == NETWORK_VIEW) && ((statsEntry->domainHost != NULL) || (domain_network_name == NULL))) { char rrdBuf[LEN_GENERAL_WORK_BUFFER]; HostTraffic dummy; if(statsEntry->domainHost == NULL) { statsEntry->domainHost = &dummy; memset(&dummy, 0, sizeof(dummy)); dummy.known_subnet_id = statsEntry->known_subnet_id; } hostRRdGraphLink(statsEntry->domainHost, network_mode, (domain_network_name == NULL) ? 1 : 0, rrdBuf, sizeof(rrdBuf)); sendString("\n"); } else { /* traceEvent(CONST_TRACE_WARNING, "--> hostRRdGraphLink(%d)", network_mode); */ sendString("\n"); } /* Avoid huge tables */ if(printedEntries++ > myGlobals.runningPref.maxNumLines) break; } sendString("
%s0>Id%sDescription%s1>%s%sTCP/IPICMP 
%s0>Name%s%s1>%s%sTCP/IPICMP 
TotalTCPUDPIPv4IPv6Graphs
%s2>Sent%s%s3>Rcvd%s%s4>Sent%s%s5>Rcvd%s%s6>Sent%s%s7>Rcvd%s%s8>Sent%s%s9>Rcvd%s%s10>Sent%s%s11>Rcvd%s 
%s", CONST_DOMAIN_STATS_HTML, statsEntry->domainHost->hostAS, network_mode, statsEntry->domainHost->hostAS, sym_as_name); } else safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), "%s", communityMode ? CONST_COMMUNITIES_STATS_HTML : CONST_DOMAIN_STATS_HTML, communityMode ? statsEntry->communityName : statsEntry->domainHost->dnsDomainValue, communityMode ? statsEntry->communityName : statsEntry->domainHost->dnsDomainValue); } else { char *hostLink; u_int len; #if 0 int blankId; char tmpBuf[64]; if(statsEntry->domainHost) { blankId = strlen(statsEntry->domainHost->hostResolvedName)-1; if(statsEntry->domainHost->dnsDomainValue != NULL) blankId -= strlen(statsEntry->domainHost->dnsDomainValue); strncpy(tmpBuf, statsEntry->domainHost->hostResolvedName, sizeof(tmpBuf)); if((blankId > 0) && (strcmp(&tmpBuf[blankId+1], domain_network_name) == 0)) tmpBuf[blankId] = '\0'; } #endif if(network_mode == AS_VIEW) { makeHostLink(statsEntry->domainHost, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, htmlAnchor, sizeof(htmlAnchor)); } else { hostLink = makeHostLink(statsEntry->domainHost, FLAG_HOSTLINK_TEXT_FORMAT, 1, 0, hostLinkBuf, sizeof(hostLinkBuf)); len = strlen(hostLink); if(len >= sizeof(htmlAnchor)) len = sizeof(htmlAnchor)-1; strncpy(htmlAnchor, hostLink, len); htmlAnchor[len] = '\0'; } } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
%s%s%s%s%.1f%%%s%.1f%%%s%s%s%s%s%s%s%s" "
" "
"); if(rrdBuf[0] != '\0') sendString(rrdBuf); else sendString(" "); sendString(" 
"TABLE_OFF"\n"); sendString("
\n"); if(domain_network_name != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s?dom=%s", communityMode ? CONST_COMMUNITIES_STATS_HTML : CONST_DOMAIN_STATS_HTML, domain_network_name); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", communityMode ? CONST_COMMUNITIES_STATS_HTML : CONST_DOMAIN_STATS_HTML); } addPageIndicator(buf, pageNum, numEntries, myGlobals.runningPref.maxNumLines, revertOrder, abs(sortedColumn), network_mode); if(!communityMode) { sendString("

NOTE: "); if(network_mode == NETWORK_VIEW) sendString("You can define networks using the --known-subnets flag. Networks with no traffic/hosts do not have a hyperlink associated.\n"); else if(network_mode == AS_VIEW) sendString("AS numbers are either received via monitoring protocols (e.g. NetFlow) or read from the AS-list ntop configuration file."); else sendString("The domain is determined by simply stripping off " "the first name, so for host x.yz.com, the domain is yz.com and for host " "x.y.z.com, the domain is y.z.com.

\n"); } else { sendString("

NOTE: You can define host communitys in the ntop preferences. " "Please understand that a host community is an aggregated view of hosts known to ntop.

\n"); } free(tmpStats); free(stats); free_communitys: for(i=0; iThe requested data is not available when ntop is" "
started with the command line flag %s", flagName); printFlagedWarning(buf); } /* ************************* */ void listNetFlows(void) { char buf[LEN_GENERAL_WORK_BUFFER]; int numEntries=0; FlowFilterList *list = myGlobals.flowsList; char formatBuf[32], formatBuf1[32]; printHTMLheader(NULL, NULL, 0); if(list != NULL) { while(list != NULL) { if(list->pluginStatus.activePlugin) { if(numEntries == 0) { printSectionTitle("Network Flows"); sendString("
\n"); sendString(""TABLE_ON"" ""); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", getRowColor(), list->flowName, formatPkts(list->packets.value, formatBuf, sizeof(formatBuf)), formatBytes(list->bytes.value, 1, formatBuf1, sizeof(formatBuf1))); sendString(buf); numEntries++; } list = list->next; } if(numEntries > 0) sendString("
Flow NamePacketsTraffic
%s%s" "%s
"TABLE_OFF"\n"); sendString("
\n"); } sendString("

NOTE: Network flows have no relation at all with NetFlow/sFlow protocols.

\n"); if(numEntries == 0) { sendString("

No Available/Active Network Flows

" " (see man page)

\n"); } } /* *********************************** */ void printHostHourlyTraffic(HostTraffic *el) { Counter tcSent, tcRcvd; int i, hourId, j; char theDate[8], macAddr[24]; struct tm t; char buf[LEN_GENERAL_WORK_BUFFER], targetStr[64]; char hours[][24] = {"12 AM", "1 AM", "2 AM", "3 AM", "4 AM", "5 AM", "6 AM", "7 AM", "8 AM", "9 AM", "10 AM", "11 AM", "12 PM", "1 PM", "2 PM", "3 PM", "4 PM", "5 PM", "6 PM", "7 PM", "8 PM", "9 PM", "10 PM", "11 PM"}; if(el->trafficDistribution == NULL) return; strftime(theDate, 8, CONST_TOD_HOUR_TIMESPEC, localtime_r(&myGlobals.actTime, &t)); hourId = atoi(theDate); sendString("
\n"); sendString(""TABLE_ON"\n"); sendString(""); sendString(""); sendString(""); sendString(""); sendString(""); for(i=0, tcSent=0, tcRcvd=0; i<24; i++) { tcSent += el->trafficDistribution->last24HoursBytesSent[i].value; tcRcvd += el->trafficDistribution->last24HoursBytesRcvd[i].value; } for (i = 0, j = hourId; i < 24; i++) { j = j%24; if((el->trafficDistribution->last24HoursBytesSent[j].value > 0) || (el->trafficDistribution->last24HoursBytesRcvd[j].value > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", hours[j]); sendString(buf); printHostHourlyTrafficEntry(el, j, tcSent, tcRcvd); } if(!j) j = 23; else j--; } sendString("\n"); safe_snprintf(__FILE__, __LINE__, macAddr, sizeof(macAddr), "%s", el->ethAddressString); safe_snprintf(__FILE__, __LINE__, targetStr, sizeof(targetStr), "%s", el->hostNumIpAddress[0] == '\0' ? macAddr : el->hostNumIpAddress); urlFixupToRFC1945Inplace(targetStr); if(tcSent > 0) { sendString(""); } else sendString("\n"); if(tcRcvd > 0) { sendString(""); } else sendString("\n"); sendString("\n"); sendString("
TimeTot. Traffic Sent% Traffic SentTot. Traffic Rcvd% Traffic Rcvd
%s
Total"); hostReport(3, targetStr, el->vlanId, 1); sendString(" "); hostReport(3, targetStr, el->vlanId, 0); sendString(" 
"TABLE_OFF"\n
\n"); } /* ************************** */ static void dumpHostsCriteria(NtopInterface *ifName, u_char criteria) { u_int numEntries=0, i, maxHosts; HostTraffic **tmpTable, *el; char buf[LEN_GENERAL_WORK_BUFFER]; char formatBuf[32], formatBuf1[32], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; maxHosts = ifName->hosts.hostsno; /* save it as it can change */ tmpTable = (HostTraffic**)mallocAndInitWithReportWarn(maxHosts*sizeof(HostTraffic*), "dumpHostsCriteria"); if(tmpTable == NULL) return; switch(criteria) { case 1: /* VLAN */ myGlobals.columnSort = CONST_VLAN_COLUMN_SORT; break; } for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if(el->community && (!isAllowedCommunity(el->community))) continue; switch(criteria) { case 1: /* VLAN */ if(el->vlanId > 0) tmpTable[numEntries++] = el; break; } if(numEntries >= maxHosts) break; } if(numEntries > 0) { int lastId = 0; Counter dataSent, dataRcvd; qsort(tmpTable, numEntries, sizeof(HostTraffic*), sortHostFctn); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
"TABLE_ON"\n" "" "\n" "\n" "\n" "\n", "VLAN"); sendString(buf); dataSent = dataRcvd = 0; for(i=0; ivlanId)) { /* Same VLAN as last entry... just continue it */ sendString("\n
"); } else { /* New VLAN */ if(i > 0) { /* Finish prior row */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
\n" "\n" "\n", formatBytes(dataSent, 1, formatBuf, sizeof(formatBuf)), formatBytes(dataRcvd, 1, formatBuf1, sizeof(formatBuf1))); sendString(buf); } /* Start new row */ dataSent = dataRcvd = 0; sendString("\n"); lastId = el->vlanId; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", el->vlanId); sendString(buf); sendString("\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n" "\n", formatBytes(dataSent, 1, formatBuf, sizeof(formatBuf)), formatBytes(dataRcvd, 1, formatBuf1, sizeof(formatBuf1))); sendString(buf); } sendString("\n
%sHostsData SentData Rcvd
%s%s
%d"); } sendString(makeHostLink(el, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); dataSent += el->bytesSent.value; dataRcvd += el->bytesRcvd.value; } if(i>0) { sendString("%s%s
\n
"); } else { printFlagedWarning("No entries to display(yet)"); } free(tmpTable); } /* ******************************* */ void printVLANList(unsigned int deviceId) { printHTMLheader("VLAN Traffic Statistics", NULL, 0); if(deviceId > myGlobals.numDevices) { printFlagedWarning("Invalid device specified"); return; } if(myGlobals.haveVLANs == FALSE) { printFlagedWarning("No VLANs found (yet)"); return; } dumpHostsCriteria(&myGlobals.device[deviceId], 1 /* VLAN */); } /* ******************************************* */ static int recentlyUsedPort(HostTraffic *el, int portNr, int serverPort) { int i; if(el == NULL) return(0); for(i=0; irecentlyUsedServerPorts[i] == portNr) return(1); } else { if(el->recentlyUsedClientPorts[i] == portNr) return(1); } } return(0); } /* ******************************************* */ void showPortTraffic(u_short portNr) { char buf[LEN_GENERAL_WORK_BUFFER], *str; int numRecords = 0, firstRun = 1; HostTraffic *el; char portBuf[32], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; str = getAllPortByNum(portNr, portBuf, sizeof(portBuf)); if((str[0] == '?') || (atoi(str) == portNr)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Recent Users of Port %u", portNr); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Recent Users of Port %u (%s)", portNr, str); } printHTMLheader(buf, NULL, 0); sendString("
\n"); for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if(el->community && (!isAllowedCommunity(el->community))) continue; recentlyUsedPortSent: if(recentlyUsedPort(el, portNr, 0)) { if(numRecords == 0) { sendString("\n\n"); sendString("\n\n"); sendString("\n\n
ClientServer
" "
\n"); } sendString(makeHostLink(el, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString("
\n"); numRecords++; } if(el == myGlobals.broadcastEntry) break; } if(firstRun) { firstRun=0; el = myGlobals.broadcastEntry; goto recentlyUsedPortSent; } firstRun = 1; if(numRecords > 0) { sendString("\n
\n"); } for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if(el->community && (!isAllowedCommunity(el->community))) continue; recentlyUsedPortRcvd: if(recentlyUsedPort(el, portNr, 1)) { sendString(makeHostLink(el, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString("
\n"); numRecords++; } if(el == myGlobals.broadcastEntry) break; } if(firstRun) { firstRun = 0; el = myGlobals.broadcastEntry; goto recentlyUsedPortRcvd; } if(numRecords == 0) { safe_snprintf(__FILE__, __LINE__, hostLinkBuf, sizeof(hostLinkBuf), "

No hosts found: the information for this port " "has been purged in the meantime
" "as each host keeps the last %d server/client ports only.

\n", MAX_NUM_RECENT_PORTS); sendString(hostLinkBuf); } else sendString("

\n
"); } /* ******************************************* */ void purgeHost(HostSerialIndex theSerial) { HostTraffic *el; printHTMLheader("Host Purge", NULL, 0); el = findHostBySerial(theSerial, myGlobals.actualReportDeviceId); if(!el) { printFlagedWarning("Unable to purge the specified host: host not found"); } else { int j, found = 0; for(j=FIRST_HOSTS_ENTRY; (!found) && (jto_be_deleted = 1; /* Delete it at the next run */ break; } el1 = el1->next; } } /* for */ if(found) { char buf[LEN_GENERAL_WORK_BUFFER]; safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "
\n" "

%s

\n" "
\n", "Host Purged Succesfully"); sendString(buf); } else printFlagedWarning("Unable to purge the specified host: internal error"); } } /* ************************************ */ void printInterfaceStats() { char buf[64]; time_t now = time(NULL); sendString(ctime(&now)); snprintf(buf, sizeof(buf), "%u %u\n", (unsigned int)myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value, (unsigned int)(myGlobals.device[myGlobals.actualReportDeviceId].ethernetBytes.value - myGlobals.device[myGlobals.actualReportDeviceId].ipv4Bytes.value)); sendString(buf); /* traceEvent(CONST_TRACE_ERROR, "%s", buf); */ } /* ************************************ */ void findHost(char *key) { HostTraffic *el=NULL; int num = 0; char buf[256], buf1[2*LEN_GENERAL_WORK_BUFFER]; /* traceEvent(CONST_TRACE_INFO, "----------> findHost(%s)", key ? key : ""); */ sendString("{ results: ["); for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { u_char do_add = 0; if(el == myGlobals.broadcastEntry) continue; if(el->community && (!isAllowedCommunity(el->community))) continue; if((key == NULL) || (key[0] == '\0')) do_add = 1; else if(el->hostNumIpAddress && strcasestr(el->hostNumIpAddress, key)) do_add = 1; else if(strcasestr(el->ethAddressString, key)) do_add = 2; else if(strcasestr(el->hostResolvedName, key)) do_add = 1; /* traceEvent(CONST_TRACE_INFO, "----------> findHost(%s) [%s][%s] = %d", key ? key : "", el->ethAddressString, el->hostResolvedName, do_add); */ if(do_add) { char *str; if(el->hostResolvedName[0] != '\0') str = el->hostResolvedName; else if(el->ethAddressString[0] != '\0') str = el->ethAddressString; else str = ""; if(do_add == 2) { int i; safe_snprintf(__FILE__, __LINE__, buf1, sizeof(buf1), "/%s.html", el->ethAddressString); for(i=0; iethAddressString; } else makeHostLink(el, FLAG_HOSTLINK_TEXT_LITE_FORMAT, 0, 0, buf1, sizeof(buf1)); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s\n\t{ id: \"%d\", value: \"%s\", info: \"%s\" }", (num > 0) ? "," : "", num, str, buf1); sendString(buf); num++; if(num > 32) break; /* Do not display too many entries */ } } sendString("\n] }\n"); } /* ************************************************** */ char* hostRRdGraphLink(HostTraffic *el, int network_mode, u_char is_subnet_host, char *tmpStr, int tmpStrLen) { struct stat statbuf; char *key, buf[256], rrd_buf[256], subnet_buf[32], buf1[64]; int rc; int beginUnique = (myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[0] == '/') ? 1 : 0; if(is_subnet_host) { if(network_mode == DOMAIN_VIEW) { key = el->dnsDomainValue; } else key = host2networkName(el, subnet_buf, sizeof(subnet_buf)); } else { if(subnetPseudoLocalHost(el) && (el->ethAddressString[0] != '\0') /* Really safe in case a host that was supposed to be local isn't really so */) key = el->ethAddressString; else key = el->hostNumIpAddress; } /* Do NOT add a '/' at the end of the path because Win32 will complain about it */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/interfaces/%s/%s/%s/", myGlobals.rrdPath != NULL ? myGlobals.rrdPath : ".", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], is_subnet_host ? ((network_mode == DOMAIN_VIEW) ? "domains" : "subnet") : "hosts", (network_mode == DOMAIN_VIEW) ? key : dotToSlash(key, buf1, sizeof(buf1))); safe_snprintf(__FILE__, __LINE__, rrd_buf, sizeof(rrd_buf), "%s/bytesRcvd.rrd", buf); revertSlashIfWIN32(rrd_buf, 0); rc = stat(rrd_buf, &statbuf); if(rc != 0) { safe_snprintf(__FILE__, __LINE__, rrd_buf, sizeof(rrd_buf), "%s/bytesSent.rrd", buf); revertSlashIfWIN32(rrd_buf, 0); rc = stat(rrd_buf, &statbuf); } if(rc == 0) { safe_snprintf(__FILE__, __LINE__, tmpStr, tmpStrLen, "[ " "\"view ]", &myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName[beginUnique], is_subnet_host ? ((network_mode == DOMAIN_VIEW) ? "domains" : "subnet") : "hosts", (network_mode == DOMAIN_VIEW) ? key : dotToSlash(key, buf1, sizeof(buf1)), is_subnet_host ? ((network_mode == DOMAIN_VIEW) ? "subnet+" : "network+") : "host+", is_subnet_host ? ((network_mode == DOMAIN_VIEW) ? key : subnet_buf) : (el->hostResolvedName[0] != '\0' ? el->hostResolvedName : el->hostNumIpAddress), is_subnet_host ? ((network_mode == DOMAIN_VIEW) ? "domain" : "subnet") : "host"); } else tmpStr[0] = '\0'; return(tmpStr); } ntop-5.0.1+dfsg1/COPYING0000644000000000000000000010451311722010426013225 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ntop-5.0.1+dfsg1/map.c0000644000000000000000000001445412001370731013116 0ustar rootroot/* * Copyright (C) 2008-10 Luca Deri * * http://www.ntop.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-report.h" #define MAX_NUM_MAP_HOSTS 5120 /* style=\"width: 800px; height: 600px\" */ const char *map_head = "\n\n
\n\n"; const char *map_head2 = "\n \n \n \n\n"; const char *map_tail2 = "\n }\n\n \n\n"; /* ******************************************** */ static char *googleMapsKey = NULL; void init_maps() { char value[128]; if(fetchPrefsValue("google_maps.key", value, sizeof(value)) == -1) { storePrefsValue("google_maps.key", GOOGLE_DEFAULT_MAP_KEY); googleMapsKey = GOOGLE_DEFAULT_MAP_KEY; } else { googleMapsKey = strdup(value); } } /* ************************************************** */ #if 0 static char* escape_string(char *in, char *out, u_int out_len) { int i, i_max=strlen(in), j; for(i=0, j=0; i= out_len-1) return(out); /* No break here */ default: out[j++] = in[i]; if(j >= out_len-1) return(out); break; } } return(out); } #endif /* ************************************************** */ void createAllHostsMap(void) { HostTraffic *el; int num_hosts = 0; sendString((char*)map_head); //sendString(googleMapsKey); sendString((char*)map_head2); sendString((char*)map_head3); sendString((char*)map_head4); for(el=getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if(el->geo_ip) { char buf[512]; #if 0 char buf1[256] = { 0 }; int showSymIp; if((el->hostResolvedName[0] != '\0') && strcmp(el->hostResolvedName, el->hostNumIpAddress) && (!subnetPseudoLocalHost(el))) showSymIp = 1; else showSymIp = 0; #endif safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "createMarker(new google.maps.LatLng(%.2f, %.2f), \"" #if 0 "%s%s" #endif "%s
%s
%s\");\n", el->geo_ip->latitude, el->geo_ip->longitude, #if 0 showSymIp ? escape_string(el->hostResolvedName, buf1, sizeof(buf1)) : "", showSymIp ? "
" : "", #endif el->hostNumIpAddress, el->hostNumIpAddress, el->geo_ip->city ? el->geo_ip->city : "", el->geo_ip->country_name ? el->geo_ip->country_name : ""); sendString(buf); num_hosts++; if(num_hosts > MAX_NUM_MAP_HOSTS) break; /* Too many hosts */ } } sendString((char*)map_tail); if(num_hosts > MAX_NUM_MAP_HOSTS) sendString("

WARNING:You have more hosts to display than the number typically supported by Google maps. Some hosts have not been rendered.

"); // sendString("

NOTE: "); // sendString("make sure you get your key here" // " for using Google Maps from ntop and register it as \'google_maps.key\' key here.

\n"); } /* ************************************************** */ void createHostMap(HostTraffic *host) { HostTraffic *el; int num_hosts = 0; sendString((char*)map_head); //sendString(googleMapsKey); sendString((char*)map_head2); sendString((char*)map_head4); for(el=getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if((el->l2Host == host->l2Host) && (el->hostIpAddress.hostFamily == host->hostIpAddress.hostFamily)) { if((CM_PointEst(host->sent_to_matrix, el->serialHostIndex) > 0) || (CM_PointEst(host->recv_from_matrix, el->serialHostIndex) > 0)) { if(el->geo_ip) { char buf[512]; #if 0 char buf1[256] = { 0 }; int showSymIp; if((el->hostResolvedName[0] != '\0') && strcmp(el->hostResolvedName, el->hostNumIpAddress) && (!privateIPAddress(el))) showSymIp = 1; else showSymIp = 0; #endif safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "createMarker(new google.maps.LatLng(%.2f, %.2f), \"" #if 0 "%s%s" #endif "%s
%s
%s\");\n", el->geo_ip->latitude, el->geo_ip->longitude, #if 0 showSymIp ? escape_string(el->hostResolvedName, buf1, sizeof(buf1)) : "", showSymIp ? "
" : "", #endif el->hostNumIpAddress, el->hostNumIpAddress, el->geo_ip->city ? el->geo_ip->city : "", el->geo_ip->country_name ? el->geo_ip->country_name : ""); sendString(buf); num_hosts++; if(num_hosts > MAX_NUM_MAP_HOSTS) break; /* Too many hosts */ } } } } sendString((char*)map_tail2); } ntop-5.0.1+dfsg1/main.c0000644000000000000000000006727711741124402013302 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * http://www.ntop.org * * Copyright (C) 1998-2012 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-report.h" #if defined(DARWIN) && (!defined(TIGER)) #include extern char ** environ; #endif #if defined(MEMORY_DEBUG) && (MEMORY_DEBUG == 1) #include #endif char static_ntop; /* * Hello World! This is ntop speaking... */ void welcome (FILE * fp) { fprintf (fp, "Welcome to %s v.%s (%d bit)\n" "[Configured on %s, built on %s]\n", myGlobals.program_name, version, sizeof(long) == 8 ? 64 : 32, configureDate, buildDate); fprintf (fp, "Copyright 1998-2012 by %s\n", ntop_author); fprintf (fp, "\nGet the freshest ntop from http://www.ntop.org/\n"); } /* * Wrong. Please try again accordingly to .... */ void usage(FILE * fp) { char *newLine = ""; #ifdef WIN32 newLine = "\n\t"; #endif welcome(fp); fprintf(fp, "\nUsage: %s [OPTION]\n\n", myGlobals.program_name); fprintf(fp, "Basic options:\n"); fprintf(fp, " [-h | --help] %sDisplay this help and exit\n", newLine); #ifndef WIN32 fprintf(fp, " [-u | --user ] %sUserid/name to run ntop under (see man page)\n", newLine); #endif /* WIN32 */ fprintf(fp, " [-t | --trace-level ] %sTrace level [0-6]\n", newLine); fprintf(fp, " [-P | --db-file-path ] %sPath for ntop internal database files\n", newLine); fprintf(fp, " [-Q | --spool-file-path ] %sPath for ntop spool files\n", newLine); fprintf(fp, " [-w | --http-server ] %sWeb server (http:) port (or address:port) to listen on\n", newLine); #ifdef HAVE_OPENSSL fprintf(fp, " [-W | --https-server ] %sWeb server (https:) port (or address:port) to listen on\n", newLine); #endif fprintf(fp, "\nAdvanced options:\n"); fprintf(fp, " [-4 | --ipv4] %sUse IPv4 connections\n",newLine); fprintf(fp, " [-6 | --ipv6] %sUse IPv6 connections\n",newLine); fprintf(fp, " [-a | --access-log-file ] %sFile for ntop web server access log\n", newLine); fprintf(fp, " [-b | --disable-decoders] %sDisable protocol decoders\n", newLine); fprintf(fp, " [-c | --sticky-hosts] %sIdle hosts are not purged from memory\n", newLine); #ifndef WIN32 fprintf(fp, " [-d | --daemon] %sRun ntop in daemon mode\n", newLine); #endif fprintf(fp, " [-e | --max-table-rows ] %sMaximum number of table rows to report\n", newLine); fprintf(fp, " [-f | --traffic-dump-file ] %sTraffic dump file (see tcpdump)\n", newLine); fprintf(fp, " [-g | --track-local-hosts] %sTrack only local hosts\n", newLine); #ifndef WIN32 fprintf(fp, " [-i | --interface ] %sInterface name or names to monitor\n", newLine); #else fprintf(fp, " [-i | --interface ] %sInterface index number (or name) to monitor\n", newLine); #endif fprintf(fp, " [-j | --create-other-packets] %sCreate file ntop-other-pkts.XXX.pcap file\n", newLine); fprintf(fp, " [-l | --pcap-log ] %sDump packets captured to a file (debug only!)\n", newLine); fprintf(fp, " [-m | --local-subnets ] %sLocal subnetwork(s) (see man page)\n", newLine); fprintf(fp, " [-n | --numeric-ip-addresses ] %sNumeric IP addresses DNS resolution mode:\n", newLine); fprintf(fp, " %s%d - %s\n", newLine, 0, "No DNS resolution at all"); fprintf(fp, " %s%d - %s\n", newLine, 1, "DNS resolution for local hosts only"); fprintf(fp, " %s%d - %s\n", newLine, 2, "DNS resolution for remote hosts only"); fprintf(fp, " [-p | --protocols ] %sList of IP protocols to monitor (see man page)\n", newLine); fprintf(fp, " [-q | --create-suspicious-packets] %sCreate file ntop-suspicious-pkts.XXX.pcap file\n", newLine); fprintf(fp, " [-r | --refresh-time ] %sRefresh time in seconds, default is %d\n", newLine, DEFAULT_NTOP_AUTOREFRESH_INTERVAL); fprintf(fp, " [-s | --no-promiscuous] %sDisable promiscuous mode\n", newLine); fprintf(fp, " [-x ] %sMax num. hash entries ntop can handle (default %u)\n", newLine, myGlobals.runningPref.maxNumHashEntries); fprintf(fp, " [-z | --disable-sessions] %sDisable TCP session tracking\n", newLine); fprintf(fp, " [-A] %sAsk admin user password and exit\n", newLine); fprintf(fp, " [ | --set-admin-password=] %sSet password for the admin user to \n", newLine); fprintf(fp, " [ | --w3c] %sAdd extra headers to make better html\n", newLine); fprintf(fp, " [-B ] | --filter-expression %sPacket filter expression, like tcpdump (for all interfaces)\n", newLine); fprintf(fp, " %sYou can also set per-interface filter: \n", newLine); fprintf(fp, " %seth0=tcp,eth1=udp ....\n", newLine); fprintf(fp, " [-C ] | --sampling-rate %sPacket capture sampling rate [default: 1 (no sampling)]\n", newLine); fprintf(fp, " [-D | --domain ] %sInternet domain name\n", newLine); fprintf(fp, " [-F | --flow-spec ] %sFlow specs (see man page)\n", newLine); #ifndef WIN32 fprintf(fp, " [-K | --enable-debug] %sEnable debug mode\n", newLine); #ifdef MAKE_WITH_SYSLOG fprintf(fp, " [-L] %sDo logging via syslog\n", newLine); fprintf(fp, " [ | --use-syslog=] %sDo logging via syslog, facility ('=' is REQUIRED)\n", newLine); #endif /* MAKE_WITH_SYSLOG */ #endif fprintf(fp, " [-M | --no-interface-merge] %sDon't merge network interfaces (see man page)\n", newLine); fprintf(fp, " [-O | --pcap-file-path ] %sPath for log files in pcap format\n", newLine); fprintf(fp, " [-U | --mapper ] %sURL (mapper.pl) for displaying host location\n", newLine); fprintf(fp, " [-V | --version] %sOutput version information and exit\n", newLine); fprintf(fp, " [-X ] %sMax num. TCP sessions ntop can handle (default %u)\n", newLine, myGlobals.runningPref.maxNumSessions); /* Please keep long-only options alphabetically ordered */ fprintf(fp, " [--disable-instantsessionpurge] %sDisable instant FIN session purge\n", newLine); fprintf(fp, " [--disable-mutexextrainfo] %sDisable extra mutex info\n", newLine); fprintf(fp, " [--disable-stopcap] %sCapture packets even if there's no memory left\n", newLine); fprintf(fp, " [--disable-ndpi] %sDisable nDPI for protocol discovery\n", newLine); fprintf(fp, " [--disable-python] %sDisable Python interpreter\n", newLine); fprintf(fp, " [--instance ] %sSet log name for this ntop instance\n", newLine); fprintf(fp, " [--p3p-cp] %sSet return value for p3p compact policy, header\n", newLine); fprintf(fp, " [--p3p-uri] %sSet return value for p3p policyref header\n", newLine); fprintf(fp, " [--skip-version-check] %sSkip ntop version check\n", newLine); fprintf(fp, " [--known-subnets ] %sList of known subnets (separated by ,)\n", newLine); fprintf(fp, " %sIf the argument starts with @ it is assumed it is a file path\n", newLine); fprintf(fp, " %sE.g. 192.168.0.0/14=home,172.16.0.0/16=private\n", newLine); fprintf(fp, "\n" "NOTE\n" " * You can configure further ntop options via the web\n" " interface [Menu Admin -> Config].\n" " * The command line options are not permanent, i.e. they\n" " are not persistent across ntop initializations.\n" "\n"); #ifdef WIN32 printAvailableInterfaces(); #endif } /* *********************************** */ static void verifyOptions (void){ #ifdef HAVE_OPENSSL if((myGlobals.runningPref.webPort == 0) && (myGlobals.runningPref.sslPort == 0)) { printf("WARNING: both -W and -w are set to 0. The web interface will be disabled.\n"); #else if(myGlobals.runningPref.webPort == 0) { printf("WARNING: -w is set to 0. The web interface will be disabled.\n"); #endif traceEvent(CONST_TRACE_WARNING, "The web interface will be disabled"); traceEvent(CONST_TRACE_INFO, "If enabled, the rrd plugin will collect data"); traceEvent(CONST_TRACE_INFO, "If enabled, the NetFlow and/or sFlow plugins will collect and/or transmit data"); traceEvent(CONST_TRACE_INFO, "This may or may not be what you want"); traceEvent(CONST_TRACE_INFO, "but without the web interface you can't set plugin parameters"); myGlobals.webInterfaceDisabled = 1; } /* * Must start run as root since opening a network interface * in promiscuous mode is a privileged operation. * Verify we're running as root, unless we are reading data from a file */ if(myGlobals.pcap_file_list != NULL) { return; } #ifndef WIN32 if ((myGlobals.runningPref.disablePromiscuousMode != 1) && getuid() /* We're not root */ && myGlobals.runningPref.devices && strcmp(myGlobals.runningPref.devices, "none")) { char *theRootPw, *correct, *encrypted; struct passwd *pw = getpwuid(0); myGlobals.userId = getuid(); myGlobals.groupId = getgid(); traceEvent(CONST_TRACE_WARNING, "You need root capabilities to capture network packets."); if(strcmp(pw->pw_passwd, "x") == 0) { #ifdef HAVE_SHADOW_H /* Use shadow passwords */ struct spwd *spw; spw = getspnam("root"); if(spw == NULL) { traceEvent(CONST_TRACE_INFO, "Unable to read shadow passwords. Become root first and start ntop again"); traceEvent(CONST_TRACE_INFO, "or add -s to your startup parameters (you won't be able to capture"); traceEvent(CONST_TRACE_INFO, "from a NIC but you can via NetFlow/sFlow)"); exit (-1); } else correct = spw->sp_pwdp; #else traceEvent(CONST_TRACE_ERROR, "Sorry: I cannot change user as your system uses and unsupported password storage mechanism."); traceEvent(CONST_TRACE_ERROR, "Please restart ntop with root capabilities"); exit (-1); #endif } else correct = pw->pw_passwd; theRootPw = getpass("Please enter the root password: "); encrypted = crypt(theRootPw, correct); if(strcmp(encrypted, correct) == 0) { traceEvent(CONST_TRACE_INFO, "The root password is correct"); if(setuid(0) || setgid(0)) { traceEvent(CONST_TRACE_ERROR, "Sorry I'm unable to become root. Please check whether this application"); traceEvent(CONST_TRACE_ERROR, "has the sticky bit set and the owner is %s. Otherwise", #ifdef DARWIN "root:wheel" #else "root:root" #endif ); traceEvent(CONST_TRACE_FATALERROR, "please run ntop as root."); exit (18); } } else { traceEvent(CONST_TRACE_ERROR, "The specified root password is not correct."); traceEvent(CONST_TRACE_FATALERROR, "Sorry, %s uses network interface(s) in promiscuous mode, " "so it needs root permission to run.\n", myGlobals.program_name); exit(19); } } else if (myGlobals.runningPref.disablePromiscuousMode == 1) traceEvent(CONST_TRACE_WARNING, "-s set so will ATTEMPT to open interface w/o promisc mode " "(this will probably fail below)"); #endif /* WIN32 */ return; } /* ***************************************************** */ #if defined(DARWIN) && (!defined(TIGER)) /* http://developer.apple.com/technotes/tn2005/tn2083.html#SECDAEMONVSFRAMEWORKS */ static void check_osx_daemonization(int argc, char *argv[]) { int is_daemon = 0, j, i; if(0) { printf("--------------------\n"); for(i=0; i 1) safe_strncat(cmdLineBuffer, LEN_CMDLINE_BUFFER, " '"); else safe_strncat(cmdLineBuffer, LEN_CMDLINE_BUFFER, " "); for (;;) { readBufferWork = fgets(readBuffer, min(LEN_FGETS_BUFFER, fileStat.st_size), fd); /* On EOF, we're finished */ if (readBufferWork == NULL) { break; } #ifdef PARAM_DEBUG printf("PARAM_DEBUG: fgets() '%s'\n", readBufferWork); #endif /* Strip out any comments */ readBufferWork = strchr(readBuffer, '#'); if (readBufferWork != NULL) { readBufferWork[0] = ' '; readBufferWork[1] = '\0'; } /* Replace the \n by a space, so at the end the buffer will * look indistinguishable... */ readBufferWork = strchr(readBuffer, '\n'); if(readBufferWork != NULL) { readBufferWork[0] = (i == 1) ? ' ' : ','; readBufferWork[1] = '\0'; } readBufferWork = strchr(readBuffer, '@'); if(readBufferWork != NULL) { printf("FATAL ERROR: @command in file ... nesting is not permitted!\n\n"); exit(-1); } #ifdef PARAM_DEBUG printf("PARAM_DEBUG: -> '%s'\n", readBuffer); #endif safe_strncat(cmdLineBuffer, LEN_CMDLINE_BUFFER, " "); safe_strncat(cmdLineBuffer, LEN_CMDLINE_BUFFER, readBuffer); } fclose(fd); if(i > 1) safe_strncat(cmdLineBuffer, LEN_CMDLINE_BUFFER, "' "); else safe_strncat(cmdLineBuffer, LEN_CMDLINE_BUFFER, " "); } } free(readBuffer); /* Strip trailing spaces */ while((strlen(cmdLineBuffer) > 1) && (cmdLineBuffer[strlen(cmdLineBuffer)-1] == ' ')) { cmdLineBuffer[strlen(cmdLineBuffer)-1] = '\0'; } #ifdef WIN32 { int i; for(i=0; i0) ? "," : "", (myGlobals.device[i].humanFriendlyName != NULL) ? myGlobals.device[i].humanFriendlyName : myGlobals.device[i].name); strncat(ifStr, tmpBuf, sizeof(ifStr)-strlen(ifStr)-1)[sizeof(ifStr)-1] = '\0'; } } if((ifStr == NULL) || (ifStr[0] == '\0')) { traceEvent(CONST_TRACE_ERROR, "No interface has been selected [%d defined interfaces]", myGlobals.numDevices); traceEvent(CONST_TRACE_NOISY, "Creating interface 'none'"); createDummyInterface("none"); } else traceEvent(CONST_TRACE_ALWAYSDISPLAY, "Listening on [%s]", ifStr); if(!static_ntop) { traceEvent(CONST_TRACE_ALWAYSDISPLAY, "Loading Plugins"); loadPlugins(); traceEvent(CONST_TRACE_NOISY, "Starting Plugins"); startPlugins(); traceEvent(CONST_TRACE_NOISY, "Plugins started... continuing with initialization"); } checkUserIdentity(userSpecified); addDefaultAdminUser(); readSessionPurgeParams(); initReports(); /* Sanity checks */ if(myGlobals.actualReportDeviceId >= myGlobals.numDevices) myGlobals.actualReportDeviceId = myGlobals.numDevices; /* In case the initial device is "none" and there are other defined devices we switch to another device. TODO In the future we should remember the last value for myGlobals.actualReportDeviceId and use it at next start in case such device is still present */ if((strcmp(myGlobals.device[myGlobals.actualReportDeviceId].name, "none") == 0) && ((myGlobals.actualReportDeviceId+1) < myGlobals.numDevices)) myGlobals.actualReportDeviceId++; traceEvent(CONST_TRACE_NOISY, "MEMORY: Base interface structure (no hashes loaded) is %.2fMB each", xvertDOT00MB(sizeof(NtopInterface))); traceEvent(CONST_TRACE_NOISY, "MEMORY: or %.2fMB for %d interfaces", xvertDOT00MB(myGlobals.numDevices*sizeof(NtopInterface)), myGlobals.numDevices); #ifndef WIN32 saveNtopPid(); #endif /* * OK, ntop is up... if we have't failed during init, start running with the actual packet capture... * * A separate thread handles packet sniffing */ startSniffer(); while(myGlobals.ntopRunState == FLAG_NTOPSTATE_RUN) { // traceEvent(CONST_TRACE_ERROR, "event_loop() returned %d", rc); ntopSleepWhileSameState(5); /* Periodic recheck of the version status */ if((myGlobals.checkVersionStatusAgain > 0) && (time(NULL) > myGlobals.checkVersionStatusAgain) && (myGlobals.ntopRunState == FLAG_NTOPSTATE_RUN)) checkVersion(NULL); } traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: Main thread shutting down", (long unsigned int)pthread_self()); endTime = time(NULL) + PARM_SLEEP_LIMIT + 2; while((myGlobals.ntopRunState != FLAG_NTOPSTATE_TERM) && (time(NULL) < endTime)) { sleep(1); } traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: Main thread terminating", (long unsigned int)pthread_self()); memset(&buf, 0, sizeof(buf)); runningThreads(buf, sizeof(buf), 0); if(buf[0] != '\0') traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: Still running threads%s", (long unsigned int)pthread_self(), buf); traceEvent(CONST_TRACE_INFO, "==================================="); traceEvent(CONST_TRACE_INFO, " ntop is shutdown... "); traceEvent(CONST_TRACE_INFO, "==================================="); return(0); } ntop-5.0.1+dfsg1/traffic.c0000644000000000000000000003656511702350722013773 0ustar rootroot/* * Copyright (C) 1998-2012 Luca Deri * * http://www.ntop.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" static u_int8_t are_communities_defined = 0; /* ******************************* */ static void dumpTopTalkers(time_t when, TopTalkers *lastMinTalkers) { datum data_data, key_data; // FIX - Implement periodic serial purging key_data.dptr = (char*)&when, key_data.dsize = sizeof(time_t); data_data.dptr = (char*)lastMinTalkers, data_data.dsize = sizeof(TopTalkers); if(gdbm_store(myGlobals.topTalkersFile, key_data, data_data, GDBM_REPLACE) != 0) traceEvent(CONST_TRACE_ERROR, "While adding top talkers at time %u", (unsigned int)when); } /* ******************************* */ static void updateThptStats(time_t when, int deviceToUpdate, TopTalkers *lastMinTalkers, TopTalkers *lastHourTalkers) { int i; #ifdef DEBUG char formatBuf[32]; #endif /* if(myGlobals.device[deviceToUpdate].dummyDevice) return; */ #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "updateThptStats(%u, %d)", (unsigned int)myGlobals.actTime, deviceToUpdate); #endif /* Shift */ for(i=58; i>=0; i--) memcpy(&myGlobals.device[deviceToUpdate].last60MinTopTalkers[i+1], &myGlobals.device[deviceToUpdate].last60MinTopTalkers[i], sizeof(TopTalkers)); /* Copy value */ memcpy(&myGlobals.device[deviceToUpdate].last60MinTopTalkers[0], lastMinTalkers, sizeof(TopTalkers)); if(!emptySerial(&lastHourTalkers[0].senders[0].hostSerial)) { /* Shift */ for(i=22; i>=0; i--) memcpy(&myGlobals.device[deviceToUpdate].last24HoursTopTalkers[i+1], &myGlobals.device[deviceToUpdate].last24HoursTopTalkers[i], sizeof(TopTalkers)); /* Copy value */ memcpy(&myGlobals.device[deviceToUpdate].last24HoursTopTalkers[0], lastHourTalkers, sizeof(TopTalkers)); } myGlobals.device[deviceToUpdate].numThptSamples++; /* Dump thpt stats on disk */ dumpTopTalkers(when, lastMinTalkers); #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "updateThptStats() completed."); #endif } /* ******************************* */ /* talkers = HostTalker[MAX_NUM_TOP_TALKERS] */ static void updateTopThptDirection(HostTalker *talkers, HostSerialIndex serialHostIndex, float bps) { int i, j; if(talkers[MAX_NUM_TOP_TALKERS-1].bps > bps) return; /* We're not a top talker */ for(i=0; ii; j--) talkers[j].hostSerial = talkers[j-1].hostSerial, talkers[j].bps = talkers[j-1].bps; } /* 2 - set the value at slot i */ talkers[i].hostSerial = serialHostIndex, talkers[i].bps = bps; break; } } } /* ******************************* */ static void updateTopThpt(TopTalkers *talkers, HostSerialIndex serialHostIndex, float sentBps, float rcvdBps) { if(serialHostIndex == UNKNOWN_SERIAL_INDEX) return; updateTopThptDirection((HostTalker*)&talkers->senders, serialHostIndex, sentBps); updateTopThptDirection((HostTalker*)&talkers->receivers, serialHostIndex, rcvdBps); } /* ******************************* */ void updateDeviceThpt(int deviceToUpdate, int quickUpdate) { int i; time_t timeDiff, timeMinDiff, timeHourDiff=0, totalTime, when; HostTraffic *el; short updateMinThpt=0, updateHourThpt=0; TopTalkers lastMinTalkers, lastHourTalkers; timeDiff = myGlobals.actTime-myGlobals.device[deviceToUpdate].lastThptUpdate; if(timeDiff < 10 /* secs */) return; when = myGlobals.actTime + 60; when -= (when % 60); /* ******************************** */ memset(&lastMinTalkers, 0, sizeof(lastMinTalkers)); memset(&lastHourTalkers, 0, sizeof(lastHourTalkers)); for(i=0; i myGlobals.device[deviceToUpdate].peakThroughput) myGlobals.device[deviceToUpdate].peakThroughput = myGlobals.device[deviceToUpdate].actualThpt; if(myGlobals.device[deviceToUpdate].actualPktsThpt > myGlobals.device[deviceToUpdate].peakPacketThroughput) myGlobals.device[deviceToUpdate].peakPacketThroughput = myGlobals.device[deviceToUpdate].actualPktsThpt; myGlobals.device[deviceToUpdate].throughput = (float)myGlobals.device[deviceToUpdate].ethernetBytes.value; myGlobals.device[deviceToUpdate].packetThroughput = (float)myGlobals.device[deviceToUpdate].ethernetPkts.value; if((timeMinDiff = myGlobals.actTime-myGlobals.device[deviceToUpdate].lastMinThptUpdate) >= 60 /* 1 minute */) { updateMinThpt = 1; myGlobals.device[deviceToUpdate].lastMinEthernetBytes.value = myGlobals.device[deviceToUpdate].ethernetBytes.value - myGlobals.device[deviceToUpdate].lastMinEthernetBytes.value; myGlobals.device[deviceToUpdate].lastMinThpt = (float)(myGlobals.device[deviceToUpdate].lastMinEthernetBytes.value)/(float)timeMinDiff; myGlobals.device[deviceToUpdate].lastMinEthernetBytes = myGlobals.device[deviceToUpdate].ethernetBytes; /* ******************* */ myGlobals.device[deviceToUpdate].lastMinEthernetPkts.value = myGlobals.device[deviceToUpdate].ethernetPkts.value- myGlobals.device[deviceToUpdate].lastMinEthernetPkts.value; myGlobals.device[deviceToUpdate].lastMinPktsThpt = (float)myGlobals.device[deviceToUpdate].lastMinEthernetPkts.value/(float)timeMinDiff; myGlobals.device[deviceToUpdate].lastMinEthernetPkts = myGlobals.device[deviceToUpdate].ethernetPkts; myGlobals.device[deviceToUpdate].lastMinThptUpdate = myGlobals.actTime; } if((timeMinDiff = myGlobals.actTime-myGlobals.device[deviceToUpdate].lastFiveMinsThptUpdate) >= 300 /* 5 minutes */) { myGlobals.device[deviceToUpdate].lastFiveMinsEthernetBytes.value = myGlobals.device[deviceToUpdate].ethernetBytes.value - myGlobals.device[deviceToUpdate].lastFiveMinsEthernetBytes.value; myGlobals.device[deviceToUpdate].lastFiveMinsThptUpdate = timeMinDiff; myGlobals.device[deviceToUpdate].lastFiveMinsThpt = (float)myGlobals.device[deviceToUpdate].lastFiveMinsEthernetBytes.value/ (float)myGlobals.device[deviceToUpdate].lastFiveMinsThptUpdate; myGlobals.device[deviceToUpdate].lastFiveMinsEthernetBytes.value = myGlobals.device[deviceToUpdate].ethernetBytes.value; /* ******************* */ myGlobals.device[deviceToUpdate].lastFiveMinsEthernetPkts.value = myGlobals.device[deviceToUpdate].ethernetPkts.value - myGlobals.device[deviceToUpdate].lastFiveMinsEthernetPkts.value; myGlobals.device[deviceToUpdate].lastFiveMinsPktsThpt = (float)myGlobals.device[deviceToUpdate].lastFiveMinsEthernetPkts.value/ (float)myGlobals.device[deviceToUpdate].lastFiveMinsThptUpdate; myGlobals.device[deviceToUpdate].lastFiveMinsEthernetPkts.value = myGlobals.device[deviceToUpdate].ethernetPkts.value; myGlobals.device[deviceToUpdate].lastFiveMinsThptUpdate = myGlobals.actTime; } if(quickUpdate) { myGlobals.device[deviceToUpdate].lastThptUpdate = myGlobals.actTime; return; } #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "updateDeviceStats() called."); #endif totalTime = myGlobals.actTime-myGlobals.initialSniffTime; if((timeHourDiff = myGlobals.actTime-myGlobals.device[deviceToUpdate].lastHourThptUpdate) >= 3600 /* 1 hour */) { updateHourThpt = 1; myGlobals.device[deviceToUpdate].lastHourThptUpdate = myGlobals.actTime; } /* By the time we update the throughtput we keep a list of top hosts senders/receivers that we'll use for top talkers statistics */ for(el = getFirstHost(deviceToUpdate); el != NULL; el = getNextHost(deviceToUpdate, el)) { if(broadcastHost(el)) continue; /* We just care of L3 only for the time being */ if(el->l2Host) continue; el->actualRcvdThpt = (float)((el->bytesRcvd.value-el->lastBytesRcvd.value)/timeDiff); if(el->peakRcvdThpt < el->actualRcvdThpt) el->peakRcvdThpt = el->actualRcvdThpt; el->actualSentThpt = (float)((el->bytesSent.value-el->lastBytesSent.value)/timeDiff); if(el->peakSentThpt < el->actualSentThpt) el->peakSentThpt = el->actualSentThpt; el->actualThpt = (float)((el->bytesRcvd.value-el->lastBytesRcvd.value + el->bytesSent.value-el->lastBytesSent.value)/timeDiff); if(el->peakThpt < el->actualThpt) el->peakThpt = el->actualThpt; el->lastBytesSent = el->bytesSent, el->lastBytesRcvd = el->bytesRcvd; /* ******************************** */ /* 1 Minute Throughput */ if(updateMinThpt) { el->averageRcvdThpt = (float)(((float)el->bytesRcvdSession.value)/totalTime); el->averageSentThpt = (float)(((float)el->bytesSentSession.value)/totalTime); updateTopThpt(&lastMinTalkers, el->serialHostIndex, el->averageSentThpt, el->averageRcvdThpt); /* 1 Hour Throughput */ if(updateHourThpt) { el->lastHourRcvdThpt = (float)((float)(el->bytesRcvd.value-el->lastHourBytesRcvd.value)/timeHourDiff); el->lastHourSentThpt = (float)((float)(el->bytesSent.value-el->lastHourBytesSent.value)/timeHourDiff); el->lastHourBytesRcvd = el->bytesRcvd, el->lastHourBytesSent = el->bytesSent; updateTopThpt(&lastHourTalkers, el->serialHostIndex, el->lastHourSentThpt, el->lastHourRcvdThpt); } } } if(updateMinThpt || updateHourThpt) updateThptStats(when, deviceToUpdate, &lastMinTalkers, &lastHourTalkers); myGlobals.device[deviceToUpdate].lastThptUpdate = myGlobals.actTime; #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "updateDeviceStats() completed."); #endif } /* ******************************* */ void updateThpt(int fullUpdate) { int i; #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "updateThpt() called"); #endif if(myGlobals.runningPref.mergeInterfaces) updateDeviceThpt(0, !fullUpdate); else { for(i=0; i Community %s has %d entries", communityName, numLocalNetworks); for(i=0; i Found community %s [%d]", communityName, numLocalNetworks); snprintf(buf, buf_len, "%s", communityName); return(buf); } } } nextkey = gdbm_nextkey(myGlobals.prefsFile, key); free (key.dptr); key = nextkey; } } return(NULL); } /* ********************************** */ void setHostCommunity(HostTraffic *el) { char *community, buf[64]; if((el == NULL) || (el->hostIpAddress.hostFamily != AF_INET)) return; /* Only IPv4 is supported */ else if(el->community != NULL) return; /* Already set */ community = findHostCommunity(el->hostIpAddress.addr._hostIp4Address.s_addr, buf, sizeof(buf)); if(community) el->community = strdup(community); } /* ********************************** */ u_short isP2P(HostTraffic *a) { if((a != NULL) && ((a->totContactedSentPeers > CONTACTED_PEERS_THRESHOLD) || (a->totContactedRcvdPeers > CONTACTED_PEERS_THRESHOLD))) { /* Now we need to check if this has really been a P2P server */ int i; for(i=0; irecentlyUsedServerPorts[i] == -1) || (a->recentlyUsedClientPorts[i] == -1)) return(0); /* It's just a busy server */ } return(1); } else return(0); } /* ********************************** */ char* httpSiteIcon(char *name, char *buf, u_int buf_len, u_short addName) { if(name == NULL) return(" "); safe_snprintf(__FILE__, __LINE__, buf, buf_len, "", name); return(buf); } ntop-5.0.1+dfsg1/python.c0000644000000000000000000016217712007424262013675 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * http://www.ntop.org * * Copyright (C) 2012 Luca Deri * Daniele Sgandurra * Jaime Blasco * Gianluca Medici * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-report.h" #include #ifdef HAVE_PYTHON static HostTraffic *ntop_host = NULL; static char query_string[2048]; static PthreadMutex python_mutex; static u_int8_t header_sent; #if (PY_MAJOR_VERSION > 2) #define PyString_FromString(a) PyUnicode_FromString(a) #define PyString_FromFormat PyUnicode_FromFormat #define PyInt_FromLong(a) PyLong_FromLong(a) #define Py_InitModule(a, b) PyModule_Create(&_##b) #else #define wchar_t char #endif #ifdef WIN32 #define isnan(a) _isnan(a) #endif /* **************************************** */ static PyObject* python_sendHTTPHeader(PyObject *self, PyObject *args) { int mime_type; // traceEvent(CONST_TRACE_WARNING, "-%s-", "python_sendHTTPHeader"); if(!PyArg_ParseTuple(args, "i", &mime_type)) return NULL; sendHTTPHeader(mime_type /* FLAG_HTTP_TYPE_HTML */, 0, 0); header_sent = 1; return PyString_FromString(""); } static PyObject* python_returnHTTPnotImplemented(PyObject *self, PyObject *args) { // traceEvent(CONST_TRACE_WARNING, "-%s-", "python_returnHTTPnotImplemented"); returnHTTPnotImplemented(); header_sent = 1; return PyString_FromString(""); } /* **************************************** */ static PyObject* python_returnHTTPversionServerError(PyObject *self, PyObject *args) { returnHTTPversionServerError(); header_sent = 1; return PyString_FromString(""); } /* **************************************** */ static PyObject* python_printHTMLHeader(PyObject *self, PyObject *args) { char *title; int sectionTitle, refresh; int flags = 0; // traceEvent(CONST_TRACE_WARNING, "-%s-", "python_printHTMLHeader"); if(!PyArg_ParseTuple(args, "sii", &title, §ionTitle, &refresh)) return NULL; if(sectionTitle == 0) flags |= BITFLAG_HTML_NO_HEADING; if(refresh == 0) flags |= BITFLAG_HTML_NO_REFRESH; if(!header_sent) { sendHTTPHeader(1 /* FLAG_HTTP_TYPE_HTML */, 0, 0); header_sent = 1; } printHTMLheader(title, NULL, flags); return PyString_FromString(""); } /* **************************************** */ static PyObject* python_printHTMLFooter(PyObject *self, PyObject *args) { // traceEvent(CONST_TRACE_WARNING, "-%s-", "python_printHTMLFooter"); printHTMLtrailer(); return PyString_FromString(""); } /* **************************************** */ static PyObject* python_sendString(PyObject *self, PyObject *args) { char *msg; //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_sendString"); /* parse the incoming arguments */ if (!PyArg_ParseTuple(args, "s", &msg)) { return NULL; } sendString(msg); return PyString_FromString(""); } /* **************************************** */ static PyObject* python_printFlagedWarning(PyObject *self, PyObject *args) { char *msg; /* parse the incoming arguments */ if (!PyArg_ParseTuple(args, "s", &msg)) { return NULL; } printFlagedWarning(msg); return PyString_FromString(""); } /* **************************************** */ static PyObject* python_getFirstHost(PyObject *self, PyObject *args) { int actualDeviceId; // traceEvent(CONST_TRACE_WARNING, "-%s- [%p]", "python_getFirstHost", ntop_host); /* parse the incoming arguments */ if(!PyArg_ParseTuple(args, "i", &actualDeviceId)) return NULL; ntop_host = getFirstHost(actualDeviceId); //Return PyString_FromString(ntop_host ? "1" : "0"); return Py_BuildValue("i", ntop_host ? 1 : 0); } /* **************************************** */ static PyObject* python_findHostByNumIP(PyObject *self, PyObject *args) { char *hostIpAddress; int vlanId; int actualDeviceId; HostAddr addr; // traceEvent(CONST_TRACE_WARNING, "-%s- [%p]", "python_findHostByNumIP", ntop_host); /* parse the incoming arguments */ if(!PyArg_ParseTuple(args, "sii", &hostIpAddress, &vlanId, &actualDeviceId)) return NULL; addr.Ip4Address.s_addr = inet_addr(hostIpAddress); /* FIX: add IPv6 support */ ntop_host = findHostByNumIP(addr, vlanId, actualDeviceId); return Py_BuildValue("i", ntop_host ? 1 : 0); } /* **************************************** */ static PyObject* python_getPreference(PyObject *self, PyObject *args) { char *key, value[512] = { '\0' }; int rc; if(!PyArg_ParseTuple(args, "s", &key)) return NULL; rc = fetchPrefsValue(key, value, sizeof(value)); return PyString_FromString(rc == 0 ? value : ""); } /* **************************************** */ static PyObject* python_getDBPath(PyObject *self, PyObject *args) { return PyString_FromString(myGlobals.dbPath); } static PyObject* python_getSpoolPath(PyObject *self, PyObject *args) { return PyString_FromString(myGlobals.spoolPath); } /* **************************************** */ static PyObject* python_updateRRD(PyObject *self, PyObject *args, u_char is_counter) { char *path, *key, real_path[256]; long value; int step, rc; if(!PyArg_ParseTuple(args, "ssli", &path, &key, &value, &step)) return NULL; snprintf(real_path, sizeof(real_path), "%s%c%s%c", (path[0] == CONST_PATH_SEP) ? path : myGlobals.rrdPath, CONST_PATH_SEP, path, CONST_PATH_SEP); //traceEvent(CONST_TRACE_WARNING, "%s(%s/%s,%d)", "python_updateRRD", real_path, key, (int)value); mkdir_p("pythonRRD", real_path, 0777); myGlobals.rrdTime = time(NULL); /* Legacy crap I need to update */ if(is_counter) rc = updateCounter(real_path, key, value, step); else rc = updateGauge(real_path, key, value, step); return Py_BuildValue("i", rc); } /* **************************************** */ static PyObject* python_updateRRDCounter(PyObject *self, PyObject *args) { return(python_updateRRD(self, args, 1)); } /* **************************************** */ static PyObject* python_updateRRDGauge(PyObject *self, PyObject *args) { return(python_updateRRD(self, args, 0)); } /* **************************************** */ static PyObject* python_rrd_fetch(PyObject *self, PyObject *args) { PyObject *r; rrd_value_t *data, *datai; unsigned long step, ds_cnt; time_t start, end; int argc=0, rc=0; char **ds_namv; char *argv[7], *pPathFilename, *pFunction, *pStart, *pEnd; /* parse the incoming arguments */ if(!PyArg_ParseTuple(args, "ssss", &pPathFilename, &pFunction, &pStart, &pEnd)) return NULL; argv[argc++] = "rrd_fetch"; argv[argc++] = pPathFilename; argv[argc++] = pFunction; argv[argc++] = "--start"; argv[argc++] = pStart; argv[argc++] = "--end"; argv[argc++] = pEnd; optind=0; /* reset gnu getopt */ opterr=0; /* no error messages */ rrd_clear_error(); rc = rrd_fetch(argc, argv, &start, &end, &step, &ds_cnt, &ds_namv, &data); //Inspired by rrdtoolmodule.c (pyrrdtool) from Hye-Shik Chang if (rc == -1) { //traceEvent(CONST_TRACE_ERROR, "%s - (%s) <%s-%s-%s-%s> ", "python_RRD_fetch", rrd_get_error(),pPathFilename, pFunction, pStart, pEnd);//TODO PyErr_SetString(PyErr_NewException("rrdtool.error", NULL, NULL), rrd_get_error()); rrd_clear_error(); r = NULL; } else { /* Return : ((start, end, step), (name1, name2, ...), [(data1, data2, ..), ...]) */ PyObject *range_tup, *dsnam_tup, *data_list, *t; unsigned long i, j, row; rrd_value_t dv; row = (unsigned long)((end - start) / step); r = PyTuple_New(3); range_tup = PyTuple_New(3); dsnam_tup = PyTuple_New(ds_cnt); data_list = PyList_New(row); PyTuple_SET_ITEM(r, 0, range_tup); PyTuple_SET_ITEM(r, 1, dsnam_tup); PyTuple_SET_ITEM(r, 2, data_list); datai = data; PyTuple_SET_ITEM(range_tup, 0, PyInt_FromLong((long) start)); PyTuple_SET_ITEM(range_tup, 1, PyInt_FromLong((long) end)); PyTuple_SET_ITEM(range_tup, 2, PyInt_FromLong((long) step)); for (i = 0; i < ds_cnt; i++) PyTuple_SET_ITEM(dsnam_tup, i, PyString_FromString(ds_namv[i])); for (i = 0; i < row; i++) { t = PyTuple_New(ds_cnt); PyList_SET_ITEM(data_list, i, t); for (j = 0; j < ds_cnt; j++) { dv = *(datai++); if (isnan(dv)) { PyTuple_SET_ITEM(t, j, Py_None); Py_INCREF(Py_None); } else { PyTuple_SET_ITEM(t, j, PyFloat_FromDouble((double) dv)); } } } for (i = 0; i < ds_cnt; i++){ rrd_freemem(ds_namv[i]); } rrd_freemem(ds_namv); rrd_freemem(data); } return r; } /* **************************************** */ static PyObject* python_ntopVersion(PyObject *self, PyObject *args) { return PyString_FromString(version); } static PyObject* python_ntopOs(PyObject *self, PyObject *args) { return PyString_FromString(osName); } static PyObject* python_ntopUptime(PyObject *self, PyObject *args) { char formatBuf[256]; formatSeconds((unsigned long)(time(NULL)-myGlobals.initialSniffTime), formatBuf, sizeof(formatBuf)); return PyString_FromString(formatBuf); } /* **************************************** */ static PyObject* python_setPreference(PyObject *self, PyObject *args) { char *key, *value; if(!PyArg_ParseTuple(args, "ss", &key, &value)) return NULL; storePrefsValue(key, value); return PyInt_FromLong(0); } /* **************************************** */ static PyObject* python_getNextHost(PyObject *self, PyObject *args) { int actualDeviceId; //traceEvent(CONST_TRACE_WARNING, "-%s- [%p]", "python_getNextHost", ntop_host); /* parse the incoming arguments */ if(!PyArg_ParseTuple(args, "i", &actualDeviceId)) return NULL; if(ntop_host != NULL) ntop_host = getNextHost(actualDeviceId, ntop_host); else ntop_host = getFirstHost(actualDeviceId); //return PyString_FromString(ntop_host ? "1" : "0"); return Py_BuildValue("i", ntop_host ? 1 : 0); } /* **************************************** */ static PyObject* python_hostSerial(PyObject *self, PyObject *args) { char buf[64]; //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_hostSerial"); return PyString_FromString(ntop_host ? serial2str(ntop_host->hostSerial, buf, sizeof(buf)) : ""); } /* **************************************** */ static PyObject* python_ethAddress(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ethAddress"); return PyString_FromString(ntop_host ? ntop_host->ethAddressString : ""); } /* **************************************** */ static PyObject* python_ipAddress(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyString_FromString((ntop_host && ntop_host->hostNumIpAddress) ? ntop_host->hostNumIpAddress : ""); } /* **************************************** */ static PyObject* python_hostResolvedName(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyString_FromString((ntop_host && ntop_host->hostResolvedName) ? ntop_host->hostResolvedName : ""); } /* **************************************** */ static PyObject* python_hostTrafficBucket(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyLong_FromUnsignedLong(ntop_host->hostTrafficBucket); } /* **************************************** */ static PyObject* python_numHostSessions(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyLong_FromUnsignedLong(ntop_host->numHostSessions); } /* **************************************** */ static PyObject* python_vlanId(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyLong_FromUnsignedLong(ntop_host->vlanId); } /* **************************************** */ static PyObject* python_networkMask(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyLong_FromUnsignedLong(ntop_host->network_mask); } /* **************************************** */ static PyObject* python_hwModel(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyString_FromString((ntop_host && ntop_host->hwModel) ? ntop_host->hwModel : ""); } /* **************************************** */ static PyObject* python_isHostResolvedNameType(PyObject *self, PyObject *args) { int type; //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_isHostResolvedNameType"); /* parse the incoming arguments */ if(!PyArg_ParseTuple(args, "i", &type)) return NULL; return PyBool_FromLong(ntop_host && (ntop_host->hostResolvedNameType==type)); } /* **************************************** */ static PyObject* python_isFTPhost(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isFTPhost(ntop_host)); } /* **************************************** */ static PyObject* python_isServer(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isServer(ntop_host)); } /* **************************************** */ static PyObject* python_isWorkstation(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isWorkstation(ntop_host)); } /* **************************************** */ static PyObject* python_isMasterBrowser(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isMasterBrowser(ntop_host)); } /* **************************************** */ static PyObject* python_isMultihomed(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isMultihomed(ntop_host)); } /* **************************************** */ static PyObject* python_isMultivlaned(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isMultivlaned(ntop_host)); } /* **************************************** */ static PyObject* python_isPrinter(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isPrinter(ntop_host)); } /* **************************************** */ static PyObject* python_isSMTPhost(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isSMTPhost(ntop_host)); } /* **************************************** */ static PyObject* python_isPOPhost(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isPOPhost(ntop_host)); } /* **************************************** */ static PyObject* python_isFacebookClient(PyObject *self, PyObject *args) { return PyBool_FromLong(isFacebookClient(ntop_host)); } /* **************************************** */ static PyObject* python_isTwitterClient(PyObject *self, PyObject *args) { return PyBool_FromLong(isTwitterClient(ntop_host)); } /* **************************************** */ static PyObject* python_isIMAPhost(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isIMAPhost(ntop_host)); } /* **************************************** */ static PyObject* python_isDirectoryHost(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isDirectoryHost(ntop_host)); } /* **************************************** */ static PyObject* python_isHTTPhost(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isHTTPhost(ntop_host)); } /* **************************************** */ static PyObject* python_isWINShost(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isWINShost(ntop_host)); } /* **************************************** */ static PyObject* python_isBridgeHost(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isBridgeHost(ntop_host)); } /* **************************************** */ static PyObject* python_isVoIPClient(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isVoIPClient(ntop_host)); } /* **************************************** */ static PyObject* python_isVoIPGateway(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isVoIPGateway(ntop_host)); } /* **************************************** */ static PyObject* python_isVoIPHost(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isVoIPHost(ntop_host)); } /* **************************************** */ static PyObject* python_isDHCPClient(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isDHCPClient(ntop_host)); } /* **************************************** */ static PyObject* python_isDHCPServer(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isDHCPServer(ntop_host)); } /* **************************************** */ static PyObject* python_isP2P(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isP2P(ntop_host)); } /* **************************************** */ static PyObject* python_isNtpServer(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyBool_FromLong(isNtpServer(ntop_host)); } /* **************************************** */ static PyObject* python_totContactedSentPeers(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyLong_FromUnsignedLong((unsigned long)(unsigned long)(ntop_host->totContactedSentPeers)); } /* **************************************** */ static PyObject* python_totContactedRcvdPeers(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyLong_FromUnsignedLong((unsigned long)(unsigned long)(ntop_host->totContactedRcvdPeers)); } /* **************************************** */ static PyObject* python_fingerprint(PyObject *self, PyObject *args) { return PyString_FromString((ntop_host && ntop_host->fingerprint) ? ntop_host->fingerprint : ""); } /* **************************************** */ static PyObject* python_pktsSent(PyObject *self, PyObject *args) { return PyLong_FromUnsignedLong((unsigned long)(unsigned long)(ntop_host->pktsSent.value)); } static PyObject* python_pktsRcvd(PyObject *self, PyObject *args) { return PyLong_FromUnsignedLong((unsigned long)(unsigned long)(ntop_host->pktsRcvd.value)); } /* **************************************** */ static PyObject* python_bytesSent(PyObject *self, PyObject *args) { return PyLong_FromUnsignedLong((unsigned long)(unsigned long)(ntop_host->bytesSent.value)); } static PyObject* python_bytesRcvd(PyObject *self, PyObject *args) { return PyLong_FromUnsignedLong((unsigned long)(unsigned long)(ntop_host->bytesRcvd.value)); } /* **************************************** */ static PyObject* python_sendThpt(PyObject *self, PyObject *args) { PyObject *obj = PyDict_New(); if(obj) { PyDict_SetItem(obj, PyString_FromString("actual"), PyFloat_FromDouble((double)(ntop_host->actualSentThpt))); PyDict_SetItem(obj, PyString_FromString("average"), PyFloat_FromDouble((double)(ntop_host->averageSentThpt))); PyDict_SetItem(obj, PyString_FromString("peak"), PyFloat_FromDouble((double)(ntop_host->peakSentThpt))); } return(obj); } /* **************************************** */ static PyObject* python_receiveThpt(PyObject *self, PyObject *args) { PyObject *obj = PyDict_New(); if(obj) { PyDict_SetItem(obj, PyString_FromString("actual"), PyFloat_FromDouble((double)(ntop_host->actualRcvdThpt))); PyDict_SetItem(obj, PyString_FromString("average"), PyFloat_FromDouble((double)(ntop_host->averageRcvdThpt))); PyDict_SetItem(obj, PyString_FromString("peak"), PyFloat_FromDouble((double)(ntop_host->peakRcvdThpt))); } return(obj); } /* **************************************** */ static PyObject* python_dumpHostRawFlows(PyObject *self, PyObject *args) { PyObject *ret = PyList_New(0); int found = 0, idx; HostTraffic *el = NULL; char buf[LEN_GENERAL_WORK_BUFFER/2], *host; /* ****************************** */ if( (!PyArg_ParseTuple(args, "s", &host)) && (!PyArg_ParseTuple(args, "i", &host)) ) return(ret); if(host == NULL) return(ret); for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if ((strcmp(el->hostNumIpAddress, host) == 0) || (strcmp(el->hostResolvedName, host) == 0)) { found = 1; break; } } /* for */ if(!found) return(ret); for(idx=0; idxinitiator->magic != CONST_MAGIC_NUMBER) || (session->remotePeer->magic != CONST_MAGIC_NUMBER)) { #if 0 traceEvent(CONST_TRACE_WARNING, "Session with expired peer (%d/%d)", session->initiator->magic, session->remotePeer->magic); #endif session = session->next; continue; } #ifndef PARM_PRINT_ALL_SESSIONS if(session->sessionState != FLAG_STATE_ACTIVE) { session = session->next; continue; } #endif if(el && (session->initiator != el) && (session->remotePeer != el)) { session = session->next; continue; } symProto = proto2name(session->proto); l7Proto = getProtoName(session->proto, session->l7.major_proto); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s|%s|%llu|%llu|%s|%s\n", (session->initiator->hostResolvedName[0] != '\0') ? session->initiator->hostResolvedName :session->initiator->hostNumIpAddress, (session->remotePeer->hostNumIpAddress[0] != '\0') ? session->remotePeer->hostResolvedName : session->remotePeer->hostNumIpAddress, session->bytesSent.value, session->bytesRcvd.value, symProto, l7Proto); PyList_Append(ret, PyString_FromString(buf)); session = session->next; } } releaseMutex(&myGlobals.sessionsMutex[mutex_idx]); } return(ret); } /* **************************************** */ /* **************************************** */ #ifdef HAVE_GEOIP #define VAL(a) ((a != NULL) ? a : "") static PyObject* python_getGeoIP(PyObject *self, PyObject *args) { PyObject *obj = PyDict_New(); GeoIPRecord *geo = (ntop_host && ntop_host->geo_ip) ? ntop_host->geo_ip : NULL; if(geo != NULL) { PyDict_SetItem(obj, PyString_FromString("country_code"), PyString_FromString(VAL(geo->country_code))); PyDict_SetItem(obj, PyString_FromString("country_name"), PyString_FromString(VAL(geo->country_name))); PyDict_SetItem(obj, PyString_FromString("region"), PyString_FromString(VAL(geo->region))); PyDict_SetItem(obj, PyString_FromString("city"), PyString_FromString(VAL(geo->city))); PyDict_SetItem(obj, PyString_FromString("latitude"), PyFloat_FromDouble((double)geo->latitude)); PyDict_SetItem(obj, PyString_FromString("longitude"), PyFloat_FromDouble((double)geo->longitude)); } return obj; } #endif /* **************************************** */ static PyObject* python_synPktsSent(PyObject *self, PyObject *args) { //traceEvent(CONST_TRACE_WARNING, "-%s-", "python_ipAddress"); return PyString_FromFormat("%lu", (ntop_host && ntop_host->secHostPkts) ? (unsigned long)(ntop_host->secHostPkts->synPktsSent.value.value) : 0); } /* **************************************** */ static PyObject* python_interface_numInterfaces(PyObject *self, PyObject *args) { return PyInt_FromLong((long)myGlobals.numDevices); } static PyObject* python_interface_name(PyObject *self, PyObject *args) { u_int interfaceId; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyString_FromFormat("%s", myGlobals.device[interfaceId].name); } static PyObject* python_interface_uniqueIfName(PyObject *self, PyObject *args) { u_int interfaceId; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyString_FromFormat("%s", myGlobals.device[interfaceId].uniqueIfName); } static PyObject* python_interface_humanFriendlyName(PyObject *self, PyObject *args) { u_int interfaceId; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyString_FromFormat("%s", myGlobals.device[interfaceId].humanFriendlyName); } static PyObject* python_interface_ipv4Address(PyObject *self, PyObject *args) { u_int interfaceId; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyString_FromString(myGlobals.device[interfaceId].ipdot ? myGlobals.device[interfaceId].ipdot : ""); } static PyObject* python_interface_network(PyObject *self, PyObject *args) { u_int interfaceId; char buf[32], buf1[32]; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyString_FromFormat("%s/%s", _intoa(myGlobals.device[interfaceId].network, buf, sizeof(buf)), _intoa(myGlobals.device[interfaceId].netmask, buf1, sizeof(buf1))); } static PyObject* python_interface_numHosts(PyObject *self, PyObject *args) { u_int interfaceId; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyLong_FromUnsignedLong(myGlobals.device[interfaceId].numHosts); } static PyObject* python_interface_ipv6Address(PyObject *self, PyObject *args) { u_int interfaceId; #ifdef INET6 char buf[64]; #endif if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; #ifdef INET6 if(myGlobals.device[interfaceId].v6Addrs == NULL) return PyString_FromString(""); return PyString_FromFormat("%s/%d", _intop(&myGlobals.device[interfaceId].v6Addrs->af.inet6.ifAddr, buf, sizeof(buf)), myGlobals.device[interfaceId].v6Addrs->af.inet6.prefixlen); #else return NULL; #endif } static PyObject* python_interface_time(PyObject *self, PyObject *args) { u_int interfaceId; PyObject *obj; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; if((obj = PyDict_New()) == NULL) return NULL; PyDict_SetItem(obj, PyString_FromString("startTime"), PyLong_FromUnsignedLong((u_int)myGlobals.device[interfaceId].started)); PyDict_SetItem(obj, PyString_FromString("firstSeen"), PyLong_FromUnsignedLong((u_int)myGlobals.device[interfaceId].firstpkt)); PyDict_SetItem(obj, PyString_FromString("lastSeen"), PyLong_FromUnsignedLong((u_int)myGlobals.device[interfaceId].lastpkt)); return obj; } static PyObject* python_interface_virtual(PyObject *self, PyObject *args) { u_int interfaceId; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyInt_FromLong((long)myGlobals.device[interfaceId].virtualDevice); } static PyObject* python_interface_speed(PyObject *self, PyObject *args) { u_int interfaceId; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyLong_FromUnsignedLong(myGlobals.device[interfaceId].deviceSpeed); } static PyObject* python_interface_mtu(PyObject *self, PyObject *args) { u_int interfaceId; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyLong_FromUnsignedLong(myGlobals.device[interfaceId].mtuSize); } static PyObject* python_interface_bpf(PyObject *self, PyObject *args) { u_int interfaceId; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; return PyString_FromString(myGlobals.device[interfaceId].filter ? myGlobals.device[interfaceId].filter : ""); } static PyObject* python_interface_pktsStats(PyObject *self, PyObject *args) { u_int interfaceId; PyObject *obj; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; if((obj = PyDict_New()) == NULL) return NULL; PyDict_SetItem(obj, PyString_FromString("total"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].receivedPkts.value)); PyDict_SetItem(obj, PyString_FromString("ntopDrops"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].droppedPkts.value)); PyDict_SetItem(obj, PyString_FromString("pcapDrops"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].pcapDroppedPkts.value)); PyDict_SetItem(obj, PyString_FromString("initialPcapDrops"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].initialPcapDroppedPkts.value)); PyDict_SetItem(obj, PyString_FromString("ethernet"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].ethernetPkts.value)); PyDict_SetItem(obj, PyString_FromString("broadcast"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].broadcastPkts.value)); PyDict_SetItem(obj, PyString_FromString("multicast"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].multicastPkts.value)); PyDict_SetItem(obj, PyString_FromString("ip"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].ipPkts.value)); return obj; } static PyObject* python_interface_bytesStats(PyObject *self, PyObject *args) { u_int interfaceId; PyObject *obj; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; if((obj = PyDict_New()) == NULL) return NULL; PyDict_SetItem(obj, PyString_FromString("total"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].ethernetBytes.value)); PyDict_SetItem(obj, PyString_FromString("ipv4"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].ipv4Bytes.value)); PyDict_SetItem(obj, PyString_FromString("fragmented"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].fragmentedIpBytes.value)); PyDict_SetItem(obj, PyString_FromString("tcp"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].tcpBytes.value)); PyDict_SetItem(obj, PyString_FromString("udp"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].udpBytes.value)); PyDict_SetItem(obj, PyString_FromString("otherIp"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].otherIpBytes.value)); PyDict_SetItem(obj, PyString_FromString("icmp"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].icmpBytes.value)); PyDict_SetItem(obj, PyString_FromString("stp"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].stpBytes.value)); PyDict_SetItem(obj, PyString_FromString("ipsec"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].ipsecBytes.value)); PyDict_SetItem(obj, PyString_FromString("netbios"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netbiosBytes.value)); PyDict_SetItem(obj, PyString_FromString("arp_rarp"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].arpRarpBytes.value)); PyDict_SetItem(obj, PyString_FromString("gre"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].greBytes.value)); PyDict_SetItem(obj, PyString_FromString("ipv6"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].ipv6Bytes.value)); PyDict_SetItem(obj, PyString_FromString("icmp6"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].icmp6Bytes.value)); PyDict_SetItem(obj, PyString_FromString("other"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].otherBytes.value)); return(obj); } static PyObject* python_interface_throughputStats(PyObject *self, PyObject *args) { u_int interfaceId; PyObject *obj; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; if((obj = PyDict_New()) == NULL) return NULL; PyDict_SetItem(obj, PyString_FromString("peakPkts"), PyFloat_FromDouble(myGlobals.device[interfaceId].peakPacketThroughput)); PyDict_SetItem(obj, PyString_FromString("actualPkts"), PyFloat_FromDouble(myGlobals.device[interfaceId].actualPktsThpt)); PyDict_SetItem(obj, PyString_FromString("lastMinPkts"), PyFloat_FromDouble(myGlobals.device[interfaceId].lastMinPktsThpt)); PyDict_SetItem(obj, PyString_FromString("lastFiveMinsPkts"), PyFloat_FromDouble(myGlobals.device[interfaceId].lastFiveMinsPktsThpt)); PyDict_SetItem(obj, PyString_FromString("peakBytes"), PyFloat_FromDouble(myGlobals.device[interfaceId].peakThroughput)); PyDict_SetItem(obj, PyString_FromString("actualBytes"), PyFloat_FromDouble(myGlobals.device[interfaceId].actualPktsThpt)); PyDict_SetItem(obj, PyString_FromString("lastMinBytes"), PyFloat_FromDouble(myGlobals.device[interfaceId].lastMinPktsThpt)); PyDict_SetItem(obj, PyString_FromString("lastFiveMinsBytes"), PyFloat_FromDouble(myGlobals.device[interfaceId].lastFiveMinsPktsThpt)); return(obj); } static PyObject* python_interface_securityPkts(PyObject *self, PyObject *args) { u_int interfaceId; PyObject *obj; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; if((obj = PyDict_New()) == NULL) return NULL; PyDict_SetItem(obj, PyString_FromString("synPkts"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.synPkts.value)); PyDict_SetItem(obj, PyString_FromString("rstPkts"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.rstPkts.value)); PyDict_SetItem(obj, PyString_FromString("rstAckPkts"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.rstAckPkts.value)); PyDict_SetItem(obj, PyString_FromString("synFinPkts"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.synFinPkts.value)); PyDict_SetItem(obj, PyString_FromString("finPushUrgPkts"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.finPushUrgPkts.value)); PyDict_SetItem(obj, PyString_FromString("nullPkts"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.nullPkts.value)); PyDict_SetItem(obj, PyString_FromString("rejectedTCPConn"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.rejectedTCPConn.value)); PyDict_SetItem(obj, PyString_FromString("establishedTCPConn"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.establishedTCPConn.value)); PyDict_SetItem(obj, PyString_FromString("terminatedTCPConn"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.terminatedTCPConn.value)); PyDict_SetItem(obj, PyString_FromString("ackXmasFinSynNullScan"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.ackXmasFinSynNullScan.value)); PyDict_SetItem(obj, PyString_FromString("udpToClosedPort"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.udpToClosedPort.value)); PyDict_SetItem(obj, PyString_FromString("udpToDiagnosticPort"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.udpToDiagnosticPort.value)); PyDict_SetItem(obj, PyString_FromString("tcpToDiagnosticPort"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.tcpToDiagnosticPort.value)); PyDict_SetItem(obj, PyString_FromString("tinyFragment"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.tinyFragment.value)); PyDict_SetItem(obj, PyString_FromString("icmpFragment"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.icmpFragment.value)); PyDict_SetItem(obj, PyString_FromString("overlappingFragment"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.overlappingFragment.value)); PyDict_SetItem(obj, PyString_FromString("closedEmptyTCPConn"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.closedEmptyTCPConn.value)); PyDict_SetItem(obj, PyString_FromString("malformedPkts"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.malformedPkts.value)); PyDict_SetItem(obj, PyString_FromString("icmpPortUnreach"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.icmpPortUnreach.value)); PyDict_SetItem(obj, PyString_FromString("icmpHostNetUnreach"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.icmpHostNetUnreach.value)); PyDict_SetItem(obj, PyString_FromString("icmpProtocolUnreach"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.icmpProtocolUnreach.value)); PyDict_SetItem(obj, PyString_FromString("icmpAdminProhibited"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].securityPkts.icmpAdminProhibited.value)); return(obj); } static PyObject* python_interface_netflowStats(PyObject *self, PyObject *args) { u_int interfaceId; PyObject *obj; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; if(myGlobals.device[interfaceId].netflowGlobals == NULL) return PyDict_New(); if((obj = PyDict_New()) == NULL) return NULL; PyDict_SetItem(obj, PyString_FromString("totalPkts"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsPktsRcvd)); PyDict_SetItem(obj, PyString_FromString("v5flows"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsV5Rcvd)); PyDict_SetItem(obj, PyString_FromString("v1flows"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsV1Rcvd)); PyDict_SetItem(obj, PyString_FromString("v7flows"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsV7Rcvd)); PyDict_SetItem(obj, PyString_FromString("v9flows"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsV9Rcvd)); PyDict_SetItem(obj, PyString_FromString("flowsProcessed"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsProcessed)); PyDict_SetItem(obj, PyString_FromString("flowsReceived"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsRcvd)); PyDict_SetItem(obj, PyString_FromString("badVersion"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numBadNetFlowsVersionsRcvd)); PyDict_SetItem(obj, PyString_FromString("badFlows"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numBadFlowPkts)); PyDict_SetItem(obj, PyString_FromString("v9Templates"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsV9TemplRcvd)); PyDict_SetItem(obj, PyString_FromString("v9BadTemplates"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsV9BadTemplRcvd)); PyDict_SetItem(obj, PyString_FromString("v9UnknownTemplate"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsV9UnknTemplRcvd)); PyDict_SetItem(obj, PyString_FromString("v9OptionFlows"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].netflowGlobals->numNetFlowsV9OptionFlowsRcvd)); return(obj); } static PyObject* python_interface_sflowStats(PyObject *self, PyObject *args) { u_int interfaceId; PyObject *obj; if(!PyArg_ParseTuple(args, "i", &interfaceId)) return NULL; if(interfaceId >= myGlobals.numDevices) return NULL; if(myGlobals.device[interfaceId].sflowGlobals == NULL) return PyDict_New(); if((obj = PyDict_New()) == NULL) return NULL; PyDict_SetItem(obj, PyString_FromString("pkts"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].sflowGlobals->numsFlowsPktsRcvd)); PyDict_SetItem(obj, PyString_FromString("v2Flows"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].sflowGlobals->numsFlowsV2Rcvd)); PyDict_SetItem(obj, PyString_FromString("v4Flows"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].sflowGlobals->numsFlowsV4Rcvd)); PyDict_SetItem(obj, PyString_FromString("v5Flows"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].sflowGlobals->numsFlowsV5Rcvd)); PyDict_SetItem(obj, PyString_FromString("totalProcessed"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].sflowGlobals->numsFlowsProcessed)); PyDict_SetItem(obj, PyString_FromString("samples"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].sflowGlobals->numsFlowsSamples)); PyDict_SetItem(obj, PyString_FromString("counterUpdates"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].sflowGlobals->numsFlowCounterUpdates)); PyDict_SetItem(obj, PyString_FromString("badVersion"), PyLong_FromUnsignedLong((unsigned long)myGlobals.device[interfaceId].sflowGlobals->numBadsFlowsVersionsRcvd)); return(obj); } /* **************************************** */ static PyMethodDef ntop_methods[] = { { "sendHTTPHeader", python_sendHTTPHeader, METH_VARARGS| METH_KEYWORDS, "" }, { "returnHTTPnotImplemented", python_returnHTTPnotImplemented, METH_VARARGS, "" }, { "returnHTTPversionServerError", python_returnHTTPversionServerError, METH_VARARGS, "" }, { "printHTMLHeader", python_printHTMLHeader, METH_VARARGS, "" }, { "printHTMLFooter", python_printHTMLFooter, METH_VARARGS, "" }, { "sendString", python_sendString, METH_VARARGS, "" }, { "printFlagedWarning", python_printFlagedWarning, METH_VARARGS, "" }, { "getFirstHost", python_getFirstHost, METH_VARARGS, "" }, { "getNextHost", python_getNextHost, METH_VARARGS, "" }, { "findHostByNumIP", python_findHostByNumIP, METH_VARARGS, "" }, { "version", python_ntopVersion, METH_VARARGS, "" }, { "os", python_ntopOs, METH_VARARGS, "" }, { "uptime", python_ntopUptime, METH_VARARGS, "" }, { "getPreference", python_getPreference, METH_VARARGS, "" }, { "setPreference", python_setPreference, METH_VARARGS, "" }, { "getDBPath", python_getDBPath, METH_VARARGS, "" }, { "getSpoolPath", python_getSpoolPath, METH_VARARGS, "" }, { "updateRRDCounter", python_updateRRDCounter, METH_VARARGS, "" }, { "updateRRDGauge", python_updateRRDGauge, METH_VARARGS, "" }, { "rrd_fetch", python_rrd_fetch, METH_VARARGS, "Fetch values from RRA" }, { NULL, NULL, 0, NULL } }; /* **************************************** */ static PyMethodDef interface_methods[] = { { "numInterfaces", python_interface_numInterfaces, METH_VARARGS, "Get number of configured interfaces" }, { "name", python_interface_name, METH_VARARGS, "Get interface name" }, { "uniqueName", python_interface_uniqueIfName, METH_VARARGS, "Get unique interface name" }, { "humanName", python_interface_humanFriendlyName, METH_VARARGS, "Get human-friendly interface name" }, { "ipv4", python_interface_ipv4Address, METH_VARARGS, "Get interface address (IPv4)" }, { "network", python_interface_network, METH_VARARGS, "Get network and mask to which the interface belongs" }, { "numHosts", python_interface_numHosts, METH_VARARGS, "Get the number of hosts active on this interface" }, { "ipv6", python_interface_ipv6Address, METH_VARARGS, "Get interface address (IPv6)" }, { "time", python_interface_time, METH_VARARGS, "Get interface time" }, { "virtual", python_interface_virtual, METH_VARARGS, "Check if this is a virtual interface" }, { "speed", python_interface_speed, METH_VARARGS, "Interface speed (0 if unknown)" }, { "mtu", python_interface_mtu, METH_VARARGS, "Get interface MTU size" }, { "bpf", python_interface_bpf, METH_VARARGS, "Get BPF filter set for this interface (if any)" }, { "pktsStats", python_interface_pktsStats, METH_VARARGS, "Get packet statistics " }, { "bytesStats", python_interface_bytesStats, METH_VARARGS, "Get bytes statistics" }, { "throughputStats", python_interface_throughputStats, METH_VARARGS, "" }, { "securityPkts", python_interface_securityPkts, METH_VARARGS, "Get information about security packets" }, { "netflowStats", python_interface_netflowStats, METH_VARARGS, "Get NetFlow interface information" }, { "sflowStats", python_interface_sflowStats, METH_VARARGS, "Get sFlow interface information" }, { "dumpHostRawFlows", python_dumpHostRawFlows, METH_VARARGS, "Get Raw Flows from host" }, { NULL, NULL, 0, NULL } }; /* **************************************** */ static PyMethodDef host_methods[] = { { "serial", python_hostSerial, METH_NOARGS, "Get host unique serial identifier" }, { "ethAddress", python_ethAddress, METH_NOARGS, "Get host MAC address" }, { "ipAddress", python_ipAddress, METH_NOARGS, "Get host IP address" }, { "hostResolvedName", python_hostResolvedName, METH_NOARGS, "Get host Resolved Name" }, { "hostTrafficBucket", python_hostTrafficBucket, METH_NOARGS, "Get Traffic Bucket" }, { "numHostSessions", python_numHostSessions, METH_NOARGS, "Get numHostSessions" }, { "vlanId", python_vlanId, METH_NOARGS, "Get vlanId" }, { "network_mask", python_networkMask, METH_NOARGS, "Get network_mask" }, { "hwModel", python_hwModel, METH_NOARGS, "Get hwModel" }, { "isHostResolvedNameType", python_isHostResolvedNameType, METH_VARARGS, "Check if the host matches the specified type" }, { "isFTPhost", python_isFTPhost, METH_NOARGS, "Check FTP Host" }, { "isServer", python_isServer, METH_NOARGS, "Check isServer" }, { "isWorkstation", python_isWorkstation, METH_NOARGS, "Check isWorkstation Host" }, { "isMasterBrowser", python_isMasterBrowser, METH_NOARGS, "Check isMasterBrowser Host" }, { "isMultihomed", python_isMultihomed, METH_NOARGS, "Check isMultihomed Host" }, { "isMultivlaned", python_isMultivlaned, METH_NOARGS, "Check isMultivlaned Host" }, { "isPrinter", python_isPrinter, METH_NOARGS, "Check isPrinter Host" }, { "isSMTPhost", python_isSMTPhost, METH_NOARGS, "Check isSMTPhost Host" }, { "isPOPhost", python_isPOPhost, METH_NOARGS, "Check isPOPhost Host" }, { "isFacebookClient", python_isFacebookClient, METH_NOARGS, "Check isFacebookClient Host" }, { "isTwitterClient", python_isTwitterClient, METH_NOARGS, "Check isTwitterClient Host" }, { "isIMAPhost", python_isIMAPhost, METH_NOARGS, "Check isIMAPhost Host" }, { "isDirectoryHost", python_isDirectoryHost, METH_NOARGS, "Check isDirectoryHost Host" }, { "isHTTPhost", python_isHTTPhost, METH_NOARGS, "Check isHTTPhost Host" }, { "isWINShost", python_isWINShost, METH_NOARGS, "Check isWINShost Host" }, { "isBridgeHost", python_isBridgeHost, METH_NOARGS, "Check isBridgeHost Host" }, { "isVoIPClient", python_isVoIPClient, METH_NOARGS, "Check isVoIPClient Host" }, { "isVoIPGateway", python_isVoIPGateway, METH_NOARGS, "Check isVoIPGateway Host" }, { "isVoIPHost", python_isVoIPHost, METH_NOARGS, "Check isVoIPHost Host" }, { "isDHCPClient", python_isDHCPClient, METH_NOARGS, "Check isDHCPClient Host" }, { "isDHCPServer", python_isDHCPServer, METH_NOARGS, "Check isDHCPServer Host" }, { "isP2P", python_isP2P, METH_NOARGS, "Check isP2P Host" }, { "isNtpServer", python_isNtpServer, METH_NOARGS, "Check isNtpServer Host" }, { "totContactedSentPeers", python_totContactedSentPeers, METH_NOARGS, "Check totContactedSentPeers Host" }, { "totContactedRcvdPeers", python_totContactedRcvdPeers, METH_NOARGS, "Check totContactedRcvdPeers Host" }, { "fingerprint", python_fingerprint, METH_NOARGS, "Check fingerprint Host" }, { "synPktsSent", python_synPktsSent, METH_NOARGS, "Check synPktsSent Host" }, { "pktSent", python_pktsSent, METH_NOARGS, "Return the number of packets sent by this host" }, { "pktRcvd", python_pktsRcvd, METH_NOARGS, "Return the number of packets rcvd by this host" }, { "bytesSent", python_bytesSent, METH_NOARGS, "Return the number of bytes sent by this host" }, { "bytesRcvd", python_bytesRcvd, METH_NOARGS, "Return the number of bytes rcvd by this host" }, { "sendThpt", python_sendThpt, METH_NOARGS, "Return the send throughput" }, { "receiveThpt", python_receiveThpt, METH_NOARGS, "Return the receive throughput" }, #ifdef HAVE_GEOIP { "geoIP", python_getGeoIP, METH_NOARGS, "Read geoLocalization info" }, #endif { NULL, NULL, 0, NULL } }; /* **************************************** */ #if PY_MAJOR_VERSION >= 3 struct module_state { PyObject *error; }; #define GETSTATE(m) ((struct module_state*)PyModule_GetState(m)) static int myextension_traverse(PyObject *m, visitproc visit, void *arg) { Py_VISIT(GETSTATE(m)->error); return 0; } static int myextension_clear(PyObject *m) { Py_CLEAR(GETSTATE(m)->error); return 0; } static struct PyModuleDef _ntop_methods = { PyModuleDef_HEAD_INIT, "ntop", NULL, sizeof(struct module_state), ntop_methods, NULL, myextension_traverse, myextension_clear, NULL }; static struct PyModuleDef _interface_methods = { PyModuleDef_HEAD_INIT, "interface", NULL, sizeof(struct module_state), interface_methods, NULL, myextension_traverse, myextension_clear, NULL }; static struct PyModuleDef _host_methods = { PyModuleDef_HEAD_INIT, "host", NULL, sizeof(struct module_state), host_methods, NULL, myextension_traverse, myextension_clear, NULL }; #endif /* **************************************** */ static void init_python_ntop(void) { createMutex(&python_mutex); Py_InitModule("ntop", ntop_methods); Py_InitModule("interface", interface_methods); Py_InitModule("host", host_methods); } /* **************************************** */ int _argc = 0; char **_argv; void init_python(int argc, char *argv[]) { if(myGlobals.runningPref.disablePython) return; if(_argc == 0) { _argc = argc; _argv = argv; if(!myGlobals.runningPref.debugMode) return; } if(_argv) Py_SetProgramName((wchar_t*)_argv[0]); /* Initialize the Python interpreter. Required. */ Py_Initialize(); if(_argv) PySys_SetArgv(_argc, (wchar_t**)_argv); /* Initialize thread support */ PyEval_InitThreads(); init_python_ntop(); } /* **************************************** */ void term_python(void) { if(myGlobals.runningPref.disablePython) return; Py_Finalize(); /* Cleaning up the interpreter */ deleteMutex(&python_mutex); } /* **************************************** */ int handlePythonHTTPRequest(char *url, u_int postLen) { int idx, found = 0; char python_path[256], *document_root = strdup("."), buf[2048], new_query_string[2048]; struct stat statbuf; #ifdef WIN32 PyObject *fd; #else FILE *fd; #endif char *question_mark = strchr(url, '?'); if(myGlobals.runningPref.disablePython) { returnHTTPpageNotFound(NULL); free(document_root); return(1); } // traceEvent(CONST_TRACE_INFO, "Calling python... [%s]", url); if(question_mark) question_mark[0] = '\0'; safe_snprintf(__FILE__, __LINE__, query_string, sizeof(query_string)-1, "%s", question_mark ? &question_mark[1] : ""); for(idx=0; myGlobals.dataFileDirs[idx] != NULL; idx++) { char tmpStr[256]; safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "%s/html", myGlobals.dataFileDirs[idx]); revertSlashIfWIN32(tmpStr, 0); if(stat(tmpStr, &statbuf) == 0) { document_root = strdup(myGlobals.dataFileDirs[idx]); break; } } for(idx=0; (!found) && (myGlobals.dataFileDirs[idx] != NULL); idx++) { safe_snprintf(__FILE__, __LINE__, python_path, sizeof(python_path), "%s/python/%s", myGlobals.dataFileDirs[idx], url); revertSlashIfWIN32(python_path, 0); if(!stat(python_path, &statbuf)) { /* Found */ /* traceEvent(CONST_TRACE_INFO, "[python] [%d] Found %s", idx, python_path); */ found = 1; break; } else { /* traceEvent(CONST_TRACE_INFO, "[python] [%d] Not found %s", idx, python_path); */ } } if(!found) { returnHTTPpageNotFound(NULL); free(document_root); return(1); } if(!myGlobals.runningPref.debugMode) init_python(0, NULL); /* ********************************* */ /* traceEvent(CONST_TRACE_INFO, "[PYTHON] Executing %s", python_path); */ #ifdef WIN32 fd = PyFile_FromString(python_path, "r"); #else fd = fopen(python_path, "r"); #endif if(fd != NULL) { #ifndef WIN32 int old_stdin = 0, old_stdout = 0; #endif header_sent = 0; /* TODO: remove this mutex */ accessMutex(&python_mutex, "exec python interpreter"); revertSlashIfWIN32(document_root, 1); if(postLen == 0) { /* HTTP GET */ escape(new_query_string, sizeof(new_query_string), query_string); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "import os\nos.environ['DOCUMENT_ROOT']='%s'\n" "os.environ['REQUEST_METHOD']='GET'\n" "os.environ['QUERY_STRING']='%s'\n", document_root, new_query_string); } else { /* HTTP POST */ #if defined(WIN32) if((idx = readHTTPpostData(postLen, query_string, sizeof(query_string)-1)) >= 0) { escape(new_query_string, sizeof(new_query_string), query_string); /* Emulate a POST with a GET on Windows */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "import os\nos.environ['DOCUMENT_ROOT']='%s'\n" "os.environ['REQUEST_METHOD']='GET'\n" "os.environ['QUERY_STRING']='%s'\n", document_root, new_query_string); } #else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "import os\nos.environ['DOCUMENT_ROOT']='%s'\n" "os.environ['REQUEST_METHOD']='POST'\n" "os.environ['CONTENT_TYPE']='application/x-www-form-urlencoded'\n" "os.environ['CONTENT_LENGTH']='%u'\n", document_root, postLen); #endif } /* See http://bugs.python.org/issue1159 */ PyRun_SimpleString(buf); traceEvent(CONST_TRACE_INFO, "[PYTHON] Executing %s", buf); /* sys.stdin <=> myGlobals.newSock */ #ifndef WIN32 /* if(myGlobals.runningPref.debugMode) */ /* -K */ { /* Note that myGlobals.newSock is negative when HTTPS is used */ if(myGlobals.runningPref.debugMode) traceEvent(CONST_TRACE_INFO, "[PYTHON] Redirecting file descriptors"); old_stdin = dup(STDIN_FILENO), old_stdout = dup(STDOUT_FILENO); /* Forget file redirection on Windows without forking a process. http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html http://stackoverflow.com/questions/7664/windows-c-how-can-i-redirect-stderr-for-calls-to-fprintf */ if(dup2(abs(myGlobals.newSock), STDOUT_FILENO) == -1) traceEvent(CONST_TRACE_WARNING, "Failed to redirect stdout [%d][%s]", errno, strerror(errno)); if(dup2(abs(myGlobals.newSock), STDIN_FILENO) == -1) traceEvent(CONST_TRACE_WARNING, "Failed to redirect stdin [%d][%s]",errno, strerror(errno)); } #endif /* Run the actual program */ #ifdef WIN32 /* http://python-forum.org/pythonforum/viewtopic.php?f=15&t=1554&p=6567 */ PyRun_SimpleFile(PyFile_AsFile(fd), python_path); #else PyRun_SimpleFile(fd, python_path); #endif #ifndef WIN32 /* if(myGlobals.runningPref.debugMode) */ /* -K */ { if(dup2(old_stdin, STDOUT_FILENO) == -1) traceEvent(CONST_TRACE_WARNING, "Failed to restore stdout"); if(dup2(old_stdout, STDIN_FILENO) == -1) traceEvent(CONST_TRACE_WARNING, "Failed to restore stdout"); if(myGlobals.runningPref.debugMode) traceEvent(CONST_TRACE_INFO, "[PYTHON] Succesfully restored file descriptors"); } #endif releaseMutex(&python_mutex); #ifndef WIN32 fclose(fd); #endif } free(document_root); return(1); } #endif /* HAVE_PYTHON */ ntop-5.0.1+dfsg1/nDPI/0000755000000000000000000000000012012127301012752 5ustar rootrootntop-5.0.1+dfsg1/nDPI/README.ntop0000644000000000000000000000042111655273464014636 0ustar rootrootThis directory contains a modified version of OpenDPI which includes ntop extensions. I have tried to push them into the OpenDPI source tree but nobody in answering emails so I have decided to create my own source tree -------------------------- Luca Deri ntop-5.0.1+dfsg1/nDPI/missing0000755000000000000000000002623311655273464014407 0ustar rootroot#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ntop-5.0.1+dfsg1/nDPI/COPYING0000644000000000000000000001672511655273464014050 0ustar rootroot GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ntop-5.0.1+dfsg1/nDPI/ChangeLog0000644000000000000000000000000011655273464014542 0ustar rootrootntop-5.0.1+dfsg1/nDPI/m4/0000755000000000000000000000000012012127301013272 5ustar rootrootntop-5.0.1+dfsg1/nDPI/m4/ltoptions.m40000644000000000000000000003007311754017511015607 0ustar rootroot# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) ntop-5.0.1+dfsg1/nDPI/m4/ltversion.m40000644000000000000000000000126211754017511015577 0ustar rootroot# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) ntop-5.0.1+dfsg1/nDPI/m4/ltsugar.m40000644000000000000000000001042411655273464015246 0ustar rootroot# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) ntop-5.0.1+dfsg1/nDPI/m4/lt~obsolete.m40000644000000000000000000001375611754017511016137 0ustar rootroot# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) ntop-5.0.1+dfsg1/nDPI/m4/libtool.m40000644000000000000000000106043411754017511015225 0ustar rootroot# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS ntop-5.0.1+dfsg1/nDPI/NEWS0000644000000000000000000000236011655273464013502 0ustar rootroot=== OpenDPI 1.3 (2011/06/09) === * added IPv6 support * new protocols: DHCPv6, ICMPv6, Activesync, Armagetron, Crossfire, Dofus, Fiesta Online, Florensia, Guildwars, Kerberos, LDAP, Maplestory, MSSQL, PPTP, Warcraft 3, World of Kung Fu * improved protocols: Aimini, Battlefield, Bittorrent, DirectDownloadLink, eDonkey, FTP, GaduGadu, Gnutella, HTTP, Icecast, Imesh, IRC, Jabber, IMAP, POP, SMTP, MDNS, Meebo, MSN, Netbios, Oscar, PPLive, QQ, Quake, RTP, Secondlive, Shoutcast, SIP, SSL, STUN, Syslog, TVUplayer, Veohtv, World of Warcraft, Yahoo * added protocol history/real protocol feature * various improvements and fixes === OpenDPI 1.2 (2010/04/07) === * added new protocol Meebo * various improvements and fixes === OpenDPI 1.1.1 (2009/11/11) === * fixed a compilation error that occurred when debug messages were enabled === OpenDPI 1.1 (2009/11/10) === * OpenDPI is now built using autotools * OpenDPI now compiles on BSD-like systems * added 4 new protocols (AFP, Aimini, Stealthnet, TFTP) * Bittorrent detection has been fixed * FTP detection has been fixed * various small improvements and fixes === OpenDPI 1.0 (2009/09/07) === * initial releasentop-5.0.1+dfsg1/nDPI/config.guess0000755000000000000000000012763711655273464015342 0ustar rootroot#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. timestamp='2009-12-30' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ntop-5.0.1+dfsg1/nDPI/configure0000755000000000000000000147221211754020121014676 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for nDPI 1.3.0. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='nDPI' PACKAGE_TARNAME='ndpi' PACKAGE_VERSION='1.3.0' PACKAGE_STRING='nDPI 1.3.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="src/lib/ipq_protocols.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_shared enable_static with_pic enable_fast_install enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures nDPI 1.3.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/ndpi] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of nDPI 1.3.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF nDPI configure 1.3.0 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by nDPI $as_me 1.3.0, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='ndpi' VERSION='1.3.0' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi for ac_header in netinet/in.h stdint.h stdlib.h string.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_config_files="$ac_config_files Makefile src/lib/Makefile src/include/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by nDPI $as_me 1.3.0, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ nDPI config.status 1.3.0 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/lib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/Makefile" ;; "src/include/Makefile") CONFIG_FILES="$CONFIG_FILES src/include/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ntop-5.0.1+dfsg1/nDPI/configure.ac0000644000000000000000000000051111712467704015261 0ustar rootrootAC_INIT([nDPI], [1.3.0]) AC_CONFIG_SRCDIR([src/lib/ipq_protocols.h]) AM_INIT_AUTOMAKE([-Wall]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_LIBTOOL AC_PROG_CC AC_PROG_INSTALL LT_INIT AC_CHECK_HEADERS([netinet/in.h stdint.h stdlib.h string.h unistd.h]) AC_CONFIG_FILES([Makefile src/lib/Makefile src/include/Makefile ]) AC_OUTPUT ntop-5.0.1+dfsg1/nDPI/config.sub0000755000000000000000000010344511655273464014774 0ustar rootroot#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. timestamp='2010-01-22' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile-* | tilegx-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; # This must be matched before tile*. tilegx*) basic_machine=tilegx-unknown os=-linux-gnu ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ntop-5.0.1+dfsg1/nDPI/README0000644000000000000000000000172011655273464013662 0ustar rootrootREADME for OpenDPI ================== OpenDPI is a software component for traffic classification based on deep packet inspection. Visit http://opendpi.org/ or http://code.google.com/p/opendpi/ for more information. Building OpenDPI ================ OpenDPI is built using autotools and a gnu compatible C compiler like gcc. To build the OpenDPI_demo application an installation of libpcap and the libpcap developer files are required. Building an OpenDPI release from the command line: $ tar xvfz opendpi-1.1.0.tar.gz $ cd opendpi-1.1.0 $ ./configure $ make $ su (if necessary for the next line) $ make install Building OpenDPI from SVN (First Time): $ svn checkout http://opendpi.googlecode.com/svn/trunk/ opendpi $ cd opendpi $ ./autogen.sh $ make $ su (if necessary for the next line) $ make install Building OpenDPI from SVN (Updating): $ cd opendpi $ make clean $ svn up $ make $ su (if necessary for the next line) $ make install ntop-5.0.1+dfsg1/nDPI/Makefile.am0000644000000000000000000000006611655273464015040 0ustar rootrootSUBDIRS = src/include src/lib ACLOCAL_AMFLAGS = -I m4 ntop-5.0.1+dfsg1/nDPI/Makefile.in0000644000000000000000000005413611754017511015045 0ustar rootroot# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL NEWS config.guess config.sub depcomp \ install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src/include src/lib ACLOCAL_AMFLAGS = -I m4 all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ntop-5.0.1+dfsg1/nDPI/INSTALL0000644000000000000000000003633211655273464014042 0ustar rootrootInstallation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. ntop-5.0.1+dfsg1/nDPI/aclocal.m40000644000000000000000000124027411754017511014641 0ustar rootroot# generated automatically by aclocal 1.11.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR ntop-5.0.1+dfsg1/nDPI/install-sh0000755000000000000000000003253711655273464015020 0ustar rootroot#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ntop-5.0.1+dfsg1/nDPI/AUTHORS0000644000000000000000000000000011655273464014040 0ustar rootrootntop-5.0.1+dfsg1/nDPI/ltmain.sh0000644000000000000000000105204011754017511014611 0ustar rootroot # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1ubuntu1" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 ntop-5.0.1+dfsg1/nDPI/depcomp0000755000000000000000000004426711655273464014374 0ustar rootroot#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free # Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u="sed s,\\\\\\\\,/,g" depmode=msvisualcpp fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ntop-5.0.1+dfsg1/nDPI/src/0000755000000000000000000000000012012127301013541 5ustar rootrootntop-5.0.1+dfsg1/nDPI/src/lib/0000755000000000000000000000000012012127301014307 5ustar rootrootntop-5.0.1+dfsg1/nDPI/src/lib/protocols/0000755000000000000000000000000012012127301016333 5ustar rootrootntop-5.0.1+dfsg1/nDPI/src/lib/protocols/stun.c0000644000000000000000000001522111655273464017521 0ustar rootroot/* * stun.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_STUN static void ipoque_int_stun_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_STUN, IPOQUE_REAL_PROTOCOL); } typedef enum { IPOQUE_IS_STUN, IPOQUE_IS_NOT_STUN } ipoque_int_stun_result_t; static ipoque_int_stun_result_t ipoque_int_check_stun(struct ipoque_detection_module_struct *ipoque_struct, const u8 * payload, const u16 payload_length) { u16 a; /* * token list of message types and attribute types from * http://wwwbs1.informatik.htw-dresden.de/svortrag/i02/Schoene/stun/stun.html * the same list you can find in * https://summersoft.fay.ar.us/repos/ethereal/branches/redhat-9/ethereal-0.10.3-1/ethereal-0.10.3/packet-stun.c * token further message types and attributes from * http://www.freeswitch.org/docs/group__stun1.html * added further attributes observed * message types: 0x0001, 0x0101, 0x0111, 0x0002, 0x0102, 0x0112, 0x0003, 0x0103, 0x0004, 0x0104, 0x0114, 0x0115 * attribute types: 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, * 0x000a, 0x000b, 0c000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0020, * 0x0022, 0x0024, 0x8001, 0x8006, 0x8008, 0x8015, 0x8020, 0x8028, 0x802a, 0x8029, 0x8050, 0x8054, 0x8055 * * 0x8003, 0x8004 used by facetime */ if (payload_length >= 20 && ntohs(get_u16(payload, 2)) + 20 == payload_length && ((payload[0] == 0x00 && (payload[1] >= 0x01 && payload[1] <= 0x04)) || (payload[0] == 0x01 && ((payload[1] >= 0x01 && payload[1] <= 0x04) || (payload[1] >= 0x11 && payload[1] <= 0x15))))) { u8 mod; u8 old = 1; u8 padding = 0; IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "len and type match.\n"); if (payload_length == 20) { IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "found stun.\n"); return IPOQUE_IS_STUN; } a = 20; while (a < payload_length) { if (old && payload_length >= a + 4 && ((payload[a] == 0x00 && ((payload[a + 1] >= 0x01 && payload[a + 1] <= 0x16) || payload[a + 1] == 0x19 || payload[a + 1] == 0x20 || payload[a + 1] == 0x22 || payload[a + 1] == 0x24 || payload[a + 1] == 0x25)) || (payload[a] == 0x80 && (payload[a + 1] == 0x01 || payload[a + 1] == 0x03 || payload[a + 1] == 0x04 || payload[a + 1] == 0x06 || payload[a + 1] == 0x08 || payload[a + 1] == 0x15 || payload[a + 1] == 0x20 || payload[a + 1] == 0x22 || payload[a + 1] == 0x28 || payload[a + 1] == 0x2a || payload[a + 1] == 0x29 || payload[a + 1] == 0x50 || payload[a + 1] == 0x54 || payload[a + 1] == 0x55)))) { IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "attribute match.\n"); a += ((payload[a + 2] << 8) + payload[a + 3] + 4); mod = a % 4; if (mod) { padding = 4 - mod; } if (a == payload_length || (padding && (a + padding) == payload_length)) { IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "found stun.\n"); return IPOQUE_IS_STUN; } } else if (payload_length >= a + padding + 4 && ((payload[a + padding] == 0x00 && ((payload[a + 1 + padding] >= 0x01 && payload[a + 1 + padding] <= 0x16) || payload[a + 1 + padding] == 0x19 || payload[a + 1 + padding] == 0x20 || payload[a + 1 + padding] == 0x22 || payload[a + 1 + padding] == 0x24 || payload[a + 1 + padding] == 0x25)) || (payload[a + padding] == 0x80 && (payload[a + 1 + padding] == 0x01 || payload[a + 1 + padding] == 0x03 || payload[a + 1 + padding] == 0x04 || payload[a + 1 + padding] == 0x06 || payload[a + 1 + padding] == 0x08 || payload[a + 1 + padding] == 0x15 || payload[a + 1 + padding] == 0x20 || payload[a + 1 + padding] == 0x22 || payload[a + 1 + padding] == 0x28 || payload[a + 1 + padding] == 0x2a || payload[a + 1 + padding] == 0x29 || payload[a + 1 + padding] == 0x50 || payload[a + 1 + padding] == 0x54 || payload[a + 1 + padding] == 0x55)))) { IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "New STUN - attribute match.\n"); old = 0; a += ((payload[a + 2 + padding] << 8) + payload[a + 3 + padding] + 4); padding = 0; mod = a % 4; if (mod) { a += 4 - mod; } if (a == payload_length) { IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "found stun.\n"); return IPOQUE_IS_STUN; } } else { break; } } } return IPOQUE_IS_NOT_STUN; } void ipoque_search_stun(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "search stun.\n"); if (packet->tcp) { /* STUN may be encapsulated in TCP packets */ if (packet->payload_packet_len >= 2 + 20 && ntohs(get_u16(packet->payload, 0)) + 2 == packet->payload_packet_len) { /* TODO there could be several STUN packets in a single TCP packet so maybe the detection could be * improved by checking only the STUN packet of given length */ if (ipoque_int_check_stun(ipoque_struct, packet->payload + 2, packet->payload_packet_len - 2) == IPOQUE_IS_STUN) { IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "found TCP stun.\n"); ipoque_int_stun_add_connection(ipoque_struct); return; } } } if (ipoque_int_check_stun(ipoque_struct, packet->payload, packet->payload_packet_len) == IPOQUE_IS_STUN) { IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "found UDP stun.\n"); ipoque_int_stun_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_STUN, ipoque_struct, IPQ_LOG_DEBUG, "exclude stun.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_STUN); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/nfs.c0000644000000000000000000000537311655273464017325 0ustar rootroot/* * nfs.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_NFS static void ipoque_int_nfs_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_NFS, IPOQUE_REAL_PROTOCOL); } void ipoque_search_nfs(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u8 offset = 0; if (packet->tcp != NULL) offset = 4; if (packet->payload_packet_len < (40 + offset)) goto exclude_nfs; IPQ_LOG(IPOQUE_PROTOCOL_NFS, ipoque_struct, IPQ_LOG_DEBUG, "NFS user match stage 1\n"); if (offset != 0 && get_u32(packet->payload, 0) != htonl(0x80000000 + packet->payload_packet_len - 4)) goto exclude_nfs; IPQ_LOG(IPOQUE_PROTOCOL_NFS, ipoque_struct, IPQ_LOG_DEBUG, "NFS user match stage 2\n"); if (get_u32(packet->payload, 4 + offset) != 0) goto exclude_nfs; IPQ_LOG(IPOQUE_PROTOCOL_NFS, ipoque_struct, IPQ_LOG_DEBUG, "NFS user match stage 3\n"); if (get_u32(packet->payload, 8 + offset) != htonl(0x02)) goto exclude_nfs; IPQ_LOG(IPOQUE_PROTOCOL_NFS, ipoque_struct, IPQ_LOG_DEBUG, "NFS match stage 3\n"); if (get_u32(packet->payload, 12 + offset) != htonl(0x000186a5) && get_u32(packet->payload, 12 + offset) != htonl(0x000186a3) && get_u32(packet->payload, 12 + offset) != htonl(0x000186a0)) goto exclude_nfs; IPQ_LOG(IPOQUE_PROTOCOL_NFS, ipoque_struct, IPQ_LOG_DEBUG, "NFS match stage 4\n"); if (ntohl(get_u32(packet->payload, 16 + offset)) > 4) goto exclude_nfs; IPQ_LOG(IPOQUE_PROTOCOL_NFS, ipoque_struct, IPQ_LOG_DEBUG, "NFS match\n"); ipoque_int_nfs_add_connection(ipoque_struct); return; exclude_nfs: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_NFS); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/iax.c0000644000000000000000000000642111655273464017313 0ustar rootroot/* * iax.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_IAX #define IPQ_IAX_MAX_INFORMATION_ELEMENTS 15 static void ipoque_int_iax_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_IAX, IPOQUE_REAL_PROTOCOL); } static void ipoque_search_setup_iax(struct ipoque_detection_module_struct *ipoque_struct); static void ipoque_search_setup_iax(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; u8 i; u16 packet_len; if ( /* 1. iax is udp based, port 4569 */ (packet->udp->source == htons(4569) || packet->udp->dest == htons(4569)) /* check for iax new packet */ && packet->payload_packet_len >= 12 /* check for dst call id == 0, do not check for highest bit (packet retransmission) */ // && (ntohs(get_u16(packet->payload, 2)) & 0x7FFF) == 0 /* check full IAX packet */ && (packet->payload[0] & 0x80) != 0 /* outbound seq == 0 */ && packet->payload[8] == 0 /* inbound seq == 0 || 1 */ && (packet->payload[9] == 0 || packet->payload[9] == 0x01) /* */ && packet->payload[10] == 0x06 /* IAX type: 0-15 */ && packet->payload[11] <= 15) { if (packet->payload_packet_len == 12) { IPQ_LOG(IPOQUE_PROTOCOL_IAX, ipoque_struct, IPQ_LOG_DEBUG, "found IAX.\n"); ipoque_int_iax_add_connection(ipoque_struct); return; } packet_len = 12; for (i = 0; i < IPQ_IAX_MAX_INFORMATION_ELEMENTS; i++) { packet_len = packet_len + 2 + packet->payload[packet_len + 1]; if (packet_len == packet->payload_packet_len) { IPQ_LOG(IPOQUE_PROTOCOL_IAX, ipoque_struct, IPQ_LOG_DEBUG, "found IAX.\n"); ipoque_int_iax_add_connection(ipoque_struct); return; } if (packet_len > packet->payload_packet_len) { break; } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_IAX); } void ipoque_search_iax(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; // struct ipoque_flow_struct *flow=ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN) ipoque_search_setup_iax(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/icecast.c0000644000000000000000000000641411655273464020147 0ustar rootroot/* * icecast.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_ICECAST static void ipoque_int_icecast_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_ICECAST, IPOQUE_CORRELATED_PROTOCOL); } void ipoque_search_icecast_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; u8 i; IPQ_LOG(IPOQUE_PROTOCOL_ICECAST, ipoque_struct, IPQ_LOG_DEBUG, "search icecast.\n"); if ((packet->payload_packet_len < 500 && packet->payload_packet_len >= 7 && ipq_mem_cmp(packet->payload, "SOURCE ", 7) == 0) || flow->l4.tcp.icecast_stage) { ipq_parse_packet_line_info_unix(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_ICECAST, ipoque_struct, IPQ_LOG_DEBUG, "Icecast lines=%d\n", packet->parsed_unix_lines); for (i = 0; i < packet->parsed_unix_lines; i++) { if (packet->unix_line[i].ptr != NULL && packet->unix_line[i].len > 4 && ipq_mem_cmp(packet->unix_line[i].ptr, "ice-", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_ICECAST, ipoque_struct, IPQ_LOG_DEBUG, "Icecast detected.\n"); ipoque_int_icecast_add_connection(ipoque_struct); return; } } if (packet->parsed_unix_lines < 1 && !flow->l4.tcp.icecast_stage) { flow->l4.tcp.icecast_stage = 1; return; } } #ifdef IPOQUE_PROTOCOL_HTTP if (IPQ_FLOW_PROTOCOL_EXCLUDED(ipoque_struct, flow, IPOQUE_PROTOCOL_HTTP)) { goto icecast_exclude; } #endif if (packet->packet_direction == flow->setup_packet_direction && flow->packet_counter < 10) { return; } if (packet->packet_direction != flow->setup_packet_direction) { /* server answer, now test Server for Icecast */ ipq_parse_packet_line_info(ipoque_struct); if (packet->server_line.ptr != NULL && packet->server_line.len > IPQ_STATICSTRING_LEN("Icecast") && memcmp(packet->server_line.ptr, "Icecast", IPQ_STATICSTRING_LEN("Icecast")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_ICECAST, ipoque_struct, IPQ_LOG_DEBUG, "Icecast detected.\n"); /* TODO maybe store the previous protocol type as subtype? * e.g. ogg or mpeg */ ipoque_int_icecast_add_connection(ipoque_struct); return; } } icecast_exclude: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_ICECAST); IPQ_LOG(IPOQUE_PROTOCOL_ICECAST, ipoque_struct, IPQ_LOG_DEBUG, "Icecast excluded.\n"); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/rtp.c0000644000000000000000000002577411661524573017350 0ustar rootroot/* * rtp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_RTP #define RTP_MAX_OUT_OF_ORDER 11 static void ipoque_int_rtp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_RTP, IPOQUE_REAL_PROTOCOL); } /* * maintenance of current highest sequence number, cycle count, packet counter * adapted from RFC3550 Appendix A.1 * * In their formulation, it is not possible to represent "no packets sent yet". This is fixed here by defining * baseseq to be the sequence number of the first packet minus 1 (in other words, the sequence number of the * zeroth packet). * * Note: As described in the RFC, the number of packets received includes retransmitted packets. * This means the "packets lost" count (seq_num-isn+1)-received can become negative. * * include_current_packet should be * 1, if the current packet should count towards the total, or * 0, if it it regarded as belonging to the previous reporting interval */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void init_seq(struct ipoque_detection_module_struct *ipoque_struct, struct ipoque_flow_struct *flow, u8 direction, u16 seq, u8 include_current_packet) { flow->rtp_seqnum[direction] = seq; IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "rtp_seqnum[%u] = %u\n", direction, seq); } /* returns difference between old and new highest sequence number */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u16 update_seq(struct ipoque_detection_module_struct *ipoque_struct, struct ipoque_flow_struct *flow, u8 direction, u16 seq) { u16 delta = seq - flow->rtp_seqnum[direction]; if (delta < RTP_MAX_OUT_OF_ORDER) { /* in order, with permissible gap */ flow->rtp_seqnum[direction] = seq; IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "rtp_seqnum[%u] = %u (increased by %u)\n", direction, seq, delta); return delta; } else { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "retransmission (dir %u, seqnum %u)\n", direction, seq); return 0; } } static void ipoque_rtp_search(struct ipoque_detection_module_struct *ipoque_struct, const u8 * payload, const u16 payload_len) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; u8 stage; u16 seqnum = ntohs(get_u16(payload, 2)); IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "search rtp.\n"); if (payload_len == 4 && get_u32(packet->payload, 0) == 0 && flow->packet_counter < 8) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "need next packet, maybe ClearSea out calls.\n"); return; } if (payload_len == 5 && memcmp(payload, "hello", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "need next packet, initial hello packet of SIP out calls.\n"); return; } if (payload_len == 1 && payload[0] == 0) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "need next packet, payload_packet_len == 1 && payload[0] == 0.\n"); return; } if (payload_len == 3 && memcmp(payload, "png", 3) == 0) { /* weird packet found in Ninja GlobalIP trace */ IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "skipping packet with len = 3 and png payload.\n"); return; } if (payload_len < 12) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "minimal packet size for rtp packets: 12.\n"); goto exclude_rtp; } if (payload_len == 12 && get_u32(payload, 0) == 0 && get_u32(payload, 4) == 0 && get_u32(payload, 8) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "skipping packet with len = 12 and only 0-bytes.\n"); return; } if ((payload[0] & 0xc0) == 0xc0 || (payload[0] & 0xc0) == 0x40 || (payload[0] & 0xc0) == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "version = 3 || 1 || 0, maybe first rtp packet.\n"); return; } if ((payload[0] & 0xc0) != 0x80) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "rtp version must be 2, first two bits of a packets must be 10.\n"); goto exclude_rtp; } /* rtp_payload_type are the last seven bits of the second byte */ if (flow->rtp_payload_type[packet->packet_direction] != (payload[1] & 0x7F)) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "payload_type has changed, reset stages.\n"); packet->packet_direction == 0 ? (flow->rtp_stage1 = 0) : (flow->rtp_stage2 = 0); } /* first bit of first byte is not part of payload_type */ flow->rtp_payload_type[packet->packet_direction] = payload[1] & 0x7F; stage = (packet->packet_direction == 0 ? flow->rtp_stage1 : flow->rtp_stage2); if (stage > 0) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "stage = %u.\n", packet->packet_direction == 0 ? flow->rtp_stage1 : flow->rtp_stage2); if (flow->rtp_ssid[packet->packet_direction] != get_u32(payload, 8)) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "ssid has changed, goto exclude rtp.\n"); goto exclude_rtp; } if (seqnum == flow->rtp_seqnum[packet->packet_direction]) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "maybe \"retransmission\", need next packet.\n"); return; } else if ((u16) (seqnum - flow->rtp_seqnum[packet->packet_direction]) < RTP_MAX_OUT_OF_ORDER) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "new packet has larger sequence number (within valid range)\n"); update_seq(ipoque_struct, flow, packet->packet_direction, seqnum); } else if ((u16) (flow->rtp_seqnum[packet->packet_direction] - seqnum) < RTP_MAX_OUT_OF_ORDER) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "new packet has smaller sequence number (within valid range)\n"); init_seq(ipoque_struct, flow, packet->packet_direction, seqnum, 1); } else { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "sequence number diff is too big, goto exclude rtp.\n"); goto exclude_rtp; } } else { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "rtp_ssid[%u] = %u.\n", packet->packet_direction, flow->rtp_ssid[packet->packet_direction]); flow->rtp_ssid[packet->packet_direction] = get_u32(payload, 8); if (flow->packet_counter < 3) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "packet_counter < 3, need next packet.\n"); } init_seq(ipoque_struct, flow, packet->packet_direction, seqnum, 1); } if (seqnum <= 3) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "sequence_number = %u, too small, need next packet, return.\n", seqnum); return; } if (stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "add connection I.\n"); ipoque_int_rtp_add_connection(ipoque_struct); } else { packet->packet_direction == 0 ? flow->rtp_stage1++ : flow->rtp_stage2++; IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "stage[%u]++; need next packet.\n", packet->packet_direction); } return; exclude_rtp: #ifdef IPOQUE_PROTOCOL_STUN if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_STUN || packet->real_protocol_read_only == IPOQUE_PROTOCOL_STUN) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "STUN: is detected, need next packet.\n"); return; } #endif /* IPOQUE_PROTOCOL_STUN */ IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "exclude rtp.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_RTP); } void ipoque_search_rtp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; if (packet->udp) { ipoque_rtp_search(ipoque_struct, packet->payload, packet->payload_packet_len); } else if (packet->tcp) { /* skip special packets seen at yahoo traces */ if (packet->payload_packet_len >= 20 && ntohs(get_u16(packet->payload, 2)) + 20 == packet->payload_packet_len && packet->payload[0] == 0x90 && packet->payload[1] >= 0x01 && packet->payload[1] <= 0x07) { if (flow->packet_counter == 2) flow->l4.tcp.rtp_special_packets_seen = 1; IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "skipping STUN-like, special yahoo packets with payload[0] == 0x90.\n"); return; } #ifdef IPOQUE_PROTOCOL_STUN /* TODO the rtp detection sometimes doesn't exclude rtp * so for TCP flows only run the detection if STUN has been * detected (or RTP is already detected) * If flows will be seen which start directly with RTP * we can remove this restriction */ if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_STUN || packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_RTP) { /* RTP may be encapsulated in TCP packets */ if (packet->payload_packet_len >= 2 && ntohs(get_u16(packet->payload, 0)) + 2 == packet->payload_packet_len) { /* TODO there could be several RTP packets in a single TCP packet so maybe the detection could be * improved by checking only the RTP packet of given length */ ipoque_rtp_search(ipoque_struct, packet->payload + 2, packet->payload_packet_len - 2); return; } } if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN && flow->l4.tcp.rtp_special_packets_seen == 1) { if (packet->payload_packet_len >= 4 && ntohl(get_u32(packet->payload, 0)) + 4 == packet->payload_packet_len) { /* TODO there could be several RTP packets in a single TCP packet so maybe the detection could be * improved by checking only the RTP packet of given length */ ipoque_rtp_search(ipoque_struct, packet->payload + 4, packet->payload_packet_len - 4); return; } } if (IPQ_FLOW_PROTOCOL_EXCLUDED(ipoque_struct, flow, IPOQUE_PROTOCOL_STUN)) { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "exclude rtp.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_RTP); } else { IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "STUN not yet excluded, need next packet.\n"); } #else IPQ_LOG(IPOQUE_PROTOCOL_RTP, ipoque_struct, IPQ_LOG_DEBUG, "exclude rtp.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_RTP); #endif } } #endif /* IPOQUE_PROTOCOL_RTP */ ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/dofus.c0000644000000000000000000001376211655273464017660 0ustar rootroot/* * dofus.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_DOFUS static void ipoque_dofus_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_DOFUS, IPOQUE_REAL_PROTOCOL); } void ipoque_search_dofus(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; /* Dofus v 1.x.x */ if (packet->payload_packet_len == 13 && get_u16(packet->payload, 1) == ntohs(0x0508) && get_u16(packet->payload, 5) == ntohs(0x04a0) && get_u16(packet->payload, packet->payload_packet_len - 2) == ntohs(0x0194)) { IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "found dofus.\n"); ipoque_dofus_add_connection(ipoque_struct); return; } if (flow->l4.tcp.dofus_stage == 0 && packet->payload_packet_len == 3 && memcmp(packet->payload, "HG", 2) == 0 && packet->payload[packet->payload_packet_len - 1] == 0) { flow->l4.tcp.dofus_stage = 1; IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "maybe dofus.\n"); return; } if (flow->l4.tcp.dofus_stage == 0 && packet->payload_packet_len == 35 && memcmp(packet->payload, "HC", 2) == 0 && packet->payload[packet->payload_packet_len - 1] == 0) { flow->l4.tcp.dofus_stage = 1; IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "maybe dofus.\n"); return; } if (flow->l4.tcp.dofus_stage == 0 && packet->payload_packet_len > 2 && packet->payload[0] == 'A' && (packet->payload[1] == 'x' || packet->payload[1] == 'X') && packet->payload[packet->payload_packet_len - 1] == 0) { flow->l4.tcp.dofus_stage = 1; IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "maybe dofus.\n"); return; } if (flow->l4.tcp.dofus_stage == 0 && packet->payload_packet_len == 12 && memcmp(packet->payload, "Af", 2) == 0 && packet->payload[packet->payload_packet_len - 1] == 0) { flow->l4.tcp.dofus_stage = 1; IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "maybe dofus.\n"); return; } if (flow->l4.tcp.dofus_stage == 0 && packet->payload_packet_len > 2 && memcmp(packet->payload, "Ad", 2) && packet->payload[packet->payload_packet_len - 1] == 0) { flow->l4.tcp.dofus_stage = 1; IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "maybe dofus.\n"); return; } if (packet->payload_packet_len == 11 && memcmp(packet->payload, "AT", 2) == 0 && packet->payload[10] == 0x00) { if (flow->l4.tcp.dofus_stage == 1) { IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "found dofus.\n"); ipoque_dofus_add_connection(ipoque_struct); return; } } if (flow->l4.tcp.dofus_stage == 1 && packet->payload_packet_len == 5 && packet->payload[0] == 'A' && packet->payload[4] == 0x00 && (packet->payload[1] == 'T' || packet->payload[1] == 'k')) { IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "found dofus asym.\n"); ipoque_dofus_add_connection(ipoque_struct); return; } /* end Dofus 1.x.x */ /* Dofus 2.0 */ if ((packet->payload_packet_len == 11 || packet->payload_packet_len == 13 || packet->payload_packet_len == 49) && get_u32(packet->payload, 0) == ntohl(0x00050800) && get_u16(packet->payload, 4) == ntohs(0x0005) && get_u16(packet->payload, 8) == ntohs(0x0005) && packet->payload[10] == 0x18) { if (packet->payload_packet_len == 13 && get_u16(packet->payload, packet->payload_packet_len - 2) != ntohs(0x0194)) { goto exclude; } if (packet->payload_packet_len == 49 && ntohs(get_u16(packet->payload, 15)) + 17 != packet->payload_packet_len) { goto exclude; } IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "found dofus.\n"); ipoque_dofus_add_connection(ipoque_struct); return; } if (packet->payload_packet_len >= 41 && get_u16(packet->payload, 0) == ntohs(0x01b9) && packet->payload[2] == 0x26) { u16 len, len2; len = ntohs(get_u16(packet->payload, 3)); if ((len + 5 + 2) > packet->payload_packet_len) goto exclude; len2 = ntohs(get_u16(packet->payload, 5 + len)); if (5 + len + 2 + len2 == packet->payload_packet_len) { IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "found dofus.\n"); ipoque_dofus_add_connection(ipoque_struct); return; } } if (packet->payload_packet_len == 56 && memcmp(packet->payload, "\x00\x11\x35\x02\x03\x00\x93\x96\x01\x00", 10) == 0) { u16 len, len2; len = ntohs(get_u16(packet->payload, 10)); if ((len + 12 + 2) > packet->payload_packet_len) goto exclude; len2 = ntohs(get_u16(packet->payload, 12 + len)); if ((12 + len + 2 + len2 + 1) > packet->payload_packet_len) goto exclude; if (12 + len + 2 + len2 + 1 == packet->payload_packet_len && packet->payload[12 + len + 2 + len2] == 0x01) { IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "found dofus.\n"); ipoque_dofus_add_connection(ipoque_struct); return; } } exclude: IPQ_LOG(IPOQUE_PROTOCOL_DOFUS, ipoque_struct, IPQ_LOG_DEBUG, "exclude dofus.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_DOFUS); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/xbox.c0000644000000000000000000000757611655273464017526 0ustar rootroot/* * xbox.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_XBOX static void ipoque_int_xbox_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_XBOX, IPOQUE_REAL_PROTOCOL); } void ipoque_search_xbox(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src = ipoque_struct->src; // struct ipoque_id_struct *dst = ipoque_struct->dst; /* * THIS IS TH XBOX UDP DETCTION ONLY !!! * the xbox tcp detection is done by http code */ /* this detection also works for asymmetric xbox udp traffic */ if (packet->udp != NULL) { u16 dport = ntohs(packet->udp->dest); u16 sport = ntohs(packet->udp->source); IPQ_LOG(IPOQUE_PROTOCOL_XBOX, ipoque_struct, IPQ_LOG_DEBUG, "search xbox\n"); if (packet->payload_packet_len > 12 && get_u32(packet->payload, 0) == 0 && packet->payload[5] == 0x58 && memcmp(&packet->payload[7], "\x00\x00\x00", 3) == 0) { if ((packet->payload[4] == 0x0c && packet->payload[6] == 0x76) || (packet->payload[4] == 0x02 && packet->payload[6] == 0x18) || (packet->payload[4] == 0x0b && packet->payload[6] == 0x80) || (packet->payload[4] == 0x03 && packet->payload[6] == 0x40) || (packet->payload[4] == 0x06 && packet->payload[6] == 0x4e)) { ipoque_int_xbox_add_connection(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_XBOX, ipoque_struct, IPQ_LOG_DEBUG, "xbox udp connection detected\n"); return; } } if ((dport == 3074 || sport == 3074) && ((packet->payload_packet_len == 24 && packet->payload[0] == 0x00) || (packet->payload_packet_len == 42 && packet->payload[0] == 0x4f && packet->payload[2] == 0x0a) || (packet->payload_packet_len == 80 && ntohs(get_u16(packet->payload, 0)) == 0x50bc && packet->payload[2] == 0x45) || (packet->payload_packet_len == 40 && ntohl(get_u32(packet->payload, 0)) == 0xcf5f3202) || (packet->payload_packet_len == 38 && ntohl(get_u32(packet->payload, 0)) == 0xc1457f03) || (packet->payload_packet_len == 28 && ntohl(get_u32(packet->payload, 0)) == 0x015f2c00))) { if (flow->l4.udp.xbox_stage == 1) { ipoque_int_xbox_add_connection(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_XBOX, ipoque_struct, IPQ_LOG_DEBUG, "xbox udp connection detected\n"); return; } IPQ_LOG(IPOQUE_PROTOCOL_XBOX, ipoque_struct, IPQ_LOG_DEBUG, "maybe xbox.\n"); flow->l4.udp.xbox_stage++; return; } /* exclude here all non matched udp traffic, exclude here tcp only if http has been excluded, because xbox could use http */ if (packet->tcp == NULL #ifdef IPOQUE_PROTOCOL_HTTP || IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP) != 0 #endif ) { IPQ_LOG(IPOQUE_PROTOCOL_XBOX, ipoque_struct, IPQ_LOG_DEBUG, "xbox udp excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_XBOX); } } /* to not exclude tcp traffic here, done by http code... */ } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/mgcp.c0000644000000000000000000000630111661524573017452 0ustar rootroot/* * mgcp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_MGCP static void ipoque_int_mgcp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MGCP, IPOQUE_REAL_PROTOCOL); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_search_mgcp_connection(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; /* information about MGCP taken from http://en.wikipedia.org/wiki/MGCP */ u16 pos = 4; if (packet->payload_packet_len < 8) { goto mgcp_excluded; } /* packet must end with 0x0d0a or with 0x0a */ if (packet->payload[packet->payload_packet_len - 1] != 0x0a && get_u16(packet->payload, packet->payload_packet_len - 2) != htons(0x0d0a)) { goto mgcp_excluded; } if (packet->payload[0] != 'A' && packet->payload[0] != 'C' && packet->payload[0] != 'D' && packet->payload[0] != 'E' && packet->payload[0] != 'M' && packet->payload[0] != 'N' && packet->payload[0] != 'R') { goto mgcp_excluded; } if (memcmp(packet->payload, "AUEP ", 5) != 0 && memcmp(packet->payload, "AUCX ", 5) != 0 && memcmp(packet->payload, "CRCX ", 5) != 0 && memcmp(packet->payload, "DLCX ", 5) != 0 && memcmp(packet->payload, "EPCF ", 5) != 0 && memcmp(packet->payload, "MDCX ", 5) != 0 && memcmp(packet->payload, "NTFY ", 5) != 0 && memcmp(packet->payload, "RQNT ", 5) != 0 && memcmp(packet->payload, "RSIP ", 5) != 0) { goto mgcp_excluded; } // now search for string "MGCP " in the rest of the message while ((pos + 5) < packet->payload_packet_len) { if (memcmp(&packet->payload[pos], "MGCP ", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MGCP, ipoque_struct, IPQ_LOG_DEBUG, "MGCP match.\n"); ipoque_int_mgcp_add_connection(ipoque_struct); return; } pos++; } mgcp_excluded: IPQ_LOG(IPOQUE_PROTOCOL_MGCP, ipoque_struct, IPQ_LOG_DEBUG, "exclude MGCP.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MGCP); } void ipoque_search_mgcp(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_search_mgcp_connection(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/ssh.c0000644000000000000000000000441411655273464017327 0ustar rootroot/* * ssh.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_SSH static void ipoque_int_ssh_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SSH, IPOQUE_REAL_PROTOCOL); } void ipoque_search_ssh_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (flow->l4.tcp.ssh_stage == 0) { if (packet->payload_packet_len > 7 && packet->payload_packet_len < 100 && memcmp(packet->payload, "SSH-", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SSH, ipoque_struct, IPQ_LOG_DEBUG, "ssh stage 0 passed\n"); flow->l4.tcp.ssh_stage = 1 + packet->packet_direction; return; } } else if (flow->l4.tcp.ssh_stage == (2 - packet->packet_direction)) { if (packet->payload_packet_len > 7 && packet->payload_packet_len < 100 && memcmp(packet->payload, "SSH-", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SSH, ipoque_struct, IPQ_LOG_DEBUG, "found ssh\n"); ipoque_int_ssh_add_connection(ipoque_struct); return; } } IPQ_LOG(IPOQUE_PROTOCOL_SSH, ipoque_struct, IPQ_LOG_DEBUG, "excluding ssh at stage %d\n", flow->l4.tcp.ssh_stage); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SSH); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/vnc.c0000644000000000000000000000435611655273464017325 0ustar rootroot/* * vnc.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_VNC static void ipoque_int_vnc_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_VNC, IPOQUE_REAL_PROTOCOL); } /* return 0 if nothing has been detected return 1 if it is a http packet */ void ipoque_search_vnc_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (flow->l4.tcp.vnc_stage == 0) { if (packet->payload_packet_len == 12 && memcmp(packet->payload, "RFB 003.00", 10) == 0 && packet->payload[11] == 0x0a) { IPQ_LOG(IPOQUE_PROTOCOL_POPO, ipoque_struct, IPQ_LOG_DEBUG, "reached vnc stage one\n"); flow->l4.tcp.vnc_stage = 1 + packet->packet_direction; return; } } else if (flow->l4.tcp.vnc_stage == 2 - packet->packet_direction) { if (packet->payload_packet_len == 12 && memcmp(packet->payload, "RFB 003.00", 10) == 0 && packet->payload[11] == 0x0a) { IPQ_LOG(IPOQUE_PROTOCOL_VNC, ipoque_struct, IPQ_LOG_DEBUG, "found vnc\n"); ipoque_int_vnc_add_connection(ipoque_struct); return; } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_VNC); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/ldap.c0000644000000000000000000000666611655273464017465 0ustar rootroot/* * ldap.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_LDAP static void ipoque_int_ldap_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_LDAP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_ldap(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; // u16 dport; IPQ_LOG(IPOQUE_PROTOCOL_LDAP, ipoque_struct, IPQ_LOG_DEBUG, "search ldap\n"); if (packet->payload_packet_len >= 14 && packet->payload[0] == 0x30) { // simple type if (packet->payload[1] == 0x0c && packet->payload_packet_len == 14 && packet->payload[packet->payload_packet_len - 1] == 0x00 && packet->payload[2] == 0x02) { if (packet->payload[3] == 0x01 && (packet->payload[5] == 0x60 || packet->payload[5] == 0x61) && packet->payload[6] == 0x07) { IPQ_LOG(IPOQUE_PROTOCOL_LDAP, ipoque_struct, IPQ_LOG_DEBUG, "found ldap simple type 1\n"); ipoque_int_ldap_add_connection(ipoque_struct); return; } if (packet->payload[3] == 0x02 && (packet->payload[6] == 0x60 || packet->payload[6] == 0x61) && packet->payload[7] == 0x07) { IPQ_LOG(IPOQUE_PROTOCOL_LDAP, ipoque_struct, IPQ_LOG_DEBUG, "found ldap simple type 2\n"); ipoque_int_ldap_add_connection(ipoque_struct); return; } } // normal type if (packet->payload[1] == 0x84 && packet->payload_packet_len >= 0x84 && packet->payload[2] == 0x00 && packet->payload[3] == 0x00 && packet->payload[6] == 0x02) { if (packet->payload[7] == 0x01 && (packet->payload[9] == 0x60 || packet->payload[9] == 0x61 || packet->payload[9] == 0x63 || packet->payload[9] == 0x64) && packet->payload[10] == 0x84) { IPQ_LOG(IPOQUE_PROTOCOL_LDAP, ipoque_struct, IPQ_LOG_DEBUG, "found ldap type 1\n"); ipoque_int_ldap_add_connection(ipoque_struct); return; } if (packet->payload[7] == 0x02 && (packet->payload[10] == 0x60 || packet->payload[10] == 0x61 || packet->payload[10] == 0x63 || packet->payload[10] == 0x64) && packet->payload[11] == 0x84) { IPQ_LOG(IPOQUE_PROTOCOL_LDAP, ipoque_struct, IPQ_LOG_DEBUG, "found ldap type 2\n"); ipoque_int_ldap_add_connection(ipoque_struct); return; } } } IPQ_LOG(IPOQUE_PROTOCOL_LDAP, ipoque_struct, IPQ_LOG_DEBUG, "ldap excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_LDAP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/directconnect.c0000644000000000000000000004132511655273464021360 0ustar rootroot/* * directconnect.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_DIRECTCONNECT //#define IPOQUE_DEBUG_DIRECTCONNECT //#define IPOQUE_DIRECTCONNECT_PORT_DEBUG //#define IPOQUE_DEBUG_DIRECTCONNECT_CONN #define DIRECT_CONNECT_TYPE_HUB 0 #define DIRECT_CONNECT_TYPE_PEER 1 #define DIRECT_CONNECT_ADC_PEER 2 static u32 skip_unknown_headers(const u8 * payload, u32 payload_len, u32 pos) { u32 i = pos; while (i < payload_len && payload[i] != 0x0a) i++; i++; return i; } static u16 parse_binf_message(struct ipoque_detection_module_struct *ipoque_struct, const u8 * payload, int payload_len) { u32 i = 4; u16 bytes_read = 0; u16 ssl_port = 0; while (i < payload_len) { i = skip_unknown_headers(payload, payload_len, i); if ((i + 30) < payload_len) { if (memcmp(&payload[i], "DCTM", 4) == 0) { if (memcmp(&payload[i + 15], "ADCS", 4) == 0) { ssl_port = ntohs_ipq_bytestream_to_number(&payload[i + 25], 5, &bytes_read); IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "directconnect ssl port parsed %d", ssl_port); } } } else { break; } } return ssl_port; } static void ipoque_int_directconnect_add_connection(struct ipoque_detection_module_struct *ipoque_struct, const u8 connection_type) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_DIRECTCONNECT, IPOQUE_REAL_PROTOCOL); if (src != NULL) { src->directconnect_last_safe_access_time = packet->tick_timestamp; if (connection_type == DIRECT_CONNECT_TYPE_PEER) { if (packet->tcp != NULL && flow->setup_packet_direction != packet->packet_direction && src->detected_directconnect_port == 0) { src->detected_directconnect_port = packet->tcp->source; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "directconnect tcp PORT %u for src\n", ntohs(src->detected_directconnect_port)); } if (packet->udp != NULL && src->detected_directconnect_udp_port == 0) { src->detected_directconnect_udp_port = packet->udp->source; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "directconnect udp PORT %u for src\n", ntohs(src->detected_directconnect_port)); } } } if (dst != NULL) { dst->directconnect_last_safe_access_time = packet->tick_timestamp; if (connection_type == DIRECT_CONNECT_TYPE_PEER) { if (packet->tcp != NULL && flow->setup_packet_direction == packet->packet_direction && dst->detected_directconnect_port == 0) { /* DST PORT MARKING CAN LEAD TO PORT MISSDETECTIONS * seen at large customer http servers, where someone has send faked DC tcp packets * to the server */ /* dst->detected_directconnect_port = packet->tcp->dest; IPQ_LOG (IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "directconnect tcp PORT %u for dst\n", ntohs (dst->detected_directconnect_port)); */ } } } } static void ipoque_search_directconnect_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (flow->detected_protocol_stack[0] == IPOQUE_PROTOCOL_DIRECTCONNECT) { if (packet->payload_packet_len >= 40 && memcmp(&packet->payload[0], "BINF", 4) == 0) { u16 ssl_port = 0; ssl_port = parse_binf_message(ipoque_struct, &packet->payload[4], packet->payload_packet_len - 4); if (dst != NULL && ssl_port) { dst->detected_directconnect_ssl_port = ssl_port; } if (src != NULL && ssl_port) { src->detected_directconnect_ssl_port = ssl_port; } } if ((packet->payload_packet_len >= 38 && packet->payload_packet_len <= 42) && memcmp(&packet->payload[0], "DCTM", 4) == 0 && memcmp(&packet->payload[15], "ADCS", 4) == 0) { u16 bytes_read = 0; if (dst != NULL) { dst->detected_directconnect_ssl_port = ntohs_ipq_bytestream_to_number(&packet->payload[25], 5, &bytes_read); IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "directconnect ssl port parsed %d", ntohs(dst->detected_directconnect_ssl_port)); } if (src != NULL) { src->detected_directconnect_ssl_port = ntohs_ipq_bytestream_to_number(&packet->payload[25], 5, &bytes_read); IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "directconnect ssl port parsed %d", ntohs(src->detected_directconnect_ssl_port)); } } return; } if (src != NULL) { if (src->detected_directconnect_port == packet->tcp->source) { if ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->directconnect_last_safe_access_time) < ipoque_struct->directconnect_connection_ip_tick_timeout) { ipoque_int_change_protocol(ipoque_struct, IPOQUE_PROTOCOL_DIRECTCONNECT, IPOQUE_REAL_PROTOCOL); src->directconnect_last_safe_access_time = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "marking using dc port\n %d", ntohs(src->detected_directconnect_port)); return; } else { src->detected_directconnect_port = 0; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "resetting src port due to timeout"); return; } } if (src->detected_directconnect_ssl_port == packet->tcp->dest) { if ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->directconnect_last_safe_access_time) < ipoque_struct->directconnect_connection_ip_tick_timeout) { ipoque_int_change_protocol(ipoque_struct, IPOQUE_PROTOCOL_DIRECTCONNECT, IPOQUE_REAL_PROTOCOL); src->directconnect_last_safe_access_time = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "marking using dc port\n %d", ntohs(src->detected_directconnect_ssl_port)); return; } else { src->detected_directconnect_ssl_port = 0; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "resetting src port due to timeout"); return; } } } if (dst != NULL) { if (dst->detected_directconnect_port == packet->tcp->dest) { if ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->directconnect_last_safe_access_time) < ipoque_struct->directconnect_connection_ip_tick_timeout) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_DIRECTCONNECT, IPOQUE_REAL_PROTOCOL); dst->directconnect_last_safe_access_time = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "marking using dc port\n %d", ntohs(dst->detected_directconnect_port)); return; } else { dst->detected_directconnect_port = 0; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "resetting dst port due to timeout"); return; } } if (dst->detected_directconnect_ssl_port == packet->tcp->dest) { if ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->directconnect_last_safe_access_time) < ipoque_struct->directconnect_connection_ip_tick_timeout) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_DIRECTCONNECT, IPOQUE_REAL_PROTOCOL); dst->directconnect_last_safe_access_time = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "marking using dc port\n %d", ntohs(dst->detected_directconnect_ssl_port)); return; } else { dst->detected_directconnect_ssl_port = 0; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "resetting dst port due to timeout"); return; } } } if (flow->directconnect_stage == 0) { if (packet->payload_packet_len > 6) { if (packet->payload[0] == '$' && packet->payload[packet->payload_packet_len - 1] == '|' && (memcmp(&packet->payload[1], "Lock ", 5) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "maybe first dc connect to hub detected\n"); flow->directconnect_stage = 1; return; } if (packet->payload_packet_len > 7 && packet->payload[0] == '$' && packet->payload[packet->payload_packet_len - 1] == '|' && (memcmp(&packet->payload[1], "MyNick ", 7) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "maybe first dc connect between peers detected\n"); flow->directconnect_stage = 2; return; } } if (packet->payload_packet_len >= 11) { /* did not see this pattern in any trace */ if (memcmp(&packet->payload[0], "HSUP ADBAS0", 11) == 0 || memcmp(&packet->payload[0], "HSUP ADBASE", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "found directconnect HSUP ADBAS0 E\n"); ipoque_int_directconnect_add_connection(ipoque_struct, DIRECT_CONNECT_TYPE_HUB); return; /* did not see this pattern in any trace */ } else if (memcmp(&packet->payload[0], "CSUP ADBAS0", 11) == 0 || memcmp(&packet->payload[0], "CSUP ADBASE", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "found directconnect CSUP ADBAS0 E\n"); ipoque_int_directconnect_add_connection(ipoque_struct, DIRECT_CONNECT_ADC_PEER); return; } } } else if (flow->directconnect_stage == 1) { if (packet->payload_packet_len >= 11) { /* did not see this pattern in any trace */ if (memcmp(&packet->payload[0], "HSUP ADBAS0", 11) == 0 || memcmp(&packet->payload[0], "HSUP ADBASE", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "found directconnect HSUP ADBAS E in second packet\n"); ipoque_int_directconnect_add_connection(ipoque_struct, DIRECT_CONNECT_TYPE_HUB); return; /* did not see this pattern in any trace */ } else if (memcmp(&packet->payload[0], "CSUP ADBAS0", 11) == 0 || memcmp(&packet->payload[0], "CSUP ADBASE", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "found directconnect HSUP ADBAS0 E in second packet\n"); ipoque_int_directconnect_add_connection(ipoque_struct, DIRECT_CONNECT_ADC_PEER); return; } } /* get client hello answer or server message */ if (packet->payload_packet_len > 6) { if ((packet->payload[0] == '$' || packet->payload[0] == '<') && packet->payload[packet->payload_packet_len - 1] == '|') { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "second dc detected\n"); ipoque_int_directconnect_add_connection(ipoque_struct, DIRECT_CONNECT_TYPE_HUB); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "second dc not detected\n"); } } } else if (flow->directconnect_stage == 2) { /* get client hello answer or server message */ if (packet->payload_packet_len > 6) { if (packet->payload[0] == '$' && packet->payload[packet->payload_packet_len - 1] == '|') { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "second dc between peers detected\n"); ipoque_int_directconnect_add_connection(ipoque_struct, DIRECT_CONNECT_TYPE_PEER); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "second dc between peers not detected\n"); } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_DIRECTCONNECT); } static void ipoque_search_directconnect_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; int pos, count = 0; if (dst != NULL && dst->detected_directconnect_udp_port == packet->udp->dest) { if ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->directconnect_last_safe_access_time) < ipoque_struct->directconnect_connection_ip_tick_timeout) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_DIRECTCONNECT, IPOQUE_REAL_PROTOCOL); dst->directconnect_last_safe_access_time = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "marking using dc udp port\n %d", ntohs(dst->detected_directconnect_udp_port)); return; } else { dst->detected_directconnect_udp_port = 0; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "resetting dst udp port due to timeout"); return; } } if (packet->payload_packet_len > 58) { if (src != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_DIRECTCONNECT)) { if (packet->payload[0] == '$' && packet->payload[packet->payload_packet_len - 1] == '|' && memcmp(&packet->payload[1], "SR ", 3) == 0) { pos = packet->payload_packet_len - 2; if (packet->payload[pos] == ')') { while (pos > 0 && packet->payload[pos] != '(' && count < 21) { pos--; count++; } if (packet->payload[pos] == '(') { pos = pos - 44; if (pos > 2 && memcmp(&packet->payload[pos], "TTH:", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "dc udp detected\n"); ipoque_int_directconnect_add_connection(ipoque_struct, DIRECT_CONNECT_TYPE_PEER); return; } } } flow->directconnect_stage++; if (flow->directconnect_stage < 3) { return; } } } if (dst != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_DIRECTCONNECT)) { if (packet->payload[0] == '$' && packet->payload[packet->payload_packet_len - 1] == '|' && memcmp(&packet->payload[1], "SR ", 3) == 0) { pos = packet->payload_packet_len - 2; if (packet->payload[pos] == ')') { while (pos > 0 && packet->payload[pos] != '(' && count < 21) { pos--; count++; } if (packet->payload[pos] == '(') { pos = pos - 44; if (pos > 2 && memcmp(&packet->payload[pos], "TTH:", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "dc udp detected\n"); ipoque_int_directconnect_add_connection(ipoque_struct, DIRECT_CONNECT_TYPE_PEER); return; } } } flow->directconnect_stage++; if (flow->directconnect_stage < 3) return; } } } IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "excluded at stage %d \n", flow->directconnect_stage); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_DIRECTCONNECT); } void ipoque_search_directconnect(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_DIRECTCONNECT) { if (src != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->directconnect_last_safe_access_time) < ipoque_struct->directconnect_connection_ip_tick_timeout)) { src->directconnect_last_safe_access_time = packet->tick_timestamp; } else if (dst != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->directconnect_last_safe_access_time) < ipoque_struct->directconnect_connection_ip_tick_timeout)) { dst->directconnect_last_safe_access_time = packet->tick_timestamp; } else { packet->detected_protocol_stack[0] = IPOQUE_PROTOCOL_UNKNOWN; IPQ_LOG(IPOQUE_PROTOCOL_DIRECTCONNECT, ipoque_struct, IPQ_LOG_DEBUG, "directconnect: skipping as unknown due to timeout\n"); } return; } if (packet->tcp != NULL) { ipoque_search_directconnect_tcp(ipoque_struct); } if (packet->udp != NULL) { ipoque_search_directconnect_udp(ipoque_struct); } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/qq.c0000644000000000000000000005642111661524573017155 0ustar rootroot/* * qq.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_QQ static void ipoque_int_qq_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_QQ, protocol_type); } /* * a qq client packet looks like this: * * TCP packets starts with 16 bit length, then the normal packets follows * * 0 1 byte packet tag (usually 0x02) * 1 2 byte client tag (client version) * 3 2 byte command * 5 2 byte sequence number * 7 4 byte userid * 11 x bytes data * LAST 1 byte packet tail (usually 0x03) * * a qq server packet looks like this: * * TCP packets starts with 16 bit length, then the normal packets follows * * 0 1 byte packet tag (usually 0x02) * 1 2 byte source tag (client version, might also be a server id) * 3 2 byte command (usually reply to client request, so same command id) * 5 2 byte sequence number * LAST 1 byte packet tail (usually 0x03) * * NOTE: there are other qq versions which uses different packet types! */ /* * these are some currently known client ids (or server ids) * new ids might be added here if the traffic is really QQ */ static const u16 ipoque_valid_qq_versions[] = { 0x0100, 0x05a5, 0x062e, 0x06d5, 0x072e, 0x0801, 0x087d, 0x08d2, 0x0961, 0x0a1d, 0x0b07, 0x0b2f, 0x0b35, 0x0b37, 0x0c0b, 0x0c0d, 0x0c21, 0x0c49, 0x0d05, 0x0d51, 0x0d55, 0x0d61, 0x0e1b, 0x0e35, 0x0f15, 0x0f4b, 0x0f5f, 0x1105, 0x111b, 0x111d, 0x1131, 0x113f, 0x115b, 0x1203, 0x1205, 0x120b, 0x1251, 0x1412, 0x1441, 0x1501, 0x1549, 0x163a, 0x1801, 0x180d, 0x1c27, 0x1e0d }; /** * this functions checks whether the packet is a valid qq packet * it can handle tcp and udp packets */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 ipoque_is_valid_qq_packet(const struct ipoque_packet_struct *packet) { u8 real_start = 0; u16 command; u8 ids, found = 0; u16 version_id; if (packet->payload_packet_len < 9) return 0; /* for tcp the length is prefixed */ if (packet->tcp) { if (ntohs(get_u16(packet->payload, 0)) != packet->payload_packet_len) { return 0; } real_start = 2; } /* packet usually starts with 0x02 */ if (packet->payload[real_start] != 0x02) { return 0; } /* packet usually ends with 0x03 */ if (packet->payload[packet->payload_packet_len - 1] != 0x03) { return 0; } version_id = ntohs(get_u16(packet->payload, real_start + 1)); if (version_id == 0) { return 0; } /* check for known version id */ for (ids = 0; ids < sizeof(ipoque_valid_qq_versions) / sizeof(ipoque_valid_qq_versions[0]); ids++) { if (version_id == ipoque_valid_qq_versions[ids]) { found = 1; break; } } if (!found) return 0; command = ntohs(get_u16(packet->payload, real_start + 3)); /* these are some known commands, not all need to be checked since many are used with already established connections */ switch (command) { case 0x0091: /* get server */ case 0x00ba: /* login token */ case 0x00dd: /* password verify */ case 0x00e5: case 0x00a4: case 0x0030: case 0x001d: case 0x0001: case 0x0062: case 0x0002: case 0x0022: case 0x0029: break; default: return 0; break; } return 1; } /* * some file transfer packets look like this * * 0 1 byte packet tag (usually 0x04) * 1 2 byte client tag (client version) * 3 2 byte length (this is speculative) * LAST 1 byte packet tail (usually 0x03) * */ /** * this functions checks whether the packet is a valid qq file transfer packet * it can handle tcp and udp packets */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 ipoque_is_valid_qq_ft_packet(const struct ipoque_packet_struct *packet) { u8 ids, found = 0; u16 version_id; if (packet->payload_packet_len < 9) return 0; /* file transfer packets may start with 0x00 (control), 0x03 (data), 0x04 (agent) */ if (packet->payload[0] != 0x04 && packet->payload[0] != 0x03 && packet->payload[0] != 0x00) { return 0; } version_id = ntohs(get_u16(packet->payload, 1)); if (version_id == 0) { return 0; } /* check for known version id */ for (ids = 0; ids < sizeof(ipoque_valid_qq_versions) / sizeof(ipoque_valid_qq_versions[0]); ids++) { if (version_id == ipoque_valid_qq_versions[ids]) { found = 1; break; } } if (!found) return 0; if (packet->payload[0] == 0x04) { if (ntohs(get_u16(packet->payload, 3)) != packet->payload_packet_len) { return 0; } /* packet usually ends with 0x03 */ if (packet->payload[packet->payload_packet_len - 1] != 0x03) { return 0; } } else if (packet->payload[0] == 0x03) { /* TODO currently not detected */ return 0; } else if (packet->payload[0] == 0x00) { /* packet length check, there might be other lengths */ if (packet->payload_packet_len != 84) { return 0; } /* packet usually ends with 0x0c ? */ if (packet->payload[packet->payload_packet_len - 1] != 0x0c) { return 0; } } return 1; } static void ipoque_search_qq_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; static const u16 p8000_patt_02[12] = // maybe version numbers { 0x1549, 0x1801, 0x180d, 0x0961, 0x01501, 0x0e35, 0x113f, 0x0b37, 0x1131, 0x163a, 0x1e0d }; u16 no_of_patterns = 11, index = 0; IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "search qq udp.\n"); if (flow->qq_stage <= 3) { if ((packet->payload_packet_len == 27 && ntohs(get_u16(packet->payload, 0)) == 0x0300 && packet->payload[2] == 0x01) || (packet->payload_packet_len == 84 && ((ntohs(get_u16(packet->payload, 0)) == 0x000e && packet->payload[2] == 0x35) || (ntohs(get_u16(packet->payload, 0)) == 0x0015 && packet->payload[2] == 0x01) || (ntohs(get_u16(packet->payload, 0)) == 0x000b && packet->payload[2] == 0x37) || (ntohs(get_u16(packet->payload, 0)) == 0x0015 && packet->payload[2] == 0x49))) || (packet->payload_packet_len > 10 && ((get_u16(packet->payload, 0) == htons(0x000b) && packet->payload[2] == 0x37) || (get_u32(packet->payload, 0) == htonl(0x04163a00) && packet->payload[packet->payload_packet_len - 1] == 0x03 && packet->payload[4] == packet->payload_packet_len)))) { /* if (flow->qq_stage == 3 && flow->detected_protocol == IPOQUE_PROTOCOL_QQ) { if (flow->packet_direction_counter[0] > 0 && flow->packet_direction_counter[1] > 0) { flow->protocol_subtype = IPOQUE_PROTOCOL_QQ_SUBTYPE_AUDIO; return; } else if (flow->packet_counter < 10) { return; } } */ flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern 030001 or 000e35 four times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (packet->payload_packet_len > 2 && (packet->payload[0] == 0x02 || packet->payload[0] == 0x04)) { u16 pat = ntohs(get_u16(packet->payload, 1)); for (index = 0; index < no_of_patterns; index++) { if (pat == p8000_patt_02[index] && packet->payload[packet->payload_packet_len - 1] == 0x03) { flow->qq_stage++; // maybe we can test here packet->payload[4] == packet->payload_packet_len if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern 02 ... 03 four times.\n"); /* if (packet->payload[0] == 0x04) { ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } */ ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } } } if (packet->payload_packet_len == 84 && (packet->payload[0] == 0 || packet->payload[0] == 0x03)) { u16 pat = ntohs(get_u16(packet->payload, 1)); for (index = 0; index < no_of_patterns; index++) { if (pat == p8000_patt_02[index]) { flow->qq_stage++; /* if (flow->qq_stage == 3 && flow->packet_direction_counter[0] > 0 && flow->packet_direction_counter[1] > 0) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern four times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } else */ if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern four times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } } } if (packet->payload_packet_len > 2 && packet->payload[0] == 0x04 && ((ntohs(get_u16(packet->payload, 1)) == 0x1549 || ntohs(get_u16(packet->payload, 1)) == 0x1801 || ntohs(get_u16(packet->payload, 1)) == 0x0961) || (packet->payload_packet_len > 16 && (ntohs(get_u16(packet->payload, 1)) == 0x180d || ntohs(get_u16(packet->payload, 1)) == 0x096d) && ntohl(get_u32(packet->payload, 12)) == 0x28000000 && ntohs(get_u16(packet->payload, 3)) == packet->payload_packet_len)) && packet->payload[packet->payload_packet_len - 1] == 0x03) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern 04 1159 ... 03 four times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (packet->payload_packet_len > 2 && (packet->payload[0] == 0x06 || packet->payload[0] == 0x02) && ntohs(get_u16(packet->payload, 1)) == 0x0100 && (packet->payload[packet->payload_packet_len - 1] == 0x00 || packet->payload[packet->payload_packet_len - 1] == 0x03)) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern 02/06 0100 ... 03/00 four times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (packet->payload_packet_len > 2 && (packet->payload[0] == 0x02) && ntohs(get_u16(packet->payload, 1)) == 0x1131 && packet->payload[packet->payload_packet_len - 1] == 0x03) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern 02 1131 ... 03 four times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (packet->payload_packet_len > 5 && get_u16(packet->payload, 0) == htons(0x0203) && ntohs(get_u16(packet->payload, 2)) == packet->payload_packet_len && get_u16(packet->payload, 4) == htons(0x0b0b)) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern 0203[packet_length_0b0b] three times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (packet->udp->dest == htons(9000) || packet->udp->source == htons(9000)) { if (packet->payload_packet_len > 3 && ntohs(get_u16(packet->payload, 0)) == 0x0202 && ntohs(get_u16(packet->payload, 2)) == packet->payload_packet_len) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern 02 02 four times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } } } if (ipoque_is_valid_qq_packet(packet)) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq over udp.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq packet stage %d\n", flow->qq_stage); return; } if (ipoque_is_valid_qq_ft_packet(packet)) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq ft over udp.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (flow->qq_stage && flow->packet_counter <= 5) { return; } IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "QQ excluded\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_QQ); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_search_qq_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u16 i = 0; // u16 a = 0; IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "search qq tcp.\n"); if (packet->payload_packet_len == 39 && get_u32(packet->payload, 0) == htonl(0x27000000) && get_u16(packet->payload, 4) == htons(0x0014) && get_u32(packet->payload, 11) != 0 && get_u16(packet->payload, packet->payload_packet_len - 2) == htons(0x0000)) { if (flow->qq_stage == 4) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq over tcp - maybe ft/audio/video.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } flow->qq_stage = 4; return; } if ((packet->payload_packet_len > 4 && ntohs(get_u16(packet->payload, 0)) == packet->payload_packet_len && get_u16(packet->payload, 2) == htons(0x0212) && packet->payload[4] == 0x0b) || (packet->payload_packet_len > 6 && packet->payload[0] == 0x02 && packet->payload[packet->payload_packet_len - 1] == 0x03 && ntohs(get_u16(packet->payload, 1)) == packet->payload_packet_len && (get_u16(packet->payload, 3) == htons(0x0605) || get_u16(packet->payload, 3) == htons(0x0608)) && packet->payload[5] == 0x00) || (packet->payload_packet_len > 9 && get_u32(packet->payload, 0) == htonl(0x04154900) && get_l16(packet->payload, 4) == packet->payload_packet_len && packet->payload[packet->payload_packet_len - 1] == 0x03) || (packet->payload_packet_len > 9 && get_u32(packet->payload, 0) == htonl(0x040e3500) && get_l16(packet->payload, 4) == packet->payload_packet_len && packet->payload[9] == 0x33 && packet->payload[packet->payload_packet_len - 1] == 0x03) || (packet->payload_packet_len > 9 && get_u32(packet->payload, 0) == htonl(0x040e0215) && get_l16(packet->payload, 4) == packet->payload_packet_len && packet->payload[9] == 0x33 && packet->payload[packet->payload_packet_len - 1] == 0x03) || (packet->payload_packet_len > 6 && get_u32(packet->payload, 2) == htonl(0x020d5500) && ntohs(get_u16(packet->payload, 0)) == packet->payload_packet_len && packet->payload[packet->payload_packet_len - 1] == 0x03) || (packet->payload_packet_len > 6 && get_u16(packet->payload, 0) == htons(0x0418) && packet->payload[2] == 0x01 && ntohs(get_u16(packet->payload, 3)) == packet->payload_packet_len && packet->payload[packet->payload_packet_len - 1] == 0x03) || (packet->payload_packet_len > 6 && get_u16(packet->payload, 0) == htons(0x0411) && packet->payload[2] == 0x31 && ntohs(get_u16(packet->payload, 3)) == packet->payload_packet_len && packet->payload[packet->payload_packet_len - 1] == 0x03) || (packet->payload_packet_len > 6 && ntohs(get_u16(packet->payload, 0)) == packet->payload_packet_len && get_u16(packet->payload, 2) == htons(0x0211) && packet->payload[4] == 0x31 && packet->payload[packet->payload_packet_len - 1] == 0x03) || (packet->payload_packet_len > 6 && ntohs(get_u16(packet->payload, 0)) == packet->payload_packet_len && get_u16(packet->payload, 2) == htons(0x0218) && packet->payload[4] == 0x01 && packet->payload[packet->payload_packet_len - 1] == 0x03) || (packet->payload_packet_len > 10 && get_u32(packet->payload, 0) == htonl(0x04163a00) && packet->payload[packet->payload_packet_len - 1] == 0x03 && packet->payload[4] == packet->payload_packet_len) ) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq over tcp.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (ipoque_is_valid_qq_packet(packet)) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq over tcp.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (ipoque_is_valid_qq_ft_packet(packet)) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq ft over tcp.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (packet->payload_packet_len == 2) { flow->l4.tcp.qq_nxt_len = ntohs(get_u16(packet->payload, 0)); return; } if (packet->payload_packet_len > 5 && (((flow->l4.tcp.qq_nxt_len == packet->payload_packet_len + 2) && packet->payload[0] == 0x02 && packet->payload[packet->payload_packet_len - 1] == 0x03 && get_u16(packet->payload, 1) == htons(0x0f5f)) || (ntohs(get_u16(packet->payload, 0)) == packet->payload_packet_len && packet->payload[2] == 0x02 && packet->payload[packet->payload_packet_len - 1] == 0x03 && get_u16(packet->payload, 3) == htons(0x0f5f)))) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern 02 ... 03 four times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (packet->payload_packet_len > 2 && packet->payload[0] == 0x04 && ((get_u16(packet->payload, 1) == htons(0x1549) || get_u16(packet->payload, 1) == htons(0x1801) || get_u16(packet->payload, 1) == htons(0x0961)) || (packet->payload_packet_len > 16 && (get_u16(packet->payload, 1) == htons(0x180d) || get_u16(packet->payload, 1) == htons(0x096d)) && get_u32(packet->payload, 12) == htonl(0x28000000) && ntohs(get_u16(packet->payload, 3)) == packet->payload_packet_len)) && packet->payload[packet->payload_packet_len - 1] == 0x03) { flow->qq_stage++; if (flow->qq_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq udp pattern 04 1159 ... 03 four times.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } return; } if (packet->payload_packet_len > 100 && ((ipq_mem_cmp(packet->payload, "GET", 3) == 0) || (ipq_mem_cmp(packet->payload, "POST", 4) == 0))) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found GET or POST.\n"); if (memcmp(packet->payload, "GET /qqfile/qq", 14) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq over tcp GET /qqfile/qq.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } ipq_parse_packet_line_info(ipoque_struct); if (packet->user_agent_line.ptr != NULL && (packet->user_agent_line.len > 7 && memcmp(packet->user_agent_line.ptr, "QQClient", 8) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq over tcp GET...QQClient\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } for (i = 0; i < packet->parsed_lines; i++) { if (packet->line[i].len > 3 && memcmp(packet->line[i].ptr, "QQ: ", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq over tcp GET...QQ: \n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } if (packet->host_line.ptr != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "host line ptr\n"); if (packet->host_line.len > 11 && memcmp(&packet->host_line.ptr[0], "www.qq.co.za", 12) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq over tcp Host: www.qq.co.za\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } if (flow->qq_stage == 0 && packet->payload_packet_len == 82 && get_u32(packet->payload, 0) == htonl(0x0000004e) && get_u32(packet->payload, 4) == htonl(0x01010000)) { for (i = 8; i < 82; i++) { if (packet->payload[i] != 0x00) { break; } if (i == 81) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq Mail.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } if (flow->qq_stage == 0 && packet->payload_packet_len == 182 && get_u32(packet->payload, 0) == htonl(0x000000b2) && get_u32(packet->payload, 4) == htonl(0x01020000) && get_u32(packet->payload, 8) == htonl(0x04015151) && get_u32(packet->payload, 12) == htonl(0x4d61696c)) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq Mail.\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 204 && flow->qq_stage == 0 && get_u32(packet->payload, 200) == htonl(0xfbffffff)) { for (i = 0; i < 200; i++) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "i = %u\n", i); if (packet->payload[i] != 0) { break; } if (i == 199) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found qq chat or file transfer\n"); ipoque_int_qq_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } #ifdef IPOQUE_PROTOCOL_HTTP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP) != 0) { #endif /* IPOQUE_PROTOCOL_HTTP */ IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_QQ); IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "QQ tcp excluded; len %u\n", packet->payload_packet_len); #ifdef IPOQUE_PROTOCOL_HTTP } #endif /* IPOQUE_PROTOCOL_HTTP */ } void ipoque_search_qq(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; if (packet->udp != NULL && flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_QQ) ipoque_search_qq_udp(ipoque_struct); if (packet->tcp != NULL && flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_QQ) ipoque_search_qq_tcp(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/veohtv.c0000644000000000000000000001130211655273464020037 0ustar rootroot/* * veohtv.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV static void ipoque_int_veohtv_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV, protocol_type); } void ipoque_search_veohtv_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV) return; if (flow->l4.tcp.veoh_tv_stage == 1 || flow->l4.tcp.veoh_tv_stage == 2) { if (packet->packet_direction != flow->setup_packet_direction && packet->payload_packet_len > IPQ_STATICSTRING_LEN("HTTP/1.1 20") && memcmp(packet->payload, "HTTP/1.1 ", IPQ_STATICSTRING_LEN("HTTP/1.1 ")) == 0 && (packet->payload[IPQ_STATICSTRING_LEN("HTTP/1.1 ")] == '2' || packet->payload[IPQ_STATICSTRING_LEN("HTTP/1.1 ")] == '3' || packet->payload[IPQ_STATICSTRING_LEN("HTTP/1.1 ")] == '4' || packet->payload[IPQ_STATICSTRING_LEN("HTTP/1.1 ")] == '5')) { #ifdef IPOQUE_PROTOCOL_FLASH ipq_parse_packet_line_info(ipoque_struct); if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_FLASH && packet->server_line.ptr != NULL && packet->server_line.len > IPQ_STATICSTRING_LEN("Veoh-") && memcmp(packet->server_line.ptr, "Veoh-", IPQ_STATICSTRING_LEN("Veoh-")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV, ipoque_struct, IPQ_LOG_DEBUG, "VeohTV detected.\n"); ipoque_int_veohtv_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } #endif if (flow->l4.tcp.veoh_tv_stage == 2) { IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV); return; } IPQ_LOG(IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV, ipoque_struct, IPQ_LOG_DEBUG, "VeohTV detected.\n"); ipoque_int_veohtv_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } else if (flow->packet_direction_counter[(flow->setup_packet_direction == 1) ? 0 : 1] > 3) { if (flow->l4.tcp.veoh_tv_stage == 2) { IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV); return; } IPQ_LOG(IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV, ipoque_struct, IPQ_LOG_DEBUG, "VeohTV detected.\n"); ipoque_int_veohtv_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } else { if (flow->packet_counter > 10) { if (flow->l4.tcp.veoh_tv_stage == 2) { IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV); return; } IPQ_LOG(IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV, ipoque_struct, IPQ_LOG_DEBUG, "VeohTV detected.\n"); ipoque_int_veohtv_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } return; } } else if (packet->udp) { /* UDP packets from Veoh Client Player * * packet starts with 16 byte random? value * then a 4 byte mode value * values between 21 and 26 has been seen * then a 4 byte counter */ if (packet->payload_packet_len == 28 && get_u32(packet->payload, 16) == htonl(0x00000021) && get_u32(packet->payload, 20) == htonl(0x00000000) && get_u32(packet->payload, 24) == htonl(0x01040000)) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV, ipoque_struct, IPQ_LOG_DEBUG, "UDP VeohTV found.\n"); ipoque_int_veohtv_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/fiesta.c0000644000000000000000000000727011655273464020010 0ustar rootroot/* * fiesta.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_FIESTA static void ipoque_int_fiesta_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FIESTA, IPOQUE_REAL_PROTOCOL); } void ipoque_search_fiesta(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_FIESTA, ipoque_struct, IPQ_LOG_DEBUG, "search fiesta.\n"); if (flow->l4.tcp.fiesta_stage == 0 && packet->payload_packet_len == 5 && get_u16(packet->payload, 0) == ntohs(0x0407) && (packet->payload[2] == 0x08) && (packet->payload[4] == 0x00 || packet->payload[4] == 0x01)) { IPQ_LOG(IPOQUE_PROTOCOL_FIESTA, ipoque_struct, IPQ_LOG_DEBUG, "maybe fiesta symmetric, first packet.\n"); flow->l4.tcp.fiesta_stage = 1 + packet->packet_direction; goto maybe_fiesta; } if (flow->l4.tcp.fiesta_stage == (2 - packet->packet_direction) && ((packet->payload_packet_len > 1 && packet->payload_packet_len - 1 == packet->payload[0]) || (packet->payload_packet_len > 3 && packet->payload[0] == 0 && get_l16(packet->payload, 1) == packet->payload_packet_len - 3))) { IPQ_LOG(IPOQUE_PROTOCOL_FIESTA, ipoque_struct, IPQ_LOG_DEBUG, "Maybe fiesta.\n"); goto maybe_fiesta; } if (flow->l4.tcp.fiesta_stage == (1 + packet->packet_direction)) { if (packet->payload_packet_len == 4 && get_u32(packet->payload, 0) == htonl(0x03050c01)) { goto add_fiesta; } if (packet->payload_packet_len == 5 && get_u32(packet->payload, 0) == htonl(0x04030c01) && packet->payload[4] == 0) { goto add_fiesta; } if (packet->payload_packet_len == 6 && get_u32(packet->payload, 0) == htonl(0x050e080b)) { goto add_fiesta; } if (packet->payload_packet_len == 100 && packet->payload[0] == 0x63 && packet->payload[61] == 0x52 && packet->payload[81] == 0x5a && get_u16(packet->payload, 1) == htons(0x3810) && get_u16(packet->payload, 62) == htons(0x6f75)) { goto add_fiesta; } if (packet->payload_packet_len > 3 && packet->payload_packet_len - 1 == packet->payload[0] && get_u16(packet->payload, 1) == htons(0x140c)) { goto add_fiesta; } } IPQ_LOG(IPOQUE_PROTOCOL_FIESTA, ipoque_struct, IPQ_LOG_DEBUG, "exclude fiesta.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_FIESTA); return; maybe_fiesta: IPQ_LOG(IPOQUE_PROTOCOL_FIESTA, ipoque_struct, IPQ_LOG_DEBUG, "Stage is set to %d.\n", flow->l4.tcp.fiesta_stage); return; add_fiesta: IPQ_LOG(IPOQUE_PROTOCOL_FIESTA, ipoque_struct, IPQ_LOG_DEBUG, "detected fiesta.\n"); ipoque_int_fiesta_add_connection(ipoque_struct); return; } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/florensia.c0000644000000000000000000001211211655273464020506 0ustar rootroot/* * florensia.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_FLORENSIA static void ipoque_florensia_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLORENSIA, IPOQUE_REAL_PROTOCOL); } void ipoque_search_florensia(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "search florensia.\n"); if (packet->tcp != NULL) { if (packet->payload_packet_len == 5 && get_l16(packet->payload, 0) == packet->payload_packet_len && packet->payload[2] == 0x65 && packet->payload[4] == 0xff) { if (flow->florensia_stage == 1) { IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "found florensia.\n"); ipoque_florensia_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "maybe florensia -> stage is set to 1.\n"); flow->florensia_stage = 1; return; } if (packet->payload_packet_len > 8 && get_l16(packet->payload, 0) == packet->payload_packet_len && get_u16(packet->payload, 2) == htons(0x0201) && get_u32(packet->payload, 4) == htonl(0xFFFFFFFF)) { IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "maybe florensia -> stage is set to 1.\n"); flow->florensia_stage = 1; return; } if (packet->payload_packet_len == 406 && get_l16(packet->payload, 0) == packet->payload_packet_len && packet->payload[2] == 0x63) { IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "maybe florensia -> stage is set to 1.\n"); flow->florensia_stage = 1; return; } if (packet->payload_packet_len == 12 && get_l16(packet->payload, 0) == packet->payload_packet_len && get_u16(packet->payload, 2) == htons(0x0301)) { if (flow->florensia_stage == 1) { IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "found florensia.\n"); ipoque_florensia_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "maybe florensia -> stage is set to 1.\n"); flow->florensia_stage = 1; return; } if (flow->florensia_stage == 1) { if (packet->payload_packet_len == 8 && get_l16(packet->payload, 0) == packet->payload_packet_len && get_u16(packet->payload, 2) == htons(0x0302) && get_u32(packet->payload, 4) == htonl(0xFFFFFFFF)) { IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "found florensia asymmetrically.\n"); ipoque_florensia_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 24 && get_l16(packet->payload, 0) == packet->payload_packet_len && get_u16(packet->payload, 2) == htons(0x0202) && get_u32(packet->payload, packet->payload_packet_len - 4) == htonl(0xFFFFFFFF)) { IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "found florensia.\n"); ipoque_florensia_add_connection(ipoque_struct); return; } if (flow->packet_counter < 10 && get_l16(packet->payload, 0) == packet->payload_packet_len) { IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "maybe florensia.\n"); return; } } } if (packet->udp != NULL) { if (flow->florensia_stage == 0 && packet->payload_packet_len == 6 && get_u16(packet->payload, 0) == ntohs(0x0503) && get_u32(packet->payload, 2) == htonl(0xFFFF0000)) { IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "maybe florensia -> stage is set to 1.\n"); flow->florensia_stage = 1; return; } if (flow->florensia_stage == 1 && packet->payload_packet_len == 8 && get_u16(packet->payload, 0) == ntohs(0x0500) && get_u16(packet->payload, 4) == htons(0x4191)) { IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "found florensia.\n"); ipoque_florensia_add_connection(ipoque_struct); return; } } IPQ_LOG(IPOQUE_PROTOCOL_FLORENSIA, ipoque_struct, IPQ_LOG_DEBUG, "exclude florensia.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_FLORENSIA); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/soulseek.c0000644000000000000000000002663711655273464020377 0ustar rootroot/* * soulseek.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_SOULSEEK static void ipoque_int_soulseek_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SOULSEEK, IPOQUE_REAL_PROTOCOL); if (src != NULL) { src->soulseek_last_safe_access_time = packet->tick_timestamp; } if (dst != NULL) { dst->soulseek_last_safe_access_time = packet->tick_timestamp; } return; } void ipoque_search_soulseek_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "Soulseek: search soulseec tcp \n"); if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SOULSEEK) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "packet marked as Soulseek\n"); if (src != NULL) IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, " SRC bitmask: %u, packet tick %llu , last safe access timestamp: %llu\n", IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_SOULSEEK) != 0 ? 1 : 0, (u64) packet->tick_timestamp, (u64) src->soulseek_last_safe_access_time); if (dst != NULL) IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, " DST bitmask: %u, packet tick %llu , last safe ts: %llu\n", IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_SOULSEEK) != 0 ? 1 : 0, (u64) packet->tick_timestamp, (u64) dst->soulseek_last_safe_access_time); if (packet->payload_packet_len == 431) { if (dst != NULL) { dst->soulseek_last_safe_access_time = packet->tick_timestamp; } return; } if (packet->payload_packet_len == 12 && get_l32(packet->payload, 4) == 0x02) { if (src != NULL) { src->soulseek_last_safe_access_time = packet->tick_timestamp; if (packet->tcp != NULL && src->soulseek_listen_port == 0) { src->soulseek_listen_port = get_l32(packet->payload, 8); return; } } } if (src != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->soulseek_last_safe_access_time) < ipoque_struct->soulseek_connection_ip_tick_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "Soulseek: SRC update last safe access time and SKIP_FOR_TIME \n"); src->soulseek_last_safe_access_time = packet->tick_timestamp; } if (dst != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->soulseek_last_safe_access_time) < ipoque_struct->soulseek_connection_ip_tick_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "Soulseek: DST update last safe access time and SKIP_FOR_TIME \n"); dst->soulseek_last_safe_access_time = packet->tick_timestamp; } } if (dst != NULL && dst->soulseek_listen_port != 0 && dst->soulseek_listen_port == ntohs(packet->tcp->dest) && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->soulseek_last_safe_access_time) < ipoque_struct->soulseek_connection_ip_tick_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "Soulseek: Plain detection on Port : %u packet_tick_timestamp: %u soulseeek_last_safe_access_time: %u soulseek_connection_ip_ticktimeout: %u\n", dst->soulseek_listen_port, packet->tick_timestamp, dst->soulseek_last_safe_access_time, ipoque_struct->soulseek_connection_ip_tick_timeout); ipoque_int_soulseek_add_connection(ipoque_struct); return; } if (flow->l4.tcp.soulseek_stage == 0) { u32 index = 0; if (packet->payload_packet_len >= 12 && packet->payload_packet_len < 300 && get_l32(packet->payload, 4) == 1) { while (!get_u16(packet->payload, index + 2) && (index + get_l32(packet->payload, index)) < packet->payload_packet_len - 4) { if (get_l32(packet->payload, index) < 8) /*Minimum soulsek login msg is 8B */ break; if (index + get_l32(packet->payload, index) + 4 <= index) { /* avoid overflow */ break; } index += get_l32(packet->payload, index) + 4; } if (index + get_l32(packet->payload, index) == packet->payload_packet_len - 4 && !get_u16(packet->payload, 10)) { /*This structure seems to be soulseek proto */ index = get_l32(packet->payload, 8) + 12; // end of "user name" if ((index + 4) <= packet->payload_packet_len && !get_u16(packet->payload, index + 2)) // for passwd len { index += get_l32(packet->payload, index) + 4; //end of "Passwd" if ((index + 4 + 4) <= packet->payload_packet_len && !get_u16(packet->payload, index + 6)) // to read version,hashlen { index += get_l32(packet->payload, index + 4) + 8; // enf of "hash value" if (index == get_l32(packet->payload, 0)) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "Soulseek Login Detected\n"); ipoque_int_soulseek_add_connection(ipoque_struct); return; } } } } } if (packet->payload_packet_len > 8 && packet->payload_packet_len < 200 && get_l32(packet->payload, 0) == packet->payload_packet_len - 4) { //Server Messages: const u32 msgcode = get_l32(packet->payload, 4); if (msgcode == 0x7d) { flow->l4.tcp.soulseek_stage = 1 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "Soulseek Messages Search\n"); return; } else if (msgcode == 0x02 && packet->payload_packet_len == 12) { const u32 soulseek_listen_port = get_l32(packet->payload, 8); if (src != NULL) { src->soulseek_last_safe_access_time = packet->tick_timestamp; if (packet->tcp != NULL && src->soulseek_listen_port == 0) { src->soulseek_listen_port = soulseek_listen_port; IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "\n Listen Port Saved : %u", src->soulseek_listen_port); ipoque_int_soulseek_add_connection(ipoque_struct); return; } } } //Peer Messages : Peer Init Message Detection if (get_l32(packet->payload, 0) == packet->payload_packet_len - 4) { const u32 typelen = get_l32(packet->payload, packet->payload_packet_len - 9); const u8 type = packet->payload[packet->payload_packet_len - 5]; const u32 namelen = get_l32(packet->payload, 5); if (packet->payload[4] == 0x01 && typelen == 1 && namelen <= packet->payload_packet_len && (4 + 1 + 4 + namelen + 4 + 1 + 4) == packet->payload_packet_len && (type == 'F' || type == 'P' || type == 'D')) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "soulseek detected\n"); ipoque_int_soulseek_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "1\n"); } IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "3\n"); //Peer Message : Pierce Firewall if (packet->payload_packet_len == 9 && get_l32(packet->payload, 0) == 5 && packet->payload[4] <= 0x10 && get_u32(packet->payload, 5) != 0x00000000) { flow->l4.tcp.soulseek_stage = 1 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_TRACE, "Soulseek Size 9 Pierce Firewall\n"); return; } } if (packet->payload_packet_len > 25 && packet->payload[4] == 0x01 && !get_u16(packet->payload, 7) && !get_u16(packet->payload, 2)) { const u32 usrlen = get_l32(packet->payload, 5); if (usrlen <= packet->payload_packet_len - 4 + 1 + 4 + 4 + 1 + 4) { const u32 typelen = get_l32(packet->payload, 4 + 1 + 4 + usrlen); const u8 type = packet->payload[4 + 1 + 4 + usrlen + 4]; if (typelen == 1 && (type == 'F' || type == 'P' || type == 'D')) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "soulseek detected Pattern command(D|P|F).\n"); ipoque_int_soulseek_add_connection(ipoque_struct); return; } } } } else if (flow->l4.tcp.soulseek_stage == 2 - packet->packet_direction) { if (packet->payload_packet_len > 8) { if ((packet->payload[0] || packet->payload[1]) && get_l32(packet->payload, 4) == 9) { /* 9 is search result */ IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "soulseek detected Second Pkt\n"); ipoque_int_soulseek_add_connection(ipoque_struct); return; } if (get_l32(packet->payload, 0) == packet->payload_packet_len - 4) { const u32 msgcode = get_l32(packet->payload, 4); if (msgcode == 0x03 && packet->payload_packet_len >= 12) //Server Message : Get Peer Address { const u32 usrlen = get_l32(packet->payload, 8); if (usrlen <= packet->payload_packet_len && 4 + 4 + 4 + usrlen == packet->payload_packet_len) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "Soulseek Request Get Peer Address Detected\n"); ipoque_int_soulseek_add_connection(ipoque_struct); return; } } } } if (packet->payload_packet_len == 8 && get_l32(packet->payload, 4) == 0x00000004) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "soulseek detected\n"); ipoque_int_soulseek_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 4 && get_u16(packet->payload, 2) == 0x00 && get_u16(packet->payload, 0) != 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "soulseek detected\n"); ipoque_int_soulseek_add_connection(ipoque_struct); return; } else if (packet->payload_packet_len == 4) { flow->l4.tcp.soulseek_stage = 3; return; } } else if (flow->l4.tcp.soulseek_stage == 1 + packet->packet_direction) { if (packet->payload_packet_len > 8) { if (packet->payload[4] == 0x03 && get_l32(packet->payload, 5) == 0x00000031) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "soulseek detected Second Pkt with SIGNATURE :: 0x0331000000 \n"); ipoque_int_soulseek_add_connection(ipoque_struct); return; } } } if (flow->l4.tcp.soulseek_stage == 3 && packet->payload_packet_len == 8 && !get_u32(packet->payload, 4)) { IPQ_LOG(IPOQUE_PROTOCOL_SOULSEEK, ipoque_struct, IPQ_LOG_DEBUG, "soulseek detected bcz of 8B pkt\n"); ipoque_int_soulseek_add_connection(ipoque_struct); return; } if (flow->l4.tcp.soulseek_stage && flow->packet_counter < 11) { } else { IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SOULSEEK); } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/radius.c0000644000000000000000000000434611754022063020010 0ustar rootroot/* * skype.c * Copyright (C) 2012 by ntop.org * * This module is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License. * If not, see . * */ #include "ipq_utils.h" #ifdef NTOP_PROTOCOL_RADIUS struct radius_header { u_int8_t code; u_int8_t packet_id; u_int16_t len; }; static void ntop_check_radius(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; const u8 *packet_payload = packet->payload; u32 payload_len = packet->payload_packet_len; #if 0 printf("[len=%u][%02X %02X %02X %02X]\n", payload_len, packet->payload[0] & 0xFF, packet->payload[1] & 0xFF, packet->payload[2] & 0xFF, packet->payload[3] & 0xFF); #endif if(ipoque_struct->packet.udp != NULL) { struct radius_header *h = (struct radius_header*)packet->payload; h->len = ntohs(h->len); if((payload_len > sizeof(struct radius_header)) && (h->code <= 5) && (h->len == payload_len)) { IPQ_LOG(NTOP_PROTOCOL_RADIUS, ipoque_struct, IPQ_LOG_DEBUG, "Found radius.\n"); ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_RADIUS, IPOQUE_REAL_PROTOCOL); return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NTOP_PROTOCOL_RADIUS); return; } } void ntop_search_radius(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; IPQ_LOG(NTOP_PROTOCOL_RADIUS, ipoque_struct, IPQ_LOG_DEBUG, "radius detection...\n"); /* skip marked packets */ if(packet->detected_protocol_stack[0] != NTOP_PROTOCOL_RADIUS) ntop_check_radius(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/i23v5.c0000644000000000000000000000676411655273464017414 0ustar rootroot/* * i23v5.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_I23V5 static void ipoque_i23v5_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_I23V5, IPOQUE_REAL_PROTOCOL); } void ipoque_search_i23v5(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u32 i; u32 sum; IPQ_LOG(IPOQUE_PROTOCOL_I23V5, ipoque_struct, IPQ_LOG_DEBUG, "search i23v5.\n"); /* * encryption of i23v5 is tricky: the 7th bit of the first byte and the sescond bit of the second byte must be set. * Three lengths are written in three packets after 0x0d58, 0x0e58 and 0x0f58 but without a certain order. * The sum of the three packets is in another packet at any place. */ if (packet->payload_packet_len > 7 && ((packet->payload[0] & 0x04) == 0x04 && (packet->payload[2] & 0x80) == 0x80)) { IPQ_LOG(IPOQUE_PROTOCOL_I23V5, ipoque_struct, IPQ_LOG_DEBUG, "found i23v5 handshake bits.\n"); for (i = 3; i < packet->payload_packet_len - 5; i++) { if (packet->payload[i] == 0x0d && packet->payload[i + 1] == 0x58) { IPQ_LOG(IPOQUE_PROTOCOL_I23V5, ipoque_struct, IPQ_LOG_DEBUG, "found first i23v5 key len.\n"); flow->i23v5_len1 = get_u32(packet->payload, i + 2); return; } } for (i = 3; i < packet->payload_packet_len - 5; i++) { if (packet->payload[i] == 0x0e && packet->payload[i + 1] == 0x58) { IPQ_LOG(IPOQUE_PROTOCOL_I23V5, ipoque_struct, IPQ_LOG_DEBUG, "found second i23v5 key len.\n"); flow->i23v5_len2 = get_u32(packet->payload, i + 2); return; } } for (i = 3; i < packet->payload_packet_len - 5; i++) { if (packet->payload[i] == 0x0f && packet->payload[i + 1] == 0x58) { IPQ_LOG(IPOQUE_PROTOCOL_I23V5, ipoque_struct, IPQ_LOG_DEBUG, "found third i23v5 key len.\n"); flow->i23v5_len3 = get_u32(packet->payload, i + 2); return; } } if (flow->i23v5_len1 != 0 && flow->i23v5_len2 != 0 && flow->i23v5_len3 != 0) { for (i = 3; i < packet->payload_packet_len - 5; i++) { sum = flow->i23v5_len1 + flow->i23v5_len2 + flow->i23v5_len3; if (get_u32(packet->payload, i) == sum) { IPQ_LOG(IPOQUE_PROTOCOL_I23V5, ipoque_struct, IPQ_LOG_DEBUG, "key sum matches.\n"); ipoque_i23v5_add_connection(ipoque_struct); } } } } IPQ_LOG(IPOQUE_PROTOCOL_I23V5, ipoque_struct, IPQ_LOG_DEBUG, "exclude i23v5.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_I23V5); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/mdns.c0000644000000000000000000001164111655273464017473 0ustar rootroot/* * mdns.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_MDNS #define IPOQUE_MAX_MDNS_REQUESTS 128 /* This module should detect MDNS */ static void ipoque_int_mdns_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MDNS, IPOQUE_REAL_PROTOCOL); } static int ipoque_int_check_mdns_payload(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if ((packet->payload[2] & 0x80) == 0 && ntohs(get_u16(packet->payload, 4)) <= IPOQUE_MAX_MDNS_REQUESTS && ntohs(get_u16(packet->payload, 6)) <= IPOQUE_MAX_MDNS_REQUESTS) { IPQ_LOG(IPOQUE_PROTOCOL_MDNS, ipoque_struct, IPQ_LOG_DEBUG, "found MDNS with question query.\n"); return 1; } else if ((packet->payload[2] & 0x80) != 0 && ntohs(get_u16(packet->payload, 4)) == 0 && ntohs(get_u16(packet->payload, 6)) <= IPOQUE_MAX_MDNS_REQUESTS && ntohs(get_u16(packet->payload, 6)) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_MDNS, ipoque_struct, IPQ_LOG_DEBUG, "found MDNS with answer query.\n"); return 1; } return 0; } void ipoque_search_mdns(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u16 dport; // const u16 sport=ntohs(packet->udp->source); /* check if UDP and */ if (packet->udp != NULL) { /*read destination port */ dport = ntohs(packet->udp->dest); IPQ_LOG(IPOQUE_PROTOCOL_MDNS, ipoque_struct, IPQ_LOG_DEBUG, "MDNS udp start \n"); /*check standard MDNS to port 5353 */ /*took this information from http://www.it-administrator.de/lexikon/multicast-dns.html */ if (dport == 5353 && packet->payload_packet_len >= 12) { IPQ_LOG(IPOQUE_PROTOCOL_MDNS, ipoque_struct, IPQ_LOG_DEBUG, "found MDNS with destination port 5353\n"); /* MDNS header is similar to dns header */ /* dns header 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ID | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QDCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ANCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | NSCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ARCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ * * dns query check: query: QR set, ancount = 0, nscount = 0, QDCOUNT < MAX_MDNS, ARCOUNT < MAX_MDNS * */ /* mdns protocol must have destination address 224.0.0.251 */ /* took this information from http://www.it-administrator.de/lexikon/multicast-dns.html */ if (packet->iph != NULL && ntohl(packet->iph->daddr) == 0xe00000fb) { IPQ_LOG(IPOQUE_PROTOCOL_MDNS, ipoque_struct, IPQ_LOG_DEBUG, "found MDNS with destination address 224.0.0.251 (=0xe00000fb)\n"); if (ipoque_int_check_mdns_payload(ipoque_struct) == 1) { ipoque_int_mdns_add_connection(ipoque_struct); return; } } #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (packet->iphv6 != NULL) { const u32 *daddr = packet->iphv6->daddr.ipq_v6_u.u6_addr32; if (daddr[0] == htonl(0xff020000) && daddr[1] == 0 && daddr[2] == 0 && daddr[3] == htonl(0xfb)) { IPQ_LOG(IPOQUE_PROTOCOL_MDNS, ipoque_struct, IPQ_LOG_DEBUG, "found MDNS with destination address ff02::fb\n"); if (ipoque_int_check_mdns_payload(ipoque_struct) == 1) { ipoque_int_mdns_add_connection(ipoque_struct); return; } } } #endif } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MDNS); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/tvuplayer.c0000644000000000000000000001600711655273464020566 0ustar rootroot/* * tvuplayer.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_TVUPLAYER static void ipoque_int_tvuplayer_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_TVUPLAYER, protocol_type); } void ipoque_search_tvuplayer(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "search tvuplayer. \n"); if (packet->tcp != NULL) { if ((packet->payload_packet_len == 36 || packet->payload_packet_len == 24) && packet->payload[0] == 0x00 && ntohl(get_u32(packet->payload, 2)) == 0x31323334 && ntohl(get_u32(packet->payload, 6)) == 0x35363837 && packet->payload[10] == 0x01) { IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "found tvuplayer over tcp. \n"); ipoque_int_tvuplayer_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len >= 50) { if (memcmp(packet->payload, "POST", 4) || memcmp(packet->payload, "GET", 3)) { IPQ_PARSE_PACKET_LINE_INFO(ipoque_struct, packet); if (packet->user_agent_line.ptr != NULL && packet->user_agent_line.len >= 8 && (memcmp(packet->user_agent_line.ptr, "MacTVUP", 7) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "Found user agent as MacTVUP.\n"); ipoque_int_tvuplayer_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } } if (packet->udp != NULL) { if (packet->payload_packet_len == 56 && packet->payload[0] == 0xff && packet->payload[1] == 0xff && packet->payload[2] == 0x00 && packet->payload[3] == 0x01 && packet->payload[12] == 0x02 && packet->payload[13] == 0xff && packet->payload[19] == 0x2c && ((packet->payload[26] == 0x05 && packet->payload[27] == 0x14) || (packet->payload[26] == 0x14 && packet->payload[27] == 0x05))) { IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "found tvuplayer pattern type I. \n"); ipoque_int_tvuplayer_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 82 && packet->payload[0] == 0x00 && packet->payload[2] == 0x00 && packet->payload[10] == 0x00 && packet->payload[11] == 0x00 && packet->payload[12] == 0x01 && packet->payload[13] == 0xff && packet->payload[19] == 0x14 && packet->payload[32] == 0x03 && packet->payload[33] == 0xff && packet->payload[34] == 0x01 && packet->payload[39] == 0x32 && ((packet->payload[46] == 0x05 && packet->payload[47] == 0x14) || (packet->payload[46] == 0x14 && packet->payload[47] == 0x05))) { IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "found tvuplayer pattern type II. \n"); ipoque_int_tvuplayer_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 32 && packet->payload[0] == 0x00 && packet->payload[2] == 0x00 && (packet->payload[10] == 0x00 || packet->payload[10] == 0x65 || packet->payload[10] == 0x7e || packet->payload[10] == 0x49) && (packet->payload[11] == 0x00 || packet->payload[11] == 0x57 || packet->payload[11] == 0x06 || packet->payload[11] == 0x22) && packet->payload[12] == 0x01 && (packet->payload[13] == 0xff || packet->payload[13] == 0x01) && packet->payload[19] == 0x14) { IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "found tvuplayer pattern type III. \n"); ipoque_int_tvuplayer_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 84 && packet->payload[0] == 0x00 && packet->payload[2] == 0x00 && packet->payload[10] == 0x00 && packet->payload[11] == 0x00 && packet->payload[12] == 0x01 && packet->payload[13] == 0xff && packet->payload[19] == 0x14 && packet->payload[32] == 0x03 && packet->payload[33] == 0xff && packet->payload[34] == 0x01 && packet->payload[39] == 0x34) { IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "found tvuplayer pattern type IV. \n"); ipoque_int_tvuplayer_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 102 && packet->payload[0] == 0x00 && packet->payload[2] == 0x00 && packet->payload[10] == 0x00 && packet->payload[11] == 0x00 && packet->payload[12] == 0x01 && packet->payload[13] == 0xff && packet->payload[19] == 0x14 && packet->payload[33] == 0xff && packet->payload[39] == 0x14) { IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "found tvuplayer pattern type V. \n"); ipoque_int_tvuplayer_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 62 && packet->payload[0] == 0x00 && packet->payload[2] == 0x00 //&& packet->payload[10] == 0x00 && packet->payload[11] == 0x00 && packet->payload[12] == 0x03 && packet->payload[13] == 0xff && packet->payload[19] == 0x32 && ((packet->payload[26] == 0x05 && packet->payload[27] == 0x14) || (packet->payload[26] == 0x14 && packet->payload[27] == 0x05))) { IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "found tvuplayer pattern type VI. \n"); ipoque_int_tvuplayer_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } // to check, if byte 26, 27, 33,39 match if (packet->payload_packet_len == 60 && packet->payload[0] == 0x00 && packet->payload[2] == 0x00 && packet->payload[10] == 0x00 && packet->payload[11] == 0x00 && packet->payload[12] == 0x06 && packet->payload[13] == 0x00 && packet->payload[19] == 0x30) { IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "found tvuplayer pattern type VII. \n"); ipoque_int_tvuplayer_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } IPQ_LOG(IPOQUE_PROTOCOL_TVUPLAYER, ipoque_struct, IPQ_LOG_DEBUG, "exclude tvuplayer. \n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_TVUPLAYER); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/mssql.c0000644000000000000000000000375011655273464017673 0ustar rootroot/* * mssql.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_MSSQL static void ipoque_int_mssql_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MSSQL, IPOQUE_REAL_PROTOCOL); } void ipoque_search_mssql(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; IPQ_LOG(IPOQUE_PROTOCOL_MSSQL, ipoque_struct, IPQ_LOG_DEBUG, "search mssql.\n"); if (packet->payload_packet_len > 51 && ntohs(get_u32(packet->payload, 0)) == 0x1201 && ntohs(get_u16(packet->payload, 2)) == packet->payload_packet_len && ntohl(get_u32(packet->payload, 4)) == 0x00000100 && memcmp(&packet->payload[41], "sqlexpress", 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MSSQL, ipoque_struct, IPQ_LOG_DEBUG, "found mssql.\n"); ipoque_int_mssql_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_MSSQL, ipoque_struct, IPQ_LOG_DEBUG, "exclude mssql.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MSSQL); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/snmp.c0000644000000000000000000001073511655273464017512 0ustar rootroot/* * snmp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_SNMP static void ipoque_int_snmp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SNMP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_snmp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 32 && packet->payload[0] == 0x30) { int offset; switch (packet->payload[1]) { case 0x81: offset = 3; break; case 0x82: offset = 4; break; default: if (packet->payload[1] > 0x82) { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP excluded, second byte is > 0x82\n"); goto excl; } offset = 2; } if (get_u16(packet->payload, offset) != htons(0x0201)) { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP excluded, 0x0201 pattern not found\n"); goto excl; } if (packet->payload[offset + 2] >= 0x04) { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP excluded, version > 3\n"); goto excl; } if (flow->l4.udp.snmp_stage == 0) { if (packet->udp->dest == htons(161) || packet->udp->dest == htons(162)) { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP detected due to port.\n"); ipoque_int_snmp_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP stage 0.\n"); if (packet->payload[offset + 2] == 3) { flow->l4.udp.snmp_msg_id = ntohs(get_u32(packet->payload, offset + 8)); } else if (packet->payload[offset + 2] == 0) { flow->l4.udp.snmp_msg_id = get_u8(packet->payload, offset + 15); } else { flow->l4.udp.snmp_msg_id = ntohs(get_u16(packet->payload, offset + 15)); } flow->l4.udp.snmp_stage = 1 + packet->packet_direction; return; } else if (flow->l4.udp.snmp_stage == 1 + packet->packet_direction) { if (packet->payload[offset + 2] == 0) { if (flow->l4.udp.snmp_msg_id != get_u8(packet->payload, offset + 15) - 1) { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP v1 excluded, message ID doesn't match\n"); goto excl; } } } else if (flow->l4.udp.snmp_stage == 2 - packet->packet_direction) { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP stage 1-2.\n"); if (packet->payload[offset + 2] == 3) { if (flow->l4.udp.snmp_msg_id != ntohs(get_u32(packet->payload, offset + 8))) { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP v3 excluded, message ID doesn't match\n"); goto excl; } } else if (packet->payload[offset + 2] == 0) { if (flow->l4.udp.snmp_msg_id != get_u8(packet->payload, offset + 15)) { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP v1 excluded, message ID doesn't match\n"); goto excl; } } else { if (flow->l4.udp.snmp_msg_id != ntohs(get_u16(packet->payload, offset + 15))) { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP v2 excluded, message ID doesn't match\n"); goto excl; } } IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP detected.\n"); ipoque_int_snmp_add_connection(ipoque_struct); return; } } else { IPQ_LOG(IPOQUE_PROTOCOL_SNMP, ipoque_struct, IPQ_LOG_DEBUG, "SNMP excluded.\n"); } excl: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SNMP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/pcanywhere.c0000644000000000000000000000366311655273464020704 0ustar rootroot/* * pcanywhere.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_PCANYWHERE static void ipoque_int_pcanywhere_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_PCANYWHERE, IPOQUE_REAL_PROTOCOL); } void ipoque_search_pcanywhere(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->udp != NULL && packet->udp->dest == htons(5632) && packet->payload_packet_len == 2 && (ipq_mem_cmp(packet->payload, "NQ", 2) == 0 || ipq_mem_cmp(packet->payload, "ST", 2) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_PCANYWHERE, ipoque_struct, IPQ_LOG_DEBUG, "PC Anywhere name or status query detected.\n"); ipoque_int_pcanywhere_add_connection(ipoque_struct); return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_PCANYWHERE); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/stealthnet.c0000644000000000000000000000363011655273464020704 0ustar rootroot/* * stealthnet.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_STEALTHNET static void ipoque_int_stealthnet_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_STEALTHNET, IPOQUE_REAL_PROTOCOL); } void ipoque_search_stealthnet(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src = ipoque_struct->src; // struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->payload_packet_len > 40 && memcmp(packet->payload, "LARS REGENSBURGER'S FILE SHARING PROTOCOL", 41) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_STEALTHNET, ipoque_struct, IPQ_LOG_DEBUG, "found stealthnet\n"); ipoque_int_stealthnet_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_STEALTHNET, ipoque_struct, IPQ_LOG_DEBUG, "exclude stealthnet.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_STEALTHNET); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/sopcast.c0000644000000000000000000002052711661524573020206 0ustar rootroot/* * sopcast.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_SOPCAST static void ipoque_int_sopcast_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SOPCAST, IPOQUE_REAL_PROTOCOL); } /** * this function checks for sopcast tcp pattern * * NOTE: if you add more patterns please keep the number of if levels * low, it is already complex enough */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 ipoque_int_is_sopcast_tcp(const u8 * payload, const u16 payload_len) { if (payload_len != 54) return 0; if (payload[2] != payload[3] - 4 && payload[2] != payload[3] + 4) return 0; if (payload[2] != payload[4] - 1 && payload[2] != payload[4] + 1) return 0; if (payload[25] != payload[25 + 16 - 1] + 1 && payload[25] != payload[25 + 16 - 1] - 1) { if (payload[3] != payload[25] && payload[3] != payload[25] - 4 && payload[3] != payload[25] + 4 && payload[3] != payload[25] - 21) { return 0; } } if (payload[4] != payload[28] || payload[28] != payload[30] || payload[30] != payload[31] || get_u16(payload, 30) != get_u16(payload, 32) || get_u16(payload, 32) != get_u16(payload, 34)) { if ((payload[2] != payload[5] - 1 && payload[2] != payload[5] + 1) || payload[2] != payload[25] || payload[4] != payload[28] || payload[4] != payload[31] || payload[4] != payload[32] || payload[4] != payload[33] || payload[4] != payload[34] || payload[4] != payload[35] || payload[4] != payload[30] || payload[2] != payload[36]) { return 0; } } if (payload[42] != payload[53]) return 0; if (payload[45] != payload[46] + 1 && payload[45] != payload[46] - 1) return 0; if (payload[45] != payload[49] || payload[46] != payload[50] || payload[47] != payload[51]) return 0; return 1; } static void ipoque_search_sopcast_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; if (flow->packet_counter == 1 && packet->payload_packet_len == 54 && get_u16(packet->payload, 0) == ntohs(0x0036)) { if (ipoque_int_is_sopcast_tcp(packet->payload, packet->payload_packet_len)) { IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "found sopcast TCP \n"); ipoque_int_sopcast_add_connection(ipoque_struct); return; } } IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "exclude sopcast TCP. \n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SOPCAST); } static void ipoque_search_sopcast_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "search sopcast. \n"); if (packet->payload_packet_len == 52 && packet->payload[0] == 0xff && packet->payload[1] == 0xff && packet->payload[2] == 0x01 && packet->payload[8] == 0x02 && packet->payload[9] == 0xff && packet->payload[10] == 0x00 && packet->payload[11] == 0x2c && packet->payload[12] == 0x00 && packet->payload[13] == 0x00 && packet->payload[14] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "found sopcast with if I. \n"); ipoque_int_sopcast_add_connection(ipoque_struct); return; } if ((packet->payload_packet_len == 80 || packet->payload_packet_len == 28 || packet->payload_packet_len == 94) && packet->payload[0] == 0x00 && (packet->payload[2] == 0x02 || packet->payload[2] == 0x01) && packet->payload[8] == 0x01 && packet->payload[9] == 0xff && packet->payload[10] == 0x00 && packet->payload[11] == 0x14 && packet->payload[12] == 0x00 && packet->payload[13] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "found sopcast with if II. \n"); ipoque_int_sopcast_add_connection(ipoque_struct); return; } /* this case has been seen once. Please revome this comment, if you see it another time */ if (packet->payload_packet_len == 60 && packet->payload[0] == 0x00 && packet->payload[2] == 0x01 && packet->payload[8] == 0x03 && packet->payload[9] == 0xff && packet->payload[10] == 0x00 && packet->payload[11] == 0x34 && packet->payload[12] == 0x00 && packet->payload[13] == 0x00 && packet->payload[14] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "found sopcast with if III. \n"); ipoque_int_sopcast_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 42 && packet->payload[0] == 0x00 && packet->payload[1] == 0x02 && packet->payload[2] == 0x01 && packet->payload[3] == 0x07 && packet->payload[4] == 0x03 && packet->payload[8] == 0x06 && packet->payload[9] == 0x01 && packet->payload[10] == 0x00 && packet->payload[11] == 0x22 && packet->payload[12] == 0x00 && packet->payload[13] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "found sopcast with if IV. \n"); ipoque_int_sopcast_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 28 && packet->payload[0] == 0x00 && packet->payload[1] == 0x0c && packet->payload[2] == 0x01 && packet->payload[3] == 0x07 && packet->payload[4] == 0x00 && packet->payload[8] == 0x01 && packet->payload[9] == 0x01 && packet->payload[10] == 0x00 && packet->payload[11] == 0x14 && packet->payload[12] == 0x00 && packet->payload[13] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "found sopcast with if V. \n"); ipoque_int_sopcast_add_connection(ipoque_struct); return; } /* this case has been seen once. Please revome this comment, if you see it another time */ if (packet->payload_packet_len == 286 && packet->payload[0] == 0x00 && packet->payload[1] == 0x02 && packet->payload[2] == 0x01 && packet->payload[3] == 0x07 && packet->payload[4] == 0x03 && packet->payload[8] == 0x06 && packet->payload[9] == 0x01 && packet->payload[10] == 0x01 && packet->payload[11] == 0x16 && packet->payload[12] == 0x00 && packet->payload[13] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "found sopcast with if VI. \n"); ipoque_int_sopcast_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 76 && packet->payload[0] == 0xff && packet->payload[1] == 0xff && packet->payload[2] == 0x01 && packet->payload[8] == 0x0c && packet->payload[9] == 0xff && packet->payload[10] == 0x00 && packet->payload[11] == 0x44 && packet->payload[16] == 0x01 && packet->payload[15] == 0x01 && packet->payload[12] == 0x00 && packet->payload[13] == 0x00 && packet->payload[14] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "found sopcast with if VII. \n"); ipoque_int_sopcast_add_connection(ipoque_struct); return; } /* Attention please: no asymmetric detection necessary. This detection works asymmetrically as well. */ IPQ_LOG(IPOQUE_PROTOCOL_SOPCAST, ipoque_struct, IPQ_LOG_DEBUG, "exclude sopcast. \n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SOPCAST); } void ipoque_search_sopcast(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->udp != NULL) ipoque_search_sopcast_udp(ipoque_struct); if (packet->tcp != NULL) ipoque_search_sopcast_tcp(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/openft.c0000644000000000000000000000403411655273464020023 0ustar rootroot/* * openft.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_OPENFT static void ipoque_int_openft_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_OPENFT, IPOQUE_CORRELATED_PROTOCOL); } void ipoque_search_openft_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 5 && memcmp(packet->payload, "GET /", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OPENFT, ipoque_struct, IPQ_LOG_DEBUG, "HTTP packet detected.\n"); ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines >= 2 && packet->line[1].len > 13 && ipq_mem_cmp(packet->line[1].ptr, "X-OpenftAlias:", 14) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OPENFT, ipoque_struct, IPQ_LOG_DEBUG, "OpenFT detected.\n"); ipoque_int_openft_add_connection(ipoque_struct); return; } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_OPENFT); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/citrix.c0000644000000000000000000000572611711362647020036 0ustar rootroot/* * citrix.c * Copyright (C) 2012 by ntop.org * * This module is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License. * If not, see . * */ #include "ipq_utils.h" #ifdef NTOP_PROTOCOL_CITRIX /* ************************************ */ static void ntop_check_citrix(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; const u8 *packet_payload = packet->payload; u32 payload_len = packet->payload_packet_len; #if 0 printf("[len=%u][%02X %02X %02X %02X]\n", payload_len, packet->payload[0] & 0xFF, packet->payload[1] & 0xFF, packet->payload[2] & 0xFF, packet->payload[3] & 0xFF); #endif if(ipoque_struct->packet.tcp != NULL) { flow->l4.tcp.citrix_packet_id++; if((flow->l4.tcp.citrix_packet_id == 3) /* We have seen the 3-way handshake */ && flow->l4.tcp.seen_syn && flow->l4.tcp.seen_syn_ack && flow->l4.tcp.seen_ack) { if(payload_len == 6) { char citrix_header[] = { 0x07, 0x07, 0x49, 0x43, 0x41, 0x00 }; if(memcmp(packet->payload, citrix_header, sizeof(citrix_header)) == 0) { IPQ_LOG(NTOP_PROTOCOL_CITRIX, ipoque_struct, IPQ_LOG_DEBUG, "Found citrix.\n"); ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_CITRIX, IPOQUE_REAL_PROTOCOL); } return; } else if(payload_len > 4) { char citrix_header[] = { 0x1a, 0x43, 0x47, 0x50, 0x2f, 0x30, 0x31 }; if((memcmp(packet->payload, citrix_header, sizeof(citrix_header)) == 0) || (ntop_strnstr(packet->payload, "Citrix.TcpProxyService", payload_len) != NULL)) { IPQ_LOG(NTOP_PROTOCOL_CITRIX, ipoque_struct, IPQ_LOG_DEBUG, "Found citrix.\n"); ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_CITRIX, IPOQUE_REAL_PROTOCOL); } return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NTOP_PROTOCOL_CITRIX); } else if(flow->l4.tcp.citrix_packet_id > 3) IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NTOP_PROTOCOL_CITRIX); return; } } void ntop_search_citrix(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; IPQ_LOG(NTOP_PROTOCOL_CITRIX, ipoque_struct, IPQ_LOG_DEBUG, "citrix detection...\n"); /* skip marked packets */ if(packet->detected_protocol_stack[0] != NTOP_PROTOCOL_CITRIX) ntop_check_citrix(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/netbios.c0000644000000000000000000003010211655273464020166 0ustar rootroot/* * netbios.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_NETBIOS static void ipoque_int_netbios_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_NETBIOS, IPOQUE_REAL_PROTOCOL); } void ipoque_search_netbios(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u16 dport; if (packet->udp != NULL) { dport = ntohs(packet->udp->dest); IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "netbios udp start\n"); /*check standard NETBIOS over udp to port 137 */ if ((dport == 137 || 0) && packet->payload_packet_len >= 50) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios port 137 and payload_packet_len 50\n"); if (ntohs(get_u16(packet->payload, 2)) == 0 && ntohs(get_u16(packet->payload, 4)) == 1 && ntohs(get_u16(packet->payload, 6)) == 0 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with questions = 1 and answers = 0, authority = 0 \n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } if (packet->payload[2] == 0x80 && ntohs(get_u16(packet->payload, 4)) == 1 && ntohs(get_u16(packet->payload, 6)) == 0 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) == 1) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with questions = 1 and answers, authority, additional = 0 \n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } if (ntohs(get_u16(packet->payload, 2)) == 0x4000 && ntohs(get_u16(packet->payload, 4)) == 1 && ntohs(get_u16(packet->payload, 6)) == 0 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) == 1) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with questions = 1 and answers = 0, authority = 0 \n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } if (ntohs(get_u16(packet->payload, 2)) == 0x8400 && ntohs(get_u16(packet->payload, 4)) == 0 && ntohs(get_u16(packet->payload, 6)) == 1 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with flag 8400 questions = 0 and answers = 1, authority, additional = 0 \n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } if (ntohs(get_u16(packet->payload, 2)) == 0x8500 && ntohs(get_u16(packet->payload, 4)) == 0 && ntohs(get_u16(packet->payload, 6)) == 1 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with flag 8500 questions = 0 and answers = 1, authority, additional = 0 \n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } if (ntohs(get_u16(packet->payload, 2)) == 0x2910 && ntohs(get_u16(packet->payload, 4)) == 1 && ntohs(get_u16(packet->payload, 6)) == 0 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) == 1) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with flag 2910, questions = 1 and answers, authority=0, additional = 1 \n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } if (ntohs(get_u16(packet->payload, 2)) == 0xAD86 && ntohs(get_u16(packet->payload, 4)) == 0 && ntohs(get_u16(packet->payload, 6)) == 1 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with flag ad86 questions = 0 and answers = 1, authority, additional = 0 \n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } if (ntohs(get_u16(packet->payload, 2)) == 0x0110 && ntohs(get_u16(packet->payload, 4)) == 1 && ntohs(get_u16(packet->payload, 6)) == 0 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with flag 0110 questions = 1 and answers = 0, authority, additional = 0 \n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } if ((ntohs(get_u16(packet->payload, 2)) & 0xf800) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios name query request\n"); if (get_u16(packet->payload, 4) == htons(1) && get_u16(packet->payload, 6) == 0 && get_u16(packet->payload, 8) == 0 && get_u16(packet->payload, 10) == 0) { /* name is encoded as described in rfc883 */ u8 name_length = packet->payload[12]; IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios name query request, one question\n"); if (packet->payload_packet_len == 12 + 1 + name_length + 1 + 2 + 2) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios name query request, length matches\n"); /* null terminated? */ if (packet->payload[12 + name_length + 1] == 0 && get_u16(packet->payload, 12 + name_length + 2) == htons(0x0020) && get_u16(packet->payload, 12 + name_length + 4) == htons(0x0001)) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios name query request\n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } } } } else if ((ntohs(get_u16(packet->payload, 2)) & 0xf800) == 0x8000) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios name query response\n"); if (get_u16(packet->payload, 4) == 0 && get_u16(packet->payload, 6) == htons(1) && get_u16(packet->payload, 8) == 0 && get_u16(packet->payload, 10) == 0) { /* name is encoded as described in rfc883 */ u8 name_length = packet->payload[12]; IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios positive name query response, one answer\n"); if (packet->payload_packet_len >= 12 + 1 + name_length + 1 + 2 + 2) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios name query response, length matches\n"); /* null terminated? */ if (packet->payload[12 + name_length + 1] == 0 && get_u16(packet->payload, 12 + name_length + 2) == htons(0x0020) && get_u16(packet->payload, 12 + name_length + 4) == htons(0x0001)) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios name query response\n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } } } else if (get_u16(packet->payload, 4) == 0 && get_u16(packet->payload, 6) == 0 && get_u16(packet->payload, 8) == 0 && get_u16(packet->payload, 10) == 0) { /* name is encoded as described in rfc883 */ u8 name_length = packet->payload[12]; IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios negative name query response, one answer\n"); if (packet->payload_packet_len >= 12 + 1 + name_length + 1 + 2 + 2) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios name query response, length matches\n"); /* null terminated? */ if (packet->payload[12 + name_length + 1] == 0 && get_u16(packet->payload, 12 + name_length + 2) == htons(0x000A) && get_u16(packet->payload, 12 + name_length + 4) == htons(0x0001)) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios name query response\n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } } } else if (get_u16(packet->payload, 4) == 0 && get_u16(packet->payload, 6) == 0 && get_u16(packet->payload, 8) == htons(1) && get_u16(packet->payload, 10) == htons(1)) { /* name is encoded as described in rfc883 */ u8 name_length = packet->payload[12]; IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios redirect name query response, one answer\n"); if (packet->payload_packet_len >= 12 + 1 + name_length + 1 + 2 + 2) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "possible netbios name query response, length matches\n"); /* null terminated? */ if (packet->payload[12 + name_length + 1] == 0 && get_u16(packet->payload, 12 + name_length + 2) == htons(0x0002) && get_u16(packet->payload, 12 + name_length + 4) == htons(0x0001)) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios name query response\n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } } } } /* TODO: extend according to rfc1002 */ } /*check standard NETBIOS over udp to port 138 */ /*netbios header token from http://www.protocolbase.net/protocols/protocol_NBDGM.php */ if ((dport == 138 || 0) && packet->payload_packet_len >= 14 && ntohs(get_u16(packet->payload, 10)) == packet->payload_packet_len - 14) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios port 138 and payload length >= 112 \n"); if (packet->payload[0] >= 0x11 && packet->payload[0] <= 0x16) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with MSG-type 0x11,0x12,0x13,0x14,0x15 or 0x16\n"); if (ntohl(get_u32(packet->payload, 4)) == ntohl(packet->iph->saddr)) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with checked ip-address.\n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } } } } if (packet->tcp != NULL) { dport = ntohs(packet->tcp->dest); IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "netbios tcp start\n"); /* destination port must be 139 */ if (dport == 139) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with destination port 139\n"); /* payload_packet_len must be 72 */ if (packet->payload_packet_len == 72) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with payload_packen_len = 72. \n"); if (packet->payload[0] == 0x81 && packet->payload[1] == 0 && ntohs(get_u16(packet->payload, 2)) == 68) { IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "found netbios with session request = 81, flags=0 and length od following bytes = 68. \n"); ipoque_int_netbios_add_connection(ipoque_struct); return; } } } } IPQ_LOG(IPOQUE_PROTOCOL_NETBIOS, ipoque_struct, IPQ_LOG_DEBUG, "exclude netbios\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_NETBIOS); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/mail_imap.c0000644000000000000000000004042311655273464020462 0ustar rootroot/* * mail_imap.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_MAIL_IMAP static void ipoque_int_mail_imap_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MAIL_IMAP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_mail_imap_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; u16 i = 0; u16 space_pos = 0; u16 command_start = 0; u8 saw_command = 0; const u8 *command = 0; IPQ_LOG(IPOQUE_PROTOCOL_MAIL_IMAP, ipoque_struct, IPQ_LOG_DEBUG, "search IMAP.\n"); if (packet->payload_packet_len >= 4 && ntohs(get_u16(packet->payload, packet->payload_packet_len - 2)) == 0x0d0a) { // the DONE command appears without a tag if (packet->payload_packet_len == 6 && ((packet->payload[0] == 'D' || packet->payload[0] == 'd') && (packet->payload[1] == 'O' || packet->payload[1] == 'o') && (packet->payload[2] == 'N' || packet->payload[2] == 'n') && (packet->payload[3] == 'E' || packet->payload[3] == 'e'))) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else { if (flow->l4.tcp.mail_imap_stage < 4) { // search for the first space character (end of the tag) while (i < 20 && i < packet->payload_packet_len) { if (i > 0 && packet->payload[i] == ' ') { space_pos = i; break; } if (!((packet->payload[i] >= 'a' && packet->payload[i] <= 'z') || (packet->payload[i] >= 'A' && packet->payload[i] <= 'Z') || (packet->payload[i] >= '0' && packet->payload[i] <= '9') || packet->payload[i] == '*')) { goto imap_excluded; } i++; } if (space_pos == 0 || space_pos == (packet->payload_packet_len - 1)) { goto imap_excluded; } // now walk over a possible mail number to the next space i++; if (i < packet->payload_packet_len && (packet->payload[i] >= '0' && packet->payload[i] <= '9')) { while (i < 20 && i < packet->payload_packet_len) { if (i > 0 && packet->payload[i] == ' ') { space_pos = i; break; } if (!(packet->payload[i] >= '0' && packet->payload[i] <= '9')) { goto imap_excluded; } i++; } if (space_pos == 0 || space_pos == (packet->payload_packet_len - 1)) { goto imap_excluded; } } command_start = space_pos + 1; command = &(packet->payload[command_start]); } else { command_start = 0; command = &(packet->payload[command_start]); } if ((command_start + 3) < packet->payload_packet_len) { if ((packet->payload[command_start] == 'O' || packet->payload[command_start] == 'o') && (packet->payload[command_start + 1] == 'K' || packet->payload[command_start + 1] == 'k') && packet->payload[command_start + 2] == ' ') { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'U' || packet->payload[command_start] == 'u') && (packet->payload[command_start + 1] == 'I' || packet->payload[command_start + 1] == 'i') && (packet->payload[command_start + 2] == 'D' || packet->payload[command_start + 2] == 'd')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } } if ((command_start + 10) < packet->payload_packet_len) { if ((packet->payload[command_start] == 'C' || packet->payload[command_start] == 'c') && (packet->payload[command_start + 1] == 'A' || packet->payload[command_start + 1] == 'a') && (packet->payload[command_start + 2] == 'P' || packet->payload[command_start + 2] == 'p') && (packet->payload[command_start + 3] == 'A' || packet->payload[command_start + 3] == 'a') && (packet->payload[command_start + 4] == 'B' || packet->payload[command_start + 4] == 'b') && (packet->payload[command_start + 5] == 'I' || packet->payload[command_start + 5] == 'i') && (packet->payload[command_start + 6] == 'L' || packet->payload[command_start + 6] == 'l') && (packet->payload[command_start + 7] == 'I' || packet->payload[command_start + 7] == 'i') && (packet->payload[command_start + 8] == 'T' || packet->payload[command_start + 8] == 't') && (packet->payload[command_start + 9] == 'Y' || packet->payload[command_start + 9] == 'y')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } } if ((command_start + 8) < packet->payload_packet_len) { if ((packet->payload[command_start] == 'S' || packet->payload[command_start] == 's') && (packet->payload[command_start + 1] == 'T' || packet->payload[command_start + 1] == 't') && (packet->payload[command_start + 2] == 'A' || packet->payload[command_start + 2] == 'a') && (packet->payload[command_start + 3] == 'R' || packet->payload[command_start + 3] == 'r') && (packet->payload[command_start + 4] == 'T' || packet->payload[command_start + 4] == 't') && (packet->payload[command_start + 5] == 'T' || packet->payload[command_start + 5] == 't') && (packet->payload[command_start + 6] == 'L' || packet->payload[command_start + 6] == 'l') && (packet->payload[command_start + 7] == 'S' || packet->payload[command_start + 7] == 's')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } } if ((command_start + 5) < packet->payload_packet_len) { if ((packet->payload[command_start] == 'L' || packet->payload[command_start] == 'l') && (packet->payload[command_start + 1] == 'O' || packet->payload[command_start + 1] == 'o') && (packet->payload[command_start + 2] == 'G' || packet->payload[command_start + 2] == 'g') && (packet->payload[command_start + 3] == 'I' || packet->payload[command_start + 3] == 'i') && (packet->payload[command_start + 4] == 'N' || packet->payload[command_start + 4] == 'n')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'F' || packet->payload[command_start] == 'f') && (packet->payload[command_start + 1] == 'E' || packet->payload[command_start + 1] == 'e') && (packet->payload[command_start + 2] == 'T' || packet->payload[command_start + 2] == 't') && (packet->payload[command_start + 3] == 'C' || packet->payload[command_start + 3] == 'c') && (packet->payload[command_start + 4] == 'H' || packet->payload[command_start + 4] == 'h')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'F' || packet->payload[command_start] == 'f') && (packet->payload[command_start + 1] == 'L' || packet->payload[command_start + 1] == 'l') && (packet->payload[command_start + 2] == 'A' || packet->payload[command_start + 2] == 'a') && (packet->payload[command_start + 3] == 'G' || packet->payload[command_start + 3] == 'g') && (packet->payload[command_start + 4] == 'S' || packet->payload[command_start + 4] == 's')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'C' || packet->payload[command_start] == 'c') && (packet->payload[command_start + 1] == 'H' || packet->payload[command_start + 1] == 'h') && (packet->payload[command_start + 2] == 'E' || packet->payload[command_start + 2] == 'e') && (packet->payload[command_start + 3] == 'C' || packet->payload[command_start + 3] == 'c') && (packet->payload[command_start + 4] == 'K' || packet->payload[command_start + 4] == 'k')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'S' || packet->payload[command_start] == 's') && (packet->payload[command_start + 1] == 'T' || packet->payload[command_start + 1] == 't') && (packet->payload[command_start + 2] == 'O' || packet->payload[command_start + 2] == 'o') && (packet->payload[command_start + 3] == 'R' || packet->payload[command_start + 3] == 'r') && (packet->payload[command_start + 4] == 'E' || packet->payload[command_start + 4] == 'e')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } } if ((command_start + 12) < packet->payload_packet_len) { if ((packet->payload[command_start] == 'A' || packet->payload[command_start] == 'a') && (packet->payload[command_start + 1] == 'U' || packet->payload[command_start + 1] == 'u') && (packet->payload[command_start + 2] == 'T' || packet->payload[command_start + 2] == 't') && (packet->payload[command_start + 3] == 'H' || packet->payload[command_start + 3] == 'h') && (packet->payload[command_start + 4] == 'E' || packet->payload[command_start + 4] == 'e') && (packet->payload[command_start + 5] == 'N' || packet->payload[command_start + 5] == 'n') && (packet->payload[command_start + 6] == 'T' || packet->payload[command_start + 6] == 't') && (packet->payload[command_start + 7] == 'I' || packet->payload[command_start + 7] == 'i') && (packet->payload[command_start + 8] == 'C' || packet->payload[command_start + 8] == 'c') && (packet->payload[command_start + 9] == 'A' || packet->payload[command_start + 9] == 'a') && (packet->payload[command_start + 10] == 'T' || packet->payload[command_start + 10] == 't') && (packet->payload[command_start + 11] == 'E' || packet->payload[command_start + 11] == 'e')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } } if ((command_start + 9) < packet->payload_packet_len) { if ((packet->payload[command_start] == 'N' || packet->payload[command_start] == 'n') && (packet->payload[command_start + 1] == 'A' || packet->payload[command_start + 1] == 'a') && (packet->payload[command_start + 2] == 'M' || packet->payload[command_start + 2] == 'm') && (packet->payload[command_start + 3] == 'E' || packet->payload[command_start + 3] == 'e') && (packet->payload[command_start + 4] == 'S' || packet->payload[command_start + 4] == 's') && (packet->payload[command_start + 5] == 'P' || packet->payload[command_start + 5] == 'p') && (packet->payload[command_start + 6] == 'A' || packet->payload[command_start + 6] == 'a') && (packet->payload[command_start + 7] == 'C' || packet->payload[command_start + 7] == 'c') && (packet->payload[command_start + 8] == 'E' || packet->payload[command_start + 8] == 'e')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } } if ((command_start + 4) < packet->payload_packet_len) { if ((packet->payload[command_start] == 'L' || packet->payload[command_start] == 'l') && (packet->payload[command_start + 1] == 'S' || packet->payload[command_start + 1] == 's') && (packet->payload[command_start + 2] == 'U' || packet->payload[command_start + 2] == 'u') && (packet->payload[command_start + 3] == 'B' || packet->payload[command_start + 3] == 'b')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'L' || packet->payload[command_start] == 'l') && (packet->payload[command_start + 1] == 'I' || packet->payload[command_start + 1] == 'i') && (packet->payload[command_start + 2] == 'S' || packet->payload[command_start + 2] == 's') && (packet->payload[command_start + 3] == 'T' || packet->payload[command_start + 3] == 't')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'N' || packet->payload[command_start] == 'n') && (packet->payload[command_start + 1] == 'O' || packet->payload[command_start + 1] == 'o') && (packet->payload[command_start + 2] == 'O' || packet->payload[command_start + 2] == 'o') && (packet->payload[command_start + 3] == 'P' || packet->payload[command_start + 3] == 'p')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'I' || packet->payload[command_start] == 'i') && (packet->payload[command_start + 1] == 'D' || packet->payload[command_start + 1] == 'd') && (packet->payload[command_start + 2] == 'L' || packet->payload[command_start + 2] == 'l') && (packet->payload[command_start + 3] == 'E' || packet->payload[command_start + 3] == 'e')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } } if ((command_start + 6) < packet->payload_packet_len) { if ((packet->payload[command_start] == 'S' || packet->payload[command_start] == 's') && (packet->payload[command_start + 1] == 'E' || packet->payload[command_start + 1] == 'e') && (packet->payload[command_start + 2] == 'L' || packet->payload[command_start + 2] == 'l') && (packet->payload[command_start + 3] == 'E' || packet->payload[command_start + 3] == 'e') && (packet->payload[command_start + 4] == 'C' || packet->payload[command_start + 4] == 'c') && (packet->payload[command_start + 5] == 'T' || packet->payload[command_start + 5] == 't')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'E' || packet->payload[command_start] == 'e') && (packet->payload[command_start + 1] == 'X' || packet->payload[command_start + 1] == 'x') && (packet->payload[command_start + 2] == 'I' || packet->payload[command_start + 2] == 'i') && (packet->payload[command_start + 3] == 'S' || packet->payload[command_start + 3] == 's') && (packet->payload[command_start + 4] == 'T' || packet->payload[command_start + 4] == 't') && (packet->payload[command_start + 5] == 'S' || packet->payload[command_start + 5] == 's')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } else if ((packet->payload[command_start] == 'A' || packet->payload[command_start] == 'a') && (packet->payload[command_start + 1] == 'P' || packet->payload[command_start + 1] == 'p') && (packet->payload[command_start + 2] == 'P' || packet->payload[command_start + 2] == 'p') && (packet->payload[command_start + 3] == 'E' || packet->payload[command_start + 3] == 'e') && (packet->payload[command_start + 4] == 'N' || packet->payload[command_start + 4] == 'n') && (packet->payload[command_start + 5] == 'D' || packet->payload[command_start + 5] == 'd')) { flow->l4.tcp.mail_imap_stage += 1; saw_command = 1; } } } if (saw_command == 1) { if (flow->l4.tcp.mail_imap_stage == 3 || flow->l4.tcp.mail_imap_stage == 5) { IPQ_LOG(IPOQUE_PROTOCOL_MAIL_IMAP, ipoque_struct, IPQ_LOG_DEBUG, "mail imap identified\n"); ipoque_int_mail_imap_add_connection(ipoque_struct); return; } } } if (packet->payload_packet_len > 1 && packet->payload[packet->payload_packet_len - 1] == ' ') { IPQ_LOG(IPOQUE_PROTOCOL_MAIL_IMAP, ipoque_struct, IPQ_LOG_DEBUG, "maybe a split imap command -> need next packet and imap_stage is set to 4.\n"); flow->l4.tcp.mail_imap_stage = 4; return; } imap_excluded: // skip over possible authentication hashes etc. that cannot be identified as imap commands or responses // if the packet count is low enough and at least one command or response was seen before if ((packet->payload_packet_len >= 2 && ntohs(get_u16(packet->payload, packet->payload_packet_len - 2)) == 0x0d0a) && flow->packet_counter < 6 && flow->l4.tcp.mail_imap_stage >= 1) { IPQ_LOG(IPOQUE_PROTOCOL_MAIL_IMAP, ipoque_struct, IPQ_LOG_DEBUG, "no imap command or response but packet count < 6 and imap stage >= 1 -> skip\n"); return; } IPQ_LOG(IPOQUE_PROTOCOL_MAIL_IMAP, ipoque_struct, IPQ_LOG_DEBUG, "exclude IMAP.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MAIL_IMAP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/battlefield.c0000644000000000000000000001150711655273464021012 0ustar rootroot/* * battlefield.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_BATTLEFIELD static void ipoque_int_battlefield_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_BATTLEFIELD, IPOQUE_REAL_PROTOCOL); if (src != NULL) { src->battlefield_ts = packet->tick_timestamp; } if (dst != NULL) { dst->battlefield_ts = packet->tick_timestamp; } } void ipoque_search_battlefield(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_BATTLEFIELD) { if (src != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->battlefield_ts) < ipoque_struct->battlefield_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_BATTLEFIELD, ipoque_struct, IPQ_LOG_DEBUG, "battlefield : save src connection packet detected\n"); src->battlefield_ts = packet->tick_timestamp; } else if (dst != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->battlefield_ts) < ipoque_struct->battlefield_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_BATTLEFIELD, ipoque_struct, IPQ_LOG_DEBUG, "battlefield : save dst connection packet detected\n"); dst->battlefield_ts = packet->tick_timestamp; } return; } if (IPQ_SRC_OR_DST_HAS_PROTOCOL(src, dst, IPOQUE_PROTOCOL_BATTLEFIELD)) { if (flow->l4.udp.battlefield_stage == 0 || flow->l4.udp.battlefield_stage == 1 + packet->packet_direction) { if (packet->payload_packet_len > 8 && get_u16(packet->payload, 0) == htons(0xfefd)) { flow->l4.udp.battlefield_msg_id = get_u32(packet->payload, 2); flow->l4.udp.battlefield_stage = 1 + packet->packet_direction; return; } } else if (flow->l4.udp.battlefield_stage == 2 - packet->packet_direction) { if (packet->payload_packet_len > 8 && get_u32(packet->payload, 0) == flow->l4.udp.battlefield_msg_id) { IPQ_LOG(IPOQUE_PROTOCOL_BATTLEFIELD, ipoque_struct, IPQ_LOG_DEBUG, "Battlefield message and reply detected.\n"); ipoque_int_battlefield_add_connection(ipoque_struct); return; } } } if (flow->l4.udp.battlefield_stage == 0) { if (packet->payload_packet_len == 46 && packet->payload[2] == 0 && packet->payload[4] == 0 && get_u32(packet->payload, 7) == htonl(0x98001100)) { flow->l4.udp.battlefield_stage = 3 + packet->packet_direction; return; } } else if (flow->l4.udp.battlefield_stage == 4 - packet->packet_direction) { if (packet->payload_packet_len == 7 && (packet->payload[0] == 0x02 || packet->payload[packet->payload_packet_len - 1] == 0xe0)) { IPQ_LOG(IPOQUE_PROTOCOL_BATTLEFIELD, ipoque_struct, IPQ_LOG_DEBUG, "Battlefield message and reply detected.\n"); ipoque_int_battlefield_add_connection(ipoque_struct); return; } } if (packet->payload_packet_len == 18 && ipq_mem_cmp(&packet->payload[5], "battlefield2\x00", 13) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_BATTLEFIELD, ipoque_struct, IPQ_LOG_DEBUG, "Battlefield 2 hello packet detected.\n"); ipoque_int_battlefield_add_connection(ipoque_struct); return; } else if (packet->payload_packet_len > 10 && (ipq_mem_cmp(packet->payload, "\x11\x20\x00\x01\x00\x00\x50\xb9\x10\x11", 10) == 0 || ipq_mem_cmp(packet->payload, "\x11\x20\x00\x01\x00\x00\x30\xb9\x10\x11", 10) == 0 || ipq_mem_cmp(packet->payload, "\x11\x20\x00\x01\x00\x00\xa0\x98\x00\x11", 10) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_BATTLEFIELD, ipoque_struct, IPQ_LOG_DEBUG, "Battlefield safe pattern detected.\n"); ipoque_int_battlefield_add_connection(ipoque_struct); return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_BATTLEFIELD); return; } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/sip.c0000644000000000000000000001430011754014477017315 0ustar rootroot/* * sip.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_SIP static void ipoque_int_sip_add_connection(struct ipoque_detection_module_struct *ipoque_struct, u8 due_to_correlation) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SIP, due_to_correlation ? IPOQUE_CORRELATED_PROTOCOL : IPOQUE_REAL_PROTOCOL); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_search_sip_handshake(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; const u8 *packet_payload = packet->payload; u32 payload_len = packet->payload_packet_len; if (payload_len > 4) { /* search for STUN Turn ChannelData Prefix */ u16 message_len = ntohs(get_u16(packet->payload, 2)); if (payload_len - 4 == message_len) { IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "found STUN TURN ChannelData prefix.\n"); payload_len -= 4; packet_payload += 4; } } #ifndef IPOQUE_PROTOCOL_YAHOO if (payload_len >= 14 && packet_payload[payload_len - 2] == 0x0d && packet_payload[payload_len - 1] == 0x0a) #endif #ifdef IPOQUE_PROTOCOL_YAHOO if (payload_len >= 14) #endif { #if defined(HAVE_NTOP) if ((memcmp(packet_payload, "NOTIFY ", 7) == 0 || memcmp(packet_payload, "notify ", 7) == 0) && (memcmp(&packet_payload[7], "SIP:", 4) == 0 || memcmp(&packet_payload[7], "sip:", 4) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "found sip NOTIFY.\n"); ipoque_int_sip_add_connection(ipoque_struct, 0); return; } #endif if ((memcmp(packet_payload, "REGISTER ", 9) == 0 || memcmp(packet_payload, "register ", 9) == 0) && (memcmp(&packet_payload[9], "SIP:", 4) == 0 || memcmp(&packet_payload[9], "sip:", 4) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "found sip REGISTER.\n"); ipoque_int_sip_add_connection(ipoque_struct, 0); return; } if ((memcmp(packet_payload, "INVITE ", 7) == 0 || memcmp(packet_payload, "invite ", 7) == 0) && (memcmp(&packet_payload[7], "SIP:", 4) == 0 || memcmp(&packet_payload[7], "sip:", 4) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "found sip INVITE.\n"); ipoque_int_sip_add_connection(ipoque_struct, 0); return; } /* seen this in second direction on the third position, * maybe it could be deleted, if somebody sees it in the first direction, * please delete this comment. */ if (memcmp(packet_payload, "SIP/2.0 200 OK", 14) == 0 || memcmp(packet_payload, "sip/2.0 200 OK", 14) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "found sip SIP/2.0 0K.\n"); ipoque_int_sip_add_connection(ipoque_struct, 0); return; } #if defined(HAVE_NTOP) /* Courtesy of Miguel Quesada */ if ((memcmp(packet_payload, "OPTIONS ", 8) == 0 || memcmp(packet_payload, "options ", 8) == 0) && (memcmp(&packet_payload[8], "SIP:", 4) == 0 || memcmp(&packet_payload[8], "sip:", 4) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "found sip OPTIONS.\n"); ipoque_int_sip_add_connection(ipoque_struct, 0); return; } #endif } /* add bitmask for tcp only, some stupid udp programs * send a very few (< 10 ) packets before invite (mostly a 0x0a0x0d, but just search the first 3 payload_packets here */ if (packet->udp != NULL && flow->packet_counter < 20) { IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "need next packet.\n"); return; } #ifdef IPOQUE_PROTOCOL_STUN /* for STUN flows we need some more packets */ if (packet->udp != NULL && flow->detected_protocol_stack[0] == IPOQUE_PROTOCOL_STUN && flow->packet_counter < 40) { IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "need next STUN packet.\n"); return; } #endif if (payload_len == 4 && get_u32(packet_payload, 0) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "maybe sip. need next packet.\n"); return; } #ifdef IPOQUE_PROTOCOL_YAHOO if (payload_len > 30 && packet_payload[0] == 0x90 && packet_payload[3] == payload_len - 20 && get_u32(packet_payload, 4) == 0 && get_u32(packet_payload, 8) == 0) { flow->sip_yahoo_voice = 1; IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "maybe sip yahoo. need next packet.\n"); } if (flow->sip_yahoo_voice && flow->packet_counter < 10) { return; } #endif IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "exclude sip.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SIP); return; } void ipoque_search_sip(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; // struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_SIP, ipoque_struct, IPQ_LOG_DEBUG, "sip detection...\n"); /* skip marked packets */ if (packet->detected_protocol_stack[0] != IPOQUE_PROTOCOL_SIP) { if (packet->tcp_retransmission == 0) { ipoque_search_sip_handshake(ipoque_struct); } } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/pando.c0000644000000000000000000000655411661524573017637 0ustar rootroot/* * pando.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_PANDO static void ipoque_int_pando_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_PANDO, IPOQUE_REAL_PROTOCOL); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 search_pando(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; // struct ipoque_flow_struct *flow=ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->tcp != NULL) { if (packet->payload_packet_len == 63 && memcmp(&packet->payload[1], "Pando protocol", 14) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_PANDO, ipoque_struct, IPQ_LOG_DEBUG, "Pando download detected\n"); goto end_pando_found; } } else if (packet->udp != NULL) { if (packet->payload_packet_len > 20 && packet->payload_packet_len < 100 && packet->payload[0] == 0x00 && packet->payload[1] == 0x00 && packet->payload[2] == 0x00 && packet->payload[3] == 0x09 && packet->payload[4] == 0x00 && packet->payload[5] == 0x00) { // bypass the detection because one packet has at a specific place the word Pando in it if (packet->payload_packet_len == 87 && memcmp(&packet->payload[25], "Pando protocol", 14) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_PANDO, ipoque_struct, IPQ_LOG_DEBUG, "Pando UDP packet detected --> Pando in payload\n"); goto end_pando_found; } else if (packet->payload_packet_len == 92 && memcmp(&packet->payload[72], "Pando", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_PANDO, ipoque_struct, IPQ_LOG_DEBUG, "Pando UDP packet detected --> Pando in payload\n"); goto end_pando_found; } goto end_pando_maybe_found; } } goto end_pando_nothing_found; end_pando_found: ipoque_int_pando_add_connection(ipoque_struct); return 1; end_pando_maybe_found: return 2; end_pando_nothing_found: return 0; } void ipoque_search_pando_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct) { // struct ipoque_packet_struct *packet=&ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (search_pando(ipoque_struct) != 0) return; IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_PANDO); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/afp.c0000644000000000000000000000542011655273464017276 0ustar rootroot/* * afp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_AFP static void ipoque_int_afp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_AFP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_afp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src = ipoque_struct->src; // struct ipoque_id_struct *dst = ipoque_struct->dst; /* * this will detect the OpenSession command of the Data Stream Interface (DSI) protocol * which is exclusively used by the Apple Filing Protocol (AFP) on TCP/IP networks */ if (packet->payload_packet_len >= 22 && get_u16(packet->payload, 0) == htons(0x0004) && get_u16(packet->payload, 2) == htons(0x0001) && get_u32(packet->payload, 4) == 0 && get_u32(packet->payload, 8) == htonl(packet->payload_packet_len - 16) && get_u32(packet->payload, 12) == 0 && get_u16(packet->payload, 16) == htons(0x0104)) { IPQ_LOG(IPOQUE_PROTOCOL_AFP, ipoque_struct, IPQ_LOG_DEBUG, "AFP: DSI OpenSession detected.\n"); ipoque_int_afp_add_connection(ipoque_struct); return; } /* * detection of GetStatus command of DSI protocl */ if (packet->payload_packet_len >= 18 && get_u16(packet->payload, 0) == htons(0x0003) && get_u16(packet->payload, 2) == htons(0x0001) && get_u32(packet->payload, 4) == 0 && get_u32(packet->payload, 8) == htonl(packet->payload_packet_len - 16) && get_u32(packet->payload, 12) == 0 && get_u16(packet->payload, 16) == htons(0x0f00)) { IPQ_LOG(IPOQUE_PROTOCOL_AFP, ipoque_struct, IPQ_LOG_DEBUG, "AFP: DSI GetStatus detected.\n"); ipoque_int_afp_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_AFP, ipoque_struct, IPQ_LOG_DEBUG, "AFP excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_AFP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/telnet.c0000644000000000000000000000635011661524573020023 0ustar rootroot/* * telnet.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_TELNET static void ipoque_int_telnet_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_TELNET, IPOQUE_REAL_PROTOCOL); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 search_iac(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; u16 a; if (packet->payload_packet_len < 3) { return 0; } if (!(packet->payload[0] == 0xff && packet->payload[1] > 0xf9 && packet->payload[1] != 0xff && packet->payload[2] < 0x28)) { return 0; } a = 3; while (a < packet->payload_packet_len - 2) { // commands start with a 0xff byte followed by a command byte >= 0xf0 and < 0xff // command bytes 0xfb to 0xfe are followed by an option byte <= 0x28 if (!(packet->payload[a] != 0xff || (packet->payload[a] == 0xff && (packet->payload[a + 1] >= 0xf0) && (packet->payload[a + 1] <= 0xfa)) || (packet->payload[a] == 0xff && (packet->payload[a + 1] >= 0xfb) && (packet->payload[a + 1] != 0xff) && (packet->payload[a + 2] <= 0x28)))) { return 0; } a++; } return 1; } /* this detection also works asymmetrically */ void ipoque_search_telnet_tcp(struct ipoque_detection_module_struct *ipoque_struct) { // struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_TELNET, ipoque_struct, IPQ_LOG_DEBUG, "search telnet.\n"); if (search_iac(ipoque_struct) == 1) { if (flow->l4.tcp.telnet_stage == 2) { IPQ_LOG(IPOQUE_PROTOCOL_TELNET, ipoque_struct, IPQ_LOG_DEBUG, "telnet identified.\n"); ipoque_int_telnet_add_connection(ipoque_struct); return; } flow->l4.tcp.telnet_stage++; IPQ_LOG(IPOQUE_PROTOCOL_TELNET, ipoque_struct, IPQ_LOG_DEBUG, "telnet stage %u.\n", flow->l4.tcp.telnet_stage); return; } if ((flow->packet_counter < 12 && flow->l4.tcp.telnet_stage > 0) || flow->packet_counter < 6) { return; } else { IPQ_LOG(IPOQUE_PROTOCOL_TELNET, ipoque_struct, IPQ_LOG_DEBUG, "telnet excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_TELNET); } return; } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/bittorrent.c0000644000000000000000000003673411711362647020733 0ustar rootroot/* * bittorrent.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_BITTORRENT #define IPOQUE_PROTOCOL_UNSAFE_DETECTION 0 #define IPOQUE_PROTOCOL_SAFE_DETECTION 1 #define IPOQUE_PROTOCOL_PLAIN_DETECTION 0 #define IPOQUE_PROTOCOL_WEBSEED_DETECTION 2 static void ipoque_add_connection_as_bittorrent(struct ipoque_detection_module_struct *ipoque_struct, const u8 save_detection, const u8 encrypted_connection, ipoque_protocol_type_t protocol_type) { ipoque_int_change_protocol(ipoque_struct, IPOQUE_PROTOCOL_BITTORRENT, protocol_type); } static u8 ipoque_int_search_bittorrent_tcp_zero(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src = ipoque_struct->src; // struct ipoque_id_struct *dst = ipoque_struct->dst; u16 a = 0; if (packet->payload_packet_len == 1 && packet->payload[0] == 0x13) { /* reset stage back to 0 so we will see the next packet here too */ flow->bittorrent_stage = 0; return 0; } if (flow->packet_counter == 2 && packet->payload_packet_len > 20) { if (memcmp(&packet->payload[0], "BitTorrent protocol", 19) == 0) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "BT: plain BitTorrent protocol detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_PLAIN_DETECTION, IPOQUE_REAL_PROTOCOL); return 1; } } if (packet->payload_packet_len > 20) { /* test for match 0x13+"BitTorrent protocol" */ if (packet->payload[0] == 0x13) { if (memcmp(&packet->payload[1], "BitTorrent protocol", 19) == 0) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "BT: plain BitTorrent protocol detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_PLAIN_DETECTION, IPOQUE_REAL_PROTOCOL); return 1; } } } if (packet->payload_packet_len > 23 && memcmp(packet->payload, "GET /webseed?info_hash=", 23) == 0) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "BT: plain webseed BitTorrent protocol detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_WEBSEED_DETECTION, IPOQUE_CORRELATED_PROTOCOL); return 1; } /* seen Azureus as server for webseed, possibly other servers existing, to implement */ /* is Server: hypertracker Bittorrent? */ /* no asymmetric detection possible for answer of pattern "GET /data?fid=". */ if (packet->payload_packet_len > 60 && memcmp(packet->payload, "GET /data?fid=", 14) == 0 && memcmp(&packet->payload[54], "&size=", 6) == 0) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "BT: plain Bitcomet persistent seed protocol detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_WEBSEED_DETECTION, IPOQUE_CORRELATED_PROTOCOL); return 1; } if (packet->payload_packet_len > 90 && (memcmp(packet->payload, "GET ", 4) == 0 || memcmp(packet->payload, "POST ", 5) == 0)) { const u8 *ptr = &packet->payload[4]; u16 len = packet->payload_packet_len - 4; a = 0; /* parse complete get packet here into line structure elements */ ipq_parse_packet_line_info(ipoque_struct); /* answer to this pattern is HTTP....Server: hypertracker */ if (packet->user_agent_line.ptr != NULL && ((packet->user_agent_line.len > 8 && memcmp(packet->user_agent_line.ptr, "Azureus ", 8) == 0) || (packet->user_agent_line.len >= 10 && memcmp(packet->user_agent_line.ptr, "BitTorrent", 10) == 0) || (packet->user_agent_line.len >= 11 && memcmp(packet->user_agent_line.ptr, "BTWebClient", 11) == 0))) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "Azureus /Bittorrent user agent line detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_WEBSEED_DETECTION, IPOQUE_CORRELATED_PROTOCOL); return 1; } if (packet->user_agent_line.ptr != NULL && (packet->user_agent_line.len >= 9 && memcmp(packet->user_agent_line.ptr, "Shareaza ", 9) == 0) && (packet->parsed_lines > 8 && packet->line[8].ptr != 0 && packet->line[8].len >= 9 && memcmp(packet->line[8].ptr, "X-Queue: ", 9) == 0)) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "Bittorrent Shareaza detected.\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_WEBSEED_DETECTION, IPOQUE_CORRELATED_PROTOCOL); return 1; } /* this is a self built client, not possible to catch asymmetrically */ if ((packet->parsed_lines == 10 || (packet->parsed_lines == 11 && packet->line[11].len == 0)) && packet->user_agent_line.ptr != NULL && packet->user_agent_line.len > 12 && ipq_mem_cmp(packet->user_agent_line.ptr, "Mozilla/4.0 ", 12) == 0 && packet->host_line.ptr != NULL && packet->host_line.len >= 7 && packet->line[2].ptr != NULL && packet->line[2].len > 14 && ipq_mem_cmp(packet->line[2].ptr, "Keep-Alive: 300", 15) == 0 && packet->line[3].ptr != NULL && packet->line[3].len > 21 && ipq_mem_cmp(packet->line[3].ptr, "Connection: Keep-alive", 22) == 0 && packet->line[4].ptr != NULL && packet->line[4].len > 10 && (ipq_mem_cmp(packet->line[4].ptr, "Accpet: */*", 11) == 0 || ipq_mem_cmp(packet->line[4].ptr, "Accept: */*", 11) == 0) && packet->line[5].ptr != NULL && packet->line[5].len > 12 && ipq_mem_cmp(packet->line[5].ptr, "Range: bytes=", 13) == 0 && packet->line[7].ptr != NULL && packet->line[7].len > 15 && ipq_mem_cmp(packet->line[7].ptr, "Pragma: no-cache", 16) == 0 && packet->line[8].ptr != NULL && packet->line[8].len > 22 && ipq_mem_cmp(packet->line[8].ptr, "Cache-Control: no-cache", 23) == 0) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "Bitcomet LTS detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_UNSAFE_DETECTION, IPOQUE_PROTOCOL_PLAIN_DETECTION, IPOQUE_CORRELATED_PROTOCOL); return 1; } /* FlashGet pattern */ if (packet->parsed_lines == 8 && packet->user_agent_line.ptr != NULL && packet->user_agent_line.len > (sizeof("Mozilla/4.0 (compatible; MSIE 6.0;") - 1) && memcmp(packet->user_agent_line.ptr, "Mozilla/4.0 (compatible; MSIE 6.0;", sizeof("Mozilla/4.0 (compatible; MSIE 6.0;") - 1) == 0 && packet->host_line.ptr != NULL && packet->host_line.len >= 7 && packet->line[2].ptr != NULL && packet->line[2].len == 11 && memcmp(packet->line[2].ptr, "Accept: */*", 11) == 0 && packet->line[3].ptr != NULL && packet->line[3].len >= (sizeof("Referer: ") - 1) && ipq_mem_cmp(packet->line[3].ptr, "Referer: ", sizeof("Referer: ") - 1) == 0 && packet->line[5].ptr != NULL && packet->line[5].len > 13 && ipq_mem_cmp(packet->line[5].ptr, "Range: bytes=", 13) == 0 && packet->line[6].ptr != NULL && packet->line[6].len > 21 && ipq_mem_cmp(packet->line[6].ptr, "Connection: Keep-Alive", 22) == 0) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "FlashGet detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_UNSAFE_DETECTION, IPOQUE_PROTOCOL_PLAIN_DETECTION, IPOQUE_CORRELATED_PROTOCOL); return 1; } if (packet->parsed_lines == 7 && packet->user_agent_line.ptr != NULL && packet->user_agent_line.len > (sizeof("Mozilla/4.0 (compatible; MSIE 6.0;") - 1) && memcmp(packet->user_agent_line.ptr, "Mozilla/4.0 (compatible; MSIE 6.0;", sizeof("Mozilla/4.0 (compatible; MSIE 6.0;") - 1) == 0 && packet->host_line.ptr != NULL && packet->host_line.len >= 7 && packet->line[2].ptr != NULL && packet->line[2].len == 11 && memcmp(packet->line[2].ptr, "Accept: */*", 11) == 0 && packet->line[3].ptr != NULL && packet->line[3].len >= (sizeof("Referer: ") - 1) && ipq_mem_cmp(packet->line[3].ptr, "Referer: ", sizeof("Referer: ") - 1) == 0 && packet->line[5].ptr != NULL && packet->line[5].len > 21 && ipq_mem_cmp(packet->line[5].ptr, "Connection: Keep-Alive", 22) == 0) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "FlashGet detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_UNSAFE_DETECTION, IPOQUE_PROTOCOL_PLAIN_DETECTION, IPOQUE_CORRELATED_PROTOCOL); return 1; } /* answer to this pattern is not possible to implement asymmetrically */ while (1) { if (len < 50 || ptr[0] == 0x0d) { goto ipq_end_bt_tracker_check; } if (memcmp(ptr, "info_hash=", 10) == 0) { break; } len--; ptr++; } IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, " BT stat: tracker info hash found\n"); /* len is > 50, so save operation here */ len -= 10; ptr += 10; /* parse bt hash */ for (a = 0; a < 20; a++) { if (len < 3) { goto ipq_end_bt_tracker_check; } if (*ptr == '%') { u8 x1 = 0xFF; u8 x2 = 0xFF; if (ptr[1] >= '0' && ptr[1] <= '9') { x1 = ptr[1] - '0'; } if (ptr[1] >= 'a' && ptr[1] <= 'f') { x1 = 10 + ptr[1] - 'a'; } if (ptr[1] >= 'A' && ptr[1] <= 'F') { x1 = 10 + ptr[1] - 'A'; } if (ptr[2] >= '0' && ptr[2] <= '9') { x2 = ptr[2] - '0'; } if (ptr[2] >= 'a' && ptr[2] <= 'f') { x2 = 10 + ptr[2] - 'a'; } if (ptr[2] >= 'A' && ptr[2] <= 'F') { x2 = 10 + ptr[2] - 'A'; } if (x1 == 0xFF || x2 == 0xFF) { goto ipq_end_bt_tracker_check; } ptr += 3; len -= 3; } else if (*ptr >= 32 && *ptr < 127) { ptr++; len--; } else { goto ipq_end_bt_tracker_check; } } IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, " BT stat: tracker info hash parsed\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_PLAIN_DETECTION, IPOQUE_CORRELATED_PROTOCOL); return 1; } ipq_end_bt_tracker_check: if (packet->payload_packet_len == 80) { /* Warez 80 Bytes Packet * +----------------+---------------+-----------------+-----------------+ * |20 BytesPattern | 32 Bytes Value| 12 BytesPattern | 16 Bytes Data | * +----------------+---------------+-----------------+-----------------+ * 20 BytesPattern : 4c 00 00 00 ff ff ff ff 57 00 00 00 00 00 00 00 20 00 00 00 * 12 BytesPattern : 28 23 00 00 01 00 00 00 10 00 00 00 * */ static const char pattern_20_bytes[20] = { 0x4c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00 }; static const char pattern_12_bytes[12] = { 0x28, 0x23, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 }; /* did not see this pattern anywhere */ if ((memcmp(&packet->payload[0], pattern_20_bytes, 20) == 0) && (memcmp(&packet->payload[52], pattern_12_bytes, 12) == 0)) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "BT: Warez - Plain BitTorrent protocol detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_PLAIN_DETECTION, IPOQUE_REAL_PROTOCOL); return 1; } } else if (packet->payload_packet_len > 50) { if (memcmp(packet->payload, "GET", 3) == 0) { ipq_parse_packet_line_info(ipoque_struct); /* haven't fount this pattern anywhere */ if (packet->host_line.ptr != NULL && packet->host_line.len >= 9 && memcmp(packet->host_line.ptr, "ip2p.com:", 9) == 0) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "BT: Warez - Plain BitTorrent protocol detected due to Host: ip2p.com: pattern\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_WEBSEED_DETECTION, IPOQUE_CORRELATED_PROTOCOL); return 1; } } } return 0; } /*Search for BitTorrent commands*/ static void ipoque_int_search_bittorrent_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; if (packet->payload_packet_len == 0) { return; } if (flow->bittorrent_stage == 0 && packet->payload_packet_len != 0) { /* exclude stage 0 detection from next run */ flow->bittorrent_stage = 1; if (ipoque_int_search_bittorrent_tcp_zero(ipoque_struct) != 0) { IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_DEBUG, "stage 0 has detected something, returning\n"); return; } IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_DEBUG, "stage 0 has no direct detection, fall through\n"); } return; } void ipoque_search_bittorrent(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->detected_protocol_stack[0] != IPOQUE_PROTOCOL_BITTORRENT) { /* check for tcp retransmission here */ if ((packet->tcp != NULL) && (packet->tcp_retransmission == 0 || packet->num_retried_bytes)) { ipoque_int_search_bittorrent_tcp(ipoque_struct); } #ifdef HAVE_NTOP else if(packet->udp != NULL) { struct ipoque_flow_struct *flow = ipoque_struct->flow; flow->bittorrent_stage++; if(flow->bittorrent_stage < 10) { if(packet->payload_packet_len > 19 /* min size */) { char *begin; if(ntop_strnstr(packet->payload, ":target20:", packet->payload_packet_len) || ntop_strnstr(packet->payload, ":find_node1:", packet->payload_packet_len) || ntop_strnstr(packet->payload, "d1:ad2:id20:", packet->payload_packet_len)) { bittorrent_found: IPQ_LOG_BITTORRENT(IPOQUE_PROTOCOL_BITTORRENT, ipoque_struct, IPQ_LOG_TRACE, "BT: plain BitTorrent protocol detected\n"); ipoque_add_connection_as_bittorrent(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_PLAIN_DETECTION, IPOQUE_REAL_PROTOCOL); return; } else if((begin = memchr(packet->payload, 'B', packet->payload_packet_len-19)) != NULL) { u_long offset = (u_long)begin - (u_long)packet->payload; if((packet->payload_packet_len-19) > offset) { if(memcmp(begin, "BitTorrent protocol", 19) == 0) { goto bittorrent_found; } } } } return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_BITTORRENT); } #endif } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/meebo.c0000644000000000000000000001472411655273464017626 0ustar rootroot/* * meebo.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_MEEBO static void ipoque_int_meebo_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MEEBO, IPOQUE_CORRELATED_PROTOCOL); } void ipoque_search_meebo(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "search meebo.\n"); /* catch audio/video flows which are flash (rtmp) */ if ( #ifdef IPOQUE_PROTOCOL_FLASH packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_FLASH #else (packet->tcp->source == htons(1935) || packet->tcp->dest == htons(1935)) #endif ) { /* TODO: once we have an amf decoder we can more directly access the rtmp fields * if so, we may also exclude earlier */ if (packet->payload_packet_len > 900) { if (memcmp(packet->payload + 116, "tokbox/", IPQ_STATICSTRING_LEN("tokbox/")) == 0 || memcmp(packet->payload + 316, "tokbox/", IPQ_STATICSTRING_LEN("tokbox/")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "found meebo/tokbox flash flow.\n"); ipoque_int_meebo_add_connection(ipoque_struct); return; } } if (flow->packet_counter < 16 && flow->packet_direction_counter[flow->setup_packet_direction] < 6) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "need next packet.\n"); return; } IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "exclude meebo.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MEEBO); return; } if (( #ifdef IPOQUE_PROTOCOL_HTTP packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP || #endif ((packet->payload_packet_len > 3 && memcmp(packet->payload, "GET ", 4) == 0) || (packet->payload_packet_len > 4 && memcmp(packet->payload, "POST ", 5) == 0)) ) && flow->packet_counter == 1) { u8 host_or_referer_match = 0; ipq_parse_packet_line_info(ipoque_struct); if (packet->host_line.ptr != NULL && packet->host_line.len >= 9 && memcmp(&packet->host_line.ptr[packet->host_line.len - 9], "meebo.com", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "Found Meebo host\n"); host_or_referer_match = 1; } else if (packet->host_line.ptr != NULL && packet->host_line.len >= 10 && memcmp(&packet->host_line.ptr[packet->host_line.len - 10], "tokbox.com", 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "Found tokbox host\n"); /* set it to 2 to avoid having plain tokbox traffic detected as meebo */ host_or_referer_match = 2; } else if (packet->host_line.ptr != NULL && packet->host_line.len >= IPQ_STATICSTRING_LEN("74.114.28.110") && memcmp(&packet->host_line.ptr[packet->host_line.len - IPQ_STATICSTRING_LEN("74.114.28.110")], "74.114.28.110", IPQ_STATICSTRING_LEN("74.114.28.110")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "Found meebo IP\n"); host_or_referer_match = 1; } else if (packet->referer_line.ptr != NULL && packet->referer_line.len >= IPQ_STATICSTRING_LEN("http://www.meebo.com/") && memcmp(packet->referer_line.ptr, "http://www.meebo.com/", IPQ_STATICSTRING_LEN("http://www.meebo.com/")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "Found meebo referer\n"); host_or_referer_match = 1; } else if (packet->referer_line.ptr != NULL && packet->referer_line.len >= IPQ_STATICSTRING_LEN("http://mee.tokbox.com/") && memcmp(packet->referer_line.ptr, "http://mee.tokbox.com/", IPQ_STATICSTRING_LEN("http://mee.tokbox.com/")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "Found tokbox referer\n"); host_or_referer_match = 1; } else if (packet->referer_line.ptr != NULL && packet->referer_line.len >= IPQ_STATICSTRING_LEN("http://74.114.28.110/") && memcmp(packet->referer_line.ptr, "http://74.114.28.110/", IPQ_STATICSTRING_LEN("http://74.114.28.110/")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "Found meebo IP referer\n"); host_or_referer_match = 1; } if (host_or_referer_match) { if (host_or_referer_match == 1) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "Found Meebo traffic based on host/referer\n"); ipoque_int_meebo_add_connection(ipoque_struct); return; } } } if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_MEEBO) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "in case that ssl meebo has been detected return.\n"); return; } if (flow->packet_counter < 5 && packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SSL) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "ssl not yet excluded. need next packet.\n"); return; } #ifdef IPOQUE_PROTOCOL_FLASH if (flow->packet_counter < 5 && packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN && !IPQ_FLOW_PROTOCOL_EXCLUDED(ipoque_struct, flow, IPOQUE_PROTOCOL_FLASH)) { IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "flash not yet excluded. need next packet.\n"); return; } #endif IPQ_LOG(IPOQUE_PROTOCOL_MEEBO, ipoque_struct, IPQ_LOG_DEBUG, "exclude meebo.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MEEBO); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/jabber.c0000644000000000000000000003054311655273464017761 0ustar rootroot/* * jabber.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_UNENCRYPED_JABBER static void ipoque_int_jabber_add_connection(struct ipoque_detection_module_struct *ipoque_struct, u32 protocol, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, protocol, protocol_type); } static void check_content_type_and_change_protocol(struct ipoque_detection_module_struct *ipoque_struct, u16 x) { #if defined( IPOQUE_PROTOCOL_TANGO ) || defined( IPOQUE_PROTOCOL_TRUPHONE ) || defined( IPOQUE_PROTOCOL_WHATSAPP ) struct ipoque_packet_struct *packet = &ipoque_struct->packet; #endif #ifdef IPOQUE_PROTOCOL_TRUPHONE if (packet->payload_packet_len > x + 18 && packet->payload_packet_len > x && packet->payload_packet_len > 18) { const u16 lastlen = packet->payload_packet_len - 18; for (x = 0; x < lastlen; x++) { if (ipq_mem_cmp(&packet->payload[x], "=\"im.truphone.com\"", 18) == 0 || ipq_mem_cmp(&packet->payload[x], "='im.truphone.com'", 18) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_TRACE, "changed to TRUPHONE.\n"); ipoque_int_jabber_add_connection(ipoque_struct, IPOQUE_PROTOCOL_TRUPHONE, IPOQUE_CORRELATED_PROTOCOL); } } } #endif return; } void ipoque_search_jabber_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; u16 x; IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "search jabber.\n"); /* search for jabber file transfer */ /* this part is working asymmetrically */ if (packet->tcp != NULL && packet->tcp->syn != 0 && packet->payload_packet_len == 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "check jabber syn\n"); if (src != NULL && src->jabber_file_transfer_port[0] != 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "src jabber ft port set, ports are: %u, %u\n", ntohs(src->jabber_file_transfer_port[0]), ntohs(src->jabber_file_transfer_port[1])); if (((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->jabber_stun_or_ft_ts)) >= ipoque_struct->jabber_file_transfer_timeout) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "JABBER src stun timeout %u %u\n", src->jabber_stun_or_ft_ts, packet->tick_timestamp); src->jabber_file_transfer_port[0] = 0; src->jabber_file_transfer_port[1] = 0; } else if (src->jabber_file_transfer_port[0] == packet->tcp->dest || src->jabber_file_transfer_port[0] == packet->tcp->source || src->jabber_file_transfer_port[1] == packet->tcp->dest || src->jabber_file_transfer_port[1] == packet->tcp->source) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "found jabber file transfer.\n"); ipoque_int_jabber_add_connection(ipoque_struct, IPOQUE_PROTOCOL_UNENCRYPED_JABBER, IPOQUE_CORRELATED_PROTOCOL); } } if (dst != NULL && dst->jabber_file_transfer_port[0] != 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "dst jabber ft port set, ports are: %u, %u\n", ntohs(dst->jabber_file_transfer_port[0]), ntohs(dst->jabber_file_transfer_port[1])); if (((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->jabber_stun_or_ft_ts)) >= ipoque_struct->jabber_file_transfer_timeout) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "JABBER dst stun timeout %u %u\n", dst->jabber_stun_or_ft_ts, packet->tick_timestamp); dst->jabber_file_transfer_port[0] = 0; dst->jabber_file_transfer_port[1] = 0; } else if (dst->jabber_file_transfer_port[0] == packet->tcp->dest || dst->jabber_file_transfer_port[0] == packet->tcp->source || dst->jabber_file_transfer_port[1] == packet->tcp->dest || dst->jabber_file_transfer_port[1] == packet->tcp->source) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "found jabber file transfer.\n"); ipoque_int_jabber_add_connection(ipoque_struct, IPOQUE_PROTOCOL_UNENCRYPED_JABBER, IPOQUE_CORRELATED_PROTOCOL); } } return; } if (packet->tcp != 0 && packet->payload_packet_len == 0) { return; } /* this part parses a packet and searches for port=. it works asymmetrically. */ if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNENCRYPED_JABBER) { u16 lastlen; u16 j_port = 0; /* check for google jabber voip connections ... */ /* need big packet */ if (packet->payload_packet_len < 100) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "packet too small, return.\n"); return; } /* need message to or type for file-transfer */ if (memcmp(packet->payload, "payload, "payload_packet_len - 11; for (x = 10; x < lastlen; x++) { if (packet->payload[x] == 'p') { if (ipq_mem_cmp(&packet->payload[x], "port=", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "port=\n"); if (src != NULL) { src->jabber_stun_or_ft_ts = packet->tick_timestamp; } if (dst != NULL) { dst->jabber_stun_or_ft_ts = packet->tick_timestamp; } x += 6; j_port = ntohs_ipq_bytestream_to_number(&packet->payload[x], packet->payload_packet_len, &x); IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "JABBER port : %u\n", ntohs(j_port)); if (src != NULL) { if (src->jabber_file_transfer_port[0] == 0 || src->jabber_file_transfer_port[0] == j_port) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "src->jabber_file_transfer_port[0] = j_port = %u;\n", ntohs(j_port)); src->jabber_file_transfer_port[0] = j_port; } else { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "src->jabber_file_transfer_port[1] = j_port = %u;\n", ntohs(j_port)); src->jabber_file_transfer_port[1] = j_port; } } if (dst != NULL) { if (dst->jabber_file_transfer_port[0] == 0 || dst->jabber_file_transfer_port[0] == j_port) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "dst->jabber_file_transfer_port[0] = j_port = %u;\n", ntohs(j_port)); dst->jabber_file_transfer_port[0] = j_port; } else { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "dst->jabber_file_transfer_port[1] = j_port = %u;\n", ntohs(j_port)); dst->jabber_file_transfer_port[1] = j_port; } } } } } } else if (memcmp(packet->payload, "payload, "payload, "payload_packet_len - 21; for (x = 8; x < lastlen; x++) { /* invalid character */ if (packet->payload[x] < 32 || packet->payload[x] > 127) { return; } if (packet->payload[x] == '@') { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "JABBER @\n"); break; } } if (x >= lastlen) { return; } lastlen = packet->payload_packet_len - 10; for (; x < lastlen; x++) { if (packet->payload[x] == 'p') { if (ipq_mem_cmp(&packet->payload[x], "port=", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "port=\n"); if (src != NULL) { src->jabber_stun_or_ft_ts = packet->tick_timestamp; } if (dst != NULL) { dst->jabber_stun_or_ft_ts = packet->tick_timestamp; } x += 6; j_port = ntohs_ipq_bytestream_to_number(&packet->payload[x], packet->payload_packet_len, &x); IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "JABBER port : %u\n", ntohs(j_port)); if (src != NULL && src->jabber_voice_stun_used_ports < JABBER_MAX_STUN_PORTS - 1) { if (packet->payload[5] == 'o') { src->jabber_voice_stun_port[src->jabber_voice_stun_used_ports++] = j_port; } else { if (src->jabber_file_transfer_port[0] == 0 || src->jabber_file_transfer_port[0] == j_port) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "src->jabber_file_transfer_port[0] = j_port = %u;\n", ntohs(j_port)); src->jabber_file_transfer_port[0] = j_port; } else { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "src->jabber_file_transfer_port[1] = j_port = %u;\n", ntohs(j_port)); src->jabber_file_transfer_port[1] = j_port; } } } if (dst != NULL && dst->jabber_voice_stun_used_ports < JABBER_MAX_STUN_PORTS - 1) { if (packet->payload[5] == 'o') { dst->jabber_voice_stun_port[dst->jabber_voice_stun_used_ports++] = j_port; } else { if (dst->jabber_file_transfer_port[0] == 0 || dst->jabber_file_transfer_port[0] == j_port) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "dst->jabber_file_transfer_port[0] = j_port = %u;\n", ntohs(j_port)); dst->jabber_file_transfer_port[0] = j_port; } else { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "dst->jabber_file_transfer_port[1] = j_port = %u;\n", ntohs(j_port)); dst->jabber_file_transfer_port[1] = j_port; } } } return; } } } } return; } /* search for jabber here */ /* this part is working asymmetrically */ if ((packet->payload_packet_len > 13 && memcmp(packet->payload, "payload_packet_len >= IPQ_STATICSTRING_LEN("payload, "payload_packet_len > 47) { const u16 lastlen = packet->payload_packet_len - 47; for (x = 0; x < lastlen; x++) { if (ipq_mem_cmp (&packet->payload[x], "xmlns:stream='http://etherx.jabber.org/streams'", 47) == 0 || ipq_mem_cmp(&packet->payload[x], "xmlns:stream=\"http://etherx.jabber.org/streams\"", 47) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_TRACE, "found JABBER.\n"); x += 47; ipoque_int_jabber_add_connection(ipoque_struct, IPOQUE_PROTOCOL_UNENCRYPED_JABBER, IPOQUE_REAL_PROTOCOL); /* search for other protocols: Truphone */ check_content_type_and_change_protocol(ipoque_struct, x); return; } } } } if (flow->packet_counter < 3) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_TRACE, "packet_counter: %u\n", flow->packet_counter); return; } IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "Excluding jabber connection\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_UNENCRYPED_JABBER); #ifdef IPOQUE_PROTOCOL_TRUPHONE IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_TRUPHONE); #endif } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/quake.c0000644000000000000000000000676011655273464017646 0ustar rootroot/* * quake.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_QUAKE static void ipoque_int_quake_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_QUAKE, IPOQUE_REAL_PROTOCOL); } void ipoque_search_quake(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if ((packet->payload_packet_len == 14 && get_u16(packet->payload, 0) == 0xffff && ipq_mem_cmp(&packet->payload[2], "getInfo", 7) == 0) || (packet->payload_packet_len == 17 && get_u16(packet->payload, 0) == 0xffff && ipq_mem_cmp(&packet->payload[2], "challenge", 9) == 0) || (packet->payload_packet_len > 20 && packet->payload_packet_len < 30 && get_u16(packet->payload, 0) == 0xffff && ipq_mem_cmp(&packet->payload[2], "getServers", 10) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_QUAKE, ipoque_struct, IPQ_LOG_DEBUG, "Quake IV detected.\n"); ipoque_int_quake_add_connection(ipoque_struct); return; } /* Quake III/Quake Live */ if (packet->payload_packet_len == 15 && get_u32(packet->payload, 0) == 0xffffffff && memcmp(&packet->payload[4], "getinfo", IPQ_STATICSTRING_LEN("getinfo")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_QUAKE, ipoque_struct, IPQ_LOG_DEBUG, "Quake III Arena/Quake Live detected.\n"); ipoque_int_quake_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 16 && get_u32(packet->payload, 0) == 0xffffffff && memcmp(&packet->payload[4], "getchallenge", IPQ_STATICSTRING_LEN("getchallenge")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_QUAKE, ipoque_struct, IPQ_LOG_DEBUG, "Quake III Arena/Quake Live detected.\n"); ipoque_int_quake_add_connection(ipoque_struct); return; } if (packet->payload_packet_len > 20 && packet->payload_packet_len < 30 && get_u32(packet->payload, 0) == 0xffffffff && memcmp(&packet->payload[4], "getservers", IPQ_STATICSTRING_LEN("getservers")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_QUAKE, ipoque_struct, IPQ_LOG_DEBUG, "Quake III Arena/Quake Live detected.\n"); ipoque_int_quake_add_connection(ipoque_struct); return; } /* ports for startup packet: Quake I 26000 (starts with 0x8000) Quake II 27910 Quake III 27960 (increases with each player) Quake IV 27650 Quake World 27500 Quake Wars ????? */ IPQ_LOG(IPOQUE_PROTOCOL_QUAKE, ipoque_struct, IPQ_LOG_DEBUG, "Quake excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_QUAKE); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/gadu_gadu.c0000644000000000000000000004135211655273464020454 0ustar rootroot/* * gadu_gadu.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_GADUGADU static void ipoque_int_gadugadu_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_GADUGADU, protocol_type); } static void parse_gg_foneno(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; u16 pos = 18; IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: parse_gg_foneno.\n"); if (packet->payload_packet_len < 19) { return; } while (packet->payload[pos] != '?') { pos++; if ((pos + 18) > packet->payload_packet_len) return; } pos++; if (pos + 16 < packet->payload_packet_len) { char fmnumber[8]; int i = 0; if (memcmp(&packet->payload[pos], "fmnumber=", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: fmnumber found .\n"); } else return; pos += 9; while (packet->payload[pos] != '&') { fmnumber[i] = packet->payload[pos]; i++; pos++; if (pos > packet->payload_packet_len || i > 7) break; } if (i < 8) { fmnumber[i] = '\0'; if (src != NULL) { memcpy(src->gg_fmnumber, fmnumber, i); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: fmnumber %s\n", src->gg_fmnumber); } } } } static u8 check_for_gadugadu_payload_pattern(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: check for 0xbebadec0 pattern in payload.\n"); if (packet->payload_packet_len == 12) { if ((flow->packet_counter == 1) && (ntohl(get_u32(packet->payload, 0)) == 0xbebadec0)) { flow->l4.tcp.gadugadu_stage++; return 1; } if ((flow->l4.tcp.gadugadu_stage == 1) && (flow->packet_counter == 2) && (ntohl(get_u32(packet->payload, 0)) == 0xbebadec0)) { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: gadugadu pattern bebadec0 FOUND \n"); ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return 1; } } return 0; } static u8 check_for_http(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: check for http.\n"); if (packet->payload_packet_len < 50) { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: Packet too small.\n"); return 0; } else if (memcmp(packet->payload, "GET /appsvc/appmsg", 18) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: GET FOUND\n"); parse_gg_foneno(ipoque_struct); // parse packet ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines <= 1) { return 0; } if (packet->host_line.ptr == NULL) { return 0; } if (!(packet->host_line.len >= 19 && memcmp(packet->host_line.ptr, "appmsg.gadu-gadu.pl", 19) == 0)) { return 0; } IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: Is gadugadu host FOUND %s\n", packet->host_line.ptr); ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } else if (memcmp(packet->payload, "POST /send/message/", 15) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: GET FOUND\n"); // parse packet ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines <= 1) { return 0; } if (packet->host_line.ptr == NULL) { return 0; } if (!(packet->host_line.len >= 17 && memcmp(packet->host_line.ptr, "life.gadu-gadu.pl", 17) == 0)) { return 0; } IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: Is gadugadu post FOUND %s\n", packet->host_line.ptr); ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } else if (memcmp(packet->payload, "GET /rotate_token", 17) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: GET FOUND\n"); // parse packet ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines <= 1) { return 0; } if (packet->host_line.ptr == NULL) { return 0; } if (!(packet->host_line.len >= 13 && memcmp(packet->host_line.ptr, "sms.orange.pl", 13) == 0)) { return 0; } IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: gadugadu sms FOUND %s\n", packet->host_line.ptr); ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } else if ((memcmp(packet->payload, "GET /nowosci.xml", IPQ_STATICSTRING_LEN("GET /nowosci.xml")) == 0) || (memcmp(packet->payload, "GET /gadu-gadu.xml", IPQ_STATICSTRING_LEN("GET /gadu-gadu.xml")) == 0) || (memcmp(packet->payload, "POST /access_token", IPQ_STATICSTRING_LEN("POST /access_token")) == 0)) { ipq_parse_packet_line_info(ipoque_struct); if (packet->user_agent_line.ptr == NULL) { return 0; } if (!(packet->user_agent_line.len >= IPQ_STATICSTRING_LEN("Gadu-Gadu Client") && memcmp(packet->user_agent_line.ptr, "Gadu-Gadu Client", IPQ_STATICSTRING_LEN("Gadu-Gadu Client")) == 0)) { return 0; } IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: gadugadu FOUND %s\n", packet->user_agent_line.ptr); ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } return 1; } static void ipoque_search_gadugadu_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_GADUGADU) { if (src != NULL) src->gg_timeout = packet->tick_timestamp; if (dst != NULL) dst->gg_timeout = packet->tick_timestamp; if (packet->payload_packet_len == 311) { if (packet->payload[28] != 0) { if (src != NULL) { src->gg_timeout = packet->tick_timestamp; if (ntohs(packet->tcp->dest) == 8074 || ntohs(packet->tcp->dest) == 443) src->gadu_gadu_ft_direction = 0; else src->gadu_gadu_ft_direction = 1; src->gadu_gadu_voice = 0; } if (dst != NULL) { dst->gg_timeout = packet->tick_timestamp; if (ntohs(packet->tcp->dest) == 8074 || ntohs(packet->tcp->dest) == 443) dst->gadu_gadu_ft_direction = 0; else dst->gadu_gadu_ft_direction = 1; dst->gadu_gadu_voice = 0; } IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "gg filetransfer setup detected\n"); } else { if (src != NULL) { src->gadu_gadu_voice = 1; src->gg_timeout = packet->tick_timestamp; } if (dst != NULL) { dst->gadu_gadu_voice = 1; dst->gg_timeout = packet->tick_timestamp; } IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "gg voice setup detected \n"); } } return; } #ifdef IPOQUE_PROTOCOL_HTTP if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP) { #endif IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: HTTP CHECK FOUND\n"); if (packet->tcp != NULL && ntohs(packet->tcp->dest) == 80) if (check_for_http(ipoque_struct)) return; #ifdef IPOQUE_PROTOCOL_HTTP } #endif /* the following code is implemented asymmetrically. */ if (packet->tcp != NULL && (ntohs(packet->tcp->dest) == 443 || ntohs(packet->tcp->dest) == 8074 || ntohs(packet->tcp->source) == 443 || ntohs(packet->tcp->source) == 8074)) { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: found port 8074 or 443.\n"); if (flow->packet_counter <= 6) { if ((packet->payload_packet_len == 9 || packet->payload_packet_len == 12 || packet->payload_packet_len == 100 || (packet->payload_packet_len > 190 && packet->payload_packet_len < 210) ) && get_l32(packet->payload, 4) == packet->payload_packet_len - 8 && (ntohl(get_u32(packet->payload, 0)) == 0x01000000 || ntohl(get_u32(packet->payload, 0)) == 0x02000000 || ntohl(get_u32(packet->payload, 0)) == 0x03000000 || ntohl(get_u32(packet->payload, 0)) == 0x12000000 || ntohl(get_u32(packet->payload, 0)) == 0x19000000 || ntohl(get_u32(packet->payload, 0)) == 0x31000000 || ntohl(get_u32(packet->payload, 0)) == 0x35000000 || ntohl(get_u32(packet->payload, 0)) == 0x10000000 || ntohl(get_u32(packet->payload, 0)) == 0x15000000)) { flow->l4.tcp.gadugadu_stage++; IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: len=9,12,100,190-210, stage++.\n"); } /*detection of mirinda client .this has a different way of communicating ports */ if (packet->payload_packet_len == 114 && ntohl(get_u32(packet->payload, 0)) == 0x19000000 && get_l32(packet->payload, 4) == packet->payload_packet_len - 8) { flow->l4.tcp.gadugadu_stage++; IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: len=114, stage++.\n"); /* here the asymmetric implementation ends */ if (flow->l4.tcp.gadugadu_stage == 2) { if (src != NULL) { memcpy(src->gg_call_id[src->gg_next_id], &packet->payload[8], 4); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "call id parsed %d\n", packet->payload[8]); src->gg_ft_ip_address = get_u32(packet->payload, 86); src->gg_ft_port = htons(get_u16(packet->payload, 90)); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "mirinda file transfer port %d \n", ntohs(src->gg_ft_port)); } if (dst != NULL) { memcpy(dst->gg_call_id[dst->gg_next_id], &packet->payload[8], 4); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "call id parsed %d\n", packet->payload[8]); dst->gg_ft_ip_address = get_u32(packet->payload, 86); dst->gg_ft_port = htons(get_u16(packet->payload, 90)); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "mirinda file transfer port %d \n", ntohs(dst->gg_ft_port)); } } } if (flow->l4.tcp.gadugadu_stage == 2) { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "Gadu-Gadu: add connection.\n"); ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); } return; } } /*mirinda file detection */ if (packet->tcp != NULL && src != NULL) { if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK (src->detected_protocol_bitmask, IPOQUE_PROTOCOL_GADUGADU) != 0 && ((src->gg_ft_ip_address == packet->iph->saddr && src->gg_ft_port == packet->tcp->source) || (src->gg_ft_ip_address == packet->iph->daddr && src->gg_ft_port == packet->tcp->dest))) { if ((packet->tick_timestamp - src->gg_timeout) < ipoque_struct->gadugadu_peer_connection_timeout) { ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "file transfer detected %d\n", ntohs(packet->tcp->dest)); return; } else { src->gg_ft_ip_address = 0; src->gg_ft_port = 0; } } else if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK (src->detected_protocol_bitmask, IPOQUE_PROTOCOL_GADUGADU) != 0 && (packet->tcp->dest == htons(80) || packet->tcp->source == htons(80)) && packet->payload_packet_len == 12 && (memcmp(src->gg_call_id[0], &packet->payload[5], 4) == 0 || (src->gg_call_id[1][0] && (memcmp(src->gg_call_id[1], &packet->payload[5], 4) == 0)))) { if ((packet->tick_timestamp - src->gg_timeout) < ipoque_struct->gadugadu_peer_connection_timeout) { ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "http file transfer detetced \n"); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "http file transfer timeout \n"); } } else if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK (src->detected_protocol_bitmask, IPOQUE_PROTOCOL_GADUGADU) != 0 && packet->payload_packet_len == 8 && (memcmp(src->gg_call_id[0], &packet->payload[0], 4) == 0 || (src->gg_call_id[1][0] && (memcmp (src->gg_call_id[1], &packet->payload[0], 4) == 0)))) { if ((packet->tick_timestamp - src->gg_timeout) < ipoque_struct->gadugadu_peer_connection_timeout) { ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "file transfer detetced %d\n", htons(packet->tcp->dest)); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, " file transfer timeout \n"); } } } if (packet->tcp != NULL && dst != NULL) { if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK (dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_GADUGADU) != 0 && ((dst->gg_ft_ip_address == packet->iph->saddr && dst->gg_ft_port == packet->tcp->source) || (dst->gg_ft_ip_address == packet->iph->daddr && dst->gg_ft_port == packet->tcp->dest))) { if ((packet->tick_timestamp - dst->gg_timeout) < ipoque_struct->gadugadu_peer_connection_timeout) { ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "file transfer detected %d\n", ntohs(packet->tcp->dest)); return; } else { dst->gg_ft_ip_address = 0; dst->gg_ft_port = 0; } } else if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK (dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_GADUGADU) != 0 && (packet->tcp->dest == htons(80) || packet->tcp->source == htons(80)) && packet->payload_packet_len == 12 && (memcmp(dst->gg_call_id[0], &packet->payload[0], 4) == 0 || (dst->gg_call_id[1][0] && (memcmp(dst->gg_call_id[1], &packet->payload[0], 4) == 0)))) { if ((packet->tick_timestamp - dst->gg_timeout) < ipoque_struct->gadugadu_peer_connection_timeout) { ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "http file transfer detetced \n"); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "http file transfer timeout \n"); } } else if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK (dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_GADUGADU) != 0 && packet->payload_packet_len == 8 && (memcmp(dst->gg_call_id[0], &packet->payload[0], 4) == 0 || (dst->gg_call_id[1][0] && (memcmp (dst->gg_call_id[1], &packet->payload[0], 4) == 0)))) { if ((packet->tick_timestamp - dst->gg_timeout) < ipoque_struct->gadugadu_peer_connection_timeout) { ipoque_int_gadugadu_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, "file transfer detected %d\n", ntohs(packet->tcp->dest)); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_GADUGADU, ipoque_struct, IPQ_LOG_DEBUG, " file transfer timeout \n"); } } } /** newly added start **/ if (packet->tcp != NULL && ((ntohs(packet->tcp->dest) == 80) || (ntohs(packet->tcp->source) == 80))) { if (check_for_gadugadu_payload_pattern(ipoque_struct)) { return; } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_GADUGADU); } void ipoque_search_gadugadu(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_search_gadugadu_tcp(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/gnutella.c0000644000000000000000000004232011655273464020343 0ustar rootroot/* * gnutella.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_GNUTELLA static void ipoque_int_gnutella_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_GNUTELLA, protocol_type); if (src != NULL) { src->gnutella_ts = packet->tick_timestamp; if (packet->udp != NULL) { if (!src->detected_gnutella_udp_port1) { src->detected_gnutella_udp_port1 = (packet->udp->source); IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "GNUTELLA UDP PORT1 DETECTED as %u\n", src->detected_gnutella_udp_port1); } else if ((ntohs(packet->udp->source) != src->detected_gnutella_udp_port1) && !src->detected_gnutella_udp_port2) { src->detected_gnutella_udp_port2 = (packet->udp->source); IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "GNUTELLA UDP PORT2 DETECTED as %u\n", src->detected_gnutella_udp_port2); } } } if (dst != NULL) { dst->gnutella_ts = packet->tick_timestamp; } } void ipoque_search_gnutella(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; u16 c; if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_GNUTELLA) { if (src != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->gnutella_ts) < ipoque_struct->gnutella_timeout)) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "gnutella : save src connection packet detected\n"); src->gnutella_ts = packet->tick_timestamp; } else if (dst != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->gnutella_ts) < ipoque_struct->gnutella_timeout)) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "gnutella : save dst connection packet detected\n"); dst->gnutella_ts = packet->tick_timestamp; } if (src != NULL && (packet->tick_timestamp - src->gnutella_ts) > ipoque_struct->gnutella_timeout) { src->detected_gnutella_udp_port1 = 0; src->detected_gnutella_udp_port2 = 0; } if (dst != NULL && (packet->tick_timestamp - dst->gnutella_ts) > ipoque_struct->gnutella_timeout) { dst->detected_gnutella_udp_port1 = 0; dst->detected_gnutella_udp_port2 = 0; } return; } /* skip packets without payload */ if (packet->payload_packet_len < 2) { return; } if (packet->tcp != NULL) { /* this case works asymmetrically */ if (packet->payload_packet_len > 10 && memcmp(packet->payload, "GNUTELLA/", 9) == 0) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "GNUTELLA DETECTED\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } /* this case works asymmetrically */ if (packet->payload_packet_len > 17 && memcmp(packet->payload, "GNUTELLA CONNECT/", 17) == 0) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "GNUTELLA DETECTED\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len > 50 && ((memcmp(packet->payload, "GET /get/", 9) == 0) || (memcmp(packet->payload, "GET /uri-res/", 13) == 0) )) { ipq_parse_packet_line_info(ipoque_struct); for (c = 0; c < packet->parsed_lines; c++) { if ((packet->line[c].len > 19 && memcmp(packet->line[c].ptr, "User-Agent: Gnutella", 20) == 0) || (packet->line[c].len > 10 && memcmp(packet->line[c].ptr, "X-Gnutella-", 11) == 0) || (packet->line[c].len > 7 && memcmp(packet->line[c].ptr, "X-Queue:", 8) == 0) || (packet->line[c].len > 36 && memcmp(packet->line[c].ptr, "Content-Type: application/x-gnutella-", 37) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "DETECTED GNUTELLA GET.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } if (packet->payload_packet_len > 50 && ((memcmp(packet->payload, "GET / HTTP", 9) == 0))) { ipq_parse_packet_line_info(ipoque_struct); if ((packet->user_agent_line.ptr != NULL && packet->user_agent_line.len > 15 && memcmp(packet->user_agent_line.ptr, "BearShare Lite ", 15) == 0) || (packet->accept_line.ptr != NULL && packet->accept_line.len > 24 && memcmp(packet->accept_line.ptr, "application n/x-gnutella", 24) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "DETECTED GNUTELLA GET.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } } /* haven't found this pattern in any trace. */ if (packet->payload_packet_len > 50 && ((memcmp(packet->payload, "GET /get/", 9) == 0) || (memcmp(packet->payload, "GET /uri-res/", 13) == 0))) { c = 8; while (c < (packet->payload_packet_len - 9)) { if (packet->payload[c] == '?') break; c++; } if (c < (packet->payload_packet_len - 9) && memcmp(&packet->payload[c], "urn:sha1:", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "detected GET /get/ or GET /uri-res/.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } } /* answer to this packet is HTTP/1.1 ..... Content-Type: application/x-gnutella-packets, * it is searched in the upper paragraph. */ if (packet->payload_packet_len > 30 && memcmp(packet->payload, "HEAD /gnutella/push-proxy?", 26) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "detected HEAD /gnutella/push-proxy?\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } /* haven't found any trace with this pattern */ if (packet->payload_packet_len == 46 && memcmp(packet->payload, "\x50\x55\x53\x48\x20\x67\x75\x69\x64\x3a", 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "detected \x50\x55\x53\x48\x20\x67\x75\x69\x64\x3a\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } /* haven't found any trace with this pattern */ if (packet->payload_packet_len > 250 && memcmp(packet->payload, "GET /gnutella/", 14) == 0) //PATTERN IS :: GET /gnutella/tigertree/v3?urn:tree:tiger/: { const u16 end = packet->payload_packet_len - 3; c = 13; while (c < end) { if ((memcmp(&packet->payload[14], "tigertree/", 10) == 0) || (end - c > 18 && memcmp(&packet->payload[c], "\r\nUser-Agent: Foxy", 18) == 0) || (end - c > 44 && memcmp(&packet->payload[c], "\r\nAccept: application/tigertree-breadthfirst", 44) == 0) || (end - c > 10 && memcmp(&packet->payload[c], "\r\nX-Queue:", 10) == 0) || (end - c > 13 && memcmp(&packet->payload[c], "\r\nX-Features:", 13) == 0)) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "FOXY :: GNUTELLA GET 2 DETECTED\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } c++; } } /* haven't found any trace with this pattern */ if (packet->payload_packet_len > 1 && packet->payload[packet->payload_packet_len - 1] == 0x0a && packet->payload[packet->payload_packet_len - 2] == 0x0a) { if (packet->payload_packet_len > 3 && memcmp(packet->payload, "GIV", 3) == 0) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "MORPHEUS GIV DETECTED\n"); /* Not Excludeing the flow now.. We shall Check the next Packet too for Gnutella Patterns */ return; } } /* might be super tricky new ssl gnutella transmission, but the certificate is strange... */ if (packet->payload_packet_len == 46 && get_u32(packet->payload, 0) == htonl(0x802c0103) && get_u32(packet->payload, 4) == htonl(0x01000300) && get_u32(packet->payload, 8) == htonl(0x00002000) && get_u16(packet->payload, 12) == htons(0x0034)) { IPQ_LOG(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "detected gnutella len == 46.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 49 && memcmp(packet->payload, "\x80\x2f\x01\x03\x01\x00\x06\x00\x00\x00\x20\x00\x00\x34\x00\x00\xff\x4d\x6c", 19) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "detected gnutella len == 49.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 89 && memcmp(&packet->payload[43], "\x20\x4d\x6c", 3) == 0 && memcmp(packet->payload, "\x16\x03\x01\x00\x54\x01\x00\x00\x50\x03\x01\x4d\x6c", 13) == 0 && memcmp(&packet->payload[76], "\x00\x02\x00\x34\x01\x00\x00\x05", 8) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "detected gnutella asymmetrically len == 388.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } else if (packet->payload_packet_len == 82) { if (get_u32(packet->payload, 0) == htonl(0x16030100) && get_u32(packet->payload, 4) == htonl(0x4d010000) && get_u16(packet->payload, 8) == htons(0x4903) && get_u16(packet->payload, 76) == htons(0x0002) && get_u32(packet->payload, 78) == htonl(0x00340100)) { IPQ_LOG(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "detected len == 82.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } else if (packet->udp != NULL) { if (src != NULL && (packet->udp->source == src->detected_gnutella_udp_port1 || packet->udp->source == src->detected_gnutella_udp_port2) && (packet->tick_timestamp - src->gnutella_ts) < ipoque_struct->gnutella_timeout) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "port based detection\n\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } /* observations: * all the following patterns send out many packets which are the only ones of their flows, * often on the very beginning of the traces, or flows with many packets in one direction only. * but then suddenly, one gets an answer as you can see in netpeker-gnutella-rpc.pcap packet 11483. * Maybe gnutella tries to send out keys? */ if (packet->payload_packet_len == 23 && packet->payload[15] == 0x00 && packet->payload[16] == 0x41 && packet->payload[17] == 0x01 && packet->payload[18] == 0x00 && packet->payload[19] == 0x00 && packet->payload[20] == 0x00 && packet->payload[21] == 0x00 && packet->payload[22] == 0x00) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "detected gnutella udp, len = 23.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 35 && packet->payload[25] == 0x49 && packet->payload[26] == 0x50 && packet->payload[27] == 0x40 && packet->payload[28] == 0x83 && packet->payload[29] == 0x53 && packet->payload[30] == 0x43 && packet->payload[31] == 0x50 && packet->payload[32] == 0x41) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "detected gnutella udp, len = 35.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 32 && (memcmp(&packet->payload[16], "\x31\x01\x00\x09\x00\x00\x00\x4c\x49\x4d\x45", 11) == 0)) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "detected gnutella udp, len = 32.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 34 && (memcmp(&packet->payload[25], "SCP@", 4) == 0) && (memcmp(&packet->payload[30], "DNA@", 4) == 0)) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "detected gnutella udp, len = 34.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if ((packet->payload_packet_len == 73 || packet->payload_packet_len == 96) && memcmp(&packet->payload[32], "urn:sha1:", 9) == 0) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "detected gnutella udp, len = 73,96.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (memcmp(packet->payload, "GND", 3) == 0) { if ((packet->payload_packet_len == 8 && (memcmp(&packet->payload[6], "\x01\x00", 2) == 0)) || (packet->payload_packet_len == 11 && (memcmp(&packet->payload[6], "\x01\x01\x08\x50\x49", 5) == 0)) || (packet->payload_packet_len == 17 && (memcmp (&packet->payload[6], "\x01\x01\x4c\x05\x50", 5) == 0)) || (packet->payload_packet_len == 28 && (memcmp(&packet->payload[6], "\x01\x01\x54\x0f\x51\x4b\x52\x50\x06\x52", 10) == 0)) || (packet->payload_packet_len == 41 && (memcmp(&packet->payload[6], "\x01\x01\x5c\x1b\x50\x55\x53\x48\x48\x10", 10) == 0)) || (packet->payload_packet_len > 200 && packet->payload_packet_len < 300 && packet->payload[3] == 0x03) || (packet->payload_packet_len > 300 && (packet->payload[3] == 0x01 || packet->payload[3] == 0x03))) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "detected gnutella udp, GND.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } if ((packet->payload_packet_len == 32) && memcmp(&packet->payload[16], "\x31\x01\x00\x09\x00\x00\x00", 7) == 0) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "detected gnutella udp, len = 32 ii.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if ((packet->payload_packet_len == 23) && memcmp(&packet->payload[16], "\x00\x01\x00\x00\x00\x00\x00", 7) == 0) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_DEBUG, "detected gnutella udp, len = 23 ii.\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } //neonet detection follows /* haven't found any trace with this pattern */ if (packet->tcp != NULL && ntohs(packet->tcp->source) >= 1024 && ntohs(packet->tcp->dest) >= 1024) { if (flow->l4.tcp.gnutella_stage == 0) { if (flow->packet_counter == 1 && (packet->payload_packet_len == 11 || packet->payload_packet_len == 33 || packet->payload_packet_len == 37)) { flow->l4.tcp.gnutella_msg_id[0] = packet->payload[4]; flow->l4.tcp.gnutella_msg_id[1] = packet->payload[6]; flow->l4.tcp.gnutella_msg_id[2] = packet->payload[8]; flow->l4.tcp.gnutella_stage = 1 + packet->packet_direction; return; } } else if (flow->l4.tcp.gnutella_stage == 1 + packet->packet_direction) { if (flow->packet_counter == 2 && (packet->payload_packet_len == 33 || packet->payload_packet_len == 22) && flow->l4.tcp.gnutella_msg_id[0] == packet->payload[0] && flow->l4.tcp.gnutella_msg_id[1] == packet->payload[2] && flow->l4.tcp.gnutella_msg_id[2] == packet->payload[4] && IPQ_SRC_OR_DST_HAS_PROTOCOL(src, dst, IPOQUE_PROTOCOL_GNUTELLA)) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "GNUTELLA DETECTED due to message ID match (NEONet protocol)\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } else if (flow->l4.tcp.gnutella_stage == 2 - packet->packet_direction) { if (flow->packet_counter == 2 && (packet->payload_packet_len == 10 || packet->payload_packet_len == 75) && flow->l4.tcp.gnutella_msg_id[0] == packet->payload[0] && flow->l4.tcp.gnutella_msg_id[1] == packet->payload[2] && flow->l4.tcp.gnutella_msg_id[2] == packet->payload[4] && IPQ_SRC_OR_DST_HAS_PROTOCOL(src, dst, IPOQUE_PROTOCOL_GNUTELLA)) { IPQ_LOG_GNUTELLA(IPOQUE_PROTOCOL_GNUTELLA, ipoque_struct, IPQ_LOG_TRACE, "GNUTELLA DETECTED due to message ID match (NEONet protocol)\n"); ipoque_int_gnutella_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_GNUTELLA); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/syslog.c0000644000000000000000000001104311655273464020046 0ustar rootroot/* * syslog.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_SYSLOG static void ipoque_int_syslog_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SYSLOG, IPOQUE_REAL_PROTOCOL); } void ipoque_search_syslog(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u8 i; IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "search syslog\n"); if (packet->payload_packet_len > 20 && packet->payload_packet_len <= 1024 && packet->payload[0] == '<') { IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "checked len>20 and <1024 and first symbol=<.\n"); i = 1; for (;;) { if (packet->payload[i] < '0' || packet->payload[i] > '9' || i++ > 3) { IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "read symbols while the symbol is a number.\n"); break; } } if (packet->payload[i++] != '>') { IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "there is no > following the number.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SYSLOG); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "a > following the number.\n"); } if (packet->payload[i] == 0x20) { IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "a blank following the >: increment i.\n"); i++; } else { IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "no blank following the >: do nothing.\n"); } /* check for "last message repeated" */ if (i + sizeof("last message") - 1 <= packet->payload_packet_len && memcmp(packet->payload + i, "last message", sizeof("last message") - 1) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "found syslog by 'last message' string.\n"); ipoque_int_syslog_add_connection(ipoque_struct); return; } else if (i + sizeof("snort: ") - 1 <= packet->payload_packet_len && memcmp(packet->payload + i, "snort: ", sizeof("snort: ") - 1) == 0) { /* snort events */ IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "found syslog by 'snort: ' string.\n"); ipoque_int_syslog_add_connection(ipoque_struct); return; } if (ipq_mem_cmp(&packet->payload[i], "Jan", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Feb", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Mar", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Apr", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "May", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Jun", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Jul", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Aug", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Sep", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Oct", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Nov", 3) != 0 && ipq_mem_cmp(&packet->payload[i], "Dec", 3) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "no month-shortname following: syslog excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SYSLOG); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "a month-shortname following: syslog detected.\n"); ipoque_int_syslog_add_connection(ipoque_struct); return; } } IPQ_LOG(IPOQUE_PROTOCOL_SYSLOG, ipoque_struct, IPQ_LOG_DEBUG, "no syslog detected.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SYSLOG); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/flash.c0000644000000000000000000000743211655273464017632 0ustar rootroot/* * flash.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_FLASH static void ipoque_int_flash_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLASH, IPOQUE_REAL_PROTOCOL); } void ipoque_search_flash(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (flow->l4.tcp.flash_stage == 0 && packet->payload_packet_len > 0 && (packet->payload[0] == 0x03 || packet->payload[0] == 0x06)) { flow->l4.tcp.flash_bytes = packet->payload_packet_len; if (packet->tcp->psh == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH pass 1: \n"); flow->l4.tcp.flash_stage = packet->packet_direction + 1; IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH pass 1: flash_stage: %u, flash_bytes: %u\n", flow->l4.tcp.flash_stage, flow->l4.tcp.flash_bytes); return; } else if (packet->tcp->psh != 0 && flow->l4.tcp.flash_bytes == 1537) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH hit: flash_stage: %u, flash_bytes: %u\n", flow->l4.tcp.flash_stage, flow->l4.tcp.flash_bytes); flow->l4.tcp.flash_stage = 3; ipoque_int_flash_add_connection(ipoque_struct); return; } } else if (flow->l4.tcp.flash_stage == 1 + packet->packet_direction) { flow->l4.tcp.flash_bytes += packet->payload_packet_len; if (packet->tcp->psh != 0 && flow->l4.tcp.flash_bytes == 1537) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH hit: flash_stage: %u, flash_bytes: %u\n", flow->l4.tcp.flash_stage, flow->l4.tcp.flash_bytes); flow->l4.tcp.flash_stage = 3; ipoque_int_flash_add_connection(ipoque_struct); return; } else if (packet->tcp->psh == 0 && flow->l4.tcp.flash_bytes < 1537) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH pass 2: flash_stage: %u, flash_bytes: %u\n", flow->l4.tcp.flash_stage, flow->l4.tcp.flash_bytes); return; } } IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH might be excluded: flash_stage: %u, flash_bytes: %u, packet_direction: %u\n", flow->l4.tcp.flash_stage, flow->l4.tcp.flash_bytes, packet->packet_direction); #ifdef IPOQUE_PROTOCOL_HTTP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP) != 0) { #endif /* IPOQUE_PROTOCOL_HTTP */ IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH: exclude\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_FLASH); #ifdef IPOQUE_PROTOCOL_HTTP } else { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH avoid early exclude from http\n"); } #endif /* IPOQUE_PROTOCOL_HTTP */ } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/dns.c0000644000000000000000000001021311655273464017310 0ustar rootroot/* * dns.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_DNS /* This module should detect DNS */ static void ipoque_int_dns_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_DNS, IPOQUE_REAL_PROTOCOL); } void ipoque_search_dns(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u16 dport = 0; #define IPOQUE_MAX_DNS_REQUESTS 16 IPQ_LOG(IPOQUE_PROTOCOL_DNS, ipoque_struct, IPQ_LOG_DEBUG, "search DNS.\n"); if (packet->udp != NULL) { // const u16 sport=ntohs(packet->udp->source); dport = ntohs(packet->udp->dest); IPQ_LOG(IPOQUE_PROTOCOL_DNS, ipoque_struct, IPQ_LOG_DEBUG, "calculated dport over UDP.\n"); } if (packet->tcp != NULL) { // const u16 sport=ntohs(packet->tcp->source); dport = ntohs(packet->tcp->dest); IPQ_LOG(IPOQUE_PROTOCOL_DNS, ipoque_struct, IPQ_LOG_DEBUG, "calculated dport over tcp.\n"); } /*check standard DNS to port 53 */ if (dport == 53 && packet->payload_packet_len >= 12) { IPQ_LOG(IPOQUE_PROTOCOL_DNS, ipoque_struct, IPQ_LOG_DEBUG, "dport==53, packet-payload-packet-len>=12.\n"); /* dns header 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ID | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QDCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ANCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | NSCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ARCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ * * dns query check: query: QR set, ancount = 0, nscount = 0, QDCOUNT < MAX_DNS, ARCOUNT < MAX_DNS * */ if (((packet->payload[2] & 0x80) == 0 && ntohs(get_u16(packet->payload, 4)) <= IPOQUE_MAX_DNS_REQUESTS && ntohs(get_u16(packet->payload, 4)) != 0 && ntohs(get_u16(packet->payload, 6)) == 0 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) <= IPOQUE_MAX_DNS_REQUESTS) || ((ntohs(get_u16(packet->payload, 0)) == packet->payload_packet_len - 2) && (packet->payload[4] & 0x80) == 0 && ntohs(get_u16(packet->payload, 6)) <= IPOQUE_MAX_DNS_REQUESTS && ntohs(get_u16(packet->payload, 6)) != 0 && ntohs(get_u16(packet->payload, 8)) == 0 && ntohs(get_u16(packet->payload, 10)) == 0 && packet->payload_packet_len >= 14 && ntohs(get_u16(packet->payload, 12)) <= IPOQUE_MAX_DNS_REQUESTS)) { IPQ_LOG(IPOQUE_PROTOCOL_DNS, ipoque_struct, IPQ_LOG_DEBUG, "found DNS.\n"); ipoque_int_dns_add_connection(ipoque_struct); return; } } IPQ_LOG(IPOQUE_PROTOCOL_DNS, ipoque_struct, IPQ_LOG_DEBUG, "exclude DNS.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_DNS); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/dcerpc.c0000644000000000000000000000322511666771321017766 0ustar rootroot/* * dcerpc.c * Copyright (C) 2011 by ntop.org * * This module is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License. * If not, see . * */ #include "ipq_utils.h" #ifdef NTOP_PROTOCOL_DCERPC static void ntop_int_dcerpc_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_DCERPC, IPOQUE_REAL_PROTOCOL); } void ntop_search_dcerpc(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; if((packet->tcp != NULL) && (packet->payload_packet_len > 64) && ((ntohs(packet->tcp->source) == 135) || (ntohs(packet->tcp->dest) == 135)) && (packet->payload[0] == 0x05) /* version 5 */ && (packet->payload[2] < 16) /* Packet type */ ) { IPQ_LOG(IPOQUE_PROTOCOL_DCERPC, ipoque_struct, IPQ_LOG_DEBUG, "DCERPC match\n"); ntop_int_dcerpc_add_connection(ipoque_struct); return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NTOP_PROTOCOL_DCERPC); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/postgres.c0000644000000000000000000001100611655273464020373 0ustar rootroot/* * postgres.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_POSTGRES static void ipoque_int_postgres_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_POSTGRES, IPOQUE_REAL_PROTOCOL); } void ipoque_search_postgres_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u16 size; if (flow->l4.tcp.postgres_stage == 0) { //SSL if (packet->payload_packet_len > 7 && packet->payload[4] == 0x04 && packet->payload[5] == 0xd2 && packet->payload[6] == 0x16 && packet->payload[7] == 0x2f && ntohl(get_u32(packet->payload, 0)) == packet->payload_packet_len) { flow->l4.tcp.postgres_stage = 1 + packet->packet_direction; return; } //no SSL if (packet->payload_packet_len > 7 && //protocol version number - to be updated ntohl(get_u32(packet->payload, 4)) < 0x00040000 && ntohl(get_u32(packet->payload, 0)) == packet->payload_packet_len) { flow->l4.tcp.postgres_stage = 3 + packet->packet_direction; return; } } else { if (flow->l4.tcp.postgres_stage == 2 - packet->packet_direction) { //SSL accepted if (packet->payload_packet_len == 1 && packet->payload[0] == 'S') { IPQ_LOG(IPOQUE_PROTOCOL_POSTGRES, ipoque_struct, IPQ_LOG_DEBUG, "PostgreSQL detected, SSL accepted.\n"); ipoque_int_postgres_add_connection(ipoque_struct); return; } //SSL denied if (packet->payload_packet_len == 1 && packet->payload[0] == 'N') { IPQ_LOG(IPOQUE_PROTOCOL_POSTGRES, ipoque_struct, IPQ_LOG_DEBUG, "PostgreSQL detected, SSL denied.\n"); ipoque_int_postgres_add_connection(ipoque_struct); return; } } //no SSL if (flow->l4.tcp.postgres_stage == 4 - packet->packet_direction) if (packet->payload_packet_len > 8 && ntohl(get_u32(packet->payload, 5)) < 10 && ntohl(get_u32(packet->payload, 1)) == packet->payload_packet_len - 1 && packet->payload[0] == 0x52) { IPQ_LOG(IPOQUE_PROTOCOL_POSTGRES, ipoque_struct, IPQ_LOG_DEBUG, "PostgreSQL detected, no SSL.\n"); ipoque_int_postgres_add_connection(ipoque_struct); return; } if (flow->l4.tcp.postgres_stage == 6 && ntohl(get_u32(packet->payload, 1)) == packet->payload_packet_len - 1 && packet->payload[0] == 'p') { IPQ_LOG(IPOQUE_PROTOCOL_POSTGRES, ipoque_struct, IPQ_LOG_DEBUG, "found postgres asymmetrically.\n"); ipoque_int_postgres_add_connection(ipoque_struct); return; } if (flow->l4.tcp.postgres_stage == 5 && packet->payload[0] == 'R') { if (ntohl(get_u32(packet->payload, 1)) == packet->payload_packet_len - 1) { IPQ_LOG(IPOQUE_PROTOCOL_POSTGRES, ipoque_struct, IPQ_LOG_DEBUG, "found postgres asymmetrically.\n"); ipoque_int_postgres_add_connection(ipoque_struct); return; } size = ntohl(get_u32(packet->payload, 1)) + 1; if (packet->payload[size - 1] == 'S') { if ((size + get_u32(packet->payload, (size + 1))) == packet->payload_packet_len) { IPQ_LOG(IPOQUE_PROTOCOL_POSTGRES, ipoque_struct, IPQ_LOG_DEBUG, "found postgres asymmetrically.\n"); ipoque_int_postgres_add_connection(ipoque_struct); return; } } size += get_u32(packet->payload, (size + 1)) + 1; if (packet->payload[size - 1] == 'S') { IPQ_LOG(IPOQUE_PROTOCOL_POSTGRES, ipoque_struct, IPQ_LOG_DEBUG, "found postgres asymmetrically.\n"); ipoque_int_postgres_add_connection(ipoque_struct); return; } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_POSTGRES); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/rtsp.c0000644000000000000000000000772711655273464017534 0ustar rootroot/* * rtsp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_RTSP #ifndef IPOQUE_PROTOCOL_RTP #error RTSP requires RTP detection to work correctly #endif #ifndef IPOQUE_PROTOCOL_RTSP #error RTSP requires RTSP detection to work correctly #endif #ifndef IPOQUE_PROTOCOL_RDP #error RTSP requires RDP detection to work correctly #endif static void ipoque_int_rtsp_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_RTSP, protocol_type); } /* this function searches for a rtsp-"handshake" over tcp or udp. */ void ipoque_search_rtsp_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "calling ipoque_search_rtsp_tcp_udp.\n"); if (flow->rtsprdt_stage == 0 #ifdef IPOQUE_PROTOCOL_RTCP && !(packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_RTCP) #endif ) { flow->rtsprdt_stage = 1 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "maybe handshake 1; need next packet, return.\n"); return; } if (flow->packet_counter < 3 && flow->rtsprdt_stage == 1 + packet->packet_direction) { IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "maybe handshake 2; need next packet.\n"); return; } if (packet->payload_packet_len > 20 && flow->rtsprdt_stage == 2 - packet->packet_direction) { // RTSP Server Message if (memcmp(packet->payload, "RTSP/1.0 ", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "found RTSP/1.0 .\n"); if (dst != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "found dst.\n"); ipq_packet_src_ip_get(packet, &dst->rtsp_ip_address); dst->rtsp_timer = packet->tick_timestamp; dst->rtsp_ts_set = 1; } if (src != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "found src.\n"); ipq_packet_dst_ip_get(packet, &src->rtsp_ip_address); src->rtsp_timer = packet->tick_timestamp; src->rtsp_ts_set = 1; } IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "found RTSP.\n"); flow->rtsp_control_flow = 1; ipoque_int_rtsp_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } if (packet->udp != NULL && packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN && ((IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_RTP) == 0) #ifdef IPOQUE_PROTOCOL_RTCP || (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_RTCP) == 0) #endif )) { IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "maybe RTSP RTP, RTSP RTCP, RDT; need next packet.\n"); return; } IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "didn't find handshake, exclude.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_RTSP); return; } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/guildwars.c0000644000000000000000000000541511655273464020535 0ustar rootroot/* * guildwars.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_GUILDWARS static void ipoque_int_guildwars_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_GUILDWARS, IPOQUE_REAL_PROTOCOL); } void ipoque_search_guildwars_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_GUILDWARS, ipoque_struct, IPQ_LOG_DEBUG, "search guildwars.\n"); if (packet->payload_packet_len == 64 && get_u16(packet->payload, 1) == ntohs(0x050c) && memcmp(&packet->payload[50], "@2&P", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_GUILDWARS, ipoque_struct, IPQ_LOG_DEBUG, "GuildWars version 29.350: found.\n"); ipoque_int_guildwars_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 16 && get_u16(packet->payload, 1) == ntohs(0x040c) && get_u16(packet->payload, 4) == ntohs(0xa672) && packet->payload[8] == 0x01 && packet->payload[12] == 0x04) { IPQ_LOG(IPOQUE_PROTOCOL_GUILDWARS, ipoque_struct, IPQ_LOG_DEBUG, "GuildWars version 29.350: found.\n"); ipoque_int_guildwars_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 21 && get_u16(packet->payload, 0) == ntohs(0x0100) && get_u32(packet->payload, 5) == ntohl(0xf1001000) && packet->payload[9] == 0x01) { IPQ_LOG(IPOQUE_PROTOCOL_GUILDWARS, ipoque_struct, IPQ_LOG_DEBUG, "GuildWars version 216.107.245.50: found.\n"); ipoque_int_guildwars_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_GUILDWARS, ipoque_struct, IPQ_LOG_DEBUG, "exclude guildwars.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_GUILDWARS); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/tftp.c0000644000000000000000000000461011655273464017505 0ustar rootroot/* * tftp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_TFTP static void ipoque_int_tftp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_TFTP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_tftp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; IPQ_LOG(IPOQUE_PROTOCOL_TFTP, ipoque_struct, IPQ_LOG_DEBUG, "search TFTP.\n"); if (packet->payload_packet_len > 3 && flow->l4.udp.tftp_stage == 0 && ntohl(get_u32(packet->payload, 0)) == 0x00030001) { IPQ_LOG(IPOQUE_PROTOCOL_TFTP, ipoque_struct, IPQ_LOG_DEBUG, "maybe tftp. need next packet.\n"); flow->l4.udp.tftp_stage = 1; return; } if (packet->payload_packet_len > 3 && (flow->l4.udp.tftp_stage == 1) && ntohl(get_u32(packet->payload, 0)) == 0x00040001) { IPQ_LOG(IPOQUE_PROTOCOL_TFTP, ipoque_struct, IPQ_LOG_DEBUG, "found tftp.\n"); ipoque_int_tftp_add_connection(ipoque_struct); return; } if (packet->payload_packet_len > 1 && ((packet->payload[0] == 0 && packet->payload[packet->payload_packet_len - 1] == 0) || (packet->payload_packet_len == 4 && ntohl(get_u32(packet->payload, 0)) == 0x00040000))) { IPQ_LOG(IPOQUE_PROTOCOL_TFTP, ipoque_struct, IPQ_LOG_DEBUG, "skip initial packet.\n"); return; } IPQ_LOG(IPOQUE_PROTOCOL_TFTP, ipoque_struct, IPQ_LOG_DEBUG, "exclude TFTP.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_TFTP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/mysql.c0000644000000000000000000000476111655273464017704 0ustar rootroot/* * mysql.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_MYSQL static void ipoque_int_mysql_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MYSQL, IPOQUE_REAL_PROTOCOL); } void ipoque_search_mysql_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 37 //min length && get_u16(packet->payload, 0) == packet->payload_packet_len - 4 //first 3 bytes are length && get_u8(packet->payload, 2) == 0x00 //3rd byte of packet length && get_u8(packet->payload, 3) == 0x00 //packet sequence number is 0 for startup packet && get_u8(packet->payload, 5) > 0x30 //server version > 0 && get_u8(packet->payload, 5) < 0x37 //server version < 7 && get_u8(packet->payload, 6) == 0x2e //dot ) { u32 a; for (a = 7; a + 31 < packet->payload_packet_len; a++) { if (packet->payload[a] == 0x00) { if (get_u8(packet->payload, a + 13) == 0x00 //filler byte && get_u64(packet->payload, a + 19) == 0x0ULL //13 more && get_u32(packet->payload, a + 27) == 0x0 //filler bytes && get_u8(packet->payload, a + 31) == 0x0) { IPQ_LOG(IPOQUE_PROTOCOL_MYSQL, ipoque_struct, IPQ_LOG_DEBUG, "MySQL detected.\n"); ipoque_int_mysql_add_connection(ipoque_struct); return; } break; } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MYSQL); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/ssl.c0000644000000000000000000005040411771264574017334 0ustar rootroot/* * ssl.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_SSL #define IPOQUE_MAX_SSL_REQUEST_SIZE 10000 static void ipoque_int_ssl_add_connection(struct ipoque_detection_module_struct *ipoque_struct, u32 protocol) { if (protocol != IPOQUE_PROTOCOL_SSL) { ipoque_int_add_connection(ipoque_struct, protocol, IPOQUE_CORRELATED_PROTOCOL); } else { ipoque_int_add_connection(ipoque_struct, protocol, IPOQUE_REAL_PROTOCOL); } } #ifdef HAVE_NTOP #ifndef WIN32 inline int min(int a, int b) { return(a < b ? a : b); } #endif static void stripCertificateTrailer(char *buffer, int buffer_len) { int i; for(i=0; ipacket; /* Nothing matched so far: let's decode the certificate with some heuristics */ if(packet->payload[0] == 0x16 /* Handshake */) { u_int16_t total_len = packet->payload[4] + 5 /* SSL Header */; u_int8_t handshake_protocol = packet->payload[5]; memset(buffer, 0, buffer_len); if(handshake_protocol == 0x02 /* Server Hello */) { int i; for(i=total_len; i < packet->payload_packet_len-3; i++) { if((packet->payload[i] == 0x04) && (packet->payload[i+1] == 0x03) && (packet->payload[i+2] == 0x0c)) { u_int8_t server_len = packet->payload[i+3]; if(server_len+i+3 < packet->payload_packet_len) { char *server_name = (char*)&packet->payload[i+4]; u_int8_t begin = 0, len, j, num_dots; while(begin < server_len) { if(!isprint(server_name[begin])) begin++; else break; } len = min(server_len-begin, buffer_len-1); strncpy(buffer, &server_name[begin], len); buffer[len] = '\0'; /* We now have to check if this looks like an IP address or host name */ for(j=0, num_dots = 0; j=2) break; } } if(num_dots >= 2) { stripCertificateTrailer(buffer, buffer_len); return(1 /* Server Certificate */); } } } } } else if(handshake_protocol == 0x01 /* Client Hello */) { u_int offset, base_offset = 43; u_int16_t session_id_len = packet->payload[base_offset]; if((session_id_len+base_offset+2) >= total_len) { u_int16_t cypher_len = packet->payload[session_id_len+base_offset+2]; offset = base_offset + session_id_len + cypher_len + 2; if(offset < total_len) { u_int16_t compression_len; u_int16_t extensions_len; compression_len = packet->payload[offset+1]; offset += compression_len + 3; extensions_len = packet->payload[offset]; if((extensions_len+offset) < total_len) { u_int16_t extension_offset = 1; /* Move to the first extension */ while(extension_offset < extensions_len) { u_int16_t extension_id, extension_len; memcpy(&extension_id, &packet->payload[offset+extension_offset], 2); extension_offset += 2; memcpy(&extension_len, &packet->payload[offset+extension_offset], 2); extension_offset += 2; extension_id = ntohs(extension_id), extension_len = ntohs(extension_len); if(extension_id == 0) { u_int begin = 0,len; char *server_name = (char*)&packet->payload[offset+extension_offset]; while(begin < extension_len) { if((!isprint(server_name[begin])) || ispunct(server_name[begin]) || isspace(server_name[begin])) begin++; else break; } len = min(extension_len-begin, buffer_len-1); strncpy(buffer, &server_name[begin], len); buffer[len] = '\0'; stripCertificateTrailer(buffer, buffer_len); /* We're happy now */ return(2 /* Client Certificate */); } extension_offset += extension_len; } } } } } } return(0); /* Not found */ } int sslDetectProtocolFromCertificate(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if((packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN) || (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SSL)) { char certificate[64]; int rc = getSSLcertificate(ipoque_struct, certificate, sizeof(certificate)); if(rc > 0) { /* printf("***** [SSL] %s\n", certificate); */ matchStringProtocol(ipoque_struct, certificate, strlen(certificate)); return(rc); } } return(0); } #endif static void ssl_mark_and_payload_search_for_other_protocols(struct ipoque_detection_module_struct *ipoque_struct) { #if defined(IPOQUE_PROTOCOL_SOFTETHER) || defined(IPOQUE_PROTOCOL_MEEBO)|| defined(IPOQUE_PROTOCOL_TOR) || defined(IPOQUE_PROTOCOL_VPN_X) || defined(IPOQUE_PROTOCOL_UNENCRYPED_JABBER) || defined (IPOQUE_PROTOCOL_OOVOO) || defined (IPOQUE_PROTOCOL_ISKOOT) || defined (IPOQUE_PROTOCOL_OSCAR) || defined (IPOQUE_PROTOCOL_ITUNES) || defined (IPOQUE_PROTOCOL_GMAIL) struct ipoque_packet_struct *packet = &ipoque_struct->packet; #ifdef IPOQUE_PROTOCOL_ISKOOT struct ipoque_flow_struct *flow = ipoque_struct->flow; #endif // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u32 a; u32 end; #if defined(IPOQUE_PROTOCOL_UNENCRYPED_JABBER) if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_UNENCRYPED_JABBER) != 0) goto check_for_ssl_payload; #endif #if defined(IPOQUE_PROTOCOL_OSCAR) if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_OSCAR) != 0) goto check_for_ssl_payload; #endif #if defined(IPOQUE_PROTOCOL_GADUGADU) if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_GADUGADU) != 0) goto check_for_ssl_payload; #endif goto no_check_for_ssl_payload; check_for_ssl_payload: end = packet->payload_packet_len - 20; for (a = 5; a < end; a++) { #ifdef IPOQUE_PROTOCOL_UNENCRYPED_JABBER if (packet->payload[a] == 't') { if (memcmp(&packet->payload[a], "talk.google.com", 15) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNENCRYPED_JABBER, ipoque_struct, IPQ_LOG_DEBUG, "ssl jabber packet match\n"); if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK (ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_UNENCRYPED_JABBER) != 0) { ipoque_int_ssl_add_connection(ipoque_struct, IPOQUE_PROTOCOL_UNENCRYPED_JABBER); return; } } } #endif #ifdef IPOQUE_PROTOCOL_OSCAR if (packet->payload[a] == 'A' || packet->payload[a] == 'k' || packet->payload[a] == 'c' || packet->payload[a] == 'h') { if (((a + 19) < packet->payload_packet_len && memcmp(&packet->payload[a], "America Online Inc.", 19) == 0) // || (end - c > 3 memcmp (&packet->payload[c],"AOL", 3) == 0 ) // || (end - c > 7 && memcmp (&packet->payload[c], "AOL LLC", 7) == 0) || ((a + 15) < packet->payload_packet_len && memcmp(&packet->payload[a], "kdc.uas.aol.com", 15) == 0) || ((a + 14) < packet->payload_packet_len && memcmp(&packet->payload[a], "corehc@aol.net", 14) == 0) || ((a + 41) < packet->payload_packet_len && memcmp(&packet->payload[a], "http://crl.aol.com/AOLMSPKI/aolServerCert", 41) == 0) || ((a + 28) < packet->payload_packet_len && memcmp(&packet->payload[a], "http://ocsp.web.aol.com/ocsp", 28) == 0) || ((a + 32) < packet->payload_packet_len && memcmp(&packet->payload[a], "http://pki-info.aol.com/AOLMSPKI", 32) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR SERVER SSL DETECTED\n"); if (ipoque_struct->dst != NULL && packet->payload_packet_len > 75) { memcpy(ipoque_struct->dst->oscar_ssl_session_id, &packet->payload[44], 32); ipoque_struct->dst->oscar_ssl_session_id[32] = '\0'; ipoque_struct->dst->oscar_last_safe_access_time = packet->tick_timestamp; } ipoque_int_ssl_add_connection(ipoque_struct, IPOQUE_PROTOCOL_OSCAR); return; } } if (packet->payload[a] == 'm' || packet->payload[a] == 's') { if ((a + 21) < packet->payload_packet_len && (memcmp(&packet->payload[a], "my.screenname.aol.com", 21) == 0 || memcmp(&packet->payload[a], "sns-static.aolcdn.com", 21) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR SERVER SSL DETECTED\n"); ipoque_int_ssl_add_connection(ipoque_struct, IPOQUE_PROTOCOL_OSCAR); return; } } #endif } no_check_for_ssl_payload: #endif IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "found ssl connection.\n"); #ifdef HAVE_NTOP sslDetectProtocolFromCertificate(ipoque_struct); if((packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN) || (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SSL)) { /* Citrix GotoMeeting (AS16815, AS21866) 216.115.208.0/20 216.219.112.0/20 */ /* printf("[SSL] %08X / %08X\n", ntohl(packet->iph->saddr) , ntohl(packet->iph->daddr)); */ if(((ntohl(packet->iph->saddr) & 0xFFFFF000 /* 255.255.240.0 */) == 0xD873D000 /* 216.115.208.0 */) || ((ntohl(packet->iph->daddr) & 0xFFFFF000 /* 255.255.240.0 */) == 0xD873D000 /* 216.115.208.0 */) || ((ntohl(packet->iph->saddr) & 0xFFFFF000 /* 255.255.240.0 */) == 0xD8DB7000 /* 216.219.112.0 */) || ((ntohl(packet->iph->daddr) & 0xFFFFF000 /* 255.255.240.0 */) == 0xD8DB7000 /* 216.219.112.0 */) ) { ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_CITRIX_ONLINE, IPOQUE_REAL_PROTOCOL); return; } /* Apple (FaceTime, iMessage,...) 17.0.0.0/8 */ if(((ntohl(packet->iph->saddr) & 0xFF000000 /* 255.0.0.0 */) == 0x11000000 /* 17.0.0.0 */) || ((ntohl(packet->iph->daddr) & 0xFF000000 /* 255.0.0.0 */) == 0x11000000 /* 17.0.0.0 */)) { ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_APPLE, IPOQUE_REAL_PROTOCOL); return; } /* Webex 66.114.160.0/20 */ if(((ntohl(packet->iph->saddr) & 0xFFFFF000 /* 255.255.240.0 */) == 0x4272A000 /* 66.114.160.0 */) || ((ntohl(packet->iph->daddr) & 0xFFFFF000 /* 255.255.240.0 */) ==0x4272A000 /* 66.114.160.0 */)) { ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_WEBEX, IPOQUE_REAL_PROTOCOL); return; } /* Google 173.194.0.0/16 */ if(((ntohl(packet->iph->saddr) & 0xFFFF0000 /* 255.255.0.0 */) == 0xADC20000 /* 66.114.160.0 */) || ((ntohl(packet->iph->daddr) & 0xFFFF0000 /* 255.255.0.0 */) ==0xDC20000 /* 66.114.160.0 */)) { ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_GOOGLE, IPOQUE_REAL_PROTOCOL); return; } } #endif ipoque_int_ssl_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SSL); } static u8 ipoque_search_sslv3_direction1(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; // struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len >= 5 && packet->payload[0] == 0x16 && packet->payload[1] == 0x03 && (packet->payload[2] == 0x00 || packet->payload[2] == 0x01 || packet->payload[2] == 0x02)) { u32 temp; IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "search sslv3\n"); // SSLv3 Record if (packet->payload_packet_len >= 1300) { return 1; } temp = ntohs(get_u16(packet->payload, 3)) + 5; IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "temp = %u.\n", temp); if (packet->payload_packet_len == temp || (temp < packet->payload_packet_len && packet->payload_packet_len > 500)) { return 1; } if (packet->payload_packet_len < temp && temp < 5000 && packet->payload_packet_len > 9) { /* the server hello may be split into small packets */ u32 cert_start; IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "maybe SSLv3 server hello split into smaller packets\n"); /* lets hope at least the server hello and the start of the certificate block are in the first packet */ cert_start = ntohs(get_u16(packet->payload, 7)) + 5 + 4; IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "suspected start of certificate: %u\n", cert_start); if (cert_start < packet->payload_packet_len && packet->payload[cert_start] == 0x0b) { IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "found 0x0b at suspected start of certificate block\n"); return 2; } } if ((packet->payload_packet_len > temp && packet->payload_packet_len > 100) && packet->payload_packet_len > 9) { /* the server hello may be split into small packets and the certificate has its own SSL Record * so temp contains only the length for the first ServerHello block */ u32 cert_start; IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "maybe SSLv3 server hello split into smaller packets but with seperate record for the certificate\n"); /* lets hope at least the server hello record and the start of the certificate record are in the first packet */ cert_start = ntohs(get_u16(packet->payload, 7)) + 5 + 5 + 4; IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "suspected start of certificate: %u\n", cert_start); if (cert_start < packet->payload_packet_len && packet->payload[cert_start] == 0x0b) { IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "found 0x0b at suspected start of certificate block\n"); return 2; } } if (packet->payload_packet_len >= temp + 5 && (packet->payload[temp] == 0x14 || packet->payload[temp] == 0x16) && packet->payload[temp + 1] == 0x03) { u32 temp2 = ntohs(get_u16(packet->payload, temp + 3)) + 5; if (temp + temp2 > IPOQUE_MAX_SSL_REQUEST_SIZE) { return 1; } temp += temp2; IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "temp = %u.\n", temp); if (packet->payload_packet_len == temp) { return 1; } if (packet->payload_packet_len >= temp + 5 && packet->payload[temp] == 0x16 && packet->payload[temp + 1] == 0x03) { temp2 = ntohs(get_u16(packet->payload, temp + 3)) + 5; if (temp + temp2 > IPOQUE_MAX_SSL_REQUEST_SIZE) { return 1; } temp += temp2; IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "temp = %u.\n", temp); if (packet->payload_packet_len == temp) { return 1; } if (packet->payload_packet_len >= temp + 5 && packet->payload[temp] == 0x16 && packet->payload[temp + 1] == 0x03) { temp2 = ntohs(get_u16(packet->payload, temp + 3)) + 5; if (temp + temp2 > IPOQUE_MAX_SSL_REQUEST_SIZE) { return 1; } temp += temp2; IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "temp = %u.\n", temp); if (temp == packet->payload_packet_len) { return 1; } } } } } return 0; } void ipoque_search_ssl_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u8 ret; if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SSL) { if (flow->l4.tcp.ssl_stage == 3 && packet->payload_packet_len > 20 && flow->packet_counter < 5) { /* this should only happen, when we detected SSL with a packet that had parts of the certificate in subsequent packets * so go on checking for certificate patterns for a couple more packets */ IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "ssl flow but check another packet for patterns\n"); ssl_mark_and_payload_search_for_other_protocols(ipoque_struct); if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SSL) { /* still ssl so check another packet */ return; } else { /* protocol has changed so we are done */ return; } } return; } IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "search ssl\n"); #ifdef HAVE_NTOP { /* Check if this is whatsapp first (this proto runs over port 443) */ char whatsapp_pattern[] = { 0x57, 0x41, 0x01, 0x01, 0x00 }; if((packet->payload_packet_len > 5) && (memcmp(packet->payload, whatsapp_pattern, sizeof(whatsapp_pattern)) == 0)) { ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_WHATSAPP, IPOQUE_REAL_PROTOCOL); return; } else { /* No whatsapp, let's try SSL */ if(sslDetectProtocolFromCertificate(ipoque_struct) > 0) return; } } #endif if (packet->payload_packet_len > 40 && flow->l4.tcp.ssl_stage == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "first ssl packet\n"); // SSLv2 Record if (packet->payload[2] == 0x01 && packet->payload[3] == 0x03 && (packet->payload[4] == 0x00 || packet->payload[4] == 0x01 || packet->payload[4] == 0x02) && (packet->payload_packet_len - packet->payload[1] == 2)) { IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "sslv2 len match\n"); flow->l4.tcp.ssl_stage = 1 + packet->packet_direction; return; } if (packet->payload[0] == 0x16 && packet->payload[1] == 0x03 && (packet->payload[2] == 0x00 || packet->payload[2] == 0x01 || packet->payload[2] == 0x02) && (packet->payload_packet_len - ntohs(get_u16(packet->payload, 3)) == 5)) { // SSLv3 Record IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "sslv3 len match\n"); flow->l4.tcp.ssl_stage = 1 + packet->packet_direction; return; } } if (packet->payload_packet_len > 40 && flow->l4.tcp.ssl_stage == 1 + packet->packet_direction && flow->packet_direction_counter[packet->packet_direction] < 5) { return; } if (packet->payload_packet_len > 40 && flow->l4.tcp.ssl_stage == 2 - packet->packet_direction) { IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "second ssl packet\n"); // SSLv2 Record if (packet->payload[2] == 0x01 && packet->payload[3] == 0x03 && (packet->payload[4] == 0x00 || packet->payload[4] == 0x01 || packet->payload[4] == 0x02) && (packet->payload_packet_len - 2) >= packet->payload[1]) { IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "sslv2 server len match\n"); ssl_mark_and_payload_search_for_other_protocols(ipoque_struct); return; } ret = ipoque_search_sslv3_direction1(ipoque_struct); if (ret == 1) { IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "sslv3 server len match\n"); ssl_mark_and_payload_search_for_other_protocols(ipoque_struct); return; } else if (ret == 2) { IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "sslv3 server len match with split packet -> check some more packets for SSL patterns\n"); ssl_mark_and_payload_search_for_other_protocols(ipoque_struct); if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SSL) { flow->l4.tcp.ssl_stage = 3; } return; } if (packet->payload_packet_len > 40 && flow->packet_direction_counter[packet->packet_direction] < 5) { IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "need next packet\n"); return; } } IPQ_LOG(IPOQUE_PROTOCOL_SSL, ipoque_struct, IPQ_LOG_DEBUG, "exclude ssl\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SSL); return; } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/ntp.c0000644000000000000000000000422711655273464017335 0ustar rootroot/* * ntp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_NTP static void ipoque_int_ntp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_NTP, IPOQUE_REAL_PROTOCOL); } /* detection also works asymmetrically */ void ipoque_search_ntp_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (!(packet->udp->dest == htons(123) || packet->udp->source == htons(123))) goto exclude_ntp; IPQ_LOG(IPOQUE_PROTOCOL_NTP, ipoque_struct, IPQ_LOG_DEBUG, "NTP port detected\n"); if (packet->payload_packet_len != 48) goto exclude_ntp; IPQ_LOG(IPOQUE_PROTOCOL_NTP, ipoque_struct, IPQ_LOG_DEBUG, "NTP length detected\n"); if ((((packet->payload[0] & 0x38) >> 3) <= 4)) { IPQ_LOG(IPOQUE_PROTOCOL_NTP, ipoque_struct, IPQ_LOG_DEBUG, "detected NTP."); ipoque_int_ntp_add_connection(ipoque_struct); return; } exclude_ntp: IPQ_LOG(IPOQUE_PROTOCOL_NTP, ipoque_struct, IPQ_LOG_DEBUG, "NTP excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_NTP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/kontiki.c0000644000000000000000000000454211655273464020204 0ustar rootroot/* * kontiki.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_KONTIKI static void ipoque_int_kontiki_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_KONTIKI, IPOQUE_REAL_PROTOCOL); } void ipoque_search_kontiki(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len == 4 && (get_u32(packet->payload, 0) == htonl(0x02010100))) { IPQ_LOG(IPOQUE_PROTOCOL_KONTIKI, ipoque_struct, IPQ_LOG_DEBUG, "Kontiki UDP detected.\n"); ipoque_int_kontiki_add_connection(ipoque_struct); return; } if (packet->payload_packet_len > 0 && packet->payload[0] == 0x02) { if (packet->payload_packet_len == 20 && (get_u32(packet->payload, 16) == htonl(0x02040100))) { IPQ_LOG(IPOQUE_PROTOCOL_KONTIKI, ipoque_struct, IPQ_LOG_DEBUG, "Kontiki UDP detected.\n"); ipoque_int_kontiki_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 16 && (get_u32(packet->payload, 12) == htonl(0x000004e4))) { IPQ_LOG(IPOQUE_PROTOCOL_KONTIKI, ipoque_struct, IPQ_LOG_DEBUG, "Kontiki UDP detected.\n"); ipoque_int_kontiki_add_connection(ipoque_struct); return; } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_KONTIKI); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/ssdp.c0000644000000000000000000000453311666771321017502 0ustar rootroot/* * ssdp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_SSDP static void ipoque_int_ssdp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SSDP, IPOQUE_REAL_PROTOCOL); } /* this detection also works asymmetrically */ void ipoque_search_ssdp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_SSDP, ipoque_struct, IPQ_LOG_DEBUG, "search ssdp.\n"); if (packet->udp != NULL) { if (packet->payload_packet_len > 100) { if ((memcmp(packet->payload, "M-SEARCH * HTTP/1.1", 19) == 0) || memcmp(packet->payload, "NOTIFY * HTTP/1.1", 17) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SSDP, ipoque_struct, IPQ_LOG_DEBUG, "found ssdp.\n"); ipoque_int_ssdp_add_connection(ipoque_struct); return; } #ifdef HAVE_NTOP #define SSDP_HTTP "HTTP/1.1 200 OK\r\n" if(memcmp(packet->payload, SSDP_HTTP, strlen(SSDP_HTTP)) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SSDP, ipoque_struct, IPQ_LOG_DEBUG, "found ssdp.\n"); ipoque_int_ssdp_add_connection(ipoque_struct); return; } #endif } } IPQ_LOG(IPOQUE_PROTOCOL_SSDP, ipoque_struct, IPQ_LOG_DEBUG, "ssdp excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SSDP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/crossfire.c0000644000000000000000000000612111655273464020526 0ustar rootroot/* * crossfire.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_CROSSFIRE static void ipoque_int_crossfire_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_CROSSFIRE, protocol_type); } void ipoque_search_crossfire_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_CROSSFIRE, ipoque_struct, IPQ_LOG_DEBUG, "search crossfire.\n"); if (packet->udp != 0) { if (packet->payload_packet_len == 25 && get_u32(packet->payload, 0) == ntohl(0xc7d91999) && get_u16(packet->payload, 4) == ntohs(0x0200) && get_u16(packet->payload, 22) == ntohs(0x7d00) ) { IPQ_LOG(IPOQUE_PROTOCOL_CROSSFIRE, ipoque_struct, IPQ_LOG_DEBUG, "Crossfire: found udp packet.\n"); ipoque_int_crossfire_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } else if (packet->tcp != 0) { if (packet->payload_packet_len > 4 && memcmp(packet->payload, "GET /", 5) == 0) { ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines == 8 && (packet->line[0].ptr != NULL && packet->line[0].len >= 30 && (memcmp(&packet->payload[5], "notice/login_big", 16) == 0 || memcmp(&packet->payload[5], "notice/login_small", 18) == 0)) && memcmp(&packet->payload[packet->line[0].len - 19], "/index.asp HTTP/1.", 18) == 0 && (packet->host_line.ptr != NULL && packet->host_line.len >= 13 && (memcmp(packet->host_line.ptr, "crossfire", 9) == 0 || memcmp(packet->host_line.ptr, "www.crossfire", 13) == 0)) ) { IPQ_LOG(IPOQUE_PROTOCOL_CROSSFIRE, ipoque_struct, IPQ_LOG_DEBUG, "Crossfire: found HTTP request.\n"); ipoque_int_crossfire_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } IPQ_LOG(IPOQUE_PROTOCOL_CROSSFIRE, ipoque_struct, IPQ_LOG_DEBUG, "exclude crossfire.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_CROSSFIRE); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/manolito.c0000644000000000000000000001551511655273464020360 0ustar rootroot/* * manolito.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_MANOLITO static void ipoque_int_manolito_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MANOLITO, IPOQUE_REAL_PROTOCOL); if (src != NULL) { if (packet->udp != NULL) { src->manolito_last_pkt_arrival_time = packet->tick_timestamp; } } if (dst != NULL) { if (packet->udp != NULL) { dst->manolito_last_pkt_arrival_time = packet->tick_timestamp; } } } /* return 0 if nothing has been detected return 1 if it is a megaupload packet */ u8 search_manolito_tcp(struct ipoque_detection_module_struct *ipoque_struct); u8 search_manolito_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src = ipoque_struct->src; // struct ipoque_id_struct *dst = ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO TCP DETECTION\n"); if (flow->l4.tcp.manolito_stage == 0 && packet->payload_packet_len > 6) { if (ipq_mem_cmp(packet->payload, "SIZ ", 4) != 0) goto end_manolito_nothing_found; flow->l4.tcp.manolito_stage = 1 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO Stage 1.\n"); goto end_manolito_maybe_hit; } else if ((flow->l4.tcp.manolito_stage == 2 - packet->packet_direction) && packet->payload_packet_len > 4) { if (ipq_mem_cmp(packet->payload, "STR ", 4) != 0) goto end_manolito_nothing_found; IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO Stage 2.\n"); flow->l4.tcp.manolito_stage = 3 + packet->packet_direction; goto end_manolito_maybe_hit; } else if ((flow->l4.tcp.manolito_stage == 4 - packet->packet_direction) && packet->payload_packet_len > 5) { if (ipq_mem_cmp(packet->payload, "MD5 ", 4) != 0) goto end_manolito_nothing_found; IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO Stage 3.\n"); flow->l4.tcp.manolito_stage = 5 + packet->packet_direction; goto end_manolito_maybe_hit; } else if ((flow->l4.tcp.manolito_stage == 6 - packet->packet_direction) && packet->payload_packet_len == 4) { if (ipq_mem_cmp(packet->payload, "GO!!", 4) != 0) goto end_manolito_nothing_found; IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO Stage 4.\n"); goto end_manolito_found; } //IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO,ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO FLOW STAGE %d\n", flow->l4.tcp.manolito_stage); goto end_manolito_nothing_found; end_manolito_found: IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO FOUND\n"); ipoque_int_manolito_add_connection(ipoque_struct); return 1; end_manolito_maybe_hit: IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO maybe hit.\n"); return 2; end_manolito_nothing_found: IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO NOTHING FOUND\n"); return 0; } void ipoque_search_manolito_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->tcp != NULL) { if (search_manolito_tcp(ipoque_struct) != 0) return; } else if (packet->udp != NULL) { if (flow->detected_protocol_stack[0] == IPOQUE_PROTOCOL_MANOLITO) { if (src != NULL) { src->manolito_last_pkt_arrival_time = packet->tick_timestamp; } if (dst != NULL) { dst->manolito_last_pkt_arrival_time = packet->tick_timestamp; } return; } else if (packet->udp->source == htons(41170) || packet->udp->dest == htons(41170)) { if (src != NULL && src->manolito_last_pkt_arrival_time != 0 && (packet->tick_timestamp - src->manolito_last_pkt_arrival_time < ipoque_struct->manolito_subscriber_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO: UDP detected \n"); ipoque_int_manolito_add_connection(ipoque_struct); return; } else if (src != NULL && (packet->tick_timestamp - src->manolito_last_pkt_arrival_time) >= ipoque_struct->manolito_subscriber_timeout) { src->manolito_last_pkt_arrival_time = 0; } if (dst != NULL && dst->manolito_last_pkt_arrival_time != 0 && (packet->tick_timestamp - dst->manolito_last_pkt_arrival_time < ipoque_struct->manolito_subscriber_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO: UDP detected \n"); ipoque_int_manolito_add_connection(ipoque_struct); return; } else if (dst != NULL && (packet->tick_timestamp - dst->manolito_last_pkt_arrival_time) >= ipoque_struct->manolito_subscriber_timeout) { dst->manolito_last_pkt_arrival_time = 0; } if ((packet->payload_packet_len == 20 && htons(0x3d4b) == get_u16(packet->payload, 0) && packet->payload[2] == 0xd9 && htons(0xedbb) == get_u16(packet->payload, 16)) || (packet->payload_packet_len == 25 && htons(0x3e4a) == get_u16(packet->payload, 0) && htons(0x092f) == get_u16(packet->payload, 20) && packet->payload[22] == 0x20) || (packet->payload_packet_len == 20 && !get_u16(packet->payload, 2) && !get_u32(packet->payload, 8) && !get_u16(packet->payload, 18) && get_u16(packet->payload, 0)) ) { //20B pkt is For PING IPQ_LOG(IPOQUE_PROTOCOL_MANOLITO, ipoque_struct, IPQ_LOG_DEBUG, "MANOLITO: UDP detected \n"); ipoque_int_manolito_add_connection(ipoque_struct); return; } else if (flow->packet_counter < 7) { return; } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MANOLITO); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/shoutcast.c0000644000000000000000000001011111655273464020536 0ustar rootroot/* * shoutcast.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_SHOUTCAST static void ipoque_int_shoutcast_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SHOUTCAST, IPOQUE_CORRELATED_PROTOCOL); } void ipoque_search_shoutcast_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "search shoutcast.\n"); if (flow->packet_counter == 1) { /* this case in paul_upload_oddcast_002.pcap */ if (packet->payload_packet_len >= 6 && packet->payload_packet_len < 80 && memcmp(packet->payload, "123456", 6) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "Shoutcast stage 1, \"123456\".\n"); return; } if (flow->packet_counter < 3 #ifdef IPOQUE_PROTOCOL_HTTP && packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP #endif ) { IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "http detected, need next packet for shoutcast detection.\n"); if (packet->payload_packet_len > 4 && get_u32(packet->payload, packet->payload_packet_len - 4) != htonl(0x0d0a0d0a)) { IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "segmented packet found.\n"); flow->l4.tcp.shoutcast_stage = 1 + packet->packet_direction; } return; } /* else goto exclude_shoutcast; */ } /* evtl. für asym detection noch User-Agent:Winamp dazunehmen. */ if (packet->payload_packet_len > 11 && memcmp(packet->payload, "ICY 200 OK\x0d\x0a", 12) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "found shoutcast by ICY 200 OK.\n"); ipoque_int_shoutcast_add_connection(ipoque_struct); return; } if (flow->l4.tcp.shoutcast_stage == 1 + packet->packet_direction && flow->packet_direction_counter[packet->packet_direction] < 5) { return; } if (flow->packet_counter == 2) { if (packet->payload_packet_len == 2 && memcmp(packet->payload, "\x0d\x0a", 2) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "Shoutcast stage 1 continuation.\n"); return; } else if (packet->payload_packet_len > 3 && ipq_mem_cmp(&packet->payload[0], "OK2", 3) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "Shoutcast stage 2, OK2 found.\n"); return; } else goto exclude_shoutcast; } else if (flow->packet_counter == 3 || flow->packet_counter == 4) { if (packet->payload_packet_len > 3 && ipq_mem_cmp(&packet->payload[0], "OK2", 3) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "Shoutcast stage 2, OK2 found.\n"); return; } else if (packet->payload_packet_len > 4 && ipq_mem_cmp(&packet->payload[0], "icy-", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "Shoutcast detected.\n"); ipoque_int_shoutcast_add_connection(ipoque_struct); return; } else goto exclude_shoutcast; } exclude_shoutcast: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SHOUTCAST); IPQ_LOG(IPOQUE_PROTOCOL_SHOUTCAST, ipoque_struct, IPQ_LOG_DEBUG, "Shoutcast excluded.\n"); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/kerberos.c0000644000000000000000000000512411655273464020345 0ustar rootroot/* * kerberos.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_KERBEROS static void ipoque_int_kerberos_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_KERBEROS, IPOQUE_REAL_PROTOCOL); } void ipoque_search_kerberos(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; /* I have observed 0a,0c,0d,0e at packet->payload[19/21], maybe there are other possibilities */ if (packet->payload_packet_len >= 4 && ntohl(get_u32(packet->payload, 0)) == packet->payload_packet_len - 4) { if (packet->payload_packet_len > 19 && packet->payload[14] == 0x05 && (packet->payload[19] == 0x0a || packet->payload[19] == 0x0c || packet->payload[19] == 0x0d || packet->payload[19] == 0x0e)) { IPQ_LOG(IPOQUE_PROTOCOL_KERBEROS, ipoque_struct, IPQ_LOG_DEBUG, "found KERBEROS\n"); ipoque_int_kerberos_add_connection(ipoque_struct); return; } if (packet->payload_packet_len > 21 && packet->payload[16] == 0x05 && (packet->payload[21] == 0x0a || packet->payload[21] == 0x0c || packet->payload[21] == 0x0d || packet->payload[21] == 0x0e)) { IPQ_LOG(IPOQUE_PROTOCOL_KERBEROS, ipoque_struct, IPQ_LOG_DEBUG, "found KERBEROS\n"); ipoque_int_kerberos_add_connection(ipoque_struct); return; } } IPQ_LOG(IPOQUE_PROTOCOL_KERBEROS, ipoque_struct, IPQ_LOG_DEBUG, "no KERBEROS detected.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_KERBEROS); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/tds.c0000644000000000000000000000552411655273464017327 0ustar rootroot/* * tds.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_TDS static void ipoque_int_tds_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_TDS, IPOQUE_REAL_PROTOCOL); } void ipoque_search_tds_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 8 && packet->payload_packet_len < 512 && packet->payload[1] < 0x02 && ntohs(get_u16(packet->payload, 2)) == packet->payload_packet_len && get_u16(packet->payload, 4) == 0x0000) { if (flow->l4.tcp.tds_stage == 0) { if (packet->payload[0] != 0x02 && packet->payload[0] != 0x07 && packet->payload[0] != 0x12) { goto exclude_tds; } else { flow->l4.tcp.tds_stage = 1 + packet->packet_direction; flow->l4.tcp.tds_login_version = packet->payload[0]; return; } } else if (flow->l4.tcp.tds_stage == 2 - packet->packet_direction) { switch (flow->l4.tcp.tds_login_version) { case 0x12: if (packet->payload[0] == 0x04) { flow->l4.tcp.tds_stage = 3 + packet->packet_direction; return; } else { goto exclude_tds; } //TODO: add more cases for other versions default: goto exclude_tds; } } else if (flow->l4.tcp.tds_stage == 4 - packet->packet_direction) { switch (flow->l4.tcp.tds_login_version) { case 0x12: if (packet->payload[0] == 0x12) { IPQ_LOG(IPOQUE_PROTOCOL_TDS, ipoque_struct, IPQ_LOG_DEBUG, "TDS detected\n"); ipoque_int_tds_add_connection(ipoque_struct); return; } else { goto exclude_tds; } //TODO: add more cases for other versions default: goto exclude_tds; } } } exclude_tds: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_TDS); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/xdmcp.c0000644000000000000000000000504711655273464017650 0ustar rootroot/* * xdmcp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_XDMCP static void ipoque_int_xdmcp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_XDMCP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_xdmcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_XDMCP, ipoque_struct, IPQ_LOG_DEBUG, "search xdmcp.\n"); if (packet->tcp != NULL && (ntohs(packet->tcp->dest) >= 6000 && ntohs(packet->tcp->dest) <= 6005) && packet->payload_packet_len == 48 && packet->payload[0] == 0x6c && packet->payload[1] == 0x00 && ntohs(get_u16(packet->payload, 6)) == 0x1200 && ntohs(get_u16(packet->payload, 8)) == 0x1000) { IPQ_LOG(IPOQUE_PROTOCOL_XDMCP, ipoque_struct, IPQ_LOG_DEBUG, "found xdmcp over tcp.\n"); ipoque_int_xdmcp_add_connection(ipoque_struct); return; } if (packet->udp != NULL && ntohs(packet->udp->dest) == 177 && packet->payload_packet_len >= 6 && packet->payload_packet_len == 6 + ntohs(get_u16(packet->payload, 4)) && ntohs(get_u16(packet->payload, 0)) == 0x0001 && ntohs(get_u16(packet->payload, 2)) == 0x0002) { IPQ_LOG(IPOQUE_PROTOCOL_XDMCP, ipoque_struct, IPQ_LOG_DEBUG, "found xdmcp over udp.\n"); ipoque_int_xdmcp_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_XDMCP, ipoque_struct, IPQ_LOG_DEBUG, "exclude xdmcp.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_XDMCP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/ftp.c0000644000000000000000000003740611661524573017327 0ustar rootroot/* * ftp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_FTP static void ipoque_int_ftp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FTP, IPOQUE_REAL_PROTOCOL); } /** * checks for possible FTP command * not all valid commands are tested, it just need to be 3 or 4 characters followed by a space if the * packet is longer * * this functions is not used to accept, just to not reject */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 ipoque_int_check_possible_ftp_command(const struct ipoque_packet_struct *packet) { if (packet->payload_packet_len < 3) return 0; if ((packet->payload[0] < 'a' || packet->payload[0] > 'z') && (packet->payload[0] < 'A' || packet->payload[0] > 'Z')) return 0; if ((packet->payload[1] < 'a' || packet->payload[1] > 'z') && (packet->payload[1] < 'A' || packet->payload[1] > 'Z')) return 0; if ((packet->payload[2] < 'a' || packet->payload[2] > 'z') && (packet->payload[2] < 'A' || packet->payload[2] > 'Z')) return 0; if (packet->payload_packet_len > 3) { if ((packet->payload[3] < 'a' || packet->payload[3] > 'z') && (packet->payload[3] < 'A' || packet->payload[3] > 'Z') && packet->payload[3] != ' ') return 0; if (packet->payload_packet_len > 4) { if (packet->payload[3] != ' ' && packet->payload[4] != ' ') return 0; } } return 1; } /** * ftp replies are are 3-digit number followed by space or hyphen */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 ipoque_int_check_possible_ftp_reply(const struct ipoque_packet_struct *packet) { if (packet->payload_packet_len < 5) return 0; if (packet->payload[3] != ' ' && packet->payload[3] != '-') return 0; if (packet->payload[0] < '0' || packet->payload[0] > '9') return 0; if (packet->payload[1] < '0' || packet->payload[1] > '9') return 0; if (packet->payload[2] < '0' || packet->payload[2] > '9') return 0; return 1; } /** * check for continuation replies * there is no real indication whether it is a continuation message, we just * require that there are at least 5 ascii characters */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 ipoque_int_check_possible_ftp_continuation_reply(const struct ipoque_packet_struct *packet) { u16 i; if (packet->payload_packet_len < 5) return 0; for (i = 0; i < 5; i++) { if (packet->payload[i] < ' ' || packet->payload[i] > 127) return 0; } return 1; } /* * these are the commands we tracking and expecting to see */ enum { FTP_USER_CMD = 1 << 0, FTP_FEAT_CMD = 1 << 1, FTP_COMMANDS = ((1 << 2) - 1), FTP_220_CODE = 1 << 2, FTP_331_CODE = 1 << 3, FTP_211_CODE = 1 << 4, FTP_CODES = ((1 << 5) - 1 - FTP_COMMANDS) }; /* return 0 if nothing has been detected return 1 if a pop packet */ static u8 search_ftp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; u8 current_ftp_code = 0; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; /* initiate client direction flag */ if (flow->packet_counter == 1) { if (flow->l4.tcp.seen_syn) { flow->l4.tcp.ftp_client_direction = flow->setup_packet_direction; } else { /* no syn flag seen so guess */ if (packet->payload_packet_len > 0) { if (packet->payload[0] >= '0' && packet->payload[0] <= '9') { /* maybe server side */ flow->l4.tcp.ftp_client_direction = 1 - packet->packet_direction; } else { flow->l4.tcp.ftp_client_direction = packet->packet_direction; } } } } if (packet->packet_direction == flow->l4.tcp.ftp_client_direction) { if (packet->payload_packet_len > IPQ_STATICSTRING_LEN("USER ") && (memcmp(packet->payload, "USER ", IPQ_STATICSTRING_LEN("USER ")) == 0 || memcmp(packet->payload, "user ", IPQ_STATICSTRING_LEN("user ")) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP: found USER command\n"); flow->l4.tcp.ftp_codes_seen |= FTP_USER_CMD; current_ftp_code = FTP_USER_CMD; } else if (packet->payload_packet_len >= IPQ_STATICSTRING_LEN("FEAT") && (memcmp(packet->payload, "FEAT", IPQ_STATICSTRING_LEN("FEAT")) == 0 || memcmp(packet->payload, "feat", IPQ_STATICSTRING_LEN("feat")) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP: found FEAT command\n"); flow->l4.tcp.ftp_codes_seen |= FTP_FEAT_CMD; current_ftp_code = FTP_FEAT_CMD; } else if (!ipoque_int_check_possible_ftp_command(packet)) { return 0; } } else { if (packet->payload_packet_len > IPQ_STATICSTRING_LEN("220 ") && (memcmp(packet->payload, "220 ", IPQ_STATICSTRING_LEN("220 ")) == 0 || memcmp(packet->payload, "220-", IPQ_STATICSTRING_LEN("220-")) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP: found 220 reply code\n"); flow->l4.tcp.ftp_codes_seen |= FTP_220_CODE; current_ftp_code = FTP_220_CODE; } else if (packet->payload_packet_len > IPQ_STATICSTRING_LEN("331 ") && (memcmp(packet->payload, "331 ", IPQ_STATICSTRING_LEN("331 ")) == 0 || memcmp(packet->payload, "331-", IPQ_STATICSTRING_LEN("331-")) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP: found 331 reply code\n"); flow->l4.tcp.ftp_codes_seen |= FTP_331_CODE; current_ftp_code = FTP_331_CODE; } else if (packet->payload_packet_len > IPQ_STATICSTRING_LEN("211 ") && (memcmp(packet->payload, "211 ", IPQ_STATICSTRING_LEN("211 ")) == 0 || memcmp(packet->payload, "211-", IPQ_STATICSTRING_LEN("211-")) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP: found 211reply code\n"); flow->l4.tcp.ftp_codes_seen |= FTP_211_CODE; current_ftp_code = FTP_211_CODE; } else if (!ipoque_int_check_possible_ftp_reply(packet)) { if ((flow->l4.tcp.ftp_codes_seen & FTP_CODES) == 0 || (!ipoque_int_check_possible_ftp_continuation_reply(packet))) { return 0; } } } if ((flow->l4.tcp.ftp_codes_seen & FTP_COMMANDS) != 0 && (flow->l4.tcp.ftp_codes_seen & FTP_CODES) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP detected\n"); ipoque_int_ftp_add_connection(ipoque_struct); return 1; } /* if no valid code has been seen for the first packets reject */ if (flow->l4.tcp.ftp_codes_seen == 0 && flow->packet_counter > 3) return 0; /* otherwise wait more packets, wait more for traffic on known ftp port */ if ((packet->packet_direction == flow->setup_packet_direction && packet->tcp && packet->tcp->dest == htons(21)) || (packet->packet_direction != flow->setup_packet_direction && packet->tcp && packet->tcp->source == htons(21))) { /* flow to known ftp port */ /* wait much longer if this was a 220 code, initial messages might be long */ if (current_ftp_code == FTP_220_CODE) { if (flow->packet_counter > 40) return 0; } else { if (flow->packet_counter > 20) return 0; } } else { /* wait much longer if this was a 220 code, initial messages might be long */ if (current_ftp_code == FTP_220_CODE) { if (flow->packet_counter > 20) return 0; } else { if (flow->packet_counter > 10) return 0; } } return 2; } static void search_passive_ftp_mode(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *dst = ipoque_struct->dst; struct ipoque_id_struct *src = ipoque_struct->src; u16 plen; u8 i; u32 ftp_ip; // TODO check if normal passive mode also needs adaption for ipv6 if (packet->payload_packet_len > 3 && ipq_mem_cmp(packet->payload, "227 ", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP passive mode initial string\n"); plen = 4; //=4 for "227 " while (1) { if (plen >= packet->payload_packet_len) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "plen >= packet->payload_packet_len, return\n"); return; } if (packet->payload[plen] == '(') { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "found (. break.\n"); break; } /* if (!isalnum(packet->payload[plen])) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "no alpha numeric symbol --> break.\n"); return; }*/ plen++; } plen++; if (plen >= packet->payload_packet_len) return; ftp_ip = 0; for (i = 0; i < 4; i++) { u16 oldplen = plen; ftp_ip = (ftp_ip << 8) + ipq_bytestream_to_number(&packet->payload[plen], packet->payload_packet_len - plen, &plen); if (oldplen == plen || plen >= packet->payload_packet_len) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP passive mode %u value parse failed\n", i); return; } if (packet->payload[plen] != ',') { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP passive mode %u value parse failed, char ',' is missing\n", i); return; } plen++; IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP passive mode %u value parsed, ip is now: %u\n", i, ftp_ip); } if (dst != NULL) { dst->ftp_ip.ipv4 = htonl(ftp_ip); dst->ftp_timer = packet->tick_timestamp; dst->ftp_timer_set = 1; IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "saved ftp_ip, ftp_timer, ftp_timer_set to dst"); IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP PASSIVE MODE FOUND: use Server %s\n", ipq_get_ip_string(ipoque_struct, &dst->ftp_ip)); } if (src != NULL) { src->ftp_ip.ipv4 = packet->iph->daddr; src->ftp_timer = packet->tick_timestamp; src->ftp_timer_set = 1; IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "saved ftp_ip, ftp_timer, ftp_timer_set to src"); IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP PASSIVE MODE FOUND: use Server %s\n", ipq_get_ip_string(ipoque_struct, &src->ftp_ip)); } return; } if (packet->payload_packet_len > 34 && ipq_mem_cmp(packet->payload, "229 Entering Extended Passive Mode", 34) == 0) { if (dst != NULL) { ipq_packet_src_ip_get(packet, &dst->ftp_ip); dst->ftp_timer = packet->tick_timestamp; dst->ftp_timer_set = 1; IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "saved ftp_ip, ftp_timer, ftp_timer_set to dst"); IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP Extended PASSIVE MODE FOUND: use Server %s\n", ipq_get_ip_string(ipoque_struct, &dst->ftp_ip)); } if (src != NULL) { ipq_packet_dst_ip_get(packet, &src->ftp_ip); src->ftp_timer = packet->tick_timestamp; src->ftp_timer_set = 1; IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "saved ftp_ip, ftp_timer, ftp_timer_set to src"); IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP Extended PASSIVE MODE FOUND: use Server %s\n", ipq_get_ip_string(ipoque_struct, &src->ftp_ip)); } return; } } static void search_active_ftp_mode(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->payload_packet_len > 5 && (ipq_mem_cmp(packet->payload, "PORT ", 5) == 0 || ipq_mem_cmp(packet->payload, "EPRT ", 5) == 0)) { //src->local_ftp_data_port = htons(data_port_number); if (src != NULL) { ipq_packet_dst_ip_get(packet, &src->ftp_ip); src->ftp_timer = packet->tick_timestamp; src->ftp_timer_set = 1; IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP ACTIVE MODE FOUND, command is %.*s\n", 4, packet->payload); } if (dst != NULL) { ipq_packet_src_ip_get(packet, &dst->ftp_ip); dst->ftp_timer = packet->tick_timestamp; dst->ftp_timer_set = 1; IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP ACTIVE MODE FOUND, command is %.*s\n", 4, packet->payload); } } return; } void ipoque_search_ftp_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (src != NULL && ipq_packet_dst_ip_eql(packet, &src->ftp_ip) && packet->tcp->syn != 0 && packet->tcp->ack == 0 && packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_FTP) != 0 && src->ftp_timer_set != 0) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "possible ftp data, src!= 0.\n"); if (((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->ftp_timer)) >= ipoque_struct->ftp_connection_timeout) { src->ftp_timer_set = 0; } else if (ntohs(packet->tcp->dest) > 1024 && (ntohs(packet->tcp->source) > 1024 || ntohs(packet->tcp->source) == 20)) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "detected FTP data stream.\n"); ipoque_int_ftp_add_connection(ipoque_struct); return; } } if (dst != NULL && ipq_packet_src_ip_eql(packet, &dst->ftp_ip) && packet->tcp->syn != 0 && packet->tcp->ack == 0 && packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_FTP) != 0 && dst->ftp_timer_set != 0) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "possible ftp data; dst!= 0.\n"); if (((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->ftp_timer)) >= ipoque_struct->ftp_connection_timeout) { dst->ftp_timer_set = 0; } else if (ntohs(packet->tcp->dest) > 1024 && (ntohs(packet->tcp->source) > 1024 || ntohs(packet->tcp->source) == 20)) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "detected FTP data stream.\n"); ipoque_int_ftp_add_connection(ipoque_struct); return; } } // ftp data asymmetrically /* skip packets without payload */ if (packet->payload_packet_len == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "FTP test skip because of data connection or zero byte packet_payload.\n"); return; } /* skip excluded connections */ // we test for FTP connection and search for passive mode if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_FTP) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "detected ftp command mode. going to test data mode.\n"); search_passive_ftp_mode(ipoque_struct); search_active_ftp_mode(ipoque_struct); return; } if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN && search_ftp(ipoque_struct) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "unknown. need next packet.\n"); return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_FTP); IPQ_LOG(IPOQUE_PROTOCOL_FTP, ipoque_struct, IPQ_LOG_DEBUG, "exclude ftp.\n"); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/sflow.c0000644000000000000000000000324511666771321017662 0ustar rootroot/* * sflow.c * Copyright (C) 2011 by ntop.org * * This module is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License. * If not, see . * */ #include "ipq_utils.h" #ifdef NTOP_PROTOCOL_SFLOW static void ntop_check_sflow(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; const u8 *packet_payload = packet->payload; u32 payload_len = packet->payload_packet_len; if((ipoque_struct->packet.udp != NULL) && (payload_len >= 24) /* Version */ && (packet->payload[0] == 0) && (packet->payload[1] == 0) && (packet->payload[2] == 0) && ((packet->payload[3] == 2) || (packet->payload[3] == 5))) { IPQ_LOG(NTOP_PROTOCOL_SFLOW, ipoque_struct, IPQ_LOG_DEBUG, "Found sflow.\n"); ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_SFLOW, IPOQUE_REAL_PROTOCOL); return; } } void ntop_search_sflow(struct ipoque_detection_module_struct *ipoque_struct) { IPQ_LOG(NTOP_PROTOCOL_SFLOW, ipoque_struct, IPQ_LOG_DEBUG, "sflow detection...\n"); ntop_check_sflow(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/maplestory.c0000644000000000000000000000736011655273464020734 0ustar rootroot/* * maplestory.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_MAPLESTORY static void ipoque_int_maplestory_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MAPLESTORY, protocol_type); } void ipoque_search_maplestory(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len == 16 && (ntohl(get_u32(packet->payload, 0)) == 0x0e003a00 || ntohl(get_u32(packet->payload, 0)) == 0x0e003b00 || ntohl(get_u32(packet->payload, 0)) == 0x0e004200) && ntohs(get_u16(packet->payload, 4)) == 0x0100 && (packet->payload[6] == 0x32 || packet->payload[6] == 0x33)) { IPQ_LOG(IPOQUE_PROTOCOL_MAPLESTORY, ipoque_struct, IPQ_LOG_DEBUG, "found maplestory.\n"); ipoque_int_maplestory_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len > IPQ_STATICSTRING_LEN("GET /maple") && memcmp(packet->payload, "GET /maple", IPQ_STATICSTRING_LEN("GET /maple")) == 0) { ipq_parse_packet_line_info(ipoque_struct); /* Maplestory update */ if (packet->payload_packet_len > IPQ_STATICSTRING_LEN("GET /maple/patch") && packet->payload[IPQ_STATICSTRING_LEN("GET /maple")] == '/') { if (packet->user_agent_line.ptr != NULL && packet->host_line.ptr != NULL && packet->user_agent_line.len == IPQ_STATICSTRING_LEN("Patcher") && packet->host_line.len > IPQ_STATICSTRING_LEN("patch.") && memcmp(&packet->payload[IPQ_STATICSTRING_LEN("GET /maple/")], "patch", IPQ_STATICSTRING_LEN("patch")) == 0 && memcmp(packet->user_agent_line.ptr, "Patcher", IPQ_STATICSTRING_LEN("Patcher")) == 0 && memcmp(packet->host_line.ptr, "patch.", IPQ_STATICSTRING_LEN("patch.")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MAPLESTORY, ipoque_struct, IPQ_LOG_DEBUG, "found maplestory update.\n"); ipoque_int_maplestory_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } else if (packet->user_agent_line.ptr != NULL && packet->user_agent_line.len == IPQ_STATICSTRING_LEN("AspINet") && memcmp(&packet->payload[IPQ_STATICSTRING_LEN("GET /maple")], "story/", IPQ_STATICSTRING_LEN("story/")) == 0 && memcmp(packet->user_agent_line.ptr, "AspINet", IPQ_STATICSTRING_LEN("AspINet")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MAPLESTORY, ipoque_struct, IPQ_LOG_DEBUG, "found maplestory update.\n"); ipoque_int_maplestory_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } IPQ_LOG(IPOQUE_PROTOCOL_MAPLESTORY, ipoque_struct, IPQ_LOG_DEBUG, "exclude maplestory.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MAPLESTORY); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/dropbox.c0000644000000000000000000000456311671632230020200 0ustar rootroot/* * dropbox.c * Copyright (C) 2011 by ntop.org * * This module is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License. * If not, see . * */ #include "ipq_utils.h" #ifdef NTOP_PROTOCOL_DROPBOX static void ntop_int_dropbox_add_connection(struct ipoque_detection_module_struct *ipoque_struct, u8 due_to_correlation) { ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_DROPBOX, due_to_correlation ? IPOQUE_CORRELATED_PROTOCOL : IPOQUE_REAL_PROTOCOL); } static void ntop_check_dropbox(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; const u8 *packet_payload = packet->payload; u32 payload_len = packet->payload_packet_len; if(ipoque_struct->packet.udp != NULL) { u16 dropbox_port = htons(17500); if((ipoque_struct->packet.udp->source == dropbox_port) && (ipoque_struct->packet.udp->dest == dropbox_port)) { if(payload_len > 2) { if(strncmp(packet->payload, "{\"", 2) == 0) { IPQ_LOG(NTOP_PROTOCOL_DROPBOX, ipoque_struct, IPQ_LOG_DEBUG, "Found dropbox.\n"); ntop_int_dropbox_add_connection(ipoque_struct, 0); return; } } } } IPQ_LOG(NTOP_PROTOCOL_DROPBOX, ipoque_struct, IPQ_LOG_DEBUG, "exclude dropbox.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NTOP_PROTOCOL_DROPBOX); } void ntop_search_dropbox(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; IPQ_LOG(NTOP_PROTOCOL_DROPBOX, ipoque_struct, IPQ_LOG_DEBUG, "dropbox detection...\n"); /* skip marked packets */ if (packet->detected_protocol_stack[0] != NTOP_PROTOCOL_DROPBOX) { if (packet->tcp_retransmission == 0) { ntop_check_dropbox(ipoque_struct); } } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/dhcpv6.c0000644000000000000000000000401111655273464017715 0ustar rootroot/* * dhcpv6.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_DHCPV6 static void ipoque_int_dhcpv6_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_DHCPV6, IPOQUE_REAL_PROTOCOL); } void ipoque_search_dhcpv6_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len >= 4 && (packet->udp->source == htons(546) || packet->udp->source == htons(547)) && (packet->udp->dest == htons(546) || packet->udp->dest == htons(547)) && packet->payload[0] >= 1 && packet->payload[0] <= 13) { IPQ_LOG(IPOQUE_PROTOCOL_DHCPV6, ipoque_struct, IPQ_LOG_DEBUG, "DHCPv6 detected.\n"); ipoque_int_dhcpv6_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_DHCPV6, ipoque_struct, IPQ_LOG_DEBUG, "DHCPv6 excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_DHCPV6); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/skype.c0000644000000000000000000000654111712010111017634 0ustar rootroot/* * skype.c * Copyright (C) 2011 by ntop.org * * This module is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License. * If not, see . * */ #include "ipq_utils.h" #ifdef NTOP_PROTOCOL_SKYPE static u_int is_private_addr(u32 addr) { addr = ntohl(addr); if(((addr & 0xFF000000) == 0x0A000000) /* 10.0.0.0/8 */ || ((addr & 0xFFF00000) == 0xAC100000) /* 172.16/12 */ || ((addr & 0xFFFF0000) == 0xC0A80000) /* 192.168/16 */ || ((addr & 0xFF000000) == 0x7F000000) /* 127.0.0.0/8 */ ) return(1); else return(0); } static void ntop_check_skype(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; const u8 *packet_payload = packet->payload; u32 payload_len = packet->payload_packet_len; #if 0 printf("[len=%u][%02X %02X %02X %02X]\n", payload_len, packet->payload[0] & 0xFF, packet->payload[1] & 0xFF, packet->payload[2] & 0xFF, packet->payload[3] & 0xFF); #endif if(ipoque_struct->packet.udp != NULL) { flow->l4.udp.skype_packet_id++; if(flow->l4.udp.skype_packet_id < 5) { /* skype-to-skype */ if(((payload_len == 3) && ((packet->payload[2] & 0x0F)== 0x0d)) || ((payload_len >= 16) && (packet->payload[0] != 0x30) /* Avoid invalid SNMP detection */ && (packet->payload[2] == 0x02))) { IPQ_LOG(NTOP_PROTOCOL_SKYPE, ipoque_struct, IPQ_LOG_DEBUG, "Found skype.\n"); ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_SKYPE, IPOQUE_REAL_PROTOCOL); } return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NTOP_PROTOCOL_SKYPE); return; } else if(ipoque_struct->packet.tcp != NULL) { flow->l4.tcp.skype_packet_id++; if(flow->l4.tcp.skype_packet_id < 3) { ; /* Too early */ } else if((flow->l4.tcp.skype_packet_id == 3) /* We have seen the 3-way handshake */ && flow->l4.tcp.seen_syn && flow->l4.tcp.seen_syn_ack && flow->l4.tcp.seen_ack) { if((payload_len == 8) || (payload_len == 3)) { IPQ_LOG(NTOP_PROTOCOL_SKYPE, ipoque_struct, IPQ_LOG_DEBUG, "Found skype.\n"); ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_SKYPE, IPOQUE_REAL_PROTOCOL); } /* printf("[SKYPE] [id: %u][len: %d]\n", flow->l4.tcp.skype_packet_id, payload_len); */ } else IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NTOP_PROTOCOL_SKYPE); return; } } void ntop_search_skype(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; IPQ_LOG(NTOP_PROTOCOL_SKYPE, ipoque_struct, IPQ_LOG_DEBUG, "skype detection...\n"); /* skip marked packets */ if(packet->detected_protocol_stack[0] != NTOP_PROTOCOL_SKYPE) ntop_check_skype(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/non_tcp_udp.c0000644000000000000000000000703711655273464021046 0ustar rootroot/* * non_tcp_udp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #if defined(IPOQUE_PROTOCOL_IPSEC) || defined(IPOQUE_PROTOCOL_GRE) || defined(IPOQUE_PROTOCOL_ICMP) || defined(IPOQUE_PROTOCOL_IGMP) || defined(IPOQUE_PROTOCOL_EGP) || defined(IPOQUE_PROTOCOL_SCTP) || defined(IPOQUE_PROTOCOL_OSPF) || defined(IPOQUE_PROTOCOL_IP_IN_IP) #define IPQ_IPSEC_PROTOCOL_ESP 50 #define IPQ_IPSEC_PROTOCOL_AH 51 #define IPQ_GRE_PROTOCOL_TYPE 0x2F #define IPQ_ICMP_PROTOCOL_TYPE 0x01 #define IPQ_IGMP_PROTOCOL_TYPE 0x02 #define IPQ_EGP_PROTOCOL_TYPE 0x08 #define IPQ_OSPF_PROTOCOL_TYPE 0x59 #define IPQ_SCTP_PROTOCOL_TYPE 132 #define IPQ_IPIP_PROTOCOL_TYPE 0x04 #define IPQ_ICMPV6_PROTOCOL_TYPE 0x3a #define set_protocol_and_bmask(nprot) \ { \ if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask,nprot) != 0) \ { \ ipoque_int_add_connection(ipoque_struct, \ nprot, \ IPOQUE_REAL_PROTOCOL); \ } \ } void ipoque_search_in_non_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->iph == NULL) { #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (packet->iphv6 == NULL) #endif return; } switch (packet->l4_protocol) { #ifdef IPOQUE_PROTOCOL_IPSEC case IPQ_IPSEC_PROTOCOL_ESP: case IPQ_IPSEC_PROTOCOL_AH: set_protocol_and_bmask(IPOQUE_PROTOCOL_IPSEC); break; #endif /* IPOQUE_PROTOCOL_IPSEC */ #ifdef IPOQUE_PROTOCOL_GRE case IPQ_GRE_PROTOCOL_TYPE: set_protocol_and_bmask(IPOQUE_PROTOCOL_GRE); break; #endif /* IPOQUE_PROTOCOL_GRE */ #ifdef IPOQUE_PROTOCOL_ICMP case IPQ_ICMP_PROTOCOL_TYPE: set_protocol_and_bmask(IPOQUE_PROTOCOL_ICMP); break; #endif /* IPOQUE_PROTOCOL_ICMP */ #ifdef IPOQUE_PROTOCOL_IGMP case IPQ_IGMP_PROTOCOL_TYPE: set_protocol_and_bmask(IPOQUE_PROTOCOL_IGMP); break; #endif /* IPOQUE_PROTOCOL_IGMP */ #ifdef IPOQUE_PROTOCOL_EGP case IPQ_EGP_PROTOCOL_TYPE: set_protocol_and_bmask(IPOQUE_PROTOCOL_EGP); break; #endif /* IPOQUE_PROTOCOL_EGP */ #ifdef IPOQUE_PROTOCOL_SCTP case IPQ_SCTP_PROTOCOL_TYPE: set_protocol_and_bmask(IPOQUE_PROTOCOL_SCTP); break; #endif /* IPOQUE_PROTOCOL_SCTP */ #ifdef IPOQUE_PROTOCOL_OSPF case IPQ_OSPF_PROTOCOL_TYPE: set_protocol_and_bmask(IPOQUE_PROTOCOL_OSPF); break; #endif /* IPOQUE_PROTOCOL_OSPF */ #ifdef IPOQUE_PROTOCOL_IP_IN_IP case IPQ_IPIP_PROTOCOL_TYPE: set_protocol_and_bmask(IPOQUE_PROTOCOL_IP_IN_IP); break; #endif /* IPOQUE_PROTOCOL_IP_IN_IP */ #ifdef IPOQUE_PROTOCOL_ICMPV6 case IPQ_ICMPV6_PROTOCOL_TYPE: set_protocol_and_bmask(IPOQUE_PROTOCOL_ICMPV6); break; #endif /* IPOQUE_PROTOCOL_ICMPV6 */ } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/edonkey.c0000644000000000000000000001464311661524573020172 0ustar rootroot/* * edonkey.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_EDONKEY /* debug defines */ #define IPOQUE_PROTOCOL_SAFE_DETECTION 1 #define IPOQUE_PROTOCOL_PLAIN_DETECTION 0 static void ipoque_add_connection_as_edonkey(struct ipoque_detection_module_struct *ipoque_struct, const u8 save_detection, const u8 encrypted_connection) { ipoque_int_change_protocol(ipoque_struct, IPOQUE_PROTOCOL_EDONKEY, IPOQUE_REAL_PROTOCOL); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 check_edk_len(const u8 * payload, u16 payload_packet_len) { u32 edk_len_parsed = 0; // we use a do / while loop here, because we have checked the byte 0 for 0xe3 or 0xc5 already before this call do { u32 edk_len; edk_len = get_l32(payload, 1 + edk_len_parsed); /* if bigger, return here directly with an error... */ if (edk_len > payload_packet_len) return 0; /* this is critical here: * if (edk_len + 5) provokes an overflow to zero, we will have an infinite loop... * the check above does prevent this, bcause the edk_len must be ((u32)-5), which is always bigger than the packet size */ edk_len_parsed += 5 + edk_len; if (edk_len_parsed == payload_packet_len) return 1; if (edk_len_parsed > payload_packet_len) return 0; } while (payload[edk_len_parsed] == 0xe3 || payload[edk_len_parsed] == 0xc5 || payload[edk_len_parsed] == 0xd4); return 0; } static void ipoque_int_edonkey_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; int edk_stage2_len; /*len range increase if safe mode and also only once */ if (ipoque_struct->edonkey_safe_mode == 0) edk_stage2_len = 140; else if (!flow->l4.tcp.edk_ext || packet->payload_packet_len == 212) { edk_stage2_len = 300; } else edk_stage2_len = 140; /* skip excluded connections */ if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_EDONKEY) != 0) return; /* source and dst port must be 80 443 or > 1024 */ if (ipoque_struct->edonkey_upper_ports_only != 0) { u16 port; port = ntohs(packet->tcp->source); /* source and dst port must be 80 443 or > 1024 */ if (port < 1024 && port != 80 && port != 443) goto exclude_edk_tcp; port = ntohs(packet->tcp->dest); if (port < 1024 && port != 80 && port != 443) goto exclude_edk_tcp; } /* return here for empty packets, we needed them only for bt port detection */ if (packet->payload_packet_len == 0) return; /* skip marked packets */ if (flow->edk_stage == 0 && packet->detected_protocol_stack[0] != IPOQUE_PROTOCOL_UNKNOWN) return; /* first: check for unencrypted traffic */ if (flow->edk_stage == 0) { /* check for client hello */ if (packet->payload_packet_len >= 32 && get_l32(packet->payload, 1) <= (packet->payload_packet_len - 5) && (packet->payload[0] == 0xe3 || packet->payload[0] == 0xc5)) { if (packet->payload[5] == 0x01 && ((packet->payload[6] == 0x10 && get_l32(packet->payload, 29) < 0x0F) || (get_l32(packet->payload, 28) > 0x00 && get_l32(packet->payload, 28) < 0x0F))) { IPQ_LOG_EDONKEY(IPOQUE_PROTOCOL_EDONKEY, ipoque_struct, IPQ_LOG_DEBUG, "edk hello meta tag recognized\n"); flow->edk_stage = 16 + packet->packet_direction; return; } } } if ((17 - packet->packet_direction) == flow->edk_stage) { if ((packet->payload_packet_len >= 32 && get_l32(packet->payload, 1) == 9 && (packet->payload[0] == 0xe3) && packet->payload[5] == 0x40) || (packet->payload_packet_len >= 32 && (packet->payload[0] == 0xe3) && packet->payload[5] == 0x40 && check_edk_len(packet->payload, packet->payload_packet_len)) || (packet->payload_packet_len >= 32 && packet->payload[0] == 0xe3 && packet->payload[5] == 0x4c && (get_l32(packet->payload, 1) == (packet->payload_packet_len - 5) || check_edk_len(packet->payload, packet->payload_packet_len))) || (packet->payload_packet_len >= 32 && get_l32(packet->payload, 1) == (packet->payload_packet_len - 5) && packet->payload[0] == 0xe3 && packet->payload[5] == 0x38) || (packet->payload_packet_len >= 20 && get_l32(packet->payload, 1) == (packet->payload_packet_len - 5) && packet->payload[0] == 0xc5 && packet->payload[5] == 0x92) || (packet->payload_packet_len >= 20 && get_l32(packet->payload, 1) <= (packet->payload_packet_len - 5) && packet->payload[0] == 0xe3 && packet->payload[5] == 0x58) || (packet->payload_packet_len >= 20 && get_l32(packet->payload, 1) <= (packet->payload_packet_len - 5) && (packet->payload[0] == 0xe3 || packet->payload[0] == 0xc5) && packet->payload[5] == 0x01)) { IPQ_LOG_EDONKEY(IPOQUE_PROTOCOL_EDONKEY, ipoque_struct, IPQ_LOG_DEBUG, "edk 17: detected plain detection\n"); ipoque_add_connection_as_edonkey(ipoque_struct, IPOQUE_PROTOCOL_SAFE_DETECTION, IPOQUE_PROTOCOL_PLAIN_DETECTION); return; } IPQ_LOG_EDONKEY(IPOQUE_PROTOCOL_EDONKEY, ipoque_struct, IPQ_LOG_DEBUG, "edk 17: id: %u, %u, %u not detected\n", packet->payload[0], get_l32(packet->payload, 1), packet->payload[5]); } exclude_edk_tcp: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_EDONKEY); return; } void ipoque_search_edonkey(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->detected_protocol_stack[0] != IPOQUE_PROTOCOL_EDONKEY) { /* check for retransmission here */ if (packet->tcp != NULL && packet->tcp_retransmission == 0) ipoque_int_edonkey_tcp(ipoque_struct); } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/imesh.c0000644000000000000000000003560511655273464017645 0ustar rootroot/* * imesh.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_IMESH static void ipoque_int_imesh_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_IMESH, protocol_type); } void ipoque_search_imesh_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; if (packet->udp != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "UDP FOUND\n"); // this is the login packet if (packet->payload_packet_len == 28 && (get_u32(packet->payload, 0)) == htonl(0x02000000) && get_u32(packet->payload, 24) == 0 && (packet->udp->dest == htons(1864) || packet->udp->source == htons(1864))) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "iMesh Login detected\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 36) { if (get_u32(packet->payload, 0) == htonl(0x02000000) && packet->payload[4] != 0 && packet->payload[5] == 0 && get_u16(packet->payload, 6) == htons(0x0083) && get_u32(packet->payload, 24) == htonl(0x40000000) && (packet->payload[packet->payload_packet_len - 1] == packet->payload[packet->payload_packet_len - 5] || packet->payload[packet->payload_packet_len - 1] - 1 == packet->payload[packet->payload_packet_len - 5] || packet->payload[packet->payload_packet_len - 1] == packet->payload[packet->payload_packet_len - 5] - 1)) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "iMesh detected\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (get_u16(packet->payload, 0) == htons(0x0200) && get_u16(packet->payload, 2) != 0 && get_u32(packet->payload, 4) == htonl(0x02000083) && get_u32(packet->payload, 24) == htonl(0x40000000) && (packet->payload[packet->payload_packet_len - 1] == packet->payload[packet->payload_packet_len - 5] || packet->payload[packet->payload_packet_len - 1] - 1 == packet->payload[packet->payload_packet_len - 5] || packet->payload[packet->payload_packet_len - 1] == packet->payload[packet->payload_packet_len - 5] - 1)) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "iMesh detected\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } if (packet->payload_packet_len == 24 && get_u16(packet->payload, 0) == htons(0x0200) && get_u16(packet->payload, 2) != 0 && get_u32(packet->payload, 4) == htonl(0x03000084) && (packet->payload[packet->payload_packet_len - 1] == packet->payload[packet->payload_packet_len - 5] || packet->payload[packet->payload_packet_len - 1] - 1 == packet->payload[packet->payload_packet_len - 5] || packet->payload[packet->payload_packet_len - 1] == packet->payload[packet->payload_packet_len - 5] - 1)) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "iMesh detected\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 32 && get_u32(packet->payload, 0) == htonl(0x02000000) && get_u16(packet->payload, 21) == 0 && get_u16(packet->payload, 26) == htons(0x0100)) { if (get_u32(packet->payload, 4) == htonl(0x00000081) && packet->payload[11] == packet->payload[15] && get_l16(packet->payload, 24) == htons(packet->udp->source)) { /* packet->payload[28] = source address */ IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "iMesh detected\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (get_u32(packet->payload, 4) == htonl(0x01000082)) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "iMesh detected\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "iMesh UDP packetlen: %d\n", packet->payload_packet_len); } if (packet->tcp != NULL) { if (packet->payload_packet_len == 64 && get_u32(packet->payload, 0) == htonl(0x40000000) && get_u32(packet->payload, 4) == 0 && get_u32(packet->payload, 8) == htonl(0x0000fcff) && get_u32(packet->payload, 12) == htonl(0x04800100) && get_u32(packet->payload, 45) == htonl(0xff020000) && get_u16(packet->payload, 49) == htons(0x001a)) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "found imesh.\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 95 && get_u32(packet->payload, 0) == htonl(0x5f000000) && get_u16(packet->payload, 4) == 0 && get_u16(packet->payload, 7) == htons(0x0004) && get_u32(packet->payload, 20) == 0 && get_u32(packet->payload, 28) == htonl(0xc8000400) && packet->payload[9] == 0x80 && get_u32(packet->payload, 10) == get_u32(packet->payload, 24)) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "found imesh.\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 28 && get_u32(packet->payload, 0) == htonl(0x1c000000) && get_u16(packet->payload, 10) == htons(0xfcff) && get_u32(packet->payload, 12) == htonl(0x07801800) && (get_u16(packet->payload, packet->payload_packet_len - 2) == htons(0x1900) || get_u16(packet->payload, packet->payload_packet_len - 2) == htons(0x1a00))) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "found imesh.\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "TCP FOUND :: Payload %u\n", packet->payload_packet_len); if (packet->actual_payload_len == 0) { return; } if ((packet->actual_payload_len == 8 || packet->payload_packet_len == 10) /* PATTERN:: 04 00 00 00 00 00 00 00 [00 00] */ &&get_u32(packet->payload, 0) == htonl(0x04000000) && get_u32(packet->payload, 4) == 0) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 10 /* PATTERN:: ?? ?? 04|00 00 64|00 00 */ && (packet->payload[2] == 0x04 || packet->payload[2] == 0x00) && packet->payload[3] == 0x00 && (packet->payload[4] == 0x00 || packet->payload[4] == 0x64) && packet->payload[5] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 2 && packet->payload[0] == 0x06 && packet->payload[1] == 0x00) { flow->l4.tcp.imesh_stage++; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 10 /* PATTERN:: 06 00 04|00 00 01|00 00 01|00 00 ?? 00 */ && packet->payload[0] == 0x06 && packet->payload[1] == 0x00 && (packet->payload[2] == 0x04 || packet->payload[2] == 0x00) && packet->payload[3] == 0x00 && (packet->payload[4] == 0x00 || packet->payload[4] == 0x01) && packet->payload[5] == 0x00 && (packet->payload[6] == 0x01 || packet->payload[6] == 0x00) && packet->payload[7] == 0x00 && packet->payload[9] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 24 && packet->payload[0] == 0x06 // PATTERN :: 06 00 12 00 00 00 34 00 00 && packet->payload[1] == 0x00 && packet->payload[2] == 0x12 && packet->payload[3] == 0x00 && packet->payload[4] == 0x00 && packet->payload[5] == 0x00 && packet->payload[6] == 0x34 && packet->payload[7] == 0x00 && packet->payload[8] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 8 /* PATTERN:: 06|00 00 02 00 00 00 33 00 */ && (packet->payload[0] == 0x06 || packet->payload[0] == 0x00) && packet->payload[1] == 0x00 && packet->payload[2] == 0x02 && packet->payload[3] == 0x00 && packet->payload[4] == 0x00 && packet->payload[5] == 0x00 && packet->payload[6] == 0x33 && packet->payload[7] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->payload_packet_len == 6 /* PATTERN:: 02 00 00 00 33 00 */ && packet->payload[0] == 0x02 && packet->payload[1] == 0x00 && packet->payload[2] == 0x00 && packet->payload[3] == 0x00 && packet->payload[4] == 0x33 && packet->payload[5] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 12 && packet->payload[0] == 0x06 // PATTERN : 06 00 06 00 00 00 64 00 && packet->payload[1] == 0x00 && packet->payload[2] == 0x06 && packet->payload[3] == 0x00 && packet->payload[4] == 0x00 && packet->payload[5] == 0x00 && packet->payload[6] == 0x64 && packet->payload[7] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 10 /* PATTERN:: 06 00 04|01 00 00 00 01|00 00 ?? 00 */ && packet->payload[0] == 0x06 && packet->payload[1] == 0x00 && (packet->payload[2] == 0x04 || packet->payload[2] == 0x01) && packet->payload[3] == 0x00 && packet->payload[4] == 0x00 && packet->payload[5] == 0x00 && (packet->payload[6] == 0x01 || packet->payload[6] == 0x00) && packet->payload[7] == 0x00 /* && packet->payload[8]==0x00 */ && packet->payload[9] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if ((packet->actual_payload_len == 64 || packet->actual_payload_len == 52 /* PATTERN:: [len] 00 00 00 00 */ || packet->actual_payload_len == 95) && get_u16(packet->payload, 0) == (packet->actual_payload_len) && packet->payload[1] == 0x00 && packet->payload[2] == 0x00 && packet->payload[3] == 0x00 && packet->payload[4] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 6 && packet->payload[0] == 0x06 // PATTERN : 06 00 04|6c 00|01 00 00 && packet->payload[1] == 0x00 && (packet->payload[2] == 0x04 || packet->payload[2] == 0x6c) && (packet->payload[3] == 0x00 || packet->payload[3] == 0x01) && packet->payload[4] == 0x00 && packet->payload[5] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 6 /* PATTERN:: [len] ?? ee 00 00 00 */ && get_u16(packet->payload, 0) == (packet->actual_payload_len) && packet->payload[2] == 0xee && packet->payload[3] == 0x00 && packet->payload[4] == 0x00 && packet->payload[5] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } else if (packet->actual_payload_len == 10 /* PATTERN:: 06 00 00 00 00 00 00 00 */ && packet->payload[0] == 0x06 && packet->payload[1] == 0x00 && packet->payload[2] == 0x00 && packet->payload[3] == 0x00 && packet->payload[4] == 0x00 && packet->payload[5] == 0x00 && packet->payload[6] == 0x00 && packet->payload[7] == 0x00) { flow->l4.tcp.imesh_stage += 2; IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "IMESH FOUND :: Payload %u\n", packet->actual_payload_len); } /* http login */ if (packet->payload_packet_len > IPQ_STATICSTRING_LEN("POST /registration") && memcmp(packet->payload, "POST /registration", IPQ_STATICSTRING_LEN("POST /registration")) == 0) { ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines > 6 && packet->host_line.ptr != NULL && packet->host_line.len == IPQ_STATICSTRING_LEN("login.bearshare.com") && packet->line[1].ptr != NULL && packet->line[1].len == IPQ_STATICSTRING_LEN("Authorization: Basic Og==") && packet->line[4].ptr != NULL && packet->line[4].len == IPQ_STATICSTRING_LEN("Accept-Encoding: identity") && memcmp(packet->line[1].ptr, "Authorization: Basic Og==", IPQ_STATICSTRING_LEN("Authorization: Basic Og==")) == 0 && memcmp(packet->host_line.ptr, "login.bearshare.com", IPQ_STATICSTRING_LEN("login.bearshare.com")) == 0 && memcmp(packet->line[4].ptr, "Accept-Encoding: identity", IPQ_STATICSTRING_LEN("Accept-Encoding: identity") == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "iMesh Login detected\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } /*give one packet tolerance for detection */ if (flow->l4.tcp.imesh_stage >= 4) { IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "found imesh.\n"); ipoque_int_imesh_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } if ((flow->packet_counter < 5) || packet->actual_payload_len == 0) { return; } //imesh_not_found_end: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_IMESH); IPQ_LOG(IPOQUE_PROTOCOL_IMESH, ipoque_struct, IPQ_LOG_DEBUG, "iMesh excluded at stage %d\n", packet->tcp != NULL ? flow->l4.tcp.imesh_stage : 0); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/aimini.c0000644000000000000000000003120711655273464020000 0ustar rootroot/* * aimini.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_AIMINI static void ipoque_int_aimini_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_AIMINI, protocol_type); } static u8 is_special_aimini_host(struct ipoque_int_one_line_struct host_line) { if (host_line.ptr != NULL && host_line.len >= IPQ_STATICSTRING_LEN("X.X.X.X.aimini.net")) { if ((get_u32(host_line.ptr, 0) & htonl(0x00ff00ff)) == htonl(0x002e002e) && (get_u32(host_line.ptr, 4) & htonl(0x00ff00ff)) == htonl(0x002e002e) && memcmp(&host_line.ptr[8], "aimini.net", IPQ_STATICSTRING_LEN("aimini.net")) == 0) { return 1; } } return 0; } void ipoque_search_aimini(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "search aimini.\n"); if (packet->udp != NULL) { if (flow->l4.udp.aimini_stage == 0) { if (packet->payload_packet_len == 64 && ntohs(get_u16(packet->payload, 0)) == 0x010b) { flow->l4.udp.aimini_stage = 1; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 1.\n"); return; } if (packet->payload_packet_len == 136 && (ntohs(get_u16(packet->payload, 0)) == 0x01c9 || ntohs(get_u16(packet->payload, 0)) == 0x0165)) { flow->l4.udp.aimini_stage = 4; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 4.\n"); return; } if (packet->payload_packet_len == 88 && ntohs(get_u16(packet->payload, 0)) == 0x0101) { flow->l4.udp.aimini_stage = 7; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 7.\n"); return; } if (packet->payload_packet_len == 104 && ntohs(get_u16(packet->payload, 0)) == 0x0102) { flow->l4.udp.aimini_stage = 10; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 10.\n"); return; } if (packet->payload_packet_len == 32 && ntohs(get_u16(packet->payload, 0)) == 0x01ca) { flow->l4.udp.aimini_stage = 13; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 13.\n"); return; } if (packet->payload_packet_len == 16 && ntohs(get_u16(packet->payload, 0)) == 0x010c) { flow->l4.udp.aimini_stage = 16; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 16.\n"); return; } } /* first packet chronology: (len, value): (64, 0x010b), (>100, 0x0115), (16, 0x010c || 64, 0x010b || 88, 0x0115), * (16, 0x010c || 64, 0x010b || >100, 0x0115) */ if (flow->l4.udp.aimini_stage == 1 && packet->payload_packet_len > 100 && ntohs(get_u16(packet->payload, 0)) == 0x0115) { flow->l4.udp.aimini_stage = 2; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 2.\n"); return; } if (flow->l4.udp.aimini_stage == 2 && ((packet->payload_packet_len == 16 && get_u16(packet->payload, 0) == htons(0x010c)) || (packet->payload_packet_len == 64 && get_u16(packet->payload, 0) == htons(0x010b)) || (packet->payload_packet_len == 88 && get_u16(packet->payload, 0) == ntohs(0x0115)))) { flow->l4.udp.aimini_stage = 3; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 3.\n"); return; } if (flow->l4.udp.aimini_stage == 3 && ((packet->payload_packet_len == 16 && ntohs(get_u16(packet->payload, 0)) == 0x010c) || (packet->payload_packet_len == 64 && ntohs(get_u16(packet->payload, 0)) == 0x010b) || (packet->payload_packet_len > 100 && ntohs(get_u16(packet->payload, 0)) == 0x0115))) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "found aimini (64, 0x010b), (>300, 0x0115), " "(16, 0x010c || 64, 0x010b), (16, 0x010c || 64, 0x010b || >100, 0x0115).\n"); ipoque_int_aimini_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } /* second packet chronology: (len, value): (136, 0x01c9), (136, 0x01c9),(136, 0x01c9),(136, 0x01c9 || 32, 0x01ca) */ if (flow->l4.udp.aimini_stage == 4 && packet->payload_packet_len == 136 && (ntohs(get_u16(packet->payload, 0)) == 0x01c9 || ntohs(get_u16(packet->payload, 0)) == 0x0165)) { flow->l4.udp.aimini_stage = 5; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 5.\n"); return; } if (flow->l4.udp.aimini_stage == 5 && (packet->payload_packet_len == 136 && (ntohs(get_u16(packet->payload, 0)) == 0x01c9 || ntohs(get_u16(packet->payload, 0)) == 0x0165))) { flow->l4.udp.aimini_stage = 6; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 6.\n"); return; } if (flow->l4.udp.aimini_stage == 6 && ((packet->payload_packet_len == 136 && ((ntohs(get_u16(packet->payload, 0)) == 0x0165) || ntohs(get_u16(packet->payload, 0)) == 0x01c9)) || (packet->payload_packet_len == 32 && ntohs(get_u16(packet->payload, 0)) == 0x01ca))) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "found aimini (136, 0x01c9), (136, 0x01c9)," "(136, 0x01c9),(136, 0x01c9 || 32, 0x01ca).\n"); ipoque_int_aimini_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } /* third packet chronology: (len, value): (88, 0x0101), (88, 0x0101),(88, 0x0101),(88, 0x0101) */ if (flow->l4.udp.aimini_stage == 7 && packet->payload_packet_len == 88 && ntohs(get_u16(packet->payload, 0)) == 0x0101) { flow->l4.udp.aimini_stage = 8; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 8.\n"); return; } if (flow->l4.udp.aimini_stage == 8 && (packet->payload_packet_len == 88 && ntohs(get_u16(packet->payload, 0)) == 0x0101)) { flow->l4.udp.aimini_stage = 9; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 9.\n"); return; } if (flow->l4.udp.aimini_stage == 9 && (packet->payload_packet_len == 88 && ntohs(get_u16(packet->payload, 0)) == 0x0101)) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "found aimini (88, 0x0101), (88, 0x0101)," "(88, 0x0101),(88, 0x0101).\n"); ipoque_int_aimini_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } /* fourth packet chronology: (len, value): (104, 0x0102), (104, 0x0102), (104, 0x0102), (104, 0x0102) */ if (flow->l4.udp.aimini_stage == 10 && packet->payload_packet_len == 104 && ntohs(get_u16(packet->payload, 0)) == 0x0102) { flow->l4.udp.aimini_stage = 11; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 11.\n"); return; } if (flow->l4.udp.aimini_stage == 11 && (packet->payload_packet_len == 104 && ntohs(get_u16(packet->payload, 0)) == 0x0102)) { flow->l4.udp.aimini_stage = 12; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 12.\n"); return; } if (flow->l4.udp.aimini_stage == 12 && ((packet->payload_packet_len == 104 && ntohs(get_u16(packet->payload, 0)) == 0x0102) || (packet->payload_packet_len == 32 && ntohs(get_u16(packet->payload, 0)) == 0x01ca))) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "found aimini (104, 0x0102), (104, 0x0102), " "(104, 0x0102), (104, 0x0102).\n"); ipoque_int_aimini_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } /* fifth packet chronology (len, value): (32,0x01ca), (32,0x01ca), (32,0x01ca), ((136, 0x0166) || (32,0x01ca)) */ if (flow->l4.udp.aimini_stage == 13 && packet->payload_packet_len == 32 && ntohs(get_u16(packet->payload, 0)) == 0x01ca) { flow->l4.udp.aimini_stage = 14; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 14.\n"); return; } if (flow->l4.udp.aimini_stage == 14 && ((packet->payload_packet_len == 32 && ntohs(get_u16(packet->payload, 0)) == 0x01ca) || (packet->payload_packet_len == 136 && ntohs(get_u16(packet->payload, 0)) == 0x0166))) { flow->l4.udp.aimini_stage = 15; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 15.\n"); return; } if (flow->l4.udp.aimini_stage == 15 && ((packet->payload_packet_len == 136 && ntohs(get_u16(packet->payload, 0)) == 0x0166) || (packet->payload_packet_len == 32 && ntohs(get_u16(packet->payload, 0)) == 0x01ca))) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "found aimini (32,0x01ca), (32,0x01ca), (32,0x01ca), ((136, 0x0166)||(32,0x01ca)).\n"); ipoque_int_aimini_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } /* sixth packet chronology (len, value): (16, 0x010c), (16, 0x010c), (16, 0x010c), (16, 0x010c) */ if (flow->l4.udp.aimini_stage == 16 && packet->payload_packet_len == 16 && ntohs(get_u16(packet->payload, 0)) == 0x010c) { flow->l4.udp.aimini_stage = 17; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 17.\n"); return; } if (flow->l4.udp.aimini_stage == 17 && (packet->payload_packet_len == 16 && ntohs(get_u16(packet->payload, 0)) == 0x010c)) { flow->l4.udp.aimini_stage = 18; IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "stage = 18.\n"); return; } if (flow->l4.udp.aimini_stage == 18 && (packet->payload_packet_len == 16 && ntohs(get_u16(packet->payload, 0)) == 0x010c)) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "found aimini (16, 0x010c), (16, 0x010c), (16, 0x010c), (16, 0x010c).\n"); ipoque_int_aimini_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } else if (packet->tcp != NULL) { if ((packet->payload_packet_len > IPQ_STATICSTRING_LEN("GET /player/") && (memcmp(packet->payload, "GET /player/", IPQ_STATICSTRING_LEN("GET /player/")) == 0)) || (packet->payload_packet_len > IPQ_STATICSTRING_LEN("GET /play/?fid=") && (memcmp(packet->payload, "GET /play/?fid=", IPQ_STATICSTRING_LEN("GET /play/?fid=")) == 0))) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "HTTP packet detected.\n"); ipq_parse_packet_line_info(ipoque_struct); if (packet->host_line.ptr != NULL && packet->host_line.len > 11 && (memcmp(&packet->host_line.ptr[packet->host_line.len - 11], ".aimini.net", 11) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "AIMINI HTTP traffic detected.\n"); ipoque_int_aimini_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } if (packet->payload_packet_len > 100) { if (memcmp(packet->payload, "GET /", IPQ_STATICSTRING_LEN("GET /")) == 0) { if (memcmp(&packet->payload[IPQ_STATICSTRING_LEN("GET /")], "play/", IPQ_STATICSTRING_LEN("play/")) == 0 || memcmp(&packet->payload[IPQ_STATICSTRING_LEN("GET /")], "download/", IPQ_STATICSTRING_LEN("download/")) == 0) { ipq_parse_packet_line_info(ipoque_struct); if (is_special_aimini_host(packet->host_line) == 1) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "AIMINI HTTP traffic detected.\n"); ipoque_int_aimini_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } else if (memcmp(packet->payload, "POST /", IPQ_STATICSTRING_LEN("POST /")) == 0) { if (memcmp(&packet->payload[IPQ_STATICSTRING_LEN("POST /")], "upload/", IPQ_STATICSTRING_LEN("upload/")) == 0) { ipq_parse_packet_line_info(ipoque_struct); if (is_special_aimini_host(packet->host_line) == 1) { IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "AIMINI HTTP traffic detected.\n"); ipoque_int_aimini_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } } } IPQ_LOG(IPOQUE_PROTOCOL_AIMINI, ipoque_struct, IPQ_LOG_DEBUG, "exclude aimini.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_AIMINI); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/secondlife.c0000644000000000000000000001307711655273464020652 0ustar rootroot/* * secondlife.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_SECONDLIFE static void ipoque_int_secondlife_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SECONDLIFE, protocol_type); } void ipoque_search_secondlife(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; // if ((ntohs(packet->udp->dest) == 12035 || ntohs(packet->udp->dest) == 12036 || (ntohs(packet->udp->dest) >= 13000 && ntohs(packet->udp->dest) <= 13050)) //port // && packet->payload_packet_len > 6 // min length with no extra header, high frequency and 1 byte message body // && get_u8(packet->payload, 0) == 0x40 // reliable packet // && ntohl(get_u32(packet->payload, 1)) == 0x00000001 // sequence number equals 1 // //ntohl (get_u32 (packet->payload, 5)) == 0x00FFFF00 // no extra header, low frequency message - can't use, message may have higher frequency // ) { // IPQ_LOG(IPOQUE_PROTOCOL_SECONDLIFE, ipoque_struct, IPQ_LOG_DEBUG, "Second Life detected.\n"); // ipoque_int_secondlife_add_connection(ipoque_struct); // return; // } if (packet->tcp != NULL) { if (packet->payload_packet_len > IPQ_STATICSTRING_LEN("GET /") && memcmp(packet->payload, "GET /", IPQ_STATICSTRING_LEN("GET /")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SECONDLIFE, ipoque_struct, IPQ_LOG_DEBUG, "Second Life HTTP 'GET /'' found.\n"); ipq_parse_packet_line_info(ipoque_struct); if (packet->user_agent_line.ptr != NULL && packet->user_agent_line.len > IPQ_STATICSTRING_LEN ("Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/532.4 (KHTML, like Gecko) SecondLife/") && memcmp(&packet->user_agent_line.ptr[IPQ_STATICSTRING_LEN ("Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/532.4 (KHTML, like Gecko) ")], "SecondLife/", IPQ_STATICSTRING_LEN("SecondLife/")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SECONDLIFE, ipoque_struct, IPQ_LOG_DEBUG, "Second Life TCP HTTP User Agent detected.\n"); ipoque_int_secondlife_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (packet->host_line.ptr != NULL && packet->host_line.len > IPQ_STATICSTRING_LEN(".agni.lindenlab.com:")) { u8 x; for (x = 2; x < 6; x++) { if (packet->host_line.ptr[packet->host_line.len - (1 + x)] == ':') { if ((1 + x + IPQ_STATICSTRING_LEN(".agni.lindenlab.com")) < packet->host_line.len && memcmp(&packet->host_line.ptr[packet->host_line.len - (1 + x + IPQ_STATICSTRING_LEN(".agni.lindenlab.com"))], ".agni.lindenlab.com", IPQ_STATICSTRING_LEN(".agni.lindenlab.com")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SECONDLIFE, ipoque_struct, IPQ_LOG_DEBUG, "Second Life TCP HTTP Host detected.\n"); ipoque_int_secondlife_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } break; } } } } } if (packet->udp != NULL) { if (packet->payload_packet_len == 46 && memcmp(packet->payload, "\x40\x00\x00\x00\x01\x00\xff\xff\x00\x03", 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SECONDLIFE, ipoque_struct, IPQ_LOG_DEBUG, "Second Life 0xffff0003 detected.\n"); ipoque_int_secondlife_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 54 && memcmp(packet->payload, "\x40\x00\x00\x00\x01\x00\xff\xff\x00\x52", 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SECONDLIFE, ipoque_struct, IPQ_LOG_DEBUG, "Second Life 0xffff0052 detected.\n"); ipoque_int_secondlife_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 58 && memcmp(packet->payload, "\x40\x00\x00\x00\x01\x00\xff\xff\x00\xa9", 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SECONDLIFE, ipoque_struct, IPQ_LOG_DEBUG, "Second Life 0xffff00a9 detected.\n"); ipoque_int_secondlife_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len > 54 && memcmp(packet->payload, "\x40\x00\x00\x00\x01\x00\x08", 7) == 0 && get_u32(packet->payload, packet->payload_packet_len - 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SECONDLIFE, ipoque_struct, IPQ_LOG_DEBUG, "Second Life 0x08 detected.\n"); ipoque_int_secondlife_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } IPQ_LOG(IPOQUE_PROTOCOL_SECONDLIFE, ipoque_struct, IPQ_LOG_DEBUG, "Second Life excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SECONDLIFE); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/irc.c0000644000000000000000000010115611661524573017305 0ustar rootroot/* * irc.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_IRC #define IPOQUE_IRC_FIND_LESS(time_err,less) {int t1 = 0;\ IPOQUE_TIMESTAMP_COUNTER_SIZE timestamp = time_err[0];\ for(t1=0;t1 < 16;t1++) {\ if(timestamp > time_err[t1]) {\ timestamp = time_err[t1];\ less = t1;}}} static void ipoque_int_irc_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_IRC, IPOQUE_REAL_PROTOCOL); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 ipoque_is_duplicate(struct ipoque_id_struct *id_t, u16 port) { int index = 0; while (index < id_t->irc_number_of_port) { if (port == id_t->irc_port[index]) return 1; index++; } return 0; } static u8 ipq_check_for_NOTICE_or_PRIVMSG(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; //struct ipoque_flow_struct *flow = ipoque_struct->flow; u16 i; u8 number_of_lines_to_be_searched_for = 0; for (i = 0; i < packet->payload_packet_len - 7; i++) { if (packet->payload[i] == 'N' || packet->payload[i] == 'P') { if (memcmp(&packet->payload[i + 1], "OTICE ", 6) == 0 || memcmp(&packet->payload[i + 1], "RIVMSG ", 7) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "found NOTICE or PRIVMSG\n"); return 1; } } if (packet->payload[i] == 0x0a) { number_of_lines_to_be_searched_for++; if (number_of_lines_to_be_searched_for == 2) { return 0; } } } return 0; } static u8 ipq_check_for_Nickname(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; u16 i, packetl = packet->payload_packet_len; if (packetl < 4) { return 0; } for (i = 0; i < (packetl - 4); i++) { if (packet->payload[i] == 'N' || packet->payload[i] == 'n') { if ((((packetl - (i + 1)) >= 4) && memcmp(&packet->payload[i + 1], "ick=", 4) == 0) || (((packetl - (i + 1)) >= 8) && (memcmp(&packet->payload[i + 1], "ickname=", 8) == 0)) || (((packetl - (i + 1)) >= 8) && (memcmp(&packet->payload[i + 1], "ickName=", 8) == 0))) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "found HTTP IRC Nickname pattern\n"); return 1; } } } return 0; } static u8 ipq_check_for_cmd(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; u16 i; if (packet->payload_packet_len < 4) { return 0; } for (i = 0; i < packet->payload_packet_len - 4; i++) { if (packet->payload[i] == 'c') { if (memcmp(&packet->payload[i + 1], "md=", 3) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "found HTTP IRC cmd pattern \n"); return 1; } } } return 0; } static u8 ipq_check_for_IRC_traces(const u8 * ptr, u16 len) { u16 i; if (len < 4) { return 0; } for (i = 0; i < len - 4; i++) { if (ptr[i] == 'i') { if (memcmp(&ptr[i + 1], "rc.", 3) == 0) { return 1; } } } return 0; } u8 ipoque_search_irc_ssl_detect_ninty_percent_but_very_fast(struct ipoque_detection_module_struct * ipoque_struct); u8 ipoque_search_irc_ssl_detect_ninty_percent_but_very_fast(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "called ipoque_search_irc_ssl_detect_ninty_percent_but_very_fast\n"); /* case 1: len 1460, len 1460, len 1176 several times in one direction, than len = 4, 4096, 8192 in the other direction */ if (packet->payload_packet_len == 1460 && ((flow->l4.tcp.irc_stage2 == 0 && flow->l4.tcp.irc_direction == 0) || (flow->l4.tcp.irc_stage2 == 3 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction))) { flow->l4.tcp.irc_stage2 = 1; flow->l4.tcp.irc_direction = 1 + packet->packet_direction; return 1; } if (packet->payload_packet_len == 1460 && flow->l4.tcp.irc_stage2 == 1 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction) { flow->l4.tcp.irc_stage2 = 2; return 1; } if (packet->payload_packet_len == 1176 && flow->l4.tcp.irc_stage2 == 2 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction) { flow->l4.tcp.irc_stage2 = 3; flow->l4.tcp.irc_0x1000_full = 1; return 1; } if (packet->payload_packet_len == 4 && (flow->l4.tcp.irc_stage2 == 3 || flow->l4.tcp.irc_0x1000_full == 1) && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && (ntohs(get_u16(packet->payload, 2)) == 0x1000 || ntohs(get_u16(packet->payload, 2)) == 0x2000)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1460,1460,1176,<-4096||8192"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } /* case 2: len 1448, len 1448, len 1200 several times in one direction, than len = 4, 4096, 8192 in the other direction */ if (packet->payload_packet_len == 1448 && ((flow->l4.tcp.irc_stage2 == 0 && flow->l4.tcp.irc_direction == 0) || (flow->l4.tcp.irc_stage2 == 6 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction))) { flow->l4.tcp.irc_stage2 = 4; flow->l4.tcp.irc_direction = 1 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "len = 1448 first\n"); return 1; } if (packet->payload_packet_len == 1448 && flow->l4.tcp.irc_stage2 == 4 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction) { flow->l4.tcp.irc_stage2 = 5; IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "len = 1448 second \n"); return 1; } if (packet->payload_packet_len == 1200 && flow->l4.tcp.irc_stage2 == 5 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction) { flow->l4.tcp.irc_stage2 = 6; flow->l4.tcp.irc_0x1000_full = 1; IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "len = 1200 \n"); return 1; } if (packet->payload_packet_len == 4 && (flow->l4.tcp.irc_stage2 == 6 || flow->l4.tcp.irc_0x1000_full == 1) && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && (ntohs(get_u16(packet->payload, 2)) == 0x1000 || ntohs(get_u16(packet->payload, 2)) == 0x2000)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1448,1448,1200,<-4096||8192"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } /* case 3: several packets with len 1380, 1200, 1024, 1448, 1248, * than one packet in the other direction with the len or two times the len. */ if (packet->payload_packet_len == 1380 && ((flow->l4.tcp.irc_stage2 == 0 && flow->l4.tcp.irc_direction == 0) || (flow->l4.tcp.irc_stage2 == 7 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction))) { flow->l4.tcp.irc_stage2 = 7; flow->l4.tcp.irc_direction = 1 + packet->packet_direction; return 1; } if (packet->payload_packet_len == 4 && flow->l4.tcp.irc_stage2 == 7 && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && (ntohs(get_u16(packet->payload, 2)) == 1380 || ntohs(get_u16(packet->payload, 2)) == 2760)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1380,<-1380||2760"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } if (packet->payload_packet_len == 1200 && ((flow->l4.tcp.irc_stage2 == 0 && flow->l4.tcp.irc_direction == 0) || (flow->l4.tcp.irc_stage2 == 8 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction))) { flow->l4.tcp.irc_stage2 = 8; flow->l4.tcp.irc_direction = 1 + packet->packet_direction; return 1; } if (packet->payload_packet_len == 4 && flow->l4.tcp.irc_stage2 == 8 && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && (ntohs(get_u16(packet->payload, 2)) == 1200 || ntohs(get_u16(packet->payload, 2)) == 2400)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1200,<-1200||2400"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } if (packet->payload_packet_len == 1024 && ((flow->l4.tcp.irc_stage2 == 0 && flow->l4.tcp.irc_direction == 0) || (flow->l4.tcp.irc_stage2 == 9 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction))) { flow->l4.tcp.irc_stage2 = 9; flow->l4.tcp.irc_direction = 1 + packet->packet_direction; return 1; } if (packet->payload_packet_len == 4 && (flow->l4.tcp.irc_stage2 == 9 || flow->l4.tcp.irc_stage2 == 15) && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && (ntohs(get_u16(packet->payload, 2)) == 1024 || ntohs(get_u16(packet->payload, 2)) == 2048)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1024,<-1024||2048"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } if (packet->payload_packet_len == 1248 && ((flow->l4.tcp.irc_stage2 == 0 && flow->l4.tcp.irc_direction == 0) || (flow->l4.tcp.irc_stage2 == 10 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction))) { flow->l4.tcp.irc_stage2 = 10; flow->l4.tcp.irc_direction = 1 + packet->packet_direction; return 1; } if (packet->payload_packet_len == 4 && flow->l4.tcp.irc_stage2 == 10 && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && (ntohs(get_u16(packet->payload, 2)) == 1248 || ntohs(get_u16(packet->payload, 2)) == 2496)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1248,<-1248||2496"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } if (packet->payload_packet_len == 1448 && (flow->l4.tcp.irc_stage2 == 5 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 11; return 1; } if (packet->payload_packet_len == 4 && (flow->l4.tcp.irc_stage2 == 4 || flow->l4.tcp.irc_stage2 == 5 || flow->l4.tcp.irc_stage2 == 11 || flow->l4.tcp.irc_stage2 == 13) && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && (ntohs(get_u16(packet->payload, 2)) == 1448 || ntohs(get_u16(packet->payload, 2)) == 2896)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1448,<-1448||2896"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } /* case 4 : five packets with len = 1448, one with len 952, than one packet from other direction len = 8192 */ if (packet->payload_packet_len == 1448 && (flow->l4.tcp.irc_stage2 == 11 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 12; return 1; } if (packet->payload_packet_len == 1448 && (flow->l4.tcp.irc_stage2 == 12 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 13; return 1; } if (packet->payload_packet_len == 952 && (flow->l4.tcp.irc_stage2 == 13 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 14; return 1; } if (packet->payload_packet_len == 4 && flow->l4.tcp.irc_stage2 == 14 && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && ntohs(get_u16(packet->payload, 2)) == 8192) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1448,1448,1448,1448,1448,952,<-8192"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } /* case 5: len 1024, len 1448, len 1448, len 1200, len 1448, len 600 */ if (packet->payload_packet_len == 1448 && (flow->l4.tcp.irc_stage2 == 9 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 15; return 1; } if (packet->payload_packet_len == 1448 && (flow->l4.tcp.irc_stage2 == 15 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 16; return 1; } if (packet->payload_packet_len == 1200 && (flow->l4.tcp.irc_stage2 == 16 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 17; return 1; } if (packet->payload_packet_len == 1448 && (flow->l4.tcp.irc_stage2 == 17 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 18; return 1; } if (packet->payload_packet_len == 600 && (flow->l4.tcp.irc_stage2 == 18 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 19; return 1; } if (packet->payload_packet_len == 4 && flow->l4.tcp.irc_stage2 == 19 && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && ntohs(get_u16(packet->payload, 2)) == 7168) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1024,1448,1448,1200,1448,600,<-7168"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } /* -> 1024, 1380, -> 2404 */ if (packet->payload_packet_len == 1380 && (flow->l4.tcp.irc_stage2 == 9 && flow->l4.tcp.irc_direction == 1 + packet->packet_direction)) { flow->l4.tcp.irc_stage2 = 20; return 1; } if (packet->payload_packet_len == 4 && flow->l4.tcp.irc_stage2 == 20 && flow->l4.tcp.irc_direction == 2 - packet->packet_direction && ntohs(get_u16(packet->payload, 2)) == 2404) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected: ->1024,1380 <-2404"); ipoque_int_irc_add_connection(ipoque_struct); return 1; } return 0; } void ipoque_search_irc_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; int less; u16 c = 0; u16 c1 = 0; u16 port = 0; u16 sport = 0; u16 dport = 0; u16 counter = 0; u16 i = 0; u16 j = 0; u16 k = 0; u16 h; u16 http_content_ptr_len = 0; u8 space = 0; IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "irc : search irc\n"); if (flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_IRC && flow->packet_counter > 70) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "exclude irc, packet_counter > 70\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_IRC); return; } if (flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_IRC && flow->packet_counter > 30 && flow->l4.tcp.irc_stage2 == 0) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "packet_counter > 30, exclude irc.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_IRC); return; } if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_IRC) { if (src != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->irc_ts) < ipoque_struct->irc_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "irc : save src connection packet detected\n"); src->irc_ts = packet->tick_timestamp; } else if (dst != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->irc_ts) < ipoque_struct->irc_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "irc : save dst connection packet detected\n"); dst->irc_ts = packet->tick_timestamp; } } if (((dst != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_IRC) && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->irc_ts)) < ipoque_struct->irc_timeout)) || (src != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK (src->detected_protocol_bitmask, IPOQUE_PROTOCOL_IRC) && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->irc_ts)) < ipoque_struct->irc_timeout)) { if (packet->tcp != NULL) { sport = packet->tcp->source; dport = packet->tcp->dest; } if (dst != NULL) { for (counter = 0; counter < dst->irc_number_of_port; counter++) { if (dst->irc_port[counter] == sport || dst->irc_port[counter] == dport) { dst->last_time_port_used[counter] = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "dest port matched with the DCC port and the flow is marked as IRC"); ipoque_int_irc_add_connection(ipoque_struct); return; } } } if (src != NULL) { for (counter = 0; counter < src->irc_number_of_port; counter++) { if (src->irc_port[counter] == sport || src->irc_port[counter] == dport) { src->last_time_port_used[counter] = packet->tick_timestamp; ipoque_int_irc_add_connection(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "Source port matched with the DCC port and the flow is marked as IRC"); return; } } } } if (flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_IRC && flow->packet_counter == 2 && (packet->payload_packet_len > 400 && packet->payload_packet_len < 1381)) { for (c1 = 50; c1 < packet->payload_packet_len - 23; c1++) { if (packet->payload[c1] == 'i' || packet->payload[c1] == 'd') { if ((memcmp(&packet->payload[c1], "irc.hackthissite.org0", 21) == 0) || (memcmp(&packet->payload[c1], "irc.gamepad.ca1", 15) == 0) || (memcmp(&packet->payload[c1], "dungeon.axenet.org0", 19) == 0) || (memcmp(&packet->payload[c1], "dazed.nuggethaus.net", 20) == 0) || (memcmp(&packet->payload[c1], "irc.indymedia.org", 17) == 0) || (memcmp(&packet->payload[c1], "irc.cccp-project.net", 20) == 0) || (memcmp(&packet->payload[c1], "dirc.followell.net0", 19) == 0) || (memcmp(&packet->payload[c1], "irc.discostars.de1", 18) == 0) || (memcmp(&packet->payload[c1], "irc.rizon.net", 13) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC SSL detected with :- irc.hackthissite.org0 | irc.gamepad.ca1 | dungeon.axenet.org0 " "| dazed.nuggethaus.net | irc.indymedia.org | irc.discostars.de1 "); ipoque_int_irc_add_connection(ipoque_struct); break; } } } } if (flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_IRC && ipoque_search_irc_ssl_detect_ninty_percent_but_very_fast(ipoque_struct) != 0) { return; } if (flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_IRC && flow->packet_counter < 20 && packet->payload_packet_len >= 8) { if (get_u8(packet->payload, packet->payload_packet_len - 1) == 0x0a || (ntohs(get_u16(packet->payload, packet->payload_packet_len - 2)) == 0x0a00)) { if (memcmp(packet->payload, ":", 1) == 0) { if (packet->payload[packet->payload_packet_len - 2] != 0x0d && packet->payload[packet->payload_packet_len - 1] == 0x0a) { ipq_parse_packet_line_info_unix(ipoque_struct); packet->parsed_lines = packet->parsed_unix_lines; for (i = 0; i < packet->parsed_lines; i++) { packet->line[i] = packet->unix_line[i]; packet->line[i].ptr = packet->unix_line[i].ptr; packet->line[i].len = packet->unix_line[i].len; } } else if (packet->payload[packet->payload_packet_len - 2] == 0x0d) { ipq_parse_packet_line_info(ipoque_struct); } else { flow->l4.tcp.irc_3a_counter++; } for (i = 0; i < packet->parsed_lines; i++) { if (packet->line[i].ptr[0] == ':') { flow->l4.tcp.irc_3a_counter++; if (flow->l4.tcp.irc_3a_counter == 7) { /* ':' == 0x3a */ IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "0x3a. seven times. found irc."); ipoque_int_irc_add_connection(ipoque_struct); goto detected_irc; } } } if (flow->l4.tcp.irc_3a_counter == 7) { /* ':' == 0x3a */ IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "0x3a. seven times. found irc."); ipoque_int_irc_add_connection(ipoque_struct); goto detected_irc; } } if ((memcmp(packet->payload, "USER ", 5) == 0) || (memcmp(packet->payload, "NICK ", 5) == 0) || (memcmp(packet->payload, "PASS ", 5) == 0) || (memcmp(packet->payload, ":", 1) == 0 && ipq_check_for_NOTICE_or_PRIVMSG(ipoque_struct) != 0) || (memcmp(packet->payload, "PONG ", 5) == 0) || (memcmp(packet->payload, "PING ", 5) == 0) || (memcmp(packet->payload, "JOIN ", 5) == 0) || (memcmp(packet->payload, "NOTICE ", 7) == 0) || (memcmp(packet->payload, "PRIVMSG ", 8) == 0) || (memcmp(packet->payload, "VERSION ", 8) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "USER, NICK, PASS, NOTICE, PRIVMSG one time"); if (flow->l4.tcp.irc_stage == 2) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "found irc"); ipoque_int_irc_add_connection(ipoque_struct); flow->l4.tcp.irc_stage = 3; } if (flow->l4.tcp.irc_stage == 1) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "second time, stage=2"); flow->l4.tcp.irc_stage = 2; } if (flow->l4.tcp.irc_stage == 0) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "first time, stage=1"); flow->l4.tcp.irc_stage = 1; } /* irc packets can have either windows line breaks (0d0a) or unix line breaks (0a) */ if (packet->payload[packet->payload_packet_len - 2] == 0x0d && packet->payload[packet->payload_packet_len - 1] == 0x0a) { ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines > 1) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "packet contains more than one line"); for (c = 1; c < packet->parsed_lines; c++) { if (packet->line[c].len > 4 && (memcmp(packet->line[c].ptr, "NICK ", 5) == 0 || memcmp(packet->line[c].ptr, "USER ", 5) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "two icq signal words in the same packet"); ipoque_int_irc_add_connection(ipoque_struct); flow->l4.tcp.irc_stage = 3; return; } } } } else if (packet->payload[packet->payload_packet_len - 1] == 0x0a) { ipq_parse_packet_line_info_unix(ipoque_struct); if (packet->parsed_unix_lines > 1) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "packet contains more than one line"); for (c = 1; c < packet->parsed_unix_lines; c++) { if (packet->unix_line[c].len > 4 && (memcmp(packet->unix_line[c].ptr, "NICK ", 5) == 0 || memcmp(packet->unix_line[c].ptr, "USER ", 5) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "two icq signal words in the same packet"); ipoque_int_irc_add_connection(ipoque_struct); flow->l4.tcp.irc_stage = 3; return; } } } } } } } /** * Trying to primarily detect the HTTP Web based IRC chat patterns based on the HTTP headers * during the User login time.When the HTTP data gets posted using the POST method ,patterns * will be searched in the HTTP content. */ if ((flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_IRC) && (flow->l4.tcp.irc_stage == 0) && (packet->payload_packet_len > 5)) { //HTTP POST Method being employed if (memcmp(packet->payload, "POST ", 5) == 0) { ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines) { u16 http_header_len = (packet->line[packet->parsed_lines - 1].ptr - packet->payload) + 2; if (packet->payload_packet_len > http_header_len) { http_content_ptr_len = packet->payload_packet_len - http_header_len; } if ((ipq_check_for_IRC_traces(packet->line[0].ptr, packet->line[0].len)) || ((packet->http_url_name.ptr) && (ipq_check_for_IRC_traces(packet->http_url_name.ptr, packet->http_url_name.len))) || ((packet->referer_line.ptr) && (ipq_check_for_IRC_traces(packet->referer_line.ptr, packet->referer_line.len)))) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC detected from the Http URL/ Referer header "); flow->l4.tcp.irc_stage = 1; // HTTP POST Request body is not in the same packet. if (!http_content_ptr_len) { return; } } } } } if ((flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_IRC) && (flow->l4.tcp.irc_stage == 1)) { if ((((packet->payload_packet_len - http_content_ptr_len) > 10) && (memcmp(packet->payload + http_content_ptr_len, "interface=", 10) == 0) && (ipq_check_for_Nickname(ipoque_struct) != 0)) || (((packet->payload_packet_len - http_content_ptr_len) > 5) && (memcmp(packet->payload + http_content_ptr_len, "item=", 5) == 0) && (ipq_check_for_cmd(ipoque_struct) != 0))) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "IRC Nickname, cmd, one time"); ipoque_int_irc_add_connection(ipoque_struct); return; } } detected_irc: IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "detected_irc:"); if (flow->detected_protocol_stack[0] == IPOQUE_PROTOCOL_IRC) { /* maybe this can be deleted at the end */ if (packet->payload[packet->payload_packet_len - 2] != 0x0d && packet->payload[packet->payload_packet_len - 1] == 0x0a) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "ipq_parse_packet_line_info_unix(ipoque_struct);"); ipq_parse_packet_line_info_unix(ipoque_struct); packet->parsed_lines = packet->parsed_unix_lines; for (i = 0; i < packet->parsed_lines; i++) { packet->line[i] = packet->unix_line[i]; packet->line[i].ptr = packet->unix_line[i].ptr; packet->line[i].len = packet->unix_line[i].len; } } else if (packet->payload[packet->payload_packet_len - 2] == 0x0d) { ipq_parse_packet_line_info(ipoque_struct); } else { return; } for (i = 0; i < packet->parsed_lines; i++) { if (packet->line[i].len > 6 && memcmp(packet->line[i].ptr, "NOTICE ", 7) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "NOTICE"); for (j = 7; j < packet->line[i].len - 8; j++) { if (packet->line[i].ptr[j] == ':') { if (memcmp(&packet->line[i].ptr[j + 1], "DCC SEND ", 9) == 0 || memcmp(&packet->line[i].ptr[j + 1], "DCC CHAT ", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "found NOTICE and DCC CHAT or DCC SEND."); } } } } if (packet->payload_packet_len > 0 && packet->payload[0] == 0x3a /* 0x3a = ':' */ ) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "3a"); for (j = 1; j < packet->line[i].len - 9; j++) { if (packet->line[i].ptr[j] == ' ') { j++; if (packet->line[i].ptr[j] == 'P') { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "P"); j++; if (memcmp(&packet->line[i].ptr[j], "RIVMSG ", 7) == 0) IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "RIVMSG"); h = j + 7; goto read_privmsg; } } } } if (packet->line[i].len > 7 && (memcmp(packet->line[i].ptr, "PRIVMSG ", 8) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "PRIVMSG "); h = 7; read_privmsg: for (j = h; j < packet->line[i].len - 9; j++) { if (packet->line[i].ptr[j] == ':') { if (memcmp(&packet->line[i].ptr[j + 1], "xdcc ", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "xdcc should match."); } j += 2; if (memcmp(&packet->line[i].ptr[j], "DCC ", 4) == 0) { j += 4; IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "found DCC."); if (memcmp(&packet->line[i].ptr[j], "SEND ", 5) == 0 || (memcmp(&packet->line[i].ptr[j], "CHAT", 4) == 0) || (memcmp(&packet->line[i].ptr[j], "chat", 4) == 0) || (memcmp(&packet->line[i].ptr[j], "sslchat", 7) == 0) || (memcmp(&packet->line[i].ptr[j], "TSEND", 5) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "found CHAT,chat,sslchat,TSEND."); j += 4; while (packet->line[i].len > j && ((packet->line[i].ptr[j] >= 'a' && packet->line[i].ptr[j] <= 'z') || (packet->line[i].ptr[j] >= 'A' && packet->line[i].ptr[j] <= 'Z') || (packet->line[i].ptr[j] >= '0' && packet->line[i].ptr[j] <= '9') || (packet->line[i].ptr[j] >= ' ') || (packet->line[i].ptr[j] >= '.') || (packet->line[i].ptr[j] >= '-'))) { if (packet->line[i].ptr[j] == ' ') { space++; IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "space %u.", space); } if (space == 3) { j++; IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "read port."); if (src != NULL) { k = j; port = ntohs_ipq_bytestream_to_number (&packet->line[i].ptr[j], packet->payload_packet_len - j, &j); IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "port %u.", port); j = k; // hier jetzt überlegen, wie die ports abgespeichert werden sollen if (src->irc_number_of_port < 16) IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "src->irc_number_of_port < 16."); if (src->irc_number_of_port < 16 && port != 0) { if (!ipoque_is_duplicate(src, port)) { src->irc_port[src->irc_number_of_port] = port; src->irc_number_of_port++; IPQ_LOG (IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "found port=%d", ntohs(get_u16(src->irc_port, 0))); IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "jjeeeeeeeeeeeeeeeeeeeeeeeee"); } src->irc_ts = packet->tick_timestamp; } else if (port != 0 && src->irc_number_of_port == 16) { if (!ipoque_is_duplicate(src, port)) { less = 0; IPOQUE_IRC_FIND_LESS(src->last_time_port_used, less); src->irc_port[less] = port; IPQ_LOG (IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "found port=%d", ntohs(get_u16(src->irc_port, 0))); } src->irc_ts = packet->tick_timestamp; } if (dst == NULL) { break; } } if (dst != NULL) { port = ntohs_ipq_bytestream_to_number (&packet->line[i].ptr[j], packet->payload_packet_len - j, &j); IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_TRACE, "port %u.", port); // hier das gleiche wie oben. /* hier werden 16 ports pro irc flows mitgespeichert. könnte man denn nicht ein- * fach an die dst oder src einen flag setzten, dass dieser port für eine bestimmte * zeit ein irc-port bleibt? */ if (dst->irc_number_of_port < 16 && port != 0) { if (!ipoque_is_duplicate(dst, port)) { dst->irc_port[dst->irc_number_of_port] = port; dst->irc_number_of_port++; IPQ_LOG (IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "found port=%d", ntohs(get_u16(dst->irc_port, 0))); IPQ_LOG(IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "juuuuuuuuuuuuuuuu"); } dst->irc_ts = packet->tick_timestamp; } else if (port != 0 && dst->irc_number_of_port == 16) { if (!ipoque_is_duplicate(dst, port)) { less = 0; IPOQUE_IRC_FIND_LESS(dst->last_time_port_used, less); dst->irc_port[less] = port; IPQ_LOG (IPOQUE_PROTOCOL_IRC, ipoque_struct, IPQ_LOG_DEBUG, "found port=%d", ntohs(get_u16(dst->irc_port, 0))); } dst->irc_ts = packet->tick_timestamp; } break; } } j++; } } } } } } } } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/mms.c0000644000000000000000000000565111655273464017332 0ustar rootroot/* * mms.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_MMS static void ipoque_int_mms_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MMS, IPOQUE_REAL_PROTOCOL); } void ipoque_search_mms_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; /* search MSMMS packets */ if (packet->payload_packet_len >= 20) { if (flow->l4.tcp.mms_stage == 0 && packet->payload[4] == 0xce && packet->payload[5] == 0xfa && packet->payload[6] == 0x0b && packet->payload[7] == 0xb0 && packet->payload[12] == 0x4d && packet->payload[13] == 0x4d && packet->payload[14] == 0x53 && packet->payload[15] == 0x20) { IPQ_LOG(IPOQUE_PROTOCOL_MMS, ipoque_struct, IPQ_LOG_DEBUG, "MMS: MSMMS Request found \n"); flow->l4.tcp.mms_stage = 1 + packet->packet_direction; return; } if (flow->l4.tcp.mms_stage == 2 - packet->packet_direction && packet->payload[4] == 0xce && packet->payload[5] == 0xfa && packet->payload[6] == 0x0b && packet->payload[7] == 0xb0 && packet->payload[12] == 0x4d && packet->payload[13] == 0x4d && packet->payload[14] == 0x53 && packet->payload[15] == 0x20) { IPQ_LOG(IPOQUE_PROTOCOL_MMS, ipoque_struct, IPQ_LOG_DEBUG, "MMS: MSMMS Response found \n"); ipoque_int_mms_add_connection(ipoque_struct); return; } } #ifdef IPOQUE_PROTOCOL_HTTP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP) != 0) { #endif /* IPOQUE_PROTOCOL_HTTP */ IPQ_LOG(IPOQUE_PROTOCOL_MMS, ipoque_struct, IPQ_LOG_DEBUG, "MMS: exclude\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MMS); #ifdef IPOQUE_PROTOCOL_HTTP } else { IPQ_LOG(IPOQUE_PROTOCOL_MMS, ipoque_struct, IPQ_LOG_DEBUG, "MMS avoid early exclude from http\n"); } #endif /* IPOQUE_PROTOCOL_HTTP */ } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/mail_smtp.c0000644000000000000000000001717311655273464020525 0ustar rootroot/* * mail_smtp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_MAIL_SMTP #define SMTP_BIT_220 0x01 #define SMTP_BIT_250 0x02 #define SMTP_BIT_235 0x04 #define SMTP_BIT_334 0x08 #define SMTP_BIT_354 0x10 #define SMTP_BIT_HELO_EHLO 0x20 #define SMTP_BIT_MAIL 0x40 #define SMTP_BIT_RCPT 0x80 #define SMTP_BIT_AUTH 0x100 #define SMTP_BIT_STARTTLS 0x200 #define SMTP_BIT_DATA 0x400 #define SMTP_BIT_NOOP 0x800 #define SMTP_BIT_RSET 0x1000 #define SMTP_BIT_TlRM 0x2000 static void ipoque_int_mail_smtp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MAIL_SMTP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_mail_smtp_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_MAIL_SMTP, ipoque_struct, IPQ_LOG_DEBUG, "search mail_smtp.\n"); if (packet->payload_packet_len > 2 && ntohs(get_u16(packet->payload, packet->payload_packet_len - 2)) == 0x0d0a) { u8 a; u8 bit_count = 0; IPQ_PARSE_PACKET_LINE_INFO(ipoque_struct, packet); for (a = 0; a < packet->parsed_lines; a++) { // expected server responses if (packet->line[a].len >= 3) { if (memcmp(packet->line[a].ptr, "220", 3) == 0) { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_220; } else if (memcmp(packet->line[a].ptr, "250", 3) == 0) { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_250; } else if (memcmp(packet->line[a].ptr, "235", 3) == 0) { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_235; } else if (memcmp(packet->line[a].ptr, "334", 3) == 0) { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_334; } else if (memcmp(packet->line[a].ptr, "354", 3) == 0) { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_354; } } // expected client requests if (packet->line[a].len >= 5) { if ((((packet->line[a].ptr[0] == 'H' || packet->line[a].ptr[0] == 'h') && (packet->line[a].ptr[1] == 'E' || packet->line[a].ptr[1] == 'e')) || ((packet->line[a].ptr[0] == 'E' || packet->line[a].ptr[0] == 'e') && (packet->line[a].ptr[1] == 'H' || packet->line[a].ptr[1] == 'h'))) && (packet->line[a].ptr[2] == 'L' || packet->line[a].ptr[2] == 'l') && (packet->line[a].ptr[3] == 'O' || packet->line[a].ptr[3] == 'o') && packet->line[a].ptr[4] == ' ') { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_HELO_EHLO; } else if ((packet->line[a].ptr[0] == 'M' || packet->line[a].ptr[0] == 'm') && (packet->line[a].ptr[1] == 'A' || packet->line[a].ptr[1] == 'a') && (packet->line[a].ptr[2] == 'I' || packet->line[a].ptr[2] == 'i') && (packet->line[a].ptr[3] == 'L' || packet->line[a].ptr[3] == 'l') && packet->line[a].ptr[4] == ' ') { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_MAIL; } else if ((packet->line[a].ptr[0] == 'R' || packet->line[a].ptr[0] == 'r') && (packet->line[a].ptr[1] == 'C' || packet->line[a].ptr[1] == 'c') && (packet->line[a].ptr[2] == 'P' || packet->line[a].ptr[2] == 'p') && (packet->line[a].ptr[3] == 'T' || packet->line[a].ptr[3] == 't') && packet->line[a].ptr[4] == ' ') { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_RCPT; } else if ((packet->line[a].ptr[0] == 'A' || packet->line[a].ptr[0] == 'a') && (packet->line[a].ptr[1] == 'U' || packet->line[a].ptr[1] == 'u') && (packet->line[a].ptr[2] == 'T' || packet->line[a].ptr[2] == 't') && (packet->line[a].ptr[3] == 'H' || packet->line[a].ptr[3] == 'h') && packet->line[a].ptr[4] == ' ') { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_AUTH; } } if (packet->line[a].len >= 8) { if ((packet->line[a].ptr[0] == 'S' || packet->line[a].ptr[0] == 's') && (packet->line[a].ptr[1] == 'T' || packet->line[a].ptr[1] == 't') && (packet->line[a].ptr[2] == 'A' || packet->line[a].ptr[2] == 'a') && (packet->line[a].ptr[3] == 'R' || packet->line[a].ptr[3] == 'r') && (packet->line[a].ptr[4] == 'T' || packet->line[a].ptr[0] == 't') && (packet->line[a].ptr[5] == 'T' || packet->line[a].ptr[1] == 't') && (packet->line[a].ptr[6] == 'L' || packet->line[a].ptr[2] == 'l') && (packet->line[a].ptr[7] == 'S' || packet->line[a].ptr[3] == 's')) { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_STARTTLS; } } if (packet->line[a].len >= 4) { if ((packet->line[a].ptr[0] == 'D' || packet->line[a].ptr[0] == 'd') && (packet->line[a].ptr[1] == 'A' || packet->line[a].ptr[1] == 'a') && (packet->line[a].ptr[2] == 'T' || packet->line[a].ptr[2] == 't') && (packet->line[a].ptr[3] == 'A' || packet->line[a].ptr[3] == 'a')) { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_DATA; } else if ((packet->line[a].ptr[0] == 'N' || packet->line[a].ptr[0] == 'n') && (packet->line[a].ptr[1] == 'O' || packet->line[a].ptr[1] == 'o') && (packet->line[a].ptr[2] == 'O' || packet->line[a].ptr[2] == 'o') && (packet->line[a].ptr[3] == 'P' || packet->line[a].ptr[3] == 'p')) { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_NOOP; } else if ((packet->line[a].ptr[0] == 'R' || packet->line[a].ptr[0] == 'r') && (packet->line[a].ptr[1] == 'S' || packet->line[a].ptr[1] == 's') && (packet->line[a].ptr[2] == 'E' || packet->line[a].ptr[2] == 'e') && (packet->line[a].ptr[3] == 'T' || packet->line[a].ptr[3] == 't')) { flow->l4.tcp.smtp_command_bitmask |= SMTP_BIT_RSET; } } } // now count the bits set in the bitmask if (flow->l4.tcp.smtp_command_bitmask != 0) { for (a = 0; a < 16; a++) { bit_count += (flow->l4.tcp.smtp_command_bitmask >> a) & 0x01; } } IPQ_LOG(IPOQUE_PROTOCOL_MAIL_SMTP, ipoque_struct, IPQ_LOG_DEBUG, "seen smtp commands and responses: %u.\n", bit_count); if (bit_count >= 3) { IPQ_LOG(IPOQUE_PROTOCOL_MAIL_SMTP, ipoque_struct, IPQ_LOG_DEBUG, "mail smtp identified\n"); ipoque_int_mail_smtp_add_connection(ipoque_struct); return; } if (bit_count >= 1 && flow->packet_counter < 12) { return; } } /* when the first or second packets are split into two packets, those packets are ignored. */ if (flow->packet_counter <= 4 && packet->payload_packet_len >= 4 && (ntohs(get_u16(packet->payload, packet->payload_packet_len - 2)) == 0x0d0a || memcmp(packet->payload, "220", 3) == 0 || memcmp(packet->payload, "EHLO", 4) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_MAIL_SMTP, ipoque_struct, IPQ_LOG_DEBUG, "maybe SMTP, need next packet.\n"); return; } IPQ_LOG(IPOQUE_PROTOCOL_MAIL_SMTP, ipoque_struct, IPQ_LOG_DEBUG, "exclude smtp\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MAIL_SMTP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/winmx.c0000644000000000000000000000674011655273464017700 0ustar rootroot/* * winmx.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_WINMX static void ipoque_int_winmx_add_connection(struct ipoque_detection_module_struct *ipoque_struct); static void ipoque_int_winmx_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WINMX, IPOQUE_REAL_PROTOCOL); } void ipoque_search_winmx_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (flow->l4.tcp.winmx_stage == 0) { if (packet->payload_packet_len == 1 || (packet->payload_packet_len > 1 && packet->payload[0] == 0x31)) { return; } /* did not see this pattern in any trace that we have */ if (((packet->payload_packet_len) == 4) && (memcmp(packet->payload, "SEND", 4) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_WINMX, ipoque_struct, IPQ_LOG_DEBUG, "maybe WinMX Send\n"); flow->l4.tcp.winmx_stage = 1; return; } if (((packet->payload_packet_len) == 3) && (memcmp(packet->payload, "GET", 3) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_WINMX, ipoque_struct, IPQ_LOG_DEBUG, "found winmx by GET\n"); ipoque_int_winmx_add_connection(ipoque_struct); return; } if (packet->payload_packet_len == 149 && packet->payload[0] == '8') { IPQ_LOG(IPOQUE_PROTOCOL_WINMX, ipoque_struct, IPQ_LOG_DEBUG, "maybe WinMX\n"); if (get_u32(packet->payload, 17) == 0 && get_u32(packet->payload, 21) == 0 && get_u32(packet->payload, 25) == 0 && get_u16(packet->payload, 39) == 0 && get_u16(packet->payload, 135) == htons(0x7edf) && get_u16(packet->payload, 147) == htons(0xf792)) { IPQ_LOG(IPOQUE_PROTOCOL_WINMX, ipoque_struct, IPQ_LOG_DEBUG, "found winmx by pattern in first packet\n"); ipoque_int_winmx_add_connection(ipoque_struct); return; } } /* did not see this pattern in any trace that we have */ } else if (flow->l4.tcp.winmx_stage == 1) { if (packet->payload_packet_len > 10 && packet->payload_packet_len < 1000) { u16 left = packet->payload_packet_len - 1; while (left > 0) { if (packet->payload[left] == ' ') { IPQ_LOG(IPOQUE_PROTOCOL_WINMX, ipoque_struct, IPQ_LOG_DEBUG, "found winmx in second packet\n"); ipoque_int_winmx_add_connection(ipoque_struct); return; } else if (packet->payload[left] < '0' || packet->payload[left] > '9') { break; } left--; } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_WINMX); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/feidian.c0000644000000000000000000000706111655273464020132 0ustar rootroot/* * feidian.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_FEIDIAN static void ipoque_int_feidian_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FEIDIAN, protocol_type); } void ipoque_search_feidian(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->tcp != NULL) { if (packet->tcp->dest == htons(8080) && packet->payload_packet_len == 4 && packet->payload[0] == 0x29 && packet->payload[1] == 0x1c && packet->payload[2] == 0x32 && packet->payload[3] == 0x01) { IPQ_LOG(IPOQUE_PROTOCOL_FEIDIAN, ipoque_struct, IPQ_LOG_DEBUG, "Feidian: found the flow (TCP): packet_size: %u; Flowstage: %u\n", packet->payload_packet_len, flow->l4.udp.feidian_stage); ipoque_int_feidian_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } else if (packet->payload_packet_len > 50 && memcmp(packet->payload, "GET /", 5) == 0) { ipq_parse_packet_line_info(ipoque_struct); if (packet->host_line.ptr != NULL && packet->host_line.len == 18 && memcmp(packet->host_line.ptr, "config.feidian.com", 18) == 0) { ipoque_int_feidian_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } IPQ_LOG(IPOQUE_PROTOCOL_FEIDIAN, ipoque_struct, IPQ_LOG_DEBUG, "Feidian: discarted the flow (TCP): packet_size: %u; Flowstage: %u\n", packet->payload_packet_len, flow->l4.udp.feidian_stage); } else if (packet->udp != NULL) { if (ntohs(packet->udp->source) == 53124 || ntohs(packet->udp->dest) == 53124) { if (flow->l4.udp.feidian_stage == 0 && (packet->payload_packet_len == 112) && packet->payload[0] == 0x1c && packet->payload[1] == 0x1c && packet->payload[2] == 0x32 && packet->payload[3] == 0x01) { flow->l4.udp.feidian_stage = 1; return; } else if (flow->l4.udp.feidian_stage == 1 && (packet->payload_packet_len == 116 || packet->payload_packet_len == 112) && packet->payload[0] == 0x1c && packet->payload[1] == 0x1c && packet->payload[2] == 0x32 && packet->payload[3] == 0x01) { ipoque_int_feidian_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } IPQ_LOG(IPOQUE_PROTOCOL_FEIDIAN, ipoque_struct, IPQ_LOG_DEBUG, "Feidian: discarted the flow (UDP): packet_size: %u; Flowstage: %u\n", packet->payload_packet_len, flow->l4.udp.feidian_stage); } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_FEIDIAN); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/applejuice.c0000644000000000000000000000406511655273464020655 0ustar rootroot/* * applejuice.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_APPLEJUICE static void ipoque_int_applejuice_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_APPLEJUICE, IPOQUE_REAL_PROTOCOL); } void ipoque_search_applejuice_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_APPLEJUICE, ipoque_struct, IPQ_LOG_DEBUG, "search applejuice.\n"); if ((packet->payload_packet_len > 7) && (packet->payload[6] == 0x0d) && (packet->payload[7] == 0x0a) && (ipq_mem_cmp(packet->payload, "ajprot", 6) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_APPLEJUICE, ipoque_struct, IPQ_LOG_DEBUG, "detected applejuice.\n"); ipoque_int_applejuice_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_APPLEJUICE, ipoque_struct, IPQ_LOG_DEBUG, "exclude applejuice.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_APPLEJUICE); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/dhcp.c0000644000000000000000000000411111655273464017442 0ustar rootroot/* * dhcp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_DHCP static void ipoque_int_dhcp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_DHCP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_dhcp_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; /* this detection also works for asymmetric dhcp traffic */ /*check standard DHCP 0.0.0.0:68 -> 255.255.255.255:67 */ if (packet->payload_packet_len >= 244 && (packet->udp->source == htons(67) || packet->udp->source == htons(68)) && (packet->udp->dest == htons(67) || packet->udp->dest == htons(68)) && get_u32(packet->payload, 236) == htonl(0x63825363) && get_u16(packet->payload, 240) == htons(0x3501)) { IPQ_LOG(IPOQUE_PROTOCOL_DHCP, ipoque_struct, IPQ_LOG_DEBUG, "DHCP request\n"); ipoque_int_dhcp_add_connection(ipoque_struct); return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_DHCP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/ipp.c0000644000000000000000000001005511655273464017320 0ustar rootroot/* * ipp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_IPP static void ipoque_int_ipp_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_IPP, protocol_type); } void ipoque_search_ipp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u8 i; IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "search ipp\n"); if (packet->payload_packet_len > 20) { IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "searching for a payload with a pattern like 'number(1to8)blanknumber(1to3)ipp://.\n"); /* this pattern means that there is a printer saying that his state is idle, * means that he is not printing anything at the moment */ i = 0; if (packet->payload[i] < '0' || packet->payload[i] > '9') { IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "payload does not begin with a number.\n"); goto search_for_next_pattern; } for (;;) { i++; if (!((packet->payload[i] >= '0' && packet->payload[i] <= '9') || (packet->payload[i] >= 'a' && packet->payload[i] <= 'f') || (packet->payload[i] >= 'A' && packet->payload[i] <= 'F')) || i > 8) { IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "read symbols while the symbol is a number.\n"); break; } } if (packet->payload[i++] != ' ') { IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "there is no blank following the number.\n"); goto search_for_next_pattern; } if (packet->payload[i] < '0' || packet->payload[i] > '9') { IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "no number following the blank.\n"); goto search_for_next_pattern; } for (;;) { i++; if (packet->payload[i] < '0' || packet->payload[i] > '9' || i > 12) { IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "read symbols while the symbol is a number.\n"); break; } } if (ipq_mem_cmp(&packet->payload[i], " ipp://", 7) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "the string ' ipp://' does not follow.\n"); goto search_for_next_pattern; } IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "found ipp\n"); ipoque_int_ipp_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } search_for_next_pattern: if (packet->payload_packet_len > 3 && memcmp(packet->payload, "POST", 4) == 0) { ipq_parse_packet_line_info(ipoque_struct); if (packet->content_line.ptr != NULL && packet->content_line.len > 14 && memcmp(packet->content_line.ptr, "application/ipp", 15) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "found ipp via POST ... application/ipp.\n"); ipoque_int_ipp_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } IPQ_LOG(IPOQUE_PROTOCOL_IPP, ipoque_struct, IPQ_LOG_DEBUG, "no ipp detected.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_IPP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/usenet.c0000644000000000000000000000666411655273464020046 0ustar rootroot/* * usenet.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_USENET static void ipoque_int_usenet_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_USENET, IPOQUE_REAL_PROTOCOL); } void ipoque_search_usenet_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_USENET, ipoque_struct, IPQ_LOG_DEBUG, "USENET: search usenet.\n"); IPQ_LOG(IPOQUE_PROTOCOL_USENET, ipoque_struct, IPQ_LOG_DEBUG, "USENET: STAGE IS %u.\n", flow->l4.tcp.usenet_stage); // check for the first server replay /* 200 Service available, posting allowed 201 Service available, posting prohibited */ if (flow->l4.tcp.usenet_stage == 0 && packet->payload_packet_len > 10 && ((ipq_mem_cmp(packet->payload, "200 ", 4) == 0) || (ipq_mem_cmp(packet->payload, "201 ", 4) == 0))) { IPQ_LOG(IPOQUE_PROTOCOL_USENET, ipoque_struct, IPQ_LOG_DEBUG, "USENET: found 200 or 201.\n"); flow->l4.tcp.usenet_stage = 1 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_USENET, ipoque_struct, IPQ_LOG_DEBUG, "USENET: maybe hit.\n"); return; } /* [C] AUTHINFO USER fred [S] 381 Enter passphrase [C] AUTHINFO PASS flintstone [S] 281 Authentication accepted */ // check for client username if (flow->l4.tcp.usenet_stage == 2 - packet->packet_direction) { if (packet->payload_packet_len > 20 && (ipq_mem_cmp(packet->payload, "AUTHINFO USER ", 14) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_USENET, ipoque_struct, IPQ_LOG_DEBUG, "USENET: username found\n"); flow->l4.tcp.usenet_stage = 3 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_USENET, ipoque_struct, IPQ_LOG_DEBUG, "USENET: found usenet.\n"); ipoque_int_usenet_add_connection(ipoque_struct); return; } else if (packet->payload_packet_len == 13 && (ipq_mem_cmp(packet->payload, "MODE READER\r\n", 13) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_USENET, ipoque_struct, IPQ_LOG_DEBUG, "USENET: no login necessary but we are a client.\n"); IPQ_LOG(IPOQUE_PROTOCOL_USENET, ipoque_struct, IPQ_LOG_DEBUG, "USENET: found usenet.\n"); ipoque_int_usenet_add_connection(ipoque_struct); return; } } IPQ_LOG(IPOQUE_PROTOCOL_USENET, ipoque_struct, IPQ_LOG_DEBUG, "USENET: exclude usenet.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_USENET); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/socrates.c0000644000000000000000000000555611655273464020365 0ustar rootroot/* * socrates.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_SOCRATES static void ipoque_socrates_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SOCRATES, IPOQUE_REAL_PROTOCOL); } void ipoque_search_socrates(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_SOCRATES, ipoque_struct, IPQ_LOG_DEBUG, "search socrates.\n"); if (packet->udp != NULL) { if (packet->payload_packet_len > 9 && packet->payload[0] == 0xfe && packet->payload[packet->payload_packet_len - 1] == 0x05) { IPQ_LOG(IPOQUE_PROTOCOL_SOCRATES, ipoque_struct, IPQ_LOG_DEBUG, "found fe.\n"); IPQ_LOG(IPOQUE_PROTOCOL_SOCRATES, ipoque_struct, IPQ_LOG_DEBUG, "len match.\n"); if (memcmp(&packet->payload[2], "socrates", 8) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SOCRATES, ipoque_struct, IPQ_LOG_DEBUG, "found socrates udp.\n"); ipoque_socrates_add_connection(ipoque_struct); } } } else if (packet->tcp != NULL) { if (packet->payload_packet_len > 13 && packet->payload[0] == 0xfe && packet->payload[packet->payload_packet_len - 1] == 0x05) { IPQ_LOG(IPOQUE_PROTOCOL_SOCRATES, ipoque_struct, IPQ_LOG_DEBUG, "found fe.\n"); if (packet->payload_packet_len == ntohl(get_u32(packet->payload, 2))) { IPQ_LOG(IPOQUE_PROTOCOL_SOCRATES, ipoque_struct, IPQ_LOG_DEBUG, "len match.\n"); if (memcmp(&packet->payload[6], "socrates", 8) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_SOCRATES, ipoque_struct, IPQ_LOG_DEBUG, "found socrates tcp.\n"); ipoque_socrates_add_connection(ipoque_struct); } } } } IPQ_LOG(IPOQUE_PROTOCOL_SOCRATES, ipoque_struct, IPQ_LOG_DEBUG, "exclude socrates.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SOCRATES); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/oscar.c0000644000000000000000000002651011655273464017642 0ustar rootroot/* * oscar.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_OSCAR static void ipoque_int_oscar_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_OSCAR, protocol_type); if (src != NULL) { src->oscar_last_safe_access_time = packet->tick_timestamp; } if (dst != NULL) { dst->oscar_last_safe_access_time = packet->tick_timestamp; } } static void ipoque_search_oscar_tcp_connect(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->payload_packet_len >= 10 && packet->payload[0] == 0x2a) { /* if is a oscar connection, 10 bytes long */ /* OSCAR Connection :: Connection detected at initial packets only * +----+----+------+------+---------------+ * |0x2a|Code|SeqNum|PktLen|ProtcolVersion | * +----+----+------+------+---------------+ * Code 1 Byte : 0x01 Oscar Connection * SeqNum and PktLen are 2 Bytes each and ProtcolVersion: 0x00000001 * */ if (get_u8(packet->payload, 1) == 0x01 && get_u16(packet->payload, 4) == htons(packet->payload_packet_len - 6) && get_u32(packet->payload, 6) == htonl(0x0000000001)) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR Connection FOUND \n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } /* OSCAR IM * +----+----+------+------+----------+-----------+ * |0x2a|Code|SeqNum|PktLen|FNACfamily|FNACsubtype| * +----+----+------+------+----------+-----------+ * Code 1 Byte : 0x02 SNAC Header Code; * SeqNum and PktLen are 2 Bytes each * FNACfamily 2 Byte : 0x0004 IM Messaging * FNACEsubtype 2 Byte : 0x0006 IM Outgoing Message, 0x000c IM Message Acknowledgment * */ if (packet->payload[1] == 0x02 && ntohs(get_u16(packet->payload, 4)) >= packet->payload_packet_len - 6 && get_u16(packet->payload, 6) == htons(0x0004) && (get_u16(packet->payload, 8) == htons(0x0006) || get_u16(packet->payload, 8) == htons(0x000c))) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR IM Detected \n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } /* detect http connections */ if (packet->payload_packet_len >= 18) { if ((packet->payload[0] == 'P') && (memcmp(packet->payload, "POST /photo/upload", 18) == 0)) { IPQ_PARSE_PACKET_LINE_INFO(ipoque_struct, packet); if (packet->host_line.len >= 18 && packet->host_line.ptr != NULL) { if (memcmp(packet->host_line.ptr, "lifestream.aol.com", 18) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR over HTTP found, POST method\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } } if (packet->payload_packet_len > 40) { if ((packet->payload[0] == 'G') && (memcmp(packet->payload, "GET /", 5) == 0)) { if ((memcmp(&packet->payload[5], "aim/fetchEvents?aimsid=", 23) == 0) || (memcmp(&packet->payload[5], "aim/startSession?", 17) == 0) || (memcmp(&packet->payload[5], "aim/gromit/aim_express", 22) == 0) || (memcmp(&packet->payload[5], "b/ss/aolwpaim", 13) == 0) || (memcmp(&packet->payload[5], "hss/storage/aimtmpshare", 23) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR over HTTP found, GET /aim/\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if ((memcmp(&packet->payload[5], "aim", 3) == 0) || (memcmp(&packet->payload[5], "im", 2) == 0)) { IPQ_PARSE_PACKET_LINE_INFO(ipoque_struct, packet); if (packet->user_agent_line.len > 15 && packet->user_agent_line.ptr != NULL && ((memcmp(packet->user_agent_line.ptr, "mobileAIM/", 10) == 0) || (memcmp(packet->user_agent_line.ptr, "ICQ/", 4) == 0) || (memcmp(packet->user_agent_line.ptr, "mobileICQ/", 10) == 0) || (memcmp(packet->user_agent_line.ptr, "AIM%20Free/", IPQ_STATICSTRING_LEN("AIM%20Free/")) == 0) || (memcmp(packet->user_agent_line.ptr, "AIM/", 4) == 0))) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR over HTTP found\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } IPQ_PARSE_PACKET_LINE_INFO(ipoque_struct, packet); if (packet->referer_line.ptr != NULL && packet->referer_line.len >= 22) { if (memcmp(&packet->referer_line.ptr[packet->referer_line.len - IPQ_STATICSTRING_LEN("WidgetMain.swf")], "WidgetMain.swf", IPQ_STATICSTRING_LEN("WidgetMain.swf")) == 0) { u16 i; for (i = 0; i < (packet->referer_line.len - 22); i++) { if (packet->referer_line.ptr[i] == 'a') { if (memcmp(&packet->referer_line.ptr[i + 1], "im/gromit/aim_express", 21) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR over HTTP found : aim/gromit/aim_express\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } } } } if (memcmp(packet->payload, "CONNECT ", 8) == 0) { if (memcmp(packet->payload, "CONNECT login.icq.com:443 HTTP/1.", 33) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR ICQ-HTTP FOUND\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (memcmp(packet->payload, "CONNECT login.oscar.aol.com:5190 HTTP/1.", 40) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR AIM-HTTP FOUND\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } if (packet->payload_packet_len > 43 && memcmp(packet->payload, "GET http://http.proxy.icq.com/hello HTTP/1.", 43) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR ICQ-HTTP PROXY FOUND\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (packet->payload_packet_len > 46 && memcmp(packet->payload, "GET http://aimhttp.oscar.aol.com/hello HTTP/1.", 46) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR AIM-HTTP PROXY FOUND\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (packet->payload_packet_len > 5 && get_u32(packet->payload, 0) == htonl(0x05010003)) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "Maybe OSCAR Picturetransfer\n"); return; } if (packet->payload_packet_len == 10 && get_u32(packet->payload, 0) == htonl(0x05000001) && get_u32(packet->payload, 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "Maybe OSCAR Picturetransfer\n"); return; } if (packet->payload_packet_len >= 70 && memcmp(&packet->payload[packet->payload_packet_len - 26], "\x67\x00\x65\x00\x74\x00\x43\x00\x61\x00\x74\x00\x61\x00\x6c\x00\x6f\x00\x67", 19) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR PICTURE TRANSFER\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (IPQ_SRC_OR_DST_HAS_PROTOCOL(src, dst, IPOQUE_PROTOCOL_OSCAR) != 0) { if (flow->packet_counter == 1 && ((packet->payload_packet_len == 9 && memcmp(packet->payload, "\x00\x09\x00\x00\x83\x01\xc0\x00\x00", 9) == 0) || (packet->payload_packet_len == 13 && (memcmp(packet->payload, "\x00\x0d\x00\x87\x01\xc0", 6) == 0 || memcmp(packet->payload, "\x00\x0d\x00\x87\x01\xc1", 6) == 0)))) { flow->oscar_video_voice = 1; } if (flow->oscar_video_voice && ntohs(get_u16(packet->payload, 0)) == packet->payload_packet_len && packet->payload[2] == 0x00 && packet->payload[3] == 0x00) { } if (packet->payload_packet_len >= 70 && ntohs(get_u16(packet->payload, 4)) == packet->payload_packet_len) { if (memcmp(packet->payload, "OFT", 3) == 0 && ((packet->payload[3] == '3' && ((memcmp(&packet->payload[4], "\x01\x00\x01\x01", 4) == 0) || (memcmp(&packet->payload[6], "\x01\x01\x00", 3) == 0))) || (packet->payload[3] == '2' && ((memcmp(&packet->payload[6], "\x01\x01", 2) == 0) )))) { // FILE TRANSFER PATTERN:: OFT3 or OFT2 IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR FILE TRANSFER\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (memcmp(packet->payload, "ODC2", 4) == 0 && memcmp(&packet->payload[6], "\x00\x01\x00\x06", 4) == 0) { //PICTURE TRANSFER PATTERN EXMAPLE:: //4f 44 43 32 00 4c 00 01 00 06 00 00 00 00 00 00 ODC2.L.......... IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR PICTURE TRANSFER\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } if (packet->payload_packet_len > 40 && (memcmp(&packet->payload[2], "\x04\x4a\x00", 3) == 0) && (memcmp(&packet->payload[6], "\x00\x00", 2) == 0) && packet->payload[packet->payload_packet_len - 15] == 'F' && packet->payload[packet->payload_packet_len - 12] == 'L' && (memcmp(&packet->payload[packet->payload_packet_len - 6], "DEST", 4) == 0) && (memcmp(&packet->payload[packet->payload_packet_len - 2], "\x00\x00", 2) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR PICTURE TRANSFER\n"); ipoque_int_oscar_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); if (ntohs(packet->tcp->dest) == 443 || ntohs(packet->tcp->source) == 443) { flow->oscar_ssl_voice_stage = 1; } return; } } if (flow->packet_counter < 3 && packet->payload_packet_len > 11 && (memcmp(packet->payload, "\x00\x37\x04\x4a", 4) || memcmp(packet->payload, "\x00\x0a\x04\x4a", 4))) { return; } if (packet->detected_protocol_stack[0] != IPOQUE_PROTOCOL_OSCAR) { IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_OSCAR); return; } } void ipoque_search_oscar(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->tcp != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_OSCAR, ipoque_struct, IPQ_LOG_DEBUG, "OSCAR :: TCP\n"); ipoque_search_oscar_tcp_connect(ipoque_struct); } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/yahoo.c0000644000000000000000000004100411661524573017642 0ustar rootroot/* * yahoo.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_YAHOO struct ipoque_yahoo_header { u8 YMSG_str[4]; u16 version; u16 nothing0; u16 len; u16 service; u32 status; u32 session_id; }; /* This function checks the pattern 'packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; const struct ipoque_yahoo_header *yahoo = (struct ipoque_yahoo_header *) packet->payload; if (packet->payload_packet_len == 0) { return; } /* packet must be at least 20 bytes long */ if (packet->payload_packet_len >= 20 && memcmp(yahoo->YMSG_str, "YMSG", 4) == 0 && ((packet->payload_packet_len - 20) == ntohs(yahoo->len) || check_ymsg(packet->payload, packet->payload_packet_len))) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "YAHOO FOUND\n"); flow->yahoo_detection_finished = 2; if (ntohs(yahoo->service) == 24 || ntohs(yahoo->service) == 152 || ntohs(yahoo->service) == 74) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "YAHOO conference or chat invite found"); if (src != NULL) { src->yahoo_conf_logged_in = 1; } if (dst != NULL) { dst->yahoo_conf_logged_in = 1; } } if (ntohs(yahoo->service) == 27 || ntohs(yahoo->service) == 155 || ntohs(yahoo->service) == 160) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "YAHOO conference or chat logoff found"); if (src != NULL) { src->yahoo_conf_logged_in = 0; src->yahoo_voice_conf_logged_in = 0; } } IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } else if (flow->yahoo_detection_finished == 2 && packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_YAHOO) { return; } else if (packet->payload_packet_len == 4 && memcmp(yahoo->YMSG_str, "YMSG", 4) == 0) { flow->l4.tcp.yahoo_sip_comm = 1; return; } else if (flow->l4.tcp.yahoo_sip_comm && packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN && flow->packet_counter < 3) { return; } /* now test for http login, at least 100 a bytes packet */ if (ipoque_struct->yahoo_detect_http_connections != 0 && packet->payload_packet_len > 100) { if (memcmp(packet->payload, "POST /relay?token=", 18) == 0 || memcmp(packet->payload, "GET /relay?token=", 17) == 0 || memcmp(packet->payload, "GET /?token=", 12) == 0 || memcmp(packet->payload, "HEAD /relay?token=", 18) == 0) { if ((src != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO) != 0) || (dst != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO) != 0)) { /* this is mostly a file transfer */ IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } if (memcmp(packet->payload, "POST ", 5) == 0) { u16 a; ipq_parse_packet_line_info(ipoque_struct); if ((packet->user_agent_line.len >= 21) && (memcmp(packet->user_agent_line.ptr, "YahooMobileMessenger/", 21) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO(Mobile)"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (IPQ_SRC_OR_DST_HAS_PROTOCOL(src, dst, IPOQUE_PROTOCOL_YAHOO) && packet->parsed_lines > 5 && memcmp(&packet->payload[5], "/Messenger.", 11) == 0 && packet->line[1].len >= 17 && ipq_mem_cmp(packet->line[1].ptr, "Connection: Close", 17) == 0 && packet->line[2].len >= 6 && ipq_mem_cmp(packet->line[2].ptr, "Host: ", 6) == 0 && packet->line[3].len >= 16 && ipq_mem_cmp(packet->line[3].ptr, "Content-Length: ", 16) == 0 && packet->line[4].len >= 23 && ipq_mem_cmp(packet->line[4].ptr, "User-Agent: Mozilla/5.0", 23) == 0 && packet->line[5].len >= 23 && ipq_mem_cmp(packet->line[5].ptr, "Cache-Control: no-cache", 23) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "YAHOO HTTP POST P2P FILETRANSFER FOUND\n"); IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (packet->host_line.ptr != NULL && packet->host_line.len >= 26 && ipq_mem_cmp(packet->host_line.ptr, "filetransfer.msg.yahoo.com", 26) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "YAHOO HTTP POST FILETRANSFER FOUND\n"); IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } /* now check every line */ for (a = 0; a < packet->parsed_lines; a++) { if (packet->line[a].len >= 4 && ipq_mem_cmp(packet->line[a].ptr, "YMSG", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "YAHOO HTTP POST FOUND, line is: %.*s\n", packet->line[a].len, packet->line[a].ptr); IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } if (packet->parsed_lines > 8 && packet->line[8].len > 250 && packet->line[8].ptr != NULL) { if (memcmp(packet->line[8].ptr, "line[8].len, packet->line[8].ptr)) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found HTTP Proxy Yahoo Chat payload, "GET /Messenger.", 15) == 0) { if ((src != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO) != 0) || (dst != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO) != 0)) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "YAHOO HTTP GET /Messenger. match\n"); IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } if ((memcmp(packet->payload, "GET /", 5) == 0)) { ipq_parse_packet_line_info(ipoque_struct); if ((packet->user_agent_line.ptr != NULL && packet->user_agent_line.len >= IPQ_STATICSTRING_LEN("YahooMobileMessenger/") && memcmp(packet->user_agent_line.ptr, "YahooMobileMessenger/", IPQ_STATICSTRING_LEN("YahooMobileMessenger/")) == 0) || (packet->user_agent_line.len >= 15 && (memcmp(packet->user_agent_line.ptr, "Y!%20Messenger/", 15) == 0))) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO(Mobile)"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (packet->host_line.ptr != NULL && packet->host_line.len >= IPQ_STATICSTRING_LEN("msg.yahoo.com") && memcmp(&packet->host_line.ptr[packet->host_line.len - IPQ_STATICSTRING_LEN("msg.yahoo.com")], "msg.yahoo.com", IPQ_STATICSTRING_LEN("msg.yahoo.com")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } /* found another http login command for yahoo, it is like OSCAR */ /* detect http connections */ if (packet->payload_packet_len > 50 && (memcmp(packet->payload, "content-length: ", 16) == 0)) { ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines > 2 && packet->line[1].len == 0) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "first line is empty.\n"); if (packet->line[2].len > 13 && memcmp(packet->line[2].ptr, "payload_packet_len > 38 && memcmp(packet->payload, "CONNECT scs.msg.yahoo.com:5050 HTTP/1.", 38) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "YAHOO-HTTP FOUND\n"); IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if ((src != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO) != 0) || (dst != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO) != 0)) { if (packet->payload_packet_len == 6 && memcmp(packet->payload, "YAHOO!", 6) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } /* asymmetric detection for SNDIMG not done yet. * See ./Yahoo8.1-VideoCall-LAN.pcap and ./Yahoo-VideoCall-inPublicIP.pcap */ if (packet->payload_packet_len == 8 && (memcmp(packet->payload, "", 8) == 0 || memcmp(packet->payload, "", 8) == 0 || memcmp(packet->payload, "", 8) == 0 || memcmp(packet->payload, "", 8) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_TRACE, "YAHOO SNDIMG or REQIMG or RVWCFG or RUPCFG FOUND\n"); if (src != NULL) { if (memcmp(packet->payload, "", 8) == 0) { src->yahoo_video_lan_dir = 0; } else { src->yahoo_video_lan_dir = 1; } src->yahoo_video_lan_timer = packet->tick_timestamp; } if (dst != NULL) { if (memcmp(packet->payload, "", 8) == 0) { dst->yahoo_video_lan_dir = 0; } else { dst->yahoo_video_lan_dir = 1; } dst->yahoo_video_lan_timer = packet->tick_timestamp; } IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO subtype VIDEO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (src != NULL && packet->tcp->dest == htons(5100) && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->yahoo_video_lan_timer) < ipoque_struct->yahoo_lan_video_timeout)) { if (src->yahoo_video_lan_dir == 1) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "IMG MARKED"); return; } } if (dst != NULL && packet->tcp->dest == htons(5100) && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->yahoo_video_lan_timer) < ipoque_struct->yahoo_lan_video_timeout)) { if (dst->yahoo_video_lan_dir == 0) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found YAHOO"); ipoque_int_yahoo_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "IMG MARKED"); return; } } } /* detect YAHOO over HTTP proxy */ #ifdef IPOQUE_PROTOCOL_HTTP if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP) #endif { if (flow->l4.tcp.yahoo_http_proxy_stage == 0) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "YAHOO maybe HTTP proxy packet 1 => need next packet\n"); flow->l4.tcp.yahoo_http_proxy_stage = 1 + packet->packet_direction; return; } if (flow->l4.tcp.yahoo_http_proxy_stage == 1 + packet->packet_direction) { if ((packet->payload_packet_len > 250) && (memcmp(packet->payload, "payload_packet_len, packet->payload)) { IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "found HTTP Proxy Yahoo Chat need next packet\n"); return; } if (flow->l4.tcp.yahoo_http_proxy_stage == 2 - packet->packet_direction) { ipq_parse_packet_line_info_unix(ipoque_struct); if (packet->parsed_unix_lines >= 9) { if (packet->unix_line[4].ptr != NULL && packet->unix_line[4].len >= 9 && packet->unix_line[8].ptr != NULL && packet->unix_line[8].len >= 6 && memcmp(packet->unix_line[4].ptr, "unix_line[8].ptr, "excluded_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_search_yahoo_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; if (src == NULL || IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO) == 0) { goto excl_yahoo_udp; } excl_yahoo_udp: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO); } void ipoque_search_yahoo(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; IPQ_LOG(IPOQUE_PROTOCOL_YAHOO, ipoque_struct, IPQ_LOG_DEBUG, "search yahoo\n"); if (packet->payload_packet_len > 0 && flow->yahoo_detection_finished == 0) { if (packet->tcp != NULL && packet->tcp_retransmission == 0) { if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN #ifdef IPOQUE_PROTOCOL_HTTP || packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP #endif #ifdef IPOQUE_PROTOCOL_SSL || packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SSL #endif ) { ipoque_search_yahoo_tcp(ipoque_struct); } } else if (packet->udp != NULL) { ipoque_search_yahoo_udp(ipoque_struct); } } if (packet->payload_packet_len > 0 && flow->yahoo_detection_finished == 2) { if (packet->tcp != NULL && packet->tcp_retransmission == 0) { ipoque_search_yahoo_tcp(ipoque_struct); } } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/zattoo.c0000644000000000000000000002342711661524573020054 0ustar rootroot/* * zattoo.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_ZATTOO static void ipoque_int_zattoo_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_ZATTOO, protocol_type); if (src != NULL) { src->zattoo_ts = packet->tick_timestamp; } if (dst != NULL) { dst->zattoo_ts = packet->tick_timestamp; } } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 ipoque_int_zattoo_user_agent_set(struct ipoque_detection_module_struct *ipoque_struct) { if (ipoque_struct->packet.user_agent_line.ptr != NULL && ipoque_struct->packet.user_agent_line.len == 111) { if (memcmp(ipoque_struct->packet.user_agent_line.ptr + ipoque_struct->packet.user_agent_line.len - 25, "Zattoo/4", sizeof("Zattoo/4") - 1) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "found zattoo useragent\n"); return 1; } } return 0; } void ipoque_search_zattoo(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; u16 i; if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_ZATTOO) { if (src != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->zattoo_ts) < ipoque_struct->zattoo_connection_timeout)) { src->zattoo_ts = packet->tick_timestamp; } if (dst != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->zattoo_ts) < ipoque_struct->zattoo_connection_timeout)) { dst->zattoo_ts = packet->tick_timestamp; } return; } if (packet->tcp != NULL) { if (packet->payload_packet_len > 50 && memcmp(packet->payload, "GET /frontdoor/fd?brand=Zattoo&v=", 33) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "add connection over tcp with pattern GET /frontdoor/fd?brand=Zattoo&v=\n"); ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (packet->payload_packet_len > 50 && memcmp(packet->payload, "GET /ZattooAdRedirect/redirect.jsp?user=", 40) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "add connection over tcp with pattern GET /ZattooAdRedirect/redirect.jsp?user=\n"); ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (packet->payload_packet_len > 50 && (memcmp(packet->payload, "POST /channelserver/player/channel/update HTTP/1.1", 50) == 0 || memcmp(packet->payload, "GET /epg/query", 14) == 0)) { ipq_parse_packet_line_info(ipoque_struct); for (i = 0; i < packet->parsed_lines; i++) { if (packet->line[i].len >= 18 && (ipq_mem_cmp(packet->line[i].ptr, "User-Agent: Zattoo", 18) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "add connection over tcp with pattern POST /channelserver/player/channel/update HTTP/1.1\n"); ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } else if (packet->payload_packet_len > 50 && (memcmp(packet->payload, "GET /", 5) == 0 || memcmp(packet->payload, "POST /", IPQ_STATICSTRING_LEN("POST /")) == 0)) { /* TODO to avoid searching currently only a specific length and offset is used * that might be changed later */ ipq_parse_packet_line_info(ipoque_struct); if (ipoque_int_zattoo_user_agent_set(ipoque_struct)) { ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } else if (packet->payload_packet_len > 50 && memcmp(packet->payload, "POST http://", 12) == 0) { ipq_parse_packet_line_info(ipoque_struct); // test for unique character of the zattoo header if (packet->parsed_lines == 4 && packet->host_line.ptr != NULL) { u32 ip; u16 bytes_read = 0; ip = ipq_bytestream_to_ipv4(&packet->payload[12], packet->payload_packet_len, &bytes_read); // and now test the firt 5 bytes of the payload for zattoo pattern if (ip == packet->iph->daddr && packet->empty_line_position_set != 0 && ((packet->payload_packet_len - packet->empty_line_position) > 10) && packet->payload[packet->empty_line_position + 2] == 0x03 && packet->payload[packet->empty_line_position + 3] == 0x04 && packet->payload[packet->empty_line_position + 4] == 0x00 && packet->payload[packet->empty_line_position + 5] == 0x04 && packet->payload[packet->empty_line_position + 6] == 0x0a && packet->payload[packet->empty_line_position + 7] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "add connection over tcp with pattern POST http://\n"); ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } else if (flow->zattoo_stage == 0) { if (packet->payload_packet_len > 50 && packet->payload[0] == 0x03 && packet->payload[1] == 0x04 && packet->payload[2] == 0x00 && packet->payload[3] == 0x04 && packet->payload[4] == 0x0a && packet->payload[5] == 0x00) { flow->zattoo_stage = 1 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "need next packet, seen pattern 0x030400040a00\n"); return; } /* the following is is searching for flash, not for zattoo. cust1 wants to do so. */ } else if (flow->zattoo_stage == 2 - packet->packet_direction && packet->payload_packet_len > 50 && packet->payload[0] == 0x03 && packet->payload[1] == 0x04) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "add connection over tcp with 0x0304.\n"); ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } else if (flow->zattoo_stage == 1 + packet->packet_direction) { if (packet->payload_packet_len > 500 && packet->payload[0] == 0x00 && packet->payload[1] == 0x00) { flow->zattoo_stage = 3 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "need next packet, seen pattern 0x0000\n"); return; } if (packet->payload_packet_len > 50 && packet->payload[0] == 0x03 && packet->payload[1] == 0x04 && packet->payload[2] == 0x00 && packet->payload[3] == 0x04 && packet->payload[4] == 0x0a && packet->payload[5] == 0x00) { } IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "need next packet, seen pattern 0x030400040a00\n"); return; } else if (flow->zattoo_stage == 4 - packet->packet_direction && packet->payload_packet_len > 50 && packet->payload[0] == 0x03 && packet->payload[1] == 0x04) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "add connection over tcp with 0x0304.\n"); ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } else if (flow->zattoo_stage == 5 + packet->packet_direction && (packet->payload_packet_len == 125)) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "detected zattoo.\n"); ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } else if (flow->zattoo_stage == 6 - packet->packet_direction && packet->payload_packet_len == 1412) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "found zattoo.\n"); ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "ZATTOO: discarted the flow (TCP): packet_size: %u; Flowstage: %u\n", packet->payload_packet_len, flow->zattoo_stage); } else if (packet->udp != NULL) { if (packet->payload_packet_len > 20 && (packet->udp->dest == htons(5003) || packet->udp->source == htons(5003)) && (get_u16(packet->payload, 0) == htons(0x037a) || get_u16(packet->payload, 0) == htons(0x0378) || get_u16(packet->payload, 0) == htons(0x0305) || get_u32(packet->payload, 0) == htonl(0x03040004) || get_u32(packet->payload, 0) == htonl(0x03010005))) { if (++flow->zattoo_stage == 2) { IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "add connection over udp.\n"); ipoque_int_zattoo_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "need next packet udp.\n"); return; } IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "ZATTOO: discarded the flow (UDP): packet_size: %u; Flowstage: %u\n", packet->payload_packet_len, flow->zattoo_stage); } IPQ_LOG(IPOQUE_PROTOCOL_ZATTOO, ipoque_struct, IPQ_LOG_DEBUG, "exclude zattoo.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_ZATTOO); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/fasttrack.c0000644000000000000000000000610511655273464020513 0ustar rootroot/* * fasttrack.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_FASTTRACK static void ipoque_int_fasttrack_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FASTTRACK, IPOQUE_CORRELATED_PROTOCOL); } void ipoque_search_fasttrack_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 6 && ntohs(get_u16(packet->payload, packet->payload_packet_len - 2)) == 0x0d0a) { IPQ_LOG(IPOQUE_PROTOCOL_FASTTRACK, ipoque_struct, IPQ_LOG_TRACE, "detected 0d0a at the end of the packet.\n"); if (memcmp(packet->payload, "GIVE ", 5) == 0 && packet->payload_packet_len >= 8) { u16 i; for (i = 5; i < (packet->payload_packet_len - 2); i++) { // make shure that the argument to GIVE is numeric if (!(packet->payload[i] >= '0' && packet->payload[i] <= '9')) { goto exclude_fasttrack; } } IPQ_LOG(IPOQUE_PROTOCOL_FASTTRACK, ipoque_struct, IPQ_LOG_TRACE, "FASTTRACK GIVE DETECTED\n"); ipoque_int_fasttrack_add_connection(ipoque_struct); return; } if (packet->payload_packet_len > 50 && memcmp(packet->payload, "GET /", 5) == 0) { u8 a = 0; IPQ_LOG(IPOQUE_PROTOCOL_FASTTRACK, ipoque_struct, IPQ_LOG_TRACE, "detected GET /. \n"); ipq_parse_packet_line_info(ipoque_struct); for (a = 0; a < packet->parsed_lines; a++) { if ((packet->line[a].len > 17 && memcmp(packet->line[a].ptr, "X-Kazaa-Username: ", 18) == 0) || (packet->line[a].len > 23 && memcmp(packet->line[a].ptr, "User-Agent: PeerEnabler/", 24) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_FASTTRACK, ipoque_struct, IPQ_LOG_TRACE, "detected X-Kazaa-Username: || User-Agent: PeerEnabler/\n"); ipoque_int_fasttrack_add_connection(ipoque_struct); return; } } } } exclude_fasttrack: IPQ_LOG(IPOQUE_PROTOCOL_FASTTRACK, ipoque_struct, IPQ_LOG_TRACE, "fasttrack/kazaa excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_FASTTRACK); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/http.c0000644000000000000000000011672412007425424017504 0ustar rootroot/* * http.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_HTTP static void ipoque_int_http_add_connection(struct ipoque_detection_module_struct *ipoque_struct, u32 protocol) { struct ipoque_flow_struct *flow = ipoque_struct->flow; if (protocol != IPOQUE_PROTOCOL_HTTP) { ipoque_int_add_connection(ipoque_struct, protocol, IPOQUE_CORRELATED_PROTOCOL); } else { ipoque_int_reset_protocol(ipoque_struct); ipoque_int_add_connection(ipoque_struct, protocol, IPOQUE_REAL_PROTOCOL); } flow->http_detected = 1; } #ifdef IPOQUE_PROTOCOL_QQ static void qq_parse_packet_URL_and_hostname(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; u32 a; if (packet->payload_packet_len < 100 || /*memcmp(&packet->payload[4], "/qzone", 6) != 0 || packet->host_line.len < 7 || */ memcmp(&packet->host_line.ptr[packet->host_line.len - 6], "qq.com", 6) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "did not find QQ.\n"); return; } for (a = 0; a < packet->parsed_lines; a++) { if ((packet->line[a].len > 22 && memcmp(packet->line[a].ptr, "QzoneAuth: zzpaneluin=", 22) == 0) || (packet->line[a].len > 19 && memcmp(packet->line[a].ptr, "Cookie: zzpanelkey=", 19) == 0) || (packet->line[a].len > 13 && memcmp(packet->line[a].ptr, "Cookie: adid=", 13) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_QQ, ipoque_struct, IPQ_LOG_DEBUG, "found QQ.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_QQ); return; } } } #endif #ifdef IPOQUE_PROTOCOL_MPEG static void mpeg_parse_packet_contentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->content_line.len >= 10 && memcmp(packet->content_line.ptr, "audio/mpeg", 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MPEG, ipoque_struct, IPQ_LOG_DEBUG, "MPEG: Content-Type: audio/mpeg found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MPEG); return; } if (packet->content_line.len >= 12 && memcmp(packet->content_line.ptr, "audio/x-mpeg", 12) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MPEG, ipoque_struct, IPQ_LOG_DEBUG, "MPEG: Content-Type: audio/x-mpeg found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MPEG); return; } if (packet->content_line.len >= 11 && memcmp(packet->content_line.ptr, "audio/mpeg3", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MPEG, ipoque_struct, IPQ_LOG_DEBUG, "MPEG: Content-Type: audio/mpeg3 found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MPEG); return; } if (packet->content_line.len >= 11 && memcmp(packet->content_line.ptr, "audio/mp4a", 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MPEG, ipoque_struct, IPQ_LOG_DEBUG, "MPEG: Content-Type: audio/mp4a found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MPEG); return; } if (packet->content_line.len >= 10 && memcmp(packet->content_line.ptr, "video/mpeg", 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MPEG, ipoque_struct, IPQ_LOG_DEBUG, "MPEG: Content-Type: video/mpeg found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MPEG); return; } if (packet->content_line.len >= 9 && memcmp(packet->content_line.ptr, "video/nsv", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MPEG, ipoque_struct, IPQ_LOG_DEBUG, "MPEG: content-type:video/nsv found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MPEG); return; } /* Ultravox */ if (packet->content_line.len >= 13 && memcmp(packet->content_line.ptr, "misc/ultravox", 13) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MPEG, ipoque_struct, IPQ_LOG_DEBUG, "MPEG: Content-Type: misc/ultravox found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MPEG); return; } } #endif #ifdef IPOQUE_PROTOCOL_OGG static void ogg_parse_packet_contentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->content_line.len >= 9 && memcmp(packet->content_line.ptr, "audio/ogg", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OGG, ipoque_struct, IPQ_LOG_DEBUG, "OGG: Content-Type: audio/ogg found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_OGG); return; } if (packet->content_line.len >= 9 && memcmp(packet->content_line.ptr, "video/ogg", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OGG, ipoque_struct, IPQ_LOG_DEBUG, "OGG: Content-Type: video/ogg found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_OGG); return; } if (packet->content_line.len >= 15 && memcmp(packet->content_line.ptr, "application/ogg", 15) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OGG, ipoque_struct, IPQ_LOG_DEBUG, "OGG: content-type: application/ogg found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_OGG); return; } } #endif #ifdef IPOQUE_PROTOCOL_FLASH static void flash_parse_packet_contentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->content_line.len >= 9 && memcmp(packet->content_line.ptr, "video/flv", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH: Content-Type: video/flv found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLASH); return; } if (packet->content_line.len >= 11 && memcmp(packet->content_line.ptr, "video/x-flv", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH: Content-Type: video/x-flv found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLASH); return; } if (packet->content_line.len >= 17 && memcmp(packet->content_line.ptr, "application/x-fcs", 17) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH: Content-Type: application/x-fcs found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLASH); return; } if (packet->content_line.len >= 29 && memcmp(packet->content_line.ptr, "application/x-shockwave-flash", 29) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH: Content-Type: application/x-shockwave-flash found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLASH); return; } if (packet->content_line.len >= 11 && memcmp(packet->content_line.ptr, "video/flash", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH: Content-Type: video/flash found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLASH); return; } if (packet->content_line.len >= 15 && memcmp(packet->content_line.ptr, "application/flv", 15) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH: Content-Type: application/flv found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLASH); return; } if (packet->content_line.len >= 28 && memcmp(packet->content_line.ptr, "flv-application/octet-stream", 28) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "FLASH: Content-Type: flv-application/octet-stream.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLASH); return; } } #endif #ifdef IPOQUE_PROTOCOL_QUICKTIME static void qt_parse_packet_contentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->content_line.len >= 15 && memcmp(packet->content_line.ptr, "video/quicktime", 15) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_QUICKTIME, ipoque_struct, IPQ_LOG_DEBUG, "QUICKTIME: Content-Type: video/quicktime found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_QUICKTIME); return; } if (packet->content_line.len >= 9 && memcmp(packet->content_line.ptr, "video/mp4", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_QUICKTIME, ipoque_struct, IPQ_LOG_DEBUG, "QUICKTIME: Content-Type: video/mp4 found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_QUICKTIME); return; } if (packet->content_line.len >= 11 && memcmp(packet->content_line.ptr, "video/x-m4v", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_QUICKTIME, ipoque_struct, IPQ_LOG_DEBUG, "QUICKTIME: Content-Type: video/x-m4v found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_QUICKTIME); return; } } #endif #ifdef IPOQUE_PROTOCOL_REALMEDIA static void realmedia_parse_packet_contentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->content_line.len >= 20 && memcmp(packet->content_line.ptr, "audio/x-pn-realaudio", 20) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_REALMEDIA, ipoque_struct, IPQ_LOG_DEBUG, "REALMEDIA: Content-Type: audio/x-pn-realaudio found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_REALMEDIA); return; } if (packet->content_line.len >= 28 && memcmp(packet->content_line.ptr, "application/vnd.rn-realmedia", 28) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_REALMEDIA, ipoque_struct, IPQ_LOG_DEBUG, "REALMEDIA: Content-Type: application/vnd.rn-realmedia found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_REALMEDIA); return; } } #endif #ifdef IPOQUE_PROTOCOL_WINDOWSMEDIA static void windowsmedia_parse_packet_contentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->content_line.len >= 14 && ipq_mem_cmp(packet->content_line.ptr, "video/x-ms-", 11) == 0) { if (ipq_mem_cmp(&packet->content_line.ptr[11], "wmv", 3) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_WINDOWSMEDIA, ipoque_struct, IPQ_LOG_DEBUG, "WINDOWSMEDIA: Content-Type: video/x-ms-wmv found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WINDOWSMEDIA); return; } if (ipq_mem_cmp(&packet->content_line.ptr[11], "asf", 3) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_WINDOWSMEDIA, ipoque_struct, IPQ_LOG_DEBUG, "WINDOWSMEDIA: Content-Type: video/x-ms-asf found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WINDOWSMEDIA); return; } if (ipq_mem_cmp(&packet->content_line.ptr[11], "asx", 3) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_WINDOWSMEDIA, ipoque_struct, IPQ_LOG_DEBUG, "WINDOWSMEDIA: Content-Type: video/x-ms-asx found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WINDOWSMEDIA); return; } } if (packet->content_line.len >= 24 && ipq_mem_cmp(packet->content_line.ptr, "video/x-msvideo", 15) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_WINDOWSMEDIA, ipoque_struct, IPQ_LOG_DEBUG, "WINDOWSMEDIA: Content-Type: video/x-msvideo found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WINDOWSMEDIA); return; } if (packet->content_line.len >= 24 && ipq_mem_cmp(packet->content_line.ptr, "audio/x-wav", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_WINDOWSMEDIA, ipoque_struct, IPQ_LOG_DEBUG, "WINDOWSMEDIA: Content-Type: audio/x-wav found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WINDOWSMEDIA); return; } if (packet->content_line.len >= 32 && ipq_mem_cmp(packet->content_line.ptr, "application/vnd.ms.wms-hdr.asfv1", 32) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_WINDOWSMEDIA, ipoque_struct, IPQ_LOG_DEBUG, "WINDOWSMEDIA: Content-Type: application/vnd.ms.wms-hdr.asfv1 found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WINDOWSMEDIA); return; } } static void winmedia_parse_packet_useragentline(struct ipoque_detection_module_struct *ipoque_struct) { if (ipoque_struct->packet.user_agent_line.len >= 9 && memcmp(ipoque_struct->packet.user_agent_line.ptr, "NSPlayer/", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_WINDOWSMEDIA, ipoque_struct, IPQ_LOG_DEBUG, "username NSPlayer found\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WINDOWSMEDIA); } } #endif #ifdef IPOQUE_PROTOCOL_MMS static void mms_parse_packet_contentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->content_line.len >= 24 && ipq_mem_cmp(packet->content_line.ptr, "application/x-mms-framed", 24) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MMS, ipoque_struct, IPQ_LOG_DEBUG, "MMS: Content-Type: application/x-mms-framed found\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MMS); } } #endif #ifdef IPOQUE_PROTOCOL_XBOX static void xbox_parse_packet_useragentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->user_agent_line.len >= 17 && memcmp(packet->user_agent_line.ptr, "Xbox Live Client/", 17) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_XBOX, ipoque_struct, IPQ_LOG_DEBUG, "XBOX: User Agent: Xbox Live Client found\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_XBOX); } } #endif #ifdef NTOP_PROTOCOL_WINDOWS_UPDATE static void windows_update_packet_useragentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if(packet->user_agent_line.len >= 20 && memcmp(packet->user_agent_line.ptr, "Windows-Update-Agent", 20) == 0) { IPQ_LOG(NTOP_PROTOCOL_WINDOWS_UPDATE, ipoque_struct, IPQ_LOG_DEBUG, "WSUS: User Agent: Windows-Update-Agent\n"); ipoque_int_http_add_connection(ipoque_struct, NTOP_PROTOCOL_WINDOWS_UPDATE); } } #endif #ifdef IPOQUE_PROTOCOL_FLASH static void flash_check_http_payload(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; const u8 *pos; if (packet->empty_line_position_set == 0 || (packet->empty_line_position + 10) > (packet->payload_packet_len)) return; pos = &packet->payload[packet->empty_line_position] + 2; if (memcmp(pos, "FLV", 3) == 0 && pos[3] == 0x01 && (pos[4] == 0x01 || pos[4] == 0x04 || pos[4] == 0x05) && pos[5] == 0x00 && pos[6] == 0x00 && pos[7] == 0x00 && pos[8] == 0x09) { IPQ_LOG(IPOQUE_PROTOCOL_FLASH, ipoque_struct, IPQ_LOG_DEBUG, "Flash content in http detected\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FLASH); } } #endif #ifdef IPOQUE_PROTOCOL_AVI static void avi_check_http_payload(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; IPQ_LOG(IPOQUE_PROTOCOL_AVI, ipoque_struct, IPQ_LOG_DEBUG, "called avi_check_http_payload: %u %u %u\n", packet->empty_line_position_set, flow->l4.tcp.http_empty_line_seen, packet->empty_line_position); if (packet->empty_line_position_set == 0 && flow->l4.tcp.http_empty_line_seen == 0) return; if (packet->empty_line_position_set != 0 && ((packet->empty_line_position + 20) > (packet->payload_packet_len)) && flow->l4.tcp.http_empty_line_seen == 0) { flow->l4.tcp.http_empty_line_seen = 1; return; } if (flow->l4.tcp.http_empty_line_seen == 1) { if (packet->payload_packet_len > 20 && memcmp(packet->payload, "RIFF", 4) == 0 && memcmp(packet->payload + 8, "AVI LIST", 8) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_AVI, ipoque_struct, IPQ_LOG_DEBUG, "Avi content in http detected\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_AVI); } flow->l4.tcp.http_empty_line_seen = 0; return; } if (packet->empty_line_position_set != 0) { // check for avi header // for reference see http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/htm/avirifffilereference.asp u32 p = packet->empty_line_position + 2; IPQ_LOG(IPOQUE_PROTOCOL_AVI, ipoque_struct, IPQ_LOG_DEBUG, "p = %u\n", p); if ((p + 16) <= packet->payload_packet_len && memcmp(&packet->payload[p], "RIFF", 4) == 0 && memcmp(&packet->payload[p + 8], "AVI LIST", 8) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_AVI, ipoque_struct, IPQ_LOG_DEBUG, "Avi content in http detected\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_AVI); } } } #endif #ifdef NTOP_PROTOCOL_TEAMVIEWER static void teamviewer_check_http_payload(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; const u8 *pos; IPQ_LOG(NTOP_PROTOCOL_TEAMVIEWER, ipoque_struct, IPQ_LOG_DEBUG, "called teamviewer_check_http_payload: %u %u %u\n", packet->empty_line_position_set, flow->l4.tcp.http_empty_line_seen, packet->empty_line_position); if (packet->empty_line_position_set == 0 || (packet->empty_line_position + 5) > (packet->payload_packet_len)) return; pos = &packet->payload[packet->empty_line_position] + 2; if (pos[0] == 0x17 && pos[1] == 0x24) { IPQ_LOG(NTOP_PROTOCOL_TEAMVIEWER, ipoque_struct, IPQ_LOG_DEBUG, "TeamViewer content in http detected\n"); ipoque_int_http_add_connection(ipoque_struct, NTOP_PROTOCOL_TEAMVIEWER); } } #endif #ifdef IPOQUE_PROTOCOL_OFF static void off_parse_packet_contentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->content_line.len >= 4 && memcmp(packet->content_line.ptr, "off/", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_OFF, ipoque_struct, IPQ_LOG_DEBUG, "off: Content-Type: off/ found\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_OFF); } } #endif #ifdef IPOQUE_PROTOCOL_MOVE static void move_parse_packet_contentline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->content_line.len == 15 && (memcmp(packet->content_line.ptr, "application/qmx", 15) == 0 || memcmp(packet->content_line.ptr, "application/qss", 15) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_MOVE, ipoque_struct, IPQ_LOG_DEBUG, "MOVE application qmx or qss detected\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MOVE); } } #endif #ifdef IPOQUE_PROTOCOL_RTSP static void rtsp_parse_packet_acceptline(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->accept_line.len >= 28 && memcmp(packet->accept_line.ptr, "application/x-rtsp-tunnelled", 28) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_RTSP, ipoque_struct, IPQ_LOG_DEBUG, "RTSP accept line detected\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_RTSP); } } #endif #ifdef HAVE_NTOP /* * Find the first occurrence of find in s, where the search is limited to the * first slen characters of s. */ char* ntop_strnstr(const char *s, const char *find, size_t slen) { char c, sc; size_t len; if ((c = *find++) != '\0') { len = strlen(find); do { do { if (slen-- < 1 || (sc = *s++) == '\0') return (NULL); } while (sc != c); if (len > slen) return (NULL); } while (strncmp(s, find, len) != 0); s--; } return ((char *)s); } static ntop_protocol_match host_match[] = { { ".twitter.com", NTOP_PROTOCOL_TWITTER }, { ".netflix.com", NTOP_PROTOCOL_NETFLIX }, { ".twttr.com", NTOP_PROTOCOL_TWITTER }, { ".facebook.com", NTOP_PROTOCOL_FACEBOOK }, { ".fbcdn.net", NTOP_PROTOCOL_FACEBOOK }, { ".dropbox.com", NTOP_PROTOCOL_DROPBOX }, { ".gmail.", NTOP_PROTOCOL_GMAIL }, { "maps.google.com", NTOP_PROTOCOL_GOOGLE_MAPS }, { "maps.gstatic.com", NTOP_PROTOCOL_GOOGLE_MAPS }, { ".gstatic.com", NTOP_PROTOCOL_GOOGLE }, { ".google.com", NTOP_PROTOCOL_GOOGLE }, { ".youtube.", NTOP_PROTOCOL_YOUTUBE }, { "itunes.apple.com", NTOP_PROTOCOL_APPLE_ITUNES }, { ".apple.com", NTOP_PROTOCOL_APPLE }, { ".mzstatic.com", NTOP_PROTOCOL_APPLE }, { ".facebook.com", NTOP_PROTOCOL_FACEBOOK }, { ".icloud.com", NTOP_PROTOCOL_APPLE_ICLOUD }, { ".viber.com", NTOP_PROTOCOL_VIBER }, { ".last.fm", NTOP_PROTOCOL_LASTFM }, { ".grooveshark.com", NTOP_PROTOCOL_GROOVESHARK }, { ".tuenti.com", NTOP_PROTOCOL_TUENTI }, { NULL, 0 } }; int matchStringProtocol(struct ipoque_detection_module_struct *ipoque_struct, char *string_to_match, u_int string_to_match_len) { int i = 0; while(host_match[i].string_to_match != NULL) { if(ntop_strnstr(string_to_match, host_match[i].string_to_match, string_to_match_len) != NULL) { ipoque_struct->packet.detected_protocol_stack[0] = host_match[i].protocol_id; return(ipoque_struct->packet.detected_protocol_stack[0]); } else i++; } #ifdef DEBUG string_to_match[string_to_match_len] = '\0'; printf("[NTOP] Unable to find a match for '%s'\n", string_to_match); #endif return(-1); } static void parseHttpSubprotocol(struct ipoque_detection_module_struct *ipoque_struct) { int i = 0; struct ipoque_packet_struct *packet = &ipoque_struct->packet; if(packet->iph /* IPv4 only */) { /* Twitter Inc. TWITTER-NETWORK (NET-199-59-148-0-1) 199.59.148.0 - 199.59.151.255 199.59.148.0/22 */ if(((ntohl(packet->iph->saddr) & 0xFFFFFC00 /* 255.255.252.0 */) == 0xC73B9400 /* 199.59.148.0 */) || ((ntohl(packet->iph->daddr) & 0xFFFFFC00 /* 255.255.252.0 */) == 0xC73B9400 /* 199.59.148.0 */)) { ipoque_struct->packet.detected_protocol_stack[0] = NTOP_PROTOCOL_TWITTER; return; } /* CIDR: 69.53.224.0/19 OriginAS: AS2906 NetName: NETFLIX-INC */ if(((ntohl(packet->iph->saddr) & 0xFFFFE000 /* 255.255.224.0 */) == 0x4535E000 /* 69.53.224.0 */) || ((ntohl(packet->iph->daddr) & 0xFFFFE000 /* 255.255.224.0 */) == 0x4535E000 /* 69.53.224.0 */)) { ipoque_struct->packet.detected_protocol_stack[0] = NTOP_PROTOCOL_NETFLIX; return; } } if (ipoque_struct->packet.detected_protocol_stack[0] != IPOQUE_PROTOCOL_HTTP) return; matchStringProtocol(ipoque_struct, (char*)ipoque_struct->packet.host_line.ptr, ipoque_struct->packet.host_line.len); } #endif static void check_content_type_and_change_protocol(struct ipoque_detection_module_struct *ipoque_struct) { #ifdef IPOQUE_PROTOCOL_MPEG struct ipoque_packet_struct *packet = &ipoque_struct->packet; #endif #ifdef IPOQUE_PROTOCOL_AVI #endif // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u8 a; if (ipoque_struct->packet.content_line.ptr != NULL && ipoque_struct->packet.content_line.len != 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "Content Type Line found %.*s\n", ipoque_struct->packet.content_line.len, ipoque_struct->packet.content_line.ptr); #ifdef IPOQUE_PROTOCOL_MPEG if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_MPEG) != 0) mpeg_parse_packet_contentline(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_FLASH if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_FLASH) != 0) flash_parse_packet_contentline(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_QUICKTIME if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_QUICKTIME) != 0) qt_parse_packet_contentline(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_REALMEDIA if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_REALMEDIA) != 0) realmedia_parse_packet_contentline(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_WINDOWSMEDIA if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_WINDOWSMEDIA) != 0) windowsmedia_parse_packet_contentline(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_MMS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_MMS) != 0) mms_parse_packet_contentline(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_OFF if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_OFF) != 0) off_parse_packet_contentline(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_OGG if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_OGG) != 0) ogg_parse_packet_contentline(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_MOVE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_MOVE) != 0) move_parse_packet_contentline(ipoque_struct); #endif } /* check user agent here too */ if (ipoque_struct->packet.user_agent_line.ptr != NULL && ipoque_struct->packet.user_agent_line.len != 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "User Agent Type Line found %.*s\n", ipoque_struct->packet.user_agent_line.len, ipoque_struct->packet.user_agent_line.ptr); #ifdef IPOQUE_PROTOCOL_XBOX if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_XBOX) != 0) xbox_parse_packet_useragentline(ipoque_struct); #endif #ifdef NTOP_PROTOCOL_WINDOWS_UPDATE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, NTOP_PROTOCOL_WINDOWS_UPDATE) != 0) windows_update_packet_useragentline(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_WINDOWSMEDIA if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_WINDOWSMEDIA) != 0) winmedia_parse_packet_useragentline(ipoque_struct); #endif } /* check for host line */ if (ipoque_struct->packet.host_line.ptr != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HOST Line found %.*s\n", ipoque_struct->packet.host_line.len, ipoque_struct->packet.host_line.ptr); #ifdef IPOQUE_PROTOCOL_QQ if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_QQ) != 0) { qq_parse_packet_URL_and_hostname(ipoque_struct); } #endif #ifdef HAVE_NTOP parseHttpSubprotocol(ipoque_struct); #endif } /* check for accept line */ if (ipoque_struct->packet.accept_line.ptr != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "Accept Line found %.*s\n", ipoque_struct->packet.accept_line.len, ipoque_struct->packet.accept_line.ptr); #ifdef IPOQUE_PROTOCOL_RTSP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_RTSP) != 0) { rtsp_parse_packet_acceptline(ipoque_struct); } #endif } /* search for line startin with "Icy-MetaData" */ #ifdef IPOQUE_PROTOCOL_MPEG for (a = 0; a < packet->parsed_lines; a++) { if (packet->line[a].len > 11 && memcmp(packet->line[a].ptr, "Icy-MetaData", 12) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MPEG, ipoque_struct, IPQ_LOG_DEBUG, "MPEG: Icy-MetaData found.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MPEG); return; } } #ifdef IPOQUE_PROTOCOL_AVI #endif #endif } static void check_http_payload(struct ipoque_detection_module_struct *ipoque_struct) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "called check_http_payload.\n"); #ifdef IPOQUE_PROTOCOL_FLASH if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_FLASH) != 0) flash_check_http_payload(ipoque_struct); #endif #ifdef IPOQUE_PROTOCOL_AVI if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, IPOQUE_PROTOCOL_AVI) != 0) avi_check_http_payload(ipoque_struct); #endif #ifdef NTOP_PROTOCOL_TEAMVIEWER teamviewer_check_http_payload(ipoque_struct); #endif } /** * this functions checks whether the packet begins with a valid http request * @param ipoque_struct * @returnvalue 0 if no valid request has been found * @returnvalue >0 indicates start of filename but not necessarily in packet limit */ static u16 http_request_url_offset(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; /* FIRST PAYLOAD PACKET FROM CLIENT */ /* check if the packet starts with POST or GET */ if (packet->payload_packet_len >= 4 && memcmp(packet->payload, "GET ", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: GET FOUND\n"); return 4; } else if (packet->payload_packet_len >= 5 && memcmp(packet->payload, "POST ", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: POST FOUND\n"); return 5; } else if (packet->payload_packet_len >= 8 && memcmp(packet->payload, "OPTIONS ", 8) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: OPTIONS FOUND\n"); return 8; } else if (packet->payload_packet_len >= 5 && memcmp(packet->payload, "HEAD ", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: HEAD FOUND\n"); return 5; } else if (packet->payload_packet_len >= 4 && memcmp(packet->payload, "PUT ", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: PUT FOUND\n"); return 4; } else if (packet->payload_packet_len >= 7 && memcmp(packet->payload, "DELETE ", 7) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: DELETE FOUND\n"); return 7; } else if (packet->payload_packet_len >= 8 && memcmp(packet->payload, "CONNECT ", 8) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: CONNECT FOUND\n"); return 8; } else if (packet->payload_packet_len >= 9 && memcmp(packet->payload, "PROPFIND ", 9) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: PROFIND FOUND\n"); return 9; } else if (packet->payload_packet_len >= 7 && memcmp(packet->payload, "REPORT ", 7) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: REPORT FOUND\n"); return 7; } return 0; } static void http_bitmask_exclude(struct ipoque_flow_struct *flow) { IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP); #ifdef NTOP_PROTOCOL_WINDOWS_UPDATE IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NTOP_PROTOCOL_WINDOWS_UPDATE); #endif #ifdef IPOQUE_PROTOCOL_MPEG IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MPEG); #endif #ifdef IPOQUE_PROTOCOL_QUICKTIME IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_QUICKTIME); #endif #ifdef IPOQUE_PROTOCOL_WINDOWSMEDIA IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_WINDOWSMEDIA); #endif #ifdef IPOQUE_PROTOCOL_REALMEDIA IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_REALMEDIA); #endif #ifdef IPOQUE_PROTOCOL_AVI IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_AVI); #endif #ifdef IPOQUE_PROTOCOL_OGG IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_OGG); #endif #ifdef IPOQUE_PROTOCOL_MOVE IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MOVE); #endif #ifdef IPOQUE_PROTOCOL_OFF IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_OFF); #endif #ifdef IPOQUE_PROTOCOL_XBOX IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_XBOX); #endif } void ipoque_search_http_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u16 filename_start; IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "search http\n"); /* set client-server_direction */ if (flow->l4.tcp.http_setup_dir == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "initializes http to stage: 1 \n"); flow->l4.tcp.http_setup_dir = 1 + packet->packet_direction; } if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK (ipoque_struct->generic_http_packet_bitmask, packet->detected_protocol_stack[0]) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "protocol might be detected earlier as http jump to payload type detection\n"); goto http_parse_detection; } if (flow->l4.tcp.http_setup_dir == 1 + packet->packet_direction) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "http stage: 1\n"); if (flow->l4.tcp.http_wait_for_retransmission) { if (!packet->tcp_retransmission) { if (flow->packet_counter <= 5) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "still waiting for retransmission\n"); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "retransmission not found, exclude\n"); http_bitmask_exclude(flow); return; } } } if (flow->l4.tcp.http_stage == 0) { filename_start = http_request_url_offset(ipoque_struct); if (filename_start == 0) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "filename not found, exclude\n"); http_bitmask_exclude(flow); return; } // parse packet ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines <= 1) { /* parse one more packet .. */ IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "just one line, search next packet\n"); flow->l4.tcp.http_stage = 1; return; } // parsed_lines > 1 here if (packet->line[0].len >= (9 + filename_start) && memcmp(&packet->line[0].ptr[packet->line[0].len - 9], " HTTP/1.", 8) == 0) { packet->http_url_name.ptr = &packet->payload[filename_start]; packet->http_url_name.len = packet->line[0].len - (filename_start + 9); packet->http_method.ptr = packet->line[0].ptr; packet->http_method.len = filename_start - 1; IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "http structure detected, adding\n"); ipoque_int_http_add_connection(ipoque_struct, (filename_start == 8) ? NTOP_PROTOCOL_HTTP_CONNECT : IPOQUE_PROTOCOL_HTTP); check_content_type_and_change_protocol(ipoque_struct); /* HTTP found, look for host... */ if (packet->host_line.ptr != NULL) { /* aaahh, skip this direction and wait for a server reply here */ flow->l4.tcp.http_stage = 2; IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP START HOST found\n"); return; } IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP START HOST found\n"); /* host not found, check in next packet after */ flow->l4.tcp.http_stage = 1; return; } } else if (flow->l4.tcp.http_stage == 1) { /* SECOND PAYLOAD TRAFFIC FROM CLIENT, FIRST PACKET MIGHT HAVE BEEN HTTP... */ /* UNKNOWN TRAFFIC, HERE FOR HTTP again.. */ // parse packet ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines <= 1) { /* wait some packets in case request is split over more than 2 packets */ if (flow->packet_counter < 5) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "line still not finished, search next packet\n"); return; } else { /* stop parsing here */ IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: PACKET DOES NOT HAVE A LINE STRUCTURE\n"); http_bitmask_exclude(flow); return; } } if (packet->line[0].len >= 9 && memcmp(&packet->line[0].ptr[packet->line[0].len - 9], " HTTP/1.", 8) == 0) { ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_HTTP); check_content_type_and_change_protocol(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP START HTTP found in 2. packet, check host here...\n"); /* HTTP found, look for host... */ flow->l4.tcp.http_stage = 2; return; } } } IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP: REQUEST NOT HTTP CONFORM\n"); http_bitmask_exclude(flow); return; http_parse_detection: if (flow->l4.tcp.http_setup_dir == 1 + packet->packet_direction) { /* we have something like http here, so check for host and content type if possible */ if (flow->l4.tcp.http_stage == 0 || flow->l4.tcp.http_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP RUN MAYBE NEXT GET/POST...\n"); // parse packet ipq_parse_packet_line_info(ipoque_struct); /* check for url here */ filename_start = http_request_url_offset(ipoque_struct); if (filename_start != 0 && packet->parsed_lines > 1 && packet->line[0].len >= (9 + filename_start) && memcmp(&packet->line[0].ptr[packet->line[0].len - 9], " HTTP/1.", 8) == 0) { packet->http_url_name.ptr = &packet->payload[filename_start]; packet->http_url_name.len = packet->line[0].len - (filename_start + 9); packet->http_method.ptr = packet->line[0].ptr; packet->http_method.len = filename_start - 1; IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "next http action, " "resetting to http and search for other protocols later.\n"); ipoque_int_http_add_connection(ipoque_struct, IPOQUE_PROTOCOL_HTTP); } check_content_type_and_change_protocol(ipoque_struct); /* HTTP found, look for host... */ if (packet->host_line.ptr != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP RUN MAYBE NEXT HOST found, skipping all packets from this direction\n"); /* aaahh, skip this direction and wait for a server reply here */ flow->l4.tcp.http_stage = 2; return; } IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP RUN MAYBE NEXT HOST NOT found, scanning one more packet from this direction\n"); flow->l4.tcp.http_stage = 1; } else if (flow->l4.tcp.http_stage == 1) { // parse packet and maybe find a packet info with host ptr,... ipq_parse_packet_line_info(ipoque_struct); check_content_type_and_change_protocol(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP RUN second packet scanned\n"); /* HTTP found, look for host... */ flow->l4.tcp.http_stage = 2; } IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP skipping client packets after second packet\n"); return; } /* server response */ if (flow->l4.tcp.http_stage > 0) { /* first packet from server direction, might have a content line */ ipq_parse_packet_line_info(ipoque_struct); check_content_type_and_change_protocol(ipoque_struct); if (packet->empty_line_position_set != 0 || flow->l4.tcp.http_empty_line_seen == 1) { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "empty line. check_http_payload.\n"); check_http_payload(ipoque_struct); } if (flow->l4.tcp.http_stage == 2) { flow->l4.tcp.http_stage = 3; } else { flow->l4.tcp.http_stage = 0; } IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP response first or second packet scanned,new stage is: %u\n", flow->l4.tcp.http_stage); return; } else { IPQ_LOG(IPOQUE_PROTOCOL_HTTP, ipoque_struct, IPQ_LOG_DEBUG, "HTTP response next packet skipped\n"); } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/thunder.c0000644000000000000000000001770411661524573020206 0ustar rootroot/* * thunder.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_THUNDER static void ipoque_int_thunder_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_THUNDER, protocol_type); if (src != NULL) { src->thunder_ts = packet->tick_timestamp; } if (dst != NULL) { dst->thunder_ts = packet->tick_timestamp; } } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_int_search_thunder_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 8 && packet->payload[0] >= 0x30 && packet->payload[0] < 0x40 && packet->payload[1] == 0 && packet->payload[2] == 0 && packet->payload[3] == 0) { if (flow->thunder_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "THUNDER udp detected\n"); ipoque_int_thunder_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } flow->thunder_stage++; IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "maybe thunder udp packet detected, stage increased to %u\n", flow->thunder_stage); return; } IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "excluding thunder udp at stage %u\n", flow->thunder_stage); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_THUNDER); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_int_search_thunder_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 8 && packet->payload[0] >= 0x30 && packet->payload[0] < 0x40 && packet->payload[1] == 0 && packet->payload[2] == 0 && packet->payload[3] == 0) { if (flow->thunder_stage == 3) { IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "THUNDER tcp detected\n"); ipoque_int_thunder_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } flow->thunder_stage++; IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "maybe thunder tcp packet detected, stage increased to %u\n", flow->thunder_stage); return; } if (flow->thunder_stage == 0 && packet->payload_packet_len > 17 && ipq_mem_cmp(packet->payload, "POST / HTTP/1.1\r\n", 17) == 0) { ipq_parse_packet_line_info(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "maybe thunder http POST packet detected, parsed packet lines: %u, empty line set %u (at: %u)\n", packet->parsed_lines, packet->empty_line_position_set, packet->empty_line_position); if (packet->empty_line_position_set != 0 && packet->content_line.ptr != NULL && packet->content_line.len == 24 && ipq_mem_cmp(packet->content_line.ptr, "application/octet-stream", 24) == 0 && packet->empty_line_position_set < (packet->payload_packet_len - 8) && packet->payload[packet->empty_line_position + 2] >= 0x30 && packet->payload[packet->empty_line_position + 2] < 0x40 && packet->payload[packet->empty_line_position + 3] == 0x00 && packet->payload[packet->empty_line_position + 4] == 0x00 && packet->payload[packet->empty_line_position + 5] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "maybe thunder http POST packet application does match\n"); ipoque_int_thunder_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "excluding thunder tcp at stage %u\n", flow->thunder_stage); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_THUNDER); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_int_search_thunder_http(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_THUNDER) { if (src != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->thunder_ts) < ipoque_struct->thunder_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "thunder : save src connection packet detected\n"); src->thunder_ts = packet->tick_timestamp; } else if (dst != NULL && ((IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->thunder_ts) < ipoque_struct->thunder_timeout)) { IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "thunder : save dst connection packet detected\n"); dst->thunder_ts = packet->tick_timestamp; } return; } if (packet->payload_packet_len > 5 && memcmp(packet->payload, "GET /", 5) == 0 && IPQ_SRC_OR_DST_HAS_PROTOCOL(src, dst, IPOQUE_PROTOCOL_THUNDER)) { IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "HTTP packet detected.\n"); ipq_parse_packet_line_info(ipoque_struct); if (packet->parsed_lines > 7 && packet->parsed_lines < 11 && packet->line[1].len > 10 && ipq_mem_cmp(packet->line[1].ptr, "Accept: */*", 11) == 0 && packet->line[2].len > 22 && ipq_mem_cmp(packet->line[2].ptr, "Cache-Control: no-cache", 23) == 0 && packet->line[3].len > 16 && ipq_mem_cmp(packet->line[3].ptr, "Connection: close", 17) == 0 && packet->line[4].len > 6 && ipq_mem_cmp(packet->line[4].ptr, "Host: ", 6) == 0 && packet->line[5].len > 15 && ipq_mem_cmp(packet->line[5].ptr, "Pragma: no-cache", 16) == 0 && packet->user_agent_line.ptr != NULL && packet->user_agent_line.len > 49 && ipq_mem_cmp(packet->user_agent_line.ptr, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)", 50) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_THUNDER, ipoque_struct, IPQ_LOG_DEBUG, "Thunder HTTP download detected, adding flow.\n"); ipoque_int_thunder_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } } } void ipoque_search_thunder(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; //struct ipoque_flow_struct *flow = ipoque_struct->flow; //struct ipoque_id_struct *src = ipoque_struct->src; //struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->tcp != NULL) { ipoque_int_search_thunder_http(ipoque_struct); ipoque_int_search_thunder_tcp(ipoque_struct); } else if (packet->udp != NULL) { ipoque_int_search_thunder_udp(ipoque_struct); } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/netflow.c0000644000000000000000000000364511666771321020212 0ustar rootroot/* * netflow.c * Copyright (C) 2011 by ntop.org * * This module is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License. * If not, see . * */ #include "ipq_utils.h" #ifdef NTOP_PROTOCOL_NETFLOW static void ntop_check_netflow(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; const u8 *packet_payload = packet->payload; u32 payload_len = packet->payload_packet_len; if((ipoque_struct->packet.udp != NULL) && (payload_len >= 24) && (packet->payload[0] == 0) && ((packet->payload[1] == 5) || (packet->payload[1] == 9) || (packet->payload[1] == 10 /* IPFIX */)) && (packet->payload[3] <= 48 /* Flow count */)) { u_int32_t when, *_when; _when = (u_int32_t*)&packet->payload[8]; /* Sysuptime */ when = ntohl(*_when); if((when >= 946684800 /* 1/1/2000 */) && (when <= time(NULL))) { IPQ_LOG(NTOP_PROTOCOL_NETFLOW, ipoque_struct, IPQ_LOG_DEBUG, "Found netflow.\n"); ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_NETFLOW, IPOQUE_REAL_PROTOCOL); return; } } } void ntop_search_netflow(struct ipoque_detection_module_struct *ipoque_struct) { IPQ_LOG(NTOP_PROTOCOL_NETFLOW, ipoque_struct, IPQ_LOG_DEBUG, "netflow detection...\n"); ntop_check_netflow(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/teamviewer.c0000644000000000000000000000544012000644431020657 0ustar rootroot/* * teamviewer.c * Copyright (C) 2012 by Gianluca Costa xplico.org * * This module is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This module is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License. * If not, see . * */ #include "ipq_protocols.h" #ifdef NTOP_PROTOCOL_TEAMVIEWER static void ntop_int_teamview_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, NTOP_PROTOCOL_TEAMVIEWER, IPOQUE_REAL_PROTOCOL); } void ntop_search_teamview(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; if (ipoque_struct->packet.udp != NULL) { if (packet->payload_packet_len > 13) { if (packet->payload[0] == 0x00 && packet->payload[11] == 0x17 && packet->payload[12] == 0x24) { /* byte 0 is a counter/seq number, and at the start is 0 */ flow->l4.udp.teamviewer_stage++; if (flow->l4.udp.teamviewer_stage == 4 || packet->udp->dest == ntohs(5938) || packet->udp->source == ntohs(5938)) { ntop_int_teamview_add_connection(ipoque_struct); } return; } } } else if(ipoque_struct->packet.tcp != NULL) { if (packet->payload_packet_len > 2) { if (packet->payload[0] == 0x17 && packet->payload[1] == 0x24) { flow->l4.udp.teamviewer_stage++; if (flow->l4.udp.teamviewer_stage == 4 || packet->tcp->dest == ntohs(5938) || packet->tcp->source == ntohs(5938)) { ntop_int_teamview_add_connection(ipoque_struct); } return; } else if (flow->l4.udp.teamviewer_stage) { if (packet->payload[0] == 0x11 && packet->payload[1] == 0x30) { flow->l4.udp.teamviewer_stage++; if (flow->l4.udp.teamviewer_stage == 4) ntop_int_teamview_add_connection(ipoque_struct); } return; } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NTOP_PROTOCOL_TEAMVIEWER); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/msn.c0000644000000000000000000005372511655273464017340 0ustar rootroot/* * msn.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_MSN #define MAX_PACKETS_FOR_MSN 100 static void ipoque_int_msn_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MSN, protocol_type); } static u8 ipoque_int_find_xmsn(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; if (packet->parsed_lines > 3) { u16 i; for (i = 2; i < packet->parsed_lines; i++) { if (packet->line[i].ptr != NULL && packet->line[i].len > IPQ_STATICSTRING_LEN("X-MSN") && memcmp(packet->line[i].ptr, "X-MSN", IPQ_STATICSTRING_LEN("X-MSN")) == 0) { return 1; } } } return 0; } static void ipoque_search_msn_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; u16 plen; u16 status = 0; IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "search msn tcp.\n"); #ifdef IPOQUE_PROTOCOL_SSL if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SSL) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "msn ssl ft test\n"); if (flow->packet_counter < 10) { } if (flow->packet_counter == 7 && packet->payload_packet_len > 300) { if (memcmp(packet->payload + 24, "MSNSLP", 6) == 0 || (get_u32(packet->payload, 0) == htonl(0x30000000) && get_u32(packet->payload, 4) == 0x00000000)) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "detected MSN File Transfer, ifdef ssl.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } if (flow->packet_counter >= 5 && flow->packet_counter <= 10 && (get_u32(packet->payload, 0) == htonl(0x18000000) && get_u32(packet->payload, 4) == 0x00000000)) { flow->l4.tcp.msn_ssl_ft++; IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "increased msn ft ssl stage to: %u at packet nr: %u\n", flow->l4.tcp.msn_ssl_ft, flow->packet_counter); if (flow->l4.tcp.msn_ssl_ft == 2) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "detected MSN File Transfer, ifdef ssl 2.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); } return; } } #endif /* we detect the initial connection only ! */ /* match: "VER " ..... "CVR" x 0x0d 0x0a * len should be small, lets say less than 100 bytes * x is now "0", but can be increased */ /* now we have a look at the first packet only. */ if (flow->packet_counter == 1 #ifdef IPOQUE_PROTOCOL_SSL || ((packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SSL) && flow->packet_counter <= 3) #endif ) { /* this part is working asymmetrically */ if (packet->payload_packet_len > 32 && (packet->payload[0] == 0x02 || packet->payload[0] == 0x00) && (ntohl(get_u32(packet->payload, 8)) == 0x2112a442 || ntohl(get_u32(packet->payload, 4)) == 0x2112a442) && ((ntohl(get_u32(packet->payload, 24)) == 0x000f0004 && ntohl(get_u32(packet->payload, 28)) == 0x72c64bc6) || (ntohl(get_u32(packet->payload, 20)) == 0x000f0004 && ntohl(get_u32(packet->payload, 24)) == 0x72c64bc6))) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found MSN in packets that also contain voice.messenger.live.com.\n"); /* TODO this is an alternative pattern for video detection */ /* if (packet->payload_packet_len > 100 && get_u16(packet->payload, 86) == htons(0x05dc)) { */ if (packet->payload_packet_len > 101 && packet->payload[101] == 0x02) { ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } else { ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); } return; } /* this case works asymmetrically */ if (packet->payload_packet_len > 10 && packet->payload_packet_len < 100) { if (get_u8(packet->payload, packet->payload_packet_len - 2) == 0x0d && get_u8(packet->payload, packet->payload_packet_len - 1) == 0x0a) { /* The MSNP string is used in XBOX clients. */ if (memcmp(packet->payload, "VER ", 4) == 0) { if (memcmp(&packet->payload[packet->payload_packet_len - 6], "CVR", 3) == 0 || memcmp(&packet->payload[packet->payload_packet_len - 8], "MSNP", 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found MSN by pattern VER...CVR/MSNP ODOA.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (memcmp(&packet->payload[4], "MSNFT", 5) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found MSN FT by pattern VER MSNFT...0d0a.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } } if ( #ifdef IPOQUE_PROTOCOL_HTTP packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP || #endif memcmp(packet->payload, "GET ", IPQ_STATICSTRING_LEN("GET ")) == 0 || memcmp(packet->payload, "POST ", IPQ_STATICSTRING_LEN("POST ")) == 0) { ipq_parse_packet_line_info(ipoque_struct); if (packet->user_agent_line.ptr != NULL && packet->user_agent_line.len > IPQ_STATICSTRING_LEN("Messenger/") && memcmp(packet->user_agent_line.ptr, "Messenger/", IPQ_STATICSTRING_LEN("Messenger/")) == 0) { ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } #ifdef IPOQUE_PROTOCOL_HTTP /* we have to examine two http packets */ if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP) { } #endif /* not seen this pattern in any trace */ /* now test for http login, at least 100 a bytes packet */ if (packet->payload_packet_len > 100) { if ( #ifdef IPOQUE_PROTOCOL_HTTP packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP || #endif memcmp(packet->payload, "POST http://", 12) == 0) { /* scan packet if not already done... */ ipq_parse_packet_line_info(ipoque_struct); if (packet->content_line.ptr != NULL && ((packet->content_line.len == IPQ_STATICSTRING_LEN("application/x-msn-messenger") && memcmp(packet->content_line.ptr, "application/x-msn-messenger", IPQ_STATICSTRING_LEN("application/x-msn-messenger")) == 0) || (packet->content_line.len >= IPQ_STATICSTRING_LEN("text/x-msnmsgr") && memcmp(packet->content_line.ptr, "text/x-msnmsgr", IPQ_STATICSTRING_LEN("text/x-msnmsgr")) == 0))) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found MSN by pattern POST http:// .... application/x-msn-messenger.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } /* now test for http login that uses a gateway, at least 400 a bytes packet */ /* for this case the asymmetric detection is asym (1) */ if (packet->payload_packet_len > 400) { if (( #ifdef IPOQUE_PROTOCOL_HTTP packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP || #endif (memcmp(packet->payload, "POST ", 5) == 0))) { u16 c; if (memcmp(&packet->payload[5], "http://", 7) == 0) { /* * We are searching for a paten "POST http://gateway.messenger.hotmail.com/gateway/gateway.dll" or * "POST http:///gateway/gateway.dll" * POST http:// is 12 byte so we are searching for 13 to 70 byte for this paten. */ for (c = 13; c < 50; c++) { if (memcmp(&packet->payload[c], "/", 1) == 0) { if (memcmp(&packet->payload[c], "/gateway/gateway.dll", 20) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found pattern http://.../gateway/gateway.ddl.\n"); status = 1; break; } } } } else if ((memcmp(&packet->payload[5], "/gateway/gateway.dll", 20) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found pattern http://.../gateway/gateway.ddl.\n"); status = 1; } } if (status) { u16 a; ipq_parse_packet_line_info(ipoque_struct); if (packet->content_line.ptr != NULL && ((packet->content_line.len == 23 && memcmp(packet->content_line.ptr, "text/xml; charset=utf-8", 23) == 0) || (packet->content_line.len == 24 && memcmp(packet->content_line.ptr, "text/html; charset=utf-8", 24) == 0) || (packet->content_line.len == 33 && memcmp(packet->content_line.ptr, "application/x-www-form-urlencoded", 33) == 0) )) { if ((src != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_MSN) != 0) || (dst != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_MSN) != 0)) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found MSN with pattern text/xml; charset=utf-8.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } for (a = 0; a < packet->parsed_lines; a++) { if (packet->line[a].len >= 4 && (memcmp(packet->line[a].ptr, "CVR ", 4) == 0 || memcmp(packet->line[a].ptr, "VER ", 4) == 0 || memcmp(packet->line[a].ptr, "ANS ", 4) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found MSN with pattern text/sml; charset0utf-8.\n"); IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "MSN xml CVS / VER / ANS found\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } } } /* asym (1) ; possibly occurs in symmetric cases also. */ if (flow->packet_counter <= 10 && (flow->packet_direction_counter[0] <= 2 || flow->packet_direction_counter[1] <= 2) && packet->payload_packet_len > 100) { /* not necessary to check the length, because this has been done : >400. */ if ( #ifdef IPOQUE_PROTOCOL_HTTP packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP || #endif (memcmp(packet->payload, "HTTP/1.0 200 OK", 15) == 0) || (memcmp(packet->payload, "HTTP/1.1 200 OK", 15) == 0) ) { ipq_parse_packet_line_info(ipoque_struct); if (packet->content_line.ptr != NULL && ((packet->content_line.len == IPQ_STATICSTRING_LEN("application/x-msn-messenger") && memcmp(packet->content_line.ptr, "application/x-msn-messenger", IPQ_STATICSTRING_LEN("application/x-msn-messenger")) == 0) || (packet->content_line.len >= IPQ_STATICSTRING_LEN("text/x-msnmsgr") && memcmp(packet->content_line.ptr, "text/x-msnmsgr", IPQ_STATICSTRING_LEN("text/x-msnmsgr")) == 0))) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "HTTP/1.0 200 OK .... application/x-msn-messenger.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (ipoque_int_find_xmsn(ipoque_struct) == 1) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "HTTP/1.0 200 OK .... X-MSN.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } /* did not find any trace with this pattern !!!!! */ /* now block proxy connection */ if (packet->payload_packet_len >= 42) { if (memcmp(packet->payload, "CONNECT messenger.hotmail.com:1863 HTTP/1.", 42) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found MSN with pattern CONNECT messenger.hotmail.com:1863 HTTP/1..\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } if (packet->payload_packet_len >= 18) { if (memcmp(packet->payload, "USR ", 4) == 0 || memcmp(packet->payload, "ANS ", 4) == 0) { /* now we must see a number */ const u16 endlen = packet->payload_packet_len - 12; plen = 4; while (1) { if (packet->payload[plen] == ' ') { break; } if (packet->payload[plen] < '0' || packet->payload[plen] > '9') { goto ipq_msn_exclude; } plen++; if (plen >= endlen) { goto ipq_msn_exclude; } } while (plen < endlen) { if (ipoque_check_for_email_address(ipoque_struct, plen) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found mail address\n"); break; } if (packet->payload_packet_len > plen + 1 && (packet->payload[plen] < 20 || packet->payload[plen] > 128)) { goto ipq_msn_exclude; } plen++; if (plen >= endlen) { goto ipq_msn_exclude; } } IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "found MSN with pattern USR/ANS ...mail_address.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } /* finished examining the first packet only. */ /* asym (1) ; possibly occurs in symmetric cases also. */ if (flow->packet_counter <= 10 && (flow->packet_direction_counter[0] <= 2 || flow->packet_direction_counter[1] <= 2) && packet->payload_packet_len > 100) { /* not necessary to check the length, because this has been done : >400. */ if ( #ifdef IPOQUE_PROTOCOL_HTTP packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP || #endif (memcmp(packet->payload, "HTTP/1.0 200 OK", 15) == 0) || (memcmp(packet->payload, "HTTP/1.1 200 OK", 15) == 0) ) { ipq_parse_packet_line_info(ipoque_struct); if (packet->content_line.ptr != NULL && ((packet->content_line.len == IPQ_STATICSTRING_LEN("application/x-msn-messenger") && memcmp(packet->content_line.ptr, "application/x-msn-messenger", IPQ_STATICSTRING_LEN("application/x-msn-messenger")) == 0) || (packet->content_line.len >= IPQ_STATICSTRING_LEN("text/x-msnmsgr") && memcmp(packet->content_line.ptr, "text/x-msnmsgr", IPQ_STATICSTRING_LEN("text/x-msnmsgr")) == 0))) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "HTTP/1.0 200 OK .... application/x-msn-messenger.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } if (ipoque_int_find_xmsn(ipoque_struct) == 1) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "HTTP/1.0 200 OK .... X-MSN.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } /* finished examining the secone packet only */ /* direct user connection (file transfer,...) */ if ((src != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_MSN) != 0) || (dst != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_MSN) != 0)) { if (flow->packet_counter == 1 && packet->payload_packet_len > 12 && memcmp(packet->payload, "recipientid=", 12) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "detected file transfer.\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } /* MSN File Transfer of MSN 8.1 and 8.5 * first packet with length 4 and pattern 0x04000000 * second packet (in the same direction), with length 56 and pattern 0x00000000 from payload[16] * third packet (in the opposite direction to 1 & 2), with length 4 and pattern 0x30000000 */ if (flow->l4.tcp.msn_stage == 0) { /* asymmetric detection to this pattern is asym (2) */ if ((packet->payload_packet_len == 4 || packet->payload_packet_len == 8) && get_u32(packet->payload, 0) == htonl(0x04000000)) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "maybe first TCP MSN detected\n"); if (packet->payload_packet_len == 8 && get_u32(packet->payload, 4) == htonl(0x666f6f00)) { flow->l4.tcp.msn_stage = 5 + packet->packet_direction; return; } flow->l4.tcp.msn_stage = 1 + packet->packet_direction; return; } /* asymmetric detection to this pattern is asym (2) */ } else if (flow->l4.tcp.msn_stage == 1 + packet->packet_direction) { if (packet->payload_packet_len > 10 && get_u32(packet->payload, 0) == htonl(0x666f6f00)) { ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "MSN File Transfer detected 1\n"); return; } /* did not see this pattern in any trace */ if (packet->payload_packet_len == 56 && get_u32(packet->payload, 16) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "maybe Second TCP MSN detected\n"); flow->l4.tcp.msn_stage = 3 + packet->packet_direction; return; } } else if (flow->l4.tcp.msn_stage == 2 - packet->packet_direction && packet->payload_packet_len == 4 && get_u32(packet->payload, 0) == htonl(0x30000000)) { ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "MSN File Transfer detected 2\n"); return; } else if ((flow->l4.tcp.msn_stage == 3 + packet->packet_direction) || (flow->l4.tcp.msn_stage == 4 - packet->packet_direction)) { if (packet->payload_packet_len == 4 && get_u32(packet->payload, 0) == htonl(0x30000000)) { ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "MSN File Transfer detected 2\n"); return; } } else if (flow->l4.tcp.msn_stage == 6 - packet->packet_direction) { if ((packet->payload_packet_len == 4) && (get_u32(packet->payload, 0) == htonl(0x10000000) || get_u32(packet->payload, 0) == htonl(0x30000000))) { ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "MSN File Transfer detected 3\n"); return; } } else if (flow->l4.tcp.msn_stage == 5 + packet->packet_direction) { if ((packet->payload_packet_len == 20) && get_u32(packet->payload, 0) == htonl(0x10000000)) { ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "MSN File Transfer detected 3\n"); return; } } IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "msn 7.\n"); if (flow->packet_counter <= MAX_PACKETS_FOR_MSN) { if (packet->tcp->source == htons(443) || packet->tcp->dest == htons(443)) { if (packet->payload_packet_len > 300) { if (memcmp(&packet->payload[40], "INVITE MSNMSGR", 14) == 0 || memcmp(&packet->payload[56], "INVITE MSNMSGR", 14) == 0 || memcmp(&packet->payload[172], "INVITE MSNMSGR", 14) == 0) { ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "MSN File Transfer detected 3\n"); return; } } return; } /* For no n port 443 flows exclude flow bitmask after first packet itself */ } IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "exclude msn.\n"); ipq_msn_exclude: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MSN); } static void ipoque_search_udp_msn_misc(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; /* do we have an msn login ? */ if ((src == NULL || IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_MSN) == 0) && (dst == NULL || IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_MSN) == 0)) { IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MSN); return; } /* asymmetric ft detection works */ if (packet->payload_packet_len == 20 && get_u32(packet->payload, 4) == 0 && packet->payload[9] == 0 && get_u16(packet->payload, 10) == htons(0x0100)) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_TRACE, "msn udp misc data connection detected\n"); ipoque_int_msn_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); } /* asymmetric detection working. */ return; //} } void ipoque_search_msn(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; /* this if request should always be true */ if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MSN) == 0) { /* we deal with tcp now */ if (packet->tcp != NULL) { /* msn can use http or ssl for connection. That's why every http, ssl and ukn packet must enter in the msn detection */ /* the detection can swich out the http or the ssl detection. In this case we need not check those protocols */ // need to do the ceck when protocol == http too (POST /gateway ...) if (packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN #if defined(IPOQUE_PROTOCOL_HTTP) || packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_HTTP #endif #if defined(IPOQUE_PROTOCOL_SSL) || packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_SSL #endif #if defined(IPOQUE_PROTOCOL_STUN) || packet->detected_protocol_stack[0] == IPOQUE_PROTOCOL_STUN #endif ) { ipoque_search_msn_tcp(ipoque_struct); } } else if (packet->udp != NULL) { ipoque_search_udp_msn_misc(ipoque_struct); } } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/tvants.c0000644000000000000000000000567411655273464020062 0ustar rootroot/* * tvants.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_TVANTS static void ipoque_int_tvants_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_TVANTS, IPOQUE_REAL_PROTOCOL); } void ipoque_search_tvants_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_TVANTS, ipoque_struct, IPQ_LOG_DEBUG, "search tvants. \n"); if (packet->udp != NULL && packet->payload_packet_len > 57 && packet->payload[0] == 0x04 && packet->payload[1] == 0x00 && (packet->payload[2] == 0x05 || packet->payload[2] == 0x06 || packet->payload[2] == 0x07) && packet->payload[3] == 0x00 && packet->payload_packet_len == (packet->payload[5] << 8) + packet->payload[4] && packet->payload[6] == 0x00 && packet->payload[7] == 0x00 && (memcmp(&packet->payload[48], "TVANTS", 6) == 0 || memcmp(&packet->payload[49], "TVANTS", 6) == 0 || memcmp(&packet->payload[51], "TVANTS", 6) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_TVANTS, ipoque_struct, IPQ_LOG_DEBUG, "found tvants over udp. \n"); ipoque_int_tvants_add_connection(ipoque_struct); } else if (packet->tcp != NULL && packet->payload_packet_len > 15 && packet->payload[0] == 0x04 && packet->payload[1] == 0x00 && packet->payload[2] == 0x07 && packet->payload[3] == 0x00 && packet->payload_packet_len == (packet->payload[5] << 8) + packet->payload[4] && packet->payload[6] == 0x00 && packet->payload[7] == 0x00 && memcmp(&packet->payload[8], "TVANTS", 6) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_TVANTS, ipoque_struct, IPQ_LOG_DEBUG, "found tvants over tcp. \n"); ipoque_int_tvants_add_connection(ipoque_struct); } IPQ_LOG(IPOQUE_PROTOCOL_TVANTS, ipoque_struct, IPQ_LOG_DEBUG, "exclude tvants. \n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_TVANTS); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/world_of_warcraft.c0000644000000000000000000002133511661524573022234 0ustar rootroot/* * world_of_warcraft.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_WORLDOFWARCRAFT static void ipoque_int_worldofwarcraft_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WORLDOFWARCRAFT, protocol_type); } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u8 ipoque_int_is_wow_port(const u16 port) { if (port == htons(3724) || port == htons(6112) || port == htons(6113) || port == htons(6114) || port == htons(4000) || port == htons(1119)) { return 1; } return 0; } void ipoque_search_worldofwarcraft(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "Search World of Warcraft.\n"); if (packet->tcp != NULL) { if ((packet->payload_packet_len > IPQ_STATICSTRING_LEN("POST /") && memcmp(packet->payload, "POST /", IPQ_STATICSTRING_LEN("POST /")) == 0) || (packet->payload_packet_len > IPQ_STATICSTRING_LEN("GET /") && memcmp(packet->payload, "GET /", IPQ_STATICSTRING_LEN("GET /")) == 0)) { ipq_parse_packet_line_info(ipoque_struct); if (packet->user_agent_line.ptr != NULL && packet->user_agent_line.len == IPQ_STATICSTRING_LEN("Blizzard Web Client") && memcmp(packet->user_agent_line.ptr, "Blizzard Web Client", IPQ_STATICSTRING_LEN("Blizzard Web Client")) == 0) { ipoque_int_worldofwarcraft_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "World of Warcraft: Web Client found\n"); return; } } if (packet->payload_packet_len > IPQ_STATICSTRING_LEN("GET /") && memcmp(packet->payload, "GET /", IPQ_STATICSTRING_LEN("GET /")) == 0) { ipq_parse_packet_line_info(ipoque_struct); if (packet->user_agent_line.ptr != NULL && packet->host_line.ptr != NULL && packet->user_agent_line.len > IPQ_STATICSTRING_LEN("Blizzard Downloader") && packet->host_line.len > IPQ_STATICSTRING_LEN("worldofwarcraft.com") && memcmp(packet->user_agent_line.ptr, "Blizzard Downloader", IPQ_STATICSTRING_LEN("Blizzard Downloader")) == 0 && memcmp(&packet->host_line.ptr[packet->host_line.len - IPQ_STATICSTRING_LEN("worldofwarcraft.com")], "worldofwarcraft.com", IPQ_STATICSTRING_LEN("worldofwarcraft.com")) == 0) { ipoque_int_worldofwarcraft_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "World of Warcraft: Web Client found\n"); return; } } if (packet->payload_packet_len == 50 && memcmp(&packet->payload[2], "WORLD OF WARCRAFT CONNECTION", IPQ_STATICSTRING_LEN("WORLD OF WARCRAFT CONNECTION")) == 0) { ipoque_int_worldofwarcraft_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "World of Warcraft: Login found\n"); return; } if (packet->tcp->dest == htons(3724) && packet->payload_packet_len < 70 && packet->payload_packet_len > 40 && (memcmp(&packet->payload[4], "WoW", 3) == 0 || memcmp(&packet->payload[5], "WoW", 3) == 0)) { ipoque_int_worldofwarcraft_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "World of Warcraft: Login found\n"); return; } if (IPQ_SRC_OR_DST_HAS_PROTOCOL(src, dst, IPOQUE_PROTOCOL_WORLDOFWARCRAFT) != 0) { if (packet->tcp->source == htons(3724) && packet->payload_packet_len == 8 && get_u32(packet->payload, 0) == htonl(0x0006ec01)) { ipoque_int_worldofwarcraft_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "World of Warcraft: connection detected\n"); return; } } /* for some well known WoW ports check another pattern */ if (flow->l4.tcp.wow_stage == 0) { if (ipoque_int_is_wow_port(packet->tcp->source) && packet->payload_packet_len >= 14 && ntohs(get_u16(packet->payload, 0)) == (packet->payload_packet_len - 2)) { if (get_u32(packet->payload, 2) == htonl(0xec010100)) { IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "probably World of Warcraft, waiting for final packet\n"); flow->l4.tcp.wow_stage = 2; return; } else if (packet->payload_packet_len == 41 && (get_u16(packet->payload, 2) == htons(0x0085) || get_u16(packet->payload, 2) == htons(0x0034) || get_u16(packet->payload, 2) == htons(0x1960))) { IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "maybe World of Warcraft, need next\n"); flow->l4.tcp.wow_stage = 1; return; } } } if (flow->l4.tcp.wow_stage == 1) { if (packet->payload_packet_len == 325 && ntohs(get_u16(packet->payload, 0)) == (packet->payload_packet_len - 2) && get_u16(packet->payload, 4) == 0 && (get_u16(packet->payload, packet->payload_packet_len - 3) == htons(0x2331) || get_u16(packet->payload, 67) == htons(0x2331)) && (memcmp (&packet->payload[packet->payload_packet_len - 18], "\x94\xec\xff\xfd\x67\x62\xd4\x67\xfb\xf9\xdd\xbd\xfd\x01\xc0\x8f\xf9\x81", 18) == 0 || memcmp(&packet->payload[packet->payload_packet_len - 30], "\x94\xec\xff\xfd\x67\x62\xd4\x67\xfb\xf9\xdd\xbd\xfd\x01\xc0\x8f\xf9\x81", 18) == 0)) { ipoque_int_worldofwarcraft_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "World of Warcraft: connection detected\n"); return; } if (packet->payload_packet_len > 32 && ntohs(get_u16(packet->payload, 0)) == (packet->payload_packet_len - 2)) { if (get_u16(packet->payload, 4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "probably World of Warcraft, waiting for final packet\n"); flow->l4.tcp.wow_stage = 2; return; } else if (get_u32(packet->payload, 2) == htonl(0x12050000)) { IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "probably World of Warcraft, waiting for final packet\n"); flow->l4.tcp.wow_stage = 2; return; } } } if (flow->l4.tcp.wow_stage == 2) { if (packet->payload_packet_len == 4) { ipoque_int_worldofwarcraft_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "World of Warcraft: connection detected\n"); return; } else if (packet->payload_packet_len > 4 && packet->payload_packet_len <= 16 && packet->payload[4] == 0x0c) { ipoque_int_worldofwarcraft_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "World of Warcraft: connection detected\n"); return; } else if (flow->packet_counter < 3) { IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "waiting for final packet\n"); return; } } if (flow->l4.tcp.wow_stage == 0 && packet->tcp->dest == htons(1119)) { /* special log in port for battle.net/world of warcraft */ if (packet->payload_packet_len >= 77 && get_u32(packet->payload, 0) == htonl(0x40000aed) && get_u32(packet->payload, 4) == htonl(0xea070aed)) { ipoque_int_worldofwarcraft_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); IPQ_LOG(IPOQUE_PROTOCOL_WORLDOFWARCRAFT, ipoque_struct, IPQ_LOG_DEBUG, "World of Warcraft: connection detected\n"); return; } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_WORLDOFWARCRAFT); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/bgp.c0000644000000000000000000000401011655273464017272 0ustar rootroot/* * bgp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_BGP static void ipoque_int_bgp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_BGP, IPOQUE_REAL_PROTOCOL); } /* this detection also works asymmetrically */ void ipoque_search_bgp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 18 && get_u64(packet->payload, 0) == 0xffffffffffffffffULL && get_u64(packet->payload, 8) == 0xffffffffffffffffULL && ntohs(get_u16(packet->payload, 16)) <= packet->payload_packet_len && (packet->tcp->dest == htons(179) || packet->tcp->source == htons(179)) && packet->payload[18] < 5) { IPQ_LOG(IPOQUE_PROTOCOL_BGP, ipoque_struct, IPQ_LOG_DEBUG, "BGP detected.\n"); ipoque_int_bgp_add_connection(ipoque_struct); return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_BGP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/smb.c0000644000000000000000000000400611655273464017310 0ustar rootroot/* * smb.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_SMB static void ipoque_int_smb_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_SMB, IPOQUE_REAL_PROTOCOL); } void ipoque_search_smb_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_SMB, ipoque_struct, IPQ_LOG_DEBUG, "search SMB.\n"); if (packet->tcp->dest == htons(445) && packet->payload_packet_len > (32 + 4 + 4) && (packet->payload_packet_len - 4) == ntohl(get_u32(packet->payload, 0)) && get_u32(packet->payload, 4) == htonl(0xff534d42)) { IPQ_LOG(IPOQUE_PROTOCOL_SMB, ipoque_struct, IPQ_LOG_DEBUG, "found SMB.\n"); ipoque_int_smb_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_SMB, ipoque_struct, IPQ_LOG_DEBUG, "exclude SMB.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_SMB); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/pplive.c0000644000000000000000000005670511655273464020043 0ustar rootroot/* * pplive.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #include "ipq_utils.h" #ifdef IPOQUE_PROTOCOL_PPLIVE static void ipoque_int_pplive_add_connection(struct ipoque_detection_module_struct *ipoque_struct, ipoque_protocol_type_t protocol_type) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_PPLIVE, protocol_type); } void ipoque_search_pplive_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; u16 a; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "search pplive.\n"); if (packet->udp != NULL) { if (src != NULL && src->pplive_vod_cli_port == packet->udp->source && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_PPLIVE)) { if (src->pplive_last_packet_time_set == 1 && (IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->pplive_last_packet_time) < ipoque_struct->pplive_connection_timeout) { ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); src->pplive_last_packet_time_set = 1; src->pplive_last_packet_time = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "timestamp src.\n"); return; } else { src->pplive_vod_cli_port = 0; src->pplive_last_packet_time = 0; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: VOD port timer reset.\n"); } } if (dst != NULL && dst->pplive_vod_cli_port == packet->udp->dest && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_PPLIVE)) { if (dst->pplive_last_packet_time_set == 1 && (IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->pplive_last_packet_time) < ipoque_struct->pplive_connection_timeout) { ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); dst->pplive_last_packet_time_set = 1; dst->pplive_last_packet_time = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "timestamp dst.\n"); return; } else { dst->pplive_last_packet_time_set = 0; dst->pplive_vod_cli_port = 0; dst->pplive_last_packet_time = 0; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: VOD port timer reset.\n"); } } if ((packet->payload_packet_len >= 76) && ((packet->payload[0] == 0x01) || (packet->payload[0] == 0x18) || (packet->payload[0] == 0x05)) && (packet->payload[1] == 0x00) && get_l32(packet->payload, 12) == 0 && (packet->payload[16] == 0 || packet->payload[16] == 1) && (packet->payload[17] == 0) && (packet->payload[24] == 0xac)) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len > 50 && packet->payload[0] == 0xe9 && packet->payload[1] == 0x03 && (packet->payload[3] == 0x00 || packet->payload[3] == 0x01) && packet->payload[4] == 0x98 && packet->payload[5] == 0xab && packet->payload[6] == 0x01 && packet->payload[7] == 0x02) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len == 94 && packet->payload[8] == 0x00 && ((get_u32(packet->payload, 9) == ntohl(0x03010000)) || (get_u32(packet->payload, 9) == ntohl(0x02010000)) || (get_u32(packet->payload, 9) == ntohl(0x01010000))) && ((get_u32(packet->payload, 58) == ntohl(0xb1130000)) || ((packet->payload[60] == packet->payload[61]) && (packet->payload[78] == 0x00 || packet->payload[78] == 0x01) && (packet->payload[79] == 0x00 || packet->payload[79] == 0x01)) || ((get_u16(packet->payload, 58) == ntohs(0xb113)) && (packet->payload[78] == 0x00 || packet->payload[78] == 0x01) && (packet->payload[79] == 0x00 || packet->payload[79] == 0x01)))) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if ((packet->payload_packet_len >= 90 && packet->payload_packet_len <= 110) && (packet->payload[0] >= 0x0a && packet->payload[0] <= 0x0f) && get_u16(packet->payload, 86) == 0) { int i; for (i = 54; i < 68; i += 2) { if (((get_u32(packet->payload, i) == ntohl(0x4fde7e7f)) || (get_u32(packet->payload, i) == ntohl(0x7aa6090d))) && (get_u16(packet->payload, i + 4) == 0)) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive through " "bitpatterns either 4f de 7e 7f 00 00 or 7a a6 09 0d 00 00.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } if (flow->packet_counter < 5 && !flow->pplive_stage) { /* With in 1st 4 packets */ if (((packet->payload_packet_len >= 90 && packet->payload_packet_len <= 110) && (!get_u32(packet->payload, packet->payload_packet_len - 16) || !get_u32(packet->payload, packet->payload_packet_len - 4))) ) { flow->pplive_stage = 2; /* Now start looking for size(28 | 30) */ IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "Maybe found pplive packet. Now start looking for size(28 | 30).\n"); } if (68 == packet->payload_packet_len && get_l16(packet->payload, 0) == 0x21 && packet->payload[19] == packet->payload[20] && packet->payload[20] == packet->payload[21] && packet->payload[12] == packet->payload[13] && packet->payload[14] == packet->payload[15]) { flow->pplive_stage = 3 + packet->packet_direction; } IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "need next packet I.\n"); return; } if (flow->pplive_stage == 3 + packet->packet_direction) { /* Because we are expecting packet in reverese direction.. */ IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "need next packet II.\n"); return; } if (flow->pplive_stage == (4 - packet->packet_direction) && packet->payload_packet_len > 67 && (get_l16(packet->payload, 0) == 0x21 || (get_l16(packet->payload, 0) == 0x22 && !get_l16(packet->payload, 28)))) { if (dst != NULL) { dst->pplive_vod_cli_port = packet->udp->dest; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: VOD Port marked %u.\n", ntohs(packet->udp->dest)); dst->pplive_last_packet_time = packet->tick_timestamp; dst->pplive_last_packet_time_set = 1; } IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (flow->pplive_stage == 2) { if ((packet->payload_packet_len == 30 && (packet->payload[0] == 0x02 || packet->payload[0] == 0x03) && get_u32(packet->payload, 21) == ntohl(0x00000001)) || (packet->payload_packet_len == 28 && (packet->payload[0] == 0x01 || packet->payload[0] == 0x00) && (get_u32(packet->payload, 19) == ntohl(0x00000001)))) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (flow->packet_counter < 45) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "need next packet III.\n"); return; } } } else if (packet->tcp != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: TCP found, plen = %d, stage = %d, payload[0] = %x, payload[1] = %x, payload[2] = %x, payload[3] = %x \n", packet->payload_packet_len, flow->pplive_stage, packet->payload[0], packet->payload[1], packet->payload[2], packet->payload[3]); if (src != NULL && src->pplive_vod_cli_port == packet->tcp->source && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, IPOQUE_PROTOCOL_PPLIVE)) { if (src->pplive_last_packet_time_set == 1 && (IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - src->pplive_last_packet_time) < ipoque_struct->pplive_connection_timeout) { ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); src->pplive_last_packet_time_set = 1; src->pplive_last_packet_time = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "timestamp src.\n"); return; } else { src->pplive_vod_cli_port = 0; src->pplive_last_packet_time = 0; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: VOD port timer reset.\n"); } } if (dst != NULL && dst->pplive_vod_cli_port == packet->tcp->dest && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, IPOQUE_PROTOCOL_PPLIVE)) { if (dst->pplive_last_packet_time_set == 1 && (IPOQUE_TIMESTAMP_COUNTER_SIZE) (packet->tick_timestamp - dst->pplive_last_packet_time) < ipoque_struct->pplive_connection_timeout) { ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); dst->pplive_last_packet_time_set = 1; dst->pplive_last_packet_time = packet->tick_timestamp; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "timestamp dst.\n"); return; } else { dst->pplive_last_packet_time_set = 0; dst->pplive_vod_cli_port = 0; dst->pplive_last_packet_time = 0; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: VOD port timer reset.\n"); } } if (packet->payload_packet_len > 4 && memcmp(packet->payload, "GET /", 5) == 0) { ipq_parse_packet_line_info(ipoque_struct); if ((packet->parsed_lines == 8 || packet->parsed_lines == 9) && packet->line[0].ptr != NULL && packet->line[0].len >= 8 && memcmp(&packet->payload[packet->line[0].len - 8], "HTTP/1.", 7) == 0 && packet->line[2].ptr != NULL && packet->line[2].len >= 16 && memcmp(packet->line[2].ptr, "x-flash-version:", 16) == 0 && packet->user_agent_line.ptr != NULL && packet->user_agent_line.len >= 11 && memcmp(packet->user_agent_line.ptr, "Mozilla/4.0", 11) == 0 && packet->line[6].ptr != NULL && packet->line[6].len >= 21 && memcmp(packet->line[6].ptr, "Pragma: Client=PPLive", 21) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: found HTTP request.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } else if ((packet->parsed_lines >= 6 && packet->parsed_lines <= 8) && packet->line[0].ptr != NULL && packet->line[0].len >= 8 && memcmp(&packet->payload[packet->line[0].len - 8], "HTTP/1.", 7) == 0 && (((packet->user_agent_line.ptr != NULL && packet->user_agent_line.len >= 10) && (memcmp(packet->user_agent_line.ptr, "PPLive DAC", 10) == 0)) || ((packet->user_agent_line.ptr != NULL && packet->user_agent_line.len >= 19) && (memcmp(packet->user_agent_line.ptr, "PPLive-Media-Player", 19) == 0)))) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: found HTTP request.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } else if (packet->host_line.ptr != NULL && packet->host_line.len >= IPQ_STATICSTRING_LEN("player.pplive") && memcmp(packet->host_line.ptr, "player.pplive", IPQ_STATICSTRING_LEN("player.pplive")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: found via Host header.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } else if (packet->referer_line.ptr != NULL && packet->referer_line.len >= IPQ_STATICSTRING_LEN("http://player.pplive") && memcmp(packet->referer_line.ptr, "http://player.pplive", IPQ_STATICSTRING_LEN("http://player.pplive")) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: found via Referer header.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } else if (packet->parsed_lines >= 8 && packet->line[0].ptr != NULL && packet->line[0].len >= 8 && memcmp(&packet->payload[packet->line[0].len - 8], "HTTP/1.", 7) == 0) { u8 i, flag = 0; for (i = 0; i < packet->parsed_lines && i < 10 && flag < 2; i++) { if (packet->line[i].ptr != NULL && packet->line[i].len >= IPQ_STATICSTRING_LEN("x-flash-version:") && memcmp(packet->line[i].ptr, "x-flash-version:", IPQ_STATICSTRING_LEN("x-flash-version:")) == 0) { flag++; } else if (packet->line[i].ptr != NULL && packet->line[i].len >= IPQ_STATICSTRING_LEN("Pragma: Client=PPLive") && memcmp(packet->line[i].ptr, "Pragma: Client=PPLive", IPQ_STATICSTRING_LEN("Pragma: Client=PPLive")) == 0) { flag++; } } if (flag == 2) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: found HTTP request.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_CORRELATED_PROTOCOL); return; } } } // searches for packets > 20 byte that begin with a hex number == packet->payload_packet_len - 4 // and with the same number at position 16, 17, 18, 19 if (packet->payload_packet_len > 20 && ntohl(get_u32(packet->payload, 0)) == packet->payload_packet_len - 4) { if (packet->payload[4] == 0x21 && packet->payload[5] == 0x00) { if ((packet->payload[9] == packet->payload[10]) && (packet->payload[9] == packet->payload[11])) { if ((packet->payload[16] == packet->payload[17]) && (packet->payload[16] == packet->payload[18]) && (packet->payload[16] == packet->payload[19])) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: direct server request or response found\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } } // stage > 0, packet begins with 21 00, bytes at positions 5, 6, 7 are equal, bytes at positions 12, 13, 14, 15 are equal, if (packet->payload_packet_len > 20 && flow->pplive_stage) { if (packet->payload[0] == 0x21 && packet->payload[1] == 0x00) { if (packet->payload[5] == packet->payload[6] && packet->payload[5] == packet->payload[7]) { if (packet->payload[12] == packet->payload[13] && packet->payload[14] == packet->payload[15] && packet->payload[12] == packet->payload[14]) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: direct server request or response found\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } } // packet (len>11) begins with a hex number == packet->payload_packet_len - 4 and matches certain bitmuster if (packet->payload_packet_len > 11 && ntohl(get_u32(packet->payload, 0)) == packet->payload_packet_len - 4) { if (packet->payload[4] == 0xe9 && packet->payload[5] == 0x03 && ((packet->payload[7] == packet->payload[10]) || (packet->payload[7] == packet->payload[11]))) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: direct server request or response found\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } // stage > 0, len>10, begins with e9 03, matches certain pattern if (packet->payload_packet_len > 10 && flow->pplive_stage) { if (packet->payload[0] == 0xe9 && packet->payload[1] == 0x03 && ((packet->payload[3] == packet->payload[6]) || (packet->payload[3] == packet->payload[7]))) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: direct server request or response found\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } /* Adware in the PPLive Client -> first TCP Packet has length of 4 Bytes -> 2nd TCP Packet has length of 96 Bytes */ /* or */ /* Peer-List Requests over TCP -> first Packet has length of 4 Bytes -> 2nd TCP Packet has length of 71 Bytes */ /* there are different possibilities of the order of the packets */ IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: TCP found, plen = %d, stage = %d, payload[0] = %x, payload[1] = %x, payload[2] = %x, payload[3] = %x \n", packet->payload_packet_len, flow->pplive_stage, packet->payload[0], packet->payload[1], packet->payload[2], packet->payload[3]); /* generic pplive detection (independent of the stage) !!! */ // len > 11, packet begins with a hex number == packet->payload_packet_len - 4, pattern: ?? ?? ?? ?? 21 00 ?? ?? 98 ab 01 02 if (packet->payload_packet_len > 11 && ntohl(get_u32(packet->payload, 0)) == packet->payload_packet_len - 4) { if (packet->payload[4] == 0x21 && packet->payload[5] == 0x00 && ((packet->payload[8] == 0x98 && packet->payload[9] == 0xab && packet->payload[10] == 0x01 && packet->payload[11] == 0x02) )) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: direct server request or response found\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } // packet 4 to 19 have a hex representation from 0x30 to 0x39 if (packet->payload_packet_len > 20) { a = 4; while (a < 20) { if (packet->payload[a] >= '0' && packet->payload[a] <= '9') { if (a == 19) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: direct new header format found\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } else { a++; } } else { break; } } } } /* 1st and 2nd (KD: ??????? )Packet of Client is 4 Byte */ // stage == 0, p_len == 4, pattern: 04 00 00 00 --> need next packet if (flow->pplive_stage == 0) { if (packet->payload_packet_len == 4 && packet->payload[0] > 0x04 && packet->payload[1] == 0x00 && packet->payload[2] == 0x00 && packet->payload[3] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: 4Byte TCP Packet Request found \n"); /* go to the 2nd Client Packet */ flow->pplive_stage = 1 + packet->packet_direction; flow->l4.tcp.pplive_next_packet_size[packet->packet_direction] = packet->payload[0]; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "need next packet i.\n"); return; } } else if (flow->pplive_stage == 2 - packet->packet_direction) { if (packet->payload_packet_len == 4 && packet->payload[0] > 0x04 && packet->payload[1] == 0x00 && packet->payload[2] == 0x00 && packet->payload[3] == 0x00) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: 4Byte TCP Packet Response found \n"); /* go to the 2nd Client Packet */ flow->l4.tcp.pplive_next_packet_size[packet->packet_direction] = packet->payload[0]; } flow->pplive_stage = 3; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "need next packet ii.\n"); return; } else if (flow->pplive_stage == 1 + packet->packet_direction || flow->pplive_stage == 3) { if (packet->payload_packet_len > 7 && flow->l4.tcp.pplive_next_packet_size[packet->packet_direction] >= 4) { if (packet->payload_packet_len == flow->l4.tcp.pplive_next_packet_size[packet->packet_direction]) { if (packet->payload[0] == 0xe9 && packet->payload[1] == 0x03 && ((packet->payload[4] == 0x98 && packet->payload[5] == 0xab && packet->payload[6] == 0x01 && packet->payload[7] == 0x02) )) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: two packet response found\n"); IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive over tcp with pattern iii.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } // packet 4 to 19 have a hex representation from 0x30 to 0x39 if (packet->payload_packet_len > 16) { a = 0; while (a < 16) { if (packet->payload[a] >= '0' && packet->payload[a] <= '9') { if (a == 15) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: new header format found\n"); IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive over tcp with pattern v.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } else { a++; } } else { break; } } } // p_len>79 and a lot of 00 in the end if (packet->payload_packet_len > 79 && get_u32(packet->payload, packet->payload_packet_len - 9) == 0x00000000 && get_u32(packet->payload, packet->payload_packet_len - 5) == 0x00000000) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "PPLIVE: Last 8 NULL bytes found.\n"); IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive over tcp with pattern vi.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } if (packet->payload_packet_len > flow->l4.tcp.pplive_next_packet_size[packet->packet_direction]) { if (packet->payload[0] == 0xe9 && packet->payload[1] == 0x03 && packet->payload[4] == 0x98 && packet->payload[5] == 0xab && packet->payload[6] == 0x01 && packet->payload[7] == 0x02) { a = flow->l4.tcp.pplive_next_packet_size[packet->packet_direction]; IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "a=%u.\n", a); if (packet->payload_packet_len > a + 4 && packet->payload[a + 2] == 0x00 && packet->payload[a + 3] == 0x00 && packet->payload[a] != 0) { a += ((packet->payload[a + 1] << 8) + packet->payload[a] + 4); IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "a=%u.\n", a); if (packet->payload_packet_len == a) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive over tcp with pattern vii.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } if (packet->payload_packet_len > a + 4 && packet->payload[a + 2] == 0x00 && packet->payload[a + 3] == 0x00 && packet->payload[a] != 0) { a += ((packet->payload[a + 1] << 8) + packet->payload[a] + 4); if (packet->payload_packet_len == a) { IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "found pplive over tcp with pattern viii.\n"); ipoque_int_pplive_add_connection(ipoque_struct, IPOQUE_REAL_PROTOCOL); return; } } } } } } } } IPQ_LOG(IPOQUE_PROTOCOL_PPLIVE, ipoque_struct, IPQ_LOG_DEBUG, "exclude pplive.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_PPLIVE); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/armagetron.c0000644000000000000000000000751411655273464020675 0ustar rootroot/* * armagetron.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_ARMAGETRON static void ipoque_int_armagetron_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_ARMAGETRON, IPOQUE_REAL_PROTOCOL); } void ipoque_search_armagetron_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_ARMAGETRON, ipoque_struct, IPQ_LOG_DEBUG, "search armagetron.\n"); if (packet->payload_packet_len > 10) { /* login request */ if (get_u32(packet->payload, 0) == htonl(0x000b0000)) { const u16 dataLength = ntohs(get_u16(packet->payload, 4)); if (dataLength == 0 || dataLength * 2 + 8 != packet->payload_packet_len) goto exclude; if (get_u16(packet->payload, 6) == htons(0x0008) && get_u16(packet->payload, packet->payload_packet_len - 2) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_ARMAGETRON, ipoque_struct, IPQ_LOG_DEBUG, "detected armagetron.\n"); ipoque_int_armagetron_add_connection(ipoque_struct); return; } } /* sync_msg */ if (packet->payload_packet_len == 16 && get_u16(packet->payload, 0) == htons(0x001c) && get_u16(packet->payload, 2) != 0) { const u16 dataLength = ntohs(get_u16(packet->payload, 4)); if (dataLength != 4) goto exclude; if (get_u32(packet->payload, 6) == htonl(0x00000500) && get_u32(packet->payload, 6 + 4) == htonl(0x00010000) && get_u16(packet->payload, packet->payload_packet_len - 2) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_ARMAGETRON, ipoque_struct, IPQ_LOG_DEBUG, "detected armagetron.\n"); ipoque_int_armagetron_add_connection(ipoque_struct); return; } } /* net_sync combination */ if (packet->payload_packet_len > 50 && get_u16(packet->payload, 0) == htons(0x0018) && get_u16(packet->payload, 2) != 0) { u16 val; const u16 dataLength = ntohs(get_u16(packet->payload, 4)); if (dataLength == 0 || dataLength * 2 + 8 > packet->payload_packet_len) goto exclude; val = get_u16(packet->payload, 6 + 2); if (val == get_u16(packet->payload, 6 + 6)) { val = ntohs(get_u16(packet->payload, 6 + 8)); if ((6 + 10 + val + 4) < packet->payload_packet_len && (get_u32(packet->payload, 6 + 10 + val) == htonl(0x00010000) || get_u32(packet->payload, 6 + 10 + val) == htonl(0x00000001)) && get_u16(packet->payload, packet->payload_packet_len - 2) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_ARMAGETRON, ipoque_struct, IPQ_LOG_DEBUG, "detected armagetron.\n"); ipoque_int_armagetron_add_connection(ipoque_struct); return; } } } } exclude: IPQ_LOG(IPOQUE_PROTOCOL_ARMAGETRON, ipoque_struct, IPQ_LOG_DEBUG, "exclude armagetron.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_ARMAGETRON); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/pptp.c0000644000000000000000000000414111655273464017512 0ustar rootroot/* * pptp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_PPTP static void ipoque_int_pptp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_PPTP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_pptp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len >= 10 && get_u16(packet->payload, 0) == htons(packet->payload_packet_len) && get_u16(packet->payload, 2) == htons(0x0001) /* message type: control message */ &&get_u32(packet->payload, 4) == htonl(0x1a2b3c4d) /* cookie: correct */ &&(get_u16(packet->payload, 8) == htons(0x0001) /* control type: start-control-connection-request */ )) { IPQ_LOG(IPOQUE_PROTOCOL_PPTP, ipoque_struct, IPQ_LOG_DEBUG, "found pptp.\n"); ipoque_int_pptp_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_PPTP, ipoque_struct, IPQ_LOG_DEBUG, "exclude pptp.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_PPTP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/http_activesync.c0000644000000000000000000000400211655273464021732 0ustar rootroot/* * http_activesync.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_HTTP_APPLICATION_ACTIVESYNC static void ipoque_int_activesync_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_HTTP_APPLICATION_ACTIVESYNC, IPOQUE_CORRELATED_PROTOCOL); } void ipoque_search_activesync(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; if (packet->tcp != NULL) { if (packet->payload_packet_len > 150 && ((memcmp(packet->payload, "OPTIONS /Microsoft-Server-ActiveSync?", 37) == 0) || (memcmp(packet->payload, "POST /Microsoft-Server-ActiveSync?", 34) == 0))) { ipoque_int_activesync_add_connection(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_HTTP_APPLICATION_ACTIVESYNC, ipoque_struct, IPQ_LOG_DEBUG, " flow marked as ActiveSync \n"); return; } } IPQ_LOG(IPOQUE_PROTOCOL_HTTP_APPLICATION_ACTIVESYNC, ipoque_struct, IPQ_LOG_DEBUG, "exclude activesync\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP_APPLICATION_ACTIVESYNC); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/steam.c0000644000000000000000000000443311655273464017644 0ustar rootroot/* * steam.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_STEAM static void ipoque_int_steam_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_STEAM, IPOQUE_REAL_PROTOCOL); } void ipoque_search_steam(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (flow->l4.tcp.steam_stage == 0) { if (packet->payload_packet_len == 4 && ntohl(get_u32(packet->payload, 0)) <= 0x07 && ntohs(packet->tcp->dest) >= 27030 && ntohs(packet->tcp->dest) <= 27040) { flow->l4.tcp.steam_stage = 1 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_STEAM, ipoque_struct, IPQ_LOG_DEBUG, "steam stage 1\n"); return; } } else if (flow->l4.tcp.steam_stage == 2 - packet->packet_direction) { if ((packet->payload_packet_len == 1 || packet->payload_packet_len == 5) && packet->payload[0] == 0x01) { ipoque_int_steam_add_connection(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_STEAM, ipoque_struct, IPQ_LOG_DEBUG, "steam detected\n"); return; } } IPQ_LOG(IPOQUE_PROTOCOL_STEAM, ipoque_struct, IPQ_LOG_DEBUG, "steam excluded.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_STEAM); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/ppstream.c0000644000000000000000000000746411655273464020375 0ustar rootroot/* * ppstream.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_PPSTREAM static void ipoque_int_ppstream_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_PPSTREAM, IPOQUE_REAL_PROTOCOL); } void ipoque_search_ppstream(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; /* check TCP Connections -> Videodata */ if (packet->tcp != NULL) { if (packet->payload_packet_len >= 60 && get_u32(packet->payload, 52) == 0 && memcmp(packet->payload, "PSProtocol\x0", 11) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_PPSTREAM, ipoque_struct, IPQ_LOG_DEBUG, "found ppstream over tcp.\n"); ipoque_int_ppstream_add_connection(ipoque_struct); return; } } if (packet->udp != NULL) { if (packet->payload_packet_len > 2 && packet->payload[2] == 0x43 && ((packet->payload_packet_len - 4 == get_l16(packet->payload, 0)) || (packet->payload_packet_len == get_l16(packet->payload, 0)) || (packet->payload_packet_len >= 6 && packet->payload_packet_len - 6 == get_l16(packet->payload, 0)))) { flow->l4.udp.ppstream_stage++; if (flow->l4.udp.ppstream_stage == 5) { IPQ_LOG(IPOQUE_PROTOCOL_PPSTREAM, ipoque_struct, IPQ_LOG_DEBUG, "found ppstream over udp pattern len, 43.\n"); ipoque_int_ppstream_add_connection(ipoque_struct); return; } return; } if (flow->l4.udp.ppstream_stage == 0 && packet->payload_packet_len > 4 && ((packet->payload_packet_len - 4 == get_l16(packet->payload, 0)) || (packet->payload_packet_len == get_l16(packet->payload, 0)) || (packet->payload_packet_len >= 6 && packet->payload_packet_len - 6 == get_l16(packet->payload, 0)))) { if (packet->payload[2] == 0x00 && packet->payload[3] == 0x00 && packet->payload[4] == 0x03) { flow->l4.udp.ppstream_stage = 7; IPQ_LOG(IPOQUE_PROTOCOL_PPSTREAM, ipoque_struct, IPQ_LOG_DEBUG, "need next packet I.\n"); return; } } if (flow->l4.udp.ppstream_stage == 7 && packet->payload_packet_len > 4 && packet->payload[3] == 0x00 && ((packet->payload_packet_len - 4 == get_l16(packet->payload, 0)) || (packet->payload_packet_len == get_l16(packet->payload, 0)) || (packet->payload_packet_len >= 6 && packet->payload_packet_len - 6 == get_l16(packet->payload, 0))) && (packet->payload[2] == 0x00 && packet->payload[4] == 0x03)) { IPQ_LOG(IPOQUE_PROTOCOL_PPSTREAM, ipoque_struct, IPQ_LOG_DEBUG, "found ppstream over udp with pattern Vb.\n"); ipoque_int_ppstream_add_connection(ipoque_struct); return; } } IPQ_LOG(IPOQUE_PROTOCOL_PPSTREAM, ipoque_struct, IPQ_LOG_DEBUG, "exclude ppstream.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_PPSTREAM); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/filetopia.c0000644000000000000000000000576711655273464020522 0ustar rootroot/* * filetopia.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_FILETOPIA static void ipoque_int_filetopia_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_FILETOPIA, IPOQUE_REAL_PROTOCOL); } void ipoque_search_filetopia_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (flow->l4.tcp.filetopia_stage == 0) { if (packet->payload_packet_len >= 50 && packet->payload_packet_len <= 70 && packet->payload[0] == 0x03 && packet->payload[1] == 0x9a && packet->payload[3] == 0x22 && packet->payload[packet->payload_packet_len - 1] == 0x2b) { IPQ_LOG(IPOQUE_PROTOCOL_FILETOPIA, ipoque_struct, IPQ_LOG_DEBUG, "Filetopia stage 1 detected\n"); flow->l4.tcp.filetopia_stage = 1; return; } } else if (flow->l4.tcp.filetopia_stage == 1) { if (packet->payload_packet_len >= 100 && packet->payload[0] == 0x03 && packet->payload[1] == 0x9a && (packet->payload[3] == 0x22 || packet->payload[3] == 0x23)) { int i; for (i = 0; i < 10; i++) { // check 10 bytes for valid ASCII printable characters if (!(packet->payload[5 + i] >= 0x20 && packet->payload[5 + i] <= 0x7e)) { goto end_filetopia_nothing_found; } } IPQ_LOG(IPOQUE_PROTOCOL_FILETOPIA, ipoque_struct, IPQ_LOG_DEBUG, "Filetopia stage 2 detected\n"); flow->l4.tcp.filetopia_stage = 2; return; } } else if (flow->l4.tcp.filetopia_stage == 2) { if (packet->payload_packet_len >= 4 && packet->payload_packet_len <= 100 && packet->payload[0] == 0x03 && packet->payload[1] == 0x9a && (packet->payload[3] == 0x22 || packet->payload[3] == 0x23)) { IPQ_LOG(IPOQUE_PROTOCOL_FILETOPIA, ipoque_struct, IPQ_LOG_DEBUG, "Filetopia detected\n"); ipoque_int_filetopia_add_connection(ipoque_struct); return; } } end_filetopia_nothing_found: IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_FILETOPIA); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/halflife2_and_mods.c0000644000000000000000000000460711655273464022236 0ustar rootroot/* * halflife2_and_mods.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_HALFLIFE2 static void ipoque_int_halflife2_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_HALFLIFE2, IPOQUE_REAL_PROTOCOL); } void ipoque_search_halflife2(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (flow->l4.udp.halflife2_stage == 0) { if (packet->payload_packet_len >= 20 && get_u32(packet->payload, 0) == 0xFFFFFFFF && get_u32(packet->payload, packet->payload_packet_len - 4) == htonl(0x30303000)) { flow->l4.udp.halflife2_stage = 1 + packet->packet_direction; IPQ_LOG(IPOQUE_PROTOCOL_HALFLIFE2, ipoque_struct, IPQ_LOG_DEBUG, "halflife2 client req detected, waiting for server reply\n"); return; } } else if (flow->l4.udp.halflife2_stage == 2 - packet->packet_direction) { if (packet->payload_packet_len >= 20 && get_u32(packet->payload, 0) == 0xFFFFFFFF && get_u32(packet->payload, packet->payload_packet_len - 4) == htonl(0x30303000)) { ipoque_int_halflife2_add_connection(ipoque_struct); IPQ_LOG(IPOQUE_PROTOCOL_HALFLIFE2, ipoque_struct, IPQ_LOG_DEBUG, "halflife2 server reply detected\n"); return; } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_HALFLIFE2); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/mail_pop.c0000644000000000000000000002027011655273464020330 0ustar rootroot/* * mail_pop.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_MAIL_POP #define POP_BIT_AUTH 0x0001 #define POP_BIT_APOP 0x0002 #define POP_BIT_USER 0x0004 #define POP_BIT_PASS 0x0008 #define POP_BIT_CAPA 0x0010 #define POP_BIT_LIST 0x0020 #define POP_BIT_STAT 0x0040 #define POP_BIT_UIDL 0x0080 #define POP_BIT_RETR 0x0100 #define POP_BIT_DELE 0x0200 #define POP_BIT_STLS 0x0400 static void ipoque_int_mail_pop_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_MAIL_POP, IPOQUE_REAL_PROTOCOL); } static int ipoque_int_mail_pop_check_for_client_commands(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 4) { if ((packet->payload[0] == 'A' || packet->payload[0] == 'a') && (packet->payload[1] == 'U' || packet->payload[1] == 'u') && (packet->payload[2] == 'T' || packet->payload[2] == 't') && (packet->payload[3] == 'H' || packet->payload[3] == 'h')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_AUTH; return 1; } else if ((packet->payload[0] == 'A' || packet->payload[0] == 'a') && (packet->payload[1] == 'P' || packet->payload[1] == 'p') && (packet->payload[2] == 'O' || packet->payload[2] == 'o') && (packet->payload[3] == 'P' || packet->payload[3] == 'p')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_APOP; return 1; } else if ((packet->payload[0] == 'U' || packet->payload[0] == 'u') && (packet->payload[1] == 'S' || packet->payload[1] == 's') && (packet->payload[2] == 'E' || packet->payload[2] == 'e') && (packet->payload[3] == 'R' || packet->payload[3] == 'r')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_USER; return 1; } else if ((packet->payload[0] == 'P' || packet->payload[0] == 'p') && (packet->payload[1] == 'A' || packet->payload[1] == 'a') && (packet->payload[2] == 'S' || packet->payload[2] == 's') && (packet->payload[3] == 'S' || packet->payload[3] == 's')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_PASS; return 1; } else if ((packet->payload[0] == 'C' || packet->payload[0] == 'c') && (packet->payload[1] == 'A' || packet->payload[1] == 'a') && (packet->payload[2] == 'P' || packet->payload[2] == 'p') && (packet->payload[3] == 'A' || packet->payload[3] == 'a')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_CAPA; return 1; } else if ((packet->payload[0] == 'L' || packet->payload[0] == 'l') && (packet->payload[1] == 'I' || packet->payload[1] == 'i') && (packet->payload[2] == 'S' || packet->payload[2] == 's') && (packet->payload[3] == 'T' || packet->payload[3] == 't')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_LIST; return 1; } else if ((packet->payload[0] == 'S' || packet->payload[0] == 's') && (packet->payload[1] == 'T' || packet->payload[1] == 't') && (packet->payload[2] == 'A' || packet->payload[2] == 'a') && (packet->payload[3] == 'T' || packet->payload[3] == 't')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_STAT; return 1; } else if ((packet->payload[0] == 'U' || packet->payload[0] == 'u') && (packet->payload[1] == 'I' || packet->payload[1] == 'i') && (packet->payload[2] == 'D' || packet->payload[2] == 'd') && (packet->payload[3] == 'L' || packet->payload[3] == 'l')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_UIDL; return 1; } else if ((packet->payload[0] == 'R' || packet->payload[0] == 'r') && (packet->payload[1] == 'E' || packet->payload[1] == 'e') && (packet->payload[2] == 'T' || packet->payload[2] == 't') && (packet->payload[3] == 'R' || packet->payload[3] == 'r')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_RETR; return 1; } else if ((packet->payload[0] == 'D' || packet->payload[0] == 'd') && (packet->payload[1] == 'E' || packet->payload[1] == 'e') && (packet->payload[2] == 'L' || packet->payload[2] == 'l') && (packet->payload[3] == 'E' || packet->payload[3] == 'e')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_DELE; return 1; } else if ((packet->payload[0] == 'S' || packet->payload[0] == 's') && (packet->payload[1] == 'T' || packet->payload[1] == 't') && (packet->payload[2] == 'L' || packet->payload[2] == 'l') && (packet->payload[3] == 'S' || packet->payload[3] == 's')) { flow->l4.tcp.pop_command_bitmask |= POP_BIT_STLS; return 1; } } return 0; } void ipoque_search_mail_pop_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u8 a = 0; u8 bit_count = 0; u16 dport = 0; u16 sport = 0; sport = ntohs(packet->tcp->source); dport = ntohs(packet->tcp->dest); IPQ_LOG(IPOQUE_PROTOCOL_MAIL_POP, ipoque_struct, IPQ_LOG_DEBUG, "search mail_pop\n"); if ((packet->payload_packet_len > 3 && (packet->payload[0] == '+' && (packet->payload[1] == 'O' || packet->payload[1] == 'o') && (packet->payload[2] == 'K' || packet->payload[2] == 'k'))) || (packet->payload_packet_len > 4 && (packet->payload[0] == '-' && (packet->payload[1] == 'E' || packet->payload[1] == 'e') && (packet->payload[2] == 'R' || packet->payload[2] == 'r') && (packet->payload[3] == 'R' || packet->payload[3] == 'r')))) { // +OK or -ERR seen flow->l4.tcp.mail_pop_stage += 1; } else if (!ipoque_int_mail_pop_check_for_client_commands(ipoque_struct)) { goto maybe_split_pop; } if (packet->payload_packet_len > 2 && ntohs(get_u16(packet->payload, packet->payload_packet_len - 2)) == 0x0d0a) { // count the bits set in the bitmask if (flow->l4.tcp.pop_command_bitmask != 0) { for (a = 0; a < 16; a++) { bit_count += (flow->l4.tcp.pop_command_bitmask >> a) & 0x01; } } IPQ_LOG(IPOQUE_PROTOCOL_MAIL_POP, ipoque_struct, IPQ_LOG_DEBUG, "mail_pop +OK/-ERR responses: %u, unique commands: %u\n", flow->l4.tcp.mail_pop_stage, bit_count); if ((bit_count + flow->l4.tcp.mail_pop_stage) >= 3) { if (flow->l4.tcp.mail_pop_stage > 0) { IPQ_LOG(IPOQUE_PROTOCOL_MAIL_POP, ipoque_struct, IPQ_LOG_DEBUG, "mail_pop identified\n"); ipoque_int_mail_pop_add_connection(ipoque_struct); return; } else { return; } } else { return; } } else { // first part of a split packet IPQ_LOG(IPOQUE_PROTOCOL_MAIL_POP, ipoque_struct, IPQ_LOG_DEBUG, "mail_pop command without line ending -> skip\n"); return; } maybe_split_pop: if (((packet->payload_packet_len > 2 && ntohs(get_u16(packet->payload, packet->payload_packet_len - 2)) == 0x0d0a) || flow->l4.tcp.pop_command_bitmask != 0 || flow->l4.tcp.mail_pop_stage != 0) && flow->packet_counter < 12) { // maybe part of a split pop packet IPQ_LOG(IPOQUE_PROTOCOL_MAIL_POP, ipoque_struct, IPQ_LOG_DEBUG, "maybe part of split mail_pop packet -> skip\n"); return; } IPQ_LOG(IPOQUE_PROTOCOL_MAIL_POP, ipoque_struct, IPQ_LOG_DEBUG, "exclude mail_pop\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_MAIL_POP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/warcraft3.c0000644000000000000000000000663411655273464020434 0ustar rootroot/* * warcraft3.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_WARCRAFT3 static void ipoque_int_warcraft3_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WARCRAFT3, IPOQUE_REAL_PROTOCOL); } void ipoque_search_warcraft3(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u16 l; IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "search WARCRAFT3\n"); if (flow->packet_counter == 1 && packet->payload_packet_len == 1 && packet->payload[0] == 0x01) { IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "maybe warcraft3: packet_len == 1\n"); return; } else if (packet->payload_packet_len >= 4 && (packet->payload[0] == 0xf7 || packet->payload[0] == 0xff)) { IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "packet_payload begins with 0xf7 or 0xff\n"); l = packet->payload[2] + (packet->payload[3] << 8); // similar to ntohs IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "l = %u \n", l); while (l <= (packet->payload_packet_len - 4)) { if (packet->payload[l] == 0xf7) { u16 temp = (packet->payload[l + 2 + 1] << 8) + packet->payload[l + 2]; IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "another f7 visited.\n"); if (temp <= 2) { IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "break\n"); break; } else { l += temp; IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "l = %u \n", l); } } else { IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "break\n"); break; } } if (l == packet->payload_packet_len) { IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "maybe WARCRAFT3\n"); IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "flow->packet_counter = %u \n", flow->packet_counter); if (flow->packet_counter > 2) { IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "detected WARCRAFT3\n"); ipoque_int_warcraft3_add_connection(ipoque_struct); return; } return; } } IPQ_LOG(IPOQUE_PROTOCOL_WARCRAFT3, ipoque_struct, IPQ_LOG_DEBUG, "no warcraft3 detected.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_WARCRAFT3); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/world_of_kung_fu.c0000644000000000000000000000437111655273464022065 0ustar rootroot/* * world_of_kung_fu.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ /* include files */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU static void ipoque_int_world_of_kung_fu_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU, IPOQUE_REAL_PROTOCOL); } void ipoque_search_world_of_kung_fu(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; IPQ_LOG(IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU, ipoque_struct, IPQ_LOG_DEBUG, "search world_of_kung_fu.\n"); if ((packet->payload_packet_len == 16) && ntohl(get_u32(packet->payload, 0)) == 0x0c000000 && ntohl(get_u32(packet->payload, 4)) == 0xd2000c00 && (packet->payload[9] == 0x16) && ntohs(get_u16(packet->payload, 10)) == 0x0000 && ntohs(get_u16(packet->payload, 14)) == 0x0000) { IPQ_LOG(IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU, ipoque_struct, IPQ_LOG_DEBUG, "detected world_of_kung_fu.\n"); ipoque_int_world_of_kung_fu_add_connection(ipoque_struct); return; } IPQ_LOG(IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU, ipoque_struct, IPQ_LOG_DEBUG, "exclude world_of_kung_fu.\n"); IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/rdp.c0000644000000000000000000000402711655273464017317 0ustar rootroot/* * rdp.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_RDP static void ipoque_int_rdp_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_RDP, IPOQUE_REAL_PROTOCOL); } void ipoque_search_rdp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; if (packet->payload_packet_len > 10 && get_u8(packet->payload, 0) > 0 && get_u8(packet->payload, 0) < 4 && get_u16(packet->payload, 2) == ntohs(packet->payload_packet_len) && get_u8(packet->payload, 4) == packet->payload_packet_len - 5 && get_u8(packet->payload, 5) == 0xe0 && get_u16(packet->payload, 6) == 0 && get_u16(packet->payload, 8) == 0 && get_u8(packet->payload, 10) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_RDP, ipoque_struct, IPQ_LOG_DEBUG, "RDP detected.\n"); ipoque_int_rdp_add_connection(ipoque_struct); return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_RDP); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/popo.c0000644000000000000000000000615311655273464017511 0ustar rootroot/* * popo.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_POPO static void ipoque_int_popo_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_POPO, IPOQUE_REAL_PROTOCOL); } void ipoque_search_popo_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; if (packet->tcp != NULL) { if ((packet->payload_packet_len == 20) && get_u32(packet->payload, 0) == htonl(0x0c000000) && get_u32(packet->payload, 4) == htonl(0x01010000) && get_u32(packet->payload, 8) == htonl(0x06000000) && get_u32(packet->payload, 12) == 0 && get_u32(packet->payload, 16) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_POPO, ipoque_struct, IPQ_LOG_DEBUG, "POPO detected\n"); ipoque_int_popo_add_connection(ipoque_struct); return; } if (IPQ_SRC_OR_DST_HAS_PROTOCOL(src, dst, IPOQUE_PROTOCOL_POPO) != 0) { #define IPOQUE_POPO_IP_SUBNET_START ( (220 << 24) + (181 << 16) + (28 << 8) + 220) #define IPOQUE_POPO_IP_SUBNET_END ( (220 << 24) + (181 << 16) + (28 << 8) + 238) /* may match the first payload ip packet only ... */ if (ntohl(packet->iph->daddr) >= IPOQUE_POPO_IP_SUBNET_START && ntohl(packet->iph->daddr) <= IPOQUE_POPO_IP_SUBNET_END) { IPQ_LOG(IPOQUE_PROTOCOL_POPO, ipoque_struct, IPQ_LOG_DEBUG, "POPO ip subnet detected\n"); ipoque_int_popo_add_connection(ipoque_struct); return; } } } if (packet->payload_packet_len > 13 && packet->payload_packet_len == get_l32(packet->payload, 0) && !get_l16(packet->payload, 12)) { register u16 ii; for (ii = 14; ii < 50 && ii < packet->payload_packet_len - 8; ++ii) { if (packet->payload[ii] == '@') if (!memcmp(&packet->payload[ii + 1], "163.com", 7) || (ii <= packet->payload_packet_len - 13 && !memcmp(&packet->payload[ii + 1], "popo.163.com", 12))) { IPQ_LOG(IPOQUE_PROTOCOL_POPO, ipoque_struct, IPQ_LOG_DEBUG, "POPO detected.\n"); ipoque_int_popo_add_connection(ipoque_struct); return; } } } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_POPO); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/protocols/directdownloadlink.c0000644000000000000000000011131511655273464022411 0ustar rootroot/* * directdownloadlink.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_protocols.h" #ifdef IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK #ifdef IPOQUE_DEBUG_DIRECT_DOWNLOAD_LINK //#define IPOQUE_DEBUG_DIRECT_DOWNLOAD_LINK_NOTHING_FOUND //#define IPOQUE_DEBUG_DIRECT_DOWNLOAD_LINK_PACKET_TOO_SMALL #define IPOQUE_DEBUG_DIRECT_DOWNLOAD_LINK_IP #endif static void ipoque_int_direct_download_link_add_connection(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; ipoque_int_add_connection(ipoque_struct, IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, IPOQUE_CORRELATED_PROTOCOL); flow->l4.tcp.ddlink_server_direction = packet->packet_direction; } /* return 0 if nothing has been detected return 1 if it is a megaupload packet */ u8 search_ddl_domains(struct ipoque_detection_module_struct *ipoque_struct); u8 search_ddl_domains(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; u16 filename_start = 0; u8 i = 1; u16 host_line_len_without_port; if (packet->payload_packet_len < 100) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "DDL: Packet too small.\n"); goto end_ddl_nothing_found; } if (memcmp(packet->payload, "POST ", 5) == 0) { filename_start = 5; // POST IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "DDL: POST FOUND\n"); } else if (memcmp(packet->payload, "GET ", 4) == 0) { filename_start = 4; // GET IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "DDL: GET FOUND\n"); } else { goto end_ddl_nothing_found; } // parse packet ipq_parse_packet_line_info(ipoque_struct); if (packet->host_line.ptr == NULL) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "DDL: NO HOST FOUND\n"); goto end_ddl_nothing_found; } IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "DDL: Host: found\n"); if (packet->line[0].len < 9 + filename_start || memcmp(&packet->line[0].ptr[packet->line[0].len - 9], " HTTP/1.", 8) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "DDL: PACKET NOT HTTP CONFORM.\nXXX%.*sXXX\n", 8, &packet->line[0].ptr[packet->line[0].len - 9]); goto end_ddl_nothing_found; } // BEGIN OF AUTOMATED CODE GENERATION // first see if we have ':port' at the end of the line host_line_len_without_port = packet->host_line.len; if (host_line_len_without_port >= i && packet->host_line.ptr[host_line_len_without_port - i] >= '0' && packet->host_line.ptr[packet->host_line.len - i] <= '9') { i = 2; while (host_line_len_without_port >= i && packet->host_line.ptr[host_line_len_without_port - i] >= '0' && packet->host_line.ptr[host_line_len_without_port - i] <= '9') { IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "DDL: number found\n"); i++; } if (host_line_len_without_port >= i && packet->host_line.ptr[host_line_len_without_port - i] == ':') { IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "DDL: ':' found\n"); host_line_len_without_port = host_line_len_without_port - i; } } // then start automated code generation if (host_line_len_without_port >= 0 + 4 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 0 - 4], ".com", 4) == 0) { if (host_line_len_without_port >= 4 + 1 && packet->host_line.ptr[host_line_len_without_port - 4 - 1] == 'd') { if (host_line_len_without_port >= 5 + 6 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 6], "4share", 6) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 6 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 6 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 8], "fileclou", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 5 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 5], "uploa", 5) == 0) { if (host_line_len_without_port >= 10 + 6 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 6], "files-", 6) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 6 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 6 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 10 + 4 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 4], "mega", 4) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 4 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 4 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 10 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 5], "rapid", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 5 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 10 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 5], "turbo", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 5 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 4 + 1 && packet->host_line.ptr[host_line_len_without_port - 4 - 1] == 'o') { if (host_line_len_without_port >= 5 + 6 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 6], "badong", 6) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 6 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 6 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 5], "fileh", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 5 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 4 + 1 && packet->host_line.ptr[host_line_len_without_port - 4 - 1] == 'g') { if (host_line_len_without_port >= 5 + 2 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 2], "in", 2) == 0) { if (host_line_len_without_port >= 7 + 4 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 7 - 4], "shar", 4) == 0) { if (host_line_len_without_port >= 11 + 4 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 11 - 4], "best", 4) == 0 && (packet->host_line.ptr[host_line_len_without_port - 11 - 4 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 11 - 4 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 11 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 11 - 5], "quick", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 11 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 11 - 5 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 7 + 6 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 7 - 6], "upload", 6) == 0 && (packet->host_line.ptr[host_line_len_without_port - 7 - 6 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 7 - 6 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 5 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 7], "sharebi", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 7 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 4 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 8], "bigfilez", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 8 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 4 + 1 && packet->host_line.ptr[host_line_len_without_port - 4 - 1] == 'e') { if (host_line_len_without_port >= 5 + 3 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 3], "fil", 3) == 0) { if (host_line_len_without_port >= 8 + 2 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 8 - 2], "mo", 2) == 0) { if (host_line_len_without_port >= 10 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 5], "china", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 5 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 8 + 2 + 1 && (packet->host_line.ptr[host_line_len_without_port - 8 - 2 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 8 - 2 - 1] == '.')) { goto end_ddl_found; } } if (host_line_len_without_port >= 8 + 3 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 8 - 3], "hot", 3) == 0 && (packet->host_line.ptr[host_line_len_without_port - 8 - 3 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 8 - 3 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 8 + 6 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 8 - 6], "keepmy", 6) == 0 && (packet->host_line.ptr[host_line_len_without_port - 8 - 6 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 8 - 6 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 8 + 1 && packet->host_line.ptr[host_line_len_without_port - 8 - 1] == 'e') { if (host_line_len_without_port >= 9 + 3 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 9 - 3], "sav", 3) == 0 && (packet->host_line.ptr[host_line_len_without_port - 9 - 3 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 9 - 3 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 9 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 9 - 5], "sendm", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 9 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 9 - 5 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 8 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 8 - 8], "sharebig", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 8 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 8 - 8 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 8 + 3 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 8 - 3], "up-", 3) == 0 && (packet->host_line.ptr[host_line_len_without_port - 8 - 3 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 8 - 3 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 5 + 1 && packet->host_line.ptr[host_line_len_without_port - 5 - 1] == 'r') { if (host_line_len_without_port >= 6 + 3 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 6 - 3], "sha", 3) == 0) { if (host_line_len_without_port >= 9 + 1 && packet->host_line.ptr[host_line_len_without_port - 9 - 1] == '-') { if (host_line_len_without_port >= 10 + 4 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 4], "easy", 4) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 4 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 4 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 10 + 4 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 4], "fast", 4) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 4 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 4 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 10 + 4 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 4], "live", 4) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 4 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 4 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 9 + 4 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 9 - 4], "ftp2", 4) == 0 && (packet->host_line.ptr[host_line_len_without_port - 9 - 4 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 9 - 4 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 9 + 4 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 9 - 4], "gige", 4) == 0 && (packet->host_line.ptr[host_line_len_without_port - 9 - 4 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 9 - 4 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 9 + 4 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 9 - 4], "mega", 4) == 0 && (packet->host_line.ptr[host_line_len_without_port - 9 - 4 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 9 - 4 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 9 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 9 - 5], "rapid", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 9 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 9 - 5 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 6 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 6 - 7], "mediafi", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 6 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 6 - 7 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 5 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 7], "gigasiz", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 7 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 8], "sendspac", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 7], "sharebe", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 7 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 11 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 11], "sharebigfli", 11) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 11 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 11 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 8], "fileserv", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 4 + 1 && packet->host_line.ptr[host_line_len_without_port - 4 - 1] == 's') { if (host_line_len_without_port >= 5 + 1 && packet->host_line.ptr[host_line_len_without_port - 5 - 1] == 'e') { if (host_line_len_without_port >= 6 + 10 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 6 - 10], "depositfil", 10) == 0 && (packet->host_line.ptr[host_line_len_without_port - 6 - 10 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 6 - 10 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 6 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 6 - 8], "megashar", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 6 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 6 - 8 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 5 + 10 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 10], "fileupyour", 10) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 10 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 10 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 4 + 11 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 11], "filefactory", 11) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 11 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 11 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 4 + 1 && packet->host_line.ptr[host_line_len_without_port - 4 - 1] == 't') { if (host_line_len_without_port >= 5 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 8], "filefron", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 10 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 10], "uploadingi", 10) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 10 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 10 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 11 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 11], "yourfilehos", 11) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 11 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 11 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 4 + 1 && packet->host_line.ptr[host_line_len_without_port - 4 - 1] == 'r') { if (host_line_len_without_port >= 5 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 8], "mytempdi", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 8 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 10 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 10], "uploadpowe", 10) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 10 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 10 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 4 + 9 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 9], "mega.1280", 9) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 9 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 9 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 4 + 9 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 9], "filesonic", 9) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 9 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 9 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 0 + 4 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 0 - 4], ".net", 4) == 0) { if (host_line_len_without_port >= 4 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 7], "badongo", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 7 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 4 + 1 && packet->host_line.ptr[host_line_len_without_port - 4 - 1] == 'd') { if (host_line_len_without_port >= 5 + 3 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 3], "loa", 3) == 0) { if (host_line_len_without_port >= 8 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 8 - 5], "fast-", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 8 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 8 - 5 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 8 + 2 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 8 - 2], "up", 2) == 0) { if (host_line_len_without_port >= 10 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 5], "file-", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 5 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 10 + 6 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 6], "simple", 6) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 6 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 6 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 10 + 3 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 10 - 3], "wii", 3) == 0 && (packet->host_line.ptr[host_line_len_without_port - 10 - 3 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 10 - 3 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 5 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 7], "filesen", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 7 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 4 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 5], "filer", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 5 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 4 + 9 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 9], "livedepot", 9) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 9 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 9 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 4 + 1 && packet->host_line.ptr[host_line_len_without_port - 4 - 1] == 'e') { if (host_line_len_without_port >= 5 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 5], "mofil", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 5 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 17 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 17], "odsiebie.najlepsz", 17) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 17 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 17 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 5 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 5 - 5], "zshar", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 5 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 5 - 5 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 0 + 1 && packet->host_line.ptr[host_line_len_without_port - 0 - 1] == 'u') { if (host_line_len_without_port >= 1 + 6 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 1 - 6], "data.h", 6) == 0 && (packet->host_line.ptr[host_line_len_without_port - 1 - 6 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 1 - 6 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 1 + 2 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 1 - 2], ".r", 2) == 0) { if (host_line_len_without_port >= 3 + 10 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 3 - 10], "filearchiv", 10) == 0 && (packet->host_line.ptr[host_line_len_without_port - 3 - 10 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 3 - 10 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 3 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 3 - 8], "filepost", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 3 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 3 - 8 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 3 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 3 - 7], "ifolder", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 3 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 3 - 7 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 0 + 11 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 0 - 11], "filehost.tv", 11) == 0 && (packet->host_line.ptr[host_line_len_without_port - 0 - 11 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 0 - 11 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 0 + 3 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 0 - 3], ".to", 3) == 0) { if (host_line_len_without_port >= 3 + 1 && packet->host_line.ptr[host_line_len_without_port - 3 - 1] == 'e') { if (host_line_len_without_port >= 4 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 7], "filesaf", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 7 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 4 + 8 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 8], "sharebas", 8) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 8 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 8 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 3 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 3 - 5], "files", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 3 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 3 - 5 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 3 + 1 && packet->host_line.ptr[host_line_len_without_port - 3 - 1] == 'd') { if (host_line_len_without_port >= 4 + 3 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 3], "loa", 3) == 0) { if (host_line_len_without_port >= 7 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 7 - 7], "file-up", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 7 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 7 - 7 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 4 + 3 + 1 && (packet->host_line.ptr[host_line_len_without_port - 4 - 3 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 3 - 1] == '.')) { goto end_ddl_found; } } if (host_line_len_without_port >= 4 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 4 - 7], "uploade", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 4 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 4 - 7 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 0 + 1 && packet->host_line.ptr[host_line_len_without_port - 0 - 1] == 'z') { if (host_line_len_without_port >= 1 + 14 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 1 - 14], "leteckaposta.c", 14) == 0 && (packet->host_line.ptr[host_line_len_without_port - 1 - 14 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 1 - 14 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 1 + 12 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 1 - 12], "yourfiles.bi", 12) == 0 && (packet->host_line.ptr[host_line_len_without_port - 1 - 12 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 1 - 12 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 0 + 1 && packet->host_line.ptr[host_line_len_without_port - 0 - 1] == 'n') { if (host_line_len_without_port >= 1 + 9 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 1 - 9], "netload.i", 9) == 0 && (packet->host_line.ptr[host_line_len_without_port - 1 - 9 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 1 - 9 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 1 + 2 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 1 - 2], ".v", 2) == 0) { if (host_line_len_without_port >= 3 + 7 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 3 - 7], "4shared", 7) == 0 && (packet->host_line.ptr[host_line_len_without_port - 3 - 7 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 3 - 7 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 3 + 9 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 3 - 9], "megashare", 9) == 0 && (packet->host_line.ptr[host_line_len_without_port - 3 - 9 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 3 - 9 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 0 + 3 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 0 - 3], ".de", 3) == 0) { if (host_line_len_without_port >= 3 + 5 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 3 - 5], "share", 5) == 0) { if (host_line_len_without_port >= 8 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 8 - 5], "rapid", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 8 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 8 - 5 - 1] == '.')) { goto end_ddl_found; } if (host_line_len_without_port >= 8 + 5 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 8 - 5], "ultra", 5) == 0 && (packet->host_line.ptr[host_line_len_without_port - 8 - 5 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 8 - 5 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 3 + 15 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 3 - 15], "uploadyourfiles", 15) == 0 && (packet->host_line.ptr[host_line_len_without_port - 3 - 15 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 3 - 15 - 1] == '.')) { goto end_ddl_found; } goto end_ddl_nothing_found; } if (host_line_len_without_port >= 0 + 14 + 1 && memcmp((void *) &packet->host_line.ptr[host_line_len_without_port - 0 - 14], "speedshare.org", 14) == 0 && (packet->host_line.ptr[host_line_len_without_port - 0 - 14 - 1] == ' ' || packet->host_line.ptr[host_line_len_without_port - 0 - 14 - 1] == '.')) { goto end_ddl_found; } // END OF AUTOMATED CODE GENERATION /* This is the hard way. We do this in order to find the download of services when other domains are involved. This is not significant if ddl is blocked. --> then the link can not be started because the ads are not viewed. But when ddl is only limited then the download is the important part. */ end_ddl_nothing_found: IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "Nothing Found\n%.*s\n", packet->payload_packet_len, packet->payload); return 0; end_ddl_found: IPQ_LOG(IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK, ipoque_struct, IPQ_LOG_DEBUG, "DDL: DIRECT DOWNLOAD LINK FOUND\n"); ipoque_int_direct_download_link_add_connection(ipoque_struct); return 1; } void ipoque_search_direct_download_link_tcp(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; struct ipoque_flow_struct *flow = ipoque_struct->flow; // struct ipoque_id_struct *src=ipoque_struct->src; // struct ipoque_id_struct *dst=ipoque_struct->dst; #if 0 if (ipoque_struct->direct_download_link_counter_callback != NULL) { if (packet->detected_protocol == IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK) { /* skip packets not requests from the client to the server */ if (packet->packet_direction == flow->l4.tcp.ddlink_server_direction) { search_ddl_domains(ipoque_struct); // do the detection again in order to get the URL in keep alive streams } else { // just count the packet ipoque_struct->direct_download_link_counter_callback(flow->hash_id_number, packet->l3_packet_len); } } return; } #endif // do not detect again if it is already ddl if (packet->detected_protocol_stack[0] != IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK) { if (search_ddl_domains(ipoque_struct) != 0) { return; } IPOQUE_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK); } } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/ipq_main.c0000644000000000000000000041373212000647575016303 0ustar rootroot/* * ipq_main.c * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #include "ipq_main.h" #include "ipq_protocols.h" #include "ipq_utils.h" u32 ipoque_detection_get_sizeof_ipoque_flow_struct(void) { return sizeof(struct ipoque_flow_struct); } u32 ipoque_detection_get_sizeof_ipoque_id_struct(void) { return sizeof(struct ipoque_id_struct); } struct ipoque_detection_module_struct *ipoque_init_detection_module(u32 ticks_per_second, void *(*ipoque_malloc) (unsigned long size), ipoque_debug_function_ptr ipoque_debug_printf) { struct ipoque_detection_module_struct *ipq_str; ipq_str = ipoque_malloc(sizeof(struct ipoque_detection_module_struct)); if (ipq_str == NULL) { ipoque_debug_printf(0, NULL, IPQ_LOG_DEBUG, "ipoque_init_detection_module initial malloc failed\n"); return NULL; } memset(ipq_str, 0, sizeof(struct ipoque_detection_module_struct)); IPOQUE_BITMASK_RESET(ipq_str->detection_bitmask); #ifdef IPOQUE_ENABLE_DEBUG_MESSAGES ipq_str->ipoque_debug_printf = ipoque_debug_printf; ipq_str->user_data = NULL; #endif ipq_str->ticks_per_second = ticks_per_second; ipq_str->tcp_max_retransmission_window_size = IPOQUE_DEFAULT_MAX_TCP_RETRANSMISSION_WINDOW_SIZE; ipq_str->directconnect_connection_ip_tick_timeout = IPOQUE_DIRECTCONNECT_CONNECTION_IP_TICK_TIMEOUT * ticks_per_second; ipq_str->gadugadu_peer_connection_timeout = IPOQUE_GADGADU_PEER_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->edonkey_upper_ports_only = IPOQUE_EDONKEY_UPPER_PORTS_ONLY; ipq_str->ftp_connection_timeout = IPOQUE_FTP_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->pplive_connection_timeout = IPOQUE_PPLIVE_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->rtsp_connection_timeout = IPOQUE_RTSP_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->tvants_connection_timeout = IPOQUE_TVANTS_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->irc_timeout = IPOQUE_IRC_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->gnutella_timeout = IPOQUE_GNUTELLA_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->battlefield_timeout = IPOQUE_BATTLEFIELD_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->thunder_timeout = IPOQUE_THUNDER_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->yahoo_detect_http_connections = IPOQUE_YAHOO_DETECT_HTTP_CONNECTIONS; ipq_str->yahoo_lan_video_timeout = IPOQUE_YAHOO_LAN_VIDEO_TIMEOUT * ticks_per_second; ipq_str->zattoo_connection_timeout = IPOQUE_ZATTOO_CONNECTION_TIMEOUT * ticks_per_second; ipq_str->jabber_stun_timeout = IPOQUE_JABBER_STUN_TIMEOUT * ticks_per_second; ipq_str->jabber_file_transfer_timeout = IPOQUE_JABBER_FT_TIMEOUT * ticks_per_second; ipq_str->soulseek_connection_ip_tick_timeout = IPOQUE_SOULSEEK_CONNECTION_IP_TICK_TIMEOUT * ticks_per_second; ipq_str->manolito_subscriber_timeout = IPOQUE_MANOLITO_SUBSCRIBER_TIMEOUT; return ipq_str; } void ipoque_exit_detection_module(struct ipoque_detection_module_struct *ipoque_struct, void (*ipoque_free) (void *ptr)) { if (ipoque_struct != NULL) { ipoque_free(ipoque_struct); } } void ipoque_set_protocol_detection_bitmask2(struct ipoque_detection_module_struct *ipoque_struct, const IPOQUE_PROTOCOL_BITMASK * dbm) { IPOQUE_PROTOCOL_BITMASK detection_bitmask_local; IPOQUE_PROTOCOL_BITMASK *detection_bitmask = &detection_bitmask_local; u32 a = 0; IPOQUE_BITMASK_SET(detection_bitmask_local, *dbm); IPOQUE_BITMASK_SET(ipoque_struct->detection_bitmask, *dbm); /* set this here to zero to be interrupt safe */ ipoque_struct->callback_buffer_size = 0; #ifdef IPOQUE_PROTOCOL_HTTP #ifdef IPOQUE_PROTOCOL_MPEG if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MPEG) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_FLASH if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_FLASH) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_QUICKTIME if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_QUICKTIME) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_REALMEDIA if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_REALMEDIA) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_WINDOWSMEDIA if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_WINDOWSMEDIA) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_MMS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MMS) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_OFF if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_OFF) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_XBOX if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_XBOX) != 0) goto hack_do_http_detection; #endif #ifdef NTOP_PROTOCOL_WINDOWS_UPDATE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, NTOP_PROTOCOL_WINDOWS_UPDATE) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_QQ if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_QQ) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_AVI if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_AVI) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_OGG if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_OGG) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_MOVE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MOVE) != 0) goto hack_do_http_detection; #endif #ifdef IPOQUE_PROTOCOL_RTSP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_RTSP) != 0) goto hack_do_http_detection; #endif /* HTTP DETECTION MUST BE BEFORE DDL BUT AFTER ALL OTHER PROTOCOLS WHICH USE HTTP ALSO */ if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_HTTP) != 0) { hack_do_http_detection: ipoque_struct->callback_buffer[a].func = ipoque_search_http_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_HTTP); #ifdef IPOQUE_PROTOCOL_MPEG IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_MPEG); #endif #ifdef IPOQUE_PROTOCOL_FLASH IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_FLASH); #endif #ifdef IPOQUE_PROTOCOL_QUICKTIME IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_QUICKTIME); #endif #ifdef IPOQUE_PROTOCOL_REALMEDIA IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_REALMEDIA); #endif #ifdef IPOQUE_PROTOCOL_WINDOWSMEDIA IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_WINDOWSMEDIA); #endif #ifdef IPOQUE_PROTOCOL_MMS IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_MMS); #endif #ifdef IPOQUE_PROTOCOL_OFF IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_OFF); #endif #ifdef IPOQUE_PROTOCOL_XBOX IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_XBOX); #endif #ifdef NTOP_PROTOCOL_WINDOWS_UPDATE IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_WINDOWS_UPDATE); #endif #ifdef IPOQUE_PROTOCOL_QQ IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_QQ); #endif #ifdef IPOQUE_PROTOCOL_AVI IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_AVI); #endif #ifdef IPOQUE_PROTOCOL_OGG IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_OGG); #endif #ifdef IPOQUE_PROTOCOL_MOVE IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_MOVE); #endif #ifdef IPOQUE_PROTOCOL_RTSP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_RTSP); #endif IPOQUE_BITMASK_SET(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, ipoque_struct->callback_buffer[a].detection_bitmask); IPOQUE_DEL_PROTOCOL_FROM_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_DEL_PROTOCOL_FROM_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_QQ); #ifdef IPOQUE_PROTOCOL_FLASH IPOQUE_DEL_PROTOCOL_FROM_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_FLASH); #endif IPOQUE_DEL_PROTOCOL_FROM_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MMS); #ifdef IPOQUE_PROTOCOL_RTSP IPOQUE_DEL_PROTOCOL_FROM_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_RTSP); #endif IPOQUE_DEL_PROTOCOL_FROM_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_XBOX); IPOQUE_BITMASK_SET(ipoque_struct->generic_http_packet_bitmask, ipoque_struct->callback_buffer[a].detection_bitmask); IPOQUE_DEL_PROTOCOL_FROM_BITMASK(ipoque_struct->generic_http_packet_bitmask, IPOQUE_PROTOCOL_UNKNOWN); a++; } #endif #ifdef IPOQUE_PROTOCOL_SSL if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SSL) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_ssl_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_SSL); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SSL); a++; } #endif #ifdef IPOQUE_PROTOCOL_STUN if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_STUN) != 0 #ifdef IPOQUE_PROTOCOL_RTP || IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_RTP) != 0 #endif ) { ipoque_struct->callback_buffer[a].func = ipoque_search_stun; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_STUN); a++; } #endif #ifdef IPOQUE_PROTOCOL_RTP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_RTP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_rtp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); #ifdef IPOQUE_PROTOCOL_STUN IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_STUN); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_RTP); /* consider also real protocol for detection select in main loop */ ipoque_struct->callback_buffer[a].detection_feature = IPOQUE_SELECT_DETECTION_WITH_REAL_PROTOCOL; a++; } #endif #ifdef IPOQUE_PROTOCOL_RDP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_RDP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_rdp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_RDP); a++; } #endif #ifdef IPOQUE_PROTOCOL_SIP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SIP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_sip; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; /* Fix courtesy of Miguel Quesada */ IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_SIP); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SIP); a++; } #endif #ifdef IPOQUE_PROTOCOL_BITTORRENT if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_BITTORRENT) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_bittorrent; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_BITTORRENT); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_BITTORRENT); a++; } #endif #ifdef IPOQUE_PROTOCOL_EDONKEY if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_EDONKEY) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_edonkey; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_EDONKEY); #ifdef IPOQUE_PROTOCOL_BITTORRENT IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_BITTORRENT); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_EDONKEY); a++; } #endif #ifdef IPOQUE_PROTOCOL_FASTTRACK if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_FASTTRACK) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_fasttrack_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_FASTTRACK); a++; } #endif #ifdef IPOQUE_PROTOCOL_GNUTELLA if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_GNUTELLA) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_gnutella; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); #ifdef IPOQUE_PROTOCOL_XBOX IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_XBOX); #endif #ifdef NTOP_PROTOCOL_WINDOWS_UPDATE IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_WINDOWS_UPDATE); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_GNUTELLA); a++; } #endif #ifdef IPOQUE_PROTOCOL_WINMX if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_WINMX) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_winmx_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_WINMX); a++; } #endif #ifdef IPOQUE_PROTOCOL_DIRECTCONNECT if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_DIRECTCONNECT) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_directconnect; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_DIRECTCONNECT); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_DIRECTCONNECT); a++; } #endif #ifdef IPOQUE_PROTOCOL_MSN if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MSN) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_msn; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_MSN); #ifdef IPOQUE_PROTOCOL_HTTP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_HTTP); #endif #ifdef IPOQUE_PROTOCOL_SSL IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_SSL); #endif IPOQUE_BITMASK_RESET(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MSN); a++; } #endif #ifdef IPOQUE_PROTOCOL_YAHOO if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_YAHOO) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_yahoo; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_YAHOO); #ifdef IPOQUE_PROTOCOL_SSL IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_SSL); #endif #ifdef IPOQUE_PROTOCOL_HTTP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_HTTP); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_YAHOO); a++; } #endif #ifdef IPOQUE_PROTOCOL_OSCAR if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_OSCAR) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_oscar; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_OSCAR); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_OSCAR); a++; } #endif #ifdef IPOQUE_PROTOCOL_APPLEJUICE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_APPLEJUICE) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_applejuice_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_APPLEJUICE); a++; } #endif #ifdef IPOQUE_PROTOCOL_SOULSEEK if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SOULSEEK) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_soulseek_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_SOULSEEK); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SOULSEEK); a++; } #endif #ifdef IPOQUE_PROTOCOL_IRC if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_IRC) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_irc_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_IRC); #ifdef IPOQUE_PROTOCOL_HTTP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_HTTP); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_IRC); a++; } #endif #ifdef IPOQUE_PROTOCOL_UNENCRYPED_JABBER if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_UNENCRYPED_JABBER) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_jabber_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNENCRYPED_JABBER); #ifdef IPOQUE_PROTOCOL_SSL IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_SSL); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_UNENCRYPED_JABBER); #ifdef IPOQUE_PROTOCOL_TRUPHONE /* also exlude truphone since this is detected in jabber */ IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_TRUPHONE); #endif a++; } #endif #ifdef IPOQUE_PROTOCOL_MAIL_POP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MAIL_POP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_mail_pop_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MAIL_POP); a++; } #endif #ifdef IPOQUE_PROTOCOL_MAIL_IMAP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MAIL_IMAP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_mail_imap_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MAIL_IMAP); a++; } #endif #ifdef IPOQUE_PROTOCOL_MAIL_SMTP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MAIL_SMTP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_mail_smtp_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MAIL_SMTP); a++; } #endif #ifdef IPOQUE_PROTOCOL_FTP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_FTP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_ftp_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_FTP); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_FTP); a++; } #endif #ifdef IPOQUE_PROTOCOL_USENET if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_USENET) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_usenet_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_USENET); a++; } #endif #ifdef IPOQUE_PROTOCOL_DNS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_DNS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_dns; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_DNS); a++; } #endif #ifdef IPOQUE_PROTOCOL_FILETOPIA if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_FILETOPIA) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_filetopia_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_FILETOPIA); a++; } #endif #ifdef IPOQUE_PROTOCOL_MANOLITO if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MANOLITO) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_manolito_tcp_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MANOLITO); a++; } #endif #ifdef IPOQUE_PROTOCOL_IMESH if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_IMESH) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_imesh_tcp_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_SSL); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_IMESH); a++; } #endif #ifdef IPOQUE_PROTOCOL_MMS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MMS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_mms_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MMS); a++; } #endif #ifdef IPOQUE_PROTOCOL_PANDO if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_PANDO) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_pando_tcp_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_PANDO); a++; } #endif #if defined(IPOQUE_PROTOCOL_IPSEC) || defined(IPOQUE_PROTOCOL_GRE) || defined(IPOQUE_PROTOCOL_ICMP) || defined(IPOQUE_PROTOCOL_IGMP) || defined(IPOQUE_PROTOCOL_EGP) || defined(IPOQUE_PROTOCOL_SCTP) || defined(IPOQUE_PROTOCOL_OSPF) || defined(IPOQUE_PROTOCOL_IP_IN_IP) || defined(IPOQUE_PROTOCOL_ICMPV6) /* always add non tcp/udp if one protocol is compiled in */ if (1) { ipoque_struct->callback_buffer[a].func = ipoque_search_in_non_tcp_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_IPV4_OR_IPV6; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_BITMASK_RESET(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask); #ifdef IPOQUE_PROTOCOL_IPSEC IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_IPSEC); #endif #ifdef IPOQUE_PROTOCOL_GRE IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_GRE); #endif #ifdef IPOQUE_PROTOCOL_IGMP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_ICMP); #endif #ifdef IPOQUE_PROTOCOL_IGMP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_IGMP); #endif #ifdef IPOQUE_PROTOCOL_EGP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_EGP); #endif #ifdef IPOQUE_PROTOCOL_SCTP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SCTP); #endif #ifdef IPOQUE_PROTOCOL_OSPF IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_OSPF); #endif #ifdef IPOQUE_PROTOCOL_IP_IN_IP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_IP_IN_IP); #endif #ifdef IPOQUE_PROTOCOL_ICMPV6 IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_ICMPV6); #endif a++; } #endif #ifdef IPOQUE_PROTOCOL_TVANTS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_TVANTS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_tvants_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_TVANTS); a++; } #endif #ifdef IPOQUE_PROTOCOL_SOPCAST if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SOPCAST) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_sopcast; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SOPCAST); a++; } #endif #ifdef IPOQUE_PROTOCOL_TVUPLAYER if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_TVUPLAYER) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_tvuplayer; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_TVUPLAYER); a++; } #endif #ifdef IPOQUE_PROTOCOL_PPSTREAM if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_PPSTREAM) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_ppstream; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_PPSTREAM); a++; } #endif #ifdef IPOQUE_PROTOCOL_PPLIVE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_PPLIVE) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_pplive_tcp_udp; IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_PPLIVE); ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_PPLIVE); a++; } #endif #ifdef IPOQUE_PROTOCOL_IAX if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_IAX) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_iax; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_IAX); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_IAX); a++; } #endif #ifdef IPOQUE_PROTOCOL_MGCP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MGCP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_mgcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); //IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_MGCP); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MGCP); a++; } #endif #ifdef IPOQUE_PROTOCOL_GADUGADU if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_GADUGADU) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_gadugadu; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); #ifdef IPOQUE_PROTOCOL_HTTP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_HTTP); #endif IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_GADUGADU); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_GADUGADU); a++; } #endif #ifdef IPOQUE_PROTOCOL_ZATTOO if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_ZATTOO) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_zattoo; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_ZATTOO); #ifdef IPOQUE_PROTOCOL_FLASH IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_FLASH); #endif #ifdef IPOQUE_PROTOCOL_HTTP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_HTTP); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_ZATTOO); a++; } #endif #ifdef IPOQUE_PROTOCOL_QQ if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_QQ) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_qq; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_QQ); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_QQ); a++; } #endif #ifdef IPOQUE_PROTOCOL_FEIDIAN if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_FEIDIAN) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_feidian; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_FEIDIAN); a++; } #endif #ifdef IPOQUE_PROTOCOL_SSH if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SSH) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_ssh_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SSH); a++; } #endif #ifdef IPOQUE_PROTOCOL_POPO if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_POPO) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_popo_tcp_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_POPO); a++; } #endif #ifdef IPOQUE_PROTOCOL_THUNDER if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_THUNDER) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_thunder; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_THUNDER); a++; } #endif #ifdef IPOQUE_PROTOCOL_VNC if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_VNC) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_vnc_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_VNC); a++; } #endif #ifdef NTOP_PROTOCOL_TEAMVIEWER if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, NTOP_PROTOCOL_TEAMVIEWER) != 0) { ipoque_struct->callback_buffer[a].func = ntop_search_teamview; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_TEAMVIEWER); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, NTOP_PROTOCOL_TEAMVIEWER); a++; } #endif #ifdef IPOQUE_PROTOCOL_DHCP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_DHCP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_dhcp_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_DHCP); a++; } #endif #ifdef IPOQUE_PROTOCOL_I23V5 if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_I23V5) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_i23v5; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_I23V5); a++; } #endif #ifdef IPOQUE_PROTOCOL_SOCRATES if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SOCRATES) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_socrates; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SOCRATES); a++; } #endif #ifdef IPOQUE_PROTOCOL_STEAM if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_STEAM) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_steam; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_STEAM); a++; } #endif #ifdef IPOQUE_PROTOCOL_HALFLIFE2 if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_HALFLIFE2) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_halflife2; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_HALFLIFE2); a++; } #endif #ifdef IPOQUE_PROTOCOL_XBOX if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_XBOX) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_xbox; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_XBOX); a++; } #endif #ifdef IPOQUE_PROTOCOL_HTTP_APPLICATION_ACTIVESYNC if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_HTTP_APPLICATION_ACTIVESYNC) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_activesync; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP_APPLICATION_ACTIVESYNC); a++; } #endif #ifdef IPOQUE_PROTOCOL_SMB if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SMB) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_smb_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SMB); a++; } #endif #ifdef IPOQUE_PROTOCOL_TELNET if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_TELNET) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_telnet_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_TELNET); a++; } #endif #ifdef IPOQUE_PROTOCOL_NTP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_NTP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_ntp_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_NTP); a++; } #endif #ifdef IPOQUE_PROTOCOL_NFS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_NFS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_nfs; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_NFS); a++; } #endif #ifdef IPOQUE_PROTOCOL_SSDP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SSDP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_ssdp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SSDP); a++; } #endif #ifdef IPOQUE_PROTOCOL_WORLDOFWARCRAFT if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_WORLDOFWARCRAFT) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_worldofwarcraft; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_WORLDOFWARCRAFT); a++; } #endif #ifdef IPOQUE_PROTOCOL_FLASH if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_FLASH) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_flash; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_FLASH); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_FLASH); a++; } #endif #ifdef IPOQUE_PROTOCOL_POSTGRES if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_POSTGRES) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_postgres_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_POSTGRES); a++; } #endif #ifdef IPOQUE_PROTOCOL_MYSQL if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MYSQL) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_mysql_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MYSQL); a++; } #endif #ifdef IPOQUE_PROTOCOL_BGP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_BGP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_bgp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_BGP); a++; } #endif #ifdef IPOQUE_PROTOCOL_QUAKE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_QUAKE) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_quake; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_QUAKE); a++; } #endif #ifdef IPOQUE_PROTOCOL_BATTLEFIELD if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_BATTLEFIELD) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_battlefield; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_BATTLEFIELD); a++; } #endif #ifdef IPOQUE_PROTOCOL_SECONDLIFE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SECONDLIFE) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_secondlife; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); #ifdef IPOQUE_PROTOCOL_SSL IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_SSL); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SECONDLIFE); a++; } #endif #ifdef IPOQUE_PROTOCOL_PCANYWHERE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_PCANYWHERE) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_pcanywhere; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_PCANYWHERE); a++; } #endif #ifdef IPOQUE_PROTOCOL_SNMP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SNMP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_snmp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SNMP); a++; } #endif #ifdef IPOQUE_PROTOCOL_KONTIKI if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_KONTIKI) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_kontiki; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_KONTIKI); a++; } #endif #ifdef IPOQUE_PROTOCOL_ICECAST if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_ICECAST) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_icecast_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); #ifdef IPOQUE_PROTOCOL_HTTP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_HTTP); #endif #ifdef IPOQUE_PROTOCOL_MPEG IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_MPEG); #endif #ifdef IPOQUE_PROTOCOL_QUICKTIME IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_QUICKTIME); #endif #ifdef IPOQUE_PROTOCOL_REALMEDIA IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_REALMEDIA); #endif #ifdef IPOQUE_PROTOCOL_WINDOWSMEDIA IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_WINDOWSMEDIA); #endif #ifdef IPOQUE_PROTOCOL_AVI IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_AVI); #endif #ifdef IPOQUE_PROTOCOL_OGG IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_OGG); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_ICECAST); a++; } #endif #ifdef IPOQUE_PROTOCOL_SHOUTCAST if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SHOUTCAST) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_shoutcast_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); #ifdef IPOQUE_PROTOCOL_HTTP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_HTTP); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SHOUTCAST); a++; } #endif #ifdef IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_veohtv_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); #ifdef IPOQUE_PROTOCOL_HTTP IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_HTTP); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV); a++; } #endif #ifdef IPOQUE_PROTOCOL_KERBEROS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_KERBEROS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_kerberos; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_KERBEROS); a++; } #endif #ifdef IPOQUE_PROTOCOL_OPENFT if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_OPENFT) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_openft_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_OPENFT); a++; } #endif #ifdef IPOQUE_PROTOCOL_SYSLOG if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_SYSLOG) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_syslog; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_SYSLOG); a++; } #endif #ifdef IPOQUE_PROTOCOL_TDS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_TDS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_tds_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_TDS); a++; } #endif #ifdef IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_direct_download_link_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK); a++; } #endif #ifdef IPOQUE_PROTOCOL_NETBIOS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_NETBIOS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_netbios; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_NETBIOS); a++; } #endif #ifdef IPOQUE_PROTOCOL_MDNS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MDNS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_mdns; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MDNS); a++; } #endif #ifdef IPOQUE_PROTOCOL_IPP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_IPP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_ipp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_IPP); a++; } #endif #ifdef IPOQUE_PROTOCOL_LDAP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_LDAP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_ldap; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_LDAP); a++; } #endif #ifdef IPOQUE_PROTOCOL_WARCRAFT3 if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_WARCRAFT3) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_warcraft3; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_WARCRAFT3); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_WARCRAFT3); a++; } #endif #ifdef IPOQUE_PROTOCOL_XDMCP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_XDMCP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_xdmcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_XDMCP); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_XDMCP); a++; } #endif #ifdef IPOQUE_PROTOCOL_TFTP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_TFTP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_tftp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_TFTP); a++; } #endif #ifdef IPOQUE_PROTOCOL_MSSQL if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MSSQL) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_mssql; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MSSQL); a++; } #endif #ifdef IPOQUE_PROTOCOL_PPTP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_PPTP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_pptp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_PPTP); a++; } #endif #ifdef IPOQUE_PROTOCOL_STEALTHNET if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_STEALTHNET) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_stealthnet; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_STEALTHNET); a++; } #endif #ifdef IPOQUE_PROTOCOL_DHCPV6 if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_DHCPV6) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_dhcpv6_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_DHCPV6); a++; } #endif #ifdef IPOQUE_PROTOCOL_MEEBO if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MEEBO) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_meebo; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); #ifdef IPOQUE_PROTOCOL_FLASH IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_FLASH); #endif IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MEEBO); a++; } #endif #ifdef IPOQUE_PROTOCOL_AFP if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_AFP) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_afp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_AFP); a++; } #endif #ifdef IPOQUE_PROTOCOL_AIMINI if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_AIMINI) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_aimini; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_AIMINI); a++; } #endif #ifdef IPOQUE_PROTOCOL_FLORENSIA if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_FLORENSIA) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_florensia; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_FLORENSIA); a++; } #endif #ifdef IPOQUE_PROTOCOL_MAPLESTORY if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_MAPLESTORY) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_maplestory; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_MAPLESTORY); a++; } #endif #ifdef IPOQUE_PROTOCOL_DOFUS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_DOFUS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_dofus; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_DOFUS); a++; } #endif #ifdef IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_world_of_kung_fu; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU); a++; } #endif #ifdef IPOQUE_PROTOCOL_FIESTA if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_FIESTA) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_fiesta; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_FIESTA); a++; } #endif #ifdef IPOQUE_PROTOCOL_CROSSFIRE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_CROSSFIRE) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_crossfire_tcp_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_CROSSFIRE); a++; } #endif #ifdef IPOQUE_PROTOCOL_GUILDWARS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_GUILDWARS) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_guildwars_tcp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_GUILDWARS); a++; } #endif #ifdef IPOQUE_PROTOCOL_ARMAGETRON if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, IPOQUE_PROTOCOL_ARMAGETRON) != 0) { ipoque_struct->callback_buffer[a].func = ipoque_search_armagetron_udp; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, IPOQUE_PROTOCOL_ARMAGETRON); a++; } #endif #ifdef NTOP_PROTOCOL_DROPBOX if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, NTOP_PROTOCOL_DROPBOX) != 0) { ipoque_struct->callback_buffer[a].func = ntop_search_dropbox; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_DROPBOX); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, NTOP_PROTOCOL_DROPBOX); a++; } #endif #ifdef NTOP_PROTOCOL_SKYPE if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, NTOP_PROTOCOL_SKYPE) != 0) { ipoque_struct->callback_buffer[a].func = ntop_search_skype; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_SKYPE); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, NTOP_PROTOCOL_SKYPE); a++; } #endif #ifdef NTOP_PROTOCOL_RADIUS if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, NTOP_PROTOCOL_RADIUS) != 0) { ipoque_struct->callback_buffer[a].func = ntop_search_radius; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_RADIUS); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, NTOP_PROTOCOL_RADIUS); a++; } #endif #ifdef NTOP_PROTOCOL_CITRIX if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, NTOP_PROTOCOL_CITRIX) != 0) { ipoque_struct->callback_buffer[a].func = ntop_search_citrix; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_CITRIX); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, NTOP_PROTOCOL_CITRIX); a++; } #endif #ifdef NTOP_PROTOCOL_DCERPC if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, NTOP_PROTOCOL_DCERPC) != 0) { ipoque_struct->callback_buffer[a].func = ntop_search_dcerpc; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_DCERPC); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, NTOP_PROTOCOL_DCERPC); a++; } #endif #ifdef NTOP_PROTOCOL_NETFLOW if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, NTOP_PROTOCOL_NETFLOW) != 0) { ipoque_struct->callback_buffer[a].func = ntop_search_netflow; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_NETFLOW); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, NTOP_PROTOCOL_NETFLOW); a++; } #endif #ifdef NTOP_PROTOCOL_SFLOW if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(*detection_bitmask, NTOP_PROTOCOL_SFLOW) != 0) { ipoque_struct->callback_buffer[a].func = ntop_search_sflow; ipoque_struct->callback_buffer[a].ipq_selection_bitmask = IPQ_SELECTION_BITMASK_PROTOCOL_UDP_WITH_PAYLOAD; IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, IPOQUE_PROTOCOL_UNKNOWN); IPOQUE_ADD_PROTOCOL_TO_BITMASK(ipoque_struct->callback_buffer[a].detection_bitmask, NTOP_PROTOCOL_SFLOW); IPOQUE_SAVE_AS_BITMASK(ipoque_struct->callback_buffer[a].excluded_protocol_bitmask, NTOP_PROTOCOL_SFLOW); a++; } #endif ipoque_struct->callback_buffer_size = a; IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "callback_buffer_size is %u\n", ipoque_struct->callback_buffer_size); /* now build the specific buffer for tcp, udp and non_tcp_udp */ ipoque_struct->callback_buffer_size_tcp_payload = 0; ipoque_struct->callback_buffer_size_tcp_no_payload = 0; for (a = 0; a < ipoque_struct->callback_buffer_size; a++) { if ((ipoque_struct->callback_buffer[a].ipq_selection_bitmask & (IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_COMPLETE_TRAFFIC)) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "callback_buffer_tcp_payload, adding buffer %u as entry %u\n", a, ipoque_struct->callback_buffer_size_tcp_payload); memcpy(&ipoque_struct->callback_buffer_tcp_payload[ipoque_struct->callback_buffer_size_tcp_payload], &ipoque_struct->callback_buffer[a], sizeof(struct ipq_call_function_struct)); ipoque_struct->callback_buffer_size_tcp_payload++; if ((ipoque_struct-> callback_buffer[a].ipq_selection_bitmask & IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "callback_buffer_tcp_no_payload, additional adding buffer %u to no_payload process\n", a); memcpy(&ipoque_struct->callback_buffer_tcp_no_payload [ipoque_struct->callback_buffer_size_tcp_no_payload], &ipoque_struct->callback_buffer[a], sizeof(struct ipq_call_function_struct)); ipoque_struct->callback_buffer_size_tcp_no_payload++; } } } ipoque_struct->callback_buffer_size_udp = 0; for (a = 0; a < ipoque_struct->callback_buffer_size; a++) { if ((ipoque_struct->callback_buffer[a].ipq_selection_bitmask & (IPQ_SELECTION_BITMASK_PROTOCOL_INT_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_COMPLETE_TRAFFIC)) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "callback_buffer_size_udp, adding buffer %u\n", a); memcpy(&ipoque_struct->callback_buffer_udp[ipoque_struct->callback_buffer_size_udp], &ipoque_struct->callback_buffer[a], sizeof(struct ipq_call_function_struct)); ipoque_struct->callback_buffer_size_udp++; } } ipoque_struct->callback_buffer_size_non_tcp_udp = 0; for (a = 0; a < ipoque_struct->callback_buffer_size; a++) { if ((ipoque_struct->callback_buffer[a].ipq_selection_bitmask & (IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_INT_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP_OR_UDP)) == 0 || (ipoque_struct-> callback_buffer[a].ipq_selection_bitmask & IPQ_SELECTION_BITMASK_PROTOCOL_COMPLETE_TRAFFIC) != 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "callback_buffer_size_non_tcp_udp, adding buffer %u\n", a); memcpy(&ipoque_struct->callback_buffer_non_tcp_udp[ipoque_struct->callback_buffer_size_non_tcp_udp], &ipoque_struct->callback_buffer[a], sizeof(struct ipq_call_function_struct)); ipoque_struct->callback_buffer_size_non_tcp_udp++; } } } #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 /* handle extension headers in IPv6 packets * arguments: * l4ptr: pointer to the byte following the initial IPv6 header * l4len: the length of the IPv6 packet excluding the IPv6 header * nxt_hdr: next header value from the IPv6 header * result: * l4ptr: pointer to the start of the actual packet payload * l4len: length of the actual payload * nxt_hdr: protocol of the actual payload * returns 0 upon success and 1 upon failure */ static int ipq_handle_ipv6_extension_headers(struct ipoque_detection_module_struct *ipoque_struct, const u8 ** l4ptr, u16 * l4len, u8 * nxt_hdr) { while ((*nxt_hdr == 0 || *nxt_hdr == 43 || *nxt_hdr == 44 || *nxt_hdr == 60 || *nxt_hdr == 135 || *nxt_hdr == 59)) { u16 ehdr_len; // no next header if (*nxt_hdr == 59) { return 1; } // fragment extension header has fixed size of 8 bytes and the first byte is the next header type if (*nxt_hdr == 44) { if (*l4len < 8) { return 1; } *nxt_hdr = (*l4ptr)[0]; *l4len -= 8; (*l4ptr) += 8; continue; } // the other extension headers have one byte for the next header type // and one byte for the extension header length in 8 byte steps minus the first 8 bytes ehdr_len = (*l4ptr)[1]; ehdr_len *= 8; ehdr_len += 8; if (*l4len < ehdr_len) { return 1; } *nxt_hdr = (*l4ptr)[0]; *l4len -= ehdr_len; (*l4ptr) += ehdr_len; } return 0; } #endif /* IPOQUE_DETECTION_SUPPORT_IPV6 */ static u8 ipoque_iph_is_valid_and_not_fragmented(const struct iphdr *iph, const u16 ipsize) { if (ipsize < iph->ihl * 4 || ipsize < ntohs(iph->tot_len) || ntohs(iph->tot_len) < iph->ihl * 4 || (iph->frag_off & htons(0x1FFF)) != 0) { return 0; } return 1; } static u8 ipoque_detection_get_l4_internal(struct ipoque_detection_module_struct *ipoque_struct, const u8 * l3, u16 l3_len, const u8 ** l4_return, u16 * l4_len_return, u8 * l4_protocol_return, u32 flags) { const struct iphdr *iph = NULL; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 const struct ipq_ipv6hdr *iph_v6 = NULL; #endif u16 l4len = 0; const u8 *l4ptr = NULL; u8 l4protocol = 0; if (l3 == NULL || l3_len < sizeof(struct iphdr)) return 1; iph = (const struct iphdr *) l3; if (iph->version == 4 && iph->ihl >= 5) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "ipv4 header\n"); } #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 else if (iph->version == 6 && l3_len >= sizeof(struct ipq_ipv6hdr)) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "ipv6 header\n"); iph_v6 = (const struct ipq_ipv6hdr *) iph; iph = NULL; } #endif else { return 1; } if ((flags & IPOQUE_DETECTION_ONLY_IPV6) && iph != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "ipv4 header found but excluded by flag\n"); return 1; } #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 else if ((flags & IPOQUE_DETECTION_ONLY_IPV4) && iph_v6 != NULL) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "ipv6 header found but excluded by flag\n"); return 1; } #endif if (iph != NULL && ipoque_iph_is_valid_and_not_fragmented(iph, l3_len)) { l4ptr = (((const u8 *) iph) + iph->ihl * 4); l4len = ntohs(iph->tot_len) - (iph->ihl * 4); l4protocol = iph->protocol; } #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 else if (iph_v6 != NULL && (l3_len - sizeof(struct ipq_ipv6hdr)) >= ntohs(iph_v6->payload_len)) { l4ptr = (((const u8 *) iph_v6) + sizeof(struct ipq_ipv6hdr)); l4len = ntohs(iph_v6->payload_len); l4protocol = iph_v6->nexthdr; // we need to handle IPv6 extension headers if present if (ipq_handle_ipv6_extension_headers(ipoque_struct, &l4ptr, &l4len, &l4protocol) != 0) { return 1; } } #endif else { return 1; } if (l4_return != NULL) { *l4_return = l4ptr; } if (l4_len_return != NULL) { *l4_len_return = l4len; } if (l4_protocol_return != NULL) { *l4_protocol_return = l4protocol; } return 0; } #if !(defined(HAVE_NTOP) && defined(WIN32)) #define ATTRIBUTE_ALWAYS_INLINE static inline #else __forceinline static #endif void ipoque_apply_flow_protocol_to_packet(struct ipoque_flow_struct *flow, struct ipoque_packet_struct *packet) { memcpy(&packet->detected_protocol_stack[0], &flow->detected_protocol_stack[0], sizeof(packet->detected_protocol_stack)); #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 memcpy(&packet->protocol_stack_info, &flow->protocol_stack_info, sizeof(packet->protocol_stack_info)); #endif } static int ipq_init_packet_header(struct ipoque_detection_module_struct *ipoque_struct, unsigned short packetlen) { const struct iphdr *decaps_iph = NULL; u16 l3len; u16 l4len; const u8 *l4ptr; u8 l4protocol; u8 l4_result; struct ipoque_flow_struct *flow = ipoque_struct->flow; /* reset payload_packet_len, will be set if ipv4 tcp or udp */ ipoque_struct->packet.payload_packet_len = 0; ipoque_struct->packet.l4_packet_len = 0; ipoque_struct->packet.l3_packet_len = packetlen; ipoque_struct->packet.tcp = NULL; ipoque_struct->packet.udp = NULL; ipoque_struct->packet.generic_l4_ptr = NULL; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 ipoque_struct->packet.iphv6 = NULL; #endif /* IPOQUE_DETECTION_SUPPORT_IPV6 */ if (flow) { ipoque_apply_flow_protocol_to_packet(flow, &ipoque_struct->packet); } else { ipoque_int_reset_packet_protocol(ipoque_struct); } l3len = ipoque_struct->packet.l3_packet_len; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (ipoque_struct->packet.iph != NULL) { #endif /* IPOQUE_DETECTION_SUPPORT_IPV6 */ decaps_iph = ipoque_struct->packet.iph; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 } #endif /* IPOQUE_DETECTION_SUPPORT_IPV6 */ if (decaps_iph->version == 4 && decaps_iph->ihl >= 5) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "ipv4 header\n"); } #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 else if (decaps_iph->version == 6 && l3len >= sizeof(struct ipq_ipv6hdr) && (ipoque_struct->ip_version_limit & IPOQUE_DETECTION_ONLY_IPV4) == 0) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "ipv6 header\n"); ipoque_struct->packet.iphv6 = (struct ipq_ipv6hdr *) ipoque_struct->packet.iph; ipoque_struct->packet.iph = NULL; } #endif else { ipoque_struct->packet.iph = NULL; return 1; } /* needed: * - unfragmented packets * - ip header <= packet len * - ip total length >= packet len */ l4ptr = NULL; l4len = 0; l4protocol = 0; l4_result = ipoque_detection_get_l4_internal(ipoque_struct, (const u8 *) decaps_iph, l3len, &l4ptr, &l4len, &l4protocol, 0); if (l4_result != 0) { return 1; } ipoque_struct->packet.l4_protocol = l4protocol; ipoque_struct->packet.l4_packet_len = l4len; /* tcp / udp detection */ if (l4protocol == 6 /* TCP */ && ipoque_struct->packet.l4_packet_len >= 20 /* min size of tcp */ ) { /* tcp */ ipoque_struct->packet.tcp = (struct tcphdr *) l4ptr; if (ipoque_struct->packet.l4_packet_len >= ipoque_struct->packet.tcp->doff * 4) { ipoque_struct->packet.payload_packet_len = ipoque_struct->packet.l4_packet_len - ipoque_struct->packet.tcp->doff * 4; ipoque_struct->packet.actual_payload_len = ipoque_struct->packet.payload_packet_len; ipoque_struct->packet.payload = ((u8 *) ipoque_struct->packet.tcp) + (ipoque_struct->packet.tcp->doff * 4); /* check for new tcp syn packets, here * idea: reset detection state if a connection is unknown */ if (ipoque_struct->packet.tcp->syn != 0 && ipoque_struct->packet.tcp->ack == 0 && ipoque_struct->flow != NULL && ipoque_struct->flow->init_finished != 0 && ipoque_struct->flow->detected_protocol_stack[0] == IPOQUE_PROTOCOL_UNKNOWN) { memset(ipoque_struct->flow, 0, sizeof(*(ipoque_struct->flow))); IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "%s:%u: tcp syn packet for unknown protocol, reset detection state\n", __FUNCTION__, __LINE__); } } else { /* tcp header not complete */ ipoque_struct->packet.tcp = NULL; } } else if (l4protocol == 17 /* udp */ && ipoque_struct->packet.l4_packet_len >= 8 /* size of udp */ ) { ipoque_struct->packet.udp = (struct udphdr *) l4ptr; ipoque_struct->packet.payload_packet_len = ipoque_struct->packet.l4_packet_len - 8; ipoque_struct->packet.payload = ((u8 *) ipoque_struct->packet.udp) + 8; } else { ipoque_struct->packet.generic_l4_ptr = l4ptr; } return 0; } #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_connection_tracking(struct ipoque_detection_module_struct *ipoque_struct) { /* const for gcc code optimisation and cleaner code */ struct ipoque_packet_struct *packet = &ipoque_struct->packet; const struct iphdr *iph = packet->iph; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 const struct ipq_ipv6hdr *iphv6 = packet->iphv6; #endif const struct tcphdr *tcph = packet->tcp; //const struct udphdr *udph=ipoque_struct->packet.udp; struct ipoque_flow_struct *flow = ipoque_struct->flow; //struct ipoque_unique_flow_struct unique_flow; //uint8_t new_connection; u8 proxy_enabled = 0; packet->tcp_retransmission = 0; packet->packet_direction = 0; if (iph != NULL && iph->saddr < iph->daddr) packet->packet_direction = 1; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (iphv6 != NULL && IPOQUE_COMPARE_IPV6_ADDRESS_STRUCTS(&iphv6->saddr, &iphv6->daddr) != 0) packet->packet_direction = 1; #endif packet->packet_lines_parsed_complete = 0; packet->packet_unix_lines_parsed_complete = 0; if (flow == NULL) return; if (flow->init_finished == 0) { flow->init_finished = 1; flow->setup_packet_direction = packet->packet_direction; } if (tcph != NULL) { /* reset retried bytes here before setting it */ packet->num_retried_bytes = 0; if (tcph->syn != 0 && tcph->ack == 0 && flow->l4.tcp.seen_syn == 0 && flow->l4.tcp.seen_syn_ack == 0 && flow->l4.tcp.seen_ack == 0) { flow->l4.tcp.seen_syn = 1; } if (tcph->syn != 0 && tcph->ack != 0 && flow->l4.tcp.seen_syn == 1 && flow->l4.tcp.seen_syn_ack == 0 && flow->l4.tcp.seen_ack == 0) { flow->l4.tcp.seen_syn_ack = 1; } if (tcph->syn == 0 && tcph->ack == 1 && flow->l4.tcp.seen_syn == 1 && flow->l4.tcp.seen_syn_ack == 1 && flow->l4.tcp.seen_ack == 0) { flow->l4.tcp.seen_ack = 1; } if ((flow->next_tcp_seq_nr[0] == 0 && flow->next_tcp_seq_nr[1] == 0) || (proxy_enabled && (flow->next_tcp_seq_nr[0] == 0 || flow->next_tcp_seq_nr[1] == 0))) { /* initalize tcp sequence counters */ /* the ack flag needs to be set to get valid sequence numbers from the other * direction. Usually it will catch the second packet syn+ack but it works * also for asymmetric traffic where it will use the first data packet * * if the syn flag is set add one to the sequence number, * otherwise use the payload length. */ if (tcph->ack != 0) { flow->next_tcp_seq_nr[ipoque_struct->packet.packet_direction] = ntohl(tcph->seq) + (tcph->syn ? 1 : packet->payload_packet_len); if (!proxy_enabled) { flow->next_tcp_seq_nr[1 - ipoque_struct->packet.packet_direction] = ntohl(tcph->ack_seq); } } } else if (packet->payload_packet_len > 0) { /* check tcp sequence counters */ if (((u32) (ntohl(tcph->seq) - flow->next_tcp_seq_nr[packet->packet_direction])) > ipoque_struct->tcp_max_retransmission_window_size) { packet->tcp_retransmission = 1; /*CHECK IF PARTIAL RETRY IS HAPPENENING */ if ((flow->next_tcp_seq_nr[packet->packet_direction] - ntohl(tcph->seq) < packet->payload_packet_len)) { /* num_retried_bytes actual_payload_len hold info about the partial retry analyzer which require this info can make use of this info Other analyzer can use packet->payload_packet_len */ packet->num_retried_bytes = flow->next_tcp_seq_nr[packet->packet_direction] - ntohl(tcph->seq); packet->actual_payload_len = packet->payload_packet_len - packet->num_retried_bytes; flow->next_tcp_seq_nr[packet->packet_direction] = ntohl(tcph->seq) + packet->payload_packet_len; } } /*normal path actual_payload_len is initialized to payload_packet_len during tcp header parsing itself. It will be changed only in case of retransmission */ else { packet->num_retried_bytes = 0; flow->next_tcp_seq_nr[packet->packet_direction] = ntohl(tcph->seq) + packet->payload_packet_len; } } if (tcph->rst) { flow->next_tcp_seq_nr[0] = 0; flow->next_tcp_seq_nr[1] = 0; } } if (flow->packet_counter < MAX_PACKET_COUNTER && packet->payload_packet_len) { flow->packet_counter++; } if (flow->packet_direction_counter[packet->packet_direction] < MAX_PACKET_COUNTER && packet->payload_packet_len) { flow->packet_direction_counter[packet->packet_direction]++; } if (flow->byte_counter[packet->packet_direction] + packet->payload_packet_len > flow->byte_counter[packet->packet_direction]) { flow->byte_counter[packet->packet_direction] += packet->payload_packet_len; } } unsigned int ipoque_detection_process_packet(struct ipoque_detection_module_struct *ipoque_struct, void *flow, const unsigned char *packet, const unsigned short packetlen, const IPOQUE_TIMESTAMP_COUNTER_SIZE current_tick, void *src, void *dst) { u32 a; IPQ_SELECTION_BITMASK_PROTOCOL_SIZE ipq_selection_packet; IPOQUE_PROTOCOL_BITMASK detection_bitmask; /* need at least 20 bytes for ip header */ if (packetlen < 20) { /* reset protocol which is normally done in init_packet_header */ ipoque_int_reset_packet_protocol(ipoque_struct); return IPOQUE_PROTOCOL_UNKNOWN; } ipoque_struct->packet.tick_timestamp = current_tick; ipoque_struct->flow = flow; /* parse packet */ ipoque_struct->packet.iph = (struct iphdr *) packet; /* we are interested in ipv4 packet */ if (ipq_init_packet_header(ipoque_struct, packetlen) != 0) { return IPOQUE_PROTOCOL_UNKNOWN; } /* detect traffic for tcp or udp only */ ipoque_struct->src = src; ipoque_struct->dst = dst; ipoque_connection_tracking(ipoque_struct); if (ipoque_struct->flow == NULL && (ipoque_struct->packet.tcp != NULL || ipoque_struct->packet.udp != NULL)) { return (IPOQUE_PROTOCOL_UNKNOWN); } /* build ipq_selction packet bitmask */ ipq_selection_packet = IPQ_SELECTION_BITMASK_PROTOCOL_COMPLETE_TRAFFIC; if (ipoque_struct->packet.iph != NULL) { ipq_selection_packet |= IPQ_SELECTION_BITMASK_PROTOCOL_IP | IPQ_SELECTION_BITMASK_PROTOCOL_IPV4_OR_IPV6; } if (ipoque_struct->packet.tcp != NULL) { ipq_selection_packet |= (IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP_OR_UDP); } if (ipoque_struct->packet.udp != NULL) { ipq_selection_packet |= (IPQ_SELECTION_BITMASK_PROTOCOL_INT_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP_OR_UDP); } if (ipoque_struct->packet.payload_packet_len != 0) { ipq_selection_packet |= IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD; } if (ipoque_struct->packet.tcp_retransmission == 0) { ipq_selection_packet |= IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION; } #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (ipoque_struct->packet.iphv6 != NULL) { ipq_selection_packet |= IPQ_SELECTION_BITMASK_PROTOCOL_IPV6 | IPQ_SELECTION_BITMASK_PROTOCOL_IPV4_OR_IPV6; } #endif /* IPOQUE_DETECTION_SUPPORT_IPV6 */ IPOQUE_SAVE_AS_BITMASK(detection_bitmask, ipoque_struct->packet.detected_protocol_stack[0]); if (ipoque_struct->flow != NULL && ipoque_struct->packet.tcp != NULL) { if (ipoque_struct->packet.payload_packet_len != 0) { for (a = 0; a < ipoque_struct->callback_buffer_size_tcp_payload; a++) { if ((ipoque_struct->callback_buffer_tcp_payload[a].ipq_selection_bitmask & ipq_selection_packet) == ipoque_struct->callback_buffer_tcp_payload[a].ipq_selection_bitmask && IPOQUE_BITMASK_COMPARE(ipoque_struct->flow->excluded_protocol_bitmask, ipoque_struct-> callback_buffer_tcp_payload[a].excluded_protocol_bitmask) == 0 && IPOQUE_BITMASK_COMPARE(ipoque_struct->callback_buffer_tcp_payload[a].detection_bitmask, detection_bitmask) != 0) { ipoque_struct->callback_buffer_tcp_payload[a].func(ipoque_struct); #ifdef HAVE_NTOP if(ipoque_struct->flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_UNKNOWN) break; /* Stop after detecting the first protocol */ #endif } } } else { /* no payload */ for (a = 0; a < ipoque_struct->callback_buffer_size_tcp_no_payload; a++) { if ((ipoque_struct->callback_buffer_tcp_no_payload[a].ipq_selection_bitmask & ipq_selection_packet) == ipoque_struct->callback_buffer_tcp_no_payload[a].ipq_selection_bitmask && IPOQUE_BITMASK_COMPARE(ipoque_struct->flow->excluded_protocol_bitmask, ipoque_struct-> callback_buffer_tcp_no_payload[a].excluded_protocol_bitmask) == 0 && IPOQUE_BITMASK_COMPARE(ipoque_struct->callback_buffer_tcp_no_payload[a].detection_bitmask, detection_bitmask) != 0) { ipoque_struct->callback_buffer_tcp_no_payload[a].func(ipoque_struct); #ifdef HAVE_NTOP if(ipoque_struct->flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_UNKNOWN) break; /* Stop after detecting the first protocol */ #endif } } } } else if (ipoque_struct->flow != NULL && ipoque_struct->packet.udp != NULL) { for (a = 0; a < ipoque_struct->callback_buffer_size_udp; a++) { if ((ipoque_struct->callback_buffer_udp[a].ipq_selection_bitmask & ipq_selection_packet) == ipoque_struct->callback_buffer_udp[a].ipq_selection_bitmask && IPOQUE_BITMASK_COMPARE(ipoque_struct->flow->excluded_protocol_bitmask, ipoque_struct->callback_buffer_udp[a].excluded_protocol_bitmask) == 0 && IPOQUE_BITMASK_COMPARE(ipoque_struct->callback_buffer_udp[a].detection_bitmask, detection_bitmask) != 0) { ipoque_struct->callback_buffer_udp[a].func(ipoque_struct); #ifdef HAVE_NTOP if(ipoque_struct->flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_UNKNOWN) break; /* Stop after detecting the first protocol */ #endif } } } else { for (a = 0; a < ipoque_struct->callback_buffer_size_non_tcp_udp; a++) { if ((ipoque_struct->callback_buffer_non_tcp_udp[a].ipq_selection_bitmask & ipq_selection_packet) == ipoque_struct->callback_buffer_non_tcp_udp[a].ipq_selection_bitmask && (ipoque_struct->flow == NULL || IPOQUE_BITMASK_COMPARE (ipoque_struct->flow->excluded_protocol_bitmask, ipoque_struct->callback_buffer_non_tcp_udp[a].excluded_protocol_bitmask) == 0) && IPOQUE_BITMASK_COMPARE(ipoque_struct->callback_buffer_non_tcp_udp[a].detection_bitmask, detection_bitmask) != 0) { ipoque_struct->callback_buffer_non_tcp_udp[a].func(ipoque_struct); #ifdef HAVE_NTOP if(ipoque_struct->flow->detected_protocol_stack[0] != IPOQUE_PROTOCOL_UNKNOWN) break; /* Stop after detecting the first protocol */ #endif } } } a = ipoque_struct->packet.detected_protocol_stack[0]; if (IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(ipoque_struct->detection_bitmask, a) == 0) a = IPOQUE_PROTOCOL_UNKNOWN; return a; } static u8 ipoque_detection_build_key_internal(struct ipoque_detection_module_struct *ipoque_struct, const u8 * l3, u16 l3_len, const u8 * l4, u16 l4_len, u8 l4_protocol, struct ipoque_unique_flow_ipv4_and_6_struct *key_return, u8 * dir_return, u32 flags) { const struct iphdr *iph = NULL; u8 swapped = 0; if (key_return == NULL || l3 == NULL) return 1; if (l3_len < sizeof(*iph)) return 1; iph = (const struct iphdr *) l3; if (iph->version == 4 && ((iph->ihl * 4) > l3_len || l3_len < ntohs(iph->tot_len) || (iph->frag_off & htons(0x1FFF)) != 0)) { return 1; } if ((flags & IPOQUE_DETECTION_ONLY_IPV6) && iph->version == 4) { return 1; } #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 else if ((flags & IPOQUE_DETECTION_ONLY_IPV4) && iph->version == 6) { return 1; } #endif //memset( key_return, 0, sizeof( *key_return ) ); /* needed: * - unfragmented or first part of the fragmented packet * - ip header <= packet len * - ip total length >= packet len */ if (iph->version == 4 && iph->ihl >= 5) { IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "ipv4 header\n"); key_return->is_ip_v6 = 0; key_return->protocol = l4_protocol; if (iph->saddr < iph->daddr) { key_return->ip.ipv4.lower_ip = iph->saddr; key_return->ip.ipv4.upper_ip = iph->daddr; } else { key_return->ip.ipv4.upper_ip = iph->saddr; key_return->ip.ipv4.lower_ip = iph->daddr; swapped = 1; } key_return->ip.ipv4.dummy[0] = 0; key_return->ip.ipv4.dummy[1] = 0; key_return->ip.ipv4.dummy[2] = 0; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 } else if (iph->version == 6 && l3_len >= sizeof(struct ipq_ipv6hdr)) { const struct ipq_ipv6hdr *ip6h = (const struct ipq_ipv6hdr *) iph; if ((l3_len - sizeof(struct ipq_ipv6hdr)) < ntohs(ip6h->payload_len)) { return 3; } key_return->is_ip_v6 = 1; key_return->protocol = l4_protocol; if (IPOQUE_COMPARE_IPV6_ADDRESS_STRUCTS(&ip6h->saddr, &ip6h->daddr)) { key_return->ip.ipv6.lower_ip[0] = ((u64 *) & ip6h->saddr)[0]; key_return->ip.ipv6.lower_ip[1] = ((u64 *) & ip6h->saddr)[1]; key_return->ip.ipv6.upper_ip[0] = ((u64 *) & ip6h->daddr)[0]; key_return->ip.ipv6.upper_ip[1] = ((u64 *) & ip6h->daddr)[1]; } else { key_return->ip.ipv6.lower_ip[0] = ((u64 *) & ip6h->daddr)[0]; key_return->ip.ipv6.lower_ip[1] = ((u64 *) & ip6h->daddr)[1]; key_return->ip.ipv6.upper_ip[0] = ((u64 *) & ip6h->saddr)[0]; key_return->ip.ipv6.upper_ip[1] = ((u64 *) & ip6h->saddr)[1]; swapped = 1; } #endif } else { return 5; } /* tcp / udp detection */ if (key_return->protocol == 6 /* TCP */ && l4_len >= sizeof(struct tcphdr)) { const struct tcphdr *tcph = (const struct tcphdr *) l4; if (swapped == 0) { key_return->lower_port = tcph->source; key_return->upper_port = tcph->dest; } else { key_return->lower_port = tcph->dest; key_return->upper_port = tcph->source; } } else if (key_return->protocol == 17 /* UDP */ && l4_len >= sizeof(struct udphdr)) { const struct udphdr *udph = (struct udphdr *) l4; if (swapped == 0) { key_return->lower_port = udph->source; key_return->upper_port = udph->dest; } else { key_return->lower_port = udph->dest; key_return->upper_port = udph->source; } } else { /* non tcp/udp protocols, one connection between two ip addresses */ key_return->lower_port = 0; key_return->upper_port = 0; } if (dir_return != NULL) { *dir_return = swapped; } return 0; } u32 ipq_bytestream_to_number(const u8 * str, u16 max_chars_to_read, u16 * bytes_read) { u32 val; val = 0; // cancel if eof, ' ' or line end chars are reached while (*str >= '0' && *str <= '9' && max_chars_to_read > 0) { val *= 10; val += *str - '0'; str++; max_chars_to_read = max_chars_to_read - 1; *bytes_read = *bytes_read + 1; } return (val); } u32 ipq_bytestream_dec_or_hex_to_number(const u8 * str, u16 max_chars_to_read, u16 * bytes_read) { u32 val; val = 0; if (max_chars_to_read <= 2 || str[0] != '0' || str[1] != 'x') { return ipq_bytestream_to_number(str, max_chars_to_read, bytes_read); } else { /*use base 16 system */ str += 2; max_chars_to_read -= 2; *bytes_read = *bytes_read + 2; while (max_chars_to_read > 0) { if (*str >= '0' && *str <= '9') { val *= 16; val += *str - '0'; } else if (*str >= 'a' && *str <= 'f') { val *= 16; val += *str + 10 - 'a'; } else if (*str >= 'A' && *str <= 'F') { val *= 16; val += *str + 10 - 'A'; } else { break; } str++; max_chars_to_read = max_chars_to_read - 1; *bytes_read = *bytes_read + 1; } } return (val); } u64 ipq_bytestream_to_number64(const u8 * str, u16 max_chars_to_read, u16 * bytes_read) { u64 val; val = 0; // cancel if eof, ' ' or line end chars are reached while (max_chars_to_read > 0 && *str >= '0' && *str <= '9') { val *= 10; val += *str - '0'; str++; max_chars_to_read = max_chars_to_read - 1; *bytes_read = *bytes_read + 1; } return (val); } u64 ipq_bytestream_dec_or_hex_to_number64(const u8 * str, u16 max_chars_to_read, u16 * bytes_read) { u64 val; val = 0; if (max_chars_to_read <= 2 || str[0] != '0' || str[1] != 'x') { return ipq_bytestream_to_number64(str, max_chars_to_read, bytes_read); } else { /*use base 16 system */ str += 2; max_chars_to_read -= 2; *bytes_read = *bytes_read + 2; while (max_chars_to_read > 0) { if (*str >= '0' && *str <= '9') { val *= 16; val += *str - '0'; } else if (*str >= 'a' && *str <= 'f') { val *= 16; val += *str + 10 - 'a'; } else if (*str >= 'A' && *str <= 'F') { val *= 16; val += *str + 10 - 'A'; } else { break; } str++; max_chars_to_read = max_chars_to_read - 1; *bytes_read = *bytes_read + 1; } } return (val); } u32 ipq_bytestream_to_ipv4(const u8 * str, u16 max_chars_to_read, u16 * bytes_read) { u32 val; u16 read = 0; u16 oldread; u32 c; /* ip address must be X.X.X.X with each X between 0 and 255 */ oldread = read; c = ipq_bytestream_to_number(str, max_chars_to_read, &read); if (c > 255 || oldread == read || max_chars_to_read == read || str[read] != '.') return 0; read++; val = c << 24; oldread = read; c = ipq_bytestream_to_number(&str[read], max_chars_to_read - read, &read); if (c > 255 || oldread == read || max_chars_to_read == read || str[read] != '.') return 0; read++; val = val + (c << 16); oldread = read; c = ipq_bytestream_to_number(&str[read], max_chars_to_read - read, &read); if (c > 255 || oldread == read || max_chars_to_read == read || str[read] != '.') return 0; read++; val = val + (c << 8); oldread = read; c = ipq_bytestream_to_number(&str[read], max_chars_to_read - read, &read); if (c > 255 || oldread == read || max_chars_to_read == read) return 0; val = val + c; *bytes_read = *bytes_read + read; return htonl(val); } /* internal function for every detection to parse one packet and to increase the info buffer */ void ipq_parse_packet_line_info(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; u32 a; u16 end = packet->payload_packet_len - 1; if (packet->packet_lines_parsed_complete != 0) return; packet->packet_lines_parsed_complete = 1; packet->parsed_lines = 0; packet->empty_line_position_set = 0; packet->host_line.ptr = NULL; packet->host_line.len = 0; packet->referer_line.ptr = NULL; packet->referer_line.len = 0; packet->content_line.ptr = NULL; packet->content_line.len = 0; packet->accept_line.ptr = NULL; packet->accept_line.len = 0; packet->user_agent_line.ptr = NULL; packet->user_agent_line.len = 0; packet->http_url_name.ptr = NULL; packet->http_url_name.len = 0; packet->http_encoding.ptr = NULL; packet->http_encoding.len = 0; packet->http_transfer_encoding.ptr = NULL; packet->http_transfer_encoding.len = 0; packet->http_contentlen.ptr = NULL; packet->http_contentlen.len = 0; packet->http_cookie.ptr = NULL; packet->http_cookie.len = 0; packet->http_x_session_type.ptr = NULL; packet->http_x_session_type.len = 0; packet->server_line.ptr = NULL; packet->server_line.len = 0; packet->http_method.ptr = NULL; packet->http_method.len = 0; packet->http_response.ptr = NULL; packet->http_response.len = 0; if (packet->payload_packet_len == 0) return; packet->line[packet->parsed_lines].ptr = packet->payload; packet->line[packet->parsed_lines].len = 0; for (a = 0; a < end; a++) { if (get_u16(packet->payload, a) == ntohs(0x0d0a)) { packet->line[packet->parsed_lines].len = ((unsigned long) &packet->payload[a]) - ((unsigned long) packet->line[packet->parsed_lines].ptr); if (packet->parsed_lines == 0 && packet->line[0].len >= IPQ_STATICSTRING_LEN("HTTP/1.1 200 ") && memcmp(packet->line[0].ptr, "HTTP/1.", IPQ_STATICSTRING_LEN("HTTP/1.")) == 0 && packet->line[0].ptr[IPQ_STATICSTRING_LEN("HTTP/1.1 ")] > '0' && packet->line[0].ptr[IPQ_STATICSTRING_LEN("HTTP/1.1 ")] < '6') { packet->http_response.ptr = &packet->line[0].ptr[IPQ_STATICSTRING_LEN("HTTP/1.1 ")]; packet->http_response.len = packet->line[0].len - IPQ_STATICSTRING_LEN("HTTP/1.1 "); IPQ_LOG(IPOQUE_PROTOCOL_UNKNOWN, ipoque_struct, IPQ_LOG_DEBUG, "ipq_parse_packet_line_info: HTTP response parsed: \"%.*s\"\n", packet->http_response.len, packet->http_response.ptr); } if (packet->line[packet->parsed_lines].len > IPQ_STATICSTRING_LEN("Server:") + 1 && memcmp(packet->line[packet->parsed_lines].ptr, "Server:", IPQ_STATICSTRING_LEN("Server:")) == 0) { // some stupid clients omit a space and place the servername directly after the colon if (packet->line[packet->parsed_lines].ptr[IPQ_STATICSTRING_LEN("Server:")] == ' ') { packet->server_line.ptr = &packet->line[packet->parsed_lines].ptr[IPQ_STATICSTRING_LEN("Server:") + 1]; packet->server_line.len = packet->line[packet->parsed_lines].len - (IPQ_STATICSTRING_LEN("Server:") + 1); } else { packet->server_line.ptr = &packet->line[packet->parsed_lines].ptr[IPQ_STATICSTRING_LEN("Server:")]; packet->server_line.len = packet->line[packet->parsed_lines].len - IPQ_STATICSTRING_LEN("Server:"); } } if (packet->line[packet->parsed_lines].len > 6 && memcmp(packet->line[packet->parsed_lines].ptr, "Host:", 5) == 0) { // some stupid clients omit a space and place the hostname directly after the colon if (packet->line[packet->parsed_lines].ptr[5] == ' ') { packet->host_line.ptr = &packet->line[packet->parsed_lines].ptr[6]; packet->host_line.len = packet->line[packet->parsed_lines].len - 6; } else { packet->host_line.ptr = &packet->line[packet->parsed_lines].ptr[5]; packet->host_line.len = packet->line[packet->parsed_lines].len - 5; } } if (packet->line[packet->parsed_lines].len > 14 && (memcmp (packet->line[packet->parsed_lines].ptr, "Content-Type: ", 14) == 0 || memcmp(packet->line[packet->parsed_lines].ptr, "Content-type: ", 14) == 0)) { packet->content_line.ptr = &packet->line[packet->parsed_lines].ptr[14]; packet->content_line.len = packet->line[packet->parsed_lines].len - 14; } if (packet->line[packet->parsed_lines].len > 13 && memcmp(packet->line[packet->parsed_lines].ptr, "content-type:", 13) == 0) { packet->content_line.ptr = &packet->line[packet->parsed_lines].ptr[13]; packet->content_line.len = packet->line[packet->parsed_lines].len - 13; } if (packet->line[packet->parsed_lines].len > 8 && memcmp(packet->line[packet->parsed_lines].ptr, "Accept: ", 8) == 0) { packet->accept_line.ptr = &packet->line[packet->parsed_lines].ptr[8]; packet->accept_line.len = packet->line[packet->parsed_lines].len - 8; } if (packet->line[packet->parsed_lines].len > 9 && memcmp(packet->line[packet->parsed_lines].ptr, "Referer: ", 9) == 0) { packet->referer_line.ptr = &packet->line[packet->parsed_lines].ptr[9]; packet->referer_line.len = packet->line[packet->parsed_lines].len - 9; } if (packet->line[packet->parsed_lines].len > 12 && (memcmp(packet->line[packet->parsed_lines].ptr, "User-Agent: ", 12) == 0 || memcmp(packet->line[packet->parsed_lines].ptr, "User-agent: ", 12) == 0)) { packet->user_agent_line.ptr = &packet->line[packet->parsed_lines].ptr[12]; packet->user_agent_line.len = packet->line[packet->parsed_lines].len - 12; } if (packet->line[packet->parsed_lines].len > 18 && memcmp(packet->line[packet->parsed_lines].ptr, "Content-Encoding: ", 18) == 0) { packet->http_encoding.ptr = &packet->line[packet->parsed_lines].ptr[18]; packet->http_encoding.len = packet->line[packet->parsed_lines].len - 18; } if (packet->line[packet->parsed_lines].len > 19 && memcmp(packet->line[packet->parsed_lines].ptr, "Transfer-Encoding: ", 19) == 0) { packet->http_transfer_encoding.ptr = &packet->line[packet->parsed_lines].ptr[19]; packet->http_transfer_encoding.len = packet->line[packet->parsed_lines].len - 19; } if (packet->line[packet->parsed_lines].len > 16 && ((memcmp(packet->line[packet->parsed_lines].ptr, "Content-Length: ", 16) == 0) || (memcmp(packet->line[packet->parsed_lines].ptr, "content-length: ", 16) == 0))) { packet->http_contentlen.ptr = &packet->line[packet->parsed_lines].ptr[16]; packet->http_contentlen.len = packet->line[packet->parsed_lines].len - 16; } if (packet->line[packet->parsed_lines].len > 8 && memcmp(packet->line[packet->parsed_lines].ptr, "Cookie: ", 8) == 0) { packet->http_cookie.ptr = &packet->line[packet->parsed_lines].ptr[8]; packet->http_cookie.len = packet->line[packet->parsed_lines].len - 8; } if (packet->line[packet->parsed_lines].len > 16 && memcmp(packet->line[packet->parsed_lines].ptr, "X-Session-Type: ", 16) == 0) { packet->http_x_session_type.ptr = &packet->line[packet->parsed_lines].ptr[16]; packet->http_x_session_type.len = packet->line[packet->parsed_lines].len - 16; } if (packet->line[packet->parsed_lines].len == 0) { packet->empty_line_position = a; packet->empty_line_position_set = 1; } if (packet->parsed_lines >= (IPOQUE_MAX_PARSE_LINES_PER_PACKET - 1)) { return; } packet->parsed_lines++; packet->line[packet->parsed_lines].ptr = &packet->payload[a + 2]; packet->line[packet->parsed_lines].len = 0; if ((a + 2) >= packet->payload_packet_len) { return; } a++; } } if (packet->parsed_lines >= 1) { packet->line[packet->parsed_lines].len = ((unsigned long) &packet->payload[packet->payload_packet_len]) - ((unsigned long) packet->line[packet->parsed_lines].ptr); packet->parsed_lines++; } } void ipq_parse_packet_line_info_unix(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; u32 a; u16 end = packet->payload_packet_len; if (packet->packet_unix_lines_parsed_complete != 0) return; packet->packet_unix_lines_parsed_complete = 1; packet->parsed_unix_lines = 0; if (packet->payload_packet_len == 0) return; packet->unix_line[packet->parsed_unix_lines].ptr = packet->payload; packet->unix_line[packet->parsed_unix_lines].len = 0; for (a = 0; a < end; a++) { if (packet->payload[a] == 0x0a) { packet->unix_line[packet->parsed_unix_lines].len = ((unsigned long) &packet->payload[a]) - ((unsigned long) packet->unix_line[packet->parsed_unix_lines].ptr); if (packet->parsed_unix_lines >= (IPOQUE_MAX_PARSE_LINES_PER_PACKET - 1)) { break; } packet->parsed_unix_lines++; packet->unix_line[packet->parsed_unix_lines].ptr = &packet->payload[a + 1]; packet->unix_line[packet->parsed_unix_lines].len = 0; if ((a + 1) >= packet->payload_packet_len) { break; } //a++; } } } u16 ipoque_check_for_email_address(struct ipoque_detection_module_struct *ipoque_struct, u16 counter) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "called ipoque_check_for_email_address\n"); if (packet->payload_packet_len > counter && ((packet->payload[counter] >= 'a' && packet->payload[counter] <= 'z') || (packet->payload[counter] >= 'A' && packet->payload[counter] <= 'Z') || (packet->payload[counter] >= '0' && packet->payload[counter] <= '9') || packet->payload[counter] == '-' || packet->payload[counter] == '_')) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "first letter\n"); counter++; while (packet->payload_packet_len > counter && ((packet->payload[counter] >= 'a' && packet->payload[counter] <= 'z') || (packet->payload[counter] >= 'A' && packet->payload[counter] <= 'Z') || (packet->payload[counter] >= '0' && packet->payload[counter] <= '9') || packet->payload[counter] == '-' || packet->payload[counter] == '_' || packet->payload[counter] == '.')) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "further letter\n"); counter++; if (packet->payload_packet_len > counter && packet->payload[counter] == '@') { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "@\n"); counter++; while (packet->payload_packet_len > counter && ((packet->payload[counter] >= 'a' && packet->payload[counter] <= 'z') || (packet->payload[counter] >= 'A' && packet->payload[counter] <= 'Z') || (packet->payload[counter] >= '0' && packet->payload[counter] <= '9') || packet->payload[counter] == '-' || packet->payload[counter] == '_')) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "letter\n"); counter++; if (packet->payload_packet_len > counter && packet->payload[counter] == '.') { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, ".\n"); counter++; if (packet->payload_packet_len > counter + 1 && ((packet->payload[counter] >= 'a' && packet->payload[counter] <= 'z') && (packet->payload[counter + 1] >= 'a' && packet->payload[counter + 1] <= 'z'))) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "two letters\n"); counter += 2; if (packet->payload_packet_len > counter && (packet->payload[counter] == ' ' || packet->payload[counter] == ';')) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "whitespace1\n"); return counter; } else if (packet->payload_packet_len > counter && packet->payload[counter] >= 'a' && packet->payload[counter] <= 'z') { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "one letter\n"); counter++; if (packet->payload_packet_len > counter && (packet->payload[counter] == ' ' || packet->payload[counter] == ';')) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "whitespace2\n"); return counter; } else if (packet->payload_packet_len > counter && packet->payload[counter] >= 'a' && packet->payload[counter] <= 'z') { counter++; if (packet->payload_packet_len > counter && (packet->payload[counter] == ' ' || packet->payload[counter] == ';')) { IPQ_LOG(IPOQUE_PROTOCOL_MSN, ipoque_struct, IPQ_LOG_DEBUG, "whitespace3\n"); return counter; } else { return 0; } } else { return 0; } } else { return 0; } } else { return 0; } } } return 0; } } } return 0; } #ifdef IPOQUE_ENABLE_DEBUG_MESSAGES void ipoque_debug_get_last_log_function_line(struct ipoque_detection_module_struct *ipoque_struct, const char **file, const char **func, u32 * line) { *file = ""; *func = ""; if (ipoque_struct->ipoque_debug_print_file != NULL) *file = ipoque_struct->ipoque_debug_print_file; if (ipoque_struct->ipoque_debug_print_function != NULL) *func = ipoque_struct->ipoque_debug_print_function; *line = ipoque_struct->ipoque_debug_print_line; } #endif u8 ipoque_detection_get_l4(const u8 * l3, u16 l3_len, const u8 ** l4_return, u16 * l4_len_return, u8 * l4_protocol_return, u32 flags) { return ipoque_detection_get_l4_internal(NULL, l3, l3_len, l4_return, l4_len_return, l4_protocol_return, flags); } u8 ipoque_detection_build_key(const u8 * l3, u16 l3_len, const u8 * l4, u16 l4_len, u8 l4_protocol, struct ipoque_unique_flow_ipv4_and_6_struct * key_return, u8 * dir_return, u32 flags) { return ipoque_detection_build_key_internal(NULL, l3, l3_len, l4, l4_len, l4_protocol, key_return, dir_return, flags); } void ipoque_int_add_connection(struct ipoque_detection_module_struct *ipoque_struct, u16 detected_protocol, ipoque_protocol_type_t protocol_type) { struct ipoque_id_struct *src = ipoque_struct->src; struct ipoque_id_struct *dst = ipoque_struct->dst; ipoque_int_change_protocol(ipoque_struct, detected_protocol, protocol_type); if (src != NULL) { IPOQUE_ADD_PROTOCOL_TO_BITMASK(src->detected_protocol_bitmask, detected_protocol); } if (dst != NULL) { IPOQUE_ADD_PROTOCOL_TO_BITMASK(dst->detected_protocol_bitmask, detected_protocol); } } void ipoque_int_change_flow_protocol(struct ipoque_detection_module_struct *ipoque_struct, u16 detected_protocol, ipoque_protocol_type_t protocol_type) { struct ipoque_flow_struct *flow = ipoque_struct->flow; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 u8 a; u8 stack_size; u16 new_is_real = 0; u16 preserve_bitmask; #endif if (!flow) return; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 stack_size = flow->protocol_stack_info.current_stack_size_minus_one + 1; /* here are the rules for stack manipulations: * 1.if the new protocol is a real protocol, insert it at the position * of the top-most real protocol or below the last non-unknown correlated * protocol. * 2.if the new protocol is not real, put it on top of stack but if there is * a real protocol in the stack, make sure at least one real protocol remains * in the stack */ if (protocol_type == IPOQUE_CORRELATED_PROTOCOL) { u16 saved_real_protocol = IPOQUE_PROTOCOL_UNKNOWN; if (stack_size == IPOQUE_PROTOCOL_HISTORY_SIZE) { /* check whether we will lost real protocol information due to shifting */ u16 real_protocol = flow->protocol_stack_info.entry_is_real_protocol; for (a = 0; a < stack_size; a++) { if (real_protocol & 1) break; real_protocol >>= 1; } if (a == (stack_size - 1)) { /* oh, only one real protocol at the end, store it and insert it later */ saved_real_protocol = flow->detected_protocol_stack[stack_size - 1]; } } else { flow->protocol_stack_info.current_stack_size_minus_one++; stack_size++; } /* now shift and insert */ for (a = stack_size - 1; a > 0; a--) { flow->detected_protocol_stack[a] = flow->detected_protocol_stack[a - 1]; } flow->protocol_stack_info.entry_is_real_protocol <<= 1; /* now set the new protocol */ flow->detected_protocol_stack[0] = detected_protocol; /* restore real protocol */ if (saved_real_protocol != IPOQUE_PROTOCOL_UNKNOWN) { flow->detected_protocol_stack[stack_size - 1] = saved_real_protocol; flow->protocol_stack_info.entry_is_real_protocol |= 1 << (stack_size - 1); } /* done */ } else { u8 insert_at = 0; if (!(flow->protocol_stack_info.entry_is_real_protocol & 1)) { u16 real_protocol = flow->protocol_stack_info.entry_is_real_protocol; for (a = 0; a < stack_size; a++) { if (real_protocol & 1) break; real_protocol >>= 1; } insert_at = a; } if (insert_at >= stack_size) { /* no real protocol found, insert it at the bottom */ insert_at = stack_size - 1; } if (stack_size < IPOQUE_PROTOCOL_HISTORY_SIZE) { flow->protocol_stack_info.current_stack_size_minus_one++; stack_size++; } /* first shift all stacks */ for (a = stack_size - 1; a > insert_at; a--) { flow->detected_protocol_stack[a] = flow->detected_protocol_stack[a - 1]; } preserve_bitmask = (1 << insert_at) - 1; new_is_real = (flow->protocol_stack_info.entry_is_real_protocol & (~preserve_bitmask)) << 1; new_is_real |= flow->protocol_stack_info.entry_is_real_protocol & preserve_bitmask; flow->protocol_stack_info.entry_is_real_protocol = new_is_real; /* now set the new protocol */ flow->detected_protocol_stack[insert_at] = detected_protocol; /* and finally update the additional stack information */ flow->protocol_stack_info.entry_is_real_protocol |= 1 << insert_at; } #else flow->detected_protocol_stack[0] = detected_protocol; flow->detected_subprotocol_stack[0] = detected_subprotocol; #endif } void ipoque_int_change_packet_protocol(struct ipoque_detection_module_struct *ipoque_struct, u16 detected_protocol, ipoque_protocol_type_t protocol_type) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; /* NOTE: everything below is identically to change_flow_protocol * except flow->packet If you want to change something here, * don't! Change it for the flow function and apply it here * as well */ #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 u8 a; u8 stack_size; u16 new_is_real = 0; u16 preserve_bitmask; #endif if (!packet) return; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 stack_size = packet->protocol_stack_info.current_stack_size_minus_one + 1; /* here are the rules for stack manipulations: * 1.if the new protocol is a real protocol, insert it at the position * of the top-most real protocol or below the last non-unknown correlated * protocol. * 2.if the new protocol is not real, put it on top of stack but if there is * a real protocol in the stack, make sure at least one real protocol remains * in the stack */ if (protocol_type == IPOQUE_CORRELATED_PROTOCOL) { u16 saved_real_protocol = IPOQUE_PROTOCOL_UNKNOWN; if (stack_size == IPOQUE_PROTOCOL_HISTORY_SIZE) { /* check whether we will lost real protocol information due to shifting */ u16 real_protocol = packet->protocol_stack_info.entry_is_real_protocol; for (a = 0; a < stack_size; a++) { if (real_protocol & 1) break; real_protocol >>= 1; } if (a == (stack_size - 1)) { /* oh, only one real protocol at the end, store it and insert it later */ saved_real_protocol = packet->detected_protocol_stack[stack_size - 1]; } } else { packet->protocol_stack_info.current_stack_size_minus_one++; stack_size++; } /* now shift and insert */ for (a = stack_size - 1; a > 0; a--) { packet->detected_protocol_stack[a] = packet->detected_protocol_stack[a - 1]; } packet->protocol_stack_info.entry_is_real_protocol <<= 1; /* now set the new protocol */ packet->detected_protocol_stack[0] = detected_protocol; /* restore real protocol */ if (saved_real_protocol != IPOQUE_PROTOCOL_UNKNOWN) { packet->detected_protocol_stack[stack_size - 1] = saved_real_protocol; packet->protocol_stack_info.entry_is_real_protocol |= 1 << (stack_size - 1); } /* done */ } else { u8 insert_at = 0; if (!(packet->protocol_stack_info.entry_is_real_protocol & 1)) { u16 real_protocol = packet->protocol_stack_info.entry_is_real_protocol; for (a = 0; a < stack_size; a++) { if (real_protocol & 1) break; real_protocol >>= 1; } insert_at = a; } if (insert_at >= stack_size) { /* no real protocol found, insert it at the first unknown protocol */ insert_at = stack_size - 1; } if (stack_size < IPOQUE_PROTOCOL_HISTORY_SIZE) { packet->protocol_stack_info.current_stack_size_minus_one++; stack_size++; } /* first shift all stacks */ for (a = stack_size - 1; a > insert_at; a--) { packet->detected_protocol_stack[a] = packet->detected_protocol_stack[a - 1]; } preserve_bitmask = (1 << insert_at) - 1; new_is_real = (packet->protocol_stack_info.entry_is_real_protocol & (~preserve_bitmask)) << 1; new_is_real |= packet->protocol_stack_info.entry_is_real_protocol & preserve_bitmask; packet->protocol_stack_info.entry_is_real_protocol = new_is_real; /* now set the new protocol */ packet->detected_protocol_stack[insert_at] = detected_protocol; /* and finally update the additional stack information */ packet->protocol_stack_info.entry_is_real_protocol |= 1 << insert_at; } #else packet->detected_protocol_stack[0] = detected_protocol; packet->detected_subprotocol_stack[0] = detected_subprotocol; #endif } /* * this function returns the real protocol of the flow. Actually it * accesses the packet stack since this is what leaves the library but * it could also use the flow stack. */ u16 ipoque_detection_get_real_protocol_of_flow(struct ipoque_detection_module_struct * ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 u8 a; u8 stack_size; u16 real_protocol; #endif if (!packet) return IPOQUE_PROTOCOL_UNKNOWN; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 stack_size = packet->protocol_stack_info.current_stack_size_minus_one + 1; real_protocol = packet->protocol_stack_info.entry_is_real_protocol; for (a = 0; a < stack_size; a++) { if (real_protocol & 1) return packet->detected_protocol_stack[a]; real_protocol >>= 1; } return IPOQUE_PROTOCOL_UNKNOWN; #else return packet->detected_protocol_stack[0]; #endif } /* * this function checks whether a protocol can be found in the * history. Actually it accesses the packet stack since this is what * leaves the library but it could also use the flow stack. */ u8 ipoque_detection_flow_protocol_history_contains_protocol(struct ipoque_detection_module_struct * ipoque_struct, u16 protocol_id) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; u8 a; u8 stack_size; if (!packet) return 0; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 stack_size = packet->protocol_stack_info.current_stack_size_minus_one + 1; #else stack_size = 1; #endif for (a = 0; a < stack_size; a++) { if (packet->detected_protocol_stack[a] == protocol_id) return 1; } return 0; } #ifdef HAVE_NTOP static u_int is_port(u_int16_t sport, u_int16_t dport, u_int16_t match_port) { return(((match_port == sport) || (match_port == dport)) ? 1 : 0); } /* ****************************************************** */ unsigned int ntop_find_port_based_protocol(u8 proto, u32 shost, u16 sport, u32 dhost, u16 dport) { /* Skyfile (host 193.252.234.246 or host 10.10.102.80) */ if((shost == 0xC1FCEAF6) || (dhost == 0xC1FCEAF6) || (shost == 0x0A0A6650) || (dhost == 0x0A0A6650)) { if((sport == 4708) || (dport == 4708)) return(NTOP_PROTOCOL_SKYFILE_PREPAID); else if((sport == 4709) || (dport == 4709)) return(NTOP_PROTOCOL_SKYFILE_RUDICS); else if((sport == 4710) || (dport == 4710)) return(NTOP_PROTOCOL_SKYFILE_POSTPAID); } return(IPOQUE_PROTOCOL_UNKNOWN); } /* ****************************************************** */ unsigned int ntop_guess_undetected_protocol(u8 proto, u32 shost, u16 sport, u32 dhost, u16 dport) { // printf("ntop_guess_undetected_protocol (proto=%d, %d -> %d)\n", proto, sport, dport); if(proto == IPPROTO_UDP) { if(is_port(sport, dport, 67) || is_port(sport, dport, 68)) return(IPOQUE_PROTOCOL_DHCP); else if(is_port(sport, dport, 137) || is_port(sport, dport, 138)) return(IPOQUE_PROTOCOL_NETBIOS); else if(is_port(sport, dport, 161) || is_port(sport, dport, 162)) return(IPOQUE_PROTOCOL_SNMP); else if(is_port(sport, dport, 5353) || is_port(sport, dport, 5354)) return(IPOQUE_PROTOCOL_MDNS); else if(is_port(sport, dport, 53)) return(IPOQUE_PROTOCOL_DNS); } else if(proto == IPPROTO_TCP) { if(is_port(sport, dport, 443)) return(IPOQUE_PROTOCOL_SSL); else if(is_port(sport, dport, 22)) return(IPOQUE_PROTOCOL_SSH); else if(is_port(sport, dport, 23)) return(IPOQUE_PROTOCOL_TELNET); else if(is_port(sport, dport, 445)) return(IPOQUE_PROTOCOL_SMB); else if(is_port(sport, dport, 80)) return(IPOQUE_PROTOCOL_HTTP); else if(is_port(sport, dport, 3000)) return(IPOQUE_PROTOCOL_HTTP); /* ntop */ else if(is_port(sport, dport, 3001)) return(IPOQUE_PROTOCOL_SSL); /* ntop */ else if(is_port(sport, dport, 8080) || is_port(sport, dport, 3128)) return(NTOP_PROTOCOL_HTTP_PROXY); else if(is_port(sport, dport, 389)) return(IPOQUE_PROTOCOL_LDAP); else if(is_port(sport, dport, 143) || is_port(sport, dport, 993)) return(IPOQUE_PROTOCOL_MAIL_IMAP); else if(is_port(sport, dport, 25) || is_port(sport, dport, 465)) return(IPOQUE_PROTOCOL_MAIL_SMTP); else if(is_port(sport, dport, 135)) return(NTOP_PROTOCOL_DCERPC); else if(is_port(sport, dport, 1494) || is_port(sport, dport, 2598)) return(NTOP_PROTOCOL_CITRIX); /* http://support.citrix.com/article/CTX104147 */ else if(is_port(sport, dport, 389)) return(IPOQUE_PROTOCOL_LDAP); } return(IPOQUE_PROTOCOL_UNKNOWN); } #endif ntop-5.0.1+dfsg1/nDPI/src/lib/ipq_protocols.h0000644000000000000000000003106312000573146017371 0ustar rootroot/* * ipq_protocols.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_PROTOCOLS_INCLUDE_FILE__ #define __IPOQUE_PROTOCOLS_INCLUDE_FILE__ #include "ipq_main.h" /* the get_uXX will return raw network packet bytes !! */ #define get_u8(X,O) (*(u8 *)(((u8 *)X) + O)) #define get_u16(X,O) (*(u16 *)(((u8 *)X) + O)) #define get_u32(X,O) (*(u32 *)(((u8 *)X) + O)) #define get_u64(X,O) (*(u64 *)(((u8 *)X) + O)) /* new definitions to get little endian from network bytes */ #define get_ul8(X,O) get_u8(X,O) #ifndef OPENDPI_NETFILTER_MODULE # ifndef __BYTE_ORDER # define __BYTE_ORDER BYTE_ORDER # define __LITTLE_ENDIAN LITTLE_ENDIAN # define __BIG_ENDIAN BIG_ENDIAN # endif #else # ifdef __BIG_ENDIAN # define __BYTE_ORDER __BIG_ENDIAN # else # define __BYTE_ORDER __LITTLE_ENDIAN # endif #endif #if defined( __LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN #define get_l16(X,O) get_u16(X,O) #define get_l32(X,O) get_u32(X,O) #elif defined( __BIG_ENDIAN) && __BYTE_ORDER == __BIG_ENDIAN /* convert the bytes from big to little endian */ #ifndef OPENDPI_NETFILTER_MODULE # define get_l16(X,O) bswap_16(get_u16(X,O)) # define get_l32(X,O) bswap_32(get_u32(X,O)) #else # define get_l16(X,O) __cpu_to_le16(get_u16(X,O)) # define get_l32(X,O) __cpu_to_le32(get_u32(X,O)) #endif #else #error "__BYTE_ORDER MUST BE DEFINED !" #endif /* __BYTE_ORDER */ /* define memory callback function */ #define ipq_mem_cmp memcmp void ipoque_search_bittorrent(struct ipoque_detection_module_struct *ipoque_struct); /* edonkey entry function*/ void ipoque_search_edonkey(struct ipoque_detection_module_struct *ipoque_struct); /* fasttrack entry function*/ void ipoque_search_fasttrack_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* gnutella entry function*/ void ipoque_search_gnutella(struct ipoque_detection_module_struct *ipoque_struct); /* winmx entry function*/ void ipoque_search_winmx_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* directconnect entry function*/ void ipoque_search_directconnect(struct ipoque_detection_module_struct *ipoque_struct); /* applejuice entry function*/ void ipoque_search_applejuice_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* i23v5 entry function */ void ipoque_search_i23v5(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_socrates(struct ipoque_detection_module_struct *ipoque_struct); /* soulseek entry function*/ void ipoque_search_soulseek_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* msn entry function*/ void ipoque_search_msn(struct ipoque_detection_module_struct *ipoque_struct); /* yahoo entry function*/ void ipoque_search_yahoo(struct ipoque_detection_module_struct *ipoque_struct); /* oscar entry function*/ void ipoque_search_oscar(struct ipoque_detection_module_struct *ipoque_struct); /* jabber entry function*/ void ipoque_search_jabber_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* irc entry function*/ void ipoque_search_irc_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* sip entry, used for tcp and udp !!! */ void ipoque_search_sip(struct ipoque_detection_module_struct *ipoque_struct); /* DirectDownloadLink entry */ void ipoque_search_direct_download_link_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* Mail POP entry */ void ipoque_search_mail_pop_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* IMAP entry */ void ipoque_search_mail_imap_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* Mail SMTP entry */ void ipoque_search_mail_smtp_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* HTTP entry */ void ipoque_search_http_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* FTP entry */ void ipoque_search_ftp_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* USENET entry */ void ipoque_search_usenet_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* DNS entry */ void ipoque_search_dns(struct ipoque_detection_module_struct *ipoque_struct); /* RTSP entry */ void ipoque_search_rtsp_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct); /* filetopia entry */ void ipoque_search_filetopia_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* manolito entry */ void ipoque_search_manolito_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct); /* imesh entry */ void ipoque_search_imesh_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct); /* SSL entry */ void ipoque_search_ssl_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* flash entry */ void ipoque_search_flash(struct ipoque_detection_module_struct *ipoque_struct); /* mms entry */ void ipoque_search_mms_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* icecast entry */ void ipoque_search_icecast_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* shoutcast entry */ void ipoque_search_shoutcast_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* veohtv entry */ void ipoque_search_veohtv_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* openft entry */ void ipoque_search_openft_tcp(struct ipoque_detection_module_struct *ipoque_struct); /* stun entry */ void ipoque_search_stun(struct ipoque_detection_module_struct *ipoque_struct); /* Pando entry */ void ipoque_search_pando_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_tvants_udp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_sopcast(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_tvuplayer(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_ppstream(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_pplive_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_iax(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_mgcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_gadugadu(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_zattoo(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_qq(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_feidian(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_ssh_tcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_popo_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_thunder(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_activesync(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_in_non_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_vnc_tcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_dhcp_udp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_steam(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_halflife2(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_xbox(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_smb_tcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_telnet_tcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_ntp_udp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_nfs(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_rtp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_ssdp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_worldofwarcraft(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_postgres_tcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_mysql_tcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_bgp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_quake(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_battlefield(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_secondlife(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_pcanywhere(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_rdp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_snmp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_kontiki(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_syslog(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_tds_tcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_netbios(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_mdns(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_ipp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_ldap(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_warcraft3(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_kerberos(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_xdmcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_tftp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_mssql(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_pptp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_stealthnet(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_dhcpv6_udp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_meebo(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_afp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_aimini(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_florensia(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_maplestory(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_dofus(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_world_of_kung_fu(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_fiesta(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_crossfire_tcp_udp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_guildwars_tcp(struct ipoque_detection_module_struct *ipoque_struct); void ipoque_search_armagetron_udp(struct ipoque_detection_module_struct *ipoque_struct); #ifdef HAVE_NTOP void ntop_search_dropbox(struct ipoque_detection_module_struct *ipoque_struct); void ntop_search_skype(struct ipoque_detection_module_struct *ipoque_struct); void ntop_search_citrix(struct ipoque_detection_module_struct *ipoque_struct); void ntop_search_dcerpc(struct ipoque_detection_module_struct *ipoque_struct); void ntop_search_netflow(struct ipoque_detection_module_struct *ipoque_struct); void ntop_search_sflow(struct ipoque_detection_module_struct *ipoque_struct); void ntop_search_radius(struct ipoque_detection_module_struct *ipoque_struct); void ntop_search_wsus(struct ipoque_detection_module_struct *ipoque_struct); void ntop_search_teamview(struct ipoque_detection_module_struct *ipoque_struct); #endif #endif /* __IPOQUE_PROTOCOLS_INCLUDE_FILE__ */ ntop-5.0.1+dfsg1/nDPI/src/lib/ipq_utils.h0000644000000000000000000000300411707556610016511 0ustar rootroot/* * ipq_utils.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef _IPQ_UTILS_H_ #define _IPQ_UTILS_H_ #include "ipq_protocols.h" /** * macro for getting the string len of a static string * * use it instead of strlen to avoid runtime calculations */ #define IPQ_STATICSTRING_LEN( s ) ( sizeof( s ) - 1 ) /** macro to compare 2 IPv6 addresses with each other to identify the "smaller" IPv6 address */ #define IPOQUE_COMPARE_IPV6_ADDRESS_STRUCTS(x,y) \ ((((u64 *)(x))[0]) < (((u64 *)(y))[0]) || ( (((u64 *)(x))[0]) == (((u64 *)(y))[0]) && (((u64 *)(x))[1]) < (((u64 *)(y))[1])) ) #ifdef HAVE_NTOP /* http.c */ extern char* ntop_strnstr(const char *s, const char *find, size_t slen); #endif #endif /* _IPQ_UTILS_H_ */ ntop-5.0.1+dfsg1/nDPI/src/lib/ipq_main.h0000644000000000000000000005447111713262330016301 0ustar rootroot/* * ipq_main.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_MAIN_INCLUDE_FILE__ #define __IPOQUE_MAIN_INCLUDE_FILE__ #ifndef HAVE_NTOP #define HAVE_NTOP 1 #endif #ifndef OPENDPI_NETFILTER_MODULE #include #include #include #include #endif #if !(defined(HAVE_NTOP) && defined(WIN32)) #if 1 && !defined __APPLE__ && !defined __FreeBSD__ #ifndef OPENDPI_NETFILTER_MODULE # include # include #else # include #endif #endif /* not WIN32 && not APPLE) */ #endif /* ntop */ /* default includes */ #if defined(__APPLE__) || (defined(HAVE_NTOP) && defined(WIN32)) || defined(__FreeBSD__) #ifndef WIN32 #include #endif #if defined(__FreeBSD__) #include #endif #include "../include/ipq_api.h" #include "linux_compat.h" #else /* APPLE */ #ifndef OPENDPI_NETFILTER_MODULE # include #endif #include #include #include #endif //#include #include "ipq_api.h" #include "ipq_structs.h" #define IPOQUE_USE_ASYMMETRIC_DETECTION 0 #define IPQ_SELECTION_BITMASK_PROTOCOL_SIZE u32 #define IPQ_SELECTION_BITMASK_PROTOCOL_IP (1<<0) #define IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP (1<<1) #define IPQ_SELECTION_BITMASK_PROTOCOL_INT_UDP (1<<2) #define IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP_OR_UDP (1<<3) #define IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD (1<<4) #define IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION (1<<5) #define IPQ_SELECTION_BITMASK_PROTOCOL_IPV6 (1<<6) #define IPQ_SELECTION_BITMASK_PROTOCOL_IPV4_OR_IPV6 (1<<7) #define IPQ_SELECTION_BITMASK_PROTOCOL_COMPLETE_TRAFFIC (1<<8) /* now combined detections */ /* v4 */ #define IPQ_SELECTION_BITMASK_PROTOCOL_TCP (IPQ_SELECTION_BITMASK_PROTOCOL_IP | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP) #define IPQ_SELECTION_BITMASK_PROTOCOL_UDP (IPQ_SELECTION_BITMASK_PROTOCOL_IP | IPQ_SELECTION_BITMASK_PROTOCOL_INT_UDP) #define IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP (IPQ_SELECTION_BITMASK_PROTOCOL_IP | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP_OR_UDP) /* v6 */ #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP (IPQ_SELECTION_BITMASK_PROTOCOL_IPV6 | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP) #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_UDP (IPQ_SELECTION_BITMASK_PROTOCOL_IPV6 | IPQ_SELECTION_BITMASK_PROTOCOL_INT_UDP) #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_OR_UDP (IPQ_SELECTION_BITMASK_PROTOCOL_IPV6 | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP_OR_UDP) /* v4 or v6 */ #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP (IPQ_SELECTION_BITMASK_PROTOCOL_IPV4_OR_IPV6 | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP) #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP (IPQ_SELECTION_BITMASK_PROTOCOL_IPV4_OR_IPV6 | IPQ_SELECTION_BITMASK_PROTOCOL_INT_UDP) #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP (IPQ_SELECTION_BITMASK_PROTOCOL_IPV4_OR_IPV6 | IPQ_SELECTION_BITMASK_PROTOCOL_INT_TCP_OR_UDP) #define IPQ_SELECTION_BITMASK_PROTOCOL_TCP_WITH_PAYLOAD (IPQ_SELECTION_BITMASK_PROTOCOL_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_WITH_PAYLOAD (IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD (IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) /* does it make sense to talk about udp with payload ??? have you ever seen empty udp packets ? */ #define IPQ_SELECTION_BITMASK_PROTOCOL_UDP_WITH_PAYLOAD (IPQ_SELECTION_BITMASK_PROTOCOL_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_UDP_WITH_PAYLOAD (IPQ_SELECTION_BITMASK_PROTOCOL_V6_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD (IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP_WITH_PAYLOAD (IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_OR_UDP_WITH_PAYLOAD (IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD (IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_TCP_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION) #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION) #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION) #define IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION) #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_OR_UDP_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION) #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION) #define IPQ_SELECTION_BITMASK_PROTOCOL_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_V6_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) #define IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITH_PAYLOAD_WITHOUT_RETRANSMISSION (IPQ_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP | IPQ_SELECTION_BITMASK_PROTOCOL_NO_TCP_RETRANSMISSION | IPQ_SELECTION_BITMASK_PROTOCOL_HAS_PAYLOAD) /* safe src/dst protocol check macros... */ #define IPQ_SRC_HAS_PROTOCOL(src,protocol) ((src) != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK((src)->detected_protocol_bitmask,(protocol)) != 0) #define IPQ_DST_HAS_PROTOCOL(dst,protocol) ((dst) != NULL && IPOQUE_COMPARE_PROTOCOL_TO_BITMASK((dst)->detected_protocol_bitmask,(protocol)) != 0) #define IPQ_SRC_OR_DST_HAS_PROTOCOL(src,dst,protocol) (IPQ_SRC_HAS_PROTOCOL(src,protocol) || IPQ_SRC_HAS_PROTOCOL(dst,protocol)) /** * convenience macro to check for excluded protocol * a protocol is excluded if the flow is known and either the protocol is not detected at all * or the excluded bitmask contains the protocol */ #define IPQ_FLOW_PROTOCOL_EXCLUDED(ipoque_struct,flow,protocol) ((flow) != NULL && \ ( IPOQUE_COMPARE_PROTOCOL_TO_BITMASK((ipoque_struct)->detection_bitmask, (protocol)) == 0 || \ IPOQUE_COMPARE_PROTOCOL_TO_BITMASK((flow)->excluded_protocol_bitmask, (protocol)) != 0 ) ) /* misc definitions */ #define IPOQUE_DEFAULT_MAX_TCP_RETRANSMISSION_WINDOW_SIZE 0x10000 /* TODO: rebuild all memory areas to have a more aligned memory block here */ /* DEFINITION OF MAX LINE NUMBERS FOR line parse algorithm */ #define IPOQUE_MAX_PARSE_LINES_PER_PACKET 200 /********************** * detection features * **********************/ #define IPOQUE_SELECT_DETECTION_WITH_REAL_PROTOCOL ( 1 << 0 ) #define IPOQUE_DIRECTCONNECT_CONNECTION_IP_TICK_TIMEOUT 600 #define IPOQUE_GADGADU_PEER_CONNECTION_TIMEOUT 120 #define IPOQUE_EDONKEY_UPPER_PORTS_ONLY 0 #define IPOQUE_FTP_CONNECTION_TIMEOUT 10 #define IPOQUE_PPLIVE_CONNECTION_TIMEOUT 120 #define IPOQUE_IRC_CONNECTION_TIMEOUT 120 #define IPOQUE_GNUTELLA_CONNECTION_TIMEOUT 60 #define IPOQUE_BATTLEFIELD_CONNECTION_TIMEOUT 60 #define IPOQUE_THUNDER_CONNECTION_TIMEOUT 30 #define IPOQUE_RTSP_CONNECTION_TIMEOUT 5 #define IPOQUE_TVANTS_CONNECTION_TIMEOUT 5 #define IPOQUE_YAHOO_DETECT_HTTP_CONNECTIONS 1 #define IPOQUE_YAHOO_LAN_VIDEO_TIMEOUT 30 #define IPOQUE_ZATTOO_CONNECTION_TIMEOUT 120 #define IPOQUE_ZATTOO_FLASH_TIMEOUT 5 #define IPOQUE_JABBER_STUN_TIMEOUT 30 #define IPOQUE_JABBER_FT_TIMEOUT 5 #define IPOQUE_SOULSEEK_CONNECTION_IP_TICK_TIMEOUT 600 #define IPOQUE_MANOLITO_SUBSCRIBER_TIMEOUT 120 #ifdef IPOQUE_ENABLE_DEBUG_MESSAGES #define IPQ_LOG_BITTORRENT(proto, mod, log_level, args...) \ IPQ_LOG(proto,mod,log_level,args) #define IPQ_LOG_GNUTELLA(proto, mod, log_level, args...) \ IPQ_LOG(proto,mod,log_level,args) #define IPQ_LOG_EDONKEY(proto, mod, log_level, args...) \ IPQ_LOG(proto,mod,log_level,args) #define IPQ_LOG(proto, mod, log_level, args...) \ { \ if(mod != NULL) { \ mod->ipoque_debug_print_file=__FILE__; \ mod->ipoque_debug_print_function=__FUNCTION__; \ mod->ipoque_debug_print_line=__LINE__; \ mod->ipoque_debug_printf(proto, mod, log_level, args); \ } \ } #else /* IPOQUE_ENABLE_DEBUG_MESSAGES */ #if defined(HAVE_NTOP) && defined(WIN32) #define IPQ_LOG_BITTORRENT(...) {} #define IPQ_LOG_GNUTELLA(...) {} #define IPQ_LOG_EDONKEY(...) {} #define IPQ_LOG(...) {} #else #define IPQ_LOG_BITTORRENT(proto, mod, log_level, args...) {} #define IPQ_LOG_GNUTELLA(proto, mod, log_level, args...) {} #define IPQ_LOG_EDONKEY(proto, mod, log_level, args...) {} #define IPQ_LOG(proto, mod, log_level, args...) {} #endif #endif /* IPOQUE_ENABLE_DEBUG_MESSAGES */ typedef struct ipq_call_function_struct { IPOQUE_PROTOCOL_BITMASK detection_bitmask; IPOQUE_PROTOCOL_BITMASK excluded_protocol_bitmask; IPQ_SELECTION_BITMASK_PROTOCOL_SIZE ipq_selection_bitmask; void (*func) (struct ipoque_detection_module_struct *); u8 detection_feature; } ipq_call_function_struct_t; typedef struct ipoque_int_one_line_struct { const u8 *ptr; u16 len; } ipoque_int_one_line_struct_t; typedef struct ipoque_packet_struct { const struct iphdr *iph; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 const struct ipq_ipv6hdr *iphv6; #endif const struct tcphdr *tcp; const struct udphdr *udp; const u8 *generic_l4_ptr; /* is set only for non tcp-udp traffic */ const u8 *payload; IPOQUE_TIMESTAMP_COUNTER_SIZE tick_timestamp; u16 detected_protocol_stack[IPOQUE_PROTOCOL_HISTORY_SIZE]; u8 detected_subprotocol_stack[IPOQUE_PROTOCOL_HISTORY_SIZE]; /* this is for simple read-only access to the real protocol * used for the main loop */ u16 real_protocol_read_only; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 # if IPOQUE_PROTOCOL_HISTORY_SIZE > 5 # error protocol stack size not supported # endif struct { u8 entry_is_real_protocol:5; u8 current_stack_size_minus_one:3; } #if !(defined(HAVE_NTOP) && defined(WIN32)) __attribute__ ((__packed__)) #endif protocol_stack_info; #endif struct ipoque_int_one_line_struct line[IPOQUE_MAX_PARSE_LINES_PER_PACKET]; struct ipoque_int_one_line_struct unix_line[IPOQUE_MAX_PARSE_LINES_PER_PACKET]; struct ipoque_int_one_line_struct host_line; struct ipoque_int_one_line_struct referer_line; struct ipoque_int_one_line_struct content_line; struct ipoque_int_one_line_struct accept_line; struct ipoque_int_one_line_struct user_agent_line; struct ipoque_int_one_line_struct http_url_name; struct ipoque_int_one_line_struct http_encoding; struct ipoque_int_one_line_struct http_transfer_encoding; struct ipoque_int_one_line_struct http_contentlen; struct ipoque_int_one_line_struct http_cookie; struct ipoque_int_one_line_struct http_x_session_type; struct ipoque_int_one_line_struct server_line; struct ipoque_int_one_line_struct http_method; struct ipoque_int_one_line_struct http_response; u16 l3_packet_len; u16 l4_packet_len; u16 payload_packet_len; u16 actual_payload_len; u16 num_retried_bytes; u16 parsed_lines; u16 parsed_unix_lines; u16 empty_line_position; u8 tcp_retransmission; u8 l4_protocol; u8 packet_lines_parsed_complete; u8 packet_unix_lines_parsed_complete; u8 empty_line_position_set; u8 packet_direction:1; } ipoque_packet_struct_t; typedef struct ipoque_detection_module_struct { IPOQUE_PROTOCOL_BITMASK detection_bitmask; IPOQUE_PROTOCOL_BITMASK generic_http_packet_bitmask; IPOQUE_TIMESTAMP_COUNTER_SIZE current_ts; u32 ticks_per_second; #ifdef IPOQUE_ENABLE_DEBUG_MESSAGES void *user_data; #endif /* internal structures to save functions calls */ struct ipoque_packet_struct packet; struct ipoque_flow_struct *flow; struct ipoque_id_struct *src; struct ipoque_id_struct *dst; /* callback function buffer */ struct ipq_call_function_struct callback_buffer[IPOQUE_MAX_SUPPORTED_PROTOCOLS + 1]; u32 callback_buffer_size; struct ipq_call_function_struct callback_buffer_tcp_no_payload[IPOQUE_MAX_SUPPORTED_PROTOCOLS + 1]; u32 callback_buffer_size_tcp_no_payload; struct ipq_call_function_struct callback_buffer_tcp_payload[IPOQUE_MAX_SUPPORTED_PROTOCOLS + 1]; u32 callback_buffer_size_tcp_payload; struct ipq_call_function_struct callback_buffer_udp[IPOQUE_MAX_SUPPORTED_PROTOCOLS + 1]; u32 callback_buffer_size_udp; struct ipq_call_function_struct callback_buffer_non_tcp_udp[IPOQUE_MAX_SUPPORTED_PROTOCOLS + 1]; u32 callback_buffer_size_non_tcp_udp; #ifdef IPOQUE_ENABLE_DEBUG_MESSAGES /* debug callback, only set when debug is used */ ipoque_debug_function_ptr ipoque_debug_printf; const char *ipoque_debug_print_file; const char *ipoque_debug_print_function; u32 ipoque_debug_print_line; #endif /* misc parameters */ u32 tcp_max_retransmission_window_size; u32 edonkey_upper_ports_only:1; u32 edonkey_safe_mode:1; u32 directconnect_connection_ip_tick_timeout; /*gadu gadu*/ u32 gadugadu_peer_connection_timeout; /* pplive params */ u32 pplive_connection_timeout; /* ftp parameters */ u32 ftp_connection_timeout; /* irc parameters */ u32 irc_timeout; /* gnutella parameters */ u32 gnutella_timeout; /* battlefield parameters */ u32 battlefield_timeout; /* thunder parameters */ u32 thunder_timeout; /* SoulSeek parameters */ u32 soulseek_connection_ip_tick_timeout; /* rtsp parameters */ u32 rtsp_connection_timeout; /* tvants parameters */ u32 tvants_connection_timeout; u32 orb_rstp_ts_timeout; /* yahoo */ // u32 yahoo_http_filetransfer_timeout; u8 yahoo_detect_http_connections; u32 yahoo_lan_video_timeout; u32 zattoo_connection_timeout; u32 jabber_stun_timeout; u32 jabber_file_transfer_timeout; u32 manolito_subscriber_timeout; #ifdef IPOQUE_ENABLE_DEBUG_MESSAGES #define IPOQUE_IP_STRING_SIZE 40 char ip_string[IPOQUE_IP_STRING_SIZE]; #endif u8 ip_version_limit; } ipoque_detection_module_struct_t; u32 ipq_bytestream_to_number(const u8 * str, u16 max_chars_to_read, u16 * bytes_read); /* NTOP */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif u16 ntohs_ipq_bytestream_to_number(const u8 * str, u16 max_chars_to_read, u16 * bytes_read) { u16 val = ipq_bytestream_to_number(str, max_chars_to_read, bytes_read); return ntohs(val); } u64 ipq_bytestream_to_number64(const u8 * str, u16 max_chars_to_read, u16 * bytes_read); u32 ipq_bytestream_dec_or_hex_to_number(const u8 * str, u16 max_chars_to_read, u16 * bytes_read); u64 ipq_bytestream_dec_or_hex_to_number64(const u8 * str, u16 max_chars_to_read, u16 * bytes_read); u32 ipq_bytestream_to_ipv4(const u8 * str, u16 max_chars_to_read, u16 * bytes_read); /* function to parse a packet which has line based information into a line based structure * this function will also set some well known line pointers like: * - host, user agent, empty line,.... */ void ipq_parse_packet_line_info(struct ipoque_detection_module_struct *ipoque_struct); void ipq_parse_packet_line_info_unix(struct ipoque_detection_module_struct *ipoque_struct); u16 ipoque_check_for_email_address(struct ipoque_detection_module_struct *ipoque_struct, u16 counter); /* reset ip to zero */ /* NTOP */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipq_ip_clear(ipq_ip_addr_t * ip) { memset(ip, 0, sizeof(ipq_ip_addr_t)); } /* NTOP */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif int ipq_ip_is_set(const ipq_ip_addr_t * ip) { return memcmp(ip, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", sizeof(ipq_ip_addr_t)) != 0; } /* check if the source ip address in packet and ip are equal */ /* NTOP */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif int ipq_packet_src_ip_eql(const struct ipoque_packet_struct *packet, const ipq_ip_addr_t * ip) { #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (packet->iphv6 != NULL) { if (packet->iphv6->saddr.ipq_v6_u.u6_addr64[0] == ip->ipv6.ipq_v6_u.u6_addr64[0] && packet->iphv6->saddr.ipq_v6_u.u6_addr64[1] == ip->ipv6.ipq_v6_u.u6_addr64[1]) { return 1; } else { return 0; } } #endif if (packet->iph->saddr == ip->ipv4) { return 1; } return 0; } /* check if the destination ip address in packet and ip are equal */ /* NTOP */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif int ipq_packet_dst_ip_eql(const struct ipoque_packet_struct *packet, const ipq_ip_addr_t * ip) { #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (packet->iphv6 != NULL) { if (packet->iphv6->daddr.ipq_v6_u.u6_addr64[0] == ip->ipv6.ipq_v6_u.u6_addr64[0] && packet->iphv6->daddr.ipq_v6_u.u6_addr64[1] == ip->ipv6.ipq_v6_u.u6_addr64[1]) { return 1; } else { return 0; } } #endif if (packet->iph->daddr == ip->ipv4) { return 1; } return 0; } /* get the source ip address from packet and put it into ip */ /* NTOP */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipq_packet_src_ip_get(const struct ipoque_packet_struct *packet, ipq_ip_addr_t * ip) { ipq_ip_clear(ip); #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (packet->iphv6 != NULL) { ip->ipv6.ipq_v6_u.u6_addr64[0] = packet->iphv6->saddr.ipq_v6_u.u6_addr64[0]; ip->ipv6.ipq_v6_u.u6_addr64[1] = packet->iphv6->saddr.ipq_v6_u.u6_addr64[1]; } else #endif ip->ipv4 = packet->iph->saddr; } /* get the destination ip address from packet and put it into ip */ /* NTOP */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipq_packet_dst_ip_get(const struct ipoque_packet_struct *packet, ipq_ip_addr_t * ip) { ipq_ip_clear(ip); #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (packet->iphv6 != NULL) { ip->ipv6.ipq_v6_u.u6_addr64[0] = packet->iphv6->daddr.ipq_v6_u.u6_addr64[0]; ip->ipv6.ipq_v6_u.u6_addr64[1] = packet->iphv6->daddr.ipq_v6_u.u6_addr64[1]; } else #endif ip->ipv4 = packet->iph->daddr; } #ifdef IPOQUE_ENABLE_DEBUG_MESSAGES /* get the string representation of ip * returns a pointer to a static string * only valid until the next call of this function */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif char *ipq_get_ip_string(struct ipoque_detection_module_struct *ipoque_struct, const ipq_ip_addr_t * ip) { const u8 *a = (const u8 *) &ip->ipv4; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 if (ip->ipv6.ipq_v6_u.u6_addr32[1] != 0 || ip->ipv6.ipq_v6_u.u6_addr64[1] != 0) { const u16 *b = ip->ipv6.ipq_v6_u.u6_addr16; snprintf(ipoque_struct->ip_string, IPOQUE_IP_STRING_SIZE, "%x:%x:%x:%x:%x:%x:%x:%x", ntohs(b[0]), ntohs(b[1]), ntohs(b[2]), ntohs(b[3]), ntohs(b[4]), ntohs(b[5]), ntohs(b[6]), ntohs(b[7])); return ipoque_struct->ip_string; } #endif snprintf(ipoque_struct->ip_string, IPOQUE_IP_STRING_SIZE, "%u.%u.%u.%u", a[0], a[1], a[2], a[3]); return ipoque_struct->ip_string; } /* get the string representation of the source ip address from packet */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif char *ipq_get_packet_src_ip_string(struct ipoque_detection_module_struct *ipoque_struct, const struct ipoque_packet_struct *packet) { ipq_ip_addr_t ip; ipq_packet_src_ip_get(packet, &ip); return ipq_get_ip_string(ipoque_struct, &ip); } /* get the string representation of the destination ip address from packet */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif char *ipq_get_packet_dst_ip_string(struct ipoque_detection_module_struct *ipoque_struct, const struct ipoque_packet_struct *packet) { ipq_ip_addr_t ip; ipq_packet_dst_ip_get(packet, &ip); return ipq_get_ip_string(ipoque_struct, &ip); } #endif /* IPOQUE_ENABLE_DEBUG_MESSAGES */ #include "ipq_protocol_history.h" #endif /* __IPOQUE_MAIN_INCLUDE_FILE__ */ ntop-5.0.1+dfsg1/nDPI/src/lib/Makefile.am0000644000000000000000000000600712000573146016357 0ustar rootrootAM_CPPFLAGS = -I$(top_srcdir)/src/include/ lib_LTLIBRARIES = libndpi.la noinst_HEADERS = ipq_main.h \ ipq_protocol_history.h \ ipq_protocols.h \ ipq_structs.h \ ipq_utils.h \ linux_compat.h # this will create a library 1.3.0 LIB_AC=1 LIB_REV=3 LIB_ANC=0 # ntop AM_CFLAGS=-fPIC libndpi_la_LDFLAGS=-version-info ${LIB_AC}:${LIB_REV}:${LIB_ANC} libndpi_la_SOURCES = ipq_main.c \ protocols/afp.c \ protocols/aimini.c \ protocols/applejuice.c \ protocols/armagetron.c \ protocols/battlefield.c \ protocols/bgp.c \ protocols/bittorrent.c \ protocols/crossfire.c \ protocols/dhcp.c \ protocols/dhcpv6.c \ protocols/directconnect.c \ protocols/directdownloadlink.c \ protocols/dns.c \ protocols/dofus.c \ protocols/edonkey.c \ protocols/fasttrack.c \ protocols/feidian.c \ protocols/fiesta.c \ protocols/filetopia.c \ protocols/flash.c \ protocols/florensia.c \ protocols/ftp.c \ protocols/gadu_gadu.c \ protocols/gnutella.c \ protocols/guildwars.c \ protocols/halflife2_and_mods.c \ protocols/http_activesync.c \ protocols/http.c \ protocols/i23v5.c \ protocols/iax.c \ protocols/icecast.c \ protocols/imesh.c \ protocols/ipp.c \ protocols/irc.c \ protocols/jabber.c \ protocols/kerberos.c \ protocols/kontiki.c \ protocols/ldap.c \ protocols/mail_imap.c \ protocols/mail_pop.c \ protocols/mail_smtp.c \ protocols/manolito.c \ protocols/maplestory.c \ protocols/mdns.c \ protocols/meebo.c \ protocols/mgcp.c \ protocols/mms.c \ protocols/msn.c \ protocols/mssql.c \ protocols/mysql.c \ protocols/netbios.c \ protocols/nfs.c \ protocols/non_tcp_udp.c \ protocols/ntp.c \ protocols/openft.c \ protocols/oscar.c \ protocols/pando.c \ protocols/pcanywhere.c \ protocols/popo.c \ protocols/postgres.c \ protocols/pplive.c \ protocols/ppstream.c \ protocols/pptp.c \ protocols/qq.c \ protocols/quake.c \ protocols/rdp.c \ protocols/rtp.c \ protocols/rtsp.c \ protocols/secondlife.c \ protocols/shoutcast.c \ protocols/sip.c \ protocols/smb.c \ protocols/snmp.c \ protocols/socrates.c \ protocols/sopcast.c \ protocols/soulseek.c \ protocols/ssdp.c \ protocols/ssh.c \ protocols/ssl.c \ protocols/stealthnet.c \ protocols/steam.c \ protocols/stun.c \ protocols/syslog.c \ protocols/tds.c \ protocols/telnet.c \ protocols/tftp.c \ protocols/thunder.c \ protocols/tvants.c \ protocols/tvuplayer.c \ protocols/usenet.c \ protocols/veohtv.c \ protocols/vnc.c \ protocols/warcraft3.c \ protocols/winmx.c \ protocols/world_of_kung_fu.c \ protocols/world_of_warcraft.c \ protocols/xbox.c \ protocols/xdmcp.c \ protocols/yahoo.c \ protocols/zattoo.c \ protocols/dropbox.c \ protocols/skype.c \ protocols/citrix.c \ protocols/dcerpc.c \ protocols/netflow.c \ protocols/sflow.c \ protocols/radius.c \ protocols/teamviewer.c # NTOP protocols are at the end ntop-5.0.1+dfsg1/nDPI/src/lib/Makefile.in0000644000000000000000000036757612000647575016425 0ustar rootroot# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/lib DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libndpi_la_LIBADD = am_libndpi_la_OBJECTS = ipq_main.lo afp.lo aimini.lo applejuice.lo \ armagetron.lo battlefield.lo bgp.lo bittorrent.lo crossfire.lo \ dhcp.lo dhcpv6.lo directconnect.lo directdownloadlink.lo \ dns.lo dofus.lo edonkey.lo fasttrack.lo feidian.lo fiesta.lo \ filetopia.lo flash.lo florensia.lo ftp.lo gadu_gadu.lo \ gnutella.lo guildwars.lo halflife2_and_mods.lo \ http_activesync.lo http.lo i23v5.lo iax.lo icecast.lo imesh.lo \ ipp.lo irc.lo jabber.lo kerberos.lo kontiki.lo ldap.lo \ mail_imap.lo mail_pop.lo mail_smtp.lo manolito.lo \ maplestory.lo mdns.lo meebo.lo mgcp.lo mms.lo msn.lo mssql.lo \ mysql.lo netbios.lo nfs.lo non_tcp_udp.lo ntp.lo openft.lo \ oscar.lo pando.lo pcanywhere.lo popo.lo postgres.lo pplive.lo \ ppstream.lo pptp.lo qq.lo quake.lo rdp.lo rtp.lo rtsp.lo \ secondlife.lo shoutcast.lo sip.lo smb.lo snmp.lo socrates.lo \ sopcast.lo soulseek.lo ssdp.lo ssh.lo ssl.lo stealthnet.lo \ steam.lo stun.lo syslog.lo tds.lo telnet.lo tftp.lo thunder.lo \ tvants.lo tvuplayer.lo usenet.lo veohtv.lo vnc.lo warcraft3.lo \ winmx.lo world_of_kung_fu.lo world_of_warcraft.lo xbox.lo \ xdmcp.lo yahoo.lo zattoo.lo dropbox.lo skype.lo citrix.lo \ dcerpc.lo netflow.lo sflow.lo radius.lo teamviewer.lo libndpi_la_OBJECTS = $(am_libndpi_la_OBJECTS) libndpi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libndpi_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libndpi_la_SOURCES) DIST_SOURCES = $(libndpi_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/src/include/ lib_LTLIBRARIES = libndpi.la noinst_HEADERS = ipq_main.h \ ipq_protocol_history.h \ ipq_protocols.h \ ipq_structs.h \ ipq_utils.h \ linux_compat.h # this will create a library 1.3.0 LIB_AC = 1 LIB_REV = 3 LIB_ANC = 0 # ntop AM_CFLAGS = -fPIC libndpi_la_LDFLAGS = -version-info ${LIB_AC}:${LIB_REV}:${LIB_ANC} libndpi_la_SOURCES = ipq_main.c \ protocols/afp.c \ protocols/aimini.c \ protocols/applejuice.c \ protocols/armagetron.c \ protocols/battlefield.c \ protocols/bgp.c \ protocols/bittorrent.c \ protocols/crossfire.c \ protocols/dhcp.c \ protocols/dhcpv6.c \ protocols/directconnect.c \ protocols/directdownloadlink.c \ protocols/dns.c \ protocols/dofus.c \ protocols/edonkey.c \ protocols/fasttrack.c \ protocols/feidian.c \ protocols/fiesta.c \ protocols/filetopia.c \ protocols/flash.c \ protocols/florensia.c \ protocols/ftp.c \ protocols/gadu_gadu.c \ protocols/gnutella.c \ protocols/guildwars.c \ protocols/halflife2_and_mods.c \ protocols/http_activesync.c \ protocols/http.c \ protocols/i23v5.c \ protocols/iax.c \ protocols/icecast.c \ protocols/imesh.c \ protocols/ipp.c \ protocols/irc.c \ protocols/jabber.c \ protocols/kerberos.c \ protocols/kontiki.c \ protocols/ldap.c \ protocols/mail_imap.c \ protocols/mail_pop.c \ protocols/mail_smtp.c \ protocols/manolito.c \ protocols/maplestory.c \ protocols/mdns.c \ protocols/meebo.c \ protocols/mgcp.c \ protocols/mms.c \ protocols/msn.c \ protocols/mssql.c \ protocols/mysql.c \ protocols/netbios.c \ protocols/nfs.c \ protocols/non_tcp_udp.c \ protocols/ntp.c \ protocols/openft.c \ protocols/oscar.c \ protocols/pando.c \ protocols/pcanywhere.c \ protocols/popo.c \ protocols/postgres.c \ protocols/pplive.c \ protocols/ppstream.c \ protocols/pptp.c \ protocols/qq.c \ protocols/quake.c \ protocols/rdp.c \ protocols/rtp.c \ protocols/rtsp.c \ protocols/secondlife.c \ protocols/shoutcast.c \ protocols/sip.c \ protocols/smb.c \ protocols/snmp.c \ protocols/socrates.c \ protocols/sopcast.c \ protocols/soulseek.c \ protocols/ssdp.c \ protocols/ssh.c \ protocols/ssl.c \ protocols/stealthnet.c \ protocols/steam.c \ protocols/stun.c \ protocols/syslog.c \ protocols/tds.c \ protocols/telnet.c \ protocols/tftp.c \ protocols/thunder.c \ protocols/tvants.c \ protocols/tvuplayer.c \ protocols/usenet.c \ protocols/veohtv.c \ protocols/vnc.c \ protocols/warcraft3.c \ protocols/winmx.c \ protocols/world_of_kung_fu.c \ protocols/world_of_warcraft.c \ protocols/xbox.c \ protocols/xdmcp.c \ protocols/yahoo.c \ protocols/zattoo.c \ protocols/dropbox.c \ protocols/skype.c \ protocols/citrix.c \ protocols/dcerpc.c \ protocols/netflow.c \ protocols/sflow.c \ protocols/radius.c \ protocols/teamviewer.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libndpi.la: $(libndpi_la_OBJECTS) $(libndpi_la_DEPENDENCIES) $(EXTRA_libndpi_la_DEPENDENCIES) $(libndpi_la_LINK) -rpath $(libdir) $(libndpi_la_OBJECTS) $(libndpi_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aimini.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/applejuice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/armagetron.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/battlefield.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bgp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bittorrent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/citrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crossfire.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dcerpc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhcp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhcpv6.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directconnect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/directdownloadlink.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dofus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dropbox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edonkey.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fasttrack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feidian.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fiesta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filetopia.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/florensia.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gadu_gadu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnutella.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guildwars.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/halflife2_and_mods.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http_activesync.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i23v5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icecast.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipq_main.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/irc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jabber.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kerberos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kontiki.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mail_imap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mail_pop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mail_smtp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/manolito.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maplestory.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meebo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgcp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mssql.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mysql.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netbios.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netflow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nfs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/non_tcp_udp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oscar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pando.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcanywhere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/popo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/postgres.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pplive.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pptp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quake.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radius.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtsp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/secondlife.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sflow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shoutcast.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socrates.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sopcast.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soulseek.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssdp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stealthnet.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steam.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stun.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/syslog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tds.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/teamviewer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/telnet.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tftp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thunder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tvants.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tvuplayer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usenet.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/veohtv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vnc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/warcraft3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/winmx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/world_of_kung_fu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/world_of_warcraft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdmcp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yahoo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zattoo.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< afp.lo: protocols/afp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT afp.lo -MD -MP -MF $(DEPDIR)/afp.Tpo -c -o afp.lo `test -f 'protocols/afp.c' || echo '$(srcdir)/'`protocols/afp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/afp.Tpo $(DEPDIR)/afp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/afp.c' object='afp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o afp.lo `test -f 'protocols/afp.c' || echo '$(srcdir)/'`protocols/afp.c aimini.lo: protocols/aimini.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT aimini.lo -MD -MP -MF $(DEPDIR)/aimini.Tpo -c -o aimini.lo `test -f 'protocols/aimini.c' || echo '$(srcdir)/'`protocols/aimini.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/aimini.Tpo $(DEPDIR)/aimini.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/aimini.c' object='aimini.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o aimini.lo `test -f 'protocols/aimini.c' || echo '$(srcdir)/'`protocols/aimini.c applejuice.lo: protocols/applejuice.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT applejuice.lo -MD -MP -MF $(DEPDIR)/applejuice.Tpo -c -o applejuice.lo `test -f 'protocols/applejuice.c' || echo '$(srcdir)/'`protocols/applejuice.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/applejuice.Tpo $(DEPDIR)/applejuice.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/applejuice.c' object='applejuice.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o applejuice.lo `test -f 'protocols/applejuice.c' || echo '$(srcdir)/'`protocols/applejuice.c armagetron.lo: protocols/armagetron.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT armagetron.lo -MD -MP -MF $(DEPDIR)/armagetron.Tpo -c -o armagetron.lo `test -f 'protocols/armagetron.c' || echo '$(srcdir)/'`protocols/armagetron.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/armagetron.Tpo $(DEPDIR)/armagetron.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/armagetron.c' object='armagetron.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o armagetron.lo `test -f 'protocols/armagetron.c' || echo '$(srcdir)/'`protocols/armagetron.c battlefield.lo: protocols/battlefield.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT battlefield.lo -MD -MP -MF $(DEPDIR)/battlefield.Tpo -c -o battlefield.lo `test -f 'protocols/battlefield.c' || echo '$(srcdir)/'`protocols/battlefield.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/battlefield.Tpo $(DEPDIR)/battlefield.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/battlefield.c' object='battlefield.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o battlefield.lo `test -f 'protocols/battlefield.c' || echo '$(srcdir)/'`protocols/battlefield.c bgp.lo: protocols/bgp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bgp.lo -MD -MP -MF $(DEPDIR)/bgp.Tpo -c -o bgp.lo `test -f 'protocols/bgp.c' || echo '$(srcdir)/'`protocols/bgp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/bgp.Tpo $(DEPDIR)/bgp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/bgp.c' object='bgp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bgp.lo `test -f 'protocols/bgp.c' || echo '$(srcdir)/'`protocols/bgp.c bittorrent.lo: protocols/bittorrent.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bittorrent.lo -MD -MP -MF $(DEPDIR)/bittorrent.Tpo -c -o bittorrent.lo `test -f 'protocols/bittorrent.c' || echo '$(srcdir)/'`protocols/bittorrent.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/bittorrent.Tpo $(DEPDIR)/bittorrent.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/bittorrent.c' object='bittorrent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bittorrent.lo `test -f 'protocols/bittorrent.c' || echo '$(srcdir)/'`protocols/bittorrent.c crossfire.lo: protocols/crossfire.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crossfire.lo -MD -MP -MF $(DEPDIR)/crossfire.Tpo -c -o crossfire.lo `test -f 'protocols/crossfire.c' || echo '$(srcdir)/'`protocols/crossfire.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/crossfire.Tpo $(DEPDIR)/crossfire.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/crossfire.c' object='crossfire.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crossfire.lo `test -f 'protocols/crossfire.c' || echo '$(srcdir)/'`protocols/crossfire.c dhcp.lo: protocols/dhcp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dhcp.lo -MD -MP -MF $(DEPDIR)/dhcp.Tpo -c -o dhcp.lo `test -f 'protocols/dhcp.c' || echo '$(srcdir)/'`protocols/dhcp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dhcp.Tpo $(DEPDIR)/dhcp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/dhcp.c' object='dhcp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dhcp.lo `test -f 'protocols/dhcp.c' || echo '$(srcdir)/'`protocols/dhcp.c dhcpv6.lo: protocols/dhcpv6.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dhcpv6.lo -MD -MP -MF $(DEPDIR)/dhcpv6.Tpo -c -o dhcpv6.lo `test -f 'protocols/dhcpv6.c' || echo '$(srcdir)/'`protocols/dhcpv6.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dhcpv6.Tpo $(DEPDIR)/dhcpv6.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/dhcpv6.c' object='dhcpv6.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dhcpv6.lo `test -f 'protocols/dhcpv6.c' || echo '$(srcdir)/'`protocols/dhcpv6.c directconnect.lo: protocols/directconnect.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT directconnect.lo -MD -MP -MF $(DEPDIR)/directconnect.Tpo -c -o directconnect.lo `test -f 'protocols/directconnect.c' || echo '$(srcdir)/'`protocols/directconnect.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/directconnect.Tpo $(DEPDIR)/directconnect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/directconnect.c' object='directconnect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o directconnect.lo `test -f 'protocols/directconnect.c' || echo '$(srcdir)/'`protocols/directconnect.c directdownloadlink.lo: protocols/directdownloadlink.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT directdownloadlink.lo -MD -MP -MF $(DEPDIR)/directdownloadlink.Tpo -c -o directdownloadlink.lo `test -f 'protocols/directdownloadlink.c' || echo '$(srcdir)/'`protocols/directdownloadlink.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/directdownloadlink.Tpo $(DEPDIR)/directdownloadlink.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/directdownloadlink.c' object='directdownloadlink.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o directdownloadlink.lo `test -f 'protocols/directdownloadlink.c' || echo '$(srcdir)/'`protocols/directdownloadlink.c dns.lo: protocols/dns.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dns.lo -MD -MP -MF $(DEPDIR)/dns.Tpo -c -o dns.lo `test -f 'protocols/dns.c' || echo '$(srcdir)/'`protocols/dns.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dns.Tpo $(DEPDIR)/dns.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/dns.c' object='dns.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dns.lo `test -f 'protocols/dns.c' || echo '$(srcdir)/'`protocols/dns.c dofus.lo: protocols/dofus.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dofus.lo -MD -MP -MF $(DEPDIR)/dofus.Tpo -c -o dofus.lo `test -f 'protocols/dofus.c' || echo '$(srcdir)/'`protocols/dofus.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dofus.Tpo $(DEPDIR)/dofus.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/dofus.c' object='dofus.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dofus.lo `test -f 'protocols/dofus.c' || echo '$(srcdir)/'`protocols/dofus.c edonkey.lo: protocols/edonkey.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT edonkey.lo -MD -MP -MF $(DEPDIR)/edonkey.Tpo -c -o edonkey.lo `test -f 'protocols/edonkey.c' || echo '$(srcdir)/'`protocols/edonkey.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/edonkey.Tpo $(DEPDIR)/edonkey.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/edonkey.c' object='edonkey.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o edonkey.lo `test -f 'protocols/edonkey.c' || echo '$(srcdir)/'`protocols/edonkey.c fasttrack.lo: protocols/fasttrack.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fasttrack.lo -MD -MP -MF $(DEPDIR)/fasttrack.Tpo -c -o fasttrack.lo `test -f 'protocols/fasttrack.c' || echo '$(srcdir)/'`protocols/fasttrack.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/fasttrack.Tpo $(DEPDIR)/fasttrack.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/fasttrack.c' object='fasttrack.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fasttrack.lo `test -f 'protocols/fasttrack.c' || echo '$(srcdir)/'`protocols/fasttrack.c feidian.lo: protocols/feidian.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT feidian.lo -MD -MP -MF $(DEPDIR)/feidian.Tpo -c -o feidian.lo `test -f 'protocols/feidian.c' || echo '$(srcdir)/'`protocols/feidian.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/feidian.Tpo $(DEPDIR)/feidian.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/feidian.c' object='feidian.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o feidian.lo `test -f 'protocols/feidian.c' || echo '$(srcdir)/'`protocols/feidian.c fiesta.lo: protocols/fiesta.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fiesta.lo -MD -MP -MF $(DEPDIR)/fiesta.Tpo -c -o fiesta.lo `test -f 'protocols/fiesta.c' || echo '$(srcdir)/'`protocols/fiesta.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/fiesta.Tpo $(DEPDIR)/fiesta.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/fiesta.c' object='fiesta.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fiesta.lo `test -f 'protocols/fiesta.c' || echo '$(srcdir)/'`protocols/fiesta.c filetopia.lo: protocols/filetopia.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT filetopia.lo -MD -MP -MF $(DEPDIR)/filetopia.Tpo -c -o filetopia.lo `test -f 'protocols/filetopia.c' || echo '$(srcdir)/'`protocols/filetopia.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/filetopia.Tpo $(DEPDIR)/filetopia.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/filetopia.c' object='filetopia.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o filetopia.lo `test -f 'protocols/filetopia.c' || echo '$(srcdir)/'`protocols/filetopia.c flash.lo: protocols/flash.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT flash.lo -MD -MP -MF $(DEPDIR)/flash.Tpo -c -o flash.lo `test -f 'protocols/flash.c' || echo '$(srcdir)/'`protocols/flash.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/flash.Tpo $(DEPDIR)/flash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/flash.c' object='flash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o flash.lo `test -f 'protocols/flash.c' || echo '$(srcdir)/'`protocols/flash.c florensia.lo: protocols/florensia.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT florensia.lo -MD -MP -MF $(DEPDIR)/florensia.Tpo -c -o florensia.lo `test -f 'protocols/florensia.c' || echo '$(srcdir)/'`protocols/florensia.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/florensia.Tpo $(DEPDIR)/florensia.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/florensia.c' object='florensia.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o florensia.lo `test -f 'protocols/florensia.c' || echo '$(srcdir)/'`protocols/florensia.c ftp.lo: protocols/ftp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ftp.lo -MD -MP -MF $(DEPDIR)/ftp.Tpo -c -o ftp.lo `test -f 'protocols/ftp.c' || echo '$(srcdir)/'`protocols/ftp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ftp.Tpo $(DEPDIR)/ftp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/ftp.c' object='ftp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ftp.lo `test -f 'protocols/ftp.c' || echo '$(srcdir)/'`protocols/ftp.c gadu_gadu.lo: protocols/gadu_gadu.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gadu_gadu.lo -MD -MP -MF $(DEPDIR)/gadu_gadu.Tpo -c -o gadu_gadu.lo `test -f 'protocols/gadu_gadu.c' || echo '$(srcdir)/'`protocols/gadu_gadu.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gadu_gadu.Tpo $(DEPDIR)/gadu_gadu.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/gadu_gadu.c' object='gadu_gadu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gadu_gadu.lo `test -f 'protocols/gadu_gadu.c' || echo '$(srcdir)/'`protocols/gadu_gadu.c gnutella.lo: protocols/gnutella.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gnutella.lo -MD -MP -MF $(DEPDIR)/gnutella.Tpo -c -o gnutella.lo `test -f 'protocols/gnutella.c' || echo '$(srcdir)/'`protocols/gnutella.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gnutella.Tpo $(DEPDIR)/gnutella.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/gnutella.c' object='gnutella.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gnutella.lo `test -f 'protocols/gnutella.c' || echo '$(srcdir)/'`protocols/gnutella.c guildwars.lo: protocols/guildwars.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT guildwars.lo -MD -MP -MF $(DEPDIR)/guildwars.Tpo -c -o guildwars.lo `test -f 'protocols/guildwars.c' || echo '$(srcdir)/'`protocols/guildwars.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/guildwars.Tpo $(DEPDIR)/guildwars.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/guildwars.c' object='guildwars.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o guildwars.lo `test -f 'protocols/guildwars.c' || echo '$(srcdir)/'`protocols/guildwars.c halflife2_and_mods.lo: protocols/halflife2_and_mods.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT halflife2_and_mods.lo -MD -MP -MF $(DEPDIR)/halflife2_and_mods.Tpo -c -o halflife2_and_mods.lo `test -f 'protocols/halflife2_and_mods.c' || echo '$(srcdir)/'`protocols/halflife2_and_mods.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/halflife2_and_mods.Tpo $(DEPDIR)/halflife2_and_mods.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/halflife2_and_mods.c' object='halflife2_and_mods.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o halflife2_and_mods.lo `test -f 'protocols/halflife2_and_mods.c' || echo '$(srcdir)/'`protocols/halflife2_and_mods.c http_activesync.lo: protocols/http_activesync.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT http_activesync.lo -MD -MP -MF $(DEPDIR)/http_activesync.Tpo -c -o http_activesync.lo `test -f 'protocols/http_activesync.c' || echo '$(srcdir)/'`protocols/http_activesync.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/http_activesync.Tpo $(DEPDIR)/http_activesync.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/http_activesync.c' object='http_activesync.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o http_activesync.lo `test -f 'protocols/http_activesync.c' || echo '$(srcdir)/'`protocols/http_activesync.c http.lo: protocols/http.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT http.lo -MD -MP -MF $(DEPDIR)/http.Tpo -c -o http.lo `test -f 'protocols/http.c' || echo '$(srcdir)/'`protocols/http.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/http.Tpo $(DEPDIR)/http.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/http.c' object='http.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o http.lo `test -f 'protocols/http.c' || echo '$(srcdir)/'`protocols/http.c i23v5.lo: protocols/i23v5.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT i23v5.lo -MD -MP -MF $(DEPDIR)/i23v5.Tpo -c -o i23v5.lo `test -f 'protocols/i23v5.c' || echo '$(srcdir)/'`protocols/i23v5.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/i23v5.Tpo $(DEPDIR)/i23v5.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/i23v5.c' object='i23v5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o i23v5.lo `test -f 'protocols/i23v5.c' || echo '$(srcdir)/'`protocols/i23v5.c iax.lo: protocols/iax.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iax.lo -MD -MP -MF $(DEPDIR)/iax.Tpo -c -o iax.lo `test -f 'protocols/iax.c' || echo '$(srcdir)/'`protocols/iax.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/iax.Tpo $(DEPDIR)/iax.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/iax.c' object='iax.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iax.lo `test -f 'protocols/iax.c' || echo '$(srcdir)/'`protocols/iax.c icecast.lo: protocols/icecast.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT icecast.lo -MD -MP -MF $(DEPDIR)/icecast.Tpo -c -o icecast.lo `test -f 'protocols/icecast.c' || echo '$(srcdir)/'`protocols/icecast.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/icecast.Tpo $(DEPDIR)/icecast.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/icecast.c' object='icecast.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o icecast.lo `test -f 'protocols/icecast.c' || echo '$(srcdir)/'`protocols/icecast.c imesh.lo: protocols/imesh.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT imesh.lo -MD -MP -MF $(DEPDIR)/imesh.Tpo -c -o imesh.lo `test -f 'protocols/imesh.c' || echo '$(srcdir)/'`protocols/imesh.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/imesh.Tpo $(DEPDIR)/imesh.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/imesh.c' object='imesh.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o imesh.lo `test -f 'protocols/imesh.c' || echo '$(srcdir)/'`protocols/imesh.c ipp.lo: protocols/ipp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipp.lo -MD -MP -MF $(DEPDIR)/ipp.Tpo -c -o ipp.lo `test -f 'protocols/ipp.c' || echo '$(srcdir)/'`protocols/ipp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ipp.Tpo $(DEPDIR)/ipp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/ipp.c' object='ipp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipp.lo `test -f 'protocols/ipp.c' || echo '$(srcdir)/'`protocols/ipp.c irc.lo: protocols/irc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT irc.lo -MD -MP -MF $(DEPDIR)/irc.Tpo -c -o irc.lo `test -f 'protocols/irc.c' || echo '$(srcdir)/'`protocols/irc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/irc.Tpo $(DEPDIR)/irc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/irc.c' object='irc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o irc.lo `test -f 'protocols/irc.c' || echo '$(srcdir)/'`protocols/irc.c jabber.lo: protocols/jabber.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jabber.lo -MD -MP -MF $(DEPDIR)/jabber.Tpo -c -o jabber.lo `test -f 'protocols/jabber.c' || echo '$(srcdir)/'`protocols/jabber.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/jabber.Tpo $(DEPDIR)/jabber.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/jabber.c' object='jabber.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jabber.lo `test -f 'protocols/jabber.c' || echo '$(srcdir)/'`protocols/jabber.c kerberos.lo: protocols/kerberos.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kerberos.lo -MD -MP -MF $(DEPDIR)/kerberos.Tpo -c -o kerberos.lo `test -f 'protocols/kerberos.c' || echo '$(srcdir)/'`protocols/kerberos.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kerberos.Tpo $(DEPDIR)/kerberos.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/kerberos.c' object='kerberos.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kerberos.lo `test -f 'protocols/kerberos.c' || echo '$(srcdir)/'`protocols/kerberos.c kontiki.lo: protocols/kontiki.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kontiki.lo -MD -MP -MF $(DEPDIR)/kontiki.Tpo -c -o kontiki.lo `test -f 'protocols/kontiki.c' || echo '$(srcdir)/'`protocols/kontiki.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kontiki.Tpo $(DEPDIR)/kontiki.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/kontiki.c' object='kontiki.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kontiki.lo `test -f 'protocols/kontiki.c' || echo '$(srcdir)/'`protocols/kontiki.c ldap.lo: protocols/ldap.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ldap.lo -MD -MP -MF $(DEPDIR)/ldap.Tpo -c -o ldap.lo `test -f 'protocols/ldap.c' || echo '$(srcdir)/'`protocols/ldap.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ldap.Tpo $(DEPDIR)/ldap.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/ldap.c' object='ldap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ldap.lo `test -f 'protocols/ldap.c' || echo '$(srcdir)/'`protocols/ldap.c mail_imap.lo: protocols/mail_imap.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mail_imap.lo -MD -MP -MF $(DEPDIR)/mail_imap.Tpo -c -o mail_imap.lo `test -f 'protocols/mail_imap.c' || echo '$(srcdir)/'`protocols/mail_imap.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mail_imap.Tpo $(DEPDIR)/mail_imap.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/mail_imap.c' object='mail_imap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mail_imap.lo `test -f 'protocols/mail_imap.c' || echo '$(srcdir)/'`protocols/mail_imap.c mail_pop.lo: protocols/mail_pop.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mail_pop.lo -MD -MP -MF $(DEPDIR)/mail_pop.Tpo -c -o mail_pop.lo `test -f 'protocols/mail_pop.c' || echo '$(srcdir)/'`protocols/mail_pop.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mail_pop.Tpo $(DEPDIR)/mail_pop.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/mail_pop.c' object='mail_pop.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mail_pop.lo `test -f 'protocols/mail_pop.c' || echo '$(srcdir)/'`protocols/mail_pop.c mail_smtp.lo: protocols/mail_smtp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mail_smtp.lo -MD -MP -MF $(DEPDIR)/mail_smtp.Tpo -c -o mail_smtp.lo `test -f 'protocols/mail_smtp.c' || echo '$(srcdir)/'`protocols/mail_smtp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mail_smtp.Tpo $(DEPDIR)/mail_smtp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/mail_smtp.c' object='mail_smtp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mail_smtp.lo `test -f 'protocols/mail_smtp.c' || echo '$(srcdir)/'`protocols/mail_smtp.c manolito.lo: protocols/manolito.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT manolito.lo -MD -MP -MF $(DEPDIR)/manolito.Tpo -c -o manolito.lo `test -f 'protocols/manolito.c' || echo '$(srcdir)/'`protocols/manolito.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/manolito.Tpo $(DEPDIR)/manolito.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/manolito.c' object='manolito.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o manolito.lo `test -f 'protocols/manolito.c' || echo '$(srcdir)/'`protocols/manolito.c maplestory.lo: protocols/maplestory.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT maplestory.lo -MD -MP -MF $(DEPDIR)/maplestory.Tpo -c -o maplestory.lo `test -f 'protocols/maplestory.c' || echo '$(srcdir)/'`protocols/maplestory.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/maplestory.Tpo $(DEPDIR)/maplestory.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/maplestory.c' object='maplestory.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o maplestory.lo `test -f 'protocols/maplestory.c' || echo '$(srcdir)/'`protocols/maplestory.c mdns.lo: protocols/mdns.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mdns.lo -MD -MP -MF $(DEPDIR)/mdns.Tpo -c -o mdns.lo `test -f 'protocols/mdns.c' || echo '$(srcdir)/'`protocols/mdns.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mdns.Tpo $(DEPDIR)/mdns.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/mdns.c' object='mdns.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mdns.lo `test -f 'protocols/mdns.c' || echo '$(srcdir)/'`protocols/mdns.c meebo.lo: protocols/meebo.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT meebo.lo -MD -MP -MF $(DEPDIR)/meebo.Tpo -c -o meebo.lo `test -f 'protocols/meebo.c' || echo '$(srcdir)/'`protocols/meebo.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/meebo.Tpo $(DEPDIR)/meebo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/meebo.c' object='meebo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o meebo.lo `test -f 'protocols/meebo.c' || echo '$(srcdir)/'`protocols/meebo.c mgcp.lo: protocols/mgcp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mgcp.lo -MD -MP -MF $(DEPDIR)/mgcp.Tpo -c -o mgcp.lo `test -f 'protocols/mgcp.c' || echo '$(srcdir)/'`protocols/mgcp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mgcp.Tpo $(DEPDIR)/mgcp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/mgcp.c' object='mgcp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mgcp.lo `test -f 'protocols/mgcp.c' || echo '$(srcdir)/'`protocols/mgcp.c mms.lo: protocols/mms.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mms.lo -MD -MP -MF $(DEPDIR)/mms.Tpo -c -o mms.lo `test -f 'protocols/mms.c' || echo '$(srcdir)/'`protocols/mms.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mms.Tpo $(DEPDIR)/mms.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/mms.c' object='mms.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mms.lo `test -f 'protocols/mms.c' || echo '$(srcdir)/'`protocols/mms.c msn.lo: protocols/msn.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msn.lo -MD -MP -MF $(DEPDIR)/msn.Tpo -c -o msn.lo `test -f 'protocols/msn.c' || echo '$(srcdir)/'`protocols/msn.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/msn.Tpo $(DEPDIR)/msn.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/msn.c' object='msn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o msn.lo `test -f 'protocols/msn.c' || echo '$(srcdir)/'`protocols/msn.c mssql.lo: protocols/mssql.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mssql.lo -MD -MP -MF $(DEPDIR)/mssql.Tpo -c -o mssql.lo `test -f 'protocols/mssql.c' || echo '$(srcdir)/'`protocols/mssql.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mssql.Tpo $(DEPDIR)/mssql.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/mssql.c' object='mssql.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mssql.lo `test -f 'protocols/mssql.c' || echo '$(srcdir)/'`protocols/mssql.c mysql.lo: protocols/mysql.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mysql.lo -MD -MP -MF $(DEPDIR)/mysql.Tpo -c -o mysql.lo `test -f 'protocols/mysql.c' || echo '$(srcdir)/'`protocols/mysql.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mysql.Tpo $(DEPDIR)/mysql.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/mysql.c' object='mysql.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mysql.lo `test -f 'protocols/mysql.c' || echo '$(srcdir)/'`protocols/mysql.c netbios.lo: protocols/netbios.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netbios.lo -MD -MP -MF $(DEPDIR)/netbios.Tpo -c -o netbios.lo `test -f 'protocols/netbios.c' || echo '$(srcdir)/'`protocols/netbios.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netbios.Tpo $(DEPDIR)/netbios.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/netbios.c' object='netbios.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netbios.lo `test -f 'protocols/netbios.c' || echo '$(srcdir)/'`protocols/netbios.c nfs.lo: protocols/nfs.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nfs.lo -MD -MP -MF $(DEPDIR)/nfs.Tpo -c -o nfs.lo `test -f 'protocols/nfs.c' || echo '$(srcdir)/'`protocols/nfs.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nfs.Tpo $(DEPDIR)/nfs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/nfs.c' object='nfs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nfs.lo `test -f 'protocols/nfs.c' || echo '$(srcdir)/'`protocols/nfs.c non_tcp_udp.lo: protocols/non_tcp_udp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT non_tcp_udp.lo -MD -MP -MF $(DEPDIR)/non_tcp_udp.Tpo -c -o non_tcp_udp.lo `test -f 'protocols/non_tcp_udp.c' || echo '$(srcdir)/'`protocols/non_tcp_udp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/non_tcp_udp.Tpo $(DEPDIR)/non_tcp_udp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/non_tcp_udp.c' object='non_tcp_udp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o non_tcp_udp.lo `test -f 'protocols/non_tcp_udp.c' || echo '$(srcdir)/'`protocols/non_tcp_udp.c ntp.lo: protocols/ntp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ntp.lo -MD -MP -MF $(DEPDIR)/ntp.Tpo -c -o ntp.lo `test -f 'protocols/ntp.c' || echo '$(srcdir)/'`protocols/ntp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntp.Tpo $(DEPDIR)/ntp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/ntp.c' object='ntp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ntp.lo `test -f 'protocols/ntp.c' || echo '$(srcdir)/'`protocols/ntp.c openft.lo: protocols/openft.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT openft.lo -MD -MP -MF $(DEPDIR)/openft.Tpo -c -o openft.lo `test -f 'protocols/openft.c' || echo '$(srcdir)/'`protocols/openft.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/openft.Tpo $(DEPDIR)/openft.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/openft.c' object='openft.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o openft.lo `test -f 'protocols/openft.c' || echo '$(srcdir)/'`protocols/openft.c oscar.lo: protocols/oscar.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT oscar.lo -MD -MP -MF $(DEPDIR)/oscar.Tpo -c -o oscar.lo `test -f 'protocols/oscar.c' || echo '$(srcdir)/'`protocols/oscar.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/oscar.Tpo $(DEPDIR)/oscar.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/oscar.c' object='oscar.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o oscar.lo `test -f 'protocols/oscar.c' || echo '$(srcdir)/'`protocols/oscar.c pando.lo: protocols/pando.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pando.lo -MD -MP -MF $(DEPDIR)/pando.Tpo -c -o pando.lo `test -f 'protocols/pando.c' || echo '$(srcdir)/'`protocols/pando.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pando.Tpo $(DEPDIR)/pando.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/pando.c' object='pando.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pando.lo `test -f 'protocols/pando.c' || echo '$(srcdir)/'`protocols/pando.c pcanywhere.lo: protocols/pcanywhere.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pcanywhere.lo -MD -MP -MF $(DEPDIR)/pcanywhere.Tpo -c -o pcanywhere.lo `test -f 'protocols/pcanywhere.c' || echo '$(srcdir)/'`protocols/pcanywhere.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcanywhere.Tpo $(DEPDIR)/pcanywhere.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/pcanywhere.c' object='pcanywhere.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pcanywhere.lo `test -f 'protocols/pcanywhere.c' || echo '$(srcdir)/'`protocols/pcanywhere.c popo.lo: protocols/popo.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT popo.lo -MD -MP -MF $(DEPDIR)/popo.Tpo -c -o popo.lo `test -f 'protocols/popo.c' || echo '$(srcdir)/'`protocols/popo.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/popo.Tpo $(DEPDIR)/popo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/popo.c' object='popo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o popo.lo `test -f 'protocols/popo.c' || echo '$(srcdir)/'`protocols/popo.c postgres.lo: protocols/postgres.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT postgres.lo -MD -MP -MF $(DEPDIR)/postgres.Tpo -c -o postgres.lo `test -f 'protocols/postgres.c' || echo '$(srcdir)/'`protocols/postgres.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/postgres.Tpo $(DEPDIR)/postgres.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/postgres.c' object='postgres.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o postgres.lo `test -f 'protocols/postgres.c' || echo '$(srcdir)/'`protocols/postgres.c pplive.lo: protocols/pplive.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pplive.lo -MD -MP -MF $(DEPDIR)/pplive.Tpo -c -o pplive.lo `test -f 'protocols/pplive.c' || echo '$(srcdir)/'`protocols/pplive.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pplive.Tpo $(DEPDIR)/pplive.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/pplive.c' object='pplive.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pplive.lo `test -f 'protocols/pplive.c' || echo '$(srcdir)/'`protocols/pplive.c ppstream.lo: protocols/ppstream.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ppstream.lo -MD -MP -MF $(DEPDIR)/ppstream.Tpo -c -o ppstream.lo `test -f 'protocols/ppstream.c' || echo '$(srcdir)/'`protocols/ppstream.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ppstream.Tpo $(DEPDIR)/ppstream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/ppstream.c' object='ppstream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ppstream.lo `test -f 'protocols/ppstream.c' || echo '$(srcdir)/'`protocols/ppstream.c pptp.lo: protocols/pptp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pptp.lo -MD -MP -MF $(DEPDIR)/pptp.Tpo -c -o pptp.lo `test -f 'protocols/pptp.c' || echo '$(srcdir)/'`protocols/pptp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pptp.Tpo $(DEPDIR)/pptp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/pptp.c' object='pptp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pptp.lo `test -f 'protocols/pptp.c' || echo '$(srcdir)/'`protocols/pptp.c qq.lo: protocols/qq.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT qq.lo -MD -MP -MF $(DEPDIR)/qq.Tpo -c -o qq.lo `test -f 'protocols/qq.c' || echo '$(srcdir)/'`protocols/qq.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/qq.Tpo $(DEPDIR)/qq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/qq.c' object='qq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o qq.lo `test -f 'protocols/qq.c' || echo '$(srcdir)/'`protocols/qq.c quake.lo: protocols/quake.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT quake.lo -MD -MP -MF $(DEPDIR)/quake.Tpo -c -o quake.lo `test -f 'protocols/quake.c' || echo '$(srcdir)/'`protocols/quake.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/quake.Tpo $(DEPDIR)/quake.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/quake.c' object='quake.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o quake.lo `test -f 'protocols/quake.c' || echo '$(srcdir)/'`protocols/quake.c rdp.lo: protocols/rdp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rdp.lo -MD -MP -MF $(DEPDIR)/rdp.Tpo -c -o rdp.lo `test -f 'protocols/rdp.c' || echo '$(srcdir)/'`protocols/rdp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/rdp.Tpo $(DEPDIR)/rdp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/rdp.c' object='rdp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rdp.lo `test -f 'protocols/rdp.c' || echo '$(srcdir)/'`protocols/rdp.c rtp.lo: protocols/rtp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtp.lo -MD -MP -MF $(DEPDIR)/rtp.Tpo -c -o rtp.lo `test -f 'protocols/rtp.c' || echo '$(srcdir)/'`protocols/rtp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/rtp.Tpo $(DEPDIR)/rtp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/rtp.c' object='rtp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtp.lo `test -f 'protocols/rtp.c' || echo '$(srcdir)/'`protocols/rtp.c rtsp.lo: protocols/rtsp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtsp.lo -MD -MP -MF $(DEPDIR)/rtsp.Tpo -c -o rtsp.lo `test -f 'protocols/rtsp.c' || echo '$(srcdir)/'`protocols/rtsp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/rtsp.Tpo $(DEPDIR)/rtsp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/rtsp.c' object='rtsp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtsp.lo `test -f 'protocols/rtsp.c' || echo '$(srcdir)/'`protocols/rtsp.c secondlife.lo: protocols/secondlife.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT secondlife.lo -MD -MP -MF $(DEPDIR)/secondlife.Tpo -c -o secondlife.lo `test -f 'protocols/secondlife.c' || echo '$(srcdir)/'`protocols/secondlife.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/secondlife.Tpo $(DEPDIR)/secondlife.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/secondlife.c' object='secondlife.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o secondlife.lo `test -f 'protocols/secondlife.c' || echo '$(srcdir)/'`protocols/secondlife.c shoutcast.lo: protocols/shoutcast.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shoutcast.lo -MD -MP -MF $(DEPDIR)/shoutcast.Tpo -c -o shoutcast.lo `test -f 'protocols/shoutcast.c' || echo '$(srcdir)/'`protocols/shoutcast.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/shoutcast.Tpo $(DEPDIR)/shoutcast.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/shoutcast.c' object='shoutcast.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shoutcast.lo `test -f 'protocols/shoutcast.c' || echo '$(srcdir)/'`protocols/shoutcast.c sip.lo: protocols/sip.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sip.lo -MD -MP -MF $(DEPDIR)/sip.Tpo -c -o sip.lo `test -f 'protocols/sip.c' || echo '$(srcdir)/'`protocols/sip.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/sip.Tpo $(DEPDIR)/sip.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/sip.c' object='sip.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sip.lo `test -f 'protocols/sip.c' || echo '$(srcdir)/'`protocols/sip.c smb.lo: protocols/smb.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT smb.lo -MD -MP -MF $(DEPDIR)/smb.Tpo -c -o smb.lo `test -f 'protocols/smb.c' || echo '$(srcdir)/'`protocols/smb.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/smb.Tpo $(DEPDIR)/smb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/smb.c' object='smb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o smb.lo `test -f 'protocols/smb.c' || echo '$(srcdir)/'`protocols/smb.c snmp.lo: protocols/snmp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT snmp.lo -MD -MP -MF $(DEPDIR)/snmp.Tpo -c -o snmp.lo `test -f 'protocols/snmp.c' || echo '$(srcdir)/'`protocols/snmp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/snmp.Tpo $(DEPDIR)/snmp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/snmp.c' object='snmp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o snmp.lo `test -f 'protocols/snmp.c' || echo '$(srcdir)/'`protocols/snmp.c socrates.lo: protocols/socrates.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT socrates.lo -MD -MP -MF $(DEPDIR)/socrates.Tpo -c -o socrates.lo `test -f 'protocols/socrates.c' || echo '$(srcdir)/'`protocols/socrates.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/socrates.Tpo $(DEPDIR)/socrates.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/socrates.c' object='socrates.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o socrates.lo `test -f 'protocols/socrates.c' || echo '$(srcdir)/'`protocols/socrates.c sopcast.lo: protocols/sopcast.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sopcast.lo -MD -MP -MF $(DEPDIR)/sopcast.Tpo -c -o sopcast.lo `test -f 'protocols/sopcast.c' || echo '$(srcdir)/'`protocols/sopcast.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/sopcast.Tpo $(DEPDIR)/sopcast.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/sopcast.c' object='sopcast.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sopcast.lo `test -f 'protocols/sopcast.c' || echo '$(srcdir)/'`protocols/sopcast.c soulseek.lo: protocols/soulseek.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT soulseek.lo -MD -MP -MF $(DEPDIR)/soulseek.Tpo -c -o soulseek.lo `test -f 'protocols/soulseek.c' || echo '$(srcdir)/'`protocols/soulseek.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/soulseek.Tpo $(DEPDIR)/soulseek.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/soulseek.c' object='soulseek.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o soulseek.lo `test -f 'protocols/soulseek.c' || echo '$(srcdir)/'`protocols/soulseek.c ssdp.lo: protocols/ssdp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ssdp.lo -MD -MP -MF $(DEPDIR)/ssdp.Tpo -c -o ssdp.lo `test -f 'protocols/ssdp.c' || echo '$(srcdir)/'`protocols/ssdp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ssdp.Tpo $(DEPDIR)/ssdp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/ssdp.c' object='ssdp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ssdp.lo `test -f 'protocols/ssdp.c' || echo '$(srcdir)/'`protocols/ssdp.c ssh.lo: protocols/ssh.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ssh.lo -MD -MP -MF $(DEPDIR)/ssh.Tpo -c -o ssh.lo `test -f 'protocols/ssh.c' || echo '$(srcdir)/'`protocols/ssh.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ssh.Tpo $(DEPDIR)/ssh.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/ssh.c' object='ssh.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ssh.lo `test -f 'protocols/ssh.c' || echo '$(srcdir)/'`protocols/ssh.c ssl.lo: protocols/ssl.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ssl.lo -MD -MP -MF $(DEPDIR)/ssl.Tpo -c -o ssl.lo `test -f 'protocols/ssl.c' || echo '$(srcdir)/'`protocols/ssl.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ssl.Tpo $(DEPDIR)/ssl.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/ssl.c' object='ssl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ssl.lo `test -f 'protocols/ssl.c' || echo '$(srcdir)/'`protocols/ssl.c stealthnet.lo: protocols/stealthnet.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stealthnet.lo -MD -MP -MF $(DEPDIR)/stealthnet.Tpo -c -o stealthnet.lo `test -f 'protocols/stealthnet.c' || echo '$(srcdir)/'`protocols/stealthnet.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/stealthnet.Tpo $(DEPDIR)/stealthnet.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/stealthnet.c' object='stealthnet.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o stealthnet.lo `test -f 'protocols/stealthnet.c' || echo '$(srcdir)/'`protocols/stealthnet.c steam.lo: protocols/steam.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT steam.lo -MD -MP -MF $(DEPDIR)/steam.Tpo -c -o steam.lo `test -f 'protocols/steam.c' || echo '$(srcdir)/'`protocols/steam.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/steam.Tpo $(DEPDIR)/steam.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/steam.c' object='steam.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o steam.lo `test -f 'protocols/steam.c' || echo '$(srcdir)/'`protocols/steam.c stun.lo: protocols/stun.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stun.lo -MD -MP -MF $(DEPDIR)/stun.Tpo -c -o stun.lo `test -f 'protocols/stun.c' || echo '$(srcdir)/'`protocols/stun.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/stun.Tpo $(DEPDIR)/stun.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/stun.c' object='stun.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o stun.lo `test -f 'protocols/stun.c' || echo '$(srcdir)/'`protocols/stun.c syslog.lo: protocols/syslog.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT syslog.lo -MD -MP -MF $(DEPDIR)/syslog.Tpo -c -o syslog.lo `test -f 'protocols/syslog.c' || echo '$(srcdir)/'`protocols/syslog.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/syslog.Tpo $(DEPDIR)/syslog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/syslog.c' object='syslog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o syslog.lo `test -f 'protocols/syslog.c' || echo '$(srcdir)/'`protocols/syslog.c tds.lo: protocols/tds.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tds.lo -MD -MP -MF $(DEPDIR)/tds.Tpo -c -o tds.lo `test -f 'protocols/tds.c' || echo '$(srcdir)/'`protocols/tds.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tds.Tpo $(DEPDIR)/tds.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/tds.c' object='tds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tds.lo `test -f 'protocols/tds.c' || echo '$(srcdir)/'`protocols/tds.c telnet.lo: protocols/telnet.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT telnet.lo -MD -MP -MF $(DEPDIR)/telnet.Tpo -c -o telnet.lo `test -f 'protocols/telnet.c' || echo '$(srcdir)/'`protocols/telnet.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/telnet.Tpo $(DEPDIR)/telnet.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/telnet.c' object='telnet.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o telnet.lo `test -f 'protocols/telnet.c' || echo '$(srcdir)/'`protocols/telnet.c tftp.lo: protocols/tftp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tftp.lo -MD -MP -MF $(DEPDIR)/tftp.Tpo -c -o tftp.lo `test -f 'protocols/tftp.c' || echo '$(srcdir)/'`protocols/tftp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tftp.Tpo $(DEPDIR)/tftp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/tftp.c' object='tftp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tftp.lo `test -f 'protocols/tftp.c' || echo '$(srcdir)/'`protocols/tftp.c thunder.lo: protocols/thunder.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT thunder.lo -MD -MP -MF $(DEPDIR)/thunder.Tpo -c -o thunder.lo `test -f 'protocols/thunder.c' || echo '$(srcdir)/'`protocols/thunder.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/thunder.Tpo $(DEPDIR)/thunder.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/thunder.c' object='thunder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o thunder.lo `test -f 'protocols/thunder.c' || echo '$(srcdir)/'`protocols/thunder.c tvants.lo: protocols/tvants.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvants.lo -MD -MP -MF $(DEPDIR)/tvants.Tpo -c -o tvants.lo `test -f 'protocols/tvants.c' || echo '$(srcdir)/'`protocols/tvants.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tvants.Tpo $(DEPDIR)/tvants.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/tvants.c' object='tvants.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvants.lo `test -f 'protocols/tvants.c' || echo '$(srcdir)/'`protocols/tvants.c tvuplayer.lo: protocols/tvuplayer.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvuplayer.lo -MD -MP -MF $(DEPDIR)/tvuplayer.Tpo -c -o tvuplayer.lo `test -f 'protocols/tvuplayer.c' || echo '$(srcdir)/'`protocols/tvuplayer.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tvuplayer.Tpo $(DEPDIR)/tvuplayer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/tvuplayer.c' object='tvuplayer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvuplayer.lo `test -f 'protocols/tvuplayer.c' || echo '$(srcdir)/'`protocols/tvuplayer.c usenet.lo: protocols/usenet.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT usenet.lo -MD -MP -MF $(DEPDIR)/usenet.Tpo -c -o usenet.lo `test -f 'protocols/usenet.c' || echo '$(srcdir)/'`protocols/usenet.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/usenet.Tpo $(DEPDIR)/usenet.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/usenet.c' object='usenet.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o usenet.lo `test -f 'protocols/usenet.c' || echo '$(srcdir)/'`protocols/usenet.c veohtv.lo: protocols/veohtv.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT veohtv.lo -MD -MP -MF $(DEPDIR)/veohtv.Tpo -c -o veohtv.lo `test -f 'protocols/veohtv.c' || echo '$(srcdir)/'`protocols/veohtv.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/veohtv.Tpo $(DEPDIR)/veohtv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/veohtv.c' object='veohtv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o veohtv.lo `test -f 'protocols/veohtv.c' || echo '$(srcdir)/'`protocols/veohtv.c vnc.lo: protocols/vnc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vnc.lo -MD -MP -MF $(DEPDIR)/vnc.Tpo -c -o vnc.lo `test -f 'protocols/vnc.c' || echo '$(srcdir)/'`protocols/vnc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vnc.Tpo $(DEPDIR)/vnc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/vnc.c' object='vnc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vnc.lo `test -f 'protocols/vnc.c' || echo '$(srcdir)/'`protocols/vnc.c warcraft3.lo: protocols/warcraft3.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT warcraft3.lo -MD -MP -MF $(DEPDIR)/warcraft3.Tpo -c -o warcraft3.lo `test -f 'protocols/warcraft3.c' || echo '$(srcdir)/'`protocols/warcraft3.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/warcraft3.Tpo $(DEPDIR)/warcraft3.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/warcraft3.c' object='warcraft3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o warcraft3.lo `test -f 'protocols/warcraft3.c' || echo '$(srcdir)/'`protocols/warcraft3.c winmx.lo: protocols/winmx.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT winmx.lo -MD -MP -MF $(DEPDIR)/winmx.Tpo -c -o winmx.lo `test -f 'protocols/winmx.c' || echo '$(srcdir)/'`protocols/winmx.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/winmx.Tpo $(DEPDIR)/winmx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/winmx.c' object='winmx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o winmx.lo `test -f 'protocols/winmx.c' || echo '$(srcdir)/'`protocols/winmx.c world_of_kung_fu.lo: protocols/world_of_kung_fu.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT world_of_kung_fu.lo -MD -MP -MF $(DEPDIR)/world_of_kung_fu.Tpo -c -o world_of_kung_fu.lo `test -f 'protocols/world_of_kung_fu.c' || echo '$(srcdir)/'`protocols/world_of_kung_fu.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/world_of_kung_fu.Tpo $(DEPDIR)/world_of_kung_fu.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/world_of_kung_fu.c' object='world_of_kung_fu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o world_of_kung_fu.lo `test -f 'protocols/world_of_kung_fu.c' || echo '$(srcdir)/'`protocols/world_of_kung_fu.c world_of_warcraft.lo: protocols/world_of_warcraft.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT world_of_warcraft.lo -MD -MP -MF $(DEPDIR)/world_of_warcraft.Tpo -c -o world_of_warcraft.lo `test -f 'protocols/world_of_warcraft.c' || echo '$(srcdir)/'`protocols/world_of_warcraft.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/world_of_warcraft.Tpo $(DEPDIR)/world_of_warcraft.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/world_of_warcraft.c' object='world_of_warcraft.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o world_of_warcraft.lo `test -f 'protocols/world_of_warcraft.c' || echo '$(srcdir)/'`protocols/world_of_warcraft.c xbox.lo: protocols/xbox.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xbox.lo -MD -MP -MF $(DEPDIR)/xbox.Tpo -c -o xbox.lo `test -f 'protocols/xbox.c' || echo '$(srcdir)/'`protocols/xbox.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xbox.Tpo $(DEPDIR)/xbox.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/xbox.c' object='xbox.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xbox.lo `test -f 'protocols/xbox.c' || echo '$(srcdir)/'`protocols/xbox.c xdmcp.lo: protocols/xdmcp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdmcp.lo -MD -MP -MF $(DEPDIR)/xdmcp.Tpo -c -o xdmcp.lo `test -f 'protocols/xdmcp.c' || echo '$(srcdir)/'`protocols/xdmcp.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xdmcp.Tpo $(DEPDIR)/xdmcp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/xdmcp.c' object='xdmcp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdmcp.lo `test -f 'protocols/xdmcp.c' || echo '$(srcdir)/'`protocols/xdmcp.c yahoo.lo: protocols/yahoo.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT yahoo.lo -MD -MP -MF $(DEPDIR)/yahoo.Tpo -c -o yahoo.lo `test -f 'protocols/yahoo.c' || echo '$(srcdir)/'`protocols/yahoo.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/yahoo.Tpo $(DEPDIR)/yahoo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/yahoo.c' object='yahoo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o yahoo.lo `test -f 'protocols/yahoo.c' || echo '$(srcdir)/'`protocols/yahoo.c zattoo.lo: protocols/zattoo.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT zattoo.lo -MD -MP -MF $(DEPDIR)/zattoo.Tpo -c -o zattoo.lo `test -f 'protocols/zattoo.c' || echo '$(srcdir)/'`protocols/zattoo.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/zattoo.Tpo $(DEPDIR)/zattoo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/zattoo.c' object='zattoo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o zattoo.lo `test -f 'protocols/zattoo.c' || echo '$(srcdir)/'`protocols/zattoo.c dropbox.lo: protocols/dropbox.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dropbox.lo -MD -MP -MF $(DEPDIR)/dropbox.Tpo -c -o dropbox.lo `test -f 'protocols/dropbox.c' || echo '$(srcdir)/'`protocols/dropbox.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dropbox.Tpo $(DEPDIR)/dropbox.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/dropbox.c' object='dropbox.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dropbox.lo `test -f 'protocols/dropbox.c' || echo '$(srcdir)/'`protocols/dropbox.c skype.lo: protocols/skype.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT skype.lo -MD -MP -MF $(DEPDIR)/skype.Tpo -c -o skype.lo `test -f 'protocols/skype.c' || echo '$(srcdir)/'`protocols/skype.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/skype.Tpo $(DEPDIR)/skype.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/skype.c' object='skype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o skype.lo `test -f 'protocols/skype.c' || echo '$(srcdir)/'`protocols/skype.c citrix.lo: protocols/citrix.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT citrix.lo -MD -MP -MF $(DEPDIR)/citrix.Tpo -c -o citrix.lo `test -f 'protocols/citrix.c' || echo '$(srcdir)/'`protocols/citrix.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/citrix.Tpo $(DEPDIR)/citrix.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/citrix.c' object='citrix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o citrix.lo `test -f 'protocols/citrix.c' || echo '$(srcdir)/'`protocols/citrix.c dcerpc.lo: protocols/dcerpc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dcerpc.lo -MD -MP -MF $(DEPDIR)/dcerpc.Tpo -c -o dcerpc.lo `test -f 'protocols/dcerpc.c' || echo '$(srcdir)/'`protocols/dcerpc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dcerpc.Tpo $(DEPDIR)/dcerpc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/dcerpc.c' object='dcerpc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dcerpc.lo `test -f 'protocols/dcerpc.c' || echo '$(srcdir)/'`protocols/dcerpc.c netflow.lo: protocols/netflow.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netflow.lo -MD -MP -MF $(DEPDIR)/netflow.Tpo -c -o netflow.lo `test -f 'protocols/netflow.c' || echo '$(srcdir)/'`protocols/netflow.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netflow.Tpo $(DEPDIR)/netflow.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/netflow.c' object='netflow.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netflow.lo `test -f 'protocols/netflow.c' || echo '$(srcdir)/'`protocols/netflow.c sflow.lo: protocols/sflow.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sflow.lo -MD -MP -MF $(DEPDIR)/sflow.Tpo -c -o sflow.lo `test -f 'protocols/sflow.c' || echo '$(srcdir)/'`protocols/sflow.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/sflow.Tpo $(DEPDIR)/sflow.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/sflow.c' object='sflow.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sflow.lo `test -f 'protocols/sflow.c' || echo '$(srcdir)/'`protocols/sflow.c radius.lo: protocols/radius.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT radius.lo -MD -MP -MF $(DEPDIR)/radius.Tpo -c -o radius.lo `test -f 'protocols/radius.c' || echo '$(srcdir)/'`protocols/radius.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/radius.Tpo $(DEPDIR)/radius.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/radius.c' object='radius.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o radius.lo `test -f 'protocols/radius.c' || echo '$(srcdir)/'`protocols/radius.c teamviewer.lo: protocols/teamviewer.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT teamviewer.lo -MD -MP -MF $(DEPDIR)/teamviewer.Tpo -c -o teamviewer.lo `test -f 'protocols/teamviewer.c' || echo '$(srcdir)/'`protocols/teamviewer.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/teamviewer.Tpo $(DEPDIR)/teamviewer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocols/teamviewer.c' object='teamviewer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o teamviewer.lo `test -f 'protocols/teamviewer.c' || echo '$(srcdir)/'`protocols/teamviewer.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # NTOP protocols are at the end # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ntop-5.0.1+dfsg1/nDPI/src/lib/linux_compat.h0000644000000000000000000000714111713262330017176 0ustar rootroot/* * linux_compat.h * Copyright (C) 2009-2010 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_LINUX_COMPAT_H__ #define __IPOQUE_LINUX_COMPAT_H__ #if defined(BYTE_ORDER) && !defined(__BYTE_ORDER) # define __BYTE_ORDER BYTE_ORDER #endif #if defined(LITTLE_ENDIAN) && !defined(__LITTLE_ENDIAN) # define __LITTLE_ENDIAN LITTLE_ENDIAN #endif #if defined(BIG_ENDIAN) && !defined(__BIG_ENDIAN) # define __BIG_ENDIAN BIG_ENDIAN #endif struct iphdr { #if BYTE_ORDER == LITTLE_ENDIAN uint8_t ihl:4, version:4; #elif BYTE_ORDER == BIG_ENDIAN uint8_t version:4, ihl:4; #else # error "BYTE_ORDER must be defined" #endif uint8_t tos; uint16_t tot_len; uint16_t id; uint16_t frag_off; uint8_t ttl; uint8_t protocol; uint16_t check; uint32_t saddr; uint32_t daddr; }; #if defined(HAVE_NTOP) && (defined(WIN32) /* || defined(__FreeBSD__) */) typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int uint; typedef unsigned long u_long; typedef u_char u_int8_t; typedef u_short u_int16_t; typedef uint u_int32_t; #define _WS2TCPIP_H_ /* Avoid compilation problems */ #define HAVE_SIN6_LEN /* IPv6 address */ /* Already defined in WS2tcpip.h */ struct win_in6_addr { union { u_int8_t u6_addr8[16]; u_int16_t u6_addr16[8]; u_int32_t u6_addr32[4]; } in6_u; #ifdef s6_addr #undef s6_addr #endif #ifdef s6_addr16 #undef s6_addr16 #endif #ifdef s6_addr32 #undef s6_addr32 #endif #define s6_addr in6_u.u6_addr8 // #define s6_addr16 in6_u.u6_addr16 // #define s6_addr32 in6_u.u6_addr32 }; #define in6_addr win_in6_addr /* Generic extension header. */ struct ip6_ext { u_int8_t ip6e_nxt; /* next header. */ u_int8_t ip6e_len; /* length in units of 8 octets. */ }; #else #include #endif #define s6_addr16 __u6_addr.__u6_addr16 #define s6_addr32 __u6_addr.__u6_addr32 struct ip6_hdr { union { struct ip6_hdrctl { uint32_t ip6_un1_flow; uint16_t ip6_un1_plen; uint8_t ip6_un1_nxt; uint8_t ip6_un1_hlim; } ip6_un1; uint8_t ip6_un2_vfc; } ip6_ctlun; struct in6_addr ip6_src; struct in6_addr ip6_dst; }; struct tcphdr { uint16_t source; uint16_t dest; uint32_t seq; uint32_t ack_seq; #if BYTE_ORDER == LITTLE_ENDIAN uint16_t res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1; #elif BYTE_ORDER == BIG_ENDIAN uint16_t doff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1; #else # error "BYTE_ORDER must be defined" #endif uint16_t window; uint16_t check; uint16_t urg_ptr; }; struct udphdr { uint16_t source; uint16_t dest; uint16_t len; uint16_t check; }; #endif ntop-5.0.1+dfsg1/nDPI/src/lib/ipq_structs.h0000644000000000000000000003003112000573146017046 0ustar rootroot/* * ipq_structs.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_STRUCTS_INCLUDE_FILE__ #define __IPOQUE_STRUCTS_INCLUDE_FILE__ # define MAX_PACKET_COUNTER 65000 #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 struct ipq_ip6_addr { union { u8 u6_addr8[16]; u16 u6_addr16[8]; u32 u6_addr32[4]; u64 u6_addr64[2]; } ipq_v6_u; #define ipq_v6_addr ipq_v6_u.u6_addr8 #define ipq_v6_addr16 ipq_v6_u.u6_addr16 #define ipq_v6_addr32 ipq_v6_u.u6_addr32 #define ipq_v6_addr64 ipq_v6_u.u6_addr64 }; struct ipq_ipv6hdr { /* use userspace and kernelspace compatible compile parameters */ #if defined(__LITTLE_ENDIAN_BITFIELD) || (defined( __LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN) u8 priority:4, version:4; #elif defined(__BIG_ENDIAN_BITFIELD) || (defined( __BIG_ENDIAN) && __BYTE_ORDER == __BIG_ENDIAN) u8 version:4, priority:4; #else #error "__LITTLE_ENDIAN_BITFIELD or __BIG_ENDIAN_BITFIELD must be defined, should be done by " #endif u8 flow_lbl[3]; u16 payload_len; u8 nexthdr; u8 hop_limit; struct ipq_ip6_addr saddr; struct ipq_ip6_addr daddr; }; #endif /* IPOQUE_DETECTION_SUPPORT_IPV6 */ typedef union { u32 ipv4; u8 ipv4_u8[4]; #ifdef IPOQUE_DETECTION_SUPPORT_IPV6 struct ipq_ip6_addr ipv6; #endif } ipq_ip_addr_t; typedef struct ipoque_id_struct { /* detected_protocol_bitmask: * access this bitmask to find out whether an id has used skype or not * if a flag is set here, it will not be resetted * to compare this, use: * if (IPOQUE_BITMASK_COMPARE(id->detected_protocol_bitmask, * IPOQUE_PROTOCOL_BITMASK_XXX) != 0) * { * // protocol XXX detected on this id * } */ IPOQUE_PROTOCOL_BITMASK detected_protocol_bitmask; #ifdef IPOQUE_PROTOCOL_FTP ipq_ip_addr_t ftp_ip; #endif #ifdef IPOQUE_PROTOCOL_RTSP ipq_ip_addr_t rtsp_ip_address; #endif #ifdef IPOQUE_PROTOCOL_PPLIVE IPOQUE_TIMESTAMP_COUNTER_SIZE pplive_last_packet_time; #endif #ifdef IPOQUE_PROTOCOL_SIP #ifdef IPOQUE_PROTOCOL_YAHOO IPOQUE_TIMESTAMP_COUNTER_SIZE yahoo_video_lan_timer; #endif #endif #ifdef IPOQUE_PROTOCOL_IRC IPOQUE_TIMESTAMP_COUNTER_SIZE last_time_port_used[16]; #endif #ifdef IPOQUE_PROTOCOL_FTP IPOQUE_TIMESTAMP_COUNTER_SIZE ftp_timer; #endif #ifdef IPOQUE_PROTOCOL_IRC IPOQUE_TIMESTAMP_COUNTER_SIZE irc_ts; #endif #ifdef IPOQUE_PROTOCOL_GNUTELLA IPOQUE_TIMESTAMP_COUNTER_SIZE gnutella_ts; #endif #ifdef IPOQUE_PROTOCOL_BATTLEFIELD IPOQUE_TIMESTAMP_COUNTER_SIZE battlefield_ts; #endif #ifdef IPOQUE_PROTOCOL_THUNDER IPOQUE_TIMESTAMP_COUNTER_SIZE thunder_ts; #endif #ifdef IPOQUE_PROTOCOL_RTSP IPOQUE_TIMESTAMP_COUNTER_SIZE rtsp_timer; #endif #ifdef IPOQUE_PROTOCOL_OSCAR IPOQUE_TIMESTAMP_COUNTER_SIZE oscar_last_safe_access_time; #endif #ifdef IPOQUE_PROTOCOL_GADUGADU u32 gg_ft_ip_address; IPOQUE_TIMESTAMP_COUNTER_SIZE gg_timeout; #endif #ifdef IPOQUE_PROTOCOL_ZATTOO IPOQUE_TIMESTAMP_COUNTER_SIZE zattoo_ts; #endif #ifdef IPOQUE_PROTOCOL_UNENCRYPED_JABBER IPOQUE_TIMESTAMP_COUNTER_SIZE jabber_stun_or_ft_ts; #endif #ifdef IPOQUE_PROTOCOL_MANOLITO u32 manolito_last_pkt_arrival_time; #endif #ifdef IPOQUE_PROTOCOL_DIRECTCONNECT IPOQUE_TIMESTAMP_COUNTER_SIZE directconnect_last_safe_access_time; #endif #ifdef IPOQUE_PROTOCOL_SOULSEEK IPOQUE_TIMESTAMP_COUNTER_SIZE soulseek_last_safe_access_time; #endif #ifdef IPOQUE_PROTOCOL_DIRECTCONNECT u16 detected_directconnect_port; u16 detected_directconnect_udp_port; u16 detected_directconnect_ssl_port; #endif #ifdef IPOQUE_PROTOCOL_PPLIVE u16 pplive_vod_cli_port; #endif #ifdef IPOQUE_PROTOCOL_IRC u16 irc_port[16]; #endif #ifdef IPOQUE_PROTOCOL_GADUGADU u16 gg_ft_port; #endif #ifdef IPOQUE_PROTOCOL_UNENCRYPED_JABBER #define JABBER_MAX_STUN_PORTS 6 u16 jabber_voice_stun_port[JABBER_MAX_STUN_PORTS]; u16 jabber_file_transfer_port[2]; #endif #ifdef IPOQUE_PROTOCOL_GNUTELLA u16 detected_gnutella_port; #endif #ifdef IPOQUE_PROTOCOL_GNUTELLA u16 detected_gnutella_udp_port1; u16 detected_gnutella_udp_port2; #endif #ifdef IPOQUE_PROTOCOL_SOULSEEK u16 soulseek_listen_port; #endif #ifdef IPOQUE_PROTOCOL_IRC u8 irc_number_of_port; #endif #ifdef IPOQUE_PROTOCOL_OSCAR u8 oscar_ssl_session_id[33]; #endif #ifdef IPOQUE_PROTOCOL_GADUGADU u8 gg_call_id[2][7]; u8 gg_fmnumber[8]; #endif #ifdef IPOQUE_PROTOCOL_UNENCRYPED_JABBER u8 jabber_voice_stun_used_ports; #endif #ifdef IPOQUE_PROTOCOL_SIP #ifdef IPOQUE_PROTOCOL_YAHOO u32 yahoo_video_lan_dir:1; #endif #endif #ifdef IPOQUE_PROTOCOL_YAHOO u32 yahoo_conf_logged_in:1; u32 yahoo_voice_conf_logged_in:1; #endif #ifdef IPOQUE_PROTOCOL_FTP u32 ftp_timer_set:1; #endif #ifdef IPOQUE_PROTOCOL_GADUGADU u32 gadu_gadu_ft_direction:1; u32 gadu_gadu_voice:1; u32 gg_next_id:1; #endif #ifdef IPOQUE_PROTOCOL_RTSP u32 rtsp_ts_set:1; #endif #ifdef IPOQUE_PROTOCOL_PPLIVE u32 pplive_last_packet_time_set:1; #endif } ipoque_id_struct; struct ipoque_flow_tcp_struct { #ifdef IPOQUE_PROTOCOL_FLASH u16 flash_bytes; #endif #ifdef IPOQUE_PROTOCOL_MAIL_SMTP u16 smtp_command_bitmask; #endif #ifdef IPOQUE_PROTOCOL_MAIL_POP u16 pop_command_bitmask; #endif #ifdef IPOQUE_PROTOCOL_QQ u16 qq_nxt_len; #endif #ifdef IPOQUE_PROTOCOL_TDS u8 tds_login_version; #endif #ifdef IPOQUE_PROTOCOL_PPLIVE u8 pplive_next_packet_size[2]; #endif #ifdef IPOQUE_PROTOCOL_IRC u8 irc_stage; u8 irc_port; #endif #ifdef IPOQUE_PROTOCOL_GNUTELLA u8 gnutella_msg_id[3]; #endif #ifdef IPOQUE_PROTOCOL_EDONKEY u32 edk_ext:1; #endif #ifdef IPOQUE_PROTOCOL_IRC u32 irc_3a_counter:3; u32 irc_stage2:5; u32 irc_direction:2; u32 irc_0x1000_full:1; #endif #ifdef IPOQUE_PROTOCOL_WINMX u32 winmx_stage:1; // 0-1 #endif #ifdef IPOQUE_PROTOCOL_SOULSEEK u32 soulseek_stage:2; #endif #ifdef IPOQUE_PROTOCOL_FILETOPIA u32 filetopia_stage:2; #endif #ifdef IPOQUE_PROTOCOL_MANOLITO u32 manolito_stage:4; #endif #ifdef IPOQUE_PROTOCOL_TDS u32 tds_stage:3; #endif #ifdef IPOQUE_PROTOCOL_GADUGADU u32 gadugadu_stage:2; #endif #ifdef IPOQUE_PROTOCOL_USENET u32 usenet_stage:2; #endif #ifdef IPOQUE_PROTOCOL_IMESH u32 imesh_stage:4; #endif #ifdef IPOQUE_PROTOCOL_FTP u32 ftp_codes_seen:5; u32 ftp_client_direction:1; #endif #ifdef IPOQUE_PROTOCOL_HTTP u32 http_setup_dir:2; u32 http_stage:2; u32 http_empty_line_seen:1; u32 http_wait_for_retransmission:1; #endif // IPOQUE_PROTOCOL_HTTP #ifdef IPOQUE_PROTOCOL_FLASH u32 flash_stage:3; #endif #ifdef IPOQUE_PROTOCOL_GNUTELLA u32 gnutella_stage:2; //0-2 #endif #ifdef IPOQUE_PROTOCOL_MMS u32 mms_stage:2; #endif #ifdef IPOQUE_PROTOCOL_YAHOO u32 yahoo_sip_comm:1; u32 yahoo_http_proxy_stage:2; #endif #ifdef IPOQUE_PROTOCOL_MSN u32 msn_stage:3; u32 msn_ssl_ft:2; #endif #ifdef IPOQUE_PROTOCOL_SSH u32 ssh_stage:3; #endif #ifdef IPOQUE_PROTOCOL_VNC u32 vnc_stage:2; // 0 - 3 #endif #ifdef IPOQUE_PROTOCOL_STEAM u32 steam_stage:2; // 0 - 3 #endif #ifdef IPOQUE_PROTOCOL_TELNET u32 telnet_stage:2; // 0 - 2 #endif #ifdef IPOQUE_PROTOCOL_SSL u32 ssl_stage:2; // 0 - 3 #endif #ifdef IPOQUE_PROTOCOL_POSTGRES u32 postgres_stage:3; #endif #ifdef IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK u32 ddlink_server_direction:1; #endif u32 seen_syn:1; u32 seen_syn_ack:1; u32 seen_ack:1; #ifdef IPOQUE_PROTOCOL_ICECAST u32 icecast_stage:1; #endif #ifdef IPOQUE_PROTOCOL_DOFUS u32 dofus_stage:1; #endif #ifdef IPOQUE_PROTOCOL_FIESTA u32 fiesta_stage:2; #endif #ifdef IPOQUE_PROTOCOL_WORLDOFWARCRAFT u32 wow_stage:2; #endif #ifdef IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV u32 veoh_tv_stage:2; #endif #ifdef IPOQUE_PROTOCOL_SHOUTCAST u32 shoutcast_stage:2; #endif #ifdef IPOQUE_PROTOCOL_RTP u32 rtp_special_packets_seen:1; #endif #ifdef IPOQUE_PROTOCOL_MAIL_POP u32 mail_pop_stage:2; #endif #ifdef IPOQUE_PROTOCOL_MAIL_IMAP u32 mail_imap_stage:3; #endif #ifdef NTOP_PROTOCOL_SKYPE u8 skype_packet_id; #endif #ifdef NTOP_PROTOCOL_CITRIX u8 citrix_packet_id; #endif #ifdef NTOP_PROTOCOL_TEAMVIEWER u8 teamviewer_stage; #endif } #if !(defined(HAVE_NTOP) && defined(WIN32)) __attribute__ ((__packed__)) #endif ; struct ipoque_flow_udp_struct { #ifdef IPOQUE_PROTOCOL_BATTLEFIELD u32 battlefield_msg_id; #endif #ifdef IPOQUE_PROTOCOL_SNMP u32 snmp_msg_id; #endif #ifdef IPOQUE_PROTOCOL_BATTLEFIELD u32 battlefield_stage:3; #endif #ifdef IPOQUE_PROTOCOL_SNMP u32 snmp_stage:2; #endif #ifdef IPOQUE_PROTOCOL_PPSTREAM u32 ppstream_stage:3; // 0-7 #endif #ifdef IPOQUE_PROTOCOL_FEIDIAN u32 feidian_stage:1; // 0-7 #endif #ifdef IPOQUE_PROTOCOL_HALFLIFE2 u32 halflife2_stage:2; // 0 - 2 #endif #ifdef IPOQUE_PROTOCOL_TFTP u32 tftp_stage:1; #endif #ifdef IPOQUE_PROTOCOL_AIMINI u32 aimini_stage:5; #endif #ifdef IPOQUE_PROTOCOL_XBOX u32 xbox_stage:1; #endif #ifdef NTOP_PROTOCOL_WINDOWS_UPDATE u32 wsus_stage:1; #endif #ifdef NTOP_PROTOCOL_SKYPE u8 skype_packet_id; #endif #ifdef NTOP_PROTOCOL_TEAMVIEWER u8 teamviewer_stage; #endif } #if !(defined(HAVE_NTOP) && defined(WIN32)) __attribute__ ((__packed__)) #endif ; typedef struct ipoque_flow_struct { u16 detected_protocol_stack[IPOQUE_PROTOCOL_HISTORY_SIZE]; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 # if IPOQUE_PROTOCOL_HISTORY_SIZE > 5 # error protocol stack size not supported # endif struct { u8 entry_is_real_protocol:5; u8 current_stack_size_minus_one:3; } #if !(defined(HAVE_NTOP) && defined(WIN32)) __attribute__ ((__packed__)) #endif protocol_stack_info; #endif /* init parameter, internal used to set up timestamp,... */ u8 init_finished:1; u8 setup_packet_direction:1; /* tcp sequence number connection tracking */ u32 next_tcp_seq_nr[2]; /* the tcp / udp / other l4 value union * this is used to reduce the number of bytes for tcp or udp protocol states * */ union { struct ipoque_flow_tcp_struct tcp; struct ipoque_flow_udp_struct udp; } l4; /* ALL protocol specific 64 bit variables here */ /* protocols which have marked a connection as this connection cannot be protocol XXX, multiple u64 */ IPOQUE_PROTOCOL_BITMASK excluded_protocol_bitmask; #ifdef IPOQUE_PROTOCOL_RTP u32 rtp_ssid[2]; #endif #ifdef IPOQUE_PROTOCOL_I23V5 u32 i23v5_len1; u32 i23v5_len2; u32 i23v5_len3; #endif u16 packet_counter; // can be 0-65000 u16 packet_direction_counter[2]; u16 byte_counter[2]; #ifdef IPOQUE_PROTOCOL_RTP u16 rtp_seqnum[2]; /* current highest sequence number (only goes forwards, is not decreased by retransmissions) */ #endif #ifdef IPOQUE_PROTOCOL_RTP /* tcp and udp */ u8 rtp_payload_type[2]; #endif #ifdef IPOQUE_PROTOCOL_BITTORRENT u8 bittorrent_stage; // can be 0-255 #endif #ifdef IPOQUE_PROTOCOL_RTP u32 rtp_stage1:2; //0-3 u32 rtp_stage2:2; #endif #ifdef IPOQUE_PROTOCOL_EDONKEY u32 edk_stage:5; // 0-17 #endif #ifdef IPOQUE_PROTOCOL_DIRECTCONNECT u32 directconnect_stage:2; // 0-1 #endif #ifdef IPOQUE_PROTOCOL_SIP #ifdef IPOQUE_PROTOCOL_YAHOO u32 sip_yahoo_voice:1; #endif #endif #ifdef IPOQUE_PROTOCOL_HTTP u32 http_detected:1; #endif // IPOQUE_PROTOCOL_HTTP #ifdef IPOQUE_PROTOCOL_RTSP u32 rtsprdt_stage:2; u32 rtsp_control_flow:1; #endif #ifdef IPOQUE_PROTOCOL_YAHOO u32 yahoo_detection_finished:2; #endif #ifdef IPOQUE_PROTOCOL_PPLIVE u32 pplive_stage:3; // 0-7 #endif #ifdef IPOQUE_PROTOCOL_ZATTOO u32 zattoo_stage:3; #endif #ifdef IPOQUE_PROTOCOL_QQ u32 qq_stage:3; #endif #ifdef IPOQUE_PROTOCOL_THUNDER u32 thunder_stage:2; // 0-3 #endif #ifdef IPOQUE_PROTOCOL_OSCAR u32 oscar_ssl_voice_stage:3; u32 oscar_video_voice:1; #endif #ifdef IPOQUE_PROTOCOL_FLORENSIA u32 florensia_stage:1; #endif } ipoque_flow_struct_t; #endif /* __IPOQUE_STRUCTS_INCLUDE_FILE__ */ ntop-5.0.1+dfsg1/nDPI/src/lib/ipq_protocol_history.h0000644000000000000000000000724211661644647021012 0ustar rootroot/* * ipq_protocol_history.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef IPQ_PROTOCOL_HISTORY_H #define IPQ_PROTOCOL_HISTORY_H typedef enum { IPOQUE_REAL_PROTOCOL = 0, IPOQUE_CORRELATED_PROTOCOL = 1 } ipoque_protocol_type_t; /* generic function for setting a protocol for a flow * * what it does is: * 1.call ipoque_int_change_protocol * 2.set protocol in detected bitmask for src and dst */ void ipoque_int_add_connection(struct ipoque_detection_module_struct *ipoque_struct, u16 detected_protocol, ipoque_protocol_type_t protocol_type); /* generic function for changing the flow protocol * * what it does is: * 1.update the flow protocol stack with the new protocol */ void ipoque_int_change_flow_protocol(struct ipoque_detection_module_struct *ipoque_struct, u16 detected_protocol, ipoque_protocol_type_t protocol_type); /* generic function for changing the packetprotocol * * what it does is: * 1.update the packet protocol stack with the new protocol */ void ipoque_int_change_packet_protocol(struct ipoque_detection_module_struct *ipoque_struct, u16 detected_protocol, ipoque_protocol_type_t protocol_type); /* generic function for changing the protocol * * what it does is: * 1.update the flow protocol stack with the new protocol * 2.update the packet protocol stack with the new protocol */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_int_change_protocol(struct ipoque_detection_module_struct *ipoque_struct, u16 detected_protocol, ipoque_protocol_type_t protocol_type) { ipoque_int_change_flow_protocol(ipoque_struct, detected_protocol, protocol_type); ipoque_int_change_packet_protocol(ipoque_struct, detected_protocol, protocol_type); } /* turns a packet back to unknown */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_int_reset_packet_protocol(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_packet_struct *packet = &ipoque_struct->packet; packet->detected_protocol_stack[0] = IPOQUE_PROTOCOL_UNKNOWN; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 packet->protocol_stack_info.current_stack_size_minus_one = 0; packet->protocol_stack_info.entry_is_real_protocol = 0; #endif } /* turns a flow back to unknown */ #if !(defined(HAVE_NTOP) && defined(WIN32)) static inline #else __forceinline static #endif void ipoque_int_reset_protocol(struct ipoque_detection_module_struct *ipoque_struct) { struct ipoque_flow_struct *flow = ipoque_struct->flow; if (flow) { flow->detected_protocol_stack[0] = IPOQUE_PROTOCOL_UNKNOWN; #if IPOQUE_PROTOCOL_HISTORY_SIZE > 1 flow->protocol_stack_info.current_stack_size_minus_one = 0; flow->protocol_stack_info.entry_is_real_protocol = 0; #endif } ipoque_int_reset_packet_protocol(ipoque_struct); } #endif ntop-5.0.1+dfsg1/nDPI/src/include/0000755000000000000000000000000012012127301015164 5ustar rootrootntop-5.0.1+dfsg1/nDPI/src/include/ipq_protocols_osdpi.h0000644000000000000000000002547212004230527021450 0ustar rootroot/* * ipq_protocols_osdpi.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_API_INCLUDE_FILE__ #endif #ifndef __IPQ_PROTOCOLS_DEFAULT_H__ #define __IPQ_PROTOCOLS_DEFAULT_H__ #ifdef __cplusplus extern "C" { #endif // #define IPOQUE_ENABLE_DEBUG_MESSAGES #define IPOQUE_DETECTION_SUPPORT_IPV6 #define IPOQUE_PROTOCOL_HISTORY_SIZE 3 #define IPOQUE_PROTOCOL_UNKNOWN 0 #define IPOQUE_PROTOCOL_FTP 1 #define IPOQUE_PROTOCOL_MAIL_POP 2 #define IPOQUE_PROTOCOL_MAIL_SMTP 3 #define IPOQUE_PROTOCOL_MAIL_IMAP 4 #define IPOQUE_PROTOCOL_DNS 5 #define IPOQUE_PROTOCOL_IPP 6 #define IPOQUE_PROTOCOL_HTTP 7 #define IPOQUE_PROTOCOL_MDNS 8 #define IPOQUE_PROTOCOL_NTP 9 #define IPOQUE_PROTOCOL_NETBIOS 10 #define IPOQUE_PROTOCOL_NFS 11 #define IPOQUE_PROTOCOL_SSDP 12 #define IPOQUE_PROTOCOL_BGP 13 #define IPOQUE_PROTOCOL_SNMP 14 #define IPOQUE_PROTOCOL_XDMCP 15 #define IPOQUE_PROTOCOL_SMB 16 #define IPOQUE_PROTOCOL_SYSLOG 17 #define IPOQUE_PROTOCOL_DHCP 18 #define IPOQUE_PROTOCOL_POSTGRES 19 #define IPOQUE_PROTOCOL_MYSQL 20 #define IPOQUE_PROTOCOL_TDS 21 #define IPOQUE_PROTOCOL_DIRECT_DOWNLOAD_LINK 22 #define IPOQUE_PROTOCOL_I23V5 23 #define IPOQUE_PROTOCOL_APPLEJUICE 24 #define IPOQUE_PROTOCOL_DIRECTCONNECT 25 #define IPOQUE_PROTOCOL_SOCRATES 26 #define IPOQUE_PROTOCOL_WINMX 27 #define IPOQUE_PROTOCOL_MANOLITO 28 #define IPOQUE_PROTOCOL_PANDO 29 #define IPOQUE_PROTOCOL_FILETOPIA 30 #define IPOQUE_PROTOCOL_IMESH 31 #define IPOQUE_PROTOCOL_KONTIKI 32 #define IPOQUE_PROTOCOL_OPENFT 33 #define IPOQUE_PROTOCOL_FASTTRACK 34 #define IPOQUE_PROTOCOL_GNUTELLA 35 #define IPOQUE_PROTOCOL_EDONKEY 36 #define IPOQUE_PROTOCOL_BITTORRENT 37 #define IPOQUE_PROTOCOL_OFF 38 #define IPOQUE_PROTOCOL_AVI 39 #define IPOQUE_PROTOCOL_FLASH 40 #define IPOQUE_PROTOCOL_OGG 41 #define IPOQUE_PROTOCOL_MPEG 42 #define IPOQUE_PROTOCOL_QUICKTIME 43 #define IPOQUE_PROTOCOL_REALMEDIA 44 #define IPOQUE_PROTOCOL_WINDOWSMEDIA 45 #define IPOQUE_PROTOCOL_MMS 46 #define IPOQUE_PROTOCOL_XBOX 47 #define IPOQUE_PROTOCOL_QQ 48 #define IPOQUE_PROTOCOL_MOVE 49 #define IPOQUE_PROTOCOL_RTSP 50 #define IPOQUE_PROTOCOL_FEIDIAN 51 #define IPOQUE_PROTOCOL_ICECAST 52 #define IPOQUE_PROTOCOL_PPLIVE 53 #define IPOQUE_PROTOCOL_PPSTREAM 54 #define IPOQUE_PROTOCOL_ZATTOO 55 #define IPOQUE_PROTOCOL_SHOUTCAST 56 #define IPOQUE_PROTOCOL_SOPCAST 57 #define IPOQUE_PROTOCOL_TVANTS 58 #define IPOQUE_PROTOCOL_TVUPLAYER 59 #define IPOQUE_PROTOCOL_HTTP_APPLICATION_VEOHTV 60 #define IPOQUE_PROTOCOL_QQLIVE 61 #define IPOQUE_PROTOCOL_THUNDER 62 #define IPOQUE_PROTOCOL_SOULSEEK 63 #define IPOQUE_PROTOCOL_GADUGADU 64 #define IPOQUE_PROTOCOL_IRC 65 #define IPOQUE_PROTOCOL_POPO 66 #define IPOQUE_PROTOCOL_UNENCRYPED_JABBER 67 #define IPOQUE_PROTOCOL_MSN 68 #define IPOQUE_PROTOCOL_OSCAR 69 #define IPOQUE_PROTOCOL_YAHOO 70 #define IPOQUE_PROTOCOL_BATTLEFIELD 71 #define IPOQUE_PROTOCOL_QUAKE 72 #define IPOQUE_PROTOCOL_SECONDLIFE 73 #define IPOQUE_PROTOCOL_STEAM 74 #define IPOQUE_PROTOCOL_HALFLIFE2 75 #define IPOQUE_PROTOCOL_WORLDOFWARCRAFT 76 #define IPOQUE_PROTOCOL_TELNET 77 #define IPOQUE_PROTOCOL_STUN 78 #define IPOQUE_PROTOCOL_IPSEC 79 #define IPOQUE_PROTOCOL_GRE 80 #define IPOQUE_PROTOCOL_ICMP 81 #define IPOQUE_PROTOCOL_IGMP 82 #define IPOQUE_PROTOCOL_EGP 83 #define IPOQUE_PROTOCOL_SCTP 84 #define IPOQUE_PROTOCOL_OSPF 85 #define IPOQUE_PROTOCOL_IP_IN_IP 86 #define IPOQUE_PROTOCOL_RTP 87 #define IPOQUE_PROTOCOL_RDP 88 #define IPOQUE_PROTOCOL_VNC 89 #define IPOQUE_PROTOCOL_PCANYWHERE 90 #define IPOQUE_PROTOCOL_SSL 91 #define IPOQUE_PROTOCOL_SSH 92 #define IPOQUE_PROTOCOL_USENET 93 #define IPOQUE_PROTOCOL_MGCP 94 #define IPOQUE_PROTOCOL_IAX 95 #define IPOQUE_PROTOCOL_TFTP 96 #define IPOQUE_PROTOCOL_AFP 97 #define IPOQUE_PROTOCOL_STEALTHNET 98 #define IPOQUE_PROTOCOL_AIMINI 99 #define IPOQUE_PROTOCOL_SIP 100 #define IPOQUE_PROTOCOL_TRUPHONE 101 #define IPOQUE_PROTOCOL_ICMPV6 102 #define IPOQUE_PROTOCOL_DHCPV6 103 #define IPOQUE_PROTOCOL_ARMAGETRON 104 #define IPOQUE_PROTOCOL_CROSSFIRE 105 #define IPOQUE_PROTOCOL_DOFUS 106 #define IPOQUE_PROTOCOL_FIESTA 107 #define IPOQUE_PROTOCOL_FLORENSIA 108 #define IPOQUE_PROTOCOL_GUILDWARS 109 #define IPOQUE_PROTOCOL_HTTP_APPLICATION_ACTIVESYNC 110 #define IPOQUE_PROTOCOL_KERBEROS 111 #define IPOQUE_PROTOCOL_LDAP 112 #define IPOQUE_PROTOCOL_MAPLESTORY 113 #define IPOQUE_PROTOCOL_MSSQL 114 #define IPOQUE_PROTOCOL_PPTP 115 #define IPOQUE_PROTOCOL_WARCRAFT3 116 #define IPOQUE_PROTOCOL_WORLD_OF_KUNG_FU 117 #define IPOQUE_PROTOCOL_MEEBO 118 #ifdef HAVE_NTOP typedef struct { char *string_to_match; int protocol_id; } ntop_protocol_match; #define NTOP_PROTOCOL_FACEBOOK 119 #define NTOP_PROTOCOL_TWITTER 120 #define NTOP_PROTOCOL_DROPBOX 121 #define NTOP_PROTOCOL_GMAIL 122 #define NTOP_PROTOCOL_GOOGLE_MAPS 123 #define NTOP_PROTOCOL_YOUTUBE 124 #define NTOP_PROTOCOL_SKYPE 125 #define NTOP_PROTOCOL_GOOGLE 126 #define NTOP_PROTOCOL_DCERPC 127 #define NTOP_PROTOCOL_NETFLOW 128 #define NTOP_PROTOCOL_SFLOW 129 #define NTOP_PROTOCOL_HTTP_CONNECT 130 #define NTOP_PROTOCOL_HTTP_PROXY 131 #define NTOP_PROTOCOL_CITRIX 132 #define NTOP_PROTOCOL_NETFLIX 133 #define NTOP_PROTOCOL_LASTFM 134 #define NTOP_PROTOCOL_GROOVESHARK 135 #define NTOP_PROTOCOL_SKYFILE_PREPAID 136 #define NTOP_PROTOCOL_SKYFILE_RUDICS 137 #define NTOP_PROTOCOL_SKYFILE_POSTPAID 138 #define NTOP_PROTOCOL_CITRIX_ONLINE 139 #define NTOP_PROTOCOL_APPLE 140 #define NTOP_PROTOCOL_WEBEX 141 #define NTOP_PROTOCOL_WHATSAPP 142 #define NTOP_PROTOCOL_APPLE_ICLOUD 143 #define NTOP_PROTOCOL_VIBER 144 #define NTOP_PROTOCOL_APPLE_ITUNES 145 #define NTOP_PROTOCOL_RADIUS 146 #define NTOP_PROTOCOL_WINDOWS_UPDATE 147 /* Thierry Laurion */ #define NTOP_PROTOCOL_TEAMVIEWER 148 /* xplico.org */ #define NTOP_PROTOCOL_TUENTI 149 /* NOTE: REMEMBER TO UPDATE IPOQUE_PROTOCOL_LONG_STRING / IPOQUE_PROTOCOL_SHORT_STRING */ #endif #define IPOQUE_LAST_IMPLEMENTED_PROTOCOL 149 #define IPOQUE_MAX_SUPPORTED_PROTOCOLS (IPOQUE_LAST_IMPLEMENTED_PROTOCOL + 1) #define IPOQUE_PROTOCOL_LONG_STRING "Unknown","FTP","Mail_POP","Mail_SMTP","Mail_IMAP","DNS","IPP","HTTP","MDNS","NTP",\ "NETBIOS","NFS","SSDP","BGP","SNMP","XDMCP","SMB","SYSLOG","DHCP","PostgreSQL","MySQL","TDS","DirectDownloadLink","I23V5", \ "AppleJuice","DirectConnect","Socrates","WinMX","MANOLITO","PANDO","Filetopia","iMESH","Kontiki","OpenFT","Kazaa/Fasttrack", \ "Gnutella","eDonkey","Bittorrent","OFF","AVI","Flash","OGG","MPEG","QuickTime","RealMedia","Windowsmedia","MMS","XBOX","QQ", \ "MOVE","RTSP","Feidian","Icecast","PPLive","PPStream","Zattoo","SHOUTCast","SopCast","TVAnts","TVUplayer","VeohTV", \ "QQLive","Thunder/Webthunder","Soulseek","GaduGadu","IRC","Popo","Jabber","MSN","Oscar","Yahoo","Battlefield","Quake", \ "Second Life","Steam","Halflife2","World of Warcraft","Telnet","STUN","IPSEC","GRE","ICMP","IGMP","EGP","SCTP","OSPF", \ "IP in IP","RTP","RDP","VNC","PCAnywhere","SSL","SSH","USENET","MGCP","IAX","TFTP","AFP","StealthNet","Aimini","SIP","Truphone", \ "ICMPv6","DHCPv6","Armagetron","CrossFire","Dofus","Fiesta","Florensia","Guildwars","HTTP Application Activesync","Kerberos", \ "LDAP","MapleStory","msSQL","PPTP","WARCRAFT3","World of Kung Fu","MEEBO", \ "FaceBook","Twitter","DropBox","Gmail","Google Maps","YouTube","Skype","Google","DCE RPC","NetFlow_IPFIX","sFlow", \ "HTTP Connect","HTTP Proxy","Citrix","Netflix","Last.fm","Grooveshark", \ "Skyfile_prepaid","Skyfile_rudics","Skyfile_postpaid","CitrixOnline_GotoMeeting","Apple","Webex",\ "WhatsApp","Apple_iCloud","Viber","Apple_iTunes","Radius","WindowsUpdate","TeamViewer","Tuenti" #define IPOQUE_PROTOCOL_SHORT_STRING "ukn","ftp","pop","smtp","imap","dns","ipp","http","mdns","ntp","netbios","nfs","ssdp", \ "bgp","snmp","xdmcp","smb","syslog","dhcp","postgres","mysql","tds","ddl","i23v5","apple","directconnect","socrates","winmx", \ "manolito","pando","filetopia","iMESH","kontiki","openft","fasttrack","gnutella","edonkey","bittorrent","off","avi", \ "flash","ogg","mpeg","quicktime","realmedia","windowsmedia","mms","xbox","qq","move","rtsp","feidian","icecast","pplive", \ "ppstream","zattoo","shoutcast","sopcast","tvants","tvuplayer","veohtv","qqlive","thunder","soulseek","gadugadu","irc", \ "popo","jabber","msn","oscar","yahoo","battlefield","quake","secondlife","steam","hl2","worldofwarcraft","telnet","stun", \ "ipsec","gre","icmp","igmp","egp","sctp","ospf","ipip","rtp","rdp","vnc","pcanywhere","ssl","ssh","usenet","mgcp","iax", \ "tftp","afp","stealthnet","aimini","sip","truphone","icmpv6","dhcpv6","armagetron","crossfire","dofus","fiesta","florensia", \ "guildwars","httpactivesync","kerberos","ldap","maplestory","mssql","pptp","warcraft3","wokf","meebo",\ "facebook","twitter","dropbox","gmail","gmaps","youtube","skype","google","dcerpc","netflow","sflow", \ "http_connect","http_proxy","Citrix","Netflix","Last.fm","Grooveshark",\ "Skyfile_pre", "Skyfile_ru","Skyfile_post","CitrixOnline","iMessage_Facetime","Webex","WhatsApp","iCloud","Viber","iTunes", \ "Radius","WinUpdate","TeamViewer","tuenti" #ifdef __cplusplus } #endif #endif ntop-5.0.1+dfsg1/nDPI/src/include/ipq_macros.h0000644000000000000000000002044411655273464017526 0ustar rootroot/* * ipq_macros.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_API_INCLUDE_FILE__ #error CANNOT INCLUDE THIS .H FILE, INCLUDE IPQ_API.H #endif #ifndef __IPQ_MACROS_H__ #define __IPQ_MACROS_H__ #ifdef __cplusplus extern "C" { #endif #if IPOQUE_MAX_SUPPORTED_PROTOCOLS >= 128 typedef struct ipoque_protocol_bitmask_struct { u64 bitmask[3]; } ipoque_protocol_bitmask_struct_t; #define IPOQUE_PROTOCOL_BITMASK struct ipoque_protocol_bitmask_struct #elif IPOQUE_MAX_SUPPORTED_PROTOCOLS >= 64 typedef struct ipoque_protocol_bitmask_struct { u64 bitmask[2]; } ipoque_protocol_bitmask_struct_t; #define IPOQUE_PROTOCOL_BITMASK struct ipoque_protocol_bitmask_struct #else #define IPOQUE_PROTOCOL_BITMASK u64 #endif #if IPOQUE_MAX_SUPPORTED_PROTOCOLS < 64 #define IPOQUE_CONVERT_PROTOCOL_TO_BITMASK(p) ( ((IPOQUE_PROTOCOL_BITMASK)1) << (p) ) #define IPOQUE_SAVE_AS_BITMASK(bitmask,value) (bitmask)=(((IPOQUE_PROTOCOL_BITMASK)1)<<(value)) #define IPOQUE_BITMASK_COMPARE(a,b) ((a) & (b)) #define IPOQUE_BITMASK_MATCH(x,y) ((x) == (y)) // all protocols in b are also in a #define IPOQUE_BITMASK_CONTAINS_BITMASK(a,b) (((a) & (b)) == (b)) #define IPOQUE_BITMASK_ADD(a,b) (a)|=(b) #define IPOQUE_BITMASK_AND(a,b) (a)&=(b) #define IPOQUE_BITMASK_DEL(a,b) (a)=((a) & (~(b))) #define IPOQUE_BITMASK_SET(a,b) (a)=(b) #define IPOQUE_PROTOCOL_BITMASK_NONE ((IPOQUE_PROTOCOL_BITMASK)0) #define IPOQUE_ADD_PROTOCOL_TO_BITMASK(bmask,value) IPOQUE_BITMASK_ADD(bmask,IPOQUE_CONVERT_PROTOCOL_TO_BITMASK(value)) #define IPOQUE_DEL_PROTOCOL_FROM_BITMASK(bmask,value) IPOQUE_BITMASK_DEL(bmask,IPOQUE_CONVERT_PROTOCOL_TO_BITMASK(value)) #define IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(bmask,value) IPOQUE_BITMASK_COMPARE(bmask,IPOQUE_CONVERT_PROTOCOL_TO_BITMASK(value)) #define IPOQUE_BITMASK_RESET(a) (a) = 0 #define IPOQUE_BITMASK_SET_ALL(a) (a) = ((IPOQUE_PROTOCOL_BITMASK)0xFFFFFFFFFFFFFFFFULL) #define IPOQUE_BITMASK_DEBUG_OUTPUT_BITMASK_STRING "%llu" #define IPOQUE_BITMASK_DEBUG_OUTPUT_BITMASK_VALUE(bm) (bm) // you can use a printf(IPOQUE_BITMASK_DEBUG_OUTPUT_BITMASK_STRING, #define IPOQUE_BITMASK_IS_ZERO(a) ( (a) == 0 ) #define IPOQUE_BITMASK_CONTAINS_NEGATED_BITMASK(a,b) ((a) & ~(b) == ~(b)) #elif IPOQUE_MAX_SUPPORTED_PROTOCOLS < 128 #define IPOQUE_SAVE_AS_BITMASK(bmask,value) \ { \ (bmask).bitmask[0] = 0; \ (bmask).bitmask[1] = 0; \ (bmask).bitmask[(value) >> 6] = (((u64)1)<<((value) & 0x3F)); \ } #define IPOQUE_BITMASK_COMPARE(a,b) (((a).bitmask[0]) & ((b).bitmask[0]) || ((a).bitmask[1]) & ((b).bitmask[1])) #define IPOQUE_BITMASK_MATCH(a,b) (((a).bitmask[0]) == ((b).bitmask[0]) && ((a).bitmask[1]) == ((b).bitmask[1])) // all protocols in b are also in a #define IPOQUE_BITMASK_CONTAINS_BITMASK(a,b) ((((a).bitmask[0] & (b).bitmask[0]) == (b).bitmask[0]) && (((a).bitmask[1] & (b).bitmask[1]) == (b).bitmask[1])) #define IPOQUE_BITMASK_ADD(a,b) {(a).bitmask[0] |= (b).bitmask[0]; (a).bitmask[1] |= (b).bitmask[1];} #define IPOQUE_BITMASK_AND(a,b) {(a).bitmask[0] &= (b).bitmask[0]; (a).bitmask[1] &= (b).bitmask[1];} #define IPOQUE_BITMASK_DEL(a,b) {(a).bitmask[0] = (a).bitmask[0] & (~((b).bitmask[0]));(a).bitmask[1] = (a).bitmask[1] & ( ~((b).bitmask[1]));} #define IPOQUE_BITMASK_SET(a,b) {(a).bitmask[0] = ((b).bitmask[0]); (a).bitmask[1] = (b).bitmask[1];} #define IPOQUE_BITMASK_RESET(a) {((a).bitmask[0]) = 0; ((a).bitmask[1]) = 0;} #define IPOQUE_BITMASK_SET_ALL(a) {((a).bitmask[0]) = 0xFFFFFFFFFFFFFFFFULL; ((a).bitmask[1]) = 0xFFFFFFFFFFFFFFFFULL;} /* this is a very very tricky macro *g*, * the compiler will remove all shifts here if the protocol is static... */ #define IPOQUE_ADD_PROTOCOL_TO_BITMASK(bmask,value) \ {(bmask).bitmask[(value) >> 6] |= (((u64)1)<<((value) & 0x3F));} \ #define IPOQUE_DEL_PROTOCOL_FROM_BITMASK(bmask,value) \ {(bmask).bitmask[(value) >> 6] = (bmask).bitmask[(value) >> 6] & (~(((u64)1)<<((value) & 0x3F)));} \ #define IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(bmask,value) \ ((bmask).bitmask[(value) >> 6] & (((u64)1)<<((value) & 0x3F))) \ #define IPOQUE_BITMASK_DEBUG_OUTPUT_BITMASK_STRING "%16llX , %llX" #define IPOQUE_BITMASK_DEBUG_OUTPUT_BITMASK_VALUE(bm) (bm).bitmask[0] , (bm).bitmask[1] #define IPOQUE_BITMASK_IS_ZERO(a) ( (a).bitmask[0] == 0 && (a).bitmask[1] == 0) #define IPOQUE_BITMASK_CONTAINS_NEGATED_BITMASK(a,b) ((((a).bitmask[0] & ~(b).bitmask[0]) == ~(b).bitmask[0]) && (((a).bitmask[1] & ~(b).bitmask[1]) == ~(b).bitmask[1])) #else #define IPOQUE_SAVE_AS_BITMASK(bmask,value) \ { \ (bmask).bitmask[0] = 0; \ (bmask).bitmask[1] = 0; \ (bmask).bitmask[2] = 0; \ (bmask).bitmask[(value) >> 6] = (((u64)1)<<((value) & 0x3F)); \ } #define IPOQUE_BITMASK_COMPARE(a,b) (((a).bitmask[0]) & ((b).bitmask[0]) || ((a).bitmask[1]) & ((b).bitmask[1]) || ((a).bitmask[2]) & ((b).bitmask[2])) #define IPOQUE_BITMASK_MATCH(a,b) (((a).bitmask[0]) == ((b).bitmask[0]) && ((a).bitmask[1]) == ((b).bitmask[1]) && ((a).bitmask[2]) == ((b).bitmask[2])) // all protocols in b are also in a #define IPOQUE_BITMASK_CONTAINS_BITMASK(a,b) ((((a).bitmask[0] & (b).bitmask[0]) == (b).bitmask[0]) && (((a).bitmask[1] & (b).bitmask[1]) == (b).bitmask[1]) && (((a).bitmask[2] & (b).bitmask[2]) == (b).bitmask[2])) #define IPOQUE_BITMASK_ADD(a,b) {(a).bitmask[0] |= (b).bitmask[0]; (a).bitmask[1] |= (b).bitmask[1]; (a).bitmask[2] |= (b).bitmask[2];} #define IPOQUE_BITMASK_AND(a,b) {(a).bitmask[0] &= (b).bitmask[0]; (a).bitmask[1] &= (b).bitmask[1]; (a).bitmask[2] &= (b).bitmask[2];} #define IPOQUE_BITMASK_DEL(a,b) {(a).bitmask[0] = (a).bitmask[0] & (~((b).bitmask[0])); (a).bitmask[1] = (a).bitmask[1] & ( ~((b).bitmask[1])); (a).bitmask[0] = (a).bitmask[0] & (~((b).bitmask[0]));} #define IPOQUE_BITMASK_SET(a,b) {(a).bitmask[0] = ((b).bitmask[0]); (a).bitmask[1] = (b).bitmask[1]; (a).bitmask[2] = (b).bitmask[2];} #define IPOQUE_BITMASK_RESET(a) {((a).bitmask[0]) = 0; ((a).bitmask[1]) = 0; ((a).bitmask[2]) = 0;} #define IPOQUE_BITMASK_SET_ALL(a) {((a).bitmask[0]) = 0xFFFFFFFFFFFFFFFFULL; ((a).bitmask[1]) = 0xFFFFFFFFFFFFFFFFULL; ((a).bitmask[2]) = 0xFFFFFFFFFFFFFFFFULL;} /* this is a very very tricky macro *g*, * the compiler will remove all shifts here if the protocol is static... */ #define IPOQUE_ADD_PROTOCOL_TO_BITMASK(bmask,value) \ {(bmask).bitmask[(value) >> 6] |= (((u64)1)<<((value) & 0x3F));} \ #define IPOQUE_DEL_PROTOCOL_FROM_BITMASK(bmask,value) \ {(bmask).bitmask[(value) >> 6] = (bmask).bitmask[(value) >> 6] & (~(((u64)1)<<((value) & 0x3F)));} \ #define IPOQUE_COMPARE_PROTOCOL_TO_BITMASK(bmask,value) \ ((bmask).bitmask[(value) >> 6] & (((u64)1)<<((value) & 0x3F))) \ #define IPOQUE_BITMASK_DEBUG_OUTPUT_BITMASK_STRING "%llu , %llu , %llu" #define IPOQUE_BITMASK_DEBUG_OUTPUT_BITMASK_VALUE(bm) (bm).bitmask[0] , (bm).bitmask[1] , (bm).bitmask[2] #define IPOQUE_BITMASK_IS_ZERO(a) ( (a).bitmask[0] == 0 && (a).bitmask[1] == 0 && (a).bitmask[2] == 0) #define IPOQUE_BITMASK_CONTAINS_NEGATED_BITMASK(a,b) ((((a).bitmask[0] & ~(b).bitmask[0]) == ~(b).bitmask[0]) && (((a).bitmask[1] & ~(b).bitmask[1]) == ~(b).bitmask[1]) && (((a).bitmask[2] & ~(b).bitmask[2]) == ~(b).bitmask[2])) #endif #define IPQ_PARSE_PACKET_LINE_INFO(ipoque_struct,packet) \ if (packet->packet_lines_parsed_complete != 1) { \ ipq_parse_packet_line_info(ipoque_struct); \ } \ #ifdef __cplusplus } #endif #endif ntop-5.0.1+dfsg1/nDPI/src/include/ipq_api.h0000644000000000000000000000315711661524573017012 0ustar rootroot/* * ipq_api.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_API_INCLUDE_FILE__ #define __IPOQUE_API_INCLUDE_FILE__ #if defined(HAVE_NTOP) && defined(WIN32) #include /* Windows is little endian */ #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 #define __BYTE_ORDER __LITTLE_ENDIAN #define __FLOAT_WORD_ORDER __BYTE_ORDER #endif /* defined(HAVE_NTOP) && defined(WIN32) */ #ifdef __cplusplus extern "C" { #endif /* basic definitions (u64, u32, timestamp size,...) */ #include "ipq_basic_def.h" #include "ipq_protocols_osdpi.h" /* macros for protocol / bitmask conversation if needed */ #include "ipq_macros.h" #include "ipq_public_functions.h" #include "ipq_debug_functions.h" #ifdef __cplusplus } #endif #endif /* __IPOQUE_API_INCLUDE_FILE__ */ ntop-5.0.1+dfsg1/nDPI/src/include/ipq_public_functions.h0000644000000000000000000002061211744566721021605 0ustar rootroot/* * ipq_public_functions.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_API_INCLUDE_FILE__ #error CANNOT INCLUDE THIS .H FILE, INCLUDE IPQ_API.H #endif #ifndef __IPQ_PUBLIC_FUNCTIONS_H__ #define __IPQ_PUBLIC_FUNCTIONS_H__ #ifdef __cplusplus extern "C" { #endif /** * struct for a unique ipv4 flow address */ typedef struct ipoque_unique_flow_ipv4_address_struct { /** * lower ip */ u32 lower_ip; /** * upper ip */ u32 upper_ip; /* we need 3 dummies to fill up to ipv6 address size */ /** * this is only needed to become the same size like a unique ipv6 struct */ u64 dummy[3]; } ipoque_unique_flow_ipv4_address_struct_t; /** * struct for a unique ipv6 flow address */ typedef struct ipoque_unique_flow_ipv6_address_struct { /** * lower ip */ u64 lower_ip[2]; /** * upper ip */ u64 upper_ip[2]; } ipoque_unique_flow_ipv6_address_struct_t; /** * struct for a unique ipv4 and ipv6 5-tuple (ip,ip,port,port,protocol) */ typedef struct ipoque_unique_flow_ipv4_and_6_struct { /* only ip addresses are different, to minimize compare operations for hash tables, store ipv4 or ipv6 always in the first bit */ /** * saves if it is a ipv6, if it false so it is a ipv4 */ u16 is_ip_v6; /** * the protocol, 16 bit wide for alignemt reasons */ u16 protocol; /* for alignment reason, protocol is 16 bit, not 8 bit */ /** * the port of the lower ip address */ u16 lower_port; /** * the port of the upper ip address */ u16 upper_port; union { /** * the ipv4 flow address struct. use the same memory area like ipv6 (union) */ struct ipoque_unique_flow_ipv4_address_struct ipv4; /** * the ipv6 flow address struct. use the same memory area like ipv4 (union) */ struct ipoque_unique_flow_ipv6_address_struct ipv6; } ip; } ipoque_unique_flow_ipv4_and_6_struct_t; typedef enum { IPQ_LOG_ERROR, IPQ_LOG_TRACE, IPQ_LOG_DEBUG } ipq_log_level_t; typedef void (*ipoque_debug_function_ptr) (u32 protocol, void *module_struct, ipq_log_level_t log_level, const char *format, ...); /** * This function returns the size of the flow struct * @return the size of the flow struct */ u32 ipoque_detection_get_sizeof_ipoque_flow_struct(void); /** * This function returns the size of the id struct * @return the size of the id struct */ u32 ipoque_detection_get_sizeof_ipoque_id_struct(void); /** * This function returns a new initialized detection module. * @param ticks_per_second the timestamp resolution per second (like 1000 for millisecond resolution) * @param ipoque_malloc function pointer to a memory allocator * @param ipoque_debug_printf a function pointer to a debug output function, use NULL in productive envionments * @return the initialized detection module */ struct ipoque_detection_module_struct *ipoque_init_detection_module(u32 ticks_per_second, void *(*ipoque_malloc) (unsigned long size), ipoque_debug_function_ptr ipoque_debug_printf); /** * This function destroys the detection module * @param ipoque_struct the to clearing detection module * @param ipoque_free function pointer to a memory free function */ void ipoque_exit_detection_module(struct ipoque_detection_module_struct *ipoque_struct, void (*ipoque_free) (void *ptr)); /** * This function sets the protocol bitmask2 * @param ipoque_struct the detection module * @param detection_bitmask the protocol bitmask */ void ipoque_set_protocol_detection_bitmask2(struct ipoque_detection_module_struct *ipoque_struct, const IPOQUE_PROTOCOL_BITMASK * detection_bitmask); /** * This function will processes one packet and returns the ID of the detected protocol. * This is the main packet processing function. * * @param ipoque_struct the detection module * @param flow void pointer to the connection state machine * @param packet the packet as unsigned char pointer with the length of packetlen. the pointer must point to the Layer 3 (IP header) * @param packetlen the length of the packet * @param current_tick the current timestamp for the packet * @param src void pointer to the source subscriber state machine * @param dst void pointer to the destination subscriber state machine * @return returns the detected ID of the protocol */ unsigned int ipoque_detection_process_packet(struct ipoque_detection_module_struct *ipoque_struct, void *flow, const unsigned char *packet, const unsigned short packetlen, const IPOQUE_TIMESTAMP_COUNTER_SIZE current_tick, void *src, void *dst); #define IPOQUE_DETECTION_ONLY_IPV4 ( 1 << 0 ) #define IPOQUE_DETECTION_ONLY_IPV6 ( 1 << 1 ) /** * query the pointer to the layer 4 packet * * @param l3 pointer to the layer 3 data * @param l3_len length of the layer 3 data * @param l4_return filled with the pointer the layer 4 data if return value == 0, undefined otherwise * @param l4_len_return filled with the length of the layer 4 data if return value == 0, undefined otherwise * @param l4_protocol_return filled with the protocol of the layer 4 data if return value == 0, undefined otherwise * @param flags limit operation on ipv4 or ipv6 packets, possible values are IPOQUE_DETECTION_ONLY_IPV4 or IPOQUE_DETECTION_ONLY_IPV6; 0 means any * @return 0 if correct layer 4 data could be found, != 0 otherwise */ u8 ipoque_detection_get_l4(const u8 * l3, u16 l3_len, const u8 ** l4_return, u16 * l4_len_return, u8 * l4_protocol_return, u32 flags); /** * build the unique key of a flow * * @param l3 pointer to the layer 3 data * @param l3_len length of the layer 3 data * @param l4 pointer to the layer 4 data * @param l4_len length of the layer 4 data * @param l4_protocol layer 4 protocol * @param key_return filled with the unique key if return value == 0, undefined otherwise * @param dir_return filled with a direction flag (0 or 1), can be NULL * @param flags limit operation on ipv4 or ipv6 packets, possible values are IPOQUE_DETECTION_ONLY_IPV4 or IPOQUE_DETECTION_ONLY_IPV6; 0 means any * @return 0 if key could be built, != 0 otherwise */ u8 ipoque_detection_build_key(const u8 * l3, u16 l3_len, const u8 * l4, u16 l4_len, u8 l4_protocol, struct ipoque_unique_flow_ipv4_and_6_struct *key_return, u8 * dir_return, u32 flags); /** * returns the real protocol for the flow of the last packet given to the detection. * if no real protocol could be found, the unknown protocol will be returned. * * @param ipoque_struct the detection module * @return the protocol id of the last real protocol found in the protocol history of the flow */ u16 ipoque_detection_get_real_protocol_of_flow(struct ipoque_detection_module_struct *ipoque_struct); /** * returns true if the protocol history of the flow of the last packet given to the detection * contains the given protocol. * * @param ipoque_struct the detection module * @return 1 if protocol has been found, 0 otherwise */ u8 ipoque_detection_flow_protocol_history_contains_protocol(struct ipoque_detection_module_struct *ipoque_struct, u16 protocol_id); #ifdef HAVE_NTOP unsigned int ntop_find_port_based_protocol(u8 proto, u32 shost, u16 sport, u32 dhost, u16 dport); unsigned int ntop_guess_undetected_protocol(u8 proto, u32 shost, u16 sport, u32 dhost, u16 dport); char* ntop_strnstr(const char *s, const char *find, size_t slen); int matchStringProtocol(struct ipoque_detection_module_struct *ipoque_struct, char *string_to_match, u_int string_to_match_len); #endif #ifdef __cplusplus } #endif #endif ntop-5.0.1+dfsg1/nDPI/src/include/Makefile.am0000644000000000000000000000033711655273464017253 0ustar rootroot library_includedir=$(includedir)/libopendpi-1.3/libopendpi library_include_HEADERS = ipq_api.h \ ipq_basic_def.h \ ipq_debug_functions.h \ ipq_macros.h \ ipq_protocols_osdpi.h \ ipq_public_functions.h ntop-5.0.1+dfsg1/nDPI/src/include/Makefile.in0000644000000000000000000003306711754016700017256 0ustar rootroot# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/include DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(library_includedir)" HEADERS = $(library_include_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ library_includedir = $(includedir)/libopendpi-1.3/libopendpi library_include_HEADERS = ipq_api.h \ ipq_basic_def.h \ ipq_debug_functions.h \ ipq_macros.h \ ipq_protocols_osdpi.h \ ipq_public_functions.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-library_includeHEADERS: $(library_include_HEADERS) @$(NORMAL_INSTALL) test -z "$(library_includedir)" || $(MKDIR_P) "$(DESTDIR)$(library_includedir)" @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(library_includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(library_includedir)" || exit $$?; \ done uninstall-library_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(library_includedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(library_includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-library_includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-library_includeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool ctags distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-library_includeHEADERS install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-library_includeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ntop-5.0.1+dfsg1/nDPI/src/include/ipq_debug_functions.h0000644000000000000000000000246111655273464021417 0ustar rootroot/* * ipq_debug_functions.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_API_INCLUDE_FILE__ #error CANNOT INCLUDE THIS .H FILE, INCLUDE IPQ_API.H #endif #ifndef __IPQ_DEBUG_FUNCTIONS_H__ #define __IPQ_DEBUG_FUNCTIONS_H__ #ifdef __cplusplus extern "C" { #endif #ifdef IPOQUE_ENABLE_DEBUG_MESSAGES void ipoque_debug_get_last_log_function_line(struct ipoque_detection_module_struct *ipoque_struct, const char **file, const char **func, u32 * line); #endif #ifdef __cplusplus } #endif #endif ntop-5.0.1+dfsg1/nDPI/src/include/ipq_basic_def.h0000644000000000000000000000267011655273464020142 0ustar rootroot/* * ipq_basic_def.h * Copyright (C) 2009-2011 by ipoque GmbH * * This file is part of OpenDPI, an open source deep packet inspection * library based on the PACE technology by ipoque GmbH * * OpenDPI is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenDPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenDPI. If not, see . * */ #ifndef __IPOQUE_API_INCLUDE_FILE__ #error CANNOT INCLUDE THIS .H FILE, INCLUDE IPQ_API.H #endif #ifndef __IPQ_BASIC_DEF_H__ #define __IPQ_BASIC_DEF_H__ #ifdef __cplusplus extern "C" { #endif /* define u64, u32, here * this is used for compatibility restrictions on different platforms * */ #ifndef u64 #define u64 unsigned long long #endif #ifndef u32 #define u32 unsigned int #endif #ifndef u16 #define u16 unsigned short #endif #ifndef u8 #define u8 unsigned char #endif /* generic timestamp counter size */ #define IPOQUE_TIMESTAMP_COUNTER_SIZE u32 #ifdef __cplusplus } #endif #endif ntop-5.0.1+dfsg1/misc/0000755000000000000000000000000012012127277013127 5ustar rootrootntop-5.0.1+dfsg1/misc/icmpPlugin.c0000644000000000000000000006237011660215571015415 0ustar rootroot/* * Copyright (C) 1998-2011 Luca Deri * * http://www.ntop.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-report.h" /* ****************************** */ struct tok { int v; /* value */ char *s; /* string */ }; /* rfc1191 */ struct mtu_discovery { short unused; short nexthopmtu; }; /* rfc1256 */ struct ih_rdiscovery { u_char ird_addrnum; u_char ird_addrsiz; u_short ird_lifetime; }; struct id_rdiscovery { u_int32_t ird_addr; u_int32_t ird_pref; }; /* F o r w a r d */ static void termIcmpFunct(u_char); static void handleIcmpWatchHTTPrequest(char* url); static void printICMPdata(int icmpColumnSort, u_int revertOrder, u_int num, HostTraffic **hosts); /* ****************************** * Plugin data block * ****************************** */ static PluginInfo icmpPluginInfo[] = { { VERSION, /* current ntop version */ "ICMPWatch", "This plugin produces a report about the ICMP packets that ntop has seen.
" "The report includes each host, byte and per-type counts (sent/received).", "2.4a", /* version */ "L.Deri", "icmpWatch", /* http://:/plugins/icmpWatch */ 0, /* Active by default */ ViewOnly, 0, /* Inactive setup */ NULL, /* no special startup after init */ termIcmpFunct, /* TermFunc */ NULL, /* PluginFunc */ handleIcmpWatchHTTPrequest, NULL, /* no host creation/deletion handle */ NULL /* no capture */, NULL, /* no status */ NULL /* no extra pages */ } }; /* ****************************** * Sort (compare) functions * ****************************** */ static int sortICMPhostsHost(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; int rc; rc = cmpFctnResolvedName(a, b); return(rc); } /* **************************************** */ static int sortICMPhostsSent(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsSent() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsSent() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsSent() (3)"); return(0); } n1 = (*a)->icmpSent.value, n2 = (*b)->icmpSent.value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsRcvd(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsRcvd() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsRcvd() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsRcvd() (3)"); return(0); } n1 = (*a)->icmpRcvd.value, n2 = (*b)->icmpRcvd.value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsEcho(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsEcho() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsEcho() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsEcho() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_ECHO].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_ECHO].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_ECHO].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_ECHO].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsReply(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsReply() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsReply() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsReply() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_ECHOREPLY].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_ECHOREPLY].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_ECHOREPLY].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_ECHOREPLY].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsUnreach(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsUnreach() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsUnreach() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsUnreach() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_UNREACH].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_UNREACH].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_UNREACH].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_UNREACH].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsRedirect(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsRedirect() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsRedirect() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsRedirect() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_REDIRECT].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_REDIRECT].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_REDIRECT].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_REDIRECT].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsAdvert(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsAdvert() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsAdvert() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsAdvert() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_ROUTERADVERT].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_ROUTERADVERT].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_ROUTERADVERT].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_ROUTERADVERT].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsTimeout(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsTimeout() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsTimeout() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsTimeout() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_TIMXCEED].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_TIMXCEED].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_TIMXCEED].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_TIMXCEED].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsBadParam(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsBadParam() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsBadParam() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsBadParam() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_PARAMPROB].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_PARAMPROB].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_PARAMPROB].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_PARAMPROB].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsQuench(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsQuench() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsQuench() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsQuench() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_SOURCE_QUENCH].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_SOURCE_QUENCH].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_SOURCE_QUENCH].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_SOURCE_QUENCH].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsTimestamp(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsTimestamp() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsTimestamp() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsTimestamp() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_TIMESTAMP].value + (*a)->icmpInfo->icmpMsgSent[ICMP_TIMESTAMPREPLY].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_TIMESTAMP].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_TIMESTAMPREPLY].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_TIMESTAMP].value + (*b)->icmpInfo->icmpMsgSent[ICMP_TIMESTAMPREPLY].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_TIMESTAMP].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_TIMESTAMPREPLY].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsInfo(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsInfo() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsInfo() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsInfo() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_INFO_REQUEST].value + (*a)->icmpInfo->icmpMsgSent[ICMP_INFO_REPLY].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_INFO_REQUEST].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_INFO_REPLY].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_INFO_REQUEST].value + (*b)->icmpInfo->icmpMsgSent[ICMP_INFO_REPLY].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_INFO_REQUEST].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_INFO_REPLY].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* **************************************** */ static int sortICMPhostsNetmask(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter n1, n2; if(((*a) == NULL) && ((*b) != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsNetmask() (1)"); return(1); } else if(((*a) != NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsNetmask() (2)"); return(-1); } else if(((*a) == NULL) && ((*b) == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortICMPhostsNetmask() (3)"); return(0); } n1 = (*a)->icmpInfo->icmpMsgSent[ICMP_MASKREQ].value + (*a)->icmpInfo->icmpMsgSent[ICMP_MASKREPLY].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_MASKREQ].value + (*a)->icmpInfo->icmpMsgRcvd[ICMP_MASKREPLY].value; n2 = (*b)->icmpInfo->icmpMsgSent[ICMP_MASKREQ].value + (*b)->icmpInfo->icmpMsgSent[ICMP_MASKREPLY].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_MASKREQ].value + (*b)->icmpInfo->icmpMsgRcvd[ICMP_MASKREPLY].value; if(n1 > n2) return(1); else if(n1 < n2) return(-1); else return(0); } /* ****************************** * Sort (compare) data * ****************************** */ #define CONST_ICMP_SORT_HOST 0 #define CONST_ICMP_SORT_SENT 1 #define CONST_ICMP_SORT_RCVD 2 #define CONST_ICMP_SORT_ECHO 3 #define CONST_ICMP_SORT_REPLY 4 #define CONST_ICMP_SORT_TIMXCEED 5 #define CONST_ICMP_SORT_UNREACH 6 #define CONST_ICMP_SORT_REDIRECT 7 #define CONST_ICMP_SORT_ROUTERADVERT 8 #define CONST_ICMP_SORT_PARAMPROB 9 #define CONST_ICMP_SORT_QUENCH 10 #define CONST_ICMP_SORT_TIMESTAMP 11 #define CONST_ICMP_SORT_NETMASK 12 #define CONST_ICMP_SORT_INFO 13 static void* cmpFctnICMP[] = { sortICMPhostsHost, sortICMPhostsSent, sortICMPhostsRcvd, sortICMPhostsEcho, sortICMPhostsReply, sortICMPhostsTimeout, sortICMPhostsUnreach, sortICMPhostsRedirect, sortICMPhostsAdvert, sortICMPhostsBadParam, sortICMPhostsQuench, sortICMPhostsTimestamp, sortICMPhostsNetmask, sortICMPhostsInfo }; static int cmpFctnICMPmax = sizeof(cmpFctnICMP) / sizeof(cmpFctnICMP[0]); /* ***************************************** */ /* ***************************************** */ static void formatSentRcvd(Counter sent, Counter rcvd) { char buf[128], formatBuf[32], formatBuf1[32]; if (sent + rcvd == 0) { strcpy(buf, " "); } else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/%s", formatPkts(sent, formatBuf, sizeof(formatBuf)), formatPkts(rcvd, formatBuf1, sizeof(formatBuf1))); sendString(buf); } /* ******************************* */ static void printICMPdata(int icmpColumnSort, u_int revertOrder, u_int num, HostTraffic **hosts) { char buf[1024], formatBuf[32]; char *pluginName = "cmpFctnICMPmax) icmpColumnSort=0; if(!revertOrder) { arrowGif = " \"Ascending"; } else { arrowGif = " \"Descending"; sign = ""; } for(i=0; i<=14; i++) if(abs(icmpColumnSort) == i) arrow[i] = arrowGif; else arrow[i] = ""; sendString("
\n\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n" "\n" "\n" "\n", pluginName, sign, CONST_ICMP_SORT_HOST, arrow[CONST_ICMP_SORT_HOST]); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n", pluginName, sign, CONST_ICMP_SORT_SENT, arrow[CONST_ICMP_SORT_SENT], pluginName, sign, CONST_ICMP_SORT_RCVD, arrow[CONST_ICMP_SORT_RCVD], pluginName, sign, CONST_ICMP_SORT_ECHO, arrow[CONST_ICMP_SORT_ECHO], pluginName, sign, CONST_ICMP_SORT_REPLY, arrow[CONST_ICMP_SORT_REPLY], pluginName, sign, CONST_ICMP_SORT_TIMXCEED, arrow[CONST_ICMP_SORT_TIMXCEED], pluginName, sign, CONST_ICMP_SORT_UNREACH, arrow[CONST_ICMP_SORT_UNREACH], pluginName, sign, CONST_ICMP_SORT_REDIRECT, arrow[CONST_ICMP_SORT_REDIRECT], pluginName, sign, CONST_ICMP_SORT_ROUTERADVERT, arrow[CONST_ICMP_SORT_ROUTERADVERT], pluginName, sign, CONST_ICMP_SORT_PARAMPROB, arrow[CONST_ICMP_SORT_PARAMPROB], pluginName, sign, CONST_ICMP_SORT_NETMASK, arrow[CONST_ICMP_SORT_NETMASK], pluginName, sign, CONST_ICMP_SORT_QUENCH, arrow[CONST_ICMP_SORT_QUENCH], pluginName, sign, CONST_ICMP_SORT_TIMESTAMP, arrow[CONST_ICMP_SORT_TIMESTAMP], pluginName, sign, CONST_ICMP_SORT_INFO, arrow[CONST_ICMP_SORT_INFO]); sendString(buf); qsort(hosts, num, sizeof(HostTraffic **), cmpFctnICMP[icmpColumnSort]); for(i=0, printedEntries=0; i %s", getRowColor(), makeHostLink(hosts[idx], FLAG_HOSTLINK_HTML_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", formatBytes(hosts[idx]->icmpSent.value, 1, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", formatBytes(hosts[idx]->icmpRcvd.value, 1, formatBuf, sizeof(formatBuf))); sendString(buf); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_ECHO].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_ECHO].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_ECHOREPLY].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_ECHOREPLY].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_TIMXCEED].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_TIMXCEED].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_UNREACH].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_UNREACH].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_REDIRECT].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_REDIRECT].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_ROUTERADVERT].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_ROUTERADVERT].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_PARAMPROB].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_PARAMPROB].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_MASKREPLY].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_MASKREPLY].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_SOURCE_QUENCH].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_SOURCE_QUENCH].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_TIMESTAMPREPLY].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_TIMESTAMPREPLY].value)); formatSentRcvd((Counter)(hosts[idx]->icmpInfo->icmpMsgSent[ICMP_INFO_REQUEST].value +hosts[idx]->icmpInfo->icmpMsgSent[ICMP_INFO_REPLY].value), (Counter)(hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_INFO_REQUEST].value +hosts[idx]->icmpInfo->icmpMsgRcvd[ICMP_INFO_REPLY].value)); sendString("\n"); /* Avoid huge tables */ if(printedEntries++ > (u_int)myGlobals.runningPref.maxNumLines) break; } sendString("
%s?%s%d>Host %sBytesSent/Recived by ICMP Type
%s?%s%d>Sent %s%s?%s%d>Rcvd %s%s?%s%d>Echo
Request %s
%s?%s%d>Echo
Reply %s
%s?%s%d>Time
Exceeded %s
%s?%s%d>Unreach %s%s?%s%d>Redirect %s%s?%s%d>Router
Advert. %s
%s?%s%d>Param.
Problem %s
%s?%s%d>Network
Mask %s
%s?%s%d>Source
Quench %s
%s?%s%d>Timestamp %s%s?%s%d>Info %s
%s%s
\n

\n"); } /* ******************************* */ static void handleIcmpWatchHTTPrequest(char* url) { u_int i, revertOrder=0, num; HostTraffic **hosts; char **lbls, *strtokState; float *s, *r; int icmpColumnSort = 0; i = sizeof(float)*myGlobals.device[myGlobals.actualReportDeviceId].hosts.actualHashSize; s = (float*)malloc(i); r = (float*)malloc(i); memset(s, 0, i); memset(r, 0, i); i = sizeof(char*)*myGlobals.device[myGlobals.actualReportDeviceId].hosts.actualHashSize; lbls = malloc(i); memset(lbls, 0, i); i = sizeof(HostTraffic*)*myGlobals.device[myGlobals.actualReportDeviceId].hosts.actualHashSize; hosts = (HostTraffic**)malloc(i); for(i=0, num=0; iicmpInfo != NULL)) { hosts[num++] = el; } el = el->next; } } if(url[0] == '\0') icmpColumnSort = 0; else if((url[0] == '-') || isdigit(url[0])) { if(url[0] == '-') { revertOrder = 1; icmpColumnSort = atoi(&url[1]); } else icmpColumnSort = atoi(url); if(icmpColumnSort<0) icmpColumnSort=0; if(icmpColumnSort>cmpFctnICMPmax) icmpColumnSort=0; } else /* host=3240847503&icmp=3 */ { char *tmpStr; strtok_r(url, "=", &strtokState); tmpStr = strtok_r(NULL, "&", &strtokState); strtok_r(NULL, "=", &strtokState); } sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHTMLheader("ICMP Statistics", NULL, 0); if(num == 0) { printNoDataYet(); } else { printICMPdata(icmpColumnSort, revertOrder, num, hosts); } printPluginTrailer(icmpPluginInfo->pluginURLname, "See
RFC 792 " "for more information on ICMP"); printHTMLtrailer(); if(s != NULL) free(s); if(r != NULL) free(r); if(lbls != NULL) free(lbls); if(hosts != NULL) free(hosts); } /* ****************************** */ static void termIcmpFunct(u_char termNtop /* 0=term plugin, 1=term ntop */) { traceEvent(CONST_TRACE_INFO, "ICMP: Thanks for using icmpWatch"); fflush(stdout); traceEvent(CONST_TRACE_ALWAYSDISPLAY, "ICMP: Done"); fflush(stdout); } /* ***************************************** */ /* Plugin entry fctn */ #ifdef MAKE_STATIC_PLUGIN PluginInfo* icmpPluginEntryFctn(void) { #else PluginInfo* PluginEntryFctn(void) { #endif traceEvent(CONST_TRACE_ALWAYSDISPLAY, "ICMP: Welcome to %s. (C) 1999-2005 by Luca Deri", icmpPluginInfo->pluginName); return(icmpPluginInfo); } ntop-5.0.1+dfsg1/misc/perl.c0000644000000000000000000001577411230052616014246 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * http://www.ntop.org * * Copyright (C) 2008-09 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-report.h" #ifdef HAVE_PERL #include "perl/ntop_perl.h" #include "perl/ntop_wrap.c" static HostTraffic *ntop_host = NULL; static HV * perl_host = NULL; static HV * ss_hosts = NULL; /* perl -MExtUtils::Embed -e xsinit -- -o perlxsi.c */ EXTERN_C void xs_init (pTHX); EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); EXTERN_C void xs_init(pTHX) { char *file = __FILE__; dXSUB_SYS; /* DynaLoader is a special case */ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); } /* *********************************************************** */ void ntop_perl_sendString(char *str) { if(str && (strlen(str) > 0)) _sendString(str, 1); } /* *********************************************************** */ void ntop_perl_send_http_header(int mime_type, char *title) { sendHTTPHeader(mime_type /* FLAG_HTTP_TYPE_HTML */, 0, 0); if(title && (strlen(title) > 0)) printHTMLheader(title, NULL, 0); } /* *********************************************************** */ void ntop_perl_sendFile(char* fileName, int doNotUnlink) { sendFile(fileName, doNotUnlink); } /* *********************************************************** */ void ntop_perl_send_html_footer() { printHTMLtrailer(); } /* *********************************************************** */ #define PERL_STORE_STRING(x, a, b) hv_store(x, a, strlen(a), newSVpv(b, strlen(b)), 0); #define PERL_STORE_NUM(x, a, b) { char buf[64]; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%u", b); PERL_STORE_STRING(x, a, buf); } static void ntop_perl_loadHost_values(HV * my_ss, HostTraffic *host) { /* traceEvent(CONST_TRACE_INFO, "[perl] loadHost_values()"); */ PERL_STORE_STRING(my_ss, "ethAddress", host->ethAddressString); PERL_STORE_STRING(my_ss, "ipAddress", host->hostNumIpAddress); PERL_STORE_STRING(my_ss, "hostResolvedName", host->hostResolvedName); PERL_STORE_NUM(my_ss, "vlanId", host->vlanId); PERL_STORE_NUM(my_ss, "hostAS", host->hostAS); PERL_STORE_NUM(my_ss, "pktSent", host->pktSent.value); PERL_STORE_NUM(my_ss, "pktRcvd", host->pktRcvd.value); PERL_STORE_NUM(my_ss, "bytesSent", host->bytesSent.value); PERL_STORE_NUM(my_ss, "bytesRcvd", host->bytesRcvd.value); } /* *********************************************************** */ void ntop_perl_loadHost() { char buf[64]; /* traceEvent(CONST_TRACE_INFO, "[perl] loadHost(%p)", ntop_host); */ if(perl_host) { hv_undef(perl_host); perl_host = NULL; } if(ntop_host) { perl_host = perl_get_hv ("main::host", TRUE); ntop_perl_loadHost_values(perl_host, ntop_host); } } /* *********************************************************** */ void ntop_perl_getFirstHost(int actualDeviceId) { ntop_host = getFirstHost(actualDeviceId); /* traceEvent(CONST_TRACE_INFO, "[perl] getFirstHost(%d)=%p", actualDeviceId, ntop_host); */ } /* *********************************************************** */ void ntop_perl_getNextHost(int actualDeviceId) { if(ntop_host == NULL) { ntop_perl_getFirstHost(actualDeviceId); } else { ntop_host = getNextHost(actualDeviceId, ntop_host); } /* traceEvent(CONST_TRACE_INFO, "[perl] getNextHost()=%p", ntop_host); */ } /* *********************************************************** */ HostTraffic* ntop_perl_findHostByNumIP(HostAddr hostIpAddress, short vlanId, int actualDeviceId) { return(findHostByNumIP(hostIpAddress, vlanId, actualDeviceId)); } /* *********************************************************** */ HostTraffic* ntop_perl_findHostBySerial(HostSerial serial, int actualDeviceId) { return(findHostBySerial(serial, actualDeviceId)); } /* *********************************************************** */ HostTraffic* ntop_perl_findHostByMAC(char* macAddr, short vlanId, int actualDeviceId) { return(findHostByMAC(macAddr, vlanId, actualDeviceId)); } /* *********************************************************** */ /* http://localhost:3000/perl/test.pl */ int handlePerlHTTPRequest(char *url) { int perl_argc = 2, idx, found = 0; char perl_path[256]; char * perl_argv[] = { "", NULL }; struct stat statbuf; char *question_mark = strchr(url, '?'); PerlInterpreter *my_perl; /*** The Perl interpreter ***/ traceEvent(CONST_TRACE_WARNING, "Calling perl... [%s]", url); if(question_mark) question_mark[0] = '\0'; for(idx=0; (!found) && (myGlobals.dataFileDirs[idx] != NULL); idx++) { safe_snprintf(__FILE__, __LINE__, perl_path, sizeof(perl_path), "%s/perl/%s", myGlobals.dataFileDirs[idx], url); revertSlashIfWIN32(perl_path, 0); if(!stat(perl_path, &statbuf)) { /* Found */ /* traceEvent(CONST_TRACE_INFO, "[perl] [%d] Found %s", idx, perl_path); */ found = 1; break; } else { /* traceEvent(CONST_TRACE_INFO, "[perl] [%d] Not found %s", idx, perl_path); */ } } if(!found) { returnHTTPpageNotFound(NULL); return(1); } perl_argv[1] = perl_path; PERL_SYS_INIT(&perl_argc, &perl_argv); if((my_perl = perl_alloc()) == NULL) { traceEvent(CONST_TRACE_WARNING, "[perl] Not enough memory"); return(0); } perl_construct(my_perl); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_parse(my_perl, xs_init, perl_argc, perl_argv, (char **)NULL); SWIG_InitializeModule(0); if(question_mark) { PERL_STORE_STRING(perl_get_hv("main::ENV", TRUE), "QUERY_STRING_UNESCAPED", &question_mark[1]); } newXS("sendString", _wrap_ntop_perl_sendString, (char*)__FILE__); newXS("sendFile", _wrap_ntop_perl_sendFile, (char*)__FILE__); newXS("send_http_header", _wrap_ntop_perl_send_http_header, (char*)__FILE__); newXS("send_html_footer", _wrap_ntop_perl_send_html_footer, (char*)__FILE__); newXS("loadHost", _wrap_ntop_perl_loadHost, (char*)__FILE__); newXS("getFirstHost", _wrap_ntop_perl_getFirstHost, (char*)__FILE__); newXS("getNextHost", _wrap_ntop_perl_getNextHost, (char*)__FILE__); perl_run(my_perl); /* Unset variables */ perl_host = NULL; // PL_perl_destruct_level = 1; perl_destruct(my_perl); perl_free(my_perl); //PERL_SYS_TERM(); return(1); } #endif /* HAVE_PERL */ ntop-5.0.1+dfsg1/misc/lua/0000755000000000000000000000000012012127277013710 5ustar rootrootntop-5.0.1+dfsg1/misc/lua/test.lua0000644000000000000000000000130011240050650015354 0ustar rootroot ntop.send_http_header(1, 'Known ntop hosts(' .. ntop.getQueryString() .. ')') ntop.sendString("Hello world, from ".. _VERSION .. "

") ntop.getFirstHost(0); -- Example: how to set IP address -- host.ipAddress("1.2.3.4") ntop.sendString("

    \n"); while ntop.getNextHost(0) do if(host.ipAddress() == "") then ntop.sendString("
  1. " .. string.gsub(host.ethAddress(), ':', '_')) else ntop.sendString("
  2. " .. host.ipAddress()); end ntop.sendString(" [sent=".. host.pktSent() .. " / rcvd=" .. host.pktRcvd().. "]
  3. \n") end ntop.sendString("
\n"); ntop.send_html_footer()ntop-5.0.1+dfsg1/misc/configure.in.lua0000644000000000000000000000115611240225316016216 0ustar rootrootdnl> dnl> Lua - http://www.lua.org dnl> LUA_VERSION=lua-5.1.4 if test -f "$LUA_VERSION.tar.gz"; then echo "Lua already present on this machine" else wget http://www.lua.org/ftp/$LUA_VERSION.tar.gz fi tar xvfz $LUA_VERSION.tar.gz cat $LUA_VERSION/src/Makefile | sed -e s,'MYCFLAGS=-DLUA_USE_POSIX',' MYCFLAGS="-fPIC -DLUA_USE_POSIX"',g > /tmp/lua.temp cat /tmp/lua.temp > $LUA_VERSION/src/Makefile #rm -f /tmp/lua.temp cd $LUA_VERSION; make posix; cd .. LUA_LIB_DIR=$PWD/$LUA_VERSION"/src" LIBS="-L${LUA_LIB_DIR} -llua ${LIBS} " INCS="${INCS} -I${LUA_LIB_DIR}" AC_DEFINE_UNQUOTED(HAVE_LUA, 1, [LUA is supported]) ntop-5.0.1+dfsg1/misc/perl/0000755000000000000000000000000012012127277014071 5ustar rootrootntop-5.0.1+dfsg1/misc/perl/report/0000755000000000000000000000000012012127277015404 5ustar rootrootntop-5.0.1+dfsg1/misc/perl/report/basic.xml0000644000000000000000000000610611030132034017174 0ustar rootroot A simple report /tmp/basic.pdf A4 portrait Helvetica Helvetica 10 28.346 28.346 1
20 right Known Hosts 50 20 black left 1
MAC Address 0 20 12 left IP Address 1 20 12 left Name 2 30 12 right Bytes Sent 3 15 12 right Bytes Rcvd 4 15 12 right
ntop-5.0.1+dfsg1/misc/perl/ntop_perl.h0000644000000000000000000000125611040737306016250 0ustar rootrootextern void ntop_perl_sendString(char *str); extern void ntop_perl_send_http_header(int mime_type, char *title); extern void ntop_perl_send_html_footer(); extern void ntop_perl_loadHost(); extern void ntop_perl_loadHosts(); extern void ntop_perl_getFirstHost(int actualDeviceId); extern void ntop_perl_getNextHost(int actualDeviceId); extern HostTraffic* ntop_perl_findHostByNumIP(HostAddr hostIpAddress, short vlanId, int actualDeviceId); extern HostTraffic* ntop_perl_findHostBySerial(HostSerial serial, int actualDeviceId); extern HostTraffic* ntop_perl_findHostByMAC(char* macAddr, short vlanId, int actualDeviceId); extern void ntop_perl_sendFile(char* fileName, int doNotUnlink); ntop-5.0.1+dfsg1/misc/perl/ntop_wrap.c0000644000000000000000000020206211201757167016256 0ustar rootroot/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 1.3.36 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPERL #define SWIG_CASTRANK_MODE /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic CAPI SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the swig runtime code. In 99.9% of the cases, swig just needs to declare them as 'static'. But only do this if is strictly necessary, ie, if you have problems with your compiler or so. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The swig conversion methods, as ConvertPtr, return and integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old swig versions, you usually write code as: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit as: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } that seems to be the same, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that requires also to SWIG_ConvertPtr to return new result values, as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the swig errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCompare(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; if (*ne) ++ne; } return equiv; } /* think of this as a c++ template<> or a scheme macro */ #define SWIG_TypeCheck_Template(comparison, ty) \ if (ty) { \ swig_cast_info *iter = ty->cast; \ while (iter) { \ if (comparison) { \ if (iter == ty->cast) return iter; \ /* Move iter to the top of the linked list */ \ iter->prev->next = iter->next; \ if (iter->next) \ iter->next->prev = iter->prev; \ iter->next = ty->cast; \ iter->prev = 0; \ if (ty->cast) ty->cast->prev = iter; \ ty->cast = iter; \ return iter; \ } \ iter = iter->next; \ } \ } \ return 0 /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { SWIG_TypeCheck_Template(strcmp(iter->type->name, c) == 0, ty); } /* Same as previous function, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *into) { SWIG_TypeCheck_Template(iter->type == from, into); } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { register size_t l = 0; register size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ register size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { register int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { register size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; register const unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { register unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register char d = *(c++); register unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 #ifdef __cplusplus /* Needed on some windows machines---since MS plays funny games with the header files under C++ */ #include #include extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" /* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */ /* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */ #ifndef PERL_REVISION # if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) # define PERL_PATCHLEVEL_H_IMPLICIT # include # endif # if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) # include # endif # ifndef PERL_REVISION # define PERL_REVISION (5) # define PERL_VERSION PATCHLEVEL # define PERL_SUBVERSION SUBVERSION # endif #endif #if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE) #define PerlIO_exportFILE(fh,fl) (FILE*)(fh) #endif #ifndef SvIOK_UV # define SvIOK_UV(sv) (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv))) #endif #ifndef SvUOK # define SvUOK(sv) SvIOK_UV(sv) #endif #if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) # define PL_sv_undef sv_undef # define PL_na na # define PL_errgv errgv # define PL_sv_no sv_no # define PL_sv_yes sv_yes # define PL_markstack_ptr markstack_ptr #endif #ifndef IVSIZE # ifdef LONGSIZE # define IVSIZE LONGSIZE # else # define IVSIZE 4 /* A bold guess, but the best we can make. */ # endif #endif #ifndef INT2PTR # if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) # define PTRV UV # define INT2PTR(any,d) (any)(d) # else # if PTRSIZE == LONGSIZE # define PTRV unsigned long # else # define PTRV unsigned # endif # define INT2PTR(any,d) (any)(PTRV)(d) # endif # define NUM2PTR(any,d) (any)(PTRV)(d) # define PTR2IV(p) INT2PTR(IV,p) # define PTR2UV(p) INT2PTR(UV,p) # define PTR2NV(p) NUM2PTR(NV,p) # if PTRSIZE == LONGSIZE # define PTR2ul(p) (unsigned long)(p) # else # define PTR2ul(p) INT2PTR(unsigned long,p) # endif #endif /* !INT2PTR */ #ifndef SvPV_nolen # define SvPV_nolen(x) SvPV(x,PL_na) #endif #ifndef get_sv # define get_sv perl_get_sv #endif #ifndef ERRSV # define ERRSV get_sv("@",FALSE) #endif #ifndef pTHX_ #define pTHX_ #endif #include #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGINTERN const char* SWIG_Perl_ErrorType(int code) { const char* type = 0; switch(code) { case SWIG_MemoryError: type = "MemoryError"; break; case SWIG_IOError: type = "IOError"; break; case SWIG_RuntimeError: type = "RuntimeError"; break; case SWIG_IndexError: type = "IndexError"; break; case SWIG_TypeError: type = "TypeError"; break; case SWIG_DivisionByZero: type = "ZeroDivisionError"; break; case SWIG_OverflowError: type = "OverflowError"; break; case SWIG_SyntaxError: type = "SyntaxError"; break; case SWIG_ValueError: type = "ValueError"; break; case SWIG_SystemError: type = "SystemError"; break; case SWIG_AttributeError: type = "AttributeError"; break; default: type = "RuntimeError"; } return type; } /* ----------------------------------------------------------------------------- * perlrun.swg * * This file contains the runtime support for Perl modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ #ifdef PERL_OBJECT #define SWIG_PERL_OBJECT_DECL CPerlObj *SWIGUNUSEDPARM(pPerl), #define SWIG_PERL_OBJECT_CALL pPerl, #else #define SWIG_PERL_OBJECT_DECL #define SWIG_PERL_OBJECT_CALL #endif /* Common SWIG API */ /* for raw pointers */ #define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags) #define SWIG_NewPointerObj(p, type, flags) SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags) /* for raw packed data */ #define SWIG_ConvertPacked(obj, p, s, type) SWIG_Perl_ConvertPacked(SWIG_PERL_OBJECT_CALL obj, p, s, type) #define SWIG_NewPackedObj(p, s, type) SWIG_Perl_NewPackedObj(SWIG_PERL_OBJECT_CALL p, s, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Perl_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Perl_SetModule(pointer) /* Error manipulation */ #define SWIG_ErrorType(code) SWIG_Perl_ErrorType(code) #define SWIG_Error(code, msg) sv_setpvf(GvSV(PL_errgv),"%s %s\n", SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Perl-specific SWIG API */ #define SWIG_MakePtr(sv, ptr, type, flags) SWIG_Perl_MakePtr(SWIG_PERL_OBJECT_CALL sv, ptr, type, flags) #define SWIG_MakePackedObj(sv, p, s, type) SWIG_Perl_MakePackedObj(SWIG_PERL_OBJECT_CALL sv, p, s, type) #define SWIG_SetError(str) SWIG_Error(SWIG_RuntimeError, str) #define SWIG_PERL_DECL_ARGS_1(arg1) (SWIG_PERL_OBJECT_DECL arg1) #define SWIG_PERL_CALL_ARGS_1(arg1) (SWIG_PERL_OBJECT_CALL arg1) #define SWIG_PERL_DECL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_DECL arg1, arg2) #define SWIG_PERL_CALL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_CALL arg1, arg2) /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #ifdef __cplusplus extern "C" { #endif #define SWIG_OWNER SWIG_POINTER_OWN #define SWIG_SHADOW SWIG_OWNER << 1 #define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL /* SWIG Perl macros */ /* Macro to declare an XS function */ #ifndef XSPROTO # define XSPROTO(name) void name(pTHX_ CV* cv) #endif /* Macro to call an XS function */ #ifdef PERL_OBJECT # define SWIG_CALLXS(_name) _name(cv,pPerl) #else # ifndef MULTIPLICITY # define SWIG_CALLXS(_name) _name(cv) # else # define SWIG_CALLXS(_name) _name(PERL_GET_THX, cv) # endif #endif #ifdef PERL_OBJECT #define MAGIC_PPERL CPerlObj *pPerl = (CPerlObj *) this; #ifdef __cplusplus extern "C" { #endif typedef int (CPerlObj::*SwigMagicFunc)(SV *, MAGIC *); #ifdef __cplusplus } #endif #define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) #define SWIGCLASS_STATIC #else /* PERL_OBJECT */ #define MAGIC_PPERL #define SWIGCLASS_STATIC static SWIGUNUSED #ifndef MULTIPLICITY #define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) #ifdef __cplusplus extern "C" { #endif typedef int (*SwigMagicFunc)(SV *, MAGIC *); #ifdef __cplusplus } #endif #else /* MULTIPLICITY */ #define SWIG_MAGIC(a,b) (struct interpreter *interp, SV *a, MAGIC *b) #ifdef __cplusplus extern "C" { #endif typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *); #ifdef __cplusplus } #endif #endif /* MULTIPLICITY */ #endif /* PERL_OBJECT */ /* Workaround for bug in perl 5.6.x croak and earlier */ #if (PERL_VERSION < 8) # ifdef PERL_OBJECT # define SWIG_croak_null() SWIG_Perl_croak_null(pPerl) static void SWIG_Perl_croak_null(CPerlObj *pPerl) # else static void SWIG_croak_null() # endif { SV *err=ERRSV; # if (PERL_VERSION < 6) croak("%_", err); # else if (SvOK(err) && !SvROK(err)) croak("%_", err); croak(Nullch); # endif } #else # define SWIG_croak_null() croak(Nullch) #endif /* Define how strict is the cast between strings and integers/doubles when overloading between these types occurs. The default is making it as strict as possible by using SWIG_AddCast when needed. You can use -DSWIG_PERL_NO_STRICT_STR2NUM at compilation time to disable the SWIG_AddCast, making the casting between string and numbers less strict. In the end, we try to solve the overloading between strings and numerical types in the more natural way, but if you can avoid it, well, avoid it using %rename, for example. */ #ifndef SWIG_PERL_NO_STRICT_STR2NUM # ifndef SWIG_PERL_STRICT_STR2NUM # define SWIG_PERL_STRICT_STR2NUM # endif #endif #ifdef SWIG_PERL_STRICT_STR2NUM /* string takes precedence */ #define SWIG_Str2NumCast(x) SWIG_AddCast(x) #else /* number takes precedence */ #define SWIG_Str2NumCast(x) x #endif #include SWIGRUNTIME const char * SWIG_Perl_TypeProxyName(const swig_type_info *type) { if (!type) return NULL; if (type->clientdata != NULL) { return (const char*) type->clientdata; } else { return type->name; } } SWIGRUNTIME swig_cast_info * SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { SWIG_TypeCheck_Template(( (!iter->type->clientdata && (strcmp(iter->type->name, c) == 0)) || (iter->type->clientdata && (strcmp((char*)iter->type->clientdata, c) == 0))), ty); } /* Function for getting a pointer value */ SWIGRUNTIME int SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { swig_cast_info *tc; void *voidptr = (void *)0; SV *tsv = 0; /* If magical, apply more magic */ if (SvGMAGICAL(sv)) mg_get(sv); /* Check to see if this is an object */ if (sv_isobject(sv)) { IV tmp = 0; tsv = (SV*) SvRV(sv); if ((SvTYPE(tsv) == SVt_PVHV)) { MAGIC *mg; if (SvMAGICAL(tsv)) { mg = mg_find(tsv,'P'); if (mg) { sv = mg->mg_obj; if (sv_isobject(sv)) { tsv = (SV*)SvRV(sv); tmp = SvIV(tsv); } } } else { return SWIG_ERROR; } } else { tmp = SvIV(tsv); } voidptr = INT2PTR(void *,tmp); } else if (! SvOK(sv)) { /* Check for undef */ *(ptr) = (void *) 0; return SWIG_OK; } else if (SvTYPE(sv) == SVt_RV) { /* Check for NULL pointer */ if (!SvROK(sv)) { *(ptr) = (void *) 0; return SWIG_OK; } else { return SWIG_ERROR; } } else { /* Don't know what it is */ return SWIG_ERROR; } if (_t) { /* Now see if the types match */ char *_c = HvNAME(SvSTASH(SvRV(sv))); tc = SWIG_TypeProxyCheck(_c,_t); if (!tc) { return SWIG_ERROR; } { int newmemory = 0; *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } } else { *ptr = voidptr; } /* * DISOWN implementation: we need a perl guru to check this one. */ if (tsv && (flags & SWIG_POINTER_DISOWN)) { /* * almost copy paste code from below SWIG_POINTER_OWN setting */ SV *obj = sv; HV *stash = SvSTASH(SvRV(obj)); GV *gv = *(GV**) hv_fetch(stash, "OWNER", 5, TRUE); if (isGV(gv)) { HV *hv = GvHVn(gv); /* * To set ownership (see below), a newSViv(1) entry is added. * Hence, to remove ownership, we delete the entry. */ if (hv_exists_ent(hv, obj, 0)) { hv_delete_ent(hv, obj, 0, 0); } } } return SWIG_OK; } SWIGRUNTIME void SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { if (ptr && (flags & SWIG_SHADOW)) { SV *self; SV *obj=newSV(0); HV *hash=newHV(); HV *stash; sv_setref_pv(obj, (char *) SWIG_Perl_TypeProxyName(t), ptr); stash=SvSTASH(SvRV(obj)); if (flags & SWIG_POINTER_OWN) { HV *hv; GV *gv=*(GV**)hv_fetch(stash, "OWNER", 5, TRUE); if (!isGV(gv)) gv_init(gv, stash, "OWNER", 5, FALSE); hv=GvHVn(gv); hv_store_ent(hv, obj, newSViv(1), 0); } sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0); SvREFCNT_dec(obj); self=newRV_noinc((SV *)hash); sv_setsv(sv, self); SvREFCNT_dec((SV *)self); sv_bless(sv, stash); } else { sv_setref_pv(sv, (char *) SWIG_Perl_TypeProxyName(t), ptr); } } SWIGRUNTIMEINLINE SV * SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) { SV *result = sv_newmortal(); SWIG_MakePtr(result, ptr, t, flags); return result; } SWIGRUNTIME void SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); strcpy(r,SWIG_Perl_TypeProxyName(type)); sv_setpv(sv, result); } SWIGRUNTIME SV * SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) { SV *result = sv_newmortal(); SWIG_Perl_MakePackedObj(result, ptr, sz, type); return result; } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c = 0; if ((!obj) || (!SvOK(obj))) return SWIG_ERROR; c = SvPV_nolen(obj); /* Pointer values must start with leading underscore */ if (*c != '_') return SWIG_ERROR; c++; c = SWIG_UnpackData(c,ptr,sz); if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) return SWIG_ERROR; } return SWIG_OK; } /* Macros for low-level exception handling */ #define SWIG_croak(x) { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; } typedef XSPROTO(SwigPerlWrapper); typedef SwigPerlWrapper *SwigPerlWrapperPtr; /* Structure for command table */ typedef struct { const char *name; SwigPerlWrapperPtr wrapper; } swig_command_info; /* Information for constant table */ #define SWIG_INT 1 #define SWIG_FLOAT 2 #define SWIG_STRING 3 #define SWIG_POINTER 4 #define SWIG_BINARY 5 /* Constant information structure */ typedef struct swig_constant_info { int type; const char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_constant_info; /* Structure for variable table */ typedef struct { const char *name; SwigMagicFunc set; SwigMagicFunc get; swig_type_info **type; } swig_variable_info; /* Magic variable code */ #ifndef PERL_OBJECT #define swig_create_magic(s,a,b,c) _swig_create_magic(s,a,b,c) #ifndef MULTIPLICITY SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) #else SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) #endif #else # define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c) SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) #endif { MAGIC *mg; sv_magic(sv,sv,'U',(char *) name,strlen(name)); mg = mg_find(sv,'U'); mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL)); mg->mg_virtual->svt_get = (SwigMagicFunc) get; mg->mg_virtual->svt_set = (SwigMagicFunc) set; mg->mg_virtual->svt_len = 0; mg->mg_virtual->svt_clear = 0; mg->mg_virtual->svt_free = 0; } SWIGRUNTIME swig_module_info * SWIG_Perl_GetModule(void) { static void *type_pointer = (void *)0; SV *pointer; /* first check if pointer already created */ if (!type_pointer) { pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI); if (pointer && SvOK(pointer)) { type_pointer = INT2PTR(swig_type_info **, SvIV(pointer)); } } return (swig_module_info *) type_pointer; } SWIGRUNTIME void SWIG_Perl_SetModule(swig_module_info *module) { SV *pointer; /* create a new pointer */ pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI); sv_setiv(pointer, PTR2IV(module)); } #ifdef __cplusplus } #endif /* Workaround perl5 global namespace pollution. Note that undefining library * functions like fopen will not solve the problem on all platforms as fopen * might be a macro on Windows but not necessarily on other operating systems. */ #ifdef do_open #undef do_open #endif #ifdef do_close #undef do_close #endif #ifdef scalar #undef scalar #endif #ifdef list #undef list #endif #ifdef apply #undef apply #endif #ifdef convert #undef convert #endif #ifdef Error #undef Error #endif #ifdef form #undef form #endif #ifdef vform #undef vform #endif #ifdef LABEL #undef LABEL #endif #ifdef METHOD #undef METHOD #endif #ifdef Move #undef Move #endif #ifdef yylex #undef yylex #endif #ifdef yyparse #undef yyparse #endif #ifdef yyerror #undef yyerror #endif #ifdef invert #undef invert #endif #ifdef ref #undef ref #endif #ifdef read #undef read #endif #ifdef write #undef write #endif #ifdef eof #undef eof #endif #ifdef bool #undef bool #endif #ifdef close #undef close #endif #ifdef rewind #undef rewind #endif #ifdef free #undef free #endif #ifdef malloc #undef malloc #endif #ifdef calloc #undef calloc #endif #ifdef Stat #undef Stat #endif #ifdef check #undef check #endif #ifdef seekdir #undef seekdir #endif #ifdef open #undef open #endif #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_HostAddr swig_types[0] #define SWIGTYPE_p_HostSerial swig_types[1] #define SWIGTYPE_p_HostTraffic swig_types[2] #define SWIGTYPE_p_char swig_types[3] static swig_type_info *swig_types[5]; static swig_module_info swig_module = {swig_types, 4, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) /* -------- TYPES TABLE (END) -------- */ #define SWIG_init boot_ntop #define SWIG_name "ntopc::boot_ntop" #define SWIG_prefix "ntopc::" #define SWIGVERSION 0x010336 #define SWIG_VERSION SWIGVERSION #define SWIG_as_voidptr(a) (void *)((const void *)(a)) #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a)) #ifdef __cplusplus extern "C" #endif #ifndef PERL_OBJECT #ifndef MULTIPLICITY SWIGEXPORT void SWIG_init (CV* cv); #else SWIGEXPORT void SWIG_init (pTHXo_ CV* cv); #endif #else SWIGEXPORT void SWIG_init (CV *cv, CPerlObj *); #endif #include "ntop.h" SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } SWIGINTERN int SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc) { if (SvPOK(obj)) { STRLEN len = 0; char *cstr = SvPV(obj, len); size_t size = len + 1; if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = (char *)memcpy((char *)malloc((size)*sizeof(char)), cstr, sizeof(char)*(size)); } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } } if (psize) *psize = size; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { char* vptr = 0; if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = vptr; if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif SWIGINTERN int SWIG_AsVal_double SWIG_PERL_DECL_ARGS_2(SV *obj, double *val) { if (SvNIOK(obj)) { if (val) *val = SvNV(obj); return SWIG_OK; } else if (SvIOK(obj)) { if (val) *val = (double) SvIV(obj); return SWIG_AddCast(SWIG_OK); } else { const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; double v = strtod(nptr, &endptr); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } } return SWIG_TypeError; } #include #include SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } SWIGINTERN int SWIG_AsVal_long SWIG_PERL_DECL_ARGS_2(SV *obj, long* val) { if (SvIOK(obj)) { if (val) *val = SvIV(obj); return SWIG_OK; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; long v; errno = 0; v = strtol(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double SWIG_PERL_CALL_ARGS_2(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_int SWIG_PERL_DECL_ARGS_2(SV * obj, int *val) { long v; int res = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(obj, &v); if (SWIG_IsOK(res)) { if ((v < INT_MIN || v > INT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (int)(v); } } return res; } SWIGINTERN int SWIG_AsVal_short SWIG_PERL_DECL_ARGS_2(SV * obj, short *val) { long v; int res = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(obj, &v); if (SWIG_IsOK(res)) { if ((v < SHRT_MIN || v > SHRT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (short)(v); } } return res; } #ifdef __cplusplus extern "C" { #endif #ifdef PERL_OBJECT #define MAGIC_CLASS _wrap_ntop_var:: class _wrap_ntop_var : public CPerlObj { public: #else #define MAGIC_CLASS #endif SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SWIGUNUSEDPARM(mg)) { MAGIC_PPERL croak("Value is read-only."); return 0; } #ifdef PERL_OBJECT }; #endif #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif XS(_wrap_ntop_perl_sendString) { { char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int argvi = 0; dXSARGS; if ((items < 1) || (items > 1)) { SWIG_croak("Usage: ntop_perl_sendString(str);"); } res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ntop_perl_sendString" "', argument " "1"" of type '" "char *""'"); } arg1 = (char *)(buf1); ntop_perl_sendString(arg1); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); XSRETURN(argvi); fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); SWIG_croak_null(); } } XS(_wrap_ntop_perl_send_http_header) { { int arg1 ; char *arg2 = (char *) 0 ; int val1 ; int ecode1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int argvi = 0; dXSARGS; if ((items < 2) || (items > 2)) { SWIG_croak("Usage: ntop_perl_send_http_header(mime_type,title);"); } ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "ntop_perl_send_http_header" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ntop_perl_send_http_header" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); ntop_perl_send_http_header(arg1,arg2); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); XSRETURN(argvi); fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); SWIG_croak_null(); } } XS(_wrap_ntop_perl_send_html_footer) { { int argvi = 0; dXSARGS; if ((items < 0) || (items > 0)) { SWIG_croak("Usage: ntop_perl_send_html_footer();"); } ntop_perl_send_html_footer(); XSRETURN(argvi); fail: SWIG_croak_null(); } } XS(_wrap_ntop_perl_loadHost) { { int argvi = 0; dXSARGS; if ((items < 0) || (items > 0)) { SWIG_croak("Usage: ntop_perl_loadHost();"); } ntop_perl_loadHost(); XSRETURN(argvi); fail: SWIG_croak_null(); } } XS(_wrap_ntop_perl_getFirstHost) { { int arg1 ; int val1 ; int ecode1 = 0 ; int argvi = 0; dXSARGS; if ((items < 1) || (items > 1)) { SWIG_croak("Usage: ntop_perl_getFirstHost(actualDeviceId);"); } ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "ntop_perl_getFirstHost" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ntop_perl_getFirstHost(arg1); XSRETURN(argvi); fail: SWIG_croak_null(); } } XS(_wrap_ntop_perl_getNextHost) { { int arg1 ; int val1 ; int ecode1 = 0 ; int argvi = 0; dXSARGS; if ((items < 1) || (items > 1)) { SWIG_croak("Usage: ntop_perl_getNextHost(actualDeviceId);"); } ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "ntop_perl_getNextHost" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ntop_perl_getNextHost(arg1); XSRETURN(argvi); fail: SWIG_croak_null(); } } XS(_wrap_ntop_perl_sendFile) { { char *arg1 = (char *) 0 ; int arg2 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; int argvi = 0; dXSARGS; if ((items < 2) || (items > 2)) { SWIG_croak("Usage: ntop_perl_sendFile(fileName,doNotUnlink);"); } res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ntop_perl_sendFile" "', argument " "1"" of type '" "char *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ntop_perl_sendFile" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ntop_perl_sendFile(arg1,arg2); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); XSRETURN(argvi); fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); SWIG_croak_null(); } } XS(_wrap_ntop_perl_findHostByNumIP) { { HostAddr arg1 ; short arg2 ; int arg3 ; void *argp1 ; int res1 = 0 ; short val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int argvi = 0; HostTraffic *result = 0 ; dXSARGS; if ((items < 3) || (items > 3)) { SWIG_croak("Usage: ntop_perl_findHostByNumIP(hostIpAddress,vlanId,actualDeviceId);"); } { res1 = SWIG_ConvertPtr(ST(0), &argp1, SWIGTYPE_p_HostAddr, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ntop_perl_findHostByNumIP" "', argument " "1"" of type '" "HostAddr""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ntop_perl_findHostByNumIP" "', argument " "1"" of type '" "HostAddr""'"); } else { arg1 = *((HostAddr *)(argp1)); } } ecode2 = SWIG_AsVal_short SWIG_PERL_CALL_ARGS_2(ST(1), &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ntop_perl_findHostByNumIP" "', argument " "2"" of type '" "short""'"); } arg2 = (short)(val2); ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ntop_perl_findHostByNumIP" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (HostTraffic *)ntop_perl_findHostByNumIP(arg1,arg2,arg3); ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HostTraffic, 0 | 0); argvi++ ; XSRETURN(argvi); fail: SWIG_croak_null(); } } XS(_wrap_ntop_perl_findHostBySerial) { { HostSerial arg1 ; int arg2 ; void *argp1 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int argvi = 0; HostTraffic *result = 0 ; dXSARGS; if ((items < 2) || (items > 2)) { SWIG_croak("Usage: ntop_perl_findHostBySerial(serial,actualDeviceId);"); } { res1 = SWIG_ConvertPtr(ST(0), &argp1, SWIGTYPE_p_HostSerial, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ntop_perl_findHostBySerial" "', argument " "1"" of type '" "HostSerial""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ntop_perl_findHostBySerial" "', argument " "1"" of type '" "HostSerial""'"); } else { arg1 = *((HostSerial *)(argp1)); } } ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ntop_perl_findHostBySerial" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (HostTraffic *)ntop_perl_findHostBySerial(arg1,arg2); ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HostTraffic, 0 | 0); argvi++ ; XSRETURN(argvi); fail: SWIG_croak_null(); } } XS(_wrap_ntop_perl_findHostByMAC) { { char *arg1 = (char *) 0 ; short arg2 ; int arg3 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; short val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int argvi = 0; HostTraffic *result = 0 ; dXSARGS; if ((items < 3) || (items > 3)) { SWIG_croak("Usage: ntop_perl_findHostByMAC(macAddr,vlanId,actualDeviceId);"); } res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ntop_perl_findHostByMAC" "', argument " "1"" of type '" "char *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_short SWIG_PERL_CALL_ARGS_2(ST(1), &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ntop_perl_findHostByMAC" "', argument " "2"" of type '" "short""'"); } arg2 = (short)(val2); ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ntop_perl_findHostByMAC" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (HostTraffic *)ntop_perl_findHostByMAC(arg1,arg2,arg3); ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HostTraffic, 0 | 0); argvi++ ; if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); XSRETURN(argvi); fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); SWIG_croak_null(); } } /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_HostAddr = {"_p_HostAddr", "HostAddr *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_HostSerial = {"_p_HostSerial", "HostSerial *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_HostTraffic = {"_p_HostTraffic", "HostTraffic *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_HostAddr, &_swigt__p_HostSerial, &_swigt__p_HostTraffic, &_swigt__p_char, }; static swig_cast_info _swigc__p_HostAddr[] = { {&_swigt__p_HostAddr, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_HostSerial[] = { {&_swigt__p_HostSerial, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_HostTraffic[] = { {&_swigt__p_HostTraffic, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_HostAddr, _swigc__p_HostSerial, _swigc__p_HostTraffic, _swigc__p_char, }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_constant_info swig_constants[] = { {0,0,0,0,0,0} }; #ifdef __cplusplus } #endif static swig_variable_info swig_variables[] = { {0,0,0,0} }; static swig_command_info swig_commands[] = { {"ntopc::ntop_perl_sendString", _wrap_ntop_perl_sendString}, {"ntopc::ntop_perl_send_http_header", _wrap_ntop_perl_send_http_header}, {"ntopc::ntop_perl_send_html_footer", _wrap_ntop_perl_send_html_footer}, {"ntopc::ntop_perl_loadHost", _wrap_ntop_perl_loadHost}, {"ntopc::ntop_perl_getFirstHost", _wrap_ntop_perl_getFirstHost}, {"ntopc::ntop_perl_getNextHost", _wrap_ntop_perl_getNextHost}, {"ntopc::ntop_perl_sendFile", _wrap_ntop_perl_sendFile}, {"ntopc::ntop_perl_findHostByNumIP", _wrap_ntop_perl_findHostByNumIP}, {"ntopc::ntop_perl_findHostBySerial", _wrap_ntop_perl_findHostBySerial}, {"ntopc::ntop_perl_findHostByMAC", _wrap_ntop_perl_findHostByMAC}, {0,0} }; /* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned staticly to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int found, init; clientdata = clientdata; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); module_head = &swig_module; } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ found=0; iter=module_head; do { if (iter==&swig_module) { found=1; break; } iter=iter->next; } while (iter!= module_head); /* if the is found in the list, then all is done and we may leave */ if (found) return; /* otherwise we must add out module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpeters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %d\n", swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif #ifdef __cplusplus extern "C" #endif XS(SWIG_init) { dXSARGS; int i; SWIG_InitializeModule(0); /* Install commands */ for (i = 0; swig_commands[i].name; i++) { newXS((char*) swig_commands[i].name,swig_commands[i].wrapper, (char*)__FILE__); } /* Install variables */ for (i = 0; swig_variables[i].name; i++) { SV *sv; sv = get_sv((char*) swig_variables[i].name, TRUE | 0x2 | GV_ADDMULTI); if (swig_variables[i].type) { SWIG_MakePtr(sv,(void *)1, *swig_variables[i].type,0); } else { sv_setiv(sv,(IV) 0); } swig_create_magic(sv, (char *) swig_variables[i].name, swig_variables[i].set, swig_variables[i].get); } /* Install constant */ for (i = 0; swig_constants[i].type; i++) { SV *sv; sv = get_sv((char*)swig_constants[i].name, TRUE | 0x2 | GV_ADDMULTI); switch(swig_constants[i].type) { case SWIG_INT: sv_setiv(sv, (IV) swig_constants[i].lvalue); break; case SWIG_FLOAT: sv_setnv(sv, (double) swig_constants[i].dvalue); break; case SWIG_STRING: sv_setpv(sv, (char *) swig_constants[i].pvalue); break; case SWIG_POINTER: SWIG_MakePtr(sv, swig_constants[i].pvalue, *(swig_constants[i].ptype),0); break; case SWIG_BINARY: SWIG_MakePackedObj(sv, swig_constants[i].pvalue, swig_constants[i].lvalue, *(swig_constants[i].ptype)); break; default: break; } SvREADONLY_on(sv); } ST(0) = &PL_sv_yes; XSRETURN(1); } ntop-5.0.1+dfsg1/misc/perl/report.pl0000644000000000000000000000126411030144655015742 0ustar rootroot# # The First Basic Report # Cosimo Streppone # 2006-03-14 # # $Id: basic.pl 16 2006-03-27 16:51:09Z cosimo $ #use strict; #use warnings; use PDF::ReportWriter; my $rw = PDF::ReportWriter->new(); my @data = (); getFirstHost(0); loadHost(); while(($host{'ethAddress'} ne "") || ($host{'ipAddress'} ne "")) { push(@data, [ $host{'ethAddress'}, $host{'ipAddress'}, $host{'hostResolvedName'}, $host{'bytesSent'}, $host{'bytesRcvd'} ]); getNextHost(0); loadHost(); } $rw->render_report('./perl/report/basic.xml', \@data); # Produces `./basic.pdf', check xml to understand how # 13 = PDF send_http_header(13, ""); $rw->save(); sendFile("/tmp/basic.pdf", 0); ntop-5.0.1+dfsg1/misc/perl/test.pl0000644000000000000000000000332111200560420015371 0ustar rootroot# # (C) 2008 - Luca Deri # #use strict; #use warnings; send_http_header(1, "Known ntop hosts ".$ENV{'QUERY_STRING_UNESCAPED'}); # --------------------------------------------- print "################################################\n"; getFirstHost(0); loadHost(); while(($host{'ethAddress'} ne "") || ($host{'ipAddress'} ne "")) { print "+ [ipAddress=",$host{'ipAddress'},"][macAddress=",$host{'macAddress'},"][pktSent/pktRcvd=",$host{'pktSent'},"/",$host{'pktRcvd'},"]\n"; getNextHost(0); loadHost(); } #for my $k1 ( sort keys %hosts ) { # print "k1: $k1\n"; # for my $k2 ( keys %{$k1} ) { # print "k2: $k2 $hosts{ $k1 }{ $k2 }\n"; # } #} #foreach $key (sort(keys %hosts{'a'})) { # print $key,"\n"; #} #exit # --------------------------------------------- getFirstHost(0); loadHost(); sendString("
\n"); sendString("\n"); sendString("\n"); while(($host{'ethAddress'} ne "") || ($host{'ipAddress'} ne "")) { my $mac_addr; if($host{'ethAddress'} ne "") { my $mac = $host{'ethAddress'}; $mac =~ tr/:/_/; $mac_addr = "".$host{'ethAddress'}.""; } else { $mac_addr = ""; } sendString("\n"); getNextHost(0); loadHost(); } sendString("
MACIPPacketsBytes
".$mac_addr ." ".$host{'ipAddress'}."" ." ".$host{'hostResolvedName'} ."  ".$host{'pktSent'}." / ".$host{'pktRcvd'}."" ."  ".$host{'bytesSent'}." / ".$host{'bytesRcvd'}."" ." 
\n"); sendString("
\n"); send_html_footer(); ######## ntop-5.0.1+dfsg1/misc/perl/ntop.i0000644000000000000000000000126611201757167015236 0ustar rootroot// File : ntop.i // Command: swig -perl5 ntop.i %module ntop %{ #include "ntop.h" %} // #include "ntop_perl.h" void ntop_perl_sendString(char *str); void ntop_perl_send_http_header(int mime_type, char *title); void ntop_perl_send_html_footer(); void ntop_perl_loadHost(); void ntop_perl_getFirstHost(int actualDeviceId); void ntop_perl_getNextHost(int actualDeviceId); void ntop_perl_sendFile(char* fileName, int doNotUnlink); HostTraffic* ntop_perl_findHostByNumIP(HostAddr hostIpAddress, short vlanId, int actualDeviceId); HostTraffic* ntop_perl_findHostBySerial(HostSerial serial, int actualDeviceId); HostTraffic* ntop_perl_findHostByMAC(char* macAddr, short vlanId, int actualDeviceId); ntop-5.0.1+dfsg1/misc/configure.in.perl0000644000000000000000000000217411230052616016400 0ustar rootrootdnl> dnl> Perl check dnl> AC_CHECK_TOOL(PERL, perl) if test "x$ac_cv_prog_ac_ct_PERL" = "xperl"; then AC_MSG_CHECKING(whether perl development environment is present) ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS `perl -MExtUtils::Embed -e ccopts`" LIBS="$LIBS `perl -MExtUtils::Embed -e ldopts`" AC_TRY_RUN([ #include #include int main () { if (perl_alloc() != NULL) return 0; /* success */ else return 1; /* failure */ } ], ac_cv_perl_dev_installed=yes, ac_cv_perl_dev_installed=no, [echo $ac_n "cross compiling; assumed OK... $ac_c" ac_cv_perl_dev_installed=yes]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" if test "$ac_cv_perl_dev_installed" = yes ; then AC_MSG_RESULT(yes) PERL_LIB=`perl -MExtUtils::Embed -e ldopts` PERL_INC=`perl -MExtUtils::Embed -e ccopts` AC_DEFINE_UNQUOTED(HAVE_PERL, 1, [PERL is supported]) else AC_MSG_RESULT(no) echo "Please install the perl module ExtUtils::Embed in order to enable perl support in ntop" fi else AC_MSG_WARN("Perl is missing, ntop won't be compiled with perl support") fi dnl> AC_SUBST(PERL_LIB) AC_SUBST(PERL_INC) ntop-5.0.1+dfsg1/misc/cpacketPlugin.c0000644000000000000000000012232111660215571016070 0ustar rootroot/* * Copyright(C) 2008-11 Luca Deri * * http://www.ntop.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This plugin works only with threads */ #include "ntop.h" #include "globals-report.h" static void* cpacketMainLoop(void* _deviceId); /* #define DEBUG_FLOWS */ #define CONST_CPACKET_STATISTICS_HTML "statistics.html" #define valueOf(a) (a == NULL ? "" : a) #define isEmpty(a) ((a == NULL) || (a[0] == '\0') ? 1 : 0) #define SWAP8(a,b) { u_int8_t c = a; a = b; b = c; } #define SWAP16(a,b) { u_int16_t c = a; a = b; b = c; } #define SWAP32(a,b) { u_int32_t c = a; a = b; b = c; } /* ********************************* */ /* Forward */ static int setcPacketInSocket(int); static void setPluginStatus(char * status); static int initcPacketFunct(void); static void termcPacketFunct(u_char termNtop /* 0=term plugin, 1=term ntop */); static void termcPacketDevice(int deviceId); static void initcPacketDevice(int deviceId); #ifdef DEBUG_FLOWS static void handlecPacketPacket(u_char *_deviceId, const struct pcap_pkthdr *h, const u_char *p); #endif static void handlecPacketHTTPrequest(char* url); static void printcPacketConfiguration(int deviceId); static int createcPacketDevice(int cpacketDeviceId); static int mapcPacketDeviceToNtopDevice(int deviceId); static void printcPacketStatistics(void); static void printcPacketCounterStats(int deviceId, int page_header, int print_table); /* ****************************** */ u_char static pluginActive = 0; static ExtraPage cpacketExtraPages[] = { { NULL, CONST_CPACKET_STATISTICS_HTML, "Statistics" }, { NULL, NULL, NULL } }; static PluginInfo cpacketPluginInfo[] = { { VERSION, /* current ntop version */ "cPacket", "This plugin is used collect traffic statistics emitted by cPacket's cTap devices.
" "Received flow data is reported as a separate 'NIC' in the regular ntop " "reports.
Remember to switch the reporting NIC.", "0.1", /* version */ "L.Deri", "cPacket", /* http://:/plugins/cPacket */ 0, /* Active by default */ ViewConfigure, 1, /* Inactive setup */ initcPacketFunct, /* InitFunc */ termcPacketFunct, /* TermFunc */ #ifdef DEBUG_FLOWS handlecPacketPacket, #else NULL, /* PluginFunc */ #endif handlecPacketHTTPrequest, NULL, /* no host creation/deletion handle */ #ifdef DEBUG_FLOWS "udp and port 20167", #else NULL, /* no capture */ #endif NULL, /* no status */ cpacketExtraPages } }; /* ************************************** */ static int setcPacketInSocket(int deviceId) { struct sockaddr_in sockIn; int sockopt = 1; if(myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket > 0) { traceEvent(CONST_TRACE_ALWAYSDISPLAY, "CPACKET: Collector terminated"); closeNwSocket(&myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket); } if(myGlobals.device[deviceId].cpacketGlobals->cpacketInPort > 0) { errno = 0; myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket = socket(AF_INET, SOCK_DGRAM, 0); if((myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket <= 0) || (errno != 0) ) { traceEvent(CONST_TRACE_INFO, "CPACKET: Unable to create a UDP socket - returned %d, error is '%s'(%d)", myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket, strerror(errno), errno); setPluginStatus("Disabled - Unable to create listening socket."); return(-1); } traceEvent(CONST_TRACE_INFO, "CPACKET: Created a UDP socket (%d)", myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket); setsockopt(myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&sockopt, sizeof(sockopt)); sockIn.sin_family = AF_INET; sockIn.sin_port =(int)htons(myGlobals.device[deviceId].cpacketGlobals->cpacketInPort); sockIn.sin_addr.s_addr = INADDR_ANY; if(bind(myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket, (struct sockaddr *)&sockIn, sizeof(sockIn)) < 0) { traceEvent(CONST_TRACE_ERROR, "CPACKET: Collector port %d already in use", myGlobals.device[deviceId].cpacketGlobals->cpacketInPort); closeNwSocket(&myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket); myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket = 0; return(0); } traceEvent(CONST_TRACE_ALWAYSDISPLAY, "CPACKET: Collector listening on port %d", myGlobals.device[deviceId].cpacketGlobals->cpacketInPort); } if((myGlobals.device[deviceId].cpacketGlobals->cpacketInPort != 0) && (!myGlobals.device[deviceId].cpacketGlobals->threadActive)) { /* This plugin works only with threads */ createThread(&myGlobals.device[deviceId].cpacketGlobals->cpacketThread, cpacketMainLoop, (void*)((long)deviceId)); traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: CPACKET: Started thread for receiving flows on port %d", (long)myGlobals.device[deviceId].cpacketGlobals->cpacketThread, myGlobals.device[deviceId].cpacketGlobals->cpacketInPort); } return(0); } /* ********************************************************* */ static void updateCtapCounter(int deviceId, char *name, u_long bytes, u_long packets) { cPacketCounter *prev, *entry; u_short debug = 0; if(debug) traceEvent(CONST_TRACE_ALWAYSDISPLAY, "[%s][%lu|%lu]", name, bytes, packets); if(myGlobals.device[deviceId].cpacketGlobals->last_head != NULL) prev = myGlobals.device[deviceId].cpacketGlobals->last_head; else prev = myGlobals.device[deviceId].cpacketGlobals->last_head = myGlobals.device[deviceId].cpacketGlobals->counter_list_head; while(myGlobals.device[deviceId].cpacketGlobals->last_head != NULL) { if(!strcmp(name, myGlobals.device[deviceId].cpacketGlobals->last_head->name)) { /* Update */ entry = myGlobals.device[deviceId].cpacketGlobals->last_head; entry->bytes = bytes, entry->packets = packets; if(debug) traceEvent(CONST_TRACE_INFO, "Updated [%s][%lu|%lu]", name, bytes, packets); if(myGlobals.device[deviceId].cpacketGlobals->last_head->next) myGlobals.device[deviceId].cpacketGlobals->last_head = myGlobals.device[deviceId].cpacketGlobals->last_head->next; else myGlobals.device[deviceId].cpacketGlobals->last_head = myGlobals.device[deviceId].cpacketGlobals->counter_list_head; return; } else { prev = myGlobals.device[deviceId].cpacketGlobals->last_head; myGlobals.device[deviceId].cpacketGlobals->last_head = myGlobals.device[deviceId].cpacketGlobals->last_head->next; } } /* If we're here the counter has not been updated yet */ entry = (cPacketCounter*)malloc(sizeof(cPacketCounter)); if(entry) { entry->name = strdup(name), entry->bytes = bytes, entry->packets = packets, entry->next = NULL; if(myGlobals.device[deviceId].cpacketGlobals->counter_list_head == NULL) myGlobals.device[deviceId].cpacketGlobals->counter_list_head = entry; else prev->next = entry; myGlobals.device[deviceId].cpacketGlobals->last_head = NULL; if(debug) traceEvent(CONST_TRACE_INFO, "Added [%s][%lu|%lu]", name, bytes, packets); } } /* ********************************************************* */ static void dissectPacket(u_int32_t cpacket_device_ip, char *buffer, int bufferLen, int deviceId) { char *tokbuf, *row; // printf("\n\n%s\n", buffer); row = strtok_r(buffer, "\n", &tokbuf); if(!row) return; row = strtok_r(NULL, "\n", &tokbuf); if(!row) return; row = strtok_r(NULL, "\n", &tokbuf); while(row != NULL) { if(row[0] == '\"') { char *name, *value, *elem_buf; u_long bytes, pkts; name = strtok_r(row, " ", &elem_buf); if(!name) break; name++; name++; name[strlen(name)-1] = '\0'; value = strtok_r(NULL, " ", &elem_buf); if(!value) break; sscanf(value, "(%lu,%lu)", &bytes, &pkts); updateCtapCounter(deviceId, name, bytes, pkts); } row = strtok_r(NULL, "\n", &tokbuf); } } /* ****************************** */ #ifdef MAKE_WITH_CPACKETSIGTRAP RETSIGTYPE cpacketcleanup(int signo) { static int msgSent = 0; int i; void *array[20]; size_t size; char **strings; if(msgSent<10) { traceEvent(CONST_TRACE_FATALERROR, "CPACKET: caught signal %d %s", signo, signo == SIGHUP ? "SIGHUP" : signo == SIGINT ? "SIGINT" : signo == SIGQUIT ? "SIGQUIT" : signo == SIGILL ? "SIGILL" : signo == SIGABRT ? "SIGABRT" : signo == SIGFPE ? "SIGFPE" : signo == SIGKILL ? "SIGKILL" : signo == SIGSEGV ? "SIGSEGV" : signo == SIGPIPE ? "SIGPIPE" : signo == SIGALRM ? "SIGALRM" : signo == SIGTERM ? "SIGTERM" : signo == SIGUSR1 ? "SIGUSR1" : signo == SIGUSR2 ? "SIGUSR2" : signo == SIGCHLD ? "SIGCHLD" : #ifdef SIGCONT signo == SIGCONT ? "SIGCONT" : #endif #ifdef SIGSTOP signo == SIGSTOP ? "SIGSTOP" : #endif #ifdef SIGBUS signo == SIGBUS ? "SIGBUS" : #endif #ifdef SIGSYS signo == SIGSYS ? "SIGSYS" #endif : "other"); msgSent++; } traceEvent(CONST_TRACE_FATALERROR, "CPACKET: ntop shutting down..."); exit(100); } #endif /* MAKE_WITH_CPACKETSIGTRAP */ /* ****************************** */ static void* cpacketMainLoop(void* _deviceId) { fd_set cpacketMask; int rc, len, deviceId; u_char buffer[2048]; struct sockaddr_in fromHost; deviceId = (int)((long)_deviceId); if(!(myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket > 0)) return(NULL); traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: CPACKET: thread starting [p%d]", (long unsigned int)pthread_self(), getpid()); #ifdef MAKE_WITH_CPACKETSIGTRAP signal(SIGSEGV, cpacketcleanup); signal(SIGHUP, cpacketcleanup); signal(SIGINT, cpacketcleanup); signal(SIGQUIT, cpacketcleanup); signal(SIGILL, cpacketcleanup); signal(SIGABRT, cpacketcleanup); signal(SIGFPE, cpacketcleanup); signal(SIGKILL, cpacketcleanup); signal(SIGPIPE, cpacketcleanup); signal(SIGALRM, cpacketcleanup); signal(SIGTERM, cpacketcleanup); signal(SIGUSR1, cpacketcleanup); signal(SIGUSR2, cpacketcleanup); /* signal(SIGCHLD, cpacketcleanup); */ #ifdef SIGCONT signal(SIGCONT, cpacketcleanup); #endif #ifdef SIGSTOP signal(SIGSTOP, cpacketcleanup); #endif #ifdef SIGBUS signal(SIGBUS, cpacketcleanup); #endif #ifdef SIGSYS signal(SIGSYS, cpacketcleanup); #endif #endif /* MAKE_WITH_CPACKETSIGTRAP */ myGlobals.device[deviceId].activeDevice = 1; myGlobals.device[deviceId].cpacketGlobals->threadActive = 1; ntopSleepUntilStateRUN(); traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: CPACKET: (port %d) thread running [p%d]", (long unsigned int)pthread_self(), myGlobals.device[deviceId].cpacketGlobals->cpacketInPort, getpid()); for(;myGlobals.ntopRunState <= FLAG_NTOPSTATE_RUN;) { int maxSock = myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket; struct timeval wait_time; FD_ZERO(&cpacketMask); FD_SET(myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket, &cpacketMask); if(!myGlobals.device[deviceId].activeDevice) break; wait_time.tv_sec = 3, wait_time.tv_usec = 0; rc = select(maxSock+1, &cpacketMask, NULL, NULL, &wait_time); if(!myGlobals.device[deviceId].activeDevice) break; if(rc > 0) { if(FD_ISSET(myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket, &cpacketMask)){ len = sizeof(fromHost); rc = recvfrom(myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket, (char*)&buffer, sizeof(buffer), 0, (struct sockaddr*)&fromHost, (socklen_t*)&len); } #ifdef DEBUG_FLOWS traceEvent(CONST_TRACE_INFO, "CPACKET_DEBUG: Received cPacket packet(len=%d)(deviceId=%d)", rc, deviceId); #endif if(rc > 0) { int i; myGlobals.device[deviceId].cpacketGlobals->numPktsRcvd++; NTOHL(fromHost.sin_addr.s_addr); for(i=0; ideviceList[i].probeAddr.s_addr == 0) { myGlobals.device[deviceId].cpacketGlobals->deviceList[i].probeAddr.s_addr = fromHost.sin_addr.s_addr; myGlobals.device[deviceId].cpacketGlobals->deviceList[i].pkts = 1; break; } else if(myGlobals.device[deviceId].cpacketGlobals->deviceList[i].probeAddr.s_addr == fromHost.sin_addr.s_addr) { myGlobals.device[deviceId].cpacketGlobals->deviceList[i].pkts++; break; } } dissectPacket(fromHost.sin_addr.s_addr, (char*)buffer, rc, deviceId); } } else { if((rc < 0) && (myGlobals.ntopRunState <= FLAG_NTOPSTATE_RUN) && (errno != EINTR /* Interrupted system call */)) { traceEvent(CONST_TRACE_ERROR, "CPACKET: select() failed(%d, %s), terminating cpacket", errno, strerror(errno)); break; } } } if(myGlobals.device[deviceId].cpacketGlobals != NULL) { myGlobals.device[deviceId].cpacketGlobals->threadActive = 0; myGlobals.device[deviceId].cpacketGlobals->cpacketThread = 0; } myGlobals.device[deviceId].activeDevice = 0; traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: CPACKET: thread terminated [p%d][cpacketDeviceId=%d]", (long unsigned int)pthread_self(), getpid(), myGlobals.device[deviceId].cpacketGlobals->cpacketDeviceId); return(NULL); } /* ****************************** */ static char* cpValue(int deviceId, char *name, int appendDeviceId) { static char buf[64]; if(appendDeviceId) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "cpacket.%d.%s", myGlobals.device[deviceId].cpacketGlobals->cpacketDeviceId, name); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "cpacket.%s", name); } #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "CPACKET: cpValue=%s", buf); #endif return(buf); } /* ****************************** */ static void initcPacketDevice(int deviceId) { char value[1024]; if(!pluginActive) return; traceEvent(CONST_TRACE_INFO, "CPACKET: initializing deviceId=%d", deviceId); if(myGlobals.device[deviceId].cpacketGlobals == NULL) { traceEvent(CONST_TRACE_ERROR, "CPACKET: initcPacketDevice internal error"); return; } allocDeviceMemory(deviceId); setPluginStatus(NULL); myGlobals.device[deviceId].cpacketGlobals->threadActive = 0; if(fetchPrefsValue(cpValue(deviceId, "cpacketInPort", 1), value, sizeof(value)) == -1) storePrefsValue(cpValue(deviceId, "cpacketInPort", 1), "0"); else myGlobals.device[deviceId].cpacketGlobals->cpacketInPort = atoi(value); if(setcPacketInSocket(deviceId) != 0) return; if(fetchPrefsValue(cpValue(deviceId, "debug", 1), value, sizeof(value)) == -1) { storePrefsValue(cpValue(deviceId, "debug", 1), "0"); myGlobals.device[deviceId].cpacketGlobals->cpacketDebug = 1; } else { myGlobals.device[deviceId].cpacketGlobals->cpacketDebug = atoi(value); } initDeviceSemaphores(deviceId); } /* ****************************** */ static int initcPacketFunct(void) { char value[128]; traceEvent(CONST_TRACE_INFO, "CPACKET: Welcome to the cpacket plugin"); pluginActive = 1; myGlobals.runningPref.mergeInterfaces = 0; /* Use different devices */ #ifdef MAX_CPACKET_FLOW_BUFFER memset(&cpacketflowBuffer, 0, sizeof(cpacketflowBuffer)); cpacketflowBufferCount = 0; cpacketfmaxTime = 0.0; #endif if((fetchPrefsValue(cpValue(0, "knownDevices", 0), value, sizeof(value)) != -1) && (strlen(value) > 0)) { char *strtokState, *dev; traceEvent(CONST_TRACE_INFO, "CPACKET: initializing '%s' devices", value); dev = strtok_r(value, ",", &strtokState); while(dev != NULL) { int deviceId = atoi(dev); if(deviceId > 0) { int initializedDeviceId; if((initializedDeviceId = createcPacketDevice(deviceId)) == -1) { pluginActive = 0; return(-1); } } dev = strtok_r(NULL, ",", &strtokState); } } else traceEvent(CONST_TRACE_INFO, "CPACKET: no devices to initialize"); return(0); } /* ****************************** */ static void printcPacketDeviceConfiguration(void) { char buf[512], value[128]; int i = 0; sendString("
\n"); sendString("\n"); sendString("
Available cPacket Devices
\n"); if((fetchPrefsValue(cpValue(0, "knownDevices", 0), value, sizeof(value)) != -1) && (strlen(value) > 0)) { char *strtokState, *dev; sendString("
pluginURLname); sendString("\" METHOD=GET>\n"); dev = strtok_r(value, ",", &strtokState); while(dev != NULL) { int id = mapcPacketDeviceToNtopDevice(atoi(dev)); if(id == -1) safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s.%s\n", dev, i == 0 ? "CHECKED" : "", CPACKET_DEVICE_NAME, dev); else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s\n", dev, i == 0 ? "CHECKED" : "", myGlobals.device[id].humanFriendlyName); sendString(buf); if(pluginActive) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "[ Delete ]", cpacketPluginInfo->pluginURLname, dev); sendString(buf); } sendString("
\n"); i++; dev = strtok_r(NULL, ",", &strtokState); } if(pluginActive) sendString("

 " "\n

\n"); } /* *********************** */ if(pluginActive) { sendString("

pluginURLname); sendString("\" METHOD=GET>\n"); sendString("

 \n

\n"); } else { sendString("

Please pluginURLname); sendString("=1\">enable the cPacket plugin first
\n"); } sendString("

"); printHTMLtrailer(); } /* ****************************** */ static void printcPacketStatistics(void) { int i, printedStatistics = 0; char buf[1024], formatBuf[64]; printHTMLheader("cTap Statistics", NULL, 0); for(i = 0; inumPktsRcvd > 0)) { if(printedStatistics == 0) { sendString("
\n"); printedStatistics = 1; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", myGlobals.device[i].humanFriendlyName); sendString(buf); sendString("\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(myGlobals.device[i].cpacketGlobals->numPktsRcvd, formatBuf, sizeof(formatBuf))); sendString(buf); printcPacketCounterStats(i, 0, 0); } } if(printedStatistics == 1) { sendString("
Device: %s
Statistics
Stats Packets Received%s
\n
\n"); } else { printNoDataYet(); } } /* ****************************** */ static void printcPacketCounterStats(int deviceId, int page_header, int print_table) { char buf[1024], *title = "cTap Counters"; if((deviceId < 0) || (deviceId >myGlobals.numDevices)) return; if(page_header) printHTMLheader(title, NULL, 0); if(print_table) printSectionTitle(title); if(myGlobals.device[deviceId].cpacketGlobals->numPktsRcvd > 0) { cPacketCounter *elem; memset(&buf, 0, sizeof(buf)); if(print_table) sendString("
\n"); sendString("" "" "\n"); elem = myGlobals.device[deviceId].cpacketGlobals->counter_list_head; while(elem != NULL) { char formatBuf[64], formatBuf1[64]; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", elem->name, formatBytes(elem->bytes, 1, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", myGlobals.device[deviceId].uniqueIfName, elem->name, (unsigned int)(myGlobals.actTime-3600), (unsigned int)myGlobals.actTime, elem->name); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", formatPkts(elem->packets, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", myGlobals.device[deviceId].uniqueIfName, elem->name, (unsigned int)(myGlobals.actTime-3600), (unsigned int)myGlobals.actTime, elem->name); sendString(buf); elem = elem->next; } if(print_table) sendString("
CounterBytesPackets
%s%s" "" "" "%s" "" "" "
\n
\n"); } else { printNoDataYet(); } } /* ****************************** */ static void printcPacketConfiguration(int deviceId) { char buf[512]; #define UDPSLASHSCPT "UDP" sendString("
\n"); sendString("\n"); sendString(""); sendString("\n"); sendString("\n"); sendString("\n"); sendString("\n"); sendString("\n" "\n"); /* ********************************************* */ sendString("\n"); sendString("\n\n"); sendString("\n"); sendString("
Incoming Flows
cPacket Device
pluginURLname); sendString("\" method=GET>\n

"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.device[deviceId].cpacketGlobals->cpacketDeviceId); sendString(buf); sendString(" "); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), " [ List cPacket Interfaces ]

\n
", cpacketPluginInfo->pluginName); sendString(buf); sendString("
Flow
Collection
Local
Collector
" UDPSLASHSCPT "
Port
pluginURLname); sendString("\" method=GET>\n

"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.device[deviceId].cpacketGlobals->cpacketDeviceId); sendString(buf); sendString("cpacketInPort); sendString(buf); sendString("\"> [ Use a port value of 0 to disable collection ] " "" "

\n
\n\n" "

If you want ntop to display cPacket data it receives from other " "hosts, i.e. act as a collector, you must specify the " UDPSLASHSCPT " port to listen to. " "The default port used for cPacket is " DEFAULT_CPACKET_PORT_STR ".

\n" "

\n"); if(myGlobals.device[deviceId].cpacketGlobals->cpacketInPort == 0) sendString("

WARNING: " "The 'Local Collector " UDPSLASHSCPT "Port' is zero (none). " "Even if this plugin is ACTIVE, you must still enter a port number for " "ntop to receive and process cPacket data.

\n"); sendString("
 
General Options
Debug
pluginURLname); sendString("\" method=GET>\n

"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", myGlobals.device[deviceId].cpacketGlobals->cpacketDeviceId); sendString(buf); if(myGlobals.device[deviceId].cpacketGlobals->cpacketDebug) { sendString("On"); sendString("Off"); } else { sendString("On"); sendString("Off"); } sendString("

\n"); sendString("
\n" "

This option turns on debugging, which dumps a huge quantity of " "noise into the standard ntop log, all about what the cPacket " "plugin is doing. If you are doing development, this might be helpful, " "otherwise leave it alone!

\n" "
REMEMBER
  • Regardless of settings here, " "the cPacket plugin must be ACTIVE on the main plugin menu (click " "here to go back) " "for ntop to receive and/or " "process cPacket data.\n" "
  • Any option not indicated as taking effect immediately will require you " "to recycle (inactivate and then activate) the cPacket plugin in order " "for the change to take affect.
\n
\n"); } #undef UDPSLASHSCPT /* ****************************** */ static int createcPacketDevice(int cpacketDeviceId) { int deviceId; char buf[32], value[128]; traceEvent(CONST_TRACE_INFO, "CPACKET: createcPacketDevice(%d)", cpacketDeviceId); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s.%d", CPACKET_DEVICE_NAME, cpacketDeviceId); deviceId = createDummyInterface(buf); if(deviceId != -1) { myGlobals.device[deviceId].cpacketGlobals = (cPacketGlobals*)malloc(sizeof(cPacketGlobals)); if(myGlobals.device[deviceId].cpacketGlobals == NULL) { /* Not enough memory */ traceEvent(CONST_TRACE_ERROR, "CPACKET: not enough memory (cpacketGlobals malloc)"); return(-1); } memset(myGlobals.device[deviceId].cpacketGlobals, 0, sizeof(cPacketGlobals)); myGlobals.device[deviceId].activeDevice = 1; myGlobals.device[deviceId].dummyDevice = 0; myGlobals.device[deviceId].cpacketGlobals->cpacketDeviceId = cpacketDeviceId; initcPacketDevice(deviceId); createDeviceIpProtosList(deviceId); if(fetchPrefsValue(cpValue(deviceId, "humanFriendlyName", 1), value, sizeof(value)) != -1) { free(myGlobals.device[deviceId].humanFriendlyName); myGlobals.device[deviceId].humanFriendlyName = strdup(value); calculateUniqueInterfaceName(deviceId); } traceEvent(CONST_TRACE_INFO, "CPACKET: createcPacketDevice created device %d", deviceId); } else traceEvent(CONST_TRACE_ERROR, "CPACKET: createDummyInterface failed"); return(deviceId); } /* ****************************** */ /* #define DEBUG_FLOWS */ static int mapcPacketDeviceToNtopDevice(int cpacketDeviceId) { int i; for(i=0; icpacketDeviceId == cpacketDeviceId)) { #ifdef DEBUG_FLOWS traceEvent(CONST_TRACE_INFO, "CPACKET: mapcPacketDeviceToNtopDevice(%d) = %d", cpacketDeviceId, i); #endif return(i); } else { #ifdef DEBUG_FLOWS traceEvent(CONST_TRACE_INFO, "CPACKET: mapcPacketDeviceToNtopDevice (id=%d) <=> (cpacketDeviceId=%d)", i, myGlobals.device[i].cpacketGlobals->cpacketDeviceId); #endif } } else { #ifdef DEBUG_FLOWS traceEvent(CONST_TRACE_INFO, "CPACKET: cpacketGlobals(%d) = NULL\n", i); #endif } #ifdef DEBUG_FLOWS traceEvent(CONST_TRACE_INFO, "CPACKET: mapcPacketDeviceToNtopDevice(%d) failed\n", cpacketDeviceId); #endif return(-1); /* Not found */ } /* #undef DEBUG_FLOWS */ /* ****************************** */ static void flushDevicePrefs(int deviceId) { if(deviceId >= myGlobals.numDevices) return; delPrefsValue(cpValue(deviceId, "cpacketInPort", 1)); delPrefsValue(cpValue(deviceId, "debug", 1)); delPrefsValue(cpValue(deviceId, "humanFriendlyName", 1)); } /* ****************************** */ static void handlecPacketHTTPrequest(char* _url) { char workList[1024], *url; int deviceId = -1, originalId = -1; sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); /* **************************** * Process URL stuff * ****************************** */ if((_url != NULL) && pluginActive) { char *strtokState; url = strtok_r(_url, "&", &strtokState); while(url != NULL) { char *device, *_value = NULL; device = strtok(url, "="); if(device != NULL) _value = strtok(NULL, "="); else _value = NULL; if(_value == NULL) _value = ""; if(_value && device) { char value[256]; unescape(value, sizeof(value), _value); if(strcmp(device, "device") == 0) { originalId = deviceId = atoi(value); if((deviceId > 0) && ((deviceId = mapcPacketDeviceToNtopDevice(deviceId)) == -1)) { printHTMLheader("cPacket Configuration Error", NULL, 0); printFlagedWarning("Unable to locate the specified device. Please activate the plugin first."); return; } } else if(strcmp(device, "port") == 0) { if(myGlobals.device[deviceId].cpacketGlobals->cpacketInPort != atoi(value)) { if(deviceId > 0) { myGlobals.device[deviceId].cpacketGlobals->cpacketInPort = atoi(value); storePrefsValue(cpValue(deviceId, "cpacketInPort", 1), value); setcPacketInSocket(deviceId); } } } else if(strcmp(device, "name") == 0) { char old_name[256], new_name[256]; int rc; sanitize_rrd_string(value); safe_snprintf(__FILE__, __LINE__, old_name, sizeof(old_name), "%s/interfaces/%s", myGlobals.rrdPath, myGlobals.device[deviceId].uniqueIfName); revertSlashIfWIN32(old_name, 0); free(myGlobals.device[deviceId].humanFriendlyName); myGlobals.device[deviceId].humanFriendlyName = strdup(value); storePrefsValue(cpValue(deviceId, "humanFriendlyName", 1), value); calculateUniqueInterfaceName(deviceId); safe_snprintf(__FILE__, __LINE__, new_name, sizeof(new_name), "%s/interfaces/%s", myGlobals.rrdPath, myGlobals.device[deviceId].uniqueIfName); revertSlashIfWIN32(new_name, 0); rc = rename(old_name, new_name); } else if(strcmp(device, "debug") == 0) { if(deviceId > 0) { myGlobals.device[deviceId].cpacketGlobals->cpacketDebug = atoi(value); storePrefsValue(cpValue(deviceId, "debug", 1), value); } } url = strtok_r(NULL, "&", &strtokState); } } if(strncasecmp(_url, CONST_CPACKET_STATISTICS_HTML, strlen(CONST_CPACKET_STATISTICS_HTML)) == 0) { printcPacketStatistics(); printHTMLtrailer(); return; } #ifdef DEBUG_FLOWS traceEvent(CONST_TRACE_INFO, "CPACKET: deviceId=%d", deviceId); #endif if(deviceId == -1) { printHTMLheader("cPacket Device Configuration", NULL, 0); printcPacketDeviceConfiguration(); return; } else if(deviceId < 0) { /* Delete an existing device */ char value[128]; int readDeviceId; deviceId = -deviceId; if((deviceId < 0) || ((readDeviceId = mapcPacketDeviceToNtopDevice(deviceId)) == -1)) { printHTMLheader("cPacket Configuration Error", NULL, 0); printFlagedWarning("Unable to locate the specified device. Please activate the plugin first."); return; } traceEvent(CONST_TRACE_INFO, "CPACKET: Attempting to delete [deviceId=%d][cPacket device=%d]", deviceId, readDeviceId); if(fetchPrefsValue(cpValue(deviceId, "knownDevices", 0), value, sizeof(value)) != -1) { char *dev, value1[128]; value1[0] = '\0'; dev = strtok_r(value, ",", &strtokState); while(dev != NULL) { int _dev = atoi(dev); if(_dev != deviceId) { if(value1[0] != '\0') strcat(value1, ","); strcat(value1, dev); } dev = strtok_r(NULL, ",", &strtokState); } storePrefsValue(cpValue(deviceId, "knownDevices", 0), value1); } myGlobals.device[readDeviceId].activeDevice = 0; // Terminate thread flushDevicePrefs(readDeviceId); traceEvent(CONST_TRACE_INFO, "CPACKET: Device [deviceId=%d][active=%d]", readDeviceId, myGlobals.device[readDeviceId].activeDevice); // termcPacketDevice(readDeviceId); checkReportDevice(); printHTMLheader("cPacket Device Configuration", NULL, 0); printcPacketDeviceConfiguration(); return; } else if(deviceId == 0) { /* Add new device */ char value[128]; if((fetchPrefsValue(cpValue(deviceId, "knownDevices", 0), value, sizeof(value)) != -1) && (strlen(value) > 0)) { char *dev, value1[128], buf[256]; traceEvent(CONST_TRACE_INFO, "CPACKET: knownDevices=%s", value); value1[0] = '\0'; dev = strtok_r(value, ",", &strtokState); while(dev != NULL) { int _dev; if(strlen(dev) > 0) { _dev = atoi(dev); strcat(value1, ","); strcat(value1, dev); if(_dev >= deviceId) deviceId = _dev+1; } dev = strtok_r(NULL, ",", &strtokState); } if(deviceId == 0) deviceId = 2; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s,%d", value1, deviceId); traceEvent(CONST_TRACE_INFO, "CPACKET: knownDevices=%s", buf); storePrefsValue(cpValue(deviceId, "knownDevices", 0), buf); } else { deviceId = 2; /* 1 is reserved */ traceEvent(CONST_TRACE_INFO, "CPACKET: knownDevices=2"); storePrefsValue(cpValue(deviceId, "knownDevices", 0), "2"); } if((deviceId = createcPacketDevice(deviceId)) <= 0) { printHTMLheader("cPacket Configuration Error", NULL, 0); printFlagedWarning("Unable to create a new cPacket device"); return; } } else { /* Existing device */ } if(deviceId > 0) { /* **************************** * Print Configuration stuff * ****************************** */ printHTMLheader("cPacket Configuration", NULL, 0); printcPacketConfiguration(deviceId); sendString("

\n"); if(myGlobals.device[deviceId].cpacketGlobals->numPktsRcvd > 0) { printcPacketCounterStats(deviceId, 0, 1); } } } safe_snprintf(__FILE__, __LINE__, workList, sizeof(workList), "%s?device=%d", cpacketPluginInfo->pluginURLname, originalId); printPluginTrailer((myGlobals.device[deviceId].cpacketGlobals->numPktsRcvd > 0) ? workList : NULL, "cTap is a trademark of cPacket Inc"); printHTMLtrailer(); } /* ****************************** */ static void termcPacketDevice(int deviceId) { traceEvent(CONST_TRACE_INFO, "CPACKET: terminating device %s", myGlobals.device[deviceId].humanFriendlyName); if(!pluginActive) return; if(myGlobals.device[deviceId].activeDevice == 0) { /* traceEvent(CONST_TRACE_WARNING, "CPACKET: deviceId=%d terminated already", deviceId); */ return; } if(myGlobals.device[deviceId].cpacketGlobals == NULL) { traceEvent(CONST_TRACE_WARNING, "CPACKET: deviceId=%d terminating a non-cPacket device", deviceId); return; } if((deviceId >= 0) && (deviceId < myGlobals.numDevices)) { if(myGlobals.device[deviceId].cpacketGlobals->threadActive) { killThread(&myGlobals.device[deviceId].cpacketGlobals->cpacketThread); myGlobals.device[deviceId].cpacketGlobals->threadActive = 0; } if(myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket > 0) { closeNwSocket(&myGlobals.device[deviceId].cpacketGlobals->cpacketInSocket); } free(myGlobals.device[deviceId].cpacketGlobals); myGlobals.device[deviceId].activeDevice = 0; } else traceEvent(CONST_TRACE_WARNING, "CPACKET: requested invalid termination of deviceId=%d", deviceId); } /* **************************************** */ static void termcPacketFunct(u_char termNtop /* 0=term plugin, 1=term ntop */) { char value[128]; traceEvent(CONST_TRACE_ALWAYSDISPLAY, "CPACKET: Terminating cPacket"); if((fetchPrefsValue(cpValue(0, "knownDevices", 0), value, sizeof(value)) != -1) && (strlen(value) > 0)) { char *strtokState, *dev; dev = strtok_r(value, ",", &strtokState); while(dev != NULL) { int deviceId, theDeviceId = atoi(dev); if((theDeviceId > 0) && ((deviceId = mapcPacketDeviceToNtopDevice(theDeviceId)) > 0)) { termcPacketDevice(deviceId); } else { traceEvent(CONST_TRACE_INFO, "CPACKET: [cpacketDeviceId=%d] device thread terminated in the meantime", theDeviceId); } dev = strtok_r(NULL, ",", &strtokState); } } else traceEvent(CONST_TRACE_INFO, "CPACKET: no devices to terminate (%s)", value); traceEvent(CONST_TRACE_INFO, "CPACKET: Thanks for using ntop cPacket"); traceEvent(CONST_TRACE_ALWAYSDISPLAY, "CPACKET: Done"); fflush(stdout); pluginActive = 0; } /* **************************************** */ #ifdef DEBUG_FLOWS static void handlecPacketPacket(u_char *_deviceId, const struct pcap_pkthdr *h, const u_char *p) { int sampledPacketSize; int deviceId, rc; if(myGlobals.runningPref.rFileName != NULL) { /* ntop is reading packets from a file */ struct ether_header ehdr; u_int caplen = h->caplen; u_int length = h->len; unsigned short eth_type; u_int8_t flags = 0, debug = 0; struct ip ip; deviceId = 1; /* Dummy value */ #ifdef DEBUG_FLOWS { static long numPkt=0; ++numPkt; if(debug) traceEvent(CONST_TRACE_INFO, "Rcvd packet to dissect [caplen=%d][len=%d][num_pkt=%d]", caplen, length, numPkt); } #endif if(caplen >= sizeof(struct ether_header)) { memcpy(&ehdr, p, sizeof(struct ether_header)); eth_type = ntohs(ehdr.ether_type); if(eth_type == ETHERTYPE_IP) { u_int plen, hlen; u_short sport, dport; #ifdef DEBUG_FLOWS if(debug) traceEvent(CONST_TRACE_INFO, "Rcvd IP packet to dissect"); #endif memcpy(&ip, p+sizeof(struct ether_header), sizeof(struct ip)); hlen =(u_int)ip.ip_hl * 4; NTOHL(ip.ip_dst.s_addr); NTOHL(ip.ip_src.s_addr); plen = length-sizeof(struct ether_header); #ifdef DEBUG_FLOWS if(debug) traceEvent(CONST_TRACE_INFO, "Rcvd IP packet to dissect " "[deviceId=%d][sender=%s][proto=%d][len=%d][hlen=%d]", deviceId, intoa(ip.ip_src), ip.ip_p, plen, hlen); #endif if(ip.ip_p == IPPROTO_UDP) { if(plen >(hlen+sizeof(struct udphdr))) { char* rawSample =(void*)(p+sizeof(struct ether_header)+hlen+sizeof(struct udphdr)); int rawSampleLen = h->caplen-(sizeof(struct ether_header)+hlen+sizeof(struct udphdr)); #ifdef DEBUG_FLOWS if(debug) traceEvent(CONST_TRACE_INFO, "Rcvd from from %s [cpacketGlobals=%x]", intoa(ip.ip_src), myGlobals.device[deviceId].cpacketGlobals); #endif myGlobals.device[deviceId].cpacketGlobals->numPktsRcvd++; dissectFlow(ip.ip_src.s_addr, rawSample, rawSampleLen, deviceId); } } } else { #ifdef DEBUG_FLOWS if(debug) traceEvent(CONST_TRACE_INFO, "Rcvd non-IP [0x%04X] packet to dissect", eth_type); #endif } } } } #endif /* ***************************************** */ /* Plugin entry fctn */ #ifdef MAKE_STATIC_PLUGIN PluginInfo* cpacketPluginEntryFctn(void) #else PluginInfo* PluginEntryFctn(void) #endif { traceEvent(CONST_TRACE_ALWAYSDISPLAY, "CPACKET: Welcome to %s.(C) 2008 by Luca Deri", cpacketPluginInfo->pluginName); return(cpacketPluginInfo); } /* This must be here so it can access the struct PluginInfo, above */ static void setPluginStatus(char * status) { if(cpacketPluginInfo->pluginStatusMessage != NULL) free(cpacketPluginInfo->pluginStatusMessage); if(status == NULL) { cpacketPluginInfo->pluginStatusMessage = NULL; } else { cpacketPluginInfo->pluginStatusMessage = strdup(status); } } ntop-5.0.1+dfsg1/misc/lua.c0000644000000000000000000002257711240225316014064 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * http://www.ntop.org * * Copyright (C) 2008-09 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-report.h" #ifdef HAVE_LUA static HostTraffic *ntop_host = NULL; static char query_string[2048]; /* *********************************************************** */ static int ntop_lua_check(lua_State* vm, char* func, int pos, int expected_type) { if(lua_type(vm, pos) != expected_type) { traceEvent(CONST_TRACE_ERROR, "%s : expected %s, got %s", func, lua_typename(vm, expected_type), lua_typename(vm, lua_type(vm,pos))); return(-1); } return(0); } /* *********************************************************** */ static int ntop_lua_sendString(lua_State* vm) { char *str; if(ntop_lua_check(vm, "ntop_lua_sendString", 1, LUA_TSTRING)) return(0); str = (char*)(char*)lua_tostring(vm,1); #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "ntop_lua_sendString(%s)", str); #endif if(str && (strlen(str) > 0)) sendString(str); return(1); } /* *********************************************************** */ /* int mime_type, char *title */ static int ntop_lua_send_http_header(lua_State* vm) { int mime_type; char *title; if(ntop_lua_check(vm, "ntop_lua_send_http_header", 1, LUA_TNUMBER)) return(0); mime_type = (int)lua_tonumber(vm, 1); if(ntop_lua_check(vm, "ntop_lua_send_http_header", 2, LUA_TSTRING)) return(0); title = (char*)lua_tostring(vm, 2); sendHTTPHeader(mime_type /* FLAG_HTTP_TYPE_HTML */, 0, 0); if(title && (strlen(title) > 0)) printHTMLheader(title, NULL, 0); return(1); } /* *********************************************************** */ static int ntop_lua_send_html_footer(lua_State* vm) { printHTMLtrailer(); return(1); } /* *********************************************************** */ /* char* fileName */ static int ntop_lua_sendFile(lua_State* vm) { char *fileName; if(ntop_lua_check(vm, "ntop_lua_sendFile", 1, LUA_TSTRING)) return(0); fileName = (char*)(char*)lua_tostring(vm,1); sendFile(fileName, 1); return(1); } /* *********************************************************** */ static int ntop_lua_getFirstHost(lua_State* vm) { int actualDeviceId; if(ntop_lua_check(vm, "ntop_lua_getFirstHost", 1, LUA_TNUMBER)) return(0); actualDeviceId = (int)lua_tonumber(vm, 1); ntop_host = getFirstHost(actualDeviceId); #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "[lua] getFirstHost(%d)=%p", actualDeviceId, ntop_host); #endif return(1); } /* *********************************************************** */ static int ntop_lua_getNextHost(lua_State* vm) { int actualDeviceId; if(ntop_lua_check(vm, "ntop_lua_getNextHost", 1, LUA_TNUMBER)) return(0); actualDeviceId = (int)lua_tonumber(vm, 1); if(ntop_host == NULL) { ntop_host = getFirstHost(actualDeviceId); } else { ntop_host = getNextHost(actualDeviceId, ntop_host); } #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "[lua] getNextHost()=%p", ntop_host); #endif return(ntop_host ? 1 : -1); } /* *********************************************************** */ static int ntop_lua_getQueryString(lua_State* vm) { lua_pushfstring(vm, "%s", query_string); return(1); } /* *********************************************************** */ static int ntop_lua_host_ethAddress(lua_State* vm) { if(lua_type(vm, 1) != LUA_TNONE) /* A value has been passed */ { /* SET */ char *str; if(ntop_lua_check(vm, "ntop_lua_host_ethAddress", 1, LUA_TSTRING)) return(0); str = (char*)(char*)lua_tostring(vm,1); #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "ntop_lua_ethAddress(%s)", str ? str : "NULL"); #endif snprintf(ntop_host->ethAddressString, sizeof(ntop_host->ethAddressString), "%s", str); } else { /* GET */ lua_pushfstring(vm, "%s", (ntop_host != NULL) ? ntop_host->ethAddressString : ""); } return(1); } static int ntop_lua_host_ipAddress(lua_State* vm) { if(lua_type(vm, 1) != LUA_TNONE) /* A value has been passed */ { /* SET */ char *str; if(ntop_lua_check(vm, "ntop_lua_host_ipAddress", 1, LUA_TSTRING)) return(0); str = (char*)(char*)lua_tostring(vm,1); #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "ntop_lua_host_ipAddress(%s)", str ? str : "NULL"); #endif snprintf(ntop_host->hostNumIpAddress, sizeof(ntop_host->hostNumIpAddress), "%s", str); } else { /* GET */ lua_pushfstring(vm, "%s", (ntop_host != NULL) ? ntop_host->hostNumIpAddress : ""); } return(1); } static int ntop_lua_host_hostResolvedName(lua_State* vm) { lua_pushfstring(vm, "%s", (ntop_host != NULL) ? ntop_host->hostResolvedName : ""); return(1); } static int ntop_lua_host_vlanId(lua_State* vm) { lua_Integer i = (ntop_host != NULL) ? ntop_host->vlanId : -1; lua_pushinteger(vm, i); return(1); } static int ntop_lua_host_hostAS(lua_State* vm) { lua_Integer i = (ntop_host != NULL) ? ntop_host->hostAS : -1; lua_pushinteger(vm, i); return(1); } static int ntop_lua_host_pktSent(lua_State* vm) { lua_Integer i = (ntop_host != NULL) ? ntop_host->pktSent.value : -1; lua_pushinteger(vm, i); return(1); } static int ntop_lua_host_pktRcvd(lua_State* vm) { lua_Integer i = (ntop_host != NULL) ? ntop_host->pktRcvd.value : -1; lua_pushinteger(vm, i); return(1); } static int ntop_lua_host_bytesSent(lua_State* vm) { lua_Integer i = (ntop_host != NULL) ? ntop_host->bytesSent.value : -1; lua_pushinteger(vm, i); return(1); } static int ntop_lua_host_bytesRcvd(lua_State* vm) { lua_Integer i = (ntop_host != NULL) ? ntop_host->bytesRcvd.value : -1; lua_pushinteger(vm, i); return(1); } /* *********************************************************** */ /* ntop object methods */ static luaL_reg ntop_reg[] = { { "sendString", ntop_lua_sendString }, { "send_http_header", ntop_lua_send_http_header }, { "send_html_footer", ntop_lua_send_html_footer }, { "sendFile", ntop_lua_sendFile }, { "getFirstHost", ntop_lua_getFirstHost }, { "getNextHost", ntop_lua_getNextHost }, { "getQueryString", ntop_lua_getQueryString }, {NULL, NULL} }; /* ntop host object methods */ static luaL_reg ntop_host_reg[] = { { "ethAddress", ntop_lua_host_ethAddress }, { "ipAddress", ntop_lua_host_ipAddress }, { "hostResolvedName", ntop_lua_host_hostResolvedName }, { "vlanId", ntop_lua_host_vlanId }, { "hostAS", ntop_lua_host_hostAS }, { "pktSent", ntop_lua_host_pktSent }, { "pktRcvd", ntop_lua_host_pktRcvd }, { "bytesSent", ntop_lua_host_bytesSent }, { "bytesRcvd", ntop_lua_host_bytesRcvd }, {NULL, NULL} }; static void register_host_class( lua_State *L, char *class_name, luaL_reg *class_methods) { luaL_newmetatable( L, class_name ); lua_pushstring( L, "__index" ); lua_pushvalue( L, -2 ); // pushes the metatable lua_settable( L, -3 ); // metatable.__index = metatable luaL_register( L, class_name, class_methods ); } static int ntop_register(lua_State *L) { luaL_register(L, "ntop", ntop_reg); register_host_class(L, "host", ntop_host_reg); return 0; } /* *********************************************************** */ /* http://localhost:3000/lua/test.lua */ int handleLuaHTTPRequest(char *url) { int idx, found = 0; char lua_path[256]; struct stat statbuf; lua_State* L; char *question_mark = strchr(url, '?'); traceEvent(CONST_TRACE_INFO, "Calling lua... [%s]", url); if(question_mark) question_mark[0] = '\0'; safe_snprintf(__FILE__, __LINE__, query_string, sizeof(query_string)-1, "%s", question_mark ? &question_mark[1] : ""); for(idx=0; (!found) && (myGlobals.dataFileDirs[idx] != NULL); idx++) { safe_snprintf(__FILE__, __LINE__, lua_path, sizeof(lua_path), "%s/lua/%s", myGlobals.dataFileDirs[idx], url); revertSlashIfWIN32(lua_path, 0); if(!stat(lua_path, &statbuf)) { /* Found */ /* traceEvent(CONST_TRACE_INFO, "[lua] [%d] Found %s", idx, lua_path); */ found = 1; break; } else { /* traceEvent(CONST_TRACE_INFO, "[lua] [%d] Not found %s", idx, lua_path); */ } } if(!found) { returnHTTPpageNotFound(NULL); return(1); } /* *********************** */ L = lua_open(); luaL_openlibs(L); /* Load ntop extensions */ ntop_register(L); if(luaL_dofile(L, lua_path) == 1) { traceEvent(CONST_TRACE_ERROR, "[lua] Error while executing file %s: %s", lua_path, lua_tostring(L, -1)); sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHTMLheader("Lua Runtime Error", NULL, BITFLAG_HTML_NO_REFRESH); printFlagedWarning((char*)lua_tostring(L, -1)); } lua_close(L); return(1); } #endif /* HAVE_LUA */ ntop-5.0.1+dfsg1/packages/0000755000000000000000000000000012012127277013752 5ustar rootrootntop-5.0.1+dfsg1/packages/Win32/0000755000000000000000000000000012214067405014654 5ustar rootrootntop-5.0.1+dfsg1/packages/Win32/README0000644000000000000000000000057107727402453015550 0ustar rootrootThis directory contains a project for building ntop for Win32. In order to use it you need: 1. the ntop source (you've got obviously) 2. gdbm/gd/libpng/zlib sources that you can find on the Internet You will probably need to change the file paths according to your setup. NOTE: this project file is totally unsupported. -------------------------- Luca Deri - September 2003 ntop-5.0.1+dfsg1/packages/Gentoo/0000755000000000000000000000000012012127277015205 5ustar rootrootntop-5.0.1+dfsg1/packages/Gentoo/ntop-3.0_pre1.ebuild0000644000000000000000000000266610014522645020610 0ustar rootroot# Copyright 1999-2003 Gentoo Technologies, Inc. # Distributed under the terms of the GNU General Public License v2 # $Header$ IUSE="ssl tcpd" S=${WORKDIR}/ntop-3.0pre1 DESCRIPTION="ntop is a unix tool that shows network usage like top" SRC_URI="mirror://sourceforge/ntop/ntop-3.0pre1.tgz" HOMEPAGE="http://www.ntop.org/ntop.html" SLOT="0" LICENSE="GPL-2" KEYWORDS="x86 ~ppc ~sparc hppa" DEPEND=">=sys-libs/gdbm-1.8.0 >=net-libs/libpcap-0.6.2 tcpd? ( >=sys-apps/tcp-wrappers-7.6-r4 ) ssl? ( >=dev-libs/openssl-0.9.6 ) media-libs/libgd media-libs/libpng" DEPEND=">=sys-libs/gdbm-1.8.0 >=net-libs/libpcap-0.6.2 media-libs/libgd media-libs/libpng" src_compile() { cd ${S} local myconf use tcpd || myconf="${myconf} --with-tcpwrap" use ssl || myconf="${myconf} --without-ssl" # ntop 3.0 ships with its own version of rrd, myrrd. # ntop should be built with the version it shipped with just in case econf ${myconf} || die "configure problem" make || die "compile problem" } src_install () { make DESTDIR=${D} install || die "install problem" doman ntop.8 dodoc AUTHORS ChangeLog CONTENTS COPYING INSTALL MANIFESTO dodoc NEWS PORTING README SUPPORT_NTOP.txt THANKS dodoc docs/* dohtml ntop.html faq.html exeinto /etc/init.d ; newexe ${FILESDIR}/ntop-init ntop insinto /etc/conf.d ; newins ${FILESDIR}/ntop-confd ntop dodir /var/lib/ntop fowners nobody:nobody /var/lib/ntop keepdir /var/lib/ntop } ntop-5.0.1+dfsg1/packages/Gentoo/digest-ntop-3.0_pre20000644000000000000000000000007610023121564020607 0ustar rootrootMD5 2c5d815963afb1e32510818f96d20028 ntop-3.0pre2.tgz 3021398 ntop-5.0.1+dfsg1/packages/Gentoo/ntop-3.0_pre2.ebuild0000644000000000000000000000311710023121564020574 0ustar rootroot# Copyright 1999-2003 Gentoo Technologies, Inc. # Distributed under the terms of the GNU General Public License v2 # $Header$ IUSE="ssl tcpd" S=${WORKDIR}/ntop-3.0pre2 DESCRIPTION="ntop is a unix tool that shows network usage like top" SRC_URI="mirror://sourceforge/ntop/ntop-3.0pre2.tgz" HOMEPAGE="http://www.ntop.org/ntop.html" SLOT="0" LICENSE="GPL-2" KEYWORDS="x86 ~ppc ~sparc hppa" DEPEND=">=sys-libs/gdbm-1.8.0 >=net-libs/libpcap-0.6.2 tcpd? ( >=sys-apps/tcp-wrappers-7.6-r4 ) ssl? ( >=dev-libs/openssl-0.9.6 ) media-libs/libgd media-libs/libpng" DEPEND=">=sys-libs/gdbm-1.8.0 >=net-libs/libpcap-0.6.2 media-libs/libgd media-libs/libpng" src_compile() { cd ${S} mv configure.in configure.zzz cat configure.zzz | \ sed -e 's/NTOP_VERSION_EXTRA=""/NTOP_VERSION_EXTRA="Gentoo ebuild"/' > configure.in local myconf use tcpd || myconf="${myconf} --with-tcpwrap" use ssl || myconf="${myconf} --without-ssl" # ntop 3.0 ships with its own version of rrd, myrrd. # ntop must be built with the static version it ships with econf ${myconf} || die "configure problem" make || die "compile problem" } src_install () { make DESTDIR=${D} install || die "install problem" doman ntop.8 dodoc AUTHORS ChangeLog CONTENTS COPYING INSTALL MANIFESTO dodoc NEWS PORTING README SUPPORT_NTOP.txt THANKS dodoc docs/* dohtml ntop.html faq.html exeinto /etc/init.d ; newexe ${FILESDIR}/ntop-init ntop insinto /etc/conf.d ; newins ${FILESDIR}/ntop-confd ntop dodir /var/lib/ntop fowners nobody:nobody /var/lib/ntop keepdir /var/lib/ntop } ntop-5.0.1+dfsg1/packages/Gentoo/digest-ntop-3.0_pre10000644000000000000000000000007610023121564020606 0ustar rootrootMD5 44b6cfe15876f240eb780ed6810a6f80 ntop-3.0pre1.tgz 2962923 ntop-5.0.1+dfsg1/packages/debian/0000755000000000000000000000000012012127277015174 5ustar rootrootntop-5.0.1+dfsg1/packages/debian/README.target0000644000000000000000000000003010622151771017333 0ustar rootrootWelcome to nBox, ..... ntop-5.0.1+dfsg1/packages/debian/prerm0000644000000000000000000000046710645100771016253 0ustar rootroot#!/bin/sh # Only shut the daemon down if we're really removing the package. If this is # an upgrade, we will instead do a restart in the postinst... this keeps nprobe # from being left shut down for a long time, which could pose problems. case "$1" in upgrade) ;; *) /etc/init.d/ntop stop ;; esac exit 0 ntop-5.0.1+dfsg1/packages/debian/docs0000644000000000000000000000000710622151771016045 0ustar rootrootREADME ntop-5.0.1+dfsg1/packages/debian/README.Debian0000644000000000000000000000012610622151771017235 0ustar rootrootnBox for Debian ----------------- nBox 1.0 -- Luca Deri June 2003 ntop-5.0.1+dfsg1/packages/debian/preinst0000644000000000000000000000111110622151771016576 0ustar rootroot#! /bin/sh # preinst script for nbox # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `install' # * `install' # * `upgrade' # * `abort-upgrade' case "$1" in install|upgrade) ;; abort-upgrade) ;; *) echo "preinst called with unknown argument \`$1'" >&2 exit 0 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. exit 0 ntop-5.0.1+dfsg1/packages/debian/README0000644000000000000000000000105010622151771016051 0ustar rootrootThis directory contains the files needed to build the package named 'ntop' for the Debian GNU/Linux distribution. To build this package, you'll need this `debian' directory, and `ntop-VERSION.tar.gz'. Put it in a directory called `ntop-VERSION', and make sure that the `debian/rules' and `debian/changelog' refer correctly to VERSION. Then, you can run dpkg-buildpackage, which will automatically unpack the tarballs, and start the build. It is suggested that you also read the `README' and `INSTALL' files in the top-level of the ntop source tree. ntop-5.0.1+dfsg1/packages/debian/postinst0000644000000000000000000000064010646723577017022 0ustar rootroot#!/bin/sh -e case "$1" in configure) # continue below ;; abort-upgrade|abort-remove|abort-deconfigure) exit 0 ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 0 ;; esac umask 022 # Update shared libs /sbin/ldconfig update-rc.d ntop defaults 93 >/dev/null # Stop ntop (if any) /etc/init.d/ntop stop # Set the administrator password /etc/init.d/ntop start exit 0 ntop-5.0.1+dfsg1/packages/debian/COPYRIGHT0000644000000000000000000004311010622151771016467 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ntop-5.0.1+dfsg1/packages/debian/control0000644000000000000000000000105510667355334016613 0ustar rootrootSource: ntop Section: free Priority: optional Maintainer: Luca Deri Standards-Version: 1.0.0 Build-Depends: Build-Conflicts: Package: ntop Architecture: i386 Depends: debconf (>= 0.2.26), librrd2, libpcap0.8, libgdbm3, libpcre3, nbox-utils Description: display network usage in top-like format ntop is a Network Top program. It displays a summary of network usage by machines on your network in a format reminiscent of the unix top utility. . It can also be run in web mode, which allows the display to be browsed with a web browser. ntop-5.0.1+dfsg1/packages/debian/rules0000755000000000000000000000217010667355334016267 0ustar rootroot#!/usr/bin/make -f # -*- makefile -*- # debian/rules file for ntop # # GNU copyright 1997 to 1999 by Joey Hess. # # Made with the aid of dh_make by Rocco Carbone # Uncomment this to turn on verbose mode. export DH_VERBOSE=1 # This is the debhelper compatability version to use. export DH_COMPAT=1 package=ntop build: build-stamp build-stamp: dh_testdir clean: dh_testdir dh_testroot # dh_clean install: build dh_testdir dh_testroot # dh_clean -k dh_installdirs # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot # dh_clean -k dh_installdirs dh_installinit dh_installman dh_installdebconf -n mkdir -p ./debian/usr/local/var/ntop/rrd cp -r ./debian/usr/ ./debian/tmp cp -r ./debian/etc/ ./debian/tmp cp -r ./debian/usr/ ./debian/tmp -find ./debian/tmp -name ".svn" -type d -exec /bin/rm -rf {} ';' -find ./debian/tmp -name "*.a" -exec /bin/rm -rf {} ';' dh_link dh_strip dh_compress dh_fixperms dh_makeshlibs dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-arch .PHONY: build clean binary-arch binary install configure ntop-5.0.1+dfsg1/packages/debian/conffiles0000644000000000000000000000000010622151771017056 0ustar rootrootntop-5.0.1+dfsg1/packages/debian/postrm0000644000000000000000000000016310634007166016445 0ustar rootroot#!/bin/sh -e set -e if [ "$1" = "purge" ] ; then update-rc.d ntop remove >/dev/null fi /sbin/ldconfig exit 0 ntop-5.0.1+dfsg1/packages/debian/etc/0000755000000000000000000000000012012127277015747 5ustar rootrootntop-5.0.1+dfsg1/packages/debian/etc/init.d/0000755000000000000000000000000012012127277017134 5ustar rootrootntop-5.0.1+dfsg1/packages/debian/etc/init.d/ntop0000755000000000000000000000650611045141077020050 0ustar rootroot#! /bin/sh # # (C) 2003-07 - Luca Deri # (C) 2007-08 - Massimo Torquati # . /usr/local/sbin/stop_app.sh APPNAME=ntop PERSISTENT_DIR=/usr/local/share/ntop SPOOL_DIR=$PERSISTENT_DIR/spool NTOP_PATH=/usr/local/bin/ntop NTOP_CONF=/etc/ntop/ntop.conf NTOP_PIDFILE=/var/run/ntop.pid # Enable watchdogging USERUNSV=1 RUNSV="/usr/local/bin/runsv" RUNSV_PIDFILE="/var/run/runsv.ntop" TIMETOWAIT=2 THRESHOLD=30 RUNSV_OPT="-p $RUNSV_PIDFILE -s $TIMETOWAIT -S $THRESHOLD -L -- " #################### start_ntop() { if test -f /etc/ntop/ntop.start; then if [ $USERUNSV -eq 1 ]; then ${RUNSV} ${RUNSV_OPT} $NTOP_PATH @$NTOP_CONF > /dev/null & else start-stop-daemon --start --quiet --name $APPNAME --background --exec $NTOP_PATH @$NTOP_CONF > /dev/null fi fi return 0 } #################### wait_for_deaddaemon () { WAITFORDAEMON=15 pid=$1 sleep 1 if test -n "$pid" then if kill -0 $pid 2>/dev/null then echo -n "." cnt=0 while kill -0 $pid 2>/dev/null do cnt=`expr $cnt + 1` if [ $cnt -gt $WAITFORDAEMON ] then echo " FAILED." return 1 fi sleep 1 echo -n "." done fi fi rm -f $NTOP_PIDFILE return 0 } #################### stop_ntop() { if [ $USERUNSV -eq 1 ]; then pid=`cat $NTOP_PIDFILE 2>/dev/null` stop_app -a ntop -r if [ -n $pid ]; then wait_for_deaddaemon $pid fi else if [ -f $NTOP_PIDFILE ]; then pid=`cat $NTOP_PIDFILE 2>/dev/null` if [ -n $pid ]; then kill $pid wait_for_deaddaemon $pid fi fi fi } #################### default_ntop() { if [ ! -d $PERSISTENT_DIR ] && [ ! -h $PERSISTENT_DIR ]; then mkdir -p $PERSISTENT_DIR/rrd chown -R nobody $PERSISTENT_DIR chmod gou+w $PERSISTENT_DIR fi if [ ! -f $PERSISTENT_DIR/ntop_pw.db ]; then $NTOP_PATH -u nobody -P $PERSISTENT_DIR -Q $SPOOL_DIR --set-admin-password=admin fi if [ ! -d /etc/ntop ]; then mkdir /etc/ntop touch /etc/ntop/ntop.start echo "-P $PERSISTENT_DIR" > $NTOP_CONF echo "-Q $SPOOL_DIR" >> $NTOP_CONF echo "-u nobody" >> $NTOP_CONF fi if [ ! -d $SPOOL_DIR ]; then mkdir -p $SPOOL_DIR chmod gou+w $SPOOL_DIR chown -R nobody $SPOOL_DIR fi } ######## case "$1" in start) echo -n "Starting ntop " default_ntop; start_ntop; echo " Done." ;; stop) echo -n "Stopping ntop " stop_ntop; echo " Done." ;; default) echo -n "Defaulting ntop " default_ntop; echo " Done." ;; restart) echo -n "Restarting ntop " stop_ntop; start_ntop; echo " Done." ;; launch) if [ -z "$2" ]; then echo "Usage: /etc/init.d/ntop launch " exit 1 fi echo -n "Launching ntop " start-stop-daemon --start --quiet --background --exec $NTOP_PATH -- $2 > /dev/null sleep 3 echo " Done." ;; kill) if [ -z "$2" ]; then echo "Usage: /etc/init.d/ntop kill pid" exit 1 fi pid=$2 echo -n "Stopping ntop with pid=$pid " rc=`ps xa | awk '{print $1}' | grep $pid | wc -l` if [ $rc -gt 0 ]; then kill -9 $pid > /dev/null wait_for_deaddaemon $pid echo " Done." exit 0 else echo echo "No process with pid=$pid found!!" exit 2 fi ;; *) echo "Usage: /etc/init.d/ntop {start|stop|restart|default|launch|kill}" exit 1 esac exit 0 ntop-5.0.1+dfsg1/packages/debian/etc/ld.so.conf.d/0000755000000000000000000000000012012127277020134 5ustar rootrootntop-5.0.1+dfsg1/packages/debian/etc/ld.so.conf.d/ntop.conf0000644000000000000000000000001710634007166021763 0ustar rootroot/usr/local/lib ntop-5.0.1+dfsg1/packages/debian/files0000644000000000000000000000004210740213134016207 0ustar rootrootntop_3.3.5_i386.deb free optional ntop-5.0.1+dfsg1/packages/debian/dirs0000644000000000000000000000121710622151771016062 0ustar rootrootusr/share usr/share/doc usr/share/doc/ntop usr/local usr/local/var usr/local/var/ntop usr/local/share usr/local/share/ntop usr/local/var/ntop/rrd usr/local/share/ntop/html usr/local/share/ntop/html/statsicons usr/local/share/ntop/html/statsicons/os usr/local/share/ntop/html/statsicons/flags usr/local/share/ntop/html/img_inquisitor usr/local/share/ntop/html/MochiKit usr/local/share/ntop/html/jscalendar usr/local/share/ntop/html/jscalendar/lang usr/local/share/ntop/html/PlotKit usr/local/share/man usr/local/share/man/man8 usr/local/etc usr/local/etc/ntop usr/local/bin usr/local/lib usr/local/lib/ntop usr/local/lib/ntop/plugins usr/local/lib/plugins ntop-5.0.1+dfsg1/packages/debian/changelog0000644000000000000000000000074710740213134017050 0ustar rootrootntop (3.3.5) unstable; urgency=high * ntop 3.3.5 -- Massimo Torquati Sun, 06 Jan 2008 18:02:04 +0100 ntop (3.3.4) unstable; urgency=high * ntop 3.3.4 -- Massimo Torquati Thu, 15 Nov 2007 23:54:18 +0100 ntop (3.3.1) unstable; urgency=high * ntop 3.3.1 -- Luca Deri Wed, 13 Jun 2007 17:31:48 +0100 ntop (3.3.0) unstable; urgency=high * ntop 3.3 -- Luca Deri Tue, 8 May 2007 22:41:18 +0100 ntop-5.0.1+dfsg1/packages/debian/substvars0000644000000000000000000000024110740213134017142 0ustar rootrootshlibs:Depends=libc6 (>= 2.3.6-6), libgdbm3, libmysqlclient15off (>= 5.0.27-1), libpcap0.8 (>= 0.9.3-1), librrd2, libssl0.9.8 (>= 0.9.8c-1), zlib1g (>= 1:1.2.1) ntop-5.0.1+dfsg1/packages/RedHat/0000755000000000000000000000000012012127277015121 5ustar rootrootntop-5.0.1+dfsg1/packages/RedHat/ntop.conf.sample0000755000000000000000000003121111317065275020237 0ustar rootroot################################################################################ ## # ## This file, ntop.conf.sample is a sample of an ntop configuration file. # ## # ## You should copy this file to it's normal location, /etc/ntop.conf # ## and edit it to fit your needs. # ## # ## ntop is easily launched with options by referencing this file from # ## a command line like this: # ## # ## ntop @/etc/ntop.conf # ## # ## Remember, options may also be listed directly on the command line, both # ## before and after the @/etc/ntop.conf. # ## # ## For switches that provide values, e.g. -i, the last one matters. # ## For switches just say 'do things', e..g -M, if it's ANYWHERE in the # ## commands, it will be set. There's no unset option. # ## # ## You can use this to your advantage, for example: # ## ntop @/etc/ntop.conf -i none # ## Overrides the -i in the file. # ## # ## Nested @'s - that is @/etc/ntop.common inside /etc/ntop.conf are not # ## permitted. # ## # ## Note that this is not an exhaustive list of ntop's commands - refer # ## to the man page and other documentation for that. This is just the # ## most commonly used command and various examples of them # ## # ## # ## Lines beginning ## are pure comments. # ## # ## Lines beginning with a dash in this sample file are 'live' and will # ## be used if you just copy this file to /etc/ntop.conf. # ## # ## Lines you might wish to uncomment and use as is begin with #- or #-- # ## # ## Parameter lines beginning with #? are models that you will need to # ## review and or customize to your environment before using them. # ## # ################################################################################ ## # ## Initial version by Burton M. Strauss III (Burton@ntopsupport.com) # ## # ## Updates and documentation courtesy of # ## Joseph Ezerski (jezerski@broadcom.com) (04-2003) # ## Tim Malnati (tgm@cshore.com) (09-2003) # ## # ################################################################################ ############################## RUNNING ENVIRONMENT ############################# ## -u | --user -- tells ntop the user id to run as. ## NOTE: This should not be root unless you really understand ## the security risks. --user ntop ##-----------------------------------------------------------------------------# ## -d | --daemon -- sets ntop to run as a daemon (in the background, not ## connected to a specific terminal). ## NOTE: For more than casual use, you probably want this. --daemon ##-----------------------------------------------------------------------------# ## -P | --db-file-path -- sets the directory that ntop runs from. ## NOTE: Use an absolute path (not a relative one like ../ntop) because ## the working directory (pwd) will be different when ntop is run ## from the command line, from cron and from initialization. --db-file-path /usr/share/ntop #? -P /var/ntop ##-----------------------------------------------------------------------------# ## -D | --domain -- Sets the domain. ntop should be able to determine ## this automatically, but occasionally has problems. If so, this makes the ## output cleaner. #? --domain mydomain.com ################################ WHAT TO MONITOR ############################### ## -i | --interface tells ntop which network interfaces (NICs) to monitor. ## DEFAULT: The 1st ethernet device, e.g. eth0, i.e. this line: --interface eth0 ## To monitor both eth0 and eth2 but not eth1: #? --interface eth0,eth2 ## To monitor NO ethernet interfaces (for example a system collecting data ## only from netFlow probes): #? --interface none ##-----------------------------------------------------------------------------# ## -M | --no-interface-merge -- tells ntop not to merge data from all of the ## network interfaces it is monitoring. See the man page and docs/FAQ for ## discussions of -M. #? --no-interface-merge ##-----------------------------------------------------------------------------# ## -m | --local-subnets -- Tells ntop of additional networks that should ## be considered local. This is for the local/remote breakdowns ## and because additional data is kept and display for local hosts. ## The addresses of the network interface(s) (NICs) are always local ## and don't need to be specified. If you use unnumbered interfaces ## you MUST give ntop this information. ## NOTE: You can mix CIDR and network/netmask notation. ## SEE ALSO: --track-local-hosts ## EXAMPLES: ## Traffic I see (broadcasts only, of course) on my cable modem includes ## other subnets than my own 12.239.98.0/24. I see 12.239.99.0/24 and ## 12.239.100.0/24 - to tell this to ntop: #? -m 12.239.99.0/24,12.239.100.0/24 ## I actually run this way, telling ntop about the whole range of ## addresses used as well as the private network used internally by the ## cable modems themselves. #? -m 192.168.42.0/24,12.239.96.0/22,12.239.100.0/24,10.113.0.0/16 ## All of these are equivalent to the one above: ## -m 192.168.42.0/255.255.255.0,12.239.96.0/22,12.239.100.0/24,10.113.0.0/16 ## -m 192.168.42.0/255.255.255.0,12.239.96.0/255.255.252.0,12.239.100.0/255.255.255.0,10.113.0.0/255.255.0.0 ##-----------------------------------------------------------------------------# ## -p | --protocols -- ntop comes with an extensive list of common tcp/ip ## protocols to monitor already built in. (See docs/FAQ for the current list). ## If you want to increase, decrease or change this list, this is the parameter. ## It can be either a file or a list. To point ntop to a file specify it's name: #? -p /usr/share/ntop/protocol.list ## Or to give an explicit list: #? --protocols="HTTP=http|www|https|3128,FTP=ftp|ftp-data" ##-----------------------------------------------------------------------------# ## -c | --sticky-hosts -- tells ntop NOT to purge idle hosts from memory. ## DO NOT USE THIS unless you are on a small, very static network, or you ## have LOTS of memory. ## It is strongly recommended that you use a filtering expression to limit ## the hosts which are stored if you use --sticky-hosts. #? --sticky-hosts ##-----------------------------------------------------------------------------# ## --disable-instantsessionpurge -- by default, ntop internally changes the ## status of completed sessions so that they get purged immediately. This ## doesn't present a true picture of the network, but does conserve memory. ## Enable this switch to see those finished sessions before their purge ## interval (5 minutes) expires, IF YOU HAVE ENOUGH MEMORY. #? --disable-instantsessionpurge ################################## LOG MESSAGES ################################ ## -t | --trace-level -- controls the amount and severity of messages that ## ntop will put out. Choices are: #--trace-level 0 # FATALERROR only #--trace-level 1 # ERROR and above only #--trace-level 2 # WARNING and above only #--trace-level 3 # INFO, WARNING and ERRORs - the default #--trace-level 4 # NOISY - everything #--trace-level 6 # NOISY + MSGID #--trace-level 7 # NOISY + MSGID + file/line --trace-level 3 # Which is the default ##-----------------------------------------------------------------------------# ## ## -L | --use-syslog | --use-syslog=xxxx -- By default, ntop writes it's ## messages to stdout (the terminal). ## WARNING: If you are running ntop as a daemon (--daemon parameter), the ## stdout (terminal) does not exist and so messages will be dropped. ## You probably don't want to do this. Instead, use this -L | --use-syslog ## parameter to save them into the system log (/var/log/messages). ## ## Thus a typical startup for ntop running as a daemon is: #--daemon --use-syslog ## You can also direct the messages to another file. You'll want to ## look at man syslog.conf to setup the configuration file. For example ## to use 'local3' to keep ntop messages separate, I have this in my ## /etc/syslog.conf: ## # Save ntop ## local3.* /var/log/ntop.log ## Then I run ntop with this: #? --use-syslog=local3 ## NOTE: The = is REQUIRED and no spaces are permitted. ################################## WEB SERVER ################################## ## ntop offers both an http:// and https:// web server. These parameters ## tell ntop which ports (and interfaces) to offer this web server on. ## -w | --http-server -- is the http:// web server. ## NOTE: --http-server 3000 is the default --http-server 3000 ## -W | --https-server -- is the https:// web server. #--https-server 3001 ## The default is -w 3000 -W 0 (disabled). You can also... ## https:// only: #? -w 0 -W 3001 ## http:// and https:// #? --http-server 3000 --https-server 3001 ## Neither - say ntop is running only as a netFlow probe: #? -w 0 -W 0 ## You can also limit ntop to listening on a specific interface. For example: #? -w 127.0.0.1:3000 # Listens only on the loopback interface at port 3000 ########################### PERFORMANCE AND PROBLEMS ########################### ## -B | filter-expression -- gives ntop a bpf (Berkeley Packet Filter) expression ## to use. (the easiest place to find bpf documented is on the tcpdump man page). ## NOTE: The filter expression MUST be in quotes. ## To restrict ntop to only a few machines on a large network, say 192.168.1.88 ## through 91: #? -B "net 192.168.1.88/30" ## That is equivalent to specifying the specific hosts: #? -B "host (192.168.1.88 or 192.168.1.89 or 192.168.1.90 or 192.168.1.91)" ## You can limit traffic to that from (src) or to (dst) a specific host: #? -B "src host www.mycompany.com" #? -B "dst host www.mycompany.com" ## You can limit it to a specific protocol, including src/dst: #? -B "port ssh" #? -B "src port ssh" #? -B "dst port ssh" ##-----------------------------------------------------------------------------# ## -o | --no-mac -- Configures ntop not to trust MAC addrs. ## This is used if you observe ntop being confused by 'changing' addresses - ## i.e. ntop belives that the corporate web server is actually Joe's desktop ## computer. #--no-mac ##-----------------------------------------------------------------------------# ## -g | --track-local-hosts -- Tells ntop to track only local hosts. These ## are hosts defined as local according to the network interfaces or specified ## by the --local-subnets option. ## Use this if you are seeing too many hosts and all you care about is the ## local (LAN) traffic. #--track-local-hosts ##-----------------------------------------------------------------------------# ## -z | --disable-sessions -- Tells ntop not to track tcp session information. ## Speeds up processing, requires less memory, but conveys less information. #--disable-sessions ##-----------------------------------------------------------------------------# ntop-5.0.1+dfsg1/packages/RedHat/ntop.init0000755000000000000000000006327211211045100016763 0ustar rootroot#!/bin/sh # # chkconfig: 2345 93 83 # # description: This shell script takes care of starting and stopping ntop. #NOTE: You most likely will have to fix this up to reflect your network. # ntop will not run until: # You have set the admin password - read docs/1STRUN.txt # You have created /etc/ntop.conf with appropriate parameters. # To identify an interface to ntop, use the following flags # in /etc/sysconfig/network-scripts/ifcfg-ethx # NTOP="yes" <--- means for ntop to use this interface # NTOPCONFIG="yes" <--- means for ntop to configure this interface # Note that if you give a -i parameter in either /etc/ntop.conf or # the command line, the scan is NOT performed. # However, when it comes to the configuration step, with NTOPCONFIG="yes" # the interface is configured regardless of how the interface list was # specified. # # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # # Copyright (C) 2003-2005 Burton M. Strauss III # # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Thanks to Tim Malnati for ideas and contributions # to this script. # The short name, used everywhere... name=ntop ####NORMALLY MODIFIED PARAMETERS##### # Modify this to always add something at the end of the parm list that # you don't want in /etc/ntop.conf. # This default tells ntop to run as a daemon (good thing, since this is # the daemon startup script. extra=" -d" # Why not force it below? This allows you to use the same /etc/ntop.conf # file both from /etc/init.d/ntop and if you want to run ntop from the # command line... # Want to log ntop stuff somewhere other than /var/log/messages? # Use this line: # extra=" -d --use-syslog=local3" # And add this to /etc/syslog.conf: # # Save ntop # local3.* /var/log/ntop.log # Add this to /etc/logrotate.conf: # /var/log/ntop.log { # weekly # rotate 4 # notifempty # # ntop doesn't handle SIGHUP properly # copytruncate # } # For both of the additions, above, remember to remove the leading #! # Modify this to run multiple instances of ntop instance="" ####END NORMALLY MODIFIED PARAMETERS##### ####POTENTIALLY MODIFIED PARAMETERS##### # Modify this to change the location of the configuration file conf="/etc/${name}${instance}.conf" # Modify this if ntop is somewhere else or you want to run sntop, etc. prog="/usr/bin/ntop" # Modify to force INITD messages... ntopusesyslog="local3" # If you need to specify a LD_LIBRARY_PATH, use this: #ldlibpath="/xxxxx/lib/ntop/:/xxxxx/lib/ntop/plugins/:/xxxxx/lib/plugins/" ####END POTENTIALLY MODIFIED PARAMETERS##### invoked=$0 # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Basic sanity checks... if ! [ -x $prog ]; then echo "" echo "ERROR -" echo " $prog not found!" echo "" echo "Aborting..." echo "" exit 1 fi if [ ${NETWORKING} = "no" ]; then echo "" echo "ERROR -" echo " Networking is not up!" echo "" echo "Aborting..." echo "" exit 1 fi if ! [ -f ${conf} ]; then echo "" echo "ERROR -" echo " Configuration file ${conf} does not exist!" echo "" echo "Aborting..." echo "" exit 1 fi # Process /etc/init.d/ntop parameters ... debug="n" sudo="" if [ "x"${1} = "x--debug" ]; then debug="y" shift echo "DEBUG: active" fi if [ "x"${1} = "x--sudo" ]; then if [ "${debug}" = "y" ]; then echo "DEBUG: will invoke via sudo"; fi sudo="sudo " shift fi if [ "x"${1} = "x--debug" ]; then debug="y" shift echo "DEBUG: active" fi # Process what will become the parm string so we have things we need... parmfile=`mktemp /tmp/${name}initparms.XXXXXX` if [ $? -ne 0 ]; then echo "" echo "ERROR -" echo " Unable to create temporary file in /tmp!" echo "" echo "Aborting..." echo "" exit 1 fi if [ "${debug}" = "y" ]; then echo "DEBUG: parm file temp is ${parmfile}"; fi cmd=`echo \ @${conf} \ -i tbd \ $extra $@` echo ${cmd} | awk ' \ BEGIN { eff=""; \ xvert["4"] = "ipv4"; \ xvert["6"] = "ipv6"; \ xvert["a"] = "access-log-path"; \ xvert["b"] = "disable-decoders"; \ xvert["c"] = "sticky-hosts"; \ xvert["d"] = "daemon"; \ xvert["e"] = "max-table-rows"; \ xvert["f"] = "traffic-dump-file"; \ xvert["g"] = "track-local-hosts"; \ xvert["h"] = "help"; \ xvert["i"] = "interface"; \ xvert["j"] = "create-other-packets"; \ xvert["l"] = "pcap-log"; \ xvert["m"] = "local-subnets"; \ xvert["n"] = "numeric-ip-addresses"; \ xvert["o"] = "no-mac"; \ xvert["k"] = "filter-expression-in-extra-frame"; \ xvert["p"] = "protocols"; \ xvert["q"] = "create-suspicious-packets"; \ xvert["r"] = "refresh-time"; \ xvert["s"] = "no-promiscuous"; \ xvert["t"] = "trace-level"; \ xvert["u"] = "user"; \ xvert["w"] = "http-server"; \ xvert["z"] = "disable-sessions"; \ xvert["B"] = "filter-expression"; \ xvert["D"] = "domain"; \ xvert["F"] = "flow-spec"; \ xvert["K"] = "debug"; \ xvert["M"] = "no-interface-merge"; \ xvert["N"] = "wwn-map"; \ xvert["O"] = "output-packet-path"; \ xvert["P"] = "db-file-path"; \ xvert["Q"] = "spool-file-path"; \ xvert["U"] = "mapper"; \ xvert["V"] = "version"; \ xvert["W"] = "https-server"; \ } \ \ { for (i=1; i<=NF; i++) { \ if (substr($i, 1, 1) == "@") { \ filename=substr($i, 2); \ while (getline line < filename > 0) { \ if ((j = index(line, "#")) > 1) { eff = eff " " substr(line, 1, j-1) } \ else if (j != 1) { eff = eff " " line } \ } \ } else { eff=eff " " $i } \ } } \ \ END { f=0; gsub(/[=`;\n\r\t]/, " ", eff); gsub(/ *$/, "", eff); \ while (length(eff) > 0) { \ gsub(/^ +/, "", eff); \ if ((i=index(eff, " ")) > 0) { option=substr(eff, 1, i-1); \ eff=substr(eff, i+1); gsub(/^ +/, "", eff) } \ else { option=eff; eff="" } \ gsub(/^\-*/, "", option); \ if (option in xvert) { option = xvert[option] } \ gsub(/[-\/\"]/, "", option); \ if (option !~ /^[a-zA-Z0-9]*$/) { option = "bogus" } \ options[f]=option; \ if (length(eff) > 0) { \ c=substr(eff, 1, 1); \ if (c == "\"") { i=index(substr(eff, 2), "\"") + 1; value[f]=substr(eff, 1, i); \ eff=substr(eff, i+1) } \ else if (c != "-") { \ if ((i=index(eff, " ")) > 0) { value[f]=substr(eff, 1, i-1); eff=substr(eff, i+1) } \ else { value[f]=eff; eff="" } \ } else { value[f]="yes" } \ } else { value[f]="yes" } \ f++; \ } \ print "#!/bin/sh\n#"; \ for(i=0; i ${parmfile} . ${parmfile} if [ -f ${parmfile} ]; then rm -f ${parmfile} fi if [ "${debug}" = "y" ]; then echo "DEBUG: ntop${instance} settings:" set | grep ^ntop fi if [ ".${ntopusesyslog}" = "." ]; then ntopusesyslog="info" # force logging (this is /etc/init.d/ntop after all) extra="${extra} --use-syslog" else ntopusesyslog="${ntopusesyslog}.info" fi if [ "${debug}" = "y" ]; then echo "DEBUG: logging to ${ntopusesyslog}"; fi logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - *****$0 $@ running*****" logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Program is ${prog}" if [ "${instance}." != "." ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Instance is ${instance}" fi logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Configuration in ${conf}" # Now do checks on the ntop${instance} parameters... # ntopinterface="tbd" # ntopuser="ntop" # ntopdbfilepath="/usr/share/ntop" # ntophttpserver="3000" # ntoptracelevel="3" # ntoplocalsubnets="192.168.42.0/24 12.239.96.0/22 10.113.0.0/16" # ntopdisableinstantsessionpurge="yes" # ntoplogextra="2" # ntopdaemon="yes" # ntopusesyslog="local3" # ntopstart="yes" # ntopinterface="eth1" # Build list of interfaces, e.g eth0 eth1 eth1:1 # (Yeah, we'll have to convert that to eth0,eth1,eth1:1 later if [ ".${ntopinterface}" = ".tbd" ]; then ntopinterface="" iflist=`ip link show | \ awk '/^[0-9]*:\ eth/ { printf("%s ", substr($2, 1, length($2)-1)) }'` logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Scanning all interfaces $iflist" if [ "${debug}" = "y" ]; then echo "DEBUG: Interface candidates are ${iflist}"; fi for eth in $iflist; do if ! LANG=C egrep -L "^[Nn][Tt][Oo][Pp]=['\"]?[Yy][Ee][Ss]['\"]?" \ /etc/sysconfig/network-scripts/ifcfg-$eth > /dev/null ; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - $eth is not ntop=yes, skipping" if [ "${debug}" = "y" ]; then echo "DEBUG: $eth not ntop=yes"; fi continue fi ntopinterface="${ntopinterface} $eth" ip=`ip addr show $eth | \ awk '/inet/ { printf("%s", substr($2, 1, index($2, "/")-1)) }'` if [ ".$ip" = "." ]; then is="is unnumbered interface" else is="has IP address $ip" fi logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - $eth is ntop=yes, ${is}" if [ "${debug}" = "y" ]; then echo "DEBUG: $eth ntop=yes, ${is}"; fi done else logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Skipping interface scan - list in parms" fi if [ "x${ntopinterface}" = "x" ]; then ntopinterface="none" fi logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - interfaces are ${ntopinterface}" if [ "${debug}" = "y" ]; then echo "DEBUG: Interfaces are ${ntopinterface}"; fi start_checks() { # check password database exists if ! [ -f "${ntopdbfilepath}/ntop_pw.db" ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - FATALERROR - no password database" echo "" echo "ERROR -" echo " No password database!" echo "" echo " See docs/1STRUN.txt file... try ${invoked} init" echo "" echo "Aborting..." echo "" exit 1 fi # verify database path parameter if [ ".${ntopdbfilepath}" = "." ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - FATALERROR: Database path parameter is not set" echo "" echo "ERROR -" echo " Database path parameter is not set." echo "" echo " Without access to the source, we don't know what CFG_DBFILE_DIR" echo " is set to (common values are /usr/var/ntop and /usr/local/var/ntop" echo " but it could be ANYTHING, based on ./configure --prefix=xxxxx)." echo "" echo " Edit ${conf} and rerun ${invoked} init" echo "" echo "Aborting..." echo "" exit 1 fi if ! [ -d "${ntopdbfilepath}" ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - FATALERROR: Database path parameter ${ntopdbfilepath} invalid" echo "" echo "ERROR -" echo " Database path parameter ${ntopdbfilepath} invalid!" echo "" echo " Create path or correct ${conf} and rerun ${invoked} init" echo "" echo "Aborting..." echo "" exit 1 fi # verify temporary database path parameter if [ ".${ntopspoolfilepath}" != "." ]; then if ! [ -d "${ntopspoolfilepath}" ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - FATALERROR: Spool database path parameter ${ntopspoolfilepath} invalid" echo "" echo "ERROR -" echo " Spool database path parameter ${ntopspoolfilepath} invalid!" echo "" echo " Create path or correct ${conf} and rerun ${invoked} init" echo "" echo "Aborting..." echo "" exit 1 fi fi # verify access log, if one... if [ ".${ntopaccesslogpath}" != "." ]; then alp=`dirname ${ntopaccesslogpath}` if ! [ -d "${alp}" ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - FATALERROR: Access log parameter ${ntopaccesslogpath} directory missing" echo "" echo "ERROR -" echo " Access log parameter ${ntopaccesslogpath} - directory missing!" echo "" echo " Create path or correct ${conf} and rerun ${invoked} init" echo "" echo "Aborting..." echo "" exit 1 fi fi # verify output path, if one... if [ ".${ntopoutputpacketpath}" != "." ]; then if ! [ -d "${ntopoutputpacketpath}" ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - FATALERROR: Output packet path ${ntopoutputpacketpath} directory missing" echo "" echo "ERROR -" echo " Access log parameter ${ntopoutputpacketpath} directory missing!" echo "" echo " Create path or correct ${conf} and rerun ${invoked} init" echo "" echo "Aborting..." echo "" exit 1 fi fi } show_extra () { logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Given parameter(s) are: '$@'" logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Extra parameter(s) are: '$extra'" if [ "${debug}" = "y" ]; then echo "DEBUG: Given parameter(s) are: '$@'"; echo "DEBUG: Extra parameter(s) are: '$extra'"; fi } config_interfaces () { logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Configuring interfaces" if [ "${debug}" = "y" ]; then echo "DEBUG: Configuring interfaces"; fi if="" for eth in ${ntopinterface}; do if [ ".${if}" = "." ]; then if="${eth}" else if="${if},${eth}" fi if ! LANG=C egrep -L "^[Nn][Tt][Oo][Pp][Cc].*=['\"]?[Yy][Ee][Ss]['\"]?" \ /etc/sysconfig/network-scripts/ifcfg-$eth > /dev/null ; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - $eth is not ntopconfigure=yes, skipping" continue fi logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Configuring $eth" if [ "${debug}" = "y" ]; then echo "DEBUG: Configuring $eth"; fi ifup=`$sudo /sbin/ip addr show $eth | grep 'UP'` ip=`$sudo /sbin/ip addr show $eth | \ awk '/inet/ { printf("%s", substr($2, 1, index($2, "/")-1)) }'` $sudo /sbin/ip link set $eth promisc on 2> /dev/null rc=$? if [ ${rc} = 255 ]; then $sudo /sbin/ifconfig $eth promisc 2> /dev/null fi $sudo /sbin/ip link set $eth up $sudo /sbin/ip addr show $eth | logger -p ${ntopusesyslog} -t ${name}${instance} if [ "${debug}" = "y" ]; then $sudo /sbin/ip addr show $eth; fi done logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Interfaces are configured" if [ "${debug}" = "y" ]; then echo "DEBUG: Interfaces are configured"; fi } show_starting () { echo -n $"Starting ${name}${instance}: " echo logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Starting: ${cmd}" if [ "${debug}" = "y" ]; then echo "DEBUG: Starting: ${cmd}"; fi } gdb () { # start debug shift start_checks show_extra config_interfaces if [ ".${ldlibpath}" != "." ]; then export LD_LIBRARY_PATH="${ldlibpath}" fi echo "set args @${conf} -i ${if} $@ --instance DEBUG -K" > /tmp/gdbcmd echo "show args" >>/tmp/gdbcmd /usr/bin/gdb ${prog} -x /tmp/gdbcmd } start () { # start daemon shift start_checks show_extra config_interfaces cmd=`echo $prog \ @${conf} \ -i $if \ $extra $@` if [ ".${instance}" != "." ]; then cmd="${cmd} --instance ${instance}" fi show_starting if [ ".${ldlibpath}" != "." ]; then export LD_LIBRARY_PATH="${ldlibpath}" fi daemon ${cmd} RETVAL=$? [ $RETVAL = 0 ] && touch /var/lock/subsys/${name}${instance} return $RETVAL } stop () { # stop daemon RETVAL=1 echo -n $"Stopping ${name}${instance}: " logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Stopping: ${name}${instance}" if [ -d "${ntopdbfilepath}" ] && [ -f "${ntopdbfilepath}/ntop.pid" ]; then pid=`cat ${ntopdbfilepath}/ntop.pid` ps ${pid} > /dev/null 2> /dev/null rc=$? if [ $rc = 0 ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Sending SIGTERM to ${pid}" if [ "${debug}" = "y" ]; then echo "Sending SIGTERM to ${pid}"; fi kill -s SIGTERM ${pid} RETVAL=$? rm -f ${ntopdbfilepath}/ntop.pid else logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Unable to find process ${pid} ... will kill by name" if [ "${debug}" = "y" ]; then echo "Unable to find process ${pid} ... will kill by name"; fi fi else logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Unable to find ${ntopdbfilepath}/ntop.pid file ... will kill by name" if [ "${debug}" = "y" ]; then echo "Unable to find ${ntopdbfilepath}/ntop.pid file ... will kill by name"; fi fi echo if [ $RETVAL != 0 ]; then pids=`ps axf | grep '\/usr\/bin\/ntop' | awk '{ printf(" %s", $1) }; END { print "" }'` if [ "${pids}" != " " ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Sending SIGTERM to ${prog}...${pids}" if [ "${debug}" = "y" ]; then echo "Sending SIGTERM to ${prog}...${pids}"; fi kill -INT ${pids} RETVAL=$? fi fi if [ $RETVAL = 0 ]; then rm -f /var/lock/subsys/${name} logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Unconfiguring interfaces" if [ "${debug}" = "y" ]; then echo "DEBUG: Unconfiguring interfaces"; fi for eth in ${ntopinterface}; do if ! LANG=C egrep -L "^[Nn][Tt][Oo][Pp][Cc].*=['\"]?[Yy][Ee][Ss]['\"]?" \ /etc/sysconfig/network-scripts/ifcfg-$eth > /dev/null ; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - $eth is not ntopconfigure=yes, skipping" if [ "${debug}" = "y" ]; then echo "DEBUG: $eth is not ntopconfigure=yes"; fi continue fi logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Unconfiguring $eth" if [ "${debug}" = "y" ]; then echo "DEBUG: Unconfiguring $eth"; fi $sudo /sbin/ip link set $eth down $sudo /sbin/ip link set $eth promisc off 2>/dev/null rc=$? if [ ${rc} = 255 ]; then $sudo /sbin/ifconfig $eth -promisc fi $sudo /sbin/ip addr show $eth | logger -p ${ntopusesyslog} -t ${name}${instance} if [ "${debug}" = "y" ]; then $sudo /sbin/ip addr show $eth; fi done logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Interfaces are unconfigured" if [ "${debug}" = "y" ]; then echo "DEBUG: Interfaces are unconfigured"; fi fi return $RETVAL } restart () { echo $"In restart, parameters are $@" stop start $@ } valgrind () { shift logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - valgrind request...checking" if [ "${debug}" = "y" ]; then echo "DEBUG: Checking for valgrind"; fi valgrind=`slocate -r 'bin\/valgrind$'` rc=$? if [ ${rc} != 0 ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - valgrind not found, aborting" echo "" echo "" echo "ERROR: Unable to find valgrind (rc=${rc})" echo "" echo "Aborting..." exit 1 fi logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Found valgrind: ${valgrind}" if [ "${debug}" = "y" ]; then echo "DEBUG: Found valgrind: ${valgrind}"; fi echo $"Stopping..." stop echo $"Running under valgrind, parameters are $@" valgrind="${valgrind} --verbose" valgrind="${valgrind} --suppressions=/usr/share/ntop/valgrind.supp" valgrind="${valgrind} --logfile=/tmp/valgrind.log" valgrind="${valgrind} --leak-check=yes" valgrind="${valgrind} --leak-resolution=high" # valgrind="${valgrind} --show-reachable=yes" valgrind="${valgrind} --track-fds=yes" valgrind="${valgrind} --trace-children=yes" valgrind="${valgrind} --num-callers=6" valgrind="${valgrind} --gen-suppressions=yes" valgrind="${valgrind} --sanity-level=0" prog="${valgrind} ${prog}" start_checks show_extra config_interfaces cmd=`echo $prog -i $if \ @${conf} \ $extra $@` if [ "${debug}" = "y" ]; then echo "DEBUG: cmd pre-strip '${cmd}'"; fi cmd=`echo ${cmd} | awk '{ gsub(/ *-d/, "", $0); print $0}'` cmd=`echo ${cmd} | awk '{ gsub(/ *-L/, "", $0); print $0}'` cmd=`echo ${cmd} | awk '{ gsub(/ *--use-syslog=[a-zA-Z0-9]*/, "", $0); print $0}'` if [ "${debug}" = "y" ]; then echo "DEBUG: cmd post-strip '${cmd}'"; fi show_starting echo "${cmd}" ${cmd} } init() { echo "" echo "" # check password database exists if [ -d "${ntopdbfilepath}" ] && [ -f "${ntopdbfilepath}/ntop_pw.db" ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - ERROR - password database exists" echo "" echo "ERROR -" echo " password database exists!" echo "" echo " You probably did not want to init again, did you?" echo "" echo "Aborting..." echo "" exit 1 fi if [ ".${ntopuser}" = "." ]; then echo "" echo "WARNING -" echo " Execution user not set, can't do permissions" echo "" echo "Skipping..." echo "" exit 0 fi echo "Creating directories and/or setting permissions..." quiet="-f"; verbose=""; if [ "${debug}" = "y" ]; then quiet=""; verbose="--verbose"; fi # The base directory... if [ "${debug}" = "y" ]; then echo "DEBUG: Create set ownership/permissions for ${ntopdbfilepath}"; fi if [ ! -d ${ntopdbfilepath} ]; then mkdir --parents --mode=0711 ${verbose} ${ntopdbfilepath} logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Created ${ntopdbfilepath}" fi chown -R ${quiet} ${ntopuser}: ${ntopdbfilepath} chmod ${quiet} 0711 ${ntopdbfilepath} logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Ownership/permissions set for ${ntopdbfilepath}" # rrd within that if [ "${debug}" = "y" ]; then echo "DEBUG: Create set ownership/permissions for ${ntopdbfilepath}/rrd"; fi if [ ! -d ${ntopdbfilepath}/rrd ]; then logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Created ${ntopdbfilepath}/rrd" mkdir --parents --mode=0755 ${verbose} ${ntopdbfilepath}/rrd fi chmod ${quiet} 0755 ${ntopdbfilepath}/rrd chown -R ${quiet} ${ntopuser}: ${ntopdbfilepath}/rrd logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Ownership/permissions set for ${ntopdbfilepath}/rrd" # temporary database path parameter, if one if [ ".${ntopspoolfilepath}" != "." ]; then if [ "${debug}" = "y" ]; then echo "DEBUG: Create set ownership/permissions for ${ntopspoolfilepath}"; fi if ! [ -d "${ntopspoolfilepath}" ]; then mkdir --parents --mode=0711 ${verbose} ${ntopspoolfilepath} logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Created ${ntopspoolfilepath}" chown -R ${quiet} ${ntopuser}: ${ntopspoolfilepath} logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Ownership/permissions set for ${ntopspoolfilepath}" fi fi # access log, if one... if [ ".${ntopaccesslogpath}" != "." ]; then alp=`dirname ${ntopaccesslogpath}` if [ "${debug}" = "y" ]; then echo "DEBUG: Create set ownership/permissions for ${alp}"; fi if ! [ -d "${alp}" ]; then mkdir --parents --mode=0711 ${verbose} ${alp} logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Created ${ntopaccesslogpath}" chown -R ${quiet} ${ntopuser}: ${alp} logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Ownership/permissions set for ${ntopaccesslogpath}" fi fi # output path, if one... if [ ".${ntopoutputpacketpath}" != "." ]; then if [ "${debug}" = "y" ]; then echo "DEBUG: Create set ownership/permissions for ${ntopoutputpacketpath}"; fi if ! [ -d "${ntopoutputpacketpath}" ]; then mkdir --parents --mode=0711 ${verbose} ${ntopoutputpacketpath} logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Created ${ntopoutputpacketpath}" chown -R ${quiet} ${ntopuser}: ${ntopoutputpacketpath} logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Ownership/permissions set for ${ntopoutputpacketpath}" fi fi echo "" echo "Running ${prog} to set password - please respond" echo "" $prog --set-admin-password --db-file-path ${ntopdbfilepath} echo "" # Fixup the created files for more security. chmod 0600 ${ntopdbfilepath}/ntop_pw.db chmod 0600 ${ntopdbfilepath}/prefsCache.db chown -R ${quiet} ${ntopuser}: ${ntopdbfilepath}/*.db logger -p ${ntopusesyslog} -t ${name}${instance} -- "INITD - Ownership/permissions set for ${ntopdbfilepath}/*.db" echo "" echo "Done... ready for ${invoked} start" echo "" } case "$1" in init) init $@ ;; startdebug) start $@ " -K " ;; gdb) gdb $@ ;; start) start $@ ;; stop) stop ;; restart) restart $@ ;; condrestart) [ -f /var/lock/subsys/ntop ] && restart || : ;; valgrind) valgrind $@ ;; status) status ntop ;; *) echo $"Usage: $0 {init|start|stop|restart|condrestart|status}" exit 1 esac exit $RETVAL ntop-5.0.1+dfsg1/packages/RedHat/makefile_am.patch0000755000000000000000000000111407646332015020401 0ustar rootroot--- ntop/Makefile.am.orig Sat Feb 8 16:27:07 2003 +++ ntop/Makefile.am Sat Feb 8 16:27:45 2003 @@ -228,9 +228,9 @@ @$(top_srcdir)/mkinstalldirs $(DESTDIR)/$(CFG_CONFIGFILE_DIR); @for file in $(NTOPDATA); do \ if test -d $$file; then \ - $(top_srcdir)/mkinstalldirs $(DESTDIR)/$(CFG_CONFIGFILE_DIR)/$$file; \ + $(top_srcdir)/mkinstalldirs $(DESTDIR)/etc/ntop/$$file; \ else \ - cp -p $$file $(DESTDIR)/$(CFG_CONFIGFILE_DIR)/$$file; \ + cp -p $$file $(DESTDIR)/etc/ntop/$$file; \ fi; \ done ntop-5.0.1+dfsg1/packages/RedHat/README0000644000000000000000000000070510176215333016003 0ustar rootrootThis directory contains the raw files (except for the ones copied from the normal cvs such as 1STRUN.txt) used to build the rpms posted at SourceForge. For reference the rpms are normally built on tigger, which is a RedHat 9 machine, using the buildmeister userid. tigger is kept pretty much upto date on various packages. -----Burton (March 2004) For 3.1 these were built on a VirtualPC2004 machine (Zebra not Tigger). -----Burton (Jan 2005) ntop-5.0.1+dfsg1/packages/RedHat/ntop.spec0000644000000000000000000002524110325771465016772 0ustar rootroot## Constants... ## ## Change version and suffix as necessary. ## release 0 is the first release from the same base version, ## 1 would be the second, etc. # %define rpmversion 3.2 %define rpmsuffix %define rpmrelease 2 %define rpmdistro fc2 ## ## Pick ONE of these sets as appropriate # # % d e f i n e releasetype TEST # % d e f i n e releasetext from the ntop cvs tree at cvs.ntop.org. # % d e f i n e releaseintent Our intention is to release this or something much like it as ntop 3.2 in a short period of time. # %define releasetype STABLE PRODUCTION %define releasetext %define releaseintent ## ## Others shouldn't require changes. # %define ntoproot /usr # Summary: ntop shows the network usage Name: ntop Version: %{rpmversion}%{rpmsuffix} Release: %{rpmrelease}.%{rpmdistro} Vendor: ntop project Distribution: SourceForge RPM Packager: Burton Strauss Source: %{name}-%{rpmversion}%{rpmsuffix}.tgz Source1: ntop.init Source2: ntop.logrotate Source3: ntop.conf.sample Patch1: version.patch License: GPL Group: Applications/System BuildPrereq: glibc, glibc-devel, gcc, cpp, gawk, autoconf, automake, binutils, openssl, openssl-devel, gdbm, gdbm-devel, libpcap, zlib-devel Requires: glibc, openssl, gdbm, libpcap, chkconfig Buildroot: %{_tmppath}/%{name}-root Prereq: /sbin/chkconfig, /sbin/ldconfig %description ntop is a network and traffic analyzer that provides a wealth of information on various networking hosts and protocols. ntop is primarily accessed via a built-in web interface. Optionally, data may be stored into a database for analysis or extracted from the web server in formats suitable for manipulation in perl or php. See 1STRUN.txt for the 1st time startup procedure! See FAQ for answers to questions. ntop %{rpmversion}%{rpmsuffix} is a %{releasetype} release %{releasetext}. %{releaseintent} This version is compiled WITH SSLv3. This version is compiled WITHOUT --enable-xmldump (dump.xml handler) This version is compiled WITH --enable-i18n. SSLWATCHDOG is not compiled but may be selected at run time. YOU MUST SETUP A PASSWORD BEFORE RUNNING NTOP - see 1STRUN.txt in /usr/share/doc/ntop- Please send problem reports (using the automatically generated form if at all possible) (Click on the 'bug' icon in the About menu) to the ntop mailing list. %prep echo Unpacked directory will be %{name}-%{rpmversion}%{rpmsuffix} %setup -q -n %{name}-%{rpmversion}%{rpmsuffix} # Patches %patch1 -p1 %build unset RPM_OPT_FLAGS %undefine optflags # Now, configure and build ntop %configure --enable-optimize --bindir=%{_bindir} --datadir=%{ntoproot}/share \ --enable-sslv3 \ --enable-i18n make faq.html make ntop.txt make ntop.html make %install mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d \ $RPM_BUILD_ROOT/%{_bindir} \ $RPM_BUILD_ROOT/etc/logrotate.d \ $RPM_BUILD_ROOT/%{_datadir}/%{name} make install DESTDIR=$RPM_BUILD_ROOT make install-data-local DESTDIR=$RPM_BUILD_ROOT if test -f $RPM_BUILD_ROOT/usr/bin/i386-redhat-linux-ntop; then mv -f $RPM_BUILD_ROOT/usr/bin/i386-redhat-linux-ntop \ $RPM_BUILD_ROOT/usr/bin/ntop fi if test -f $RPM_BUILD_ROOT/usr/share/man/man8/i386-redhat-linux-ntop.8; then mv -f $RPM_BUILD_ROOT/usr/share/man/man8/i386-redhat-linux-ntop.8 \ $RPM_BUILD_ROOT/usr/share/man/man8/ntop.8 fi install -c -m0755 %{SOURCE1} $RPM_BUILD_ROOT/etc/rc.d/init.d/ntop install -c -m0644 %{SOURCE2} $RPM_BUILD_ROOT/etc/logrotate.d/ntop install -c -m0700 %{SOURCE3} $RPM_BUILD_ROOT/etc/ntop.conf.sample %pre g=`cat /etc/group | grep ^ntop:` if test ".${g}" = "."; then /usr/sbin/groupadd -r ntop 2>/dev/null || : fi u=`cat /etc/passwd | grep ^ntop:` if test ".${u}" = "."; then /usr/sbin/useradd -s /bin/false -c "ntop server user" -g ntop \ -d %{ntoproot}/share/ntop -M -r ntop 2>/dev/null || : fi %post echo "***********************************************************************" mkdir /usr/share/ntop/rrd chown ntop:ntop /usr/share/ntop echo "***********************************************************************" if test -f /etc/init.d/ntop; then /sbin/chkconfig --add ntop /sbin/ldconfig echo "***********************************************************************" if ! test -f /usr/share/ntop/ntop_pw.db; then if ! test -f /etc/ntop.conf; then echo "* You must configure /etc/ntop.conf - see /etc/ntop.conf.sample *" echo "* *" echo "* (as root run) $ cp /etc/ntop.conf.sample /etc/ntop.conf *" echo "* $ vi /etc/ntop.conf *" echo "* *" echo "***********************************************************************" fi echo "* YOU MUST SETUP A PASSWORD BEFORE RUNNING NTOP *" echo "* *" echo "* (as root run) $ /usr/bin/ntop @/etc/ntop.conf -A *" echo "* *" echo "* see 1STRUN.txt in /usr/share/doc/ntop- *" echo "***********************************************************************" elif ! test -f /etc/ntop.conf; then echo "* You must configure /etc/ntop.conf - see /etc/ntop.conf.sample *" echo "* *" echo "* (as root run) $ cp /etc/ntop.conf.sample /etc/ntop.conf *" echo "* $ vi /etc/ntop.conf *" echo "* *" else echo "* *" echo "* Starting ntop using a pre-existing setup - check the results! *" echo "* *" /sbin/service ntop condrestart > /dev/null 2>&1 fi fi echo "***********************************************************************" echo " " echo "Questions? See the FAQ in /usr/share/doc/ntop-" echo " " %preun if [ "$1" = "0" ]; then /sbin/service ntop stop > /dev/null 2>&1 /sbin/chkconfig --del ntop fi %postun if [ "$1" -ge "1" ]; then /sbin/service ntop condrestart > /dev/null 2>&1 fi /sbin/ldconfig %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc AUTHORS %doc CONTENTS %doc MANIFESTO %doc COPYING %doc ChangeLog %doc docs/BUILD-NTOP.txt %doc docs/FAQ %doc docs/HACKING %doc docs/KNOWN_BUGS %doc docs/TODO %doc docs/1STRUN.txt %doc NEWS %doc PORTING %doc README %doc SUPPORT_NTOP.txt %doc THANKS %config %{_sysconfdir}/rc.d/init.d/ntop %config %{_sysconfdir}/logrotate.d/ntop %config %{_sysconfdir}/ntop.conf.sample %{_bindir}/ntop %{_datadir}/%{name} /etc/ntop %{_mandir}/man8/ntop.8.gz %{_libdir}/ntop %{_libdir}/plugins %{_libdir}/libntop* %{_libdir}/lib*Plugin* %{_libdir}/libmyrrd* %changelog * Thu Oct 20 2005 Burton M. Strauss III - 3.2 * Sat Oct 01 2005 Burton M. Strauss III - Update spec for 3.2 rc2 - Incorporate some cleanups and ideas from Kenneth Porter * Thu Sep 08 2005 Burton M. Strauss III - v3.2rc1 - TEST release for 3.2 * Mon Dec 13 2004 Burton M. Strauss III - v3.1rc1 - TEST release for 3.1 * Thu Mar 18 2004 Burton M. Strauss III - v3.0rc1 - TEST release for 3.0 * Mon Mar 03 2004 Burton M. Strauss III - v3.0pre2 - TEST release for 3.0 * Mon Feb 16 2004 Burton M. Strauss III - v3.0pre1 - TEST release for 3.0 * Wed Sep 03 2003 Burton M. Strauss III - v2.2.94 - TEST release for 2.3 * Fri Aug 22 2003 Burton M. Strauss III - v2.2.93 - TEST release for 2.3 * Mon Jul 4 2003 Burton M. Strauss III - v2.2c - Released - bug fixes incl backport from 2.2.2/2.2.3 * Mon Apr 14 2003 Burton M. Strauss III - v2.2 - Released! * Thu Apr 10 2003 Burton M. Strauss III - v2.1.92 - Of major note is the rewrite of the ./configure system should be more accurate, more informative and not require the auto* tools for non-developers. * Wed Apr 02 2003 Burton M. Strauss III - v2.1.91 * Mon Mar 17 2003 Burton M. Strauss III - v2.1.90 * Fri Mar 14 2003 Burton M. Strauss III - v2.1.58 -1 add the data and .pem files to the install * Sat Feb 08 2003 Burton M. Strauss III - v2.1.57 - Minor fixup in ntop.init where I had the old name for ntop.conf - Enabled i18n - v2.1.56 * Tue Jan 28 2003 Burton M. Strauss III - v2.1.55 * Sat Dec 14 2002 Burton M. Strauss III - -1 - Fix init and logrotate scripts, also create rrd directory and chown it - v2.1.53 - Fix deadlock occuring in 2.1.52 - other minor stuff * Wed Dec 05 2002 Burton M. Strauss III - v2.1.52 - ./configure scripts - rrd - Force gdchart to i386 - 1strun stuff - @/etc/ntop.conf * Sun Nov 24 2002 Burton M. Strauss III - v2.1.51-1 (new tigger/ur-tigger) * Fri Nov 1 2002 Burton M. Strauss III - v2.1.51 * Tue Sep 20 2002 Burton M. Strauss III - v2.1.3 * Tue Jul 30 2002 Burton M. Strauss III - v2.1.2a (not released) - added chkconfig to requires list - - rearranged patches - - Added creation of ntop user * Thu Jul 25 2002 Burton M. Strauss III - v2.1.2 * Thu Jul 11 2002 Burton M. Strauss III - v2.1 * Thu Jul 03 2002 Burton M. Strauss III - Updated to RC3 * Thu Jun 20 2002 Burton M. Strauss III - Updated to RC2A - unofficial post RC2 build. * Tue Jun 04 2002 Burton M. Strauss III - Updated to RC2 * Fri May 17 2002 Burton M. Strauss III - Updated to RC1 * Mon May 13 2002 Burton M. Strauss III - Updated for 2.0.99 - beta - from 13May2002 snapshot * Fri Nov 23 2001 Hal Burgiss - Updated for 2.0 beta. * Thu Oct 11 2001 Hal Burgiss - Updated for 2.0 pre-release snapshots. Many changes. ntop-5.0.1+dfsg1/packages/RedHat/ntop.logrotate0000755000000000000000000000035507646332015020036 0ustar rootroot/var/log/ntop.access.log { missingok compress rotate 2 weekly postrotate touch $* chown ntop.ntop $* (/sbin/pidof ntop && /sbin/service ntop restart) >/dev/null 2>&1 || true endscript } ntop-5.0.1+dfsg1/packages/RedHat/cfgdbfile.patch0000644000000000000000000000123210176215470020047 0ustar rootroot--- ntop/Makefile.am.orig 2004-12-13 12:45:42.264609423 -0600 +++ ntop/Makefile.am 2004-12-13 12:46:09.581449186 -0600 @@ -271,7 +271,7 @@ install: install-recursive - @mkdir -p $(CFG_DBFILE_DIR) + @mkdir -p $(RPM_BUILD_ROOT)$(CFG_DBFILE_DIR) @echo "" @echo "------------------------------------------------------------" --- ntop/Makefile.in.orig 2004-12-13 12:45:49.286054165 -0600 +++ ntop/Makefile.in 2004-12-13 12:46:19.055699948 -0600 @@ -1359,7 +1359,7 @@ install: install-recursive - @mkdir -p $(CFG_DBFILE_DIR) + @mkdir -p $(RPM_BUILD_ROOT)$(CFG_DBFILE_DIR) @echo "" @echo "------------------------------------------------------------" ntop-5.0.1+dfsg1/packages/RedHat/version.patch0000755000000000000000000000111010176215333017623 0ustar rootroot--- ntop/configure.in.orig Tue Jul 9 18:49:48 2002 +++ ntop/configure.in Tue Jul 9 18:50:04 2002 @@ -61,7 +61,7 @@ HAS_ERROR= HAS_WARNING= -NTOP_VERSION_EXTRA="" +NTOP_VERSION_EXTRA="SourceForge RPM" echo echo "Welcome to $PACKAGE_NAME, Version $PACKAGE_VERSION $NTOP_VERSION_EXTRA" --- ntop/configure.orig Mon Apr 14 17:54:20 2003 +++ ntop/configure Mon Apr 14 17:54:35 2003 @@ -1352,7 +1352,7 @@ HAS_ERROR= HAS_WARNING= -NTOP_VERSION_EXTRA="" +NTOP_VERSION_EXTRA="SourceForge RPM" echo echo "Welcome to $PACKAGE_NAME, Version $PACKAGE_VERSION $NTOP_VERSION_EXTRA" ntop-5.0.1+dfsg1/packages/Makefile.debian0000644000000000000000000000077010740213134016631 0ustar rootrootall: # # Remember to configure the package with --enable-mysql # rm -rf debian/tmp cd ..;make install install-data-as #cd ./debian/tmp; find usr -type d > ../dirs @find ./debian -name "*~" -exec /bin/rm {} ';' dpkg-buildpackage -rfakeroot #-d # -us -uc @\rm -f ../ntop*dsc ../ntop*.gz ../ntop*changes @/bin/mv ../ntop*deb . @echo @echo "Package built." @/bin/ls ntop*deb @echo "-------------------------------" -dpkg --contents ntop*deb @echo "-------------------------------" ntop-5.0.1+dfsg1/packages/debian.official/0000755000000000000000000000000012012127277016747 5ustar rootrootntop-5.0.1+dfsg1/packages/debian.official/prerm0000755000000000000000000000027610020377761020031 0ustar rootroot#!/bin/sh set -e if [ -x "/etc/init.d/ntop" ]; then if [ -x /usr/sbin/invoke-rc.d ] ; then invoke-rc.d ntop stop || true else /etc/init.d/ntop stop || true fi fi #DEBHELPER# ntop-5.0.1+dfsg1/packages/debian.official/README.Debian0000644000000000000000000000160210020377761021011 0ustar rootrootntop protocol list: =================== If you start ntop in daemon mode with the supplied init script it will automatically use /etc/ntop/protocol.list to choose which TCP Protocols should be monitored. The format of this file is simply:

" tag on the throughput graph. -------------------------------- 1.2a1 [Snapshot] Enhancements: - The list of MAC vendors is now based on http://standards.ieee.org/regauth/oui/oui.txt (Owner: Massimo Gais ) - Added support for 'special' (e.g multicast/vendors specific) MAC addresses (Owner: Bertrand Petit ) Fixed bugs: - Peer hosts now show up - Fixed bug that prevented the 'Last Contacted Peers' table to show up on hosts that have received but not sent any packet. - Traffic Thpt is now sorted properly (again) -------------------------------- 1.2a0 [Snapshot] Enhancements: - Added queso (http://www.apostols.org/) support. Now each host lists the OS that's *supposed* to run - red.gif is not included in ntop (so there's no need to necessarely have it on html/) (Courtesy of Hans Werner Strube ) - Porting to Digital Unix OSF/1 (Courtesy of Stephen Carr ) - Added '-e' flag, that allow users to specify the maximum number of HTML rows (default is 384) (Owner: Dennis ) -------------------------------- pre3-1.1 [Candidate Release] Fixed bugs: - the 'sh' varable is now set properly in the Makefile (Owner: Igor Schein ) -------------------------------- pre2-1.1 [Candidate Release] Fixed bugs: - Added Slackware '-d' support - Fixed $HOME bug (ntop used to core when $HOME isn't defined) (Owner: Richard L. Hamilton ) Enhancements: - Added OSI (on Ethernet, not IP) support -------------------------------- pre1-1.1 [Candidate Release] Fixed bugs: - Labels for 'Other IP' rows have been changed (Owner: Olaf Schnapauff ). - 'IP Traffic' tables can now be sorted (Owner: Olaf Schnapauff ). - Fixed a bug that caused ntop to process TR packets with a wrong (negative) length (Owner: Holger Marzen ) - Both '.ntop' and HTML pages are now searched on /etc/ntop and other dirs (see dirs[] on http.c). In addition '.ntop' is first searched under $HOME. (Owner: Cerqui Marco ) - AppleTalk fixes (Owner: Bertrand Petit ) -------------------------------- v1.1cr7 [Candidate Release] Fixed bugs: - Fixed minor interactive mode glitch. (Owner: David.Anthony ) - Added missing caption to a table contained on "IP Protocol Distribution" (Owner: Olaf Schnapauff ). - Fixed a bug in formatKBytes routine (GB/TB problem) (Owner: Olaf Schnapauff ). - OSPF and other columns in interactive mode are now sorted properly (again) - Added support for Slackware Linux - Bar labels in the "Throughput Stats" graph are now more readable - Added '-d' flag: ntop can now become a daemon. - Added SIGHUP support: ntop statistics are reset when the SIGHUP signal is received Enhancements: - The html/ directory is searched locally first and then under /etc/ntop/html and other dirs such as /usr/local/... opt/... - The makefile now can build new install packages for additional platforms -------------------------------- v1.1cr6 [Candidate Release] Fixed bugs: - Fixed a bug on broadcast addresses handling that caused ntop to crash (Owner: Olaf Schnapauff ). - Fixed a buffer overflow problem (Owner: Olaf Schnapauff ). - Fixed the default refresh time in interactive mode - Fixed a bug that caused ntop to crash after stats reset ('r' key on interactive mode) (Owner: ) - Added support for SunOS 4.x (Owner: Hermann Hueni ) - lib(n)curses is not checked if (n)curses.h has not been found (Owner: Dave Warner ) - Fixed a bug that prevented networks flows/traffic matrix entries to be updated properly. - Fixed a bug that caused lsof to create a costant increasing list of processes (this cased ntop to crash). - Fixed a bug that caused wrong values for "Other IP" counters to be returned. (Owner: Olaf Schnapauff ). - HTML links for ethernet addresses are now compatible with MS Explorer - Fixed (R)ARP bug: this is not IP but in some tables it belonged to IP (Owner: Olaf Schnapauff ). - ntop now recognizes the file 'index.html' if present in the html/ directory -------------------------------- v1.1cr5 [Candidate Release] Fixed bugs: - The optional BPF filter reported an error on the screen whenever a wrong filter was specified - Multicast stats no longer crash ntop (Owner: Olaf Schnapauff ). Enhancements: - Added host peak throughput (Owner: Olaf Schnapauff ). - Default thpt refresh is now 15 seconds (it used to be 120) - Added customisable HTML menu appearance - Added bytes on multicast stats - Added new checks (the argument must be a number) for flags that require numeric arguments --------- v1.1cr4 [Candidate Release] Fixed bugs: - HTTP passwd compatibility glitch fixed. - Fixed a bug that caused some URLs to crash ntop (Owner: Olaf Schnapauff ). - Fixed a compilation glitch with Slackware - Token Ring on AIX works now (Owner: Jean Paul LÛpez y Driessen ) - Fixed "IP Protocol Subnet Usage" entries (Owner: Olaf Schnapauff ). - The local domain name used to be empty on some not well configured hosts - The message "Dropping..." isn't displayed anymore. Instead of discarding addresses, they are kept in numerical form. (Owner: Davin Milun ) - Fixed cosmetic flaw (Owner: William R. McDonough ) - Removed a lot (if not all) of warnings (-Wall) - Added new ports (ssh,domain,login,nntp) to the default IP ports (Owner: Olaf Schnapauff ). - Network traffic is now counted on full packet size (ethernet packet) and not on the encapsulated packet/protocol length (Owner: Olaf Schnapauff ). - Added missing captions to several tables (Owner: Olaf Schnapauff ). - Fixed a problem with PPP (analog not ISDN) (Owner: Bill Swisher ). - Several lsof fixes have been included Enhancements: - Added RAW IP support --------------------------------- v1.1cr3 [Candidate Release] Fixed bugs: - Fixed bug that prevented some IP addresses not to be resolved to their symbolic name. - Fixed a problem that occurred during the parsing of the command line protocols (-l flag) - Fixed a nasty problem (pbuf.c, FIN/ACK handling) that caused some data structures to be corrupted. This problem caused the ntop crash. - Column sort works again - Fixed compatibility glitches with AIX and Solaris 2.x - ntop (interactive mode) no longer crashes when the help screen is displayed and no key has been pressed. (Owner: Igor Schein ) Enhancements: - The code is now Win32 friendly. - IP Traffic Matrix content has been redesigned. --------------------------------- v1.1cr2 [Candidate Release] Fixed Bugs: - ntop compiles properly on Solaris (Owner: Igor Schein ) - Lsof accounting now displays data correctly (Owner: Olaf Schnapauff ). - In some cases ntop didn't contain the HTTP header that might have caused problems with old M$ Explorer versions. (Owner: Felipe Tonioli ) - Non IP hosts (i.e. those that don't have an IP address) are now displayed again. They are considered as non-local hosts. Enhancements: - Added PPP interface support (Owner: Fabrizio Carrai ) - Lsof information is updated only if needed (i.e. if ntop receives a packet for a local port that is not yet known) and not more than once a minute. - configure allows to enable (default) or disable both lsof and threads support: - configure -enable-lsof=no - configure -enable-threads=no ----------- v1.1cr1 [Candidate Release] Fixed Bugs: - The 'q' key in MT/interactive mode works again (Owner: Felipe Tonioli ) - While symbolic addresses are resolved, the temporarely address is no longer '?' but the numeric one (with '*' around to indicate this special status) (Owner: Felipe Tonioli ) - Broadcast addresses for specified (-m flag) networks are now handled properly (Owner: Antonello Maiorca ) - Some combination of networks/netmasks were not handled properly (Owner: Axel Morhenn ) - Non IP-based hosts (e.g. IPX based) are being now displayed (Owner: Rick Morris ) - Added division by zero ckecks (Owner: Peter Marquardt ) Enhancements: - Added support (-m flag) for non IPv6 netmasks. Namely -m now accepts both 131.114.21.0/24 and 131.114.21.0/255.255.255.0 (Courtesy of Antonello Maiorca ) - Added new HTML menu entry 'Local Nw Usage' that keeps track of the traffic generated by local applications/users. This enhancement makes use of lsof (see FAQ). ----------- v1.1cr0 [Candidate Release] 14/01/1999 Enhancements (Multithread only): - All the main ntop functionality are now handled by threads - Address resolution (DNS) is now asynchronous - Semaphores (where available) are now used Fixed Bugs: - Minor interface changes - Added support for AIX, HP-UX ----------- v1.1a10 [Snapshot] Fixed Bugs: - Removed several warnings (-Wall) - Spawned child proceses should now be handled properly (no zombies anymore, I hope) - Fixed a typo that prevented ntop to compile in single thread mode - Fixed a bug that caused the time to be corrupted when ntop returns data from an interface from which packets have not yet been received - Removed a warning that was issued when ntop was unable to locate a fragment: the code looks good but sometimes a fragment is not located because ntop started capturing data after the first fragment was transmitted. -------- v1.1a9 [Snapshot] Fixed Bugs: - Thpt value now are shown properly Enhancements: - Added network flows (-F flag) - added multitrhead support -------- v1.1a8 [Snapshot] Tue Dec 22 16:27:33 CET 1998 Fixed Bugs: - The connection duration values have been fixed - Counters should now display correct values - The function that checked whether an address is a multicast was broken. - Local hosts are no longer purged: this caused the traffic matrix to have some problems when some hosts are purged. - The vendor name is now shown properly on interactive mode - The 'Hosts Info' page can now be properly sorted according to host IP address (Owner: Jerome.Le-Tanou@ujf-grenoble.fr) Enhancements: - Traffic is now counted using 64 bits counters - Some basic protocols are added to the ntop known services regardeless of their inclusion in /etc/services - X11 has been added to the default IP protocols - IP fragments are now handled properly. (Owners: Leon Verrall ). - The traffix matrix cells have a bg color (blue-green-red) depending on the cell traffic - All HTML tables entries have now some content (empty cells/rows aren't generated) - Added the list of the last 16 peers that exchanged data with a given host (Info about ...) - Added a "Multicast Stats" entry -------- v1.1a7 [Snapshot] Tue Dec 15 10:51:54 MET 1998 Fixed Bugs: - install-sh has the permissions set to 755 (Owner: of "David.Anthony" ) - Some #ifdefs are missing on BSD: they are now defined in ntop.h (Owner: James Ponder ) - The configure file resolves u_int (needed on SunOS 4.X) (Owner: Rich Kulawiec ) - The configure file now checks more strictly the presence of (n)curses - Fixed the pcap_XXX_version problem on BSD systems (Owner: James Ponder ) --------- v1.1a6 [Snapshot] Mon Dec 14 16:31:01 MET 1998 Fixed Bugs: - ntop core dump (idle sessions were not freed smoothly) Unfortunately, there are apparently other problems that might cause cores. Those problems are still under investigation. (Owners: David.Anthony and Leon Verrall ). - Fixed interactive-mode column display - Fixed a bug that prevented UDP sessions to show up properly (Info about ...) Enhancements: - '-m' flag has been added for specifying subnets whose traffic is considered local. (Owner: James Ponder ). - Added new links on table columns for sorting purposes - Added for each host (Info about ...) a table that shows the host traffic and a table that displays the uses for ports (0-1024) (Owner: Robert Greimel ) ---------------------------------------------- v1.1a5 [Snapshot] Fri Dec 4 10:47:16 MET 1998 Fixed Bugs: - Total traffic bars/stats: the counter should now be fixed. (Owner: Olaf Schnapauff ). - The function that prints the time should now work properly (Owners: "William R. McDonough" , "David.Anthony" ). - Fixed bugs that prevented some IP addresses to be converted to symbolic ones. - HTTP passwords non '\n'-terminated are now handled properly (Owner: Leon Verrall ) - Fixed some typos/problems in the man page (Owner: Robert Greimel ) - The log file is flushed once an entry is added (Owner: Robert Greimel ) - Pkts number (trafficStats.html) is now displayed correctly. - Fixed a bug in the traffic matrix table that prevented numeric hosts name to be shown properly. - Optimization of the HTML code generated for the matrix table resulting in smaller table size. - Fixed the vendor for "00:00:83" cards. - AppleTalk/IPX have been added to the web graphs (Owner: Ian Reinhart Geiser ) Enhancements: - Added per protocol global statistics - Added bandwidth column (Hosts Info entry) - Table columns can now be sorted by clicking on the column name link. - The '-r' flag can now be used to specify HTML page refresh rate (Owner: Robert Greimel ) - Added support for Netbios (over Ethernet), OSPF, IGMP. ---------------------------------------------- v1.1a4 [Snapshot] Fri Nov 20 01:08:47 CET 1998 Enhancements: - Added (hopefully) token ring support (Owner: Holger Marzen /Martin Olsson ). - Ability to sort (HTML mode) table columns - IP ports (-p flag) can be specified both in numeric and symbolic form - Added -f flag for reading tcpdump captured traffic (Owner: Matthew Franz ). - Fixed interactive mode column length (Owner: Davin Milun ) - Hosts/Connections idle for very long time will be flushed (Owner: "William R. McDonough" ). - Only active TCP connections are shown (no TIME_WAIT or FIN_ACK_1 status) (Owner: Lutz Vieweg ). Fixed Bugs: - Colored bar percentages are now shown properly (Owner: Olaf Schnapauff ). Implicitly Fixed Bugs: - Added support for IRC (ports 6667-7000 and 4400) (Owner: Thomas Marmetschke ). - Added Log facility and the ability to show hourly/daily/weekly traffic like MRTG (Owner: Kwon Soon Son ) ------------------------------------------------------------- v1.1a3 [Snapshot] ????? Internal Release ------------------------------------------------------------- v1.1a2 [Snapshot] ????? Fixed Bugs: - ntop.c:mapGlobalToLocalIdx Fixed bug that caused ntop to crash when the port to examine was not contained in the range 0 - TOP_IP_PORT. - Fixed bug that prevented time to be formatted properly ------------------------------------------------------------- v1.1a1 [Snapshot] ????? Fixed Bugs: - pcap.h is now located correctly - http page load is damn fast now - fixed minor bar/color/font glithes ------------------------------------------------------------- v1.0a0 [Snapshot] Fri Nov 6 00:16:30 CET 1998 Enhancements: - Added 1 minute, 5 minutes throughput - Added throughput mode in both interactive ('p' key) and web mode (Owner: Lutz Vieweg ). - The -p/-l flags have now different functionalities. - Removed -L(see -l)/-d flags (too many flags = too much mess) - Added counter for broadcast and multicast packets - Changed the log format (-l flag) Bugs supposed to have been fixed: - With very busy nets some HTML pages generated by ntop are empty. (Owner: Frank Heinzius ). - Fixed throughput formula (sometimes the thput value was wrong) (Owner: carlier.k@js.mil.be). - Added a check inside getHostInfo() that allows to find anyway and entry (the ancient one is purged in the worst case) and then that avoids to loop indefinitively. (Owner: Olaf Schnapauff ). - Some bars (web mode) didn't show percentages - The screen refresh (interactive mode) should display nicely: no lines too long anymore. (the screen width/resize bug is still open). ------------------------------------------------------------- v1.0 Mon Oct 5 16:21:54 CEST 1998 Enhancements: - Added support for further protocols (IP and non-IP ones). - The web interface has been redesigned - Added support for non IP protocols hence non IP hosts are identified with ethernet addresses ('n' key toggles addresses format: symbolic <-> numeric <-> MAC <-> Nw Board Vendor) - Added support for: NFS, Netbios (over Ethernet), X11, IPX, DLC/LLC, ARP/RARP, Decnet, AppleTalk. - Added column sort for the three last columns ('y' key) - Added log facility that records TCP/UDP sessions - Added an online help ('h' interactive command) (thanks to Peter Gervai ). Bugs fixed: - Fixed glith that caused ntop to create a lot of zombie processes when used in web mode. - Fixed bug that prevented TCP/UDP counters to show the corrected values - Fixed a but that prevented ntop to work properly on ethernet headerless interfaces such as the loopback interface (thanks to Martin Kammerhofer ). - Many fixes in both ntop and configure. This is to fix some glithes and make the package compatible with NetBSD. (thanks to Kimmo Suominen ). - Fixed a glitch that prevented ntop to compile under Solaris 2.5.x and SunOS 4.x (thanks to Peter Williams and Igor Schein ). ------------------------------------------------------------ v0.4 Mon Aug 3 12:49:01 CEST 1998 Enhancements: - Added web support '-w' flag. ntop can now be started in a 'daemon-like mode' and accessed using a conventional web browser. Bugs fixed: - modified some files for better compatibility with SunOS 4.X. (thanks to Pat Myrto ). ------------------------------------------------------------ v0.3.1 Fri Jul 31 10:01:44 CEST 1998 Bugs fixed: - some files contained the line #include "gnuc.h" instead of #include (gnuc.h is part of libpcap). (thanks to Daniel Ellis ). - the Makefile section related to the man page installation was broken (the Makefile was trying to instell ntop.1 instead of ntop.8). In addition the man page had a small typo. (thanks to Igor Schein ). - The code that calculates the network usage percentage is wrong: the data sent/received percentages are inverted. (thanks to Davin Milun ). - Fixed some problems that prevent ntop to compile nicely on BSD systems. (thanks to James Ponder ). ------------------------------------------------------------ v0.3 Thu Jul 30 11:48:05 CEST 1998 Bugs fixed: - In some cases the last column contained some junk trailer char. (thanks to Igor Schein ) Enhancements: - Whenever the user presses a valid key ('t' for instance), the screen update is now perfomed immediately. - The network interface being used is not shown on the first line. - Pressing the space bar while ntop is running, modifies the content of the last three columns. - A man page has been written. - ntop has been compiled against libpcap-0.4a7/ (thanks to Douglas Berry ) ------------------------------------------------------------ v0.2.2 Mon Jul 13 12:20:36 CEST 1998 Bugs fixed: - Non IP pkts value has been fixed (it was always zero). - Fixed hashtable bugs that caused ntop to stop working after some time of activity. ------------------------------------------------------------ v0.2.1 Fri Jul 10 10:07:56 CEST 1998 Bugs fixed: - Fixed some minor C problems (shown using the -Wall compile flag) - Fixed some minor glitches that show up on SunOS 4 Enhancements: - enhanced the way IP packets are handled (thanks to Paul D. Smith ) - Added the 'B' status flag to indicate a host that both sends and receives ------------------------------------------------------------ v0.2 Thu Jul 9 15:16:30 CEST 1998 Bugs fixed: - core dump when DNS takes a lot of time to resolve addresses Enhancements: - added "-p" flag: traffic can now be shown in percentage - added "-r" flag: refresh time setting - added "-d" flag: shows/hides idle (with respect to the last refresh) hosts (thanks to Rui Ataide ) - network throughput is now shown on the top-right corner - the new defaults are: show local hosts/hide idle hosts - the domain name is not shown for local hosts ------------------------------------------------------------ v0.1.1 Tue Jul 7 20:03:07 CEST 1998 Bugs fixed: - core dump when the terminal window is too large (> 80 cols) - ip_print: added cast to void* [this is supposed to fix byte alignment problems] (thanks to Paul D. Smith ) Enhancements: - added "-l" flag: ntop lists hosts that belong to the local subnet ------------------------------------------------------------ v0.1 Tue Jul 7 09:40:06 MET DST 1998 - Initial release. ------------------------------------------------------------ 1998 - Luca Deri ntop-5.0.1+dfsg1/THANKS0000644000000000000000000000337510646113301013111 0ustar rootrootv1.3 - the list for v2.0ff is included in the file "AUTHORS" _ _ _ | \ | | |_ ___ _ __ | \| | __/ _ \| '_ \ | |\ | || (_) | |_) | |_| \_|\__\___/| .__/ |_| Network Top -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- THANKS ====== Here is an unsorted list of people who contributed ideas, bugfixes, hints, etc: o Albert Chin-A-Young o Andrea Bettarini o Andreas Pfaller o Antonello Maiorca o Borja Marcos o Brian Bothwell o Daniel Savard o Danijel Doriae o David Masterson o Diana Eichert o F. Handel o Georg Schwarz o Igor Schein o Kimmo Suominen o Paul Chapman o Peter Marquardt o Rainer Tammer o Ralf Amandi o Robert Greimel o Roberto De Luca o Rocco Carbone o Roger Fujii o Stefano Suin o Wayne Roberts -------------------------------------------------- (C) 2007 - Luca Deri ntop-5.0.1+dfsg1/NetFlow/0000755000000000000000000000000012012127300013535 5ustar rootrootntop-5.0.1+dfsg1/NetFlow/docs/0000755000000000000000000000000012012127300014465 5ustar rootrootntop-5.0.1+dfsg1/NetFlow/docs/ntop-netflow-cisco.pdf0000644000000000000000000251541710244572252020750 0ustar rootroot%PDF-1.4 %äöÜß 1 0 obj << /Length 2 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 107 706.8 Td /F1 14 Tf <0102> Tj 18.9 0 Td <03> Tj 9.2 0 Td <04> Tj 9.8 0 Td <05> Tj 4.8 0 Td <03> Tj 9.2 0 Td <06> Tj 10.2 0 Td <05> Tj 4.8 0 Td <07> Tj 9.7 0 Td <08> Tj 8.7 0 Td <09> Tj 9.6 0 Td <030A> Tj 16.4 0 Td <0B> Tj 9.1 0 Td <05> Tj 4.8 0 Td <0C> Tj 10.9 0 Td <030A> Tj 16.4 0 Td <08> Tj 8.8 0 Td <05> Tj 4.8 0 Td <0D> Tj 9.6 0 Td <05> Tj 4.8 0 Td <0E> Tj 5.9 0 Td <030A> Tj 16.5 0 Td <05> Tj 4.8 0 Td <0C0F10> Tj 23.9 0 Td <11> Tj 8.4 0 Td <03> Tj 9.4 0 Td <05> Tj 4.8 0 Td <0C0B> Tj 19.8 0 Td <02> Tj 6.4 0 Td <0B> Tj 8.9 0 Td <12> Tj 5.3 0 Td <13> Tj 8 0 Td <10> Tj 7.7 0 Td <02> Tj 6.5 0 Td <05> Tj 4.8 0 Td <1415> Tj 19.1 0 Td <16> Tj 9.5 0 Td <17> Tj 9.5 0 Td <05> Tj 4.8 0 Td <180F02> Tj 23.4 0 Td <19> Tj ET Q q 0 0 0 rg BT 276.9 690.2 Td /F1 14 Tf <1A1B> Tj 20 0 Td <04> Tj 9.6 0 Td <1C> Tj 9.5 0 Td <1D> Tj 9.6 0 Td <16> Tj ET Q q 0 0 0 rg BT 242.7 673.4 Td /F2 8 Tf <01> Tj 5.3 0 Td <02> Tj 5 0 Td <03> Tj 4.9 0 Td <0405> Tj 8.3 0 Td <06> Tj 5.1 0 Td <07> Tj 4 0 Td <0408> Tj 7.6 0 Td <09> Tj 5.1 0 Td <04> Tj 2.6 0 Td <08> Tj 5 0 Td <08> Tj 5.1 0 Td <0A> Tj 2.7 0 Td <0B> Tj 5.1 0 Td <0C> Tj 5.1 0 Td <0A> Tj 2.7 0 Td <08> Tj 5.1 0 Td <09> Tj 5.4 0 Td <04> Tj 2.5 0 Td <0D> Tj 5.4 0 Td <0E> Tj 6.3 0 Td <01> Tj 5.6 0 Td <04> Tj 2.5 0 Td <0F> Tj 5 0 Td <0B> Tj 5 0 Td <0B> Tj 5 0 Td <10> Tj ET Q q 0 0 0 rg BT 266.5 664.1 Td /F2 8 Tf <11> Tj 5.1 0 Td <12> Tj 4.6 0 Td <04> Tj 2.5 0 Td <05> Tj 5.7 0 Td <13> Tj 5.2 0 Td <14> Tj 5.1 0 Td <07> Tj 3.8 0 Td <03> Tj 4.7 0 Td <15> Tj 7.1 0 Td <0416> Tj 8.8 0 Td <07> Tj 3.8 0 Td <17> Tj 2.6 0 Td <18> Tj 4.1 0 Td <19> Tj 3.2 0 Td <17> Tj 2.6 0 Td <13> Tj 5.2 0 Td <1A> Tj ET Q q 0 0 0 rg BT 227.2 654.7 Td /F2 8 Tf <19> Tj 3.2 0 Td <1B> Tj 5.1 0 Td <1A> Tj 4.7 0 Td <13> Tj 5.2 0 Td <1C> Tj 4.9 0 Td <18> Tj 4.5 0 Td <0419> Tj 5.7 0 Td <1D> Tj 5 0 Td <04> Tj 2.5 0 Td <1E> Tj 5.2 0 Td <02> Tj 5.1 0 Td <1F> Tj 4.5 0 Td <1A> Tj 4.9 0 Td <04> Tj 2.5 0 Td <0E> Tj 6.3 0 Td <03> Tj 4.7 0 Td <07> Tj 3.8 0 Td <17> Tj 2.7 0 Td <04> Tj 2.5 0 Td <1A> Tj 4.7 0 Td <13> Tj 5.1 0 Td <14> Tj 5.2 0 Td <04> Tj 2.5 0 Td <19> Tj 3.2 0 Td <1B> Tj 5.1 0 Td <03> Tj 4.9 0 Td <04> Tj 2.6 0 Td <13> Tj 5.1 0 Td <19> Tj 3.2 0 Td <1D> Tj 4.8 0 Td <06> Tj 5.3 0 Td <04> Tj 2.6 0 Td <19> Tj 3.2 0 Td <03> Tj 4.7 0 Td <1A> Tj 4.7 0 Td <20> Tj ET Q q 0 0 0 rg BT 90 604.3 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.8 0 Td <18> Tj 5.9 0 Td <04> Tj 3.8 0 Td <14> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.6 0 Td <02> Tj 7.6 0 Td <20> Tj 11.3 0 Td <03> Tj 7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <12> Tj 6.6 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.5 0 Td <14> Tj 7.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <19> Tj 4.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.8 0 Td <21> Tj 4.3 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj ET Q q 0 0 0 rg BT 90 590.3 Td /F2 12 Tf <03> Tj 7 0 Td <24> Tj 6.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <17> Tj 3.8 0 Td <19> Tj 4.7 0 Td <02> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <18> Tj 5.8 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <06> Tj 7.4 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.3 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.6 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <19> Tj 4.8 0 Td <1A> Tj 7 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <03> Tj 7.1 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <25> Tj 8.2 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <1A> Tj 6.9 0 Td <04> Tj 3.7 0 Td <26> Tj 9.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <0C> Tj ET Q q 0 0 0 rg BT 90 576.2 Td /F2 12 Tf <1E> Tj 7.9 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <02> Tj 7.6 0 Td <24> Tj 6.7 0 Td <27> Tj ET Q q 0 0 0 rg BT 125.5 548.1 Td /F2 12 Tf <28> Tj 12.2 0 Td <1B> Tj 7.5 0 Td <12> Tj 6.4 0 Td <04> Tj 3.8 0 Td <13> Tj 7.5 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.2 0 Td <06> Tj 7.3 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.3 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <1F> Tj 6.5 0 Td <19> Tj 4.8 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.7 0 Td <29> Tj 6.1 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <01> Tj 7.9 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <12> Tj 6.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.2 0 Td <1D> Tj 7.1 0 Td <22> Tj 3.7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 534.1 Td /F2 12 Tf <23> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.9 0 Td <07> Tj 5.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.8 0 Td <14> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <19> Tj 4.7 0 Td <1A> Tj 6.8 0 Td <04> Tj 3.8 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <2A> Tj 12.2 0 Td <2B> Tj 8.8 0 Td <01> Tj 7.9 0 Td <16> Tj 9.2 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 520 Td /F2 12 Tf <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <21> Tj 4.3 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <18> Tj 6.1 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <14> Tj 7.6 0 Td <15> Tj 10.1 0 Td <17> Tj 3.8 0 Td <14> Tj 7.5 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <13> Tj 7.5 0 Td <20> Tj 11.3 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <03> Tj 6.9 0 Td <07> Tj 5.6 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <26> Tj 9 0 Td <0D> Tj 7.9 0 Td <2D> Tj 9.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <20> Tj 11.3 0 Td <03> Tj 6.9 0 Td <20> Tj 11.3 0 Td <1D> Tj 7 0 Td <07> Tj 5.6 0 Td <12> Tj ET Q q 0 0 0 rg BT 90 506 Td /F2 12 Tf <02> Tj 7.7 0 Td <18> Tj 6.1 0 Td <1A> Tj 7 0 Td <23> Tj 7.6 0 Td <03> Tj 7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <2E> Tj 10.4 0 Td <1A> Tj 7 0 Td <23> Tj 7.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <18> Tj 5.9 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.4 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <14> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <2F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <11> Tj 7.6 0 Td <17> Tj 3.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <19> Tj 4.7 0 Td <12> Tj 6.7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <30> Tj 8.1 0 Td <12> Tj 6.7 0 Td <18> Tj 6.1 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <23> Tj 7.7 0 Td <17> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.8 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <14> Tj ET Q q 0 0 0 rg BT 90 491.9 Td /F2 12 Tf <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1D> Tj 7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.5 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <31> Tj 8.7 0 Td <05> Tj 8.5 0 Td <2B> Tj 8.6 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7.1 0 Td <22> Tj 3.7 0 Td <06> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <22> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <18> Tj 6.1 0 Td <18> Tj 6 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.7 0 Td <1A> Tj 7 0 Td <21> Tj 4.4 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <05> Tj 8.5 0 Td <13> Tj 7.6 0 Td <14> Tj ET Q q 0 0 0 rg BT 90 477.9 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <13> Tj 7.7 0 Td <17> Tj 3.7 0 Td <21> Tj 4.4 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <23> Tj 7.7 0 Td <17> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <12> Tj 6.4 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.8 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.3 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj ET Q q 0 0 0 rg BT 90 463.8 Td /F2 12 Tf <1F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <06> Tj 7.5 0 Td <19> Tj 4.7 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <2F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <02> Tj 7.7 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <1D> Tj 7.1 0 Td <22> Tj 3.8 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.7 0 Td <03> Tj 7 0 Td <22> Tj 3.7 0 Td <06> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.3 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 6.9 0 Td <20> Tj 11.3 0 Td <18> Tj 6 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 449.8 Td /F2 12 Tf <2E> Tj 10.4 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <2F> Tj 6.6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <1A> Tj 7 0 Td <22> Tj 3.7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <1D> Tj 7.1 0 Td <22> Tj 3.7 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <11> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 435.7 Td /F2 12 Tf <17> Tj 3.8 0 Td <20> Tj 11.3 0 Td <06> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <20> Tj 11.3 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.6 0 Td <03> Tj 7 0 Td <14> Tj 7.2 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <02> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <11> Tj 7.5 0 Td <22> Tj 3.8 0 Td <12> Tj 6.5 0 Td <04> Tj 3.8 0 Td <11> Tj 7.5 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <02> Tj 7.6 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <27> Tj ET Q q 0 0 0 rg BT 125.5 407.6 Td /F2 12 Tf <2E> Tj 10.4 0 Td <19> Tj 4.6 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <24> Tj 6.7 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <02> Tj 7.7 0 Td <20> Tj 11.2 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <07> Tj 5.7 0 Td <17> Tj 3.7 0 Td <32> Tj 6.3 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.8 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <19> Tj 4.6 0 Td <1D> Tj 7.1 0 Td <06> Tj ET Q q 0 0 0 rg BT 90 393.6 Td /F2 12 Tf <07> Tj 5.7 0 Td <03> Tj 7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <23> Tj 7.7 0 Td <17> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.5 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <14> Tj 7.5 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <20> Tj 11.2 0 Td <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <17> Tj 3.7 0 Td <03> Tj 7.1 0 Td <18> Tj 6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <2E> Tj 10.3 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.7 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <18> Tj 6.1 0 Td <18> Tj 6.1 0 Td <17> Tj 3.7 0 Td <21> Tj 4.4 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.7 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.3 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj ET Q q 0 0 0 rg BT 90 379.5 Td /F2 12 Tf <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.8 0 Td <04> Tj 3.7 0 Td <05> Tj 8.5 0 Td <13> Tj 7.6 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <06> Tj 7.4 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A22> Tj 10.9 0 Td <18> Tj 6.1 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.9 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.1 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.5 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <23> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.8 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <14> Tj ET Q q 0 0 0 rg BT 90 365.5 Td /F2 12 Tf <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.7 0 Td <1A> Tj 7 0 Td <21> Tj 4.4 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.8 0 Td <31> Tj 8.7 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6.1 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.3 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.2 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.7 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <06> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <22> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <18> Tj 6.1 0 Td <18> Tj 6 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj ET Q q 0 0 0 rg BT 90 351.4 Td /F2 12 Tf <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.2 0 Td <21> Tj 4.3 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.6 0 Td <15> Tj 10.2 0 Td <1D> Tj 7 0 Td <07> Tj 5.6 0 Td <1C> Tj 7.2 0 Td <18> Tj 5.7 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <06> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <13> Tj 7.6 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <13> Tj 7.6 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj ET Q q 0 0 0 rg BT 90 337.4 Td /F2 12 Tf <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <031A> Tj 14.1 0 Td <18> Tj 6.1 0 Td <17> Tj 3.7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <14> Tj 7.7 0 Td <02> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.6 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <02> Tj 7.6 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <27> Tj 3.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 289.8 Td /F3 18 Tf <49> Tj 7 0 Td <6E> Tj 9.9 0 Td <73> Tj 7 0 Td <74> Tj 6 0 Td <616C> Tj 14 0 Td <6C> Tj 5 0 Td <69> Tj 5 0 Td <6E> Tj 10 0 Td <67> Tj 9.1 0 Td <20> Tj 4.5 0 Td <6E> Tj 10 0 Td <74> Tj 6 0 Td <6F> Tj 9 0 Td <70> Tj 10 0 Td <20> Tj 4.5 0 Td <6F> Tj 9 0 Td <6E> Tj 10 0 Td <20> Tj 4.5 0 Td <6120> Tj 13.6 0 Td <46> Tj 11 0 Td <65> Tj 8 0 Td <64> Tj 10 0 Td <6F72> Tj 17 0 Td <61> Tj 9.1 0 Td <20> Tj 4.5 0 Td <43> Tj 13 0 Td <6F72> Tj 17 0 Td <65> Tj 8.1 0 Td <20> Tj 4.5 0 Td <3320> Tj 13.6 0 Td <53> Tj 10 0 Td <65> Tj 8 0 Td <72> Tj 8 0 Td <7665> Tj 17 0 Td <72> Tj ET Q q 0 0 0 rg BT 90 252.7 Td /F2 12 Tf <25> Tj 8.3 0 Td <17> Tj 3.8 0 Td <07> Tj 5.6 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <25> Tj 8.3 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <1A> Tj 6.9 0 Td <04> Tj 3.7 0 Td <26> Tj 9.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <0C> Tj 7.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <2F> Tj 6.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 224.6 Td /F2 12 Tf <25> Tj 8.3 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <18> Tj 6.1 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <20> Tj 11.2 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.6 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj 6.1 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1D> Tj 7 0 Td <13> Tj 7.7 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <15> Tj 10.1 0 Td <13> Tj 7.6 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <1A> Tj 7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <12> Tj 6.5 0 Td <04> Tj 3.8 0 Td <2B> Tj 8.9 0 Td <0D> Tj 7.9 0 Td <2A> Tj 12.1 0 Td <18> Tj ET Q q 0 0 0 rg BT 90 210.5 Td /F2 12 Tf <21> Tj 4.4 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.1 0 Td <04> Tj 3.8 0 Td <30> Tj 8.1 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.7 0 Td <07> Tj 5.6 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <23> Tj 7.5 0 Td <03> Tj 7 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 188.3 Td /F4 10 Tf <687474703A2F2F736F75726365666F7267652E6E65742F70726F6A6563742F73686F7766 696C65732E7068703F67726F75705F69643D3137323333267061636B6167655F69643D > Tj ET Q q 0 0 0 rg BT 90 177.2 Td /F4 10 Tf <3133323438> Tj ET Q q 0 0 0 rg BT 125.5 149.3 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <25> Tj 8.2 0 Td <26> Tj 8.9 0 Td <04> Tj 3.7 0 Td <0F> Tj 7.6 0 Td <04> Tj 3.7 0 Td <2B> Tj 8.9 0 Td <0D> Tj 7.9 0 Td <2A> Tj 12.2 0 Td <18> Tj 5.7 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <22> Tj 3.7 0 Td <22> Tj 3.9 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 7 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <25> Tj 8.2 0 Td <26> Tj 8.8 0 Td <04> Tj 3.7 0 Td <0C> Tj 7.5 0 Td <27> Tj 3.7 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <25> Tj 8.2 0 Td <03> Tj 7.1 0 Td <14> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <1A> Tj 6.9 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.7 0 Td <22> Tj 3.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <12> Tj ET Q q 0 0 0 rg BT 90 135.2 Td /F2 12 Tf <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <20> Tj 11.3 0 Td <06> Tj 7.5 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <17> Tj 3.7 0 Td <11> Tj 7.5 0 Td <22> Tj 3.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <11> Tj 7.5 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <1C> Tj 7.1 0 Td <15> Tj 10.2 0 Td <1A> Tj 7 0 Td <07> Tj 5.7 0 Td <14> Tj 7.3 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <15> Tj 10.2 0 Td <1A> Tj 7 0 Td <07> Tj 5.7 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <18> Tj 6 0 Td <17> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <33> Tj 4.6 0 Td <20> Tj 11.3 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.2 0 Td <02> Tj ET Q q 0 0 0 rg BT 90 121.2 Td /F2 12 Tf <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <18> Tj 6.1 0 Td <1C> Tj 7.1 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.8 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <34> Tj 4.6 0 Td <27> Tj ET Q Q endstream endobj 2 0 obj 29487 endobj 3 0 obj << /Length 4 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 708.8 Td /F2 12 Tf <01> Tj 7.9 0 Td <1D> Tj 7.1 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj 6.1 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <07> Tj 5.6 0 Td <06> Tj 7.6 0 Td <20> Tj 11.1 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.2 0 Td <1D> Tj 7 0 Td <19> Tj 4.8 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 683.6 Td /F4 10 Tf <72706D202D697668206E746F702A> Tj ET Q q 0 0 0 rg BT 90 658.6 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.6 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1A> Tj 7.1 0 Td <20> Tj 11.3 0 Td <06> Tj 7.5 0 Td <22> Tj 3.8 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.7 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.7 0 Td <21> Tj 4.3 0 Td <17> Tj 3.8 0 Td <23> Tj 7.6 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 633.4 Td /F4 10 Tf <6370202F6574632F6E746F702E636F6E662F73616D706C65202F6574632F6E746F702E63 6F6E66> Tj ET Q q 0 0 0 rg BT 90 608.4 Td /F2 12 Tf <35> Tj 8.7 0 Td <14> Tj 7.6 0 Td <17> Tj 3.8 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <19> Tj 4.6 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.6 0 Td <27> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <21> Tj 4.2 0 Td <04> Tj 3.7 0 Td <21> Tj 4.5 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <27> Tj ET Q q 0 0 0 rg BT 157.5 580.3 Td /F2 12 Tf <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.6 0 Td <1D> Tj 7.2 0 Td <06> Tj 7.3 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <06> Tj 7.5 0 Td <19> Tj 4.7 0 Td <02> Tj 7.7 0 Td <07> Tj 5.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <1C> Tj 7.2 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <37> Tj 3.6 0 Td <02> Tj 7.7 0 Td <18> Tj 6.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <1A> Tj ET Q q 0 0 0 rg BT 90 566.3 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.8 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <21> Tj 4.4 0 Td <1A> Tj 7 0 Td <1F> Tj 6.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <03> Tj 6.9 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj ET Q q 0 0 0 rg BT 90 552.2 Td /F2 12 Tf <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <22> Tj 3.8 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <03> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1B> Tj 7.6 0 Td <03> Tj 7.1 0 Td <22> Tj 3.7 0 Td <06> Tj 7.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <15> Tj 9.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.4 0 Td <21> Tj 4.4 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <06> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <19> Tj 4.7 0 Td <03> Tj 6.9 0 Td <07> Tj 5.6 0 Td <13> Tj 7.6 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <15> Tj 10.1 0 Td <1B> Tj 7.7 0 Td <03> Tj 6.9 0 Td <13> Tj 7.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1A> Tj 7 0 Td <06> Tj 7.6 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 538.2 Td /F2 12 Tf <18> Tj 6.1 0 Td <06> Tj 7.6 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <1A07> Tj 12.8 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <38> Tj 3.2 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <0322> Tj 10.8 0 Td <06> Tj 7.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <2F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <39> Tj 4.8 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <06> Tj 7.6 0 Td <12> Tj 6.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <3A> Tj 6 0 Td <3B> Tj 10 0 Td <29> Tj 6.3 0 Td <04> Tj 3.7 0 Td <3C> Tj 4 0 Td <3C> Tj 3.9 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <21> Tj 4.4 0 Td <1A> Tj 7 0 Td <1F> Tj 6.7 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 524.1 Td /F2 12 Tf <13> Tj 7.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <3D> Tj 5.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <2C> Tj 3.7 0 Td <04> Tj 3.8 0 Td <19> Tj 4.6 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <20> Tj 11.3 0 Td <1D> Tj 7 0 Td <2F> Tj 6.7 0 Td <03> Tj 6.7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <3A> Tj 6.1 0 Td <3B> Tj 10 0 Td <29> Tj 6.3 0 Td <3D> Tj 6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.3 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.6 0 Td <18> Tj 5.7 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <03> Tj 7.1 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 498.9 Td /F4 10 Tf <2D2D696E74657266616365206E6F6E65> Tj ET Q q 0 0 0 rg BT 125.5 473.3 Td /F2 12 Tf <2E> Tj 10.4 0 Td <03> Tj 7 0 Td <24> Tj 6.6 0 Td <19> Tj 4.7 0 Td <2C> Tj 3.4 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <23> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <3A> Tj 6.1 0 Td <3C> Tj 3.9 0 Td <20> Tj 11.1 0 Td <04> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.7 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <13> Tj 7.5 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <18> Tj 6 0 Td <3D> Tj 5.7 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <1F> Tj 6.6 0 Td <22> Tj 3.8 0 Td <02> Tj 7.6 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.6 0 Td <15> Tj 10.2 0 Td <1D> Tj 7 0 Td <07> Tj 5.6 0 Td <1C> Tj ET Q q 0 0 0 rg BT 90 459.3 Td /F2 12 Tf <1A> Tj 7.1 0 Td <14> Tj 7.6 0 Td <14> Tj 7.6 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <18> Tj 6.1 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.3 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <1B> Tj 7.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <22> Tj 3.8 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <07> Tj 5.6 0 Td <03> Tj 7.1 0 Td <23> Tj 7.5 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <01> Tj 8 0 Td <1B> Tj 7.6 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <24> Tj 6.7 0 Td <1A> Tj 7 0 Td <20> Tj 11.3 0 Td <06> Tj 7.5 0 Td <22> Tj 3.8 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <1F> Tj 6.7 0 Td <22> Tj 3.8 0 Td <02> Tj 7.6 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 445.2 Td /F2 12 Tf <08> Tj 7.6 0 Td <0B> Tj 7.5 0 Td <27> Tj 3.7 0 Td <24> Tj 6.6 0 Td <27> Tj 3.7 0 Td <24> Tj 6.7 0 Td <27> Tj 3.6 0 Td <24> Tj 6.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.6 0 Td <15> Tj 10.2 0 Td <1D> Tj 7 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <02> Tj 7.7 0 Td <22> Tj 3.7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7 0 Td <18> Tj 6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.4 0 Td <21> Tj 4.3 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 423 Td /F4 10 Tf <2D6D2031302E302E302E302F382C3232342E302E302E302F34> Tj ET Q q 0 0 0 rg BT 90 398 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.8 0 Td <18> Tj 5.9 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <22> Tj 3.8 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.5 0 Td <03> Tj 7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7.1 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <03> Tj 7 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.7 0 Td <23> Tj 7.6 0 Td <04> Tj 3.7 0 Td <2117> Tj 8.3 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <27> Tj 3.7 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <26> Tj 9.1 0 Td <1B> Tj 7.5 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 384 Td /F2 12 Tf <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.7 0 Td <21> Tj 4.3 0 Td <17> Tj 3.8 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.7 0 Td <23> Tj 7.5 0 Td <1B> Tj 7.6 0 Td <22> Tj 3.8 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.8 0 Td <20> Tj 11.2 0 Td <1A> Tj 7.1 0 Td <1C> Tj 7.1 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <02> Tj 7.7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.8 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <04> Tj 3.7 0 Td <07> Tj 5.6 0 Td <03> Tj 7.1 0 Td <21> Tj 4.4 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <1F> Tj 6.5 0 Td <19> Tj 4.7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.8 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.7 0 Td <27> Tj ET Q q 0 0 0 rg BT 125.5 355.9 Td /F2 12 Tf <31> Tj 8.7 0 Td <03> Tj 7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <02> Tj 7.6 0 Td <13> Tj 7.7 0 Td <13> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <19> Tj 4.8 0 Td <02> Tj 7.6 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.6 0 Td <20> Tj 11.3 0 Td <17> Tj 3.7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <06> Tj 7.7 0 Td <1A> Tj 7 0 Td <18> Tj 6.1 0 Td <18> Tj 6 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <14> Tj 7.5 0 Td <27> Tj 3.5 0 Td <04> Tj 3.8 0 Td <01> Tj 7.9 0 Td <1B> Tj 7.6 0 Td <17> Tj 3.8 0 Td <18> Tj ET Q q 0 0 0 rg BT 90 341.8 Td /F2 12 Tf <06> Tj 7.7 0 Td <1A> Tj 7 0 Td <18> Tj 6.1 0 Td <18> Tj 6 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <14> Tj 7.3 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <04> Tj 3.8 0 Td <11> Tj 7.5 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <02> Tj 7.6 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <03> Tj 6.9 0 Td <11> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <21> Tj 4.3 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.8 0 Td <04> Tj 3.7 0 Td <2B> Tj 8.9 0 Td <02> Tj 7.6 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj ET Q q 0 0 0 rg BT 90 327.8 Td /F2 12 Tf <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <20> Tj 11.2 0 Td <20> Tj 11.2 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.3 0 Td <06> Tj 7.5 0 Td <19> Tj 4.7 0 Td <18> Tj 6 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 302.5 Td /F4 10 Tf <2F7573722F62696E2F6E746F70202D50202F7573722F73686172652F6E746F70202D7520 6E746F70202D41> Tj ET Q q 0 0 0 rg BT 90 277.6 Td /F2 12 Tf <0E> Tj 9.5 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.6 0 Td <02> Tj 7.6 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <18> Tj 6 0 Td <15> Tj 10.2 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <14> Tj 7.6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <36> Tj 4.6 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <1A> Tj 7 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.7 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <23> Tj 7.6 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <15> Tj ET Q q 0 0 0 rg BT 90 263.5 Td /F2 12 Tf <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <20> Tj 11.3 0 Td <06> Tj 7.5 0 Td <22> Tj 3.8 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 235.4 Td /F2 12 Tf <36> Tj 4.6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.8 0 Td <17> Tj 3.7 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <20> Tj 11.2 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <19> Tj 4.7 0 Td <1A> Tj 7 0 Td <07> Tj 5.6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.3 0 Td <04> Tj 3.8 0 Td <33> Tj 4.6 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <20> Tj 11.2 0 Td <20> Tj 11.2 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.5 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <2B> Tj 8.9 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <1B> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <3E> Tj 3.8 0 Td <25> Tj 8.2 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <1A> Tj 6.8 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <1F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj ET Q q 0 0 0 rg BT 90 221.4 Td /F2 12 Tf <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <2F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <11> Tj 7.7 0 Td <22> Tj 3.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.9 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <2217> Tj 7.6 0 Td <13> Tj 7.7 0 Td <02> Tj 7.6 0 Td <24> Tj 6.6 0 Td <04> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <17> Tj 3.8 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <18> Tj 6 0 Td <34> Tj 4.6 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 199.1 Td /F4 10 Tf <2F6574632F696E69742E642F6E746F70207374617274> Tj ET Q q 0 0 0 rg BT 90 185.2 Td /F2 12 Tf <1D> Tj 7.2 0 Td <07> Tj 5.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 174 Td /F4 10 Tf <73657276696365206E746F70207374617274> Tj ET Q q 0 0 0 rg BT 90 149.1 Td /F2 12 Tf <2E> Tj 10.4 0 Td <03> Tj 7 0 Td <24> Tj 6.7 0 Td <19> Tj 4.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <1C> Tj 7.1 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <18> Tj 5.7 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <33> Tj 4.5 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <20> Tj 11.2 0 Td <20> Tj 11.2 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <14> Tj 7.6 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 135 Td /F2 12 Tf <2B> Tj 8.9 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <1B> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <3E> Tj 3.8 0 Td <25> Tj 8.2 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <1A> Tj 6.8 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <1F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <2F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.9 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <02> Tj 7.6 0 Td <24> Tj ET Q q 0 0 0 rg BT 90 121 Td /F2 12 Tf <2F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <17> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <18> Tj 6 0 Td <34> Tj 4.6 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 98.7 Td /F4 10 Tf <63686B636F6E666967206E746F70206F6E> Tj ET Q Q endstream endobj 4 0 obj 23761 endobj 5 0 obj << /Length 6 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 125.5 708.8 Td /F2 12 Tf <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <17> Tj 3.8 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <03> Tj 7.1 0 Td <14> Tj 7.5 0 Td <18> Tj 6 0 Td <2C> Tj 3.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.8 0 Td <1D> Tj 7 0 Td <06> Tj 7.4 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <19> Tj 4.8 0 Td <1A> Tj 7 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <02> Tj 7.6 0 Td <13> Tj 7.6 0 Td <13> Tj 7.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <07> Tj 5.6 0 Td <03> Tj 7.1 0 Td <1F> Tj 6.5 0 Td <19> Tj 4.8 0 Td <22> Tj 3.6 0 Td <12> Tj 6.7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <26> Tj 9 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <1F> Tj 6.5 0 Td <1C> Tj 7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj ET Q q 0 0 0 rg BT 90 694.8 Td /F2 12 Tf <18> Tj 6.1 0 Td <03> Tj 7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.7 0 Td <04> Tj 3.8 0 Td <13> Tj 7.5 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.2 0 Td <06> Tj 7.3 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <03> Tj 7 0 Td <11> Tj 7.3 0 Td <04> Tj 3.7 0 Td <06> Tj 7.7 0 Td <1A> Tj 7 0 Td <23> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <11> Tj 7.5 0 Td <03> Tj 7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <2F> Tj 6.6 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <2D> Tj 10 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <15> Tj 10.1 0 Td <03> Tj 7 0 Td <11> Tj 7.4 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.1 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <07> Tj 5.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <23> Tj 7.6 0 Td <1D> Tj 7 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj ET Q q 0 0 0 rg BT 90 680.7 Td /F2 12 Tf <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <2F> Tj 6.7 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <38> Tj 3.2 0 Td <18> Tj 5.8 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <06> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.5 0 Td <14> Tj 7.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <13> Tj 7.5 0 Td <1A> Tj 7 0 Td <20> Tj 11.3 0 Td <03> Tj 6.7 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <06> Tj 7.6 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <0C> Tj 7.5 0 Td <0B> Tj 7.5 0 Td <0B> Tj 7.5 0 Td <0B> Tj 7.3 0 Td <04> Tj 3.7 0 Td <33> Tj 4.7 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.6 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 666.7 Td /F2 12 Tf <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <03> Tj 6.9 0 Td <11> Tj 7.6 0 Td <18> Tj 6 0 Td <03> Tj 6.9 0 Td <07> Tj 5.6 0 Td <2F> Tj 6.6 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <22> Tj 3.9 0 Td <17> Tj 3.7 0 Td <18> Tj 6.1 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.8 0 Td <0C> Tj 7.5 0 Td <0B> Tj 7.5 0 Td <0B> Tj 7.5 0 Td <0B> Tj 7.2 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <23> Tj 7.6 0 Td <02> Tj 7.7 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.9 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <2C> Tj 3.7 0 Td <04> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 652.6 Td /F2 12 Tf <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.5 0 Td <34> Tj 4.6 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 627.4 Td /F4 10 Tf <687474703A2F2F6E746F702E646F6D61696E2E6C6F63616C3A33303030> Tj ET Q q 0 0 0 rg BT 90 586 Td /F1 12 Tf <0C> Tj 9.5 0 Td <03> Tj 7.8 0 Td <06> Tj 8.7 0 Td <0E> Tj 5 0 Td <0F> Tj 4.5 0 Td <1E> Tj 8.3 0 Td <1B> Tj 8.6 0 Td <0A> Tj 6.2 0 Td <0F> Tj 4.5 0 Td <06> Tj 8.6 0 Td <1E> Tj 8.1 0 Td <05> Tj 4.1 0 Td <01> Tj 10.9 0 Td <1F> Tj 8.7 0 Td <20> Tj 10.3 0 Td <21> Tj ET Q q 0 0 0 rg BT 90 552.2 Td /F2 12 Tf <01> Tj 7.9 0 Td <1D> Tj 7.1 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.7 0 Td <21> Tj 4.3 0 Td <17> Tj 3.8 0 Td <23> Tj 7.6 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.8 0 Td <21> Tj 4.3 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.7 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <02> Tj 7.6 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <03> Tj 7 0 Td <11> Tj 7.3 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.1 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <33> Tj 4.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <07> Tj 5.6 0 Td <0321> Tj 11.5 0 Td <1D> Tj 7.1 0 Td <24> Tj ET Q q 0 0 0 rg BT 90 538.1 Td /F2 12 Tf <15> Tj 10.2 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 7.2 0 Td <18> Tj 6 0 Td <34> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <13> Tj 7.6 0 Td <03> Tj 6.9 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <2F> Tj 6.6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 512.9 Td /F4 10 Tf <687474703A2F2F6E746F702E646F6D61696E2E6C6F63616C3A33303030> Tj ET Q q 0 0 0 rg BT 90 487.9 Td /F2 12 Tf <05> Tj 8.6 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <14> Tj 7.7 0 Td <21> Tj 4.4 0 Td <2C> Tj 3.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.6 0 Td <17> Tj 3.7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <1F> Tj 6.7 0 Td <02> Tj 7.6 0 Td <20> Tj 11.3 0 Td <03> Tj 6.9 0 Td <13> Tj 7.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <1F> Tj 6.6 0 Td <22> Tj 3.8 0 Td <02> Tj 7.6 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <1C> Tj 7.1 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <03> Tj 7.1 0 Td <1A> Tj 7 0 Td <18> Tj 6.1 0 Td <17> Tj 3.8 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj ET Q q 0 0 0 rg BT 90 473.9 Td /F2 12 Tf <02> Tj 7.7 0 Td <13> Tj 7.6 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <18> Tj 6 0 Td <19> Tj 4.6 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <24> Tj 6.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <2117> Tj 8.3 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <18> Tj 6.1 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.7 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 445.8 Td /F2 12 Tf <26> Tj 9.1 0 Td <22> Tj 3.8 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1C> Tj 7 0 Td <04> Tj 3.7 0 Td <05> Tj 8.5 0 Td <14> Tj 7.6 0 Td <20> Tj 11.3 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <0A> Tj 3.8 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <02> Tj 7.7 0 Td <23> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <33> Tj 4.6 0 Td <19> Tj 4.7 0 Td <12> Tj 6.7 0 Td <06> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <03> Tj 6.9 0 Td <11> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.6 0 Td <20> Tj 11.3 0 Td <17> Tj 3.7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <18> Tj 6 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <14> Tj 7.5 0 Td <34> Tj 4.6 0 Td <27> Tj 3.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 417.7 Td /F2 12 Tf <05> Tj 8.6 0 Td <14> Tj 7.5 0 Td <20> Tj 11.3 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <3C> Tj 3.8 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <02> Tj 7.7 0 Td <23> Tj 7.6 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj ET Q Q q 109.2 81.5 405.7 297.1 re W* n q 405.7 0 0 349.9 109.2 64 cm /Im7 Do Q Q endstream endobj 6 0 obj 11413 endobj 7 0 obj << /Type /XObject /Subtype /Image /Width 1270 /Height 930 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 96856 >> stream ÿØÿàJFIFÿÛC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÛC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÀ¢ö"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ï袹]%í®nî…Ôº³Ü ù‘J=×”…_?ZꨮR=emî–öO<[Åixí”ÈX¤ê¹çñÇ 8éZºF³ý£s-»E¼h²Š_1H$Œgc§¸æ€5¨¢Š(®OÂÏkua§Ë4ºÄ—ŒŠÌî÷^[7^Iùý*{ÍZâêM>h#òìšùãÞ&!åÚ’‚ ÷r¤õì8 –ŠÀÑ5;»»Ø ¢Ú6À/3<€¾î¤˜ñ޽³ß~€ (®dÞ\Ái¨i^|†ð\ˆmäf%¶Jr­ŸöAoûâ€:j+ž}r+¸„#>ÛötóîÒDJÅ‹vŒvóõ4‰â€Ñ;}Œ—ò£Q&D²,6©ÇBY0Úé@›¥j˪a‹lb¤,[£8'n1Øcó­*(¦O'•’ãvÅ-\ ç-Þm×TÖ5‹ˆ$»E“ÌûcBˆXd*®Bð=Aô‘xzÖ;Im¼û†Il…‘,ˑ݌qÔ#>Ãß:ÛÛ“ôÿ 6ÿ·'éþB-&;um.®-ÄìˆÊáXu #žýªm:Â=>)V7’FšC,&2Ì@à8 goûr~ŸáFßöäý?€Q\JðÀÒG“°Æ#Œ¨fç¶âëOÛþÜŸ§øQ·ý¹?Oð  k;pð\ióiéoxò¼¯;ÂTo%ˆùœdà`HÞ¶”9º¹º¸”¢¢K#.è‚°a·sNIÇ5«·ý¹?Oð£oûr~Ÿá@‘hVéx—’\\Mt²y†W+–ù 0`j[M-mïä·W3ù~R´»>UÈ8ùTg:æ¯mÿnOÓü(ÛþÜŸ§øP¨¦íÿnOÓü(ÛþÜŸ§øP‰Æ›{cý‹ªùW3H|ËmÃÌ$¶?yîqVÓMóÌwq½îpc:†Œ³*“à ½ÉsÏáZ›Û“ôÿ 6ÿ·'éþ‹{¡»ÉYÜÍñu4™RËû“Ë•#û½AêkJÂÆ+^8Ùݤs$’9Ë;¤ãNž•coûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€”2•aF Uû#"Ç!s½Oz³·ý¹?Oð£oûr~Ÿá@ ‚‚=‰œg94S¶ÿ·'éþP©’ʱ.[$žIö¥rÊŒUw0êjоìÈ[sž Æ6ûcµX†YáÒM m íÉ ±Yr8Ý1Tu‘_µ&ÔTʶv¨é@TS&i&hHàp¥¶çñ¦ZË,Ð,“Cä³rvHü~”5ErÌ–Òºœ2¡ ûâ›z·Á‚éÞTˆÇXãÿ¾ZŽbE6ô :7ÿ_Ú§¬©%,HÆíÝA«v3<•²Ê¿uÏo|zЪ*©e†’|æ^JnÁ#ÛÒŸ HÑ+J‚7#• »$ò¤I4‡ –cì+››Ró¥{ÅÉâ%¸òÂ{$úäþ©®y“B,cE>r–f2”Ú—ÑO\ÖU¬Îê(ÖÎ×ÍœGØ;œúgšì¡óµs’´¹¥È‹q=Ôc\º:LL«õÉ9Ï㊿£™ ›,²¼¬’È»Üäœ9¬ºm># ]ZKå“ÂÛ±,Ç®0øþ•ÑéÖïolD®®îìå•v˜“Ó'ÖŒG/.E‡SRjOBÝSšc) m¤ñ´òçÛÚ®Ve¹“0ù?hÇåßÚ¸ÎÀ˜áLÄúlÿ:µmq¿ç$ýÖþ÷ÿ^¬K÷eû6Ï?v:Ö]±ÿH¯ßïô4«PÜN° È,ìpˆ:±©«7WŠW6Ílþ\áÙU»ci$Ü¢¦\Ö|»Zú‘È®Nùg”Êy>\¬¨¾ÀtÀõ?ýj¥©qm?œÏ$Öƒ¼Ê?¾09ޜՋh®/ÜÁ<"¸óprÐAÇ5jÒ].êúãN·œ¼ñλ[ ·å8$c©®L-©¹Vzö4©8袋èÊè2°È#¡Þ|Ž t–WF·kh®#ó F.$¦8@Œn*Õßúÿ]ÿBÚdZþ͇þz\ßæÿ­*XDò£OtÍÂ<ŽFz3Ï|uÁ¸­Guä`¨ –f8zšå!Ö´ËC:KxLEÞt™Õ‚È$vm«‘ÉRv3ŒùN7´ˆªçóE\ßt%œƒÐùÍþ4¿Ù°ÿÏKûüßãT|/r/lîîãYV nœÃ¼ü¥@Q•‚qêZ¨¶±wc¬êÅ­Þ{D½·ˆ»M(H‘( ¸9ù›$q×½'uvnfÃÿ=.?ïóÙ°ÿÏKûüßãXkšÓý—6Ö_½Õ%´?¾oº¾gs¹×¾: ñn?ÎÓƒ&›²Ìß5ç‚w‡(Ü}Ò@ïÆ{õ f§öl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5Zîk™fÒíXyM'›:Ç!;QHÝ‘¸ è2 dÞËs&€ºª^ÜÆe¾ãT…14ÈŠ>…9Àã,hû6ùéqÿ›ühþ͇þz\ßæÿÈÔŒ÷º¾£n.î-ÒÆÉ%‹Ê¦drÿ1ÇÞ`àärx­;UÐ-&’I!{«xäfˆíe$qéé@fÃÿ=.?ïóÙ°ÿÏKûüßã\õÝÕÖá›y.f ¨Ì$!Ø™ÈÜ9•#žµ©¡Üʶڔ2¼“ ©"·3(Up îFìdúPßìØç¥Çýþoñ£û6ùéqÿ›ükŸÒ'ºü?u%Üó6­5Â<…SÂãxÇ^j÷‰ãq½•ÍÒêR–‘G3,I( Ô°OÚd€à6:]r°Cþ˜ÛJh…Ê»°YC+½xÏLÿ. Kì6ÿôñÿRÿñTÍ-‹Y|Ì͉ePY‹`O=+7DÔµ]ZìÜIh¶V1£“,òIžpp1Œc§¨çøttŸøò?õÚ_ýÔåH…£ÜÌn\ùæ0±ÊFrûGp;ŠŽê{2ßÚ`' ’í?›Ô­ÿ ¯û~ÿG­GáfIôÇ¿“æydóÜõX€§ÐzÑA8sy™¶ù¬‡ÃöY^ð,ìU$û@e'ioácؽý›üô¸ÿ¿Íþ5B9tÙn¬›L{wV¼g”ÂAŒ2dœwâ¤ñTó[hO5¹H³Û嶃2÷Ƴµ›F¼¶Ißrßöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5A5Éü›Á5­­½Å¤ë ¬×{c;0;öú0ãk5¨ÏDCÅ»hé·ªÿõªß˜¾ÿ|š<ÅôoûàÖf†X+nS '©ÙþUrÖÛnÆû£Óÿ¯V<ÅôoûàÑæ/£ß€P]ÂÓF¦6Û$m¹ éœ϶ '˜¾ÿ|š<ÅôoûäÐ[+Ø!2­Óeã(Ý{ò=EdiY´×nïE¼Î’™Bí\¹ÁqØW@Z2rPŸªð :ŠÃþÂÅbÂ9Ô©y]ð{ÄÿZ}ßúÿ]ÿB'˜¾ÿ|G1º•t,§¨(HþT†Aâm"÷Y´Kk[ñkx6nßÈ÷ì2qÜã¦3MÒ|)¤i¶KnÖ‘]>>ygŒ9cô9Ç^߯Z“È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ¥e{É´‘®Š¨Šˆ¡UF€¥gO¢ZÏöÍòL>ÙóCŠð‡’îée0}ži#eS<~òàu<¨dãatóN–÷—0¬ØD@@Ê@ç=j§‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@‚ *ßO—n¶®¯m+ß Q‚Æzƒœš±g¤ÇfÑ®nNÖ‘ä ûã,ürF8ƪþE§üû'ýùÿëQäZϲߟþµøvÚ"º»UŽ7ŽÙw®-Cõ)Ç_MÙÇN”³èFKñ{«¨A0`ÊŽTÿIä㯞E§üû'ýùÿëQäZϲߟþµIw¡ZÝ]É3Ë:¤Ì<ÃdÅ1´·ìdœÔ‹¥!Ô’úâêæáâ.aI „‡wTÇ“ÅWò-?çÙ?ïÏÿZ"Óþ}“þüÿõ¨ÅΘ÷6‘ÛJõ¡I n˜gvW¯ºã©¨n|?i2ÆË=ª­¸µa¾ÑAéÏ#“Í7È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ Máë)ffWš(dòüÛxÈ˳w g€àŒ€3šŠóñÊ'k{™£.ï4q QÌÀ3ÎrIÆqžqOò-?çÙ?ïÏÿZ"Óþ}“þüÿõ¨VRÞÞ8"c‰B(ô`SëÈ´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  Š+È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  ŠÀÑF‘XšN§þš5OäZϲߟþµFltâI6y$Ûð  {ÓûëùÕM'þ<ýv—ÿF5`Óèþð«aŒG ^ZбáŠH ’ãMt‹nõºóã€vÊü*¿öEÔw“]Y1³iÎéRQÛûÛZ"÷©ŒV¬ÅšÝI'$˜ºþ”žE§üû'ýùÿëSR’Ñ2\nîfêžÕ.ì%ŽÏQžÒñä3}¥/w6иeDPA £Ôuä+]#ÐãÓnï¯.ØH’Éq,¥ÝY[ÙÂå@Àíï“G‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­KW«VVsáûyîä»[›˜nán‘²åGåð ‘‚¾¹ëQAá{ƒ£ÉqÉÿ~úÔyŸóìŸ÷çÿ­@V?‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@V?‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@V?‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@V?‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@V?‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@V?‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@³ÿ(?ëšÿ*)ÁÑT*«xý(  LÒ¼÷ÝNŠ’ìU`lCÝIêÆ¡»ºK8„—:…â!m â3ÏáµL?ÖÝÿ×ÏþÒŽ¹MfEÕµµ±cþ‹³NØ\yž‡žŽyÈªŠ¹•Y¸­7gS™cY"¿ºtpYZ"„. ¸Ô-mdÜë/ ‡²M“ø¨ôýZÓPfHX¬Š3å¾ê=¹¬û¸®,n/ïle³¸‰Ï™qüBÃŽœÁš¶åÆJJëci%#FšË:¨fPÑdœõ}ð*~$ÿŸÛÏÎ/þ7\Ú_Æ.ïnÁ–=­Ÿ–T¸._ÆyLJðãŠÖ’QA.£r†FØ›š¹½îù<Pù”Ä5 ¯1T1MÑdœy}8?•cøšÑo—N¶fdßwéåHŠBú fŪ]$ºµËÄ>ÝeaJ˜ãz´‡?Bo¡ ³Ïíççÿ£Ïíççÿ®mïµKHEÜó1³V‰Ùäò‹-µñ³¸ úñÖ—KÕ5 ›èí'p²×$lTý±ž¿-tx“þo?8¿øÝFÓ¢N>¥p³H HË€볚ÊÑ®®þÔmu)g7F/3i˜˜dÈTg#†æªê2Íe­jw°ÈîÐé©"ÄBíÎé=³Ž3×¹öÀG‰?çöóó‹ÿщ?çöóó‹ÿ×1¨Y±·ƒPóÚH¢‘fhÓä-2'@*Cgž:Ö®¯-Õ–º ŒÜ "A+ 9Ý"©$:Ò€4±'üþÞ~qñº1'üþÞ~qñºæ'Ôµ{§±óÞSöÁœ,jáLAð26ç'#ó5f)õf¾°´¸¸òK‰ÚL*3:«&Üã€pØ8÷öÀö$ÿŸÛÏÎ/þ7F$ÿŸÛÏÎ/þ7LYá}›%Fó)†pqëNGI¹©œœUѾ”jÍBN×ò¹ÐâOùý¼üâÿãtÇ”Fè¨Ü«ÈpŠZXã<~ïž+‘óï¯-%¿‚yüˉŒvö‘\S ËO=¸àÛwvöÆY´⸔ ËxÖA2’vÊ£ï òFsõ”gÌU|:¤–ºöþ¼ôùBLÊb…Ϙ1MÑdÐãËéÁ¡äòÊ 5 •26Ô¢Ž Àýß'þU‰i7“ NâW[CË‘ž5‚øŠŒ@玦¨µÅÝá¶…î̓Vò–GT,ÈcÈ_—?1ö«9ޝÏíççÿ£Ïíççÿ®rÒúúæâ/Z/žä5ÀDÝ'—&Ð0FÐprxíÚ¡´Õo¯¡•žðZýž×Í ¨¸˜îuÜwòáã{­të&÷tMBåš3‡¢%N3ƒû¾8 ÓRu’i!MJ᥋b„²g‘‘³ŒÖf€g•ï.ç‹Ë7M }aLþG"².®•âCSU.¯/ÙGr`£ÿÇð*ꢙfßäêWylQö<'k üœjI®c·ÏŸ©ÜGµ ‡sÂ0£©ûG>õÍiyÓ­®¬üù–âKý›¡YßÉFcóü£¹æ«]êW7š,Ë<ÃX]ïùW$¤¡Èöôãšìñ'üþÞ~qñº1'üþÞ~qñºŽâW†-ñÁ$ퟹPñâëUõ¡o§ù®ÒÀÎUWhRᘀ9\äãÒ€.bOùý¼üâÿãtàonÀI1ñºæ Õ/ÖÒK–BoÚÜÎâ=ê¢-àp6î'ŽŸ­2ÛP¿¹–Þ(õÑ–»&O- ‘cu ÛP;ý0ÓFæXÖH¯îVVˆ†¡Ë¢I<  º…ÊÁAfˆd“€?Õõ&¹µ¿¿ŽÂÆúâyVÌÙÃ$­n±å\Œ±ua½>ï½,“\Á¨ê ·r0þѶŒ#…*¼¼ãŽ8$~½y —Ïíççÿ£Ïíççÿ®rûõ¹†y¯7BúŒÖÆ/-@¾fqœƒð©4ÍRIuDW¹•í'´k…3ˆ×eÁy ~÷”ÑbOùý¼üâÿãtbOùý¼üâÿãuÈY__ÛizlKvò=ý XZEV).åéÎÎ~íX‹Z½›N’äHkAjìTb9 Gü7n(§ÄŸóûyùÅÿÆé‘Iç)hµ § ÅIVˆàƒ‚?Õö5ÎÏ{¨¦¢4د˜uƒÚÑÈÅHAéÜuîï\Êu+›G“Ë&¸u ÎLÌ ÏûVqµ'¨©±!8—„úÿª÷_ëìÿë±ÿÑoM¸ÔÂî3! ®¿)>£¯ózŽœ9’5£OÚK•JÈï/Q‰ÀÏ•ÏþC§Hæ(ÚIoî‘d³4@õòëœ×5Ÿµ2EjÙ¸vP›N0sÇ5¯«[%æœa–u€—FW` zŒŽ•8YÔœ9¦½ ±Xb¢ûô&µ½·¼ÝöM^Yöýï*X[’UŒIÿ?·Ÿœ_ün¹éõKÛ{Ž´—PÙµÄrÁ¬`yóÔ皎÷Q½±”B·ÿh2ù¥lÌȤp1‚¬qžxë]!ÒâOùý¼üâÿãtbOùý¼üâÿãuÎ\j7“ê[Ú^„C¨-¸uEm«ä`2:îñöâ¬éw7WQÍw-Û–ŽYcЍÊHñ»qÆz÷é@9Š6’[û¤D™™¢@êIòêµ¶¥ew/•k­´Òc;#š8ú®q®õ;Ï\ÜÎKÛϧÌϸDžm™󎠆ɭW¼Ôm4)®d´¶M©xü¹™É qPqøÐÎ$ÿŸÛÏÎ/þ7F$ÿŸÛÏÎ/þ7\Åýþ¡fÆÞ CÏi"ŠE™£O´È© qžxëKs¨ÝÄ·9ÔY$¶»†Ý#)efY¾^ᛦ:PM‰?çöóó‹ÿщ?çöóó‹ÿ×?§_j—wb`É2E,lc Š Ç»€yë“ÇJµ=ÌúµèŠá™ÝÑUó´¦0NGs@Ø“þo?8¿øÝ“þo?8¿øÝrvú¶¯KnYfûs ¢0$vÎKnþ÷qÔóÒ´tÑq&¡ª™/eB&‹ òL¢1r¿ý~h^y–ÚšçR¸Š%ûÏ#ª;rJTv·ö×……¦±$åy")`l~IT|PXhr·8ù©Þ«j0ê·Z¼ÂÞÞ[K)„+  b3–%GM£¿‰?çöóó‹ÿÓRO0¸P¹bµÂ´GiÆpwÁÁsísæ\C&¤b6Ö‹q¿ËOÞÝœ‚>èÚó֪ìê@„\^,d @c}£wÜHÉÏò ³Ïíççÿ£ÏíççÿªZd·?gXõQp]‚‚˹” ŒàŒâ­,ð¾Í’£y€”ø¸õ ÉÍygÄ’\FelÇ8—ˆÜô*ïö}‡üøYÿà:…Uñÿeÿ]_ÿE=h»*#;°UQ’IÀÖ€(<lÑé¶NáCÉû”äÓœ#ÏLº+m<È!šÂÁ'*X ‰NTd£=F}2=Fp›ÄÖòëÚu«Îëˆæ ¼±€ÅJ€1ź‘ÁîOËG›PÔu7¾º±k;xá1D“Þ, =xöFQ’ÐÎQ«¶kBà·[™ä»lY6G´¶q€zgÑ2Áú2ÎÙÀàqÐÕŸìûùð³ÿÀtÿ áŒòÍ›¾þ¸†¹‹dï1Œo”»('ŸçV´{é%¶žK­Fèø…LÛlžfTÞmQB¸Ç4×ÿgØÏ…Ÿþ§øQýŸaÿ>øŸá\nŸ3I¢›JòëQšU…¼®Ì1󒇄ÁéŒ~5SDkû¡áÑ.±¨ÿÄÅ.Dÿ¿=ñŒô>ý}è½þϰÿŸ ?üOð Øiàl,ÀI?¼ýuMR]Byï$Ky¢˜Kp÷2!wH žƒñï]MÀžïÀW 4ës;X¸2@N$`§‘À'8ôæ€5…†žÀ±³ ò9ý)³ì?çÂÏÿÓü+‚Òo`òV-CV¼µ²ŽÆ#fÑÎêöþóŸâenöéŠè ºÔ›áì×WæH¯…Œ¬[î°![k{`ÐÙ°ÓÀ$ØY€:“… °Óض6dA'?¥pãí¯ö}{t·^7%$”·ï8Ëß¾j=&ö%bÔ5kË[(ìb6mî¡ßoï9þ&Và/n˜ ÷û>Ãþ|,ÿð?£û6“öŸ³}—OóöyžW•í¹Æìc8ϯ?¹Õ5"±SR»³¹mÈ‘¤… “y¬åõ ãšé´ÔüUgsy" “¢ªË8}ÛÁ'™È  ïìûùð³ÿÀtÿ ?³ì?çÂÏÿÓü*Í[û>Ãþ|,ÿð?Âìûùð³ÿÀtÿ ³ET“O°òÛýÓ¡ÿ– þi_ò³ÿ® ÿ Š³'ú¶ú­¥È"Ïþ¸'þ‚(½þ¥5½Ù···I*±Üåz’0¡ªƒ[½ïe3‚DÍ×ÓîSu9£,âÜâ̤d/Í%.±«ZÝÚap¬ãÌ‹f ¿íŸð®yNI½OF5v÷멳i7Úm"œ ¾bǦh¨´‘"Ï?óÁ?ôEn¶8$­&ˆ@o2àì|<Û—ä<-óST4ýÚÀܘ£™þÐ~1IFp c Éë“Ï$×AŠ1L†“wg?§höÚtÒÍ s4’†u$¢õÚ¼p?SÆIÀ©¦Ó,§›ÎŸN†Izï{p[ó"¶±F(ÜIY2ZA0Kh®%dÝwÐ9'ó¨›J°d(ÚdN2 °ÁÀÀíÚ´/îšÕSb†g'¯·ÿ®¬FâH’@0AǦk(Ö„¦é­Ñ£§%7³3RÚ$1”¶ bR±â,lŽò¨ŸM²uE}>&XÔ¢nU<8à{VÖ(ÅjAöVÏ:NöHÒÇÂH`Ë/ÐãŠQgn$2 5_Ì,!çv1»8ë‚Fk[b€3^%r…á,Q·)1“´àŒŽ88$~4Ñ ^Qo‰î"å€è Ç=kSb€1SL±$HôèUe-¸Ç¿ÔÞDbS(·ýá]…ü®Júg=«Sb€2-¬m­ [$€¿Þ1Á·?\ “ÉO4Ëä1”)o,äœ ã§'ó­"ìÁÙ¾Î2Xt$㯽K´P©¶üªŸ$XùW àt8©Š1@øoî?ýðj&µ…·îµÌ`Ϙ¾ñÁ‚µqF(k Y÷yö1ɹƒ¶ø3–œŽ¸ã>”Iak-ºÛËcŸv6ƒ*¿AŒVÆ(Åd›;vGCf¥$P®¦€ñÈ6ûÿ|ÐÅ  ü7÷þø4a¿¸ÿ÷Á­ QŠÏÃqÿïƒFûÿ|ÐÅ  ü7÷þø4a¿¸ÿ÷Á­ QŠÏÃqÿïƒFûÿ|ÐÅ  —ŽC{‚7رº“´õ%qü6^F#»´YÐÁe‡p×{Ö¶(ÅcÁaklª¶Ö1ĪûÔGÐÈÀëŽ3éS•,h܃Á5£Š1@Mk Û}™­C@/”aÊàtÆ1LŽÂÒ& ŒhÀ‚ Á‚Ý#ñ5±Š1@òØZÍŠ[Þ2åÊ4‰É8Ç^zÑ5…¬â15Œr¿Õïƒ;>™VÆ(Åf$JŽîi\ˆÈ,qŒž9à@; |`Ì|³óñÉÀ•iâŒPD¶6³#¤ÖI"»ï`Ðd3cµ·Š1@&ÎÝ·n³Sº?(æ©ýÞ9OÝcÕ‡NzÔU¬¶÷qGh°½Üm’dž'8ç­nâŒRÎÆÞÆ/.ÒÑaòáÛ»ÜàUŒ7÷þø5¡Š1@Mk oÝj˜ÁŸ1}æÁ‚˜l-Mк61›ÒSÏùã5±Š1@ eoÍ–h¾[LC¬z‘ÇäÓ…´"7ŒZ€’]D\1=Iç5«Š1@XÛBˆÙ$ioEX0±ŒŽ88'šQieah¡•™Ôˆy z‘ÇS““ZØ£—$Êñ¼–ûÚ3”f‹%O¨ãŠ­q¥ZËowv‹ ÝÆÑÉ,páˆa‚sŽzÖî(ÅcÙØÛØÅåÚZ, ã>\;w{œ ±†þãÿß´1F(? ýÇÿ¾ oî?ýðkCb€3ðßÜûàцþãÿß´1F(&xäym™crRÍòžÆÌŠ[›X®á1\Û™öd<{CïZ¸£ 6Ñg¢ØÙIæ[Ù°~ÌÊÌGÓ=:ÕÉ Iã1Ïoæ!ê¯ þVž(Ÿå)IÞNæEµµ¢²ÚÙ$ ßxGÐ~¸ÔÓ¬ã†HcÓâX¥ÿX‹n¨Ç5³Š1A&BY[G·Ë²DÚÁ†Øq‚ÐzuÇN(VÂëíBÉ>ÑÓÍò~Ï­|QŠÅþͲó$“û:-ò‚²7ÙÆ\ œsš² ´Dá@Æ6b´qF(=>Î(Ú8¬"Dv ʰ`A#Aæ©]èÏy|'›ÊØ[å´Ä¤) Éž™µtØ£Žl-Mк61›ÒSÏùã4èí „F"´Tò”¬{aÆÀzÇà~U­Š1@²i¶RÅRéñ+¼Ž÷Bµ¸·›Í†IC+Áàþ´U>*+©i$_¼£ŠŸ[Qè»YÖmS“]™t’sI÷3a¹¿¸CGq–ÀLÑo{sÀŠà–Ãê=óShc‰ÿà?Ö«j?òoªÿ!^#ö¡ ên÷ÿ?ò=EÉ*²¥Ê­aºƒ\™±p0;8ãÕjÂk˜Ótùû:&A+ùcÖs¬ð/éSN ÐÆ?¸¹ý*Ô% EF¤ýÕ_R\Ô©A4µvô)5ÝåÔ„C¸ÈTì=ÍKi¨J“ù7\‚q’0V¥Ñ<¹ùϹWVd{Ò#Á!@8çŸóŠžj¥B›m½‡hN££Ë¢'¿¾š À‘@àŒîªï=þ<òd × qùRj¼_¶yàgò­‰¤‹ìO&G–PãøéV£:Õ*^mX–ãN´S¹Ÿuö¨Žà§ýêÖ+#DRn$nÁ1úÖÎ+ÐÁU•J*RÜãÅAB«QŠ1NÅ®³œn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(–¬?âQ{ÿ\ÿA4’MpÓ™?²¥Þ2"ÈŒ¿ì?*~¬?âQ{ÿ^òè&­Iþ±¾¦€9?4ƒJ·ŒÙ5´i 7F@N ÇUÈ2úì?ôEu¨®aóíÞ,ãpÀ5>(Å)EI4ú6ÑGN²kD}ì¬Ì‡¦*+­5§¾P‡ëÇ¥iâŒV MÓTÚѪóSsêÊ•‹Ýˆü¶Ue'ïtÁÿõU˜¡ n°·Ìí>üTØ£jŒÜí«%ՓЇDaÏ£H˜Jö Á©¬t£ «,줯!W¦k[b¹ã€¡ó¤jñu\y[9ÝTgQaêò§çyã+ýâOøUëÍ1®/Veu ÆàzñéZ8®x`J“•U×CybÜ!ÓR­¢ÚñNI9fõ«§bŒW§FQŽÈᔜÞãqF)Ø£DŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bªÿkiŸô³ÿ¿ëþ4kiŸô³ÿ¿ëþ5\¯°®‹X£Wû[Lÿ Ÿýÿ_ñ£û[Lÿ Ÿýÿ_ñ£•ö ¢Ö(ÅUþÖÓ?è#gÿ×ühþÖÓ?è#gÿ×ühå}‚赊1Q[ÞÙÝ9Kk¸&p2V9=x©ñRÕ†7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(ÅQÕÇüIïëÞOýÕ‰?Ö7ÔÔZ¸ÿ‰5÷ý{Éÿ š–Oõõ4ÍøÓþA×aÿ š(ñ§üƒ ÿ®ÃÿA4P[Š1NÅqW~*–/­²ÞÀ4øæK9 %w´Œ¤ïÅ…;Tö Ïb¹IüG{a¯jÉ=¹ŸNµžÞ2áÕLE^ƒo˜÷•ZÃĺ‰ó žÎ+‹¹u­mãI¶¨ ’w6Þ€¸$ú ë1F+™‡Ås]ȶÖ:Q–ùD¦x^p‚?-‚° ƒ»$ñÓð©/¼O,qö}-æ[;d¹»Ý2¡‰X€0wîh¢Å®>_][jZŽËw»µ@!ÈØ+B–eRy'¸?…tÚMðÔôÈ/B*y««"È8ûËÁéÿê  X£ìW/ã ZûMºµK)ü¥’ÎöV²ÑÄ#±ÿëÐMŠ1\‡†unóP²2Ë}sg-±{‡º²X®ÆnÉϯØâ€Š1TµÙå´Ð5«wÙ46²É`0RAÁ㨮"ë2t<çºXïÛËOÞ+È¡N2¤ž1@‰Š1\Οâÿ¶Ýø•]%‘óvÜ„rLä·ÊgiÆóÁÅgßx£T²Ü%±²µžÂêê0$IP±†Br¿)qÈç¿Jí±F+–³ñsµõ•œÖYIÞ8|ñ8fÞÉ»%T`} Úº¼P/¦ÿÈ2Óþ¸§þ‚*ÍVÓäiÿ\SÿAÏ\øŠHüT° ¨E’J¶ÏW{;wúà ö®©;3+UÍk:õâAyýŸoµ-§Hä¸ÈbËŽF3ïO#º{ãk–µÄÖñ1¸sGÉÏËÀÅ.d;3¢¢¹¹¼FÆßO¾Š'Okq;C¸rcPpN õäcèjö—¬K{xm®,þÎæÝ.‡ÜŒqÏ"ŽdfÅü†âÿ¯iô(ëo‰aÿ!È¿ëÚ_ý :‹ï®tß \ÞYKåODöƒ€dPxÒ Ô>Ýš¬áÙÁÞÅUV  ŸP+NŠÅ‹Âz.Z;2’&<×*Æœ}+RÒÖ;X­­Ô¬Q.Ô‹>¤“SQ@+2ÿ@ÒõŸ´Ý[1]…ÒWŒ²ú¤d}kNŠÇºð¾‹v±¬Ö+¶(|…ìƒËþéÚFG~{óRéA÷‹_›ÌŠ\ù÷¢!ëØõïšÓ¢€3Ɖ§ ¸¶û·fô|íþ¸ç-×ÜñÓÚ›¥Â¶ê– -°•bØ…œ¸äóŸ´¨  { hÖÉ2ChUf·6Ò4‡1áå¸ëõš¶¥›lZ4³²•e1”,Í´aT6xsÁϵlÑ@(ÅP6Ò¬^þKé-’K‰FÎùo”d€àu=*¯ü#z@¶†Û쟹‚9b|×ùR_¾:÷ý;bµ¨  sivSCi°îK)HæA zó€OZ’îÆÚñ­ÍÌ{ͼ¢h¾b6¸Ç^§­X¢€3&ðþ•>¡öélÕ§.®Nö Ì:1\í$z‘M—ÚL«*½©ýìæáˆ•Á¬¤”ŸlV­‘'†4Ym¡·k#„0M’:œ7Þƒ“žù'4ë¿ è÷Od‡ËŒD³ (:)€ÀzÖ­—qáÝ*æyg’Ô‰eevt•Ѳ«´`©ùxãvÊÎÞÂÒ;K8„PF0¨;sŸçSÑ@*Ž¡¤XjN{šÑÇ$Jw²ád]®8=ÇÿZ¯Q@ÁvÖñÁ íŠ$‹’pÀÔ˜¢ŠŠêÚ+»Y­n|3#G"䌩##ž†³SÃ:2L%[ <2æ?Þˆb3×°üûæµè  Ø4.Þõ®á´Q1,yf*¥¾ñU' žø5Y<%¡FÄ¥Ž3Å:Lq†P7p1éÓµmÑ@ñø_EŠæ;ˆìÊÉ‹*+à:ŒŒã8ëëß5±Š( WMÿe§ýqOýT ¢ik%³Z)ŽW.ù'qbsÙÏ_zƒOŽú[(Ú+ÄŽ1”T0îÀRTsŸj³ö}Gþ‚1ÿà8ÿâ«©êsìGu éws¼óÚî‘È,DŒ¡ˆèH÷©cÒ¬b'H1"Jó)ÞÜ;Œ1ëÞ“ìúýcÿÀqÿÅQö}Gþ‚1ÿà8ÿ⨲Ïì=7ìðÛý›÷PÆñF»Û…q†{Õˆl-a¸[ˆ¢Û* ¸Ÿ×õëQ}ŸQÿ Œø?øª>ϨÿÐF?üüU@héÿò‹þ½¥ÿУ­‹»K{ÛY-nâYa”mtaÁËÇ¥âtÔc(ÙÇBA=ý…Oæë_ôÿWük9ÁÉ•$;Oé6pÜÅ Ûu—1yÙÓÛ–$ãž”×ðÖñˆÞÔ²ˆRfrv#ïQœönN•æë_ôÿWühóu¯ú Çÿ€«þ5>Í•ÎKmKµ¾[m™K&G*…¾öÕ' Ÿ`+OÌyº×ýcÿÀUÿ<Ýkþ‚±ÿà*ÿ͇::|QŠæ<Ýkþ‚±ÿà*ÿnµÿAXÿðÆfÃ>(ÅrÂ÷V‚öÉf¿Icšáce*ðrzþÔÔÊ.;”ÃbŠ*F£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1E›.’’jÒÝ Í·‘s ®D˜$©ü™úJe‡‡´Í.VŸOµXçØQ]ÝŸhô‰Àö­Z(ާ3MŠ×˜ë–’B1½Ø–füI4ÇÐôÉ-'µ{Pažsq ÞÙ2’Àç çÓ£Ee?‡4‡±ŠÈÙ NdM²2°cÔîvNNy拟h÷P[Ã-’ùvÈcˆ#²mSÕr¤dCZ´Pk>ÖëN}>hAµtòÌjJ¾œ`TaðÖ‘ ”Öklío6ÝÉ$ò>6ýÜnc·Ø­z()¼9¤6ž–&Ðy !•q#z¶üîÏ=sRË¡é“iÙ²YÇö@‚1ÈÂŽq‘ÏëZP 8UMKL³Õ!Ž+茉‚DÛ#! åH=Í\¢œdâïf MÆÎHä‚9CG»iyä|nÆ~ñ>‚¡»ðæ“yy-ÕÍ«<³2~ù¾*Òµh­z©ó);úŠÈϺÑ4ÛÉÖk‹Ug † 0 0 ¡¤}.ÉþÛºý½vÜ|ÇçvúñÇb®QKÚÎÖæadgêq$>»Š%Ú‘Úº¨Îp)ò¬o©¥Öä ÿ^Òè&£™œÈ˜Ýœ’z(õ?áßó#7¨Î{ÆŸò ƒþ»ýÑIã"•nU·(ÃqÏÊyâŠì¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šä4_ù'ûòèmWªŽ‹ÿ Äÿ~Oý ªõuáEPX×~"‚Öêîe{(³ g’4R¨ îÏÞÏOnÕ³XMáÈ.uFïPQ,W&?-W^;€ G½'~ƒVê]¶Ö,®n%…dØQ£PÎB‰ ®å Ï'ªw¿²A—¼·Q¼Ç“*œu^½}«ïA¼kù®­Ø¥A<(ä„aSÇ^1šÍ—L¿Ó¯~Ó,]<Ï9eÉ,jÈÚ Æ9ÇzWc²:ík;gÚ"òü¡/æ¦Â mç×Ûôÿí=<@gû}¯’i“Î] úg=k—ƒÃWóé1#ù1³YE I È+7˜s€{~µr÷×_Ý\Û-°*Ç#Ò‹°²:XäIcY"utaÊrúÓª–i-Ž•µÃÆòÆã^I<¯§=jíQ!EP[¿øüÓ?ëõ?‘®®¹K¿øüÓ?ëõ?‘®®²«º5§°QE‘aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP=gþ@—ÿõí'þ‚jže`ãr“€ƒ«ŸO§ù<™µŸù_ÿ×´Ÿú ¦º=Ûô϶Ïéé@ç2tÈ cwœ3ƒŸá4QãOùAÿ]‡þ‚h ÆŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( GN¶¿†Æ5H­N\3†%ºl>µgËÔç…¯þ7ÿVìãÂßþ¹/ò=jª29›åê?óÂ×ÿÿˆ§­¶¦Ë‘§þ7ÿWêÌ_ê…ч"2>É©ÿÏ ?üoþ"²jóÂÏÿÿˆ«ðjzuÍÁ··¿µ–aÖ8æVaøš·KÚ0äF/Ù5?ùágÿ ÿÄQöMOþxYÿàCñ©ݬ¯²+˜]÷2mWî_¼>£¸íO–Há‰å•Ö8ÑK3±ÀP:’{ =£Dd}“SÿžøßüEdÔÿç…Ÿþ7ÿ[ë"+ÆÁ‘†U”äê*¨Xˆ¥”ÞÛˆà.WóW¾qµŽx9 `úÑír#;욟üð³ÿÀ†ÿâ(û&§ÿ<,ÿð!¿øŠÑ’þÊ/;ͼ·O³ãÎÝ*/##wª–ZÌÖ–—/u7YaòÛ,‚Ut•Gqà ŽÇÚ½6ŠB8KN»ÿ„ÊïQ—N¸ºÓ⺅Þ%ˆ·˜<¡”ÖôÍtÚ‰Úöx4™4ø¥”æ 1¶§¿ZØ¢˜Q@ï?Õ'ýv‹ÿF-_ªŸê“þ»Eÿ£¯ÒQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEOYÿ%ÿý{Iÿ šI?Ö7ÔÒë?ò¿ÿ¯i?ôI'úÆúšæüiÿ È?ë°ÿÐMxÓþA×aÿ š(±¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ÄfÆÜÓ5þBæŒä+üŠŽÐíÓ"oHÿÇj&¹%[Ebtv/¹~^G3ÎJ`]ì9‘VbÿV*¤D—oN@?‰«q«}ÉßËöÏ^ÙêµÆŸmmoÀ±Oäù›³¹Éï‚ÇJS®]*iÖ–7¶“ms{{"Ê€ ŽNsôæ€:º+‹j·yöVöq¢iCPuYŽC0*0G/N}OQe×ošé¶¡³D¯"Ć6ã èØ'¿ÓŠC=ŠãàñF¡=Õ“`¶÷wÍl!ùŒÑª–žqžn2:æ¢_ݾ•ap‹fÓÏeuq*NƉr£²9ÎJv´WwâMr´mlšiíMÙ`pxÂåÝyç““ô®ªÂwº°·¸‘XÕÙUÀHÎ÷À±EP{ÏõIÿ]¢ÿÑ‹Wë‹ðu¦³gá‹xµ™?å´?g‰Çï"záXÿ!Ô3Ù{JC (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ‚öå,¬n.å¤4E?ʧ¨om’öÆâÒ\ùsÄѶ=`ÿ:àô›-sÄúa×/¯{®Û|6Ô$Ô.‚j6Ò€]|Äç+Ðà‘ÿëª˪iz$žÖ<3wªÛ+Ÿ&[f`’ Û†X}ÞyëøUxt=N×á÷ˆlM™.$»FŽ‘Ÿ#tgåêXyç¡ ¾ãÅ6ZEžȺ»½¸·GX-ãó$a¼yúþµ—â/A©øUºÒ..m®­š5u9ŠX‰‘G8£âVÓYñ-ÞŠ¶Ò쵊'ò•—œ1nù<ú×sáõ¹]{eoe;Í …Lž×kšÕnõu[È5Ï 6±fÍ›Imí„…WžÐûñÒ€(êö¿áÏ y’ÝC¨;Üm¶½Eó¢ÿlŽôëßÒº+ߨY˹²Ô¦»š/7ìÑ[fT_ö”‘¥q“xoW_jIŸ4fâùg†ÅIwŠ>:ç‘ïÅkë7:½Ö½mptÝitÙíFÈì×Ê”HOIr£ñ½èLj¼rÃêzÈÎóyLe„‘Ê¿¡äb´R‚çÆv æê°M5˜-$"Æ[—RrN¸ÄÑuVøw©Ù 2ínF§çZ6,S 2¹7CÈÍtè—W¿tÍPi÷Û6˜Ca+å¶çùXô‘Æ{ЗñþŽŽÌ ÔÑ$òÚõmÉ€÷³ŸÒ¢´ñUÅÇfÒ¼Íd!ÊÎ윟îœq\½Í†§hòE¢húÞ~Óª‰¼Û&êKqùñ]_Ù|IwCu`°yÐG˜ÑþRr{”þb€ øKÓü 5)﵈ íµægoδô¿éº‹ÜÆÉse5¬Fib»‹ËaêØçŠáì4=]<¥Îštíq§jFáí$BŽé‘н?S]]¥åþ¹u},žö¿dhÔÞ§—4ÌGÜÏd<Ðí|w¤Ü\@o¨AËùpÝMo¶)§ Ÿé]Eye¦­õŒ&›®X‘2›ˆ.þ{D\óµ_çé^§@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@õŸù_ÿ×´Ÿú ¤“ýc}M.° ѯ€“o ºk9õ{S#·$dóöy?€2üiÿ È?ë°ÿÐMŠ.’öÂ$·ŽrË('t,¼`úŠ(¸¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ÌÓàR2 *åMû·¤Ÿ÷õÿÆc͸óÉ© Ènb4XÐ" *ôç5n/õb«U˜¿ÕІîÂÊ÷oÛlíî6r¾lJû~™·6Wq¤wv–ó¢}Õ–0Á~€Ž*ÅYZ9bö°1x¼–&0wGýÃþÏ'ޔӧX”‘ •±Ivï_)pûq·Ø  =+Äú”òÏh,¾Õ{ö‹†òÚUŒE0wwœZtÞ:†;q2Ø;,‘E4JdÁt`ÅÏN6lo\ûV·ü"º a[-¨¬Î Êáo½óœtÎ*y4*WžÊ<ÛÂÐE‚@XØ`®ô'ó  ±â›™§·ŠËKYÍÔ· 7!C,D ÙÛÜ“ù{ñ±¢ê)«éÚ„q˜ÖtݰœíìFi-ôm>ØÙyá>ÂŒ–øvùcw~s×5=•¾eœ~\ "n'êy EŠ(¢˜59D6~k+°ŽHت)f8u8rOµAÿ %·ýõüMÿÄÔú¢,Œk#ÄZHÀtÆå˯#9Oûëþ†-_þú‡ÿÒ/ü$–ßôÖ?ð]7ÿGü$–ßôÖ?ð]7ÿQc]ÐÅ«ÿßPÿñº?±®¿èbÕÿï¨øÝKÿ %·ýõüMÿÄÑÿ %·ýõüMÿÄÔ_Ø×_ô1jÿ÷Ô?ünìk¯úµûêþ7@ÿÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ5ö5×ý Z¿ýõÿ¤}*êi·µWòÆíŒÑa±Î} Mÿ %·ýõüMÿÄÑÿ %·ýõüMÿÄÖv‘a}}£XÞMâ TIqo¬Å€YA8ýßNjçö5×ý Z¿ýõÿ  á$¶ÿ ~±ÿ‚é¿øš?á$¶ÿ ~±ÿ‚é¿øš‹ûëþ†-_þú‡ÿÑýuÿC¯ÿ}CÿÆè_øI-¿è¬àºoþ&øI-¿è¬àºoþ&¢þƺÿ¡‹Wÿ¾¡ÿãtc]ÐÅ«ÿßPÿñº—þKoúëø.›ÿ‰£þKoúëø.›ÿ‰¨¿±®¿èbÕÿï¨øÝØ×_ô1jÿ÷Ô?ün€%ÿ„’ÛþúÇþ ¦ÿâhÿ„’ÛþúÇþ ¦ÿâj/ìk¯úµûêþ7Gö5×ý Z¿ýõÿ  á$¶ÿ ~±ÿ‚é¿øš?á$¶ÿ ~±ÿ‚é¿øš‹ûëþ†-_þú‡ÿÑýuÿC¯ÿ}CÿÆè_øI-¿è¬àºoþ&øI-¿è¬àºoþ&³o­o­¯tëT×u6[ÉÙØÅ¹BÄíÇÉŽHÈ=;Ußìk¯úµûêþ7@ÿÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ5ö5×ý Z¿ýõÿ£ûëþ†-_þú‡ÿпð’[Ð?XÿÁtßüMð’[Ð?XÿÁtßüMEýuÿC¯ÿ}CÿÆèþƺÿ¡‹Wÿ¾¡ÿãt/ü$–ßôÖ?ð]7ÿGü$–ßôÖ?ð]7ÿQc]ÐÅ«ÿßPÿñº¥¤ZßjVMu&»©ÄÍ<È3Õ +(ÆPžŠ;Зü$–ßôÖ?ð]7ÿGü$–ßôÖ?ð]7ÿQc]ÐÅ«ÿßPÿñº?±®¿èbÕÿï¨øÝKÿ %·ýõüMÿÄÑÿ %·ýõüMÿÄÔ_Ø×_ô1jÿ÷Ô?ünìk¯úµûêþ7@ÿÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ5› ­ôÚÕ݉×u5ŽÚ]YL[œ¹“9Êcø@®ÿc]ÐÅ«ÿßPÿñº—þKoúëø.›ÿ‰£þKoúëø.›ÿ‰¨¿±®¿èbÕÿï¨øÝØ×_ô1jÿ÷Ô?ün€%ÿ„’ÛþúÇþ ¦ÿâhÿ„’ÛþúÇþ ¦ÿâj/ìk¯úµûêþ7Gö5×ý Z¿ýõÿ  á$¶ÿ ~±ÿ‚é¿øš?á$¶ÿ ~±ÿ‚é¿øš‹ûëþ†-_þú‡ÿÑýuÿC¯ÿ}CÿÆè_øI-¿è¬àºoþ&øI-¿è¬àºoþ&¢þƺÿ¡‹Wÿ¾¡ÿãtc]ÐÅ«ÿßPÿñº—þKoúëø.›ÿ‰£þKoúëø.›ÿ‰¨¿±®¿èbÕÿï¨øÝR’ÖùuË}8kºŸ–öÒÎÒf-ä†@û˜ÇÌ{gž´¥ÿ %·ýõüMÿÄÑÿ %·ýõüMÿÄÔ_Ø×_ô1jÿ÷Ô?ünìk¯úµûêþ7@ÿÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ5ö5×ý Z¿ýõÿªZ­­õ…´O»©»Ms sÊERFs‚zäsÒ€4¿á$¶ÿ ~±ÿ‚é¿øš?á$¶ÿ ~±ÿ‚é¿øš‹ûëþ†-_þú‡ÿÑýuÿC¯ÿ}CÿÆè_øI-¿è¬àºoþ&øI-¿è¬àºoþ&¢þƺÿ¡‹Wÿ¾¡ÿãtc]ÐÅ«ÿßPÿñº—þKoúëø.›ÿ‰£þKoúëø.›ÿ‰¨¿±®¿èbÕÿï¨øÝRÕmo¬-¢xµÝMÚk˜`˘¾Pò*’0ƒœ×#ž”¥ÿ %·ýõüMÿÄÑÿ %·ýõüMÿÄÔ_Ø×_ô1jÿ÷Ô?ünìk¯úµûêþ7@ÿÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ5ö5×ý Z¿ýõÿ£ûëþ†-_þú‡ÿпð’[Ð?XÿÁtßüMð’[Ð?XÿÁtßüMEýuÿC¯ÿ}CÿÆèþƺÿ¡‹Wÿ¾¡ÿãt/ü$–ßôÖ?ð]7ÿGü$–ßôÖ?ð]7ÿYºÕ­ö™¢ÞßE®êrIê²¶çÂÇ^µwûëþ†-_þú‡ÿпð’[Ð?XÿÁtßüMð’[Ð?XÿÁtßüMEýuÿC¯ÿ}CÿÆèþƺÿ¡‹Wÿ¾¡ÿãt/ü$–ßôÖ?ð]7ÿGü$–ßôÖ?ð]7ÿQc]ÐÅ«ÿßPÿñº?±®¿èbÕÿï¨øÝKÿ %·ýõüMÿÄÑÿ %·ýõüMÿÄÔ_Ø×_ô1jÿ÷Ô?ünìk¯úµûêþ7@ÿÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ5ö5×ý Z¿ýõÿ£ûëþ†-_þú‡ÿпð’[Ð?XÿÁtßüMð’[Ð?XÿÁtßüMEýuÿC¯ÿ}CÿÆèþƺÿ¡‹Wÿ¾¡ÿãt/ü$–ßôÖ?ð]7ÿSYkv÷·Ëh–÷‘HѼƒÏ¢áJƒÃ`ÿ펥S}*êi·µWòÆíŒÑa±Î} SФ’mK@–gi$}³»–$Ã’Os@]Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@õù\ÿ×'þF°ësPÿuÏýräk€*êêýïèh£PÿP¿ïCEuÔQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE…kÿ#~­ÿ^Ö¿ÎZݬ+_ùõoúöµþrеQ@N¶U ¢`Àwãõ¥û¿¬ß÷ýÿÆ­Q@~Áoë7ýÿñ¥P€Óûx“üjÍ[ìQ~ãÿ$ÿ>Å÷î?ð"Oñ«4Po±Eýûü“ühû_߸ÿÀ‰?ƬÑ@¾Å÷î?ð"Oñ£ìQ~ãÿ$ÿ³EVû_߸ÿÀ‰?ƱEýûü“üjÍ‹­¡µ·µh&¸C%í¼L|÷9V‘U‡'¸&) ÅÞª“MpËozbŒyî6¯—c¯<±ëëOñ'üzÙØF×ÿG-ükŸö?ú&*½ö(r¤™›i LädŽ ª%×FgmrÖÍp³\,,¨Ø*bX ãoJجí_KþÓ6Íåý’í.q³vý ½xëÖ€*Gâ{´ê ;,vö†“_ÎóP0žý³š°þ"ÒRÆ;Öº>D³y |§'Ìçå+ŒƒÁê+&?}š=B;-JHîxåUØHSþYŸ˜n^qŽ8¦´ð¯Ù­m ûha¤oí‚6c$‚;O?V‹ì`Ì!‘¼ô•ˆ$meô=…JÞ&Ñ–Þ)þÙ¹% ˲'fN•*ë+ïÂ×véll§W¸“SŽæY#…cŽ ¨Ë‘zr3ÎNjWðDm²cw —GÌ3Iqh²£—mĪ… ôëøÐÍLjt›i%¼_÷*³*«}ÒÌÄ‘Uµ¯Øik4jÞ}ÔLŠa€Ë0-‚ÁÎ:ñUn¼m5Øš9-ÕLQÅ –Ê9€S#j8?)Ôº‡…f¹7‘[ê~E¥äéq$&Ü9Þ ôlŽÑÇÿª€s~š^±¯_ÉȰY[9Dže§Yx˜È[Ûh!´XŒ†æ µ›}:æä5׈5¸y g´¶XÏ̇2ò*«øNâyd¸ŸU r`xc–ÖÔBFìd¶ÍÓÚ€5ˆ´“a=÷ÚŠÁnʲ–‰Õ±eHÏ9©¶Þ&Ñ®®c·†ó2Èæ5S¯Ì?„’8þÕ§&ƒ¿MÑlþÕì¹a“—þ·ËR¸ÆxÎsÞ€#OÊ#Ö¾Ñb±Ë¤Â²º,Ûƒ“üghǦi5{¶hšUÖÍž}Ýœ›s¹‘3øÓu/ Ïuw¨Ki©›hµ(Ö;¨Ì÷»~S‘·åã½I®@–ºN›ovC{h‹ž¸ ï‹,쮵‹k“réÑ«D’\k’cß…qØqžµhx—LHmÚîq “C¬»Y„Aǘ /Ô⢸ðÜWkr¼È[UQIˆ#Ù‘Ï>½ªœÞ †IãO>DPÊf³IIØ1”Ý„Ž¼×þÞÒÿ´¿³þÔ>Ó¿ËÆÆÛ¿Û»sŽÙÍR¼ñ^彬'’K¡o!åV>æÜF€{ÔSøZYµ´ÔR,±Ý-ÂFðî*ÆÀÛ¸_ üê<ò,6­©“§ÁrÓ¥¿7|Û²»óþÑÁÇç@°x‹Iž)äŠï+&w&7_ÝŽ®0÷ªzµý®¥¥Y\ÙKæÂuPiþõ=EAeàøí,ní…Å¿ï¬ÚÑ$ŽÉ€aÌ×=;€};Õ­f²èÚe¶íÞMåšnÆ3‰Pgÿøt`aj×RJÌLjÛJÆ£.ýAέÞëZmŠÀnnBý nŒ*³–^¹ÀŽzôªzŸ†âÕuf¼¼»¸ˆ<ˆâ…Ì{A'vXsÀǵWƒÃ7VÑØµ¶¬RæÒÝ­L­nKKM_Ë¢Úà›`Þ`°GÍòðÄwü*êøV#g©ÚÍt]/â†2U6”òã SžW?¥]"ÒM´³ý¨ªÄÊŽ­«‚ßtl#qÏn9 ø‹IÉqö¢Uä1*ˆœ¹p2W`²=+>? ªé÷æ[!$ì‡1éѤ`/b£“œžwdvÅ4øNC¤Çfú‚ÊÉ;Jh7ª‚1µAmÊl7­Yñݽ÷‚u«ID°ÉjåXwàŠ_ñAÑ®®`Bs¬w2ìݺQÞ‡ÎsMÖ,ŸNðõœ—2\´V’,‡æn§úà{ v½áq¬Ý\LoB{Xíʘ·cl¢LõÎ1ÿU%§Š£û|–Z¤ÚH¡ ¼Syèw¶Ð 6œúÔº¯Šl¬ sJn܉$òQYWseÈÆôÏ'fï@Ó¦Ònôû[X,Öå0Z•pÃî¶2AÁªðŒ”°°Ž Ý·¶r¼Âåá $wÎòS=÷zñ@úuÙ¾ÓàºhÄfUÝ´H²ôeàzÌÐ|K³sw·0,?•[ÿñûáßûXh­¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¾¡ÿ ëŸúäÿÈÖnjò¹ÿ®OüaÐ]CýBÿ½ý jêýïèh ºŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( °­äoÕ¿ëÚ×ùË[µÍÉuˆ5ûÉCíì`•‚ŽH_8œ{ñ@´V=—‰,/›LâVþÒY#òl°nx<ãŒÕ‰µ½2++«±}o,vªZ_*Ub¾Ü§ ´¡EPƒYÓ.-–á/í¶„æUw}Ðyàš’]SN…Y¦Ô-cUÄKÌ W¯_j·EWkë4™ k¸YdC Àô wÎ WÒµ›-VÖÞ{y65ÄfT†B›AÆv‚xÍhQY£\°×–“̶ífèŽó2¢±tÞ’yàÊëú_Û¬íò$¼ ИÝYNßp{œëƒé@tUHµ=>d™á¾µ‘`ÊË2‘KsÇãTçñ—¡gb— <×lByR! ŽìsÇ·Rh^Š«o¨ØÝ,k{m0‹ýaŽUmŸ\)#Ôôùmžæ;ëW·ŒáåY”¢ýNp(ÝFmZÎ;x'ŠU¸K‰V¼†½‰ìsŽ$ûR&£e,ò[ÁuׂZåR㱞?¥âOøõ²ÿ°¯þŽZ§§Úê“êzÛXj6öÑ‹ò Ije$ùQóëíÆ*MRòCGÓ.íÉò念 0Á¾\‚=AÈ?J³¢Í¼úüÓÊ‘Fš‰,îÁ@L]I gøƒþƒv_ø.?üvìÿÐnËÿÇÿŽÖƒêštqÃ+ßÚ¬sÿªc2'û§<þzݤ‡MP% ¨¨xT§@P¿Ìz÷  ßÙþ ÿ Ý—þ ÿ£û?Äô²ÿÁqÿãµvëW°µ˜@÷15ÁxÓÈYÈ7°Pvç8Ëô©WP±w™öÝšL J¤Çþ÷<~4›ýŸâú Ùà¸ÿñÚ?³üAÿA»/üþ;ZUÓE¨º:… ·-´Kç.Â}3œfž÷Öqù;îà_?ýVdÌä—×–=G­fgøƒþƒv_ø.?üv™-ޏ‘;M¬ZI©.‹bT°îó>¸5«£cp²µµäˆFdò¤WêCü:–5Õ¶ÿ,‰Po]§*YOPhÃö:ãøwLhu‹HãkHŠ#X–*6 |ÁŸ®hgøƒþƒv_ø.?üv Ñuk[ÖWÕï,cØà|‹µal–{šÕ:µ’¯´N–ëk0…ÞgTRÅø$ú8üQþÏñýì¿ð\øíÙþ ÿ Ý—þ ÿ«úöb?y2ÈM¬—j±²’耎y$=p}(þ×tŒIu¦^[F^8Õ¤1—uA÷\ž¬Ó?J¯ýŸâú Ùà¸ÿñÚ?³üAÿA»/üþ;Z+©X4“F·ÖÅà¥Q*æ0:–ãôó{hÔÝB lÜ<Áòî8\údôõ  ¿ìÿÐnËÿÇÿŽÑýŸâú Ùà¸ÿñÚÕº»µ²‹Í¼¹†Þ2qºW3é“U“ZÓ²ÜKw ¼¤UÞQŠœsÈÈãØŠ§ýŸâú Ùà¸ÿñÚ?³üAÿA»/üþ;Z­ul¢B×7’ãäÏLúg"¡þÔ²ES=Ì‘ãA$È ²±SŽyätê:Cû?Äô²ÿÁqÿã´gøƒþƒv_ø.?üv´Íý¼û»·'þXùƒýóœÔ7Ú’ÙÌ¥­Å̬!HBåTc$– wéÔúP?©Ùë ªhé.©jó=ËùR 2x†LåwüÙãõ§ýŸâú Ùà¸ÿñÚeýÄWz§†n`mÑM4’#cª›y?•[¶ÕÞîfX4»Ö‰gxLû¢ •rŒq¿v2lûPìÿÐnËÿÇÿŽÑýŸâú Ùà¸ÿñÚ–?i22¥Ä‘·œ<בBª°'=NàG¨æ®É¨ØÅ,QK{l’LUÁéžh7û?Äô²ÿÁqÿã´gøƒþƒv_ø.?üv´¤Ô,b•â–öÝ$Ñ¥PW8ÆFxûËÿ}ZiÕ4ákö£¨Z rÛ|ß9vgÓ9Æh?û?Äô²ÿÁqÿãµ™áë=b]-žÓTµ‚sq¶7³2ûçÏͼgœö®‹ûRÈßÛÙ­Äm5ÌM4AXʸéùñô>•KÂ_ò_úù¹ÿÑòP³üAÿA»/üþ;Göˆ?è7eÿ‚ãÿÇknŠÄþÏñýì¿ð\øíÙþ ÿ Ý—þ ÿ­º(‘¶³Öĺ‚EªZ¤ÉmoæÈlÉe¥ÆËîsíZÙþ ÿ Ý—þ ÿ§XÈ߬×µ¯ó–¶hû?Äô²ÿÁqÿã´gøƒþƒv_ø.?üv¶è  OìÿÐnËÿÇÿŽÑýŸâú Ùà¸ÿñÚÛªš¦£o¥XK{u¿Ê‰KˆXœ ôü;ñ@ÿÙþ ÿ Ý—þ ÿ£û?Äô²ÿÁqÿãµ¶9P'öˆ?è7eÿ‚ãÿÇhþÏñýì¿ð\øímÑ@ŸÙþ ÿ Ý—þ ÿ¬ÉlõøJ-"þÔµûOاo7ìgnÍñ|»wõÏ9Ïá]ucKÿ#µ§ýƒ§ÿÑ‘P³üAÿA»/üþ;Göˆ?è7eÿ‚ãÿÇjÊkvoe¨]§šbÓË r›IÚÎÇb=?­K ÆÚ[‹»«4K±Ë}lÔGû?Äô²ÿÁqÿãµ™¯YëÙÛý§Tµ—uí²Ç¶Ì¦Çó“ ~s=8Ï­tQêvÒhñj„²[Ë Ì»‡Í†ß0;ÖV³wþ‰¤ÞÂGq{e* 4ˆF}ù  ¿³üAÿA»/üþ;Göˆ?è7eÿ‚ãÿÇknŠÄþÏñýì¿ð\øíÙþ ÿ Ý—þ ÿ­ FßQ7?fß‹y|§,…rÛU¸Ï8à M7S¶ÔþÒmK2ÛÍä³€Çj¶WÔa‡=þœÐìÿÐnËÿÇÿŽÖf½g¬GgoöRÖ]×¶ËÛ2›ÎL1ùÎ@ôã>µ×V7Š?ãÎÇþÂ6¿ú9h¿Ùþ ÿ Ý—þ ÿ£û?Äô²ÿÁqÿ㵡ý£oý¬ºhÞn M/Ü;B‚£¯¯Î:T0ë6ó_‹UŠ`G‰& l‘Óï(ç9=@J«ýŸâú Ùà¸ÿñÚ?³üAÿA»/üþ;Z:½µý­”›Ì×LV0àaY¹= }êu›xµhb˜…‘"y€ZHàSÎrr: r(¯öˆ?è7eÿ‚ãÿÇhþÏñýì¿ð\øí^Ôu8ì4ò'¸–@Ì#„ÛW›’G¿#éµ+h´ÅÔ2Ò@꬛KîÀP©$Æ€9ÏÙëxkR{½RÖxE´›£K3?)Çͼãœv­?ìÿÐnËÿÇÿŽÕ^¥÷‚õ–Xä‰â†HäŠLnF88$t ðOZèèû?Äô²ÿÁqÿã´gøƒþƒv_ø.?üv¶è  OìÿÐnËÿÇÿŽÑýŸâú Ùà¸ÿñÚÛ¢€1?³üAÿA»/üþ;Göˆ?è7eÿ‚ãÿÇknŠÄþÏñýì¿ð\øíÙþ ÿ Ý—þ ÿ­º(û?Äô²ÿÁqÿã´gøƒþƒv_ø.?üv¶è  luĉÚmbÒHÕIt[¥‡p˜qõÁªÿßÿØúÃ]=çüyOÿ\ÛùW1áßøýðïý€?¬4ÖÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_PÿuÏýräk·5ù\ÿ×'þF°è®¡þ¡Þþ†Š5õ þ÷ô4P]EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\µõ¬—Ú·‰,â*$¸Ó¡‰Ka0ö溚µÿ‘¿Vÿ¯k_ç-bÇàùãÔì§K˜ÒÝ-)ÑIÈ•¢]8ï…ÎqÓ=é4ÿÜ[ØÝÁ/Ù–I4÷²ŽUši dc$1ÂŽ‡hØö®ÆŠâïü!{ömó[Ä¢ÌEp¨ÌwJŠÂ6lþ¤‡Ã…°µ¹Cauv"™nRãw–Ï#n.¤sÛ§"» (šÑ|2úv¥i<ï Â[iél¬Ãæ˜à`àsš‹Â^¾ðôƒÌš £–³üIJȤãaÇÝÁèqÍuTP+{᛫­zkÖkf‚KûkŽI;c‰‚1ŒäŒTQøVñ/E’ÙbûEã¬À¬s` ¼}áŽ=믢€8Û ][Ø^BâÔLú{ÙE žgÝ‘ŒÇ:| cÚ¯ŸJ²iÜZÆ–V³E(ÛÃ;¢¨ ceNsŠèè ×Áú—‘yÍŬiÓÅ®èYŽ6s·hO éúÕÛ¯__ØL³Ç§[Îe†DKmê¯åöw79ãzêè Jm%ô릅>Kö’d…ä”(‘ a‹9%ˆ$dà}8§iž¼Óµ¤¼f´ŽÎ+ìBÒ»?t0%<áŽk«¢€9à–X4èÑ´ú´3ùl0P=È`=Ž«ö¶{ˆ cg:š²‡vA•H[ï/ ñÁç•cÄŸñëeÿa_ýµSN}eu=li¶öEöó“q;£nò£ìñŒw  í´NÙ¼ÜXÜK4D¬@Aæ;0¿7†áwŠ·—Z?þËÿÆèó|Oÿ>Z?þËÿÆè3§ê_nRúx¸V°RPn2mÉq³®Þ‡³QJðC’ĸµ»ˆ²û·Õ†Áè 0íÚ¬ù¾'ÿŸ-ÿåÿãty¾'ÿŸ-ÿåÿãtÝ#IžÖø]\Å2Aä©[©¦$ ûü(ùG?_[6Ö’YiqJT³Ks(ÚxÃÈî?0ÍAæøŸþ|´ü —ÿÓ%“ÄfšRÅ´ï)u!`½ð c'ôWGÒÖÿFÐäQí†äH„œ’âÿ¾=Ž*(¼9©Ç;\ÍqÔ¢w+þ‘$ÐÇfAÿºç‚ãÒ—ÃÒxŒxsLöšSEöH¶º1]ƒ3ƒzÑó|Oÿ>Z?þËÿÆè•LJ®Žš¶¶ßfRÖ7vÎ …iа Ä€W$uϵ_ŸBµK5‹M³´µs=¼ŽcŒ&áªç8ð=Í7Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ ,´[¨ÆŸmt¶¿fÓÑ—œ)ó\†ÉääU4ÿ Þ[ÝÙÍ=Ì2|ÜàœÈ#AŽ: Ÿ|â´¼ßÿÏ–ÿrÿñº<ßÿÏ–ÿrÿñºuÖ—4WÖ׺~Ù¤‹Ì ÕÄ„ûyV;¶‘· Á5—‡/¡À·‘Ý$£[©`DY°|§ÐsZ^o‰ÿçËGÿÀ¹øÝo‰ÿçËGÿÀ¹øÝDt[»*HÖÒ(¢K˜þl¹‹˜ñœÿç'8­Bº%ürÑ-ŒÿjÆëpXª+M$€ãoÍ‘& ñ÷G5oÍñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ  ©áùÖûçÉÛ ×˜×Síày@íÈ<žƒ¡«­¶±y""EjÖŸ8’/µ¼FN~\°Œœmê98É]æøŸþ|´ü —ÿÑæøŸþ|´ü —ÿÐZ‚”Õ|4qž@cŒåWýNÀÈAô¨ltI­od•ô}"gk¹gM!iÿTy÷»uªÚ¤šñÕ4c5®š.Ëù*·Q¿s&íÇfG0áZžo‰ÿçËGÿÀ¹øÝ6ÃH¸‡QŽ{G¼Û†$‘4«"œÁ0<úzñ™…®ã³²fI`†9I»™P€‹€ãåÈÉSÍjù¾'ÿŸ-ÿåÿãty¾'ÿŸ-ÿåÿãtÛIŽ pMÝý½ÀÝžcÉÊž:þíð:r=ê ½ éõI¯¡1¾éÙÖ/´ÉU¢‰I,ƒ ƒãÕgÍñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ Óô‰ìn4çAH!¸ŽU9Á‘Ñò»²[•#’:çÚ—Â_ò_úù¹ÿÑòQæøŸþ|´ü —ÿÖ_‡¤×—K"Æ×M{´Üli®\þùó޹ï@mæøŸþ|´ü —ÿÑæøŸþ|´ü —ÿÐÍæøŸþ|´ü —ÿÑæøŸþ|´ü —ÿÐaÿ#~±ÿ^Ö¿ÎZÙ®JÖMxx—Q0Úé¦àÛ[ùÊ×~iví;2xë?Ôó|Oÿ>Z?þËÿÆèfŠÆó|Oÿ>Z?þËÿÆèó|Oÿ>Z?þËÿÆèf©ë6’_è·ÖP•Y.-ä‰ YHöæ©y¾'ÿŸ-ÿåÿãty¾'ÿŸ-ÿåÿãt²8ŠÆó|Oÿ>Z?þËÿÆèó|Oÿ>Z?þËÿÆèfŠÆó|Oÿ>Z?þËÿÆèó|Oÿ>Z?þËÿÆèf±¥ÿ‘ÚÓþÁÓÿèȨó|Oÿ>Z?þËÿÆë.Y5ïøJmÙtßµýŠq³íåìß;¶gv{cï@¦JÑë(|‡òïE¸ò£L0b>”š.›%ÅÔÍ­ªL-µ«•Î[•^NFxþÖ™æøŸþ|´ü —ÿÑæøŸþ|´ü —ÿÐA¡Éý‹¥YÍy,3XDƒtJ³ªmÎNG\qTnì¦Ó|1¢XÜMæËÝ”lÜc"DÛ#8ëWüßÿÏ–ÿrÿñºË×ä׿ÚítÕÅí±‹Ê¸vËùÉ€ÙA…õ#'Ú€:Ú+Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ  ²žA«Ç,í_Ì^êùQ¡ê0Púði4]*m2{ö’íçŽy•ãV0h¼…UÁùqÆïšÍñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ  šÆñGüyØÿØF×ÿG-o‰ÿçËGÿÀ¹øÝeëòkÆÎßívºjâöØÅå\;eüäÀl Âú‘“í@ ¶’>µkz ùpÛÍy%Ú21íòÒ¨[iQ_ý¡û%µÔ×Q°c½šMÿ)ÀÌnrsÇæøŸþ|´ü —ÿÑæøŸþ|´ü —ÿЛ‹[›©4¹¥¤–Ó™fUrG1H˜Sž\uŒÕK"êKù¶4?d¸»†îF,w«Få ˜×œŒsÅ;Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ ÞÚj2ÝC{n¶¢x’h<´£•!³·ï ŠqŒrF{Ó$Ò®‹™E²Ò;s ŒÇ,ñ0`c€v/9'“Çžo‰ÿçËGÿÀ¹øÝo‰ÿçËGÿÀ¹øÝP×m&¶ð‡ˆ&ºòÄ×k$α±e_‘PHá8ÔW%âi5æðÖ¦/­tÔ·û4›Ú‡g)Æ@:ã½jy¾'ÿŸ-ÿåÿãt³Ecy¾'ÿŸ-ÿåÿãty¾'ÿŸ-ÿåÿãt³Ecy¾'ÿŸ-ÿåÿãty¾'ÿŸ-ÿåÿãt³Ecy¾'ÿŸ-ÿåÿãty¾'ÿŸ-ÿåÿãt³Ecy¾'ÿŸ-ÿåÿãty¾'ÿŸ-ÿåÿãt³Ecy¾'ÿŸ-ÿåÿãty¾'ÿŸ-ÿåÿãt§yÿSÿ×6þUÌxwþ?|;ÿ`ë hË'ˆÌ..-4¥‹iÞRêBÁ{àÆN=ë;ÿñûáßûXh­¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¾¡ÿ ëŸúäÿÈÖnjò¹ÿ®OüaÐ]CýBÿ½ý jêýïèh ºŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( °­äoÕ¿ëÚ×ùË[µ…kÿ#~­ÿ^Ö¿ÎZÖ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(#ÄŸñëeÿa_ýµ/‡ÿãó]ÿ°‰ÿÑ1T^$ÿ[/ûÚÿè媉j×–ž#"yKj`ìFPX„Ÿ½òžCÁèqœÐSTÓT±sfå7^¨kuä4ƒil㨭sÐé7*°›Ý.câ¶1ÎìÂåJr¤íÛÆ+BßM¸K? «@¶Eç#(»¡ç¿ÌÀqšÙžx­ãLÛTº 8'æf £ó T•ÊͤÜ5Ù-¥y·?Ú)?Û¼ÄÿT% “»å^6ãdsQÇ£Þ %tÍ—k[›Ÿ9GÛ‘ ;€n_ÝÁ4×Q\»idÉŸØè*ò§ïŒåŠ Y6òÆ6°À?Åž¹¦¶ƒ{<‰"*É ¥Ø‰™÷ yÐÂ=Ê׶ߥtÓÍ´O;¬qF¥› ©ªcPµ¾³»îû£ŒïI"hÙrÖàúÖŽ•ud·Wú\ÅþÌSìó=¸I¤È á Œ™ˆ<ž9­>)…µü÷–·‘ÝK-Á‹ç6DlØ'ƒýî§šOê–ú‡ìç™RâêÆ3 ~}±®yéÜVÄ7Ï$ñÄûšÝü¹ÚÛCc߆ñ®gMÒŽ¥¥hEaèû ªÀ4r!Žù Ú«6«Ï,²êVí25ӳҼïÝD‹ Y2¸ùƒ‚7~`]Ýý­’»]J$/9àŸ‘1¸ñé¸~uzÍ“Œ‘uîE -¤±‚Y‚¨”g%…sךÑÓ¢Hìši¿³o-Ã<‘³ÆÒ`Æ¥¾QŒnQœtæ¶.´.Á#³ûL’›ga5ÓÉ…I‘˜ì@Àñ׳Er¶,Ûí"ŸOò]Òúïz¶B§¡ÜrÄ7Ì1Нa¡êßm¶’õI>Ø|Àp Ç”@Ï;ˆ,Gló@•Gñ\Fd…·(vBpG̬U‡æ¬]SMî­¥ž)u{T2o¶“Êc·kB© 99ù³XÿؾLkqc4…”GoÀþK¤`IªÉó/#(¶¦Ç"Ê¥”0ŠüÊTä·{õW:ú5ິ„%¤ÑÂ/]ä Û¡äg¦âÜqÑ{UfÑîƒÌn´¯·$†!<Õ_!šy\>s•ܬŸ2å†Þ”ÖÕ[ÝFÖÀ ¹wÝ %V8šF u8PNG=9Ï&‰vuŸ>h®QxeJð…îÈ]ÛL¿w ·¡õ©ªý®âéÓ¼n$¼©Ö9W‘µ•· )ÆO9é‘ÔPZœ±Ï¬xrh\Ì@«5ËXøy ìIy¥Ä-ckâC(þdÈÑœÏÈäq·éTÃú”B·ÝIpmàHåŽH?ÑÙcU`]u;ƒ6S9ÍwW7{¡½ÄÚœÍjK›ûbŽXdÀ¾A|ð>Gã©Ú=ª­æƒ8º•b´c¦‹—dµ€C‚(€`²|˜ ²qÁËd{€uMJÙ¢Š(¢Š(ÃþFýcþ½­œµ³XÖò7ëõíküå­š(¢Š* ÛÛm>Õî¯gHaŒÎÇüäûTõŸ¯Ú=ö¨ZÃ’im¤H”ã—*@äð9=hBŠAEQE/üŽÖŸöŸÿFE[5/üŽÖŸöŸÿFE@—T±{{«„¹GŠÌ‘;¯!Pǧ\:R[êv³Á$ù–£ûÍsÀýöjƒi’mzl;Ésk O1L¡ägo*ÑRi×+-×Ú"¹ŽÑÂyp]Ì&pÃ;Žw7åÀÏcÒ€4#¼¶’Áo–eû+D%Â3žzqYõÄWzN™unûášúÎHÛeL¨AÁö¤ƒH¾ifh­äµ†/:)bóUÙP ¬:0Ï\ §5µÕŸ„´+[Ý‚xnlQ•F6âDêrGL޵utQEAk{kxfû,é/’þ\…@lŒý¢ÖöÚñ§Ò¬†ÞS ¸þ?"+:-:éFµ»‹3u8h% ÉK`Ý[ÓÖ›áÝ6óM“PKƒoäÉ:´"(ŠQ®yvÀùqƒÎA=ÅmV7Š?ãÎÇþÂ6¿ú9kf±¼Qÿv?öµÿÑË@_mµûp±óÐÜ”2y@ä…O§ÞZ¥”·ÍeÄΤŒl`¤Ž 60HÏ ŠŽ[G>"´¼H‡––³Ç#Œgs4EG©á[ò¬ëM>ñ5 hžÜ¬6··^~õÄ‚O3 s‘æsË@S^ÚÁu´³¢ÏpHŠ<üÍ€IãÓóQIªYE|¶O1±¨' cœp ɪ÷vó]Üè÷BÔÆðÜ&V+º50ȸ$~f‚zÕ+:ñõˆ’ÐÜßAwö너ò¤g9>Wù¨^ÿQ´ÓÕêF]ùÚ6rp2N€:ž‚¤šîÞ 3w,ª xäzcsíYz‚^µüðXI)Š)íÌ;и¡WäãËõΧjŽ]>í<=k¦G ’K8í\>àV‰Ô”9ÉÙÔŒ|Þ´ß^A{à­Z[g,¢ÞE!”«)T€Aö"º å5˜'Â>#¸¸ˆÂ×~d¢& ”Z Î ;3Á=k« Š( Š( Š( Š( Š( o?ãÊúæßʹÿÇï‡ìýa®žóþ<§ÿ®mü«˜ðïü~øwþÀÖëh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š¯¨È:çþ¹?ò5‡[š‡üƒ®ë“ÿ#XtWPÿP¿ïCE‡ú…ÿ{ú(®¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬+_ùõoúöµþrÖírÓi–º‹õ?µyß»¶¶ÛåÜIS.s°Œôï@ÿΗé{ÿóÿñtÂ3¥ú^ÿà|ÿü]lQXÿðŒé~—¿ø?ÿGü#:_¥ïþÏÿÅÐÅÿΗé{ÿóÿñtÂ3¥ú^ÿà|ÿü]lQXÿðŒé~—¿ø?ÿGü#:_¥ïþÏÿÅÐÅÿΗé{ÿóÿñtÂ3¥ú^ÿà|ÿü]lQXÿðŒé~—¿ø?ÿGü#:_¥ïþÏÿÅÐÅÿΗé{ÿóÿñtÂ3¥ú^ÿà|ÿü]/‰?ãÖËþÂ6¿ú9j+gÕtÍCTÙ¢\]EswçG$sÄ -£0=TÕ-sB°¶´·ò…×ï¯m¢}×r·ÊfLã,p}Ç5¯ÿ¶“ýÛßüŸÿ‹ û[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øº?áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâèþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.øE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº?µµoúoð"þ.ím[þ…›ßüƒÿ‹£þm'û·¿ø?ÿGü"ÚO÷oð>þ.€ím[þ…›ßüƒÿ‹¦M©êÒÂñÿÂ5z7©\ý¢2?ß§ÿÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐ="ïX°Ñìl¤ðÝÛ=µ¼q3-Ä%T ŸÚ®kjßô,ÞÿàDü]ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtkjßô,ÞÿàDü]ÚÚ·ý 7¿øÿGü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]ÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÑÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@ö¶­ÿBÍïþAÿÅÑý­«г{ÿñtÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐý­«г{ÿñtkjßô,ÞÿàDü]ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtkjßô,ÞÿàDü]ÚÚ·ý 7¿øÿGü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]P¾¸Ö.µ 6é|;v¢Îg‘”ÜAóÓŸÕ…_þÖÕ¿èY½ÿÀˆ?øº?áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâèþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.øE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº?µµoúoð"þ.ím[þ…›ßüƒÿ‹£þm'û·¿ø?ÿGü"ÚO÷oð>þ.€ím[þ…›ßüƒÿ‹ª-Ʊ¦éÿeݹM&áqG‘œ£ ¿ÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@ö¶­ÿBÍïþAÿÅÑý­«г{ÿñtÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐý­«г{ÿñtkjßô,ÞÿàDü]ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtBÞãX‡[½¿>»)s 1…ûDR…óü튿ý­«г{ÿñtÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐý­«г{ÿñtkjßô,ÞÿàDü]ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtkjßô,ÞÿàDü]ÚÚ·ý 7¿øÿGü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]ÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÑÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@ö¶­ÿBÍïþAÿÅÑý­«г{ÿñtÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐý­«г{ÿñuAî5†×àÔG‡nöGk$>ÑrÌŒßÿdÕÿøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº?µµoúoð"þ.ím[þ…›ßüƒÿ‹£þm'û·¿ø?ÿGü"ÚO÷oð>þ.€ím[þ…›ßüƒÿ‹ª½Æ±¨[Áxví WPÏÍÄ„1пÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@ö¶­ÿBÍïþAÿÅÑý­«г{ÿñtÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐý­«г{ÿñtkjßô,ÞÿàDü]ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtkjßô,ÞÿàDü]PÕî5BÞÓ÷hbº†~n ä$ˆûþ€ÕÿøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº?µµoúoð"þ.ím[þ…›ßüƒÿ‹£þm'û·¿ø?ÿGü"ÚO÷oð>þ.€ím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹ û[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øº?áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâ膹q¬jz%í„~»G¸…£Vkˆ0 þz¿ý­«г{ÿñtÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐý­«г{ÿñtkjßô,ÞÿàDü]ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtkjßô,ÞÿàDü]ÚÚ·ý 7¿øÿGü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]ÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÑÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@ö¶­ÿBÍïþAÿÅÑý­«г{ÿñtÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐý­«г{ÿñtkjßô,ÞÿàDü]ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtɵ=ZX^?øF¯Fõ+Ÿ´AÆGûõOG·–ÓWÐíndÐèm‹pÁ¡dqÔUÿøE´ŸîÞÿà|ÿü]Uµ°·Ó¼_m ¨”#XNÇÌ™ä9ó!X“Û¥ttQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÔ?äsÿ\ŸùíÍCþA×?õÉÿ‘¬:«¨¨_÷¿¡¢CýBÿ½ý ×QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW-}u%Ž­âKÈ‚™-ôèePÂTLF}¸®¦¹¹-c¾ñ¿g)aÅŒ1SÈ ç~hÃk1Ûh6º•â±iÒ,G 仸USëUÿá)³ÿWö[϶yÞOØüµówmÝë·yÎqM_ CöAk6§©O òƒÈŸ¹*AVRr1ß4ïøE¬ÿÖýª÷ížwöÏ1|ÝÛvúmÆÞ1Š/|Sicg ÔÖwþ\¨Îs_,)Á ¸Ÿa’{TÖú³Üx‹ì1„6­`—Hø;‰g#צíUï<'cyI-Õîcà/æ†gWää°<çÓ8«ÖšE½­ôw‰$­"Z%  F )$^~žÔÏÉâMb}GRxì_O°¾{gŒ#‰J+…Üqäv­{YAy,- ÓE Ë·+1FíŒ)9ÏqÐ`f¡>³i¦2^_=¼÷&êKS"ùLå·räŒãŒö©®<3eqy,Í5ÒÅ4Ë<¶Ë HëŒ1ÏaÐàâ€+·‹­>ØÖ±Øj2H&–Ù‘#Ç÷‚üÞœóŽ)×.°ƒN¶¿û=ä–÷C,`®I gØj̳‚ú+´’s$WS](,1ºPC9ãúÕ)<§=½°¸¼U··{`Êë–F99ùzý1@¿ñ<’Uäµ[8®@Ž,¹ß&Á‚XzŽ1øö­/V‡S{˜’ ˆ&µp’Å:…a‘x$`Чuá{±‰f¹ÿh­²~ìnr9öì+B×N†×P½½¤2^²4ˆÀÚ¡F8ôÊi^4¼¼²ÓLöðGws{2.Óµ¡}øtçÕHïÈ>µ½gâK;½_û0Au çyC2·¯Ü=²j¼#¦E”ŠÓ–Òß|2›œá¸ägéN°ðµ•†£ì7E¡iYÙJ3ﻓϾh¤~8°’94ýH¯nî—˜ÁÃ7ÞèçôÍM¨xÏGÓîžC˜ÒFa´VéÁ ž9ÂƒŠ’ ØAl I®J‹,rYså¹É=>÷éíR·‡-|å’«Ø•Re ç*}ÝÇϸ"€â2 ¥‰ƒ¨Úÿèå­êÁñüzÙØF×ÿG-oPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYé«C&¯&œÌÏäv©+¸gØÁëŒgŒæ´+=ô˜ŸVQyçgŒ–HÉ•ÚHãv1Û8Ï8Ï4^ fD‹R—P€Eö;•…R#½›rFT{’dñZu÷[ù­æ°¹•a@Bù’;ù„€CmÆÔÎsÆjìºM´ÑÞ£´¿é’¬ÎC`£ª R¾˜òÔ÷æ«6™®$¿½’è”+;Ü…7€@ ·¤ŒÆhÓêQŤO©Mñ$¼’Fé‡3‘Œàô8ç×YõµÃ¡·žÞXä·fE;–Y6)nøaÉÈÆpzeÒm:Ko.Ú)a–)Ie,þgV'Î1€3Ó¦s¥Ass$ò<¤ò2Œ~æC"öîIÏ·¥6ÇV†úò{xa˜ÈÁv–VÚG ç¦@ÈädUiäv´ÿ°tÿú2*³m¤Å©&¡çÏ$®¬€HT„V`ÄHÈÉ8 ­/üŽÖŸöŸÿFE@4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÔ?äsÿ\ŸùíÍCþA×?õÉÿ‘¬:«¨¨_÷¿¡¢CýBÿ½ý ×QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW-5”—ž/Ôü½BîÓeµ¶~ÎSæÉ—®å=1ÛÖºšåï/ÓKÖõûé#y +g(ƒ“Ì´gûçþ† [ó‡ÿÑý‰sÿC­ùÃÿÆêµ—‰Œ¥½¶‚EˆÈn`»YÑ1Ù°Ó®jàñ’l'¾ûQX-ÙVRÑ:² ©ç#µ3ûçþ† [ó‡ÿÑý‰sÿC­ùÃÿÆém¼M£]\Ço æe‘Ìj¦'_˜ $pxèiðx‡IŸP6]ƒp$x¶˜Ø ë÷—$c`RNG^‡ŸØW?ô1k÷Ô?ünì+Ÿúµûêþ7VõMGû9 o³É0šxá%pou\“ÿªº¦º¶:‚Y¤p¼›F\‰ Ä€™ŽÖãŽy þ¹ÿ¡‹Xÿ¾¡ÿãta\ÿÐŬßPÿñº½u¨ÃmÌDŒÑ0@.äsÁÎG#ÎzÍ‹_šæ wµ²Œ¼–1ÞȲÜlŽ;NãÁô9æ€$þ¹ÿ¡‹Xÿ¾¡ÿãta\ÿÐŬßPÿñº·­g%’Ýïu…­Òãs!ÆÆsŒÇAÏOQTˆÔhðÞÉn°I=Ì–ëóUdg»`ãˆÉè}9  ?°®èbÖ?ï¨øÝØW?ô1k÷Ô?ün­Å¨<š7ÛÖÙÌe„18}ç°V{J¦Úä°¥Ú]Y¢ÜÛ˜T$SoWi[j ÅFzñÀ óš_ì+Ÿúµûêþ7GöÏý ZÇýõÿ£ûno(Eö4ûwÚþÉäùß&ýžfwíÎÝœýÜöÅWŸÄÛ#³Ù¤R\ w‹»¿%Q£pŒ¡¶œÄãÐÐì+Ÿúµûêþ7GöÏý ZÇýõÿ«š…ì¶zr\,1Ë+Éa<Òsº§ÞÁànÏNÔ–º‰¸ÕnìZÚH´q¾ö#¸¸ãÛäëúPOì+Ÿúµûêþ7GöÏý ZÇýõÿ«zn£ö÷¼So$Ö$‰1–ù³ÓïÔzõ¼¢ËË)¸ŽÜá fuR7ãn@9ÆsÅGý…sÿC±ÿ}CÿÆèþ¹ÿ¡‹Xÿ¾¡ÿãugûkOûCÁæ¾ôfR|—ÚYA,¡±‚@€sÁ§I«ØGö¸ÊùI/ÊŒÙW;S’x©  ŸØW?ô1k÷Ô?ünì+Ÿúµûêþ7ZP]Åqiö›}î˜8 ¶A ŒrÁª–šÍþ–n¬ìÐMçI“q1LlvC’ªÜü½0~´öÏý ZÇýõÿ£û çþ†-cþú‡ÿÔÚ~©-ŧŸwj±o•£‹Èf™d»; #žEUOmí}§ˆZ;'¼Dn;W+ü£kr=G^x  ?°®èbÖ?ï¨øÝØW?ô1k÷Ô?ün¦ÓµSsj÷ýŒ¢º 6W r2Há9#×Ô✚¼rkßÙqDÌ/#MŸ”2”©ùÁ>=p_û çþ†-cþú‡ÿÕ[[G³ñ}´r^ÜÝ“a;o¸*X~ò>Uzw¥›Ä—0Çy¿O‡Íµ´k¦ˆ]e‘FÙ0¿#r àóÅY—þGkOûOÿ£"  š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+êò¹ÿ®OüaÖæ¡ÿ ëŸúäÿÈÖUÔ?Ô/ûßÐÑF¡þ¡Þþ†Šë¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+›xëÄzä <3Ú[,gæC™yÒW-4:„¾/Ôÿ³ïa¶Åµ¶ÿ2ÜË»™q™qß×­@þ¸žY.'ÕB\˜åµµ‘»-ƒótö¢?2Øj6­~™¾’ -¾Ð†2¤ñ»œíõïÞ´~Çâú Yà¼ÿñÊ>Çâú Yà¼ÿñʃþ¿ßyŸkÿ˜¯öŽ<¯ö6ìëøçôªZW‡oP–{éÌvñj“^Eo°ä’·Ó¦+Sì~ ÿ Õ—þ Ïÿ£ì~ ÿ Õ—þ Ïÿ  •ðNÛ%¶þÑÎÛXí·yÜ›ÍÝÝúcñö§kâjï¬i¬ò]=ÂHª¨‡Ë/,ðÌd{ŒV§ØüAÿA«/üŸþ9GØüAÿA«/üŸþ9@´-"öêÚîy-în§–_22»Ósd8ϰâ o Ëq$òÞj4ÒZËl¯ ¢Å÷ןæÇ§¡ö?ÐjËÿçÿŽQö?ÐjËÿçÿŽP'ð¦ë+û·cíŸfù¼¯¹ä„¼çgážõ5Ÿ‡e¶ ju};÷»mÄ 7ï3_9 n8ÀOö?ÐjËÿçÿŽQö?ÐjËÿçÿŽPðÔz,Þ`’ÞM±Çh‘1¬Ã%¸Õ¿Xÿcñý¬¿ð^øåcñý¬¿ð^øålQXÿcñý¬¿ð^øåcñý¬¿ð^øå/‰?ãÖËþÂ6¿ú9kz¸ýrÛXKK´jv²î½¶í³)±üäÜäN3ëZÿbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÕ]RÏûCJ»±ó<¿´ÀñoÆvîR3Žýj‡Ø¼EÿAË/üþ;GؼEÿAË/üþ;@¯ì¾ÙifÍ“C.vç>\Šøüvãñ¥µ³û=Åô¾fïµÌ%Æ1·¢cßîgñªbñý,¿ð\øíbñý,¿ð\øíSÿ„I~Åö_·ŸÙÿeǕǛåù~v3×gýjΡ Íy|×m@¾tSF²D\ÆP©ÂÀJóÆy<ÓþÅâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚf‡bɪêW¥dX^R–é"*Í!ó†r~¸©.435ü“-¤\Es,~V\¼{váóÀù#¿#4Ÿbñý,¿ð\øíbñý,¿ð\øí_ÔlþÝl°ùž^Ù¢—8ÏÜ‘_ŽÜ~5GVÑ¡4î— Ý[‹k€bÞY$m9OÌÜóÛŽ)>Åâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚ·w¦G} kÇv>è<©&+ƒ–VïéÁǹËÿ„cfcf—0ȶ°·\Û ˆ8:l¡ô qÇgì^"ÿ å—þ ÿ£ì^"ÿ å—þ ÿ  £Á%¤62l HÖ(Ñ™Y:êÀÿwQŸ¥H|:¶ÖQEotÞt7’]Å$û¥PÌ_‚¥²~W#‚2~n´ÿ±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€&KšßC’ÂÖóÊ÷Ÿ´þë;$.FXàgŽ*tI†™-”³Ú(.’ÄööÍYƒmÎÛÎB÷ƒÏ4¿bñý,¿ð\øíbñý,¿ð\øí/ö,¾X”]§Û¾×ö¿;Éù7ìòñ³vq³½ïšG¹‚Ú(­/bV ”Íl$]·1 ŽIã${O±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€ JÏì~µµ·Y¥KImڥܤrÆIÀ<)Åâ/úYà¸ÿñÚšÛNº†{‹·»…®îHÌ–åP"q·q9!˜g>œqŠŽZ[jÐ_[Ép‚$•|£<Œ¥•‰å°ÊxÆ öß±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€(êÚMÔZMü³ÜÉ{0Óå´·XíÎöÞ8Ý‚w6Bó€'½^—þGkOûOÿ£"£ì^"ÿ å—þ ÿª¶±^ÅâûeÔ.¢¹”ØNCÇ”ó!ã¿9ï@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@õù\ÿ×'þF°ësPÿuÏýräk€*êêýïèh£PÿP¿ïCEuÔQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE…kÿ#~­ÿ^Ö¿ÎZÝ®ftº“^×ã°d[—²·X™É ¬|Ü€zP­_²Ö./ ´óZ>Æ. #róÈÊžjYõ½2;«¯·[É¢–˜G*±_lÔôÖ°tï ^i·Ví¥æÃöG´˜2*§•)´rC~nyëO³ðåòiSØÎºlñ/k(¥…{äcsryç4¯½§M<1,è¢xRhݤ@s 9ÎìOÇ5j]JÂä’[ëhÒ'òäf•@Fþé9àûW9qá‹Û´c4–ÑÈ4Èí£±Û4nY[îŽ:{õâ’o Ý>ŸbLÉ{ Ä·Î’$•äÎì:üÃã  –êú m2mCw›0´ÄÄCnP3ÇcÀªZ~º·±ùϧÞÙÛy^wÚ.B,{qœä1ÇÔQh²Cá ôx¼”–KycKùjλØÉÿëv¬› ^[i—vƒOÒ-äžÅíÄ2¹vb¸²ƒ‚y4ÓGªiÒÇ,‘_ÚºB3+,ÊB}Nxüj=;W´Ô®®à³0Z” "Q÷.á´ƒÏÎ^øBæYa{f³ŒCio–AÙ$‘¾âÊ‘ÆzûV·‡´«Ë ÝNêñmÞÈŽ±Ûµp¸=@ÿëÐ,|]¦_XÚ]À³•º» ®är †z`gŒõ­t¿²’í­îÝ®WïB$ÇÕsšä,üwm†ËqËe2½Ú«²…f*Gx#œuö©âð¥ï™ »Íj–Ð\Ë:ÜÇŸ´>ýÜ1ü\œœàPãkúhÔ`²Žæ9^Q!-«,['yÏjÊjzt–¯t—ö­n‡ (™J)÷9À®:_êWVö¶²¾vÖ²[‰`ݾLµ˜cÔr3ÜõÍ]_ Nl.•à³[‰¤‰€ûMÃý·Ìcy8Àã¾hª·¹‚ê5¬ñÍtxÜ2ŸÄTµ‘á½6ëLÓä†öH^Y&i?vã‚ØxŒÖ½dx“þ=l¿ì#kÿ£–·«ÄŸñëeÿa_ýµ½@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@¯nþÉo5ÃÈû8@$œÔÀ<’*§öõ˜³¶¹e™EÄÂM™`þg–AÇ ß?LÕN+™­Õ-VÞL¶%†~T ‚¤àã¨=Lw¬øôyãðý¶ž ñ\Å6;Vq&Åã8 6 é@:½µý­”›Ì×LV0àaY¹= }ꌿò;ZØ:ý\¿´’æëN• …µ¹2¾O$¤N=òãõªrÿÈíiÿ`éÿôdT³EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP}CþA×?õÉÿ‘¬:ÜÔ?äsÿ\Ÿùà º‡ú…ÿ{ú(Ô?Ô/ûßÐÑ@uQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ròiÿÂ_©ÿfCi'ú5·™ö‰™1̸ÆÕl÷ô®¢±¬?äoÖ?ëÚ×ùË@ ω¿çÏHÿÀ¹?øÝñ7üùéø'ÿ­Ê(>&ÿŸ=#ÿäÿãtgÄßóç¤à\Ÿün·(  <ø›þ|ôü “ÿÑŸÏž‘ÿrñºÜ¢€0óâoùóÒ?ð.Oþ7F|Mÿ>zGþÉÿÆërŠÃω¿çÏHÿÀ¹?øÝñ7üùéø'ÿ­Ê(>&ÿŸ=#ÿäÿãtgÄßóç¤à\Ÿün·(  <ø›þ|ôü “ÿÑŸÏž‘ÿrñºÜ¢€9BÏÄ—ÑDm¤§•:å5Ÿùßÿ×¼Ÿú ¯A¹¶·» »‚)á|nŽT §# ñÔUøG4úi¿ø øTJ7w:(×öqq¶å/jÚj颶ÈTÕß#…e>pé”FW¦âÊuÕûًͫ­OÈhïnD‘yj>È‹ê’n#åÜŸ?ÏÝW ®ÆŠ³œã´ÝRÖ=8lµX¢€j7 qr³,o’fFf}Àn*€3g;¸äƒQiZ”©KSì#|ÒÁþŽírµÌÛ—Ëp\ãj|ŠCøÎHÇmEsªÝ¯Û¤†ûÌÔbûNÍ/Ê…Mþ[mP$]ÁPîbA߀åÄK¨ÞM¨[Ùiº×Ú­eÞìŠC“ìñ‚€.G—2 r+¬¢€9]VïY¶ÔేQ´„Ja’æE€]H]†Ò66òL„(rÝ·([mÝ‚øÇR5(§žX!ufÞ¯>äU6Œdîy$žŠŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+_ù­?ì?þŒŠ¶k_ù­?ì?þŒŠ€6h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š¯¨È:çþ¹?ò5‡[š‡üƒ®ë“ÿ#XtWPÿP¿ïCE‡ú…ÿ{ú(®¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬kùõúöµþrÖÍcXÈ߬×µ¯ó–€6h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬S_·±•­¡ŠK«µ1§ ™Üð;p2Ø …"¹Û¹ïui\îP6ùVûá‰ë¹wùèC1Ødæe4©açSmŽŽïÄzU«¼Bçí3¡*a¶VVÂØáxùˆ} fOâ]B]ÂÎÂu?vK™7²úæ4à÷èþ‡Ú³Q4TB¢Œ*¨ÀÐRÖN£èwCñ;“K©ësã~¤méö[u]ß_3áŒwëÚõΪö޲kwÅr #ŒžG‘ÀŠš¡¼ÿWü?U974Ÿp¯BœiI¥²eµëô¼ÿ¿Pñº–=W\v¥ü‚sºêØ3a±cðÏ^} ¢³ç‘«ÃR} 8|Oyæ˜%P1¾Ò`Y®ÇÚuþ&#ÏZÙ°Ö4íEü»;¸ÞP¥Œ'ä•Fq’†‘ÔwµÉÔsÛÁr.aŽd!d@À^jÕGÔÆx(¿…Øï¨®*ÏPÔtÒ~Í)º‰ŽZ¹ŽÙî+îaÇd“Òizͦ¤Lq“ Ê‚Ím)Q"¯÷° y‚Gn ¤džÇ J3§ñ#FŠ(ª2 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€1üWwscáùî,æ0Ì$‰U† 4ª§‚èOjânõý~ 9æMfrÑÆÌ†d ÿr»í{Mm_I–Å'3²0¦ð º·LŒýÜu®fÞO¾³Y©"ÈçcþzV´Ü|ÆSSmr.¡¬Cc{«A<²L¥€Œ.vޤAr$„ Àväf­Æ¼ÂúÚ [9äIn%‡~щLqÈYPî`èçÀ<‘2.jbߺ—º¹‰>]ñÆË¶M§#¨%H?Ä…[§<. mt“Çyw•,“BŠË²'‘\;Tä’å¾làð0 #Q¶šÌ§LŽk»m÷rÝMl–öÄÌ Àg*>ìdäã8nÐb€4h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+_ù­?ì?þŒŠ¶k_ù­?ì?þŒŠ€6h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š¯¨È:çþ¹?ò5‡[š‡üƒ®ë“ÿ#XtWPÿP¿ïCE‡ú…ÿ{ú(®¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬kùõúöµþrÖÍcXÈ߬×µ¯ó–€6h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+”Õ5©oÜŧ\<6cƒˆïÃa¯ïÌlq¬iµsŒ’I$’IÉ$žI'’O$Ó¨¢±=¬QE çüz¿áüêj†óþ=_ðþu¥/âGÕâƒ?GùQE™°QES$d ’êÊr¯”e=2GŽBGz} ¤Õ™±£ë“ ’ÓUtc! ®ÐÇ WÄ`q…8 ÑWè²#$Ša•†A†µôMa¡xì5 #°\9É'²9õì¿Có`¶ðôg›‰Ãr{ÐØé(¢ŠÐâ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ Æ—þGkOûOÿ£"­šÆ—þGkOûOÿ£"  š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+êò¹ÿ®OüaÖæ¡ÿ ëŸúäÿÈÖUÔ?Ô/ûßÐÑF¡þ¡Þþ†Šë¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÃþFýcþ½­œµ³XÖò7ëõíküå  š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ æ|O}çÊš\˜ÆZóiãùb?ïgqè ‡çkW¿f%ÙŒÈU•ÆY˜*äöa“ÏJãmãh¢ #ù’1/#ã݉flvÉ$ã¶j'+#« GžW{"J(¢¹ÏX(¢Š(¢Š*ÏøõÃùÔÕʆ·LþUt¦Ÿ™–!^”’ìÿ"J(¢ Ô(¢Š(¢Š)Dd‘C# 2°È#ÐÒÑ@¾ÔX^ÂîR÷0cgl´±q†÷Û‡’xýá[µÁ±’9 ¹·ÀžÞA"n<¡”õÆT²çÏQ]­…Üwú}µì!–;ˆ–T 0@`Ï¿5Ñ ]>&³ž›2z(¢¬ç (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ Æ—þGkOûOÿ£"­šÆ—þGkOûOÿ£"  š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+êò¹ÿ®OüaÖæ¡ÿ ëŸúäÿÈÖUÔ?Ô/ûßÐÑF¡þ¡Þþ†Šë¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÃþFýcþ½­œµ³XÖò7ëõíküå  š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¦Ë$pÄòÌëh¥Øà(I=…r~!¹zâÀ„˜ì‡çƒ+€zzªcžx”Ž0jCjòO]L¬²Ý;Nêÿy7„$õÚ0¿E•5sMÝžÕrSH(¢Š“`¢Š(¢Š(¦Oþ¢O÷Oò§Ó'ÿQ'û§ùUCâDTø ú(¢¤°¢Š(¢Š(¢Š(­O \ˆnîôç'u<ÂºÛ †÷28&²éãìZ…öp°ÊS»hòßåmDz®CœñòEÁÙœø˜sÓ~GwEWAã…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@cKÿ#µ§ýƒ§ÿÑ‘VÍcKÿ#µ§ýƒ§ÿÑ‘PÍQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@õù\ÿ×'þF°ësPÿuÏýräk€*êêýïèh£PÿP¿ïCEuÔQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEaÿ#~±ÿ^Ö¿ÎZÙ¬kùõúöµþrÐÍQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@cø¶Bž»@'ÙnÙì²:ÆÄ{áŽ=ýkb¹ï±û>›NÉ/@uìØŠFðʧêíIè‹‚æ’F5Q\§ºQEQEQEÉÿÔIþéþTúdÿê$ÿtÿ*¨|HŠŸôET–QEQEQEÌ sk-¼„„• 1^ Ž*J(©×h×r_è¶7³Y.-ã•ÂŒYA8öæ®V/„Ÿ $$Ó¢ƒü*³:¨€€­ªë<¬ìQE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ Æ—þGkOûOÿ£"­šÆ—þGkOûOÿ£"  š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+êò¹ÿ®OüaÖæ¡ÿ ëŸúäÿÈÖUÔ?Ô/ûßÐÑF¡þ¡Þþ†Šë¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÃþFýcþ½­œµ³XÖò7ëõíküå  š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ç™Vˆ tôïRº­sO:–™$1•[…Ä;pAÓ'ýÓŽv’;×%¢xV@¬™êŽ0Èz#± ŽÄVÏSSš<½‡ÑE™ØQEQEQEQEQEQEQE£á[;U½¾còÛ¨µŒw @w?B Xÿtþ9SHX­”5ÌÌ#…H$= Ç;G$ã ö®×M²NÓೈ–XP)b9sݹ9$÷$Ö´×S‡RË‘h¢ŠØóBŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ±¥ÿ‘ÚÓþÁÓÿèÈ«f±¥ÿ‘ÚÓþÁÓÿèȨfŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ú‡üƒ®ë“ÿ#Xu¹¨È:çþ¹?ò5‡@uõ þ÷ô4Q¨¨_÷¿¡¢€:ê(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ưÿ‘¿Xÿ¯k_ç-lÖ5‡üúÇý{Zÿ9hfŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¹oXýŽïûJ!û‹†U¹ç$Hv¤l¡áOüà|ƺšl±Ç4OȲFêUцCÔÜRjêÅÓ›„”‘ÃÑV5=:M&QËIdì9XäÆODsßÑXõèyÁjõÌÓNÌö©ÔHóD(¢ŠE…Q@Q@Q@Q@Q@UÝJþÕÛst¿ñ/êˆåçÜÿÓ?ýýß¿Q‹lέXÓÙgÂÖ+2feËJ¤Zg°œØõb3þè^„¶zJ(®„¬¬x³›œœ˜QEÉ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ Æ—þGkOûOÿ£"­šÆ—þGkOûOÿ£"  š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+êò¹ÿ®OüaÖæ¡ÿ ëŸúäÿÈÖUÔ?Ô/ûßÐÑF¡þ¡Þþ†Šë¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ÃþFýcþ½­œµ³XÖò7ëõíküå  š(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€,qÍÅ2,‘º•taÀõwÇêš|š;–ýì¶•—Ì>¢C×h‡=‡Ìr2Ý•¥÷4¥VTÝâpˆë"+ÆÁ‘†U”äê)koSðé–i.´ÙĹ,ð:æ'n¤ñÊ18ÉNÒI54­i*C¨ÂÖRËþ­'týço”© œö#ŒŽFp”=JX˜Tòd”QEAÐQEQEQEɦŠŒ³È‘ƽYØ?Kf'Õ DqÝ(8i¼Ð"C׆N}”23€A®“JÐb²•n®¤ûUâç`ª <|©’ÆyäòFpp.0l櫊„4Z³3KÑe¿q.£nðÙŽDMò²pIà€ ÕÑEn’[]J’¨ï ¢Š)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE/üŽÖŸöŸÿFE[5/üŽÖŸöŸÿFE@4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÔ?äsÿ\ŸùíÍCþA×?õÉÿ‘¬:«¨¨_÷¿¡¢CýBÿ½ý ×QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV5‡üúÇý{Zÿ9kf±¬?äoÖ?ëÚ×ùË@4QEQEQEQEQEQEQEQEQEQEQEQEQEQEÙcŽhž)‘dÔ«£ †¨#¸§Q@7³9m>yì›’[|Dö;Tz!^8ôÆlú.µm¸¬Vר½áÇ#ý¾Qwè3í]….)›B½HlÎT½·ÇÚ´«ø·}ݱyÙõÿT[Ž3Û<ÔMq±KIk(Ë<–S"¨îKÀç^EO³FËSÈà<çÿŸKÿóÿñ,qj®ûm"úT²,'?IOãŒ{õ®êŠ=šÆÔò9t-fãCgd¤n‹Nãý’£hÔ†#ŽýkVßÂúTc7Q5ûã–»>bŸ}ŸpÙ æsµERŠ[δçñ0¢Š*Œ‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ±¥ÿ‘ÚÓþÁÓÿèÈ«f±¥ÿ‘ÚÓþÁÓÿèȨfŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ú‡üƒ®ë“ÿ#Xu¹¨È:çþ¹?ò5‡@uõ þ÷ô4Q¨¨_÷¿¡¢€:ê(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ưÿ‘¿Xÿ¯k_ç-lÖ5‡üúÇý{Zÿ9hfŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ±¥ÿ‘ÚÓþÁÓÿèÈ«f±¥ÿ‘ÚÓþÁÓÿèȨfŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ú‡üƒ®ë“ÿ#Xu¹¨È:çþ¹?ò5‡@uõ þ÷ô4Q¨¨_÷¿¡¢€:ê(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ưÿ‘¿Xÿ¯k_ç-lÖ5‡üúÇý{Zÿ9hfŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ±¥ÿ‘ÚÓþÁÓÿèÈ«f±¥ÿ‘ÚÓþÁÓÿèȨfŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ú‡üƒ®ë“ÿ#Xu¹¨È:çþ¹?ò5‡@uõ þ÷ô4Q¨¨_÷¿¡¢€:ê(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ¸´ÖmõÛ»í6+ b¹†(ÈžgFR…ýÿô­Ú(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ£Íñ?üùhÿø/ÿ­š(Íñ?üùhÿø/ÿ¦ÙZjÒkñê:”VQ$v²@¼Îä–dnè1÷Oç[tPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP}CþA×?õÉÿ‘¬:ÜÔ?äsÿ\Ÿùà º‡ú…ÿ{ú(Ô?Ô/ûßÐÑ@uQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@õù\ÿ×'þF°ësPÿuÏýräk€*êêýïèh£PÿP¿ïCEuÔQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWÔ?äsÿ\ŸùíÍCþA×?õÉÿ‘¬:«¨¨_÷¿¡¢CýBÿ½ý ×QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQUu;‹›M>YììÍäèÈ„/ÈîzzþÈ'Ž5©5I4Äð”†ò(üÇ‹í«¼s÷qÜ~tÜÑQZÉ$ÖË<&]ž"ÙØHåsß*Z(¬-kÄ2iÚÞŸ¤Úéíws{“4FGS’9àj†/\]kZ®Ÿa¤¼ë¦ÆKIç…ß& T ŽäšèèªÚt÷6Ïwjm'uËÂ_qCéžõf€ +™ñŠn´r×I±Ò¡qs‘œFxÎG*{)4š/‹&½×Nªié·f/65iDÇ×ßò4ÓÑEQEQLžT‚ &‘©fÇ ªÚN¥m¬i±_Ù34gieÁàxúƒ@(¬)|C'ü%© Zéí1 §˜ÊD¾¸ÇÍÔ~u»@U]NìØiww«”ÛÂòˆÁÆí œgð  TU-üêš=¥ûB`7‰<²Û¶çß5v€ +÷^û/ŠtíìÛþÛ¿æcfÐN6ãžž¢”øŸJmr×G‚à\]\oÿRC,{TŸ˜çއŽhbŠ+Ã÷ü$wWfû?Ùîžßo™¿vÐz ué@4QEQEQPÝ]ÛYBf¼¸Š‡åp£ó45‡kâ{Ký RÕtؤž;"á¾_4¢†ùO<ŽqŸj¿£_SG´¿hLâ1'–[vÜûàf€.Ñ\÷„¼Ewâ;V»“J–½#“íMäŒ+¡ Š( Š+žÖ¼Ew¤ëVo¥ -ogŽºû@f8?& ãõ †Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ú‡üƒ®ë“ÿ#Xu¹¨È:çþ¹?ò5‡@uõ þ÷ô4Q¨¨_÷¿¡¢€:ê(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ âtïù,§ýƒ—ùÅ]µRI°‹X—VH1}4~S˽¹^8Æqü#·jâ³ñ;\†æiÒ£‚B‘6Ýä"c> zV± ­Ý¶µªÛGqq$EýÍç–ѶG ê9ã?Ò½Z*Æ VãSŠ ·—*«,›Øî8Ît?ƒ|9qs=̺TM,ùóæÏRp¸Á 7ì6÷þ/ðœ×jòI}§¬× d`]ÖƒÁã é×½3NÒìíî+Ó“J±W“VH1{$^KK½¹LƒŒg‡jΟÁ¾¸¾7’éP´ÌÛ‰Ë'ÝAÚ*âÞ_ø£BRžxÚçFV£;ZA¹ûöÏ×§Ão6©l£1"ÀnrÇ5\é6U‹T6ãí‘E䤈ڜñ·8î{UÚàük¦M{®XÃÛÞÛÃoŸì“uä3rFåÆ8è?à5ÎÉ~ŸðŦÛ\ßÚYɪ {ÅžPßg^ê®?‡©ÿ€ûóézLJôp'ö¥’Ncû­’¬=²4Øü9£G¤¶”š|"ÉÎæ““ëž¹÷ÎhŠƒLÓ´ŸŠ%¦•;<" ÄeÞ#&7è{gâ´/ìlì¾(èÊÒ q$33ˆ£ ¸ì~N:šßÓü% é—]Øéë ðnòÜHäÀƒœžx'­_›J±ŸU·Ôåƒuå²²Å&öA3ƒÁ=EpíiiâkQk÷rD¶ ‚Ò17–q’ãÜpàUÎi×2/„¡´rGgy®˜®n¶’…9>üŸÂ½GTð΋«Ý%Σ§Ç4È0%I‡gñ¢ èé“i±éñýŽy ¯30Þ@9Jån­l|3ý°¾Õ$Y…Ø‚dž?zžÏëPhÚVkg êñëRÛj7L†GÞÒ—?z2¹õâ»=+ú>©§XǘbL’凡,IǵCcá-O¿ÖzdQÜ•l± }8€ 3LÓ´ÿI®ßxŽöE»¶¸t@f)öd\³#’ó[´ðj^Üί$÷ ÔüåA}q‘ŸjômGÂZ©xnï´Øäœýç Ë»ë‚3øÕ©t=2Yl%kD §çì» Qqœpz´çúÆžçÅvþŽÊKû K=ðÚÉyä$ò忈Œž=½nø"Íît{» a-om¡¹>Do2]‡÷ ç‘ýk Ö|9=:çšÈñ º¬^¿HÌk>§l'8ù±Šë¡Òl kF†ÝPÙ«¬'ä ÝùÎ;×3­è×ï©hv:^”LÓnâŸÏûH8²Ãkñש¬*Ô¥(%Ù¯ó~~ŸæRNçgEW0Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ú‡üƒ®ë“ÿ#Xu¹¨È:çþ¹?ò5‡@uõ þ÷ô4Q¨¨_÷¿¡¢€:ê(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+êò¹ÿ®OüaÖæ¡ÿ ëŸúäÿÈÖUÔ?Ô/ûßÐÑF¡þ¡Þþ†Šë¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÇñs¼~Ôä™mØ«)Á ÔðŒé~—¿ø?ÿSxÇþE Wþ½ŸùV•cÿÂ3¥ú^ÿà|ÿü]ðŒé~—¿ø?ÿ[P?ü#:_¥ïþÏÿÅÑÿΗé{ÿóÿñu±EcÿÂ3¥ú^ÿà|ÿü]ðŒé~—¿ø?ÿ[P?ü#:_¥ïþÏÿÅÑÿΗé{ÿóÿñu±EcÿÂ3¥ú^ÿà|ÿü]ðŒé~—¿ø?ÿ[Pm¬`MJkˆ/®ŒZŠZAWÒ¡ÃGQ÷ÀûÍÉ>¼š—ì ÿBƳÿƒþÝEÇú»ÿû­¿ö…t3jÚdFÖ}FÎ;€@1<ê'‘Á9î(žûÿб¬ÿàãÿ·Qöÿ¡cYÿÁÇÿn®ºŠä~À¿ô,k?ø8ÿíÔ}èXÖðqÿÛ«®¢€9°/ý Ïþ?ûu`_ú5Ÿüöê못¶’Óíiq [m-ç0:Ý1@¿Øþ…gÿýº°/ý Ïþ?ûuu †PÊAGzjI›¼·WÚÅNÓœÔ}h”ûÿб¬ÿàãÿ·Qöÿ¡cYÿÁÇÿn®º˜²ÄÒ¼K"#Át 2¹é‘Û4Ê}èXÖðqÿÛ¨ûÿб¬ÿàãÿ·W]Er?`_ú5Ÿüöê>À¿ô,k?ø8ÿíÕ×Q@Øþ…gÿýº°/ý Ïþ?ûuuÔP#öÿ¡cYÿÁÇÿn£ì ÿBƳÿƒþÝ]uÈýèXÖðqÿÛ¨ûÿб¬ÿàãÿ·W]Er?`_ú5Ÿüöê>À¿ô,k?ø8ÿíÕ×Q@Øþ…gÿýº°/ý Ïþ?ûuuÔP#öÿ¡cYÿÁÇÿn¨î`µ´µšæïÃÚÄ0CHîuf8g ˜Ÿjì«Åßò)ê¿õìÿÊ€2ÿ³?êXÖðqÿÛ¨þÌÿ©cYÿÁÇÿn®ÎŠã?³?êXÖðqÿÛ¨þÌÿ©cYÿÁÇÿn®Î¡º»µ³ŒIws Çhi\('Ó&€9/ìÏú–5Ÿüöê?³?êXÖðqÿÛ«±’H≥‘Õ#Q¹™Ž¤ÔÚ6DSý¶ÛÉ™¶Ç'š»\úžMr¿ÙŸõ,k?ø8ÿíÕV¶óË€µ¨ÿÈÕý‚n?ô8¨ç†?äUÒ?ëÊýVfxcþE]#þ¼¡ÿÐiÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP}CþA×?õÉÿ‘¬:ÜÔ?äsÿ\Ÿùà º‡ú…ÿ{ú(Ô?Ô/ûßÐÑ@uQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Þ1ÿ‘CUÿ¯gþU¥Y¾1ÿ‘CUÿ¯gþU¥@Q@Q@Q@Q@Q@Çú»ÿû­¿ö…RÕbaªøž)t{˦¾H’ÕÒÔ²ò€Îü``ãœö«WÒmu9Y]‚x‚݈E,Ç€rOµlÿÂEmÿ>:·þ ¦ÿâh.\jÖÑ5Åâ­¶“Ýr!’àwcÛ#Ó–’k0é÷‡ÕÑ“K¯^ì°U˜/Êb'§9û¼cÔÂEmÿ>:·þ ¦ÿâi’ë¶SÂðͧjŠUÕ´Ùˆ`x ´ÉMs«Åáëë˜n5d„ÛÚþòáÈ8È¡¼²„ƒÛŽjÄ˯27ÙåÕcÓ>ÖpÒÇ#Üòû…er»óÐþ•ÑK«é³Z‹Yt­Ià@´ÉJðAmíùTßð‘[ÏŽ­ÿ‚é¿øšÁuÖ 1o¤Ö$·ò$ÜÖÑ”˜Ë»äó“ÆßSׯz!‚{o‡ºTqI á[¤‘J•ŒÌ7d@éŸjÞÿ„ŠÛþ|uoüMÿÄÓ&×,®!xgÓuI"‘J²6›1 P~ZÆÕàÖ ö³wm.¦ Ú›HãgòÜ‚L/FsÛ­U†ÒþÉg‰bÕcµ:´Ír`2#Ÿ-”õ œd¯>µÒZª€,5lüK¦ÿâiá"¶ÿŸ[ÿÓñ4ÊÜOª#ißK¬,R›Âapñ¾^ð9,3õýk_EûpÖ4Ÿ·gí§Ko¶g¯»7{òß­_}jÂIâôÍM¥ˆ6l¦zàíã8.·b“É:麠–@¿ölÙ`:»Û'ó  Ê+þ+oùñÕ¿ð]7ÿGü$Vßóã«àºoþ&€6(¬øH­¿çÇVÿÁtßüMð‘[ÏŽ­ÿ‚é¿øšØ¢±ÿá"¶ÿŸ[ÿÓñ4ÂEmÿ>:·þ ¦ÿâhbŠÇÿ„ŠÛþ|uoüMÿÄÑÿ ·üøêßø.›ÿ‰  Š+þ+oùñÕ¿ð]7ÿGü$Vßóã«àºoþ&€6(¬øH­¿çÇVÿÁtßüMð‘[ÏŽ­ÿ‚é¿øšØ¢±ÿá"¶ÿŸ[ÿÓñ4ÂEmÿ>:·þ ¦ÿâhb±ü]ÿ"ž«ÿ^Ïü¨ÿ„ŠÛþ|uoüMÿÄÖoˆõ˜.ü9©@–šŒlöÒa¥²’5Ryb0(±¢±¿á$¶ÿ ~±ÿ‚é¿øš?á$¶ÿ ~±ÿ‚é¿øšÙ¬]iLz•¥Ô–ÒÜ[­¼ñ2E‡m›xõ Ã=9÷¥ÿ„’ÛþúÇþ ¦ÿâhÿ„’ÛþúÇþ ¦ÿâh´ð\/…í4ù"–[‹X­uHpŽ¥ÔŒpÀç‘ê*5ÓVòßQ»–+¸Òiä1D‰µä‘”« Ì„ç‚3œŠ»ÿ %·ýõüMÿÄÑÿ %·ýõüMÿÄÐ,e¿·ÕM¬¶û–WÝ4¢6Á%3¼?ÝÀ8@½p§øþ?5ßûŸýð’[Ð?XÿÁtßüMfé:ÂZ\ê6«m¹¼3FFŸ1Êùq¯÷}TÐWEcÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ4³EcÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ4³EcÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ4³EcÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ4³EcÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ4³EcÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ4³EcÂImÿ@ýcÿÓñ4ÂImÿ@ýcÿÓñ4KÄ6ÓÉs¨"[M+^Ø%½³¤e‚HÉÉwï!ÉÇÝö©õù£ÿ°MÇþ‡Mÿ %·ýõüMÿÄÖ{_%ÿˆÖXṈ 2åvÜ@Ñ7߈ç Ç=h[Ãò*éõåþ€+N³<1ÿ"®‘ÿ^Pÿè´è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¾¡ÿ ëŸúäÿÈÖnjò¹ÿ®OüaÐ]CýBÿ½ý jêýïèh ºŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  oÿÈ¡ªÿ׳ÿ*Ò¬ßÿÈ¡ªÿ׳ÿ*Ò Š( Š( Š( Š( Š( Fãý]ÿýŒVßûBºêän?ÕßÿØÅmÿ´)𿉥Íã=Kc ±rÓåÖªA?LÐcEqZΧ6£ol/Hž[™ šÁ`Pmb‚¸b3Æääô¬x5Ûû iék©È²‹i¤exåÔýÂÄ‘ýÜgÔŠôú+˜ÓgkŸÇpØÝ.‹ œtÉ‘É]Ù:ìjeµXáÖ\5Ú» ˆÇœ£åÇ^æ€=RŠâÛYÖOŠžÓí6ñF·kÚ¸%¤‹æFO©Ý¸ŽE?MÖõ ‹¹ßo¼à6™öoõ{s³æ#8’AÎv4WŸÙkµöª›ËËk„\²Mƒ›ñÏ®9ÅQÕgÔe±Òä“N¼KxÞÊ@«*ÒS*û˜7F 98Æh³¢±õ×Óç°”Oki{<.±$3¢É²WÀPAÎ>ð'Ú±5=>ÃHhm™l$…m ÇÖc û‰gŒ ¹-÷F Ίâu¥ŒèÖë~Wû`XÃ9rîÜîXN~YwwÿG¦ö¼ú|Ö3 ­­/¦†EŠ8¦E,¯€ ƒÓï)úPÅÇx–Êm;Â’é¶6’ý†+9^i`1§Í‚y†’Xí¦1ƒPø¨™ožI!Ù!†+… +>öÊÀAÂÉÓ$nê…vôW=â™`šhŒÖÛ"¼U¸3ðǘØ5r2W‘ÉSX( ŽÆÙï~Å2µ¼‹we•T‰_ç‡å9È+…`¡y þ°5ù£ÿ°MÇþ‡dkKÑ­Öü¯öÀ±‡råݹܰœü²îîþM}GþF¨ÿìqÿ¡Å@<1ÿ"®‘ÿ^Pÿè´ë3Ãò*éõåþ€+N€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+êò¹ÿ®OüaÖæ¡ÿ ëŸúäÿÈÖUÔ?Ô/ûßÐÑF¡þ¡Þþ†Šë¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÆñüНý{?ò­*ÍñüНý{?ò­*(¢Š(¢Š(¢Š(¢Š(¢Šã¯¥Ž ]NiR8üAnÎÌp$ÖÏü%>ÿ Å—ýý“qþ®ÿþÆ+oý¡]ucÿÂSáÿú YßÑGü%>ÿ Å—ýý±EcÿÂSáÿú YßÑGü%>ÿ Å—ýý±EcÿÂSáÿú YßÑGü%>ÿ Å—ýý±EcÿÂSáÿú YßÑGü%>ÿ Å—ýý±EcÿÂSáÿú YßÑGü%>ÿ Å—ýý±E`G¯xf;Ù®ãÕ¬ÖY•VB&m¹Áǯ8ÍOÿ O‡ÿè1eÿElQ@ÿð”øþƒ_÷ôUõ? Å£ÿdŪڥ¦ÃÁqÎÓÔg9îk¦¢€1“ÄþDTM^ÅUFŒKÿ O‡ÿè1eÿElQ@ÿð”øþƒ_÷ôQÿ O‡ÿè1eÿElQ@ÿð”øþƒ_÷ôQÿ O‡ÿè1eÿElQ@ÿð”øþƒ_÷ôQÿ O‡ÿè1eÿElQ@ÿð”øþƒ_÷ôQÿ O‡ÿè1eÿElQ@ÿð”øþƒ_÷ôVoˆõý÷Ú•µ¦¥k4Ïm&ÔI' Iãè uUâïùõ_úöå@ÂYáßú ÙßÑGü%žÿ Í—ýý³EcÂYáßú ÙßÑGü%žÿ Í—ýý³EcÂYáßú ÙßÑGü%žÿ Í—ýý³EcÂYáßú ÙßÑGü%žÿ Í—ýý³EcÂYáßú ÙßÑGü%žÿ Í—ýý³EcÂYáßú ÙßÑGü%žÿ Í—ýý³EcÂYáßú ÙßÑGü%žÿ Í—ýý³Ea¯Š|4ŒìºÅg9cæŽxÇô§ÿÂYáßú ÙßÑ[4P7ü%žÿ Í—ýýÅñO†‘—X² ç,|ÑÏþ•¹EcÂYáßú ÙßÑGü%žÿ Í—ýý³Ea¯Š|4ŒìºÅg9cæŽxÇô§ÿÂYáßú ÙßÑ[4P7ü%žÿ Í—ýýžÚ–§â5ŸOºŠâ%Ó.P¼møŽ?Q]M`j?ò5Gÿ`›ý*¹áùtúò‡ÿ@§Yžÿ‘WHÿ¯(ôZtQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_PÿuÏýräk·5ù\ÿ×'þF°è®¡þ¡Þþ†Š5õ þ÷ô4P]EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP7ŒäPÕëÙÿ•iVoŒäPÕëÙÿ•iPEPEPEPEPEP#qþ®ÿþÆ+oý¡K¬Ø±ñn•ê:”q_ †•#¼‘FUTŒxž”—$,Z$èç¦hæ¡yáûé帰V—K’êk# a;N3ÉéýáŒÒºí´ˆn>Ñ)>KyŠˆ'©Ï\žôGm¤D³,PX¢Ü& ˆ€õÝëøÐ-kâ»ñ¡4룖 dŠP|ÅÞ£÷’ÀÙã‘îjIõbâßLg{{I?µ…´»pãi<…s·¾W$ôç×¥6úK ‘ ò©ó(è§ÔJ>Ϥ›d¶òl¼ˆØ2Eµ6©Àè bi^"¿º×c²¼KH㙥„‹ÏÝpJ·vâ«x„ßOã²ZJhÆœ²m/~φón9`aÞºX Òaº{¨a²ŽáóºTTßSÔÔ»¬~ÓöœÛùå<¿7åÝ·9Ûž¸Ï8 nÇQ׬îmôËϳÌöúrÝ];n21ÞÀª‘Á8Ÿ\õªßð˜ß[ÙÇuq •ÂÜY=ÔqÛÝÜpù'ûÝxäëwXý Ün·óÊl2ewmÎqž¸Ïj†}&Ý¥h!²‰¦âBŠŠ_뎴…wâ-FÊÂbÇN»¸Cf;WÌîà·ß0=©âMdiÑ·Ù-ÇÚ^Úé'Ê«œˆÖLçžWq#­tÛi[=¬PX¥¼œ¼Jˆ¾£¡¤{]íÑíìÙVˆPeé@íÏŠµ§Y]Z¥“,°<²Èœ­¹•p8988>½h½ñf¤·8±´µ’íá™ÙäTWóxgdÀìÓÏP+¢šÓFž(¢žÞÂHáÿVŽˆB}éO–.ib–h¬ä’õnꤧÐö OÄZþ¡$ŒvÓ[ÚEku¾Ýì· w!,8ÁÎ1ŽFy®æ³î-t{™¼ë›{ ¥ ò"3`täÕ¿´ÛÿÏx¿ï±@ÑQ}¦ßþ{Åÿ}Š>Óoÿ=âÿ¾ÅKEEö›ùïýö(ûM¿ü÷‹þû-Úmÿç¼_÷Ø£í6ÿóÞ/ûìPµâïùõ_úöåZi·ÿžñßb²µsosa²Þk›Ë˜á´ÞLWæ7÷1grΧ@3»O·‚i¾l²¶f–E•·?2€ýFÑϵ-ÊiWlv¶S˜ÎPʶŸlô wR¹º“AŽù®æKèì!žX’f‹ÊÈ%¤ 8äccqÇló»®ýœiï4Æà˜ˆØ\¼%ݰr„u$}jY×K¹–9nÎY"9ä ű=)i¾l²¶f–E•·?2€ýFÑϵsþ šóGðÓXÃ=ñ˜ZË,—вÊT€NÐü•É=Xð£®pilg c޵‡ÿãó]ÿ°‰ÿÑ1PßðŽh?ôÓð?ð£þÍþ€šoþGþ§EfÂ9 ÿÐMÿÀHÿÂøG4úi¿ø øV™ÿæƒÿ@M7ÿ#ÿ ?áÐè ¦ÿà$áUµûÛØ¯-lìEÈib–VktŸäØùþ\eùïÆZ¡©x¦8ãÓÖßPµFsm,ò9 º9A ¬{©bOðï±ÿæƒÿ@M7ÿ#ÿ ?áÐè ¦ÿà$áGˆ®ní|?{w§ÉË (g]ÃIãߎüUO^ÞÁqi“\$RÈËj‘´‡nÜÞ|»~n{ä®;пøG4úi¿ø øQÿæƒÿ@M7ÿ#ÿ ÊÔ5 Et8µ8/A+g¬°"ËL»æòøþ›¯^Úšë߬v©§‹¬¼Ø™­„eÂcÇ™ò›oZ_øG4úi¿ø øQÿæƒÿ@M7ÿ#ÿ ÅÖþ.€5Þ8å2 *vðíg^ƒ¯\zz bXÛG§&ž‘bÕ#,{Üg9<Ƴ¿áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâèÿöu¯Û¾ÙåŸ;;³½¶çnÝÛsŒíã8Î8ªÿÍwþÂ'ÿDÅGü"ÚO÷oð>þ.²ôOº¼Ö<áuû›ß)6ÞLŸ(†,g 2}Ï4ÖÑXßð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñt³EcÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐûí>Öü ¹G%3µ’F†zŒ©¸èiòY[Im³D<˜š6D^”`ËŒz•fÿÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐé4øfŽö+‚òÅz6È…Î6” @çŒÛ}h½Óm/ö}¥˜ò’F€=FTƒƒ‘Ðâ¨ÿÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅЩô]:àÇæ[ñ£²)AÑX(ô9³é6×2É$æVfH¥ft1¡~R¤9Æ3š©ÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@Îht×Ó¼‘öY#hÚ0Ç•lîç®NO9Ï5,ÖðÏ$J›šÝüÈÎHÚÛJç߆#ñ¬¿øE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº±s¢ÚÝÎÓ\5Áo3ÌCÄ‘ùg`S‚¬1?SïS¦Ÿl‹l¸•þÊåâify1KO G9Æj‡ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü][ºÒ,o'3\BÌ̸2¬€t  á‡ÔÎÔäjþÁ7úU7ü"ÚO÷oð>þ.³ÚÂßNñÃj%ÚeË2gç|C«{t  o È«¤×”?ú­:ÌðÇüŠºGýyCÿ  Ó Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ú‡üƒ®ë“ÿ#Xu·©¸K»sœ,N?Ý5‡åÞƒ§Íÿ"ÿâè¶¡þ¡Þþ†Š‡XšK[T{›YcR๜F4PiETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  >1ÿ‘CUÿ¯gþU¥YÚÌ3êšE݇î"ûDF=ûÙ¶ç¾6ŒÕŸ6îAÿÿ‰  U6îAÿÿ‰£ÍŸû߯ÿâhÅ_ÍŸû߯ÿâhógþä÷ñ¿øš±EWógþä÷ñ¿øš<Ùÿ¹ýüoþ&€,QUüÙÿ¹ýüoþ&6îAÿÿ‰  U6îAÿÿ‰£ÍŸû߯ÿâh™¸ÿWÿc·þШ5¯jÆ©m³Xì„eKiXɹ]NÕäõ8­y4™Ýn›óµ¯º·<¿—§/¯¿N* ß ‹ËÛëƒys¿ ."Šàpn?Õ“Óß½]“ÄC ŒÖ×{Û-Ë´j8Ð’ -ž€ƒÍCŠì¥PÆÒýÂÓÁº›„É@ '¨88àæ¦].%¾7B8ù´~Y”ìòÁ'û™Ï8ëYßð‰Û5¹‚ifš1[²\“ä!ÆB|žÀsž(Ü>,Ó¥²¸¸òîU •!0íVvvû¡v’ 9õúÕ[îÔo-§±¸“$VÖËó˜˜÷6ì¶Þ0yÎ1ëNO @°\ÆÒÈípñÈd3á£xÆ”ˆÆJjøZ5™î~×rnÚQ(¹7?¼V ·ÝãAn÷Å6–6pÝMgåÊŒç0…òœÛˆö'µ>*°‚ù-©ähÒOÝ 8WèpHfÿ€ƒŠ«yáx/"‰%ž|ÇÀ_íE™Õù9,‡œúcÓ§ëï C~Åq4­ Q¢y~~U‚ô<Ç•>»qš¿¦êÓ^kz¥„–­vLв>mÊ<þ#Û®­YVÖ-mª^j•ßxÌŒÌveF&sëW|Ùÿ¹ýüoþ&€,QUüÙÿ¹ýüoþ&6îAÿÿ‰  U6îAÿÿ‰£ÍŸû߯ÿâhÅ_ÍŸû߯ÿâhógþä÷ñ¿øš±EWógþä÷ñ¿øš<Ùÿ¹ýüoþ&€,QUüÙÿ¹ýüoþ&6îAÿÿ‰  U6îAÿÿ‰£ÍŸû߯ÿâhÅ_ÍŸû߯ÿâhógþä÷ñ¿øš±EWógþä÷ñ¿øš<Ùÿ¹ýüoþ&€,V?‹¿äSÕëÙÿ•hy³ÿrûøßüMTÕí§Ôô›« ÁÚ"h÷ïfÛ‘×FhjŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@ë3T¼¼ŽòÞËOòÒÅ,ŦR˵6Œ`É.9íϬ}¦ùåýýoþ&©jÏ|ÑÉ»ìòƬ¢HfÃmln^c#ß@ ºÖœhš~¡• Þùe¥œ+)mÍ‚8è:ŽHæ©®¿}=³›(áºhfxšXawIX*²…ü¡ƒýâHï‘W$´”Ã0LöÑĈ‘,3àG·8#1œär8S¡µhl¦¶R ‹K)œïrzœ„Ààc€0:b€-YjÝ\Hžl aMß; à¾3ОžÜ÷⧇ÿãó]ÿ°‰ÿÑ1SRÄ& ·ˆ¨»[xˆK„ ³ËÏú¼ýÞ1œ{fŸ§Ã=”×Ò~áþ×rgÆö>E\}Þ~îsï@UO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš·ETûLÿóÊûúßüMiŸþyAÿ[ÿ‰  tUO´Ïÿ< ÿ¿­ÿÄÑö™ÿç”÷õ¿øš­®ßÜÙGj-0y¶3›gŸb„fÎÄ ž@gM¯Ì¾R­þžŠÐy¢y¡uYßs.ü« ¼Œ“Èâ´oVæéSdÆÙãl‡†séŒÈAQTÿ³`X`¹šÚÂM—?ëw1f-˜Î $œ®4³ø…šÏNšÊfº6Ï(sÄ1Êê£þwqô'¶ž©%Ì6=½Õµ²Ä ÈóÀÒ v×úÖ]æ‹§ÞEM¥Øf3×êÛP‚%ËÆô$U‰íæ¹IbÐÂòÇ"Æ$À@›N߹ʒ¹?R(9¯5˜4xn§û4ri'am$›yTF¬Npy9 `ö¦\ßjïeesi=Œr^$a-Þ—çeÉùÖ@6“œtêÅü^­u©ørôÝ]ýœ&’°UQ缊àç ñ9=zV׉  €3y–ÛA8ù©ßµjZj6ÌËe{mpTe„2«ãëƒV«šÔàÔ£[½jqmm5„âÌ„±ËQ6Œ w¨%¼ÖÍä–V÷I4v©:0X”HÌ[¨oàåçÔô ²™±Ì›á‘$L‘¹H# àÀ‚+jwßÚGJy¹–xåF Ø înØ8*ÉŸö…Ce¨^ÞIihnͰ”Ý»L‘¦æòæ*ª2èrxÏÔQ\t~!¼:müó\ÇE¦bmªHT3×vÄ8éÍhÛè5HžöyÅœÒG&MÌ m¼ÙäqÓ¥t5‘¼Â‘Äò;JŒg8êG¡©* ¡æ¸Rå"2ny»PîŸþ}%ÿ¾“ÿЦ­Ô 2UDä÷ 3êpÔ¶è¢h°±œ¶¬¸üsÇJçu3iÞî‰)»M­"Qû©:€F:èeº¶„È&¸Š3yŽÀÚ¼üÇÐpyö©«Ô¦¿²½Ö§šâ¹IGGŠ Š0òc*ÌÙçÿÕSê:µÒÉzé~mšÚöhí¡ó¶NàIÈfÆ1Ò€:Tš)ž9Q• V*Ùƒ‚¸"›Õ½Æ<‰ã“(²|ŒÊßtý>•Ê[Mykó¥Ïú=Æ©wA°c•³ž¹Êúãª; Rê×J‚(äTAe§"¹Qû¯0•f>¼×Ö€;)%Ž2‹$ІFÚŽ7êp ü)õÆÜOuu¨Çlš‹Mö}Y#ŠfD%snå¾èIê*{ ïnu½à–%m¿LŽ)þLŸóõ7äŸüMLŸóõ7äŸüM(·€L³cªln éŸOjŽ]>ÆhYÛÉbâ6‰J†$’q޹$þ4ÿ&Oùú›òOþ&&Oùú›òOþ&€.Ÿc1S5•¼…Æ»âSµHÁQÇLv iö"è] +qp:Kå.ÿN¸Í?É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ª­ÖVÝæLŒf9Y2=ðhòdÿŸ©¿$ÿâhòdÿŸ©¿$ÿâh?±ùù¼ÿÀ—ÿZÀ#‰ Hº=À‡dz?<™?çêoÉ?øš<™?çêoÉ?øš%µ¶˜Èf·ŠC"ynYܼü§Ôrx÷¬ÛÍÞêyä¶òã|¶ JBÁL™û¹µiy2ÏÔß’ñ4y2ÏÔß’ñ4}’Û}š2°pç9o©ÉçÜÕ{:'´xmbµ„º,g}¸t(½®F@ÉÀÏ«LŸóõ7äŸüMLŸóõ7äŸüMRÒôxlQÌ‚eiD¹XB*¡Åçh 1×<ŸZ¹ö;MÈße‡r9‘O–2¬z°ô''&—É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øšŽïO´¼`×`0 ÈÈqÿ"«L>D‡ëq!ÿÙªç“'üýMù'ÿG“'üýMù'ÿRãº4UjEYIý䈪ˆ¨€*¨Ø *†¥$ö–ë$wI}¿2¯¡ö¢¨Ì·gÿP×5þUÍÁm-Æ›ª^®¡{Ô7W>[ý¥Ê(Gm£a;qÆ1Ž•ÒYÿÇ”õÍ•fÂ=YâkûÓkq+Ë%¾äÅØ– ôÝ@ï\Ím[جҭ”wW˳nðHUàäðzà{ÓG‰šBòÁb^Î9 F˜Ë‚Dª…H\rG˜23øö«÷z42´‘Ï=±x„2 " àƒŒdò0yëMþÁ³O9¥†BªGËå ?v¿­Uµñ,W7ñÀ‘!ŠIÚa.dr7Ç JžsÜq[ÕŸo¥-­Á{k»˜ái †Ü1î''ªî’NÅhPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPn»ÿIÿ]ò4Q®ÿÇ’×AüŽ.nB¬ò€x£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€$óH»d•Üg8f&Š( ÿÙ endstream endobj 8 0 obj << /Length 9 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 694.8 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.8 0 Td <18> Tj 5.9 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <22> Tj 3.8 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <14> Tj 7.7 0 Td <17> Tj 3.7 0 Td <18> Tj 6.1 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <06> Tj 7.7 0 Td <22> Tj 3.8 0 Td <02> Tj 7.6 0 Td <23> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <23> Tj 7.5 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7 0 Td <15> Tj 10.2 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 309.1 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <02> Tj 7.6 0 Td <20> Tj 11.3 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <03> Tj 7.1 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <3A> Tj 6.1 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1C> Tj 7.1 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.2 0 Td <23> Tj 7.5 0 Td <23> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <3D> Tj 5.9 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <03> Tj 7 0 Td <03> Tj 7 0 Td <19> Tj 4.6 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 295.1 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.2 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <33> Tj 4.6 0 Td <15> Tj 10.2 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <1F> Tj 6.7 0 Td <1D> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.3 0 Td <04> Tj 3.8 0 Td <3A> Tj 6 0 Td <12> Tj 6.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <3D> Tj 5.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <21> Tj 4.5 0 Td <17> Tj 3.8 0 Td <23> Tj 7.6 0 Td <02> Tj 7.7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <2F> Tj 6.6 0 Td <03> Tj 7 0 Td <34> Tj 4.6 0 Td <3C> Tj 3.7 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.7 0 Td <22> Tj 3.7 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.7 0 Td <1C> Tj 7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 281 Td /F2 12 Tf <15> Tj 10.2 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <3A> Tj 6.1 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <3D> Tj 5.8 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1D> Tj 7 0 Td <23> Tj 7.6 0 Td <23> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <06> Tj 7.7 0 Td <22> Tj 3.7 0 Td <02> Tj 7.7 0 Td <23> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <1F> Tj 6.7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <01> Tj 7.9 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1F> Tj 6.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <03> Tj 6.9 0 Td <13> Tj 7.4 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <22> Tj 3.8 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <1D> Tj 7.2 0 Td <1C> Tj 7 0 Td <04> Tj 3.7 0 Td <2217> Tj 7.6 0 Td <1C> Tj 7.2 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 267 Td /F2 12 Tf <06> Tj 7.7 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <19> Tj 4.7 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <2F> Tj 6.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.7 0 Td <22> Tj 3.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <11> Tj 7.5 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <3A> Tj 6 0 Td <3F> Tj 7.8 0 Td <03> Tj 7 0 Td <18> Tj 6.1 0 Td <3D> Tj 5.8 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <40> Tj 7.6 0 Td <02> Tj 7.7 0 Td <1A> Tj 7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 238.9 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <03> Tj 7 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1C> Tj 7.1 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.7 0 Td <23> Tj 7.7 0 Td <02> Tj 7.6 0 Td <07> Tj 5.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <02> Tj 7.6 0 Td <20> Tj 11.2 0 Td <13> Tj 7.7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj ET Q Q q 90 353.4 432 316.4 re W* n q 432 0 0 488.3 90 230.7 cm /Im10 Do Q Q endstream endobj 9 0 obj 6827 endobj 10 0 obj << /Type /XObject /Subtype /Image /Width 1270 /Height 930 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 137763 >> stream ÿØÿàJFIFÿÛC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÛC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÀ¢ö"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ï袹]%í®nî…Ôº³Ü ù‘J=×”…_?ZꨮR=emî–öO<[Åixí”ÈX¤ê¹çñÇ 8éZºF³ý£s-»E¼h²Š_1H$Œgc§¸æ€5¨¢Š(®OÂÏkua§Ë4ºÄ—ŒŠÌî÷^[7^Iùý*{ÍZâêM>h#òìšùãÞ&!åÚ’‚ ÷r¤õì8 –ŠÀÑ5;»»Ø ¢Ú6À/3<€¾î¤˜ñ޽³ß~€ (®dÞ\Ái¨i^|†ð\ˆmäf%¶Jr­ŸöAoûâ€:j+ž}r+¸„#>ÛötóîÒDJÅ‹vŒvóõ4‰â€Ñ;}Œ—ò£Q&D²,6©ÇBY0Úé@›¥j˪a‹lb¤,[£8'n1Øcó­*(¦O'•’ãvÅ-\ ç-Þm×TÖ5‹ˆ$»E“ÌûcBˆXd*®Bð=Aô‘xzÖ;Im¼û†Il…‘,ˑ݌qÔ#>Ãß:ÛÛ“ôÿ 6ÿ·'éþB-&;um.®-ÄìˆÊáXu #žýªm:Â=>)V7’FšC,&2Ì@à8 goûr~ŸáFßöäý?€Q\JðÀÒG“°Æ#Œ¨fç¶âëOÛþÜŸ§øQ·ý¹?Oð  k;pð\ióiéoxò¼¯;ÂTo%ˆùœdà`HÞ¶”9º¹º¸”¢¢K#.è‚°a·sNIÇ5«·ý¹?Oð£oûr~Ÿá@‘hVéx—’\\Mt²y†W+–ù 0`j[M-mïä·W3ù~R´»>UÈ8ùTg:æ¯mÿnOÓü(ÛþÜŸ§øP¨¦íÿnOÓü(ÛþÜŸ§øP‰Æ›{cý‹ªùW3H|ËmÃÌ$¶?yîqVÓMóÌwq½îpc:†Œ³*“à ½ÉsÏáZ›Û“ôÿ 6ÿ·'éþ‹{¡»ÉYÜÍñu4™RËû“Ë•#û½AêkJÂÆ+^8Ùݤs$’9Ë;¤ãNž•coûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€”2•aF Uû#"Ç!s½Oz³·ý¹?Oð£oûr~Ÿá@ ‚‚=‰œg94S¶ÿ·'éþPª›˜í3ä³"(Ë9ôŸ3:C#F›ÝT•\ãqDzmåWá¤ó&o•˜Œlõ@?‡ùžõj¾ÍÖ«ìÑnÒâåïå†ãËÊYS¹,0OsòÕêçîšÁ–ÞYFxƒzdz4£öœT1C˜åÜ#@¹ÁLgcKÌÔZ0¥‰»Q±ÐQP^Éq¤²YÛ­Äê¹HšMý·`àÿž:Ô:EÕåîŸÍõؤ“‘ “{í»ƒíÛëÀì;KµË2[JêpÊ„ƒïŠmèß ¦AÿxUR#cþøj9ˆqØÐ0èßýjž²¤”±#·u­ØÌòVË*ý×=ý½ñë@¨¨n¥–Haó™y)»n?J|-#D­*ÜŽT6ì~4“ÊA$Ò$jY°®nmKΔ ï7'ˆ–ãË ìH “ë“øV¦¹æM±ùÊY˜ÊShV_E=sYV°;¨£[;_6pUL[`îpTgéžk²„TcÎÕÎJÒæ—"v-Ä÷QŒArèHé12¯×$ç?Ž*þŽd6l²Êò²K"ïs’pæ°é´øŒ)ui/–O nij¸ÃãúWG§[½½±º»»³–UÚ>bOLŸZ1¼ºuMI©= uNiŒ¤,e¶“ÆÓËŸoj¹Y–æLÃäýý£—jã;c…3è³üêÕµÆü#œ“÷[ûßýz±/Ý—ìÛ<ü ØëYvÇý">¿¿ÐЭCq:Àƒ ³±Â êÆ¦¬Ý^)\Û5³ùs‡eVí¤GpvŠ™sYòî5kêG"¹;åžS)äùr²¢ûÓÔÿõª”Z¥Å´þs<“Xð (þøÀä{zsV-¢¸¿sðˆBãÍÁÈ@=Õ«It»«ë:ÞróÆ7:íl&ß”à‘Ž¦¹0´j¦åYëØÒ¤ã¢Š/£+ t`ÊÃ Ž„TWyò8$eÐdXU]Ý­¢¸Ì-¸F˜áb0=¸«WêýtOýWi‘kû6ùéqÿ›üj´©aÊ=Ó4 ò9è8Ï=ñ×âµÖ4g‘‚¢‚Y˜àêk”‡ZÓ- é-á1yÒgV ‘Ù¶®G%IÚ@Î0;ä8ÞÒv"«œcÍs|iЖrCç7øÒÿfÃÿ=.?ïóQð½È½³»»eX%ºsóò•FT`` Ç©j¢ÚÅÝŽ³«·yíöÞ"í6<¡"D *àçæl‘Ç^ôÕÙ¹ý›üô¸ÿ¿Íþ4fÃÿ=.?ïó`E®kOö\ÛY~÷T–Ðþù¾êùœ}Î>ç^øè3ŸüG;N šnË3|Ö>wž Þ ;q÷I¿ïÖšŸÙ°ÿÏKûüßãGöl?óÒãþÿ7øÕk¹®e›KµaäM4žlë„íD#vF⃠È5“{-Ìšê©{s–ú7RBÄÓ"(ú猱  ÿìØç¥Çýþoñ£û6ùéqÿ›ük#R3Þêú¸»¸·K$–/*B™‘ËüÇx ƒƒ‘Éâ´ìd}W@´šI$…î­ã‘š#µ” ǧ¥Iý›üô¸ÿ¿Íþ4fÃÿ=.?ïósÖwwWZ†m乘6 TO0‡`"g#päT ŽzÖ¦‡s*ÛjPÊòL,n¤Š6vÜÌ¡UÀ'¹±“é@³aÿž—÷ù¿ÆìØç¥Çýþoñ®Hžê7ðýÔ—sÌÚ´l×ò@Lf@UO Œmãy«Þ'ÄJöW7K©JBZḚ9$ 8*RÀñ@_Ù°ÿÏKûüßãGöl?óÒãþÿ7ø×;ª]]yz榗SÆú\ÊD²„*#¶åèÛ·ÏN1㦫Zë¾^§ý¢·7µ³µÛ<.æ!BÀ!à¨éÇJÙþ͇þz\ßæÿ?³aÿž—÷ù¿Æ³õã/ö8º¸·¾ÇËÔT°ô?JÎWºÔZX›R›ýK†dšÞB‚Y\9ó1¸|ƒƒÇ'Šè³aÿž—÷ù¿ÆìØç¥Çýþoñ®E5KÛíÿ_k‰âšÍah¡I §ú¨ä`ËÑ·#žœcr+«¯*ßX7Sù“j¦Ù¡2,E昂ìé‘€ÙÆsí@öl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5‡$—6Oy#³ ©^XÁ9 p˜ô@?RkF€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ4fÃÿ=.?ïó\¢€)ÿfÃÿ=.?ïóÙ°ÿÏKûüßãW(  Ù°ÿÏKûüßãGöl?óÒãþÿ7øÕÊ(Ÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5rЧý›üô¸ÿ¿Íþ5‘¥[¥ÆÓ½ÃÈìù?itv€ØètuÊÂ5øFcm)¢*îÁd¬Jõã=3üº€ /°ÛÿÓÇþKÿÅS4¶-eó36%•Af,p€<ô¬ÝRÕuk³q%¢ÙXÄ6ŽL³É&yÁÀÆ1Žž£ŸáÑÒãÈÿ×iôcP•"s1¹sç˜ÂÇ)ËíÀî*;©ìlÈi€ž‚K´\þoR·ü‚¿íú?ýµ…™'ÓþL™å“ÏsÔbŸ@~=ëEáÍæfÛæ²Ùex[À³±T“픥¿…`j÷öl?óÒãþÿ7øÕåÓeº²m1íÝZñžS 0É’qߊ“ÅSÍm¡<ÖæA"Ïn–Øb ÈÜ?ÎÖmòÙ'}ËÙ°ÿÏKûüßãGöl?óÒãþÿ7øÕ×'òoÖ¶¶÷“¬.³]íŒî@ÀïÛèÃŒu¬Ôñ=Ô¬¡ã¶M:êI!GÜ G*/èp}èÐÿfÃÿ=.?ïóÙ°ÿÏKûüßãUìuK‰u°_Ù­´íŸI¼ÀW N$qÈç­jP?ìØç¥Çýþoñ£û6ùéqÿ›üjåOû6ùéqÿ›ühþ͇þz\ßæÿ¹ESþ͇þz\ßæÿ?³aÿž—÷ù¿Æ®Q@ÿ³aÿž—÷ù¿ÆìØç¥Çýþoñ«”P?ìØç¥Çýþoñ£û6ùéqÿ›üjåOû6ùéqÿ›ühþ͇þz\ßæÿ¹EeÚ’Ö³II'¿RYÿÇ”õÍ•5P¿Óüâg¶aÆ0Iû²Fÿ¢®y‹èß÷É£Ì_Fÿ¾ML¢¤¬É”Õ™ÏéöÆîþxnÖâ/&5ùŒ [==¹­{m6ÞÖq4fRà—‘›ƒõ>Õgzç8lÿ¸hóÑ¿ï“QNŒ`ŒéÑŒÚ÷E3Ì_Fÿ¾Mbú7ýòkS`–5• 8$CŠ«si[JêÒnT$~ñ½>µkÌ_Fÿ¾Mbú7ýðh>ÞÙ®÷c<ã»õ«IT"€£S|ÅôoûàÑæ/£ß&€E3Ì_Fÿ¾Mbú7ýòh;UóÅå±··2–ŽDÉáT’‡“ø¡pNÓÍ´«ž¨Ð™Tý ‚é]˜¾ÿ|<ÅôoûàÖð®à’±ÏS»½ÎvÇLY¦O.Õa…X31Œ!|r:ã<óéÒº@00)¾bú7ýðhóÑ¿ï“QR£¨îÍ)ÓTÕú£< í£¦Þ«ÿÖ«~bú7ýòhóÑ¿ïƒYš`H­¹L€ž¤#gùUË[m¸w#îOþ½XóÑ¿ïƒG˜¾ÿ|}Aw M˜Ûl‘¶ä'¦pG>Ø$Tžbú7ýòhóÑ¿ï“@l¯`„Ê·L!—Œ£uïÈõ‘¥fÓ]»½ó:Je µpNçuÇa]hÉÉB~¨€è:+øÿ wˆlägR¥åwÁì ýi÷êýtOýTžbú7ýðiÆêUвž ¡#ùR‰´‹ÝfÑ-­oŬYýàÙ»#ß°ÉÇsŽ˜Í7I𦑦Ù-»ZEtøùåž0åÐç{~½jO"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ••î7&ÒFº*¢*"…U •>‰k?Û7É0ûdñO&á£Ù´:~ìgñ¨|‹OùöOûóÿ֣ȴÿŸdÿ¿?ýjbýƒn1²âå6ÞÈðW÷nwn+Ðîn¹ëÆ*®›á÷Id’þægE¿šê+pWËRdfVáwÎpI©ü‹OùöOûóÿ֣ȴÿŸdÿ¿?ýjtºUÃy췌қ?³C,€Rs¹Î?/@>í?PÑc½Óà±[«‹kxvaaÙÎÂ¥s¹OB£¦=óQyŸóìŸ÷çÿ­G‘iÿ>Éÿ~úÔûÍ+ÂK»¥”Áöy¤•Lñú7ËÔò “ŒU…ÓÌi:[Þ\²aa)sœõªžE§üû'ýùÿëQäZϲߟþµxz4«}<^]ºÚº½´¬S|%FPêrjÅž“›Db¹¹;ZG3 NñÉã«ùŸóìŸ÷çÿ­G‘iÿ>Éÿ~úÔCáÛh8ŠêíV8Þ;eÞ¸µÔ§}7g:RÏ¡/Åìz®¡Âƒ(b9PsüHy'“޼RyŸóìŸ÷çÿ­G‘iÿ>Éÿ~úÔ%Þ…kuw$Ï,ê“24ð# “ÆÒÜg°sR.”‡RKë‹«›‡ˆ¹…$*ÜPOrO_È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  :cÜÚGnu+Ô …$d)º`qÙ^¾ëަ¡¹ðý¤ËC,öª¶âÕ„ øGD9§<ŒO4ß"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€7‡¬¥™™^h¡“Ëómã G.ÌmÜ1ž‚2Îj+ÏÇ(­îfŒ»¼ÑÄH1G3<Ìc9É'ÆyÅ?È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ  X!K{xàˆmŽ%£ÐO¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6(¬"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€6+DeD`>i:ŸúhÕ?‘iÿ>Éÿ~úÕ±Ó‰$Ø@Iä“n?€-ïOï¯çU4Ÿøò?õÚ_ýÔ}ƒMÿ |ø?¬D!†11yh:*Æ@†("‚K5Ò-»ÖëÌŽÛ(lgðªÿÙQÞMudÆÍ§;¥HnAGoïmhˆÜb¦1Z³ku$œ’bëúRyŸóìŸ÷çÿ­MJKDÉq»¹›ªxsT»°–;=F{KÇÍö”¼eÜÛBá•A*QÔgt­tCM»¾¼»a"K%IJ–wuen7g •·¾ME§üû'ýùÿëQäZϲߟþµ-^¬iYXuχíç»’ínna¸{…¸FË”a—À*F úç­E…ì"%ÄñÉÿ~úÔ ±c¤Çgtnžææê(B¯9RQ3£hñ’rN5¡XþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµ>Ïþ< ÿ®kü¨§EPª¬!ãô¢€)3JóÜu:*K±V=€±u'«†îé,â\ꈅ¶ƒˆÏ?„~Õ0ÿ[wÿ_?ûJ:å5™VÖÖÅú, Í9ÿaqæzxN9ç"ª*æUfâ´ÝLnedŠþéÑÀeehˆ`z|º‚ãPµµGs¬¼2BÉ4 OàR£ÓõkMA™!b²(Ï–ø G¨öæ³î⸱¸¿½±–Îâ'>eÄðA :pRjÛ—)+­¤”<j7,ê¡™CEpÕ÷Áü©ø“þo?8¿øÝsi»½»Xö¶~XURà¹|çñK æ«qm¥qc«; ~%*–µm<ºeÍþ¦¥g!|„ÏË,2>¸ÿ>•µñ.›ö;G•'•¿îùÙ\~;wcñ¥6µ(Â)§}ÿOó4­o ¼ m5ig ÔÅ$-É*|Iÿ?·Ÿœ_ün°µ-L¢_Gg[]Ã%º´ŽˆÁÕäÚäcw\{T y©E;o¾2$:ŠZí1 ó‚’XÔnãéÎjÌï“{vêI‹ÿÔPÜ$çêwŠÿ#Â~VÎÓþ¯¡ÁÅa>«1Ôàò.f{yåš"$XÂeË›†\s×ò§ørg¸»yå9’M>ÍØ€IÀ  üIÿ?·Ÿœ_ün˜’owDÔ.Yã :†ˆ•$gŸÝñÁ›Ò=ÃÄÖ³"/IX¦Öúa‰üÀ®~æââÚ]r[Is}²ÙŠîp‰OBh£y<²‚MBåLµh†ã‚p?wÉÀ?•;Ïíççÿ®Zéïe½ŠÍï I¦¨“4k »1à8ÉÇ\Ô¶—÷÷WqØ=áˆ+Ü´ª&é|¶PÈ+Ÿ˜çø{PI‰?çöóó‹ÿщ?çöóó‹ÿ×(šÕû‹<Ü [¡²I A‰ ‰:tp8Œã¶k¬ ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆéh ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆéh ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆéh ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆéh IÅìq Û­±ÿUœ‚½ö´jlIÿ?·Ÿœ_ün«Éÿ!(?댟Í+ÄZ5‘‚KÐR)wo`ÒYN>ïN;c<úæ¦rqWFøzQ«5 ;_ÊçC‰?çöóó‹ÿÓQ¢>£r¯!Â)hAcŒñû¾x®GϾ¼´–þ çó.&1ÛÚEpAL7,A<öã€n<}ÝÛÛfÐ#ŠâP/-ãYÊIÛ*¼3ÉÏÔQŸ1Uðê’ZëÛúóÓäi 3)ˆj>`PÅ7EC/§‡“Ë($Ô.TÈÛPˆn8'÷|œùV%¤ÞN‚5;‰]nu.FxÔ à"(n0ž:š¢×w†Ú¸o6 [ÊYP°_!!~\üÇÚ¬æ:¼Iÿ?·Ÿœ_ünŒIÿ?·Ÿœ_ün¹ËKë뛈ld½h¾{×tž\›@ÁAÁÉã·j†ÓU¾¾†V{Ákö{_42¢âc¹×qÜË„Œ}î´Ó¬›ÝÑ5 –hΈ•8ÎîøàƒMIÖI¤…5+†–,yˆÉžFFÎ3YšžW¼»ž/,Ý4Rõ…3ùŠÈº¸:Wˆu MTº¼¿fuÉ‚6ÿÀ¨ªŠe›“©\Iå±GØð¬:ƒòp}©&¹Žß>~§qÔ2ÏÂŽ§îtû×5¥çN¶º³óæ[‰/ön„!g%ÏòŽçš­w©\Þh³,ò aw¿å\’’„#ÛÓŽh³ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆê;‰^·Ç“¶~äeAÿLj­WÔn…¾Ÿæ»K9U]¡K†bås“J¹‰?çöóó‹ÿÐw€I½»u$ÅÿÆëšƒT¼w[I.Y ¿ks;ˆ÷ªˆ·ÀÛ¸ž:~´ËmBþæ[x£ÔKFZì™<´&EÔ'lt=@ïôÀM™cY"¿ºtpYZ"„.‰$ò€2ê( š!’NÿWÔšæÖþþ; ë‰å[3g ’µºÇ•r2ÅÕ†vôû¾ô²Ms£¨2ÝÈÃûFÚ0ލVòóŽ8à‘úõæ€:\Iÿ?·Ÿœ_ünŒIÿ?·Ÿœ_ün¹ÈoïÖææ¼Ý ê3[¼µ"ù˜9Ær6¤Ó5I%Õ^æW´žÑ®Î#\a—mä 1ûÜñ@ø“þo?8¿øÝ“þo?8¿øÝ0ÏÎeA„Þ~aÂúý=éà†©AèĹÿÛ¼Û/þ7Kw³,W®TpÐŒg>©íEXÓd s8?ÜOæÔâ®&Ve™,—W¨Ç &$£Ïíççÿ©52 ˆ«72ÜtnÕ“¬ÍsXEi?’×B7m¾]Ž{÷àS’°EÜÒÄŸóûyùÅÿÆèÄŸóûyùÅÿÆë˜µ¸¼›U³2ÞLæ/¶FUB/—"‘ޤzzqŽsÚ¶¡•ox·¾d—–sJSbâX˼g§vzÔŒêñ'üþÞ~qñº1'üþÞ~qñºÇÓî/WW[[›¡r²Zùçä å¶à01ØäõÉã­iÇ4pñ5¬È‹ÒV)µ¾˜b0(\Iÿ?·Ÿœ_ünŒIÿ?·Ÿœ_ün¹ÛËÝB;»ùc»Û ­Ý¼K–¿0qàN3üdñÍ7š­íǘ¬éÚ$†EÌacPX á€yàúPE‰?çöóó‹ÿщ?çöóó‹ÿ×!e}m¥é±-ÛÈ÷öaiX¤»”g§8 O9ûµb-jöm:K‘ M­«±Qˆä$ ðÜ=¸ ŸÏíççÿ¦E'œ¥¢Ô.œ+%Z#‚ÿWØ×;=ˆÓb¾bÔhn h[kG# dm§q×»¼=s)Ô®mO.4šáÔ3930'?ìñÀþ÷¥tx“þo?8¿øÝ“þo?8¿øÝdj&eñžcžeO³ÎÆ%Æ©N9óúqŽs—6­¨C¥[Þ-ï™%åœÒ”ظ–2À¯À#iÝž´ÕâOùý¼üâÿãtbOùý¼üâÿãu§Ü^®¬¶·7BådµóÏÈËmÀ`c±Éë“ÇZÙ ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆéh ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆéh '’tšÝVöël’lùYÆÖ<|ž¢¦Ä„à^^è _ün«Ý¯³ÿ®ÇÿE½6ãP[ ¸Ì„*ºü¤úŽ¿ÌV5ê:pæHÖ?i.TLe+ G¼½F'>W?ù#˜£i%¿ºDQ’ÌÑ×Ë®s\Ö~ÔÉ«fáÙBm8ÁÏÖ¾­l—šq†YÖ]]€ 0`FAê2:TágRpæšô6ÅaýŠ‹ïКÖöÞówÙ5ygÛ÷¼©al~IV1'üþÞ~qñºç§Õ/lEìwöÒ]Cf×Ëv°aäsÏSžj;ÝFöÆQ ßý Ÿ3>ã¶d Î:‚&µ^óQ´Ð¦¹’ÒØy6¥ãòæg$ÆAAÇã@8“þo?8¿øÝ“þo?8¿øÝs÷ú…›x5=¤Š)f>BÓ"t¤1Æyã­-ΣwÜçQd’ÚîtŒ¤y”™fù{†n˜é@6$ÿŸÛÏÎ/þ7F$ÿŸÛÏÎ/þ7\þ}ª]݉€o$\ɱ±Œ*($ îç®O*Õü÷3êv6Ö7¢(g†gwEWÎÒ˜Á9ÍkbOùý¼üâÿãtbOùý¼üâÿãuÉÛêÚ½üq-¹e›ìQÌ6ˆÀ‘Û9-»ørÝÇSÏJÑÓEÄš†ªd½•š,/ÈU2ˆÄ=Êÿõù  yæ[hZkJâ(—ï< ¨íÉ)QÚßÛ^šÄ“•䈥±ù%QñAa¡ÈPÞtàæ§z­¨Ã¨"Ýjó {ym,¦¬,d%ˆÎX•6Œ Pþ$ÿŸÛÏÎ/þ7MI<Ââ=BåŠ6× Ñ§Áýß~uϵÍÿ™q š‘ˆÛZ-Æÿ-?x[vrû£hsÏZ«³¨M mqx±’ŒöÜgq#'?Ê€:ÌIÿ?·Ÿœ_ünŒIÿ?·Ÿœ_ün©i’ÜýcÔYEÁv .æPx$3‚3Š´³Âû6JæS à:ãÖ€$K5åœwIq•³â6^#sÐ «¿Ùöóágÿ€éþTÇý—ýuýõ¢ì¨ŒîÁUFI'Z ðX}°[G¦Ù;…'îPlSNrAü=2è­´ó †k œ©`‚%9PqJŒõôÈõÂo[ˬ;iÖ¯;®#˜(bòÆ*ÆCêG¹?-ýmCQÔÞúêŬíã„ÅL?xX°$ô ãØQFKC9F¬jÙ­ €hfÝnzg’í±dÙÒÙÆéœñŠ•m4¶™á[K"Y)•¡#gò® S±¸šëVТ±ÚI.¥TQÿfüªû^jxJû]³Y{éÔ’™Ü®ŒŽŒsŽ2M‡Qxº=‘ö«;DûDËèÊw;gÇCV³ì?çÂÏÿÓü+†3Ë4:nûønâä-“¼Æ0U¾Rì žZÑ烙Úy.µ£â3m²y™Sx µD} ãÐ_ýŸaÿ>øŸáGö}‡üøYÿà:…qº}üÍ&Šlu+Ë­FiTjò»0DÇÎJ¦1øÕM¯î‡‡DºÆ£ÿ¹þüôCÆ3Ðûõ÷ ÷û>Ãþ|,ÿð?ƒa§€I°³u&ÿ óõÕ5It= 缑-æŠa-ÃÜ<@È…Ý"‚zǽu7{¿\,Ó­ÌíbàÉ8‘‚žGœãÓšÖ{VÆÌƒÈ"çô¥þϰÿŸ ?üOð® I½ƒÉXµ ZòÖÊ;›G;¨wÛûΉ•¸ Û¦+¢‚ëRo‡³]_™"¾2±oºÀ…m­ìqƒ@fÃO“afêL þ‚ÃO` ØÙy@œþ•ö¼SÚ=õíÒÝxpÜ”’Rß¼à /~ù¨ô›Ø<•‹PÕ¯-l£±ˆÙ´sº‡}¿¼çø™[€½ºb€;ßìûùð³ÿÀtÿ ìÚOÚ~Íö]?ÏÙæy^T{¶ç±ŒãÃËoô N‡þX'øQ¥È"Ïþ¸'þ‚*ÌŸêÛèj¶•ÿ ‹?úàŸú  ÷ú”Ö÷fÞÞÝ$`ªÇs•êHÀ>†ª n÷½”Î 7_O¹MÔäh|BŒ³‹pc‹2‘¿4”ºÆ­kwj…ÀB³2-˜2ÿµþ¹å9&õ=t Ô}Ûß®¦Í¤ßi´Šp6ùˆ™¢¢ÒF4‹<ÿÏÿÐEºØà’´š!¼Ëƒ±ðón_ò<´ÍMPÓô{krbŽgûAùüÅ$ÂŽƒ'®O<“](Å2MÝœþ£ÛiÓK41ÌÒHNÔ’‹×jñÀýO'¦›L²žo:}:%ë½íÁoÌŠÚÅ£pI%ddÉiÂA-¢¸”“t9Þ@xä ŸÎ¢m*Á£i8È6÷jпºkUMŠœž¾ßþº±‰"IÀe™¬£Z›¦·FŽœ”TÞÌÍKhÆRØ)‰JLj±°d8Ê¢}6ÉÕôø™cRˆ ¸!Tð@ãí[X£©CÙ[<é;Ù#K !ƒ,¿CŽ)E¸È,Ô90°‡ØÆìã® ­lQŠÍx•Ê„±FܤÆNÓ‚28àà‘øÓD%yE¾$p¸‹– 'õ­LQŠÅM2Æ4‘#Ó¡U”b@¶àüsSy‰L¢ß÷…vò¹+éœtö­LQŠÈ¶±¶´,ml’ÿxÇÜýp*O%<Ó/|ÆP¥¼³’p3ŽœŸÎ´ñF(=>Î(Ú8¬"Dv ʰ`A#A榒%•6KuÈ8hÉ ôì@5§Š1@2ZA*ʲÚ+¬ÄCä ñÏ~TÙ[Ûìò,’/,›!Û´ggò­|QŠÉŽÎÞ/+˳TòAm‡êgÚŸ )Kæ8ÔaQ#  ´ñF(&äI®Y£p@ËòžFÅÌQ±Í:©$íòÆN{¯½jâŒSM­€ÊHddidb¡yžÃÞž"Q)”B|ÆP¥ü³’p3ŽœŸÎ´±F(nàc½…£Áä=ŒmmÞYƒ+œç8Æ3ÍT½Ò|à«k´+¸¹cæ|ÿߌ7¿5ÑâŒRÓM·´³Kd¶,¢%‰‹E’ê£7õ?™¥:e‰·çM„Âpìãh>¸Æ3[X£›b(Ö8¡dEUXÈ}1NÃqÿïƒZ£Ÿ†þãÿߌ7÷þø5¡Š1@øoî?ýðhÃqÿïƒZ£Ÿ†þãÿߌ7÷þø5¡Š1@øoî?ýðhÃqÿïƒZ£Ÿ†þãÿߌ7÷þø5¡Š1@øoî?ýðhÃqÿïƒZ£’±È/¥Æû$Pvž ¶˜©-ÚÀ°Û‰ãs…¸ïZX£XjM+&fÜ¡º¡¸Éc*wsÞ›=¼w®-¼ØÏUx·øZ˜£X›VlÆ‹N³‚6Š>(ãbª[€  ã5!µ„ç6 îq!ý×WÃtëÀçÚµqF(ŒtÛ##Htø‹³fû8ÉaÐ“Ž¾õ,VÑAþ¦ØGòª|‘cå^ƒÐdàV¦(ÅgῸÿ÷Á¨šÖߺÔ1ƒ>bûÄcñÉú ÕÅ  y¬-gÝçØÇ&æÛàÎX r:ãŒúQ%…¬¶ëo-Œo }ØÚ ªý1[£’líÙ š”‘Bº˜x`:Ç TØoî?ýðkCb€3ðßÜûàцþãÿß´1F(? ýÇÿ¾ oî?ýðkCb€3ðßÜûàцþãÿß´1F(? ýÇÿ¾ oî?ýðkCb€2^9 ìRßbÆêNÓÔ•Çò4\ÚAyŽîÑg@w–À\ïZØ£…­²ªÛXÇ«ïQ@lc#®8Ï¥NT°!£r<ÖŽ(Åe5¬/möfµ P¾Q‡+ÐcÅ2; H˜4v1£+ ;vÄÖÆ(ÅcËak4F)lcxË—(Ðdn'$ãyëDÖ³ˆÄÖ1È"ÿW¾ ìúdq[£˜‘*;º@U¤9r# ±Æ2xç€ ì-ð]ƒ1òÏÌ@Ç'~U§Š1@ØÚÌŽ“Y$Šï½ƒAÍŒdñÉÀÓFf7§ÅûÀÁÿq÷ÆsÇ9ÀÏÐVÎ(ÅgῸÿ÷Á¦M\DÑOoæÆÜ2c|Å÷˜cñÉú a°µ7BèØÆnIL?çŒÖÆ(Åd%•¼{6Y¢ùl]16±êG“NЈÞ1jHIupÄõ$cœÖ®(ÅdEcm "Cd‘¤m½`ÀVÆ28ààžiE¤•…¢†VgR!ä1êGNNMkbŒP\G+Æò[ïhÎQš,•>£Ž*µÆ•k-½ÜQÚ,/wG$±Ã†!† Î9ë[¸£gcoc—ih°ƒŒùpíÝîp*Æûÿ|ÐÅ  ü7÷þø4a¿¸ÿ÷Á­ QŠÏÃqÿïƒFûÿ|ÐÅ  ™ã‘å¶eÈIK7Êx2)nmb»„ÅsndCÙñî=½jâŒP4ÚwFž‹ce'™ofÁû3+1LôëW&'ŒÇ=¿˜‡ª¼dƒøZx£^㔥'y;™Ö6ÖŠËkd+}áAúàSSN³Ž!O‰b—ýb-¸þ£ÖÎ(Å™ emß.ÉkaÆAé×}8 Y[ ¯µ $ûGO7ÉùÿƒSÍ•»33Y!f 0òvœ¯nÇ‘éZø£™,+2lš"d­# ävõÒÉ–6ŽXYÑÁVVŒÀõb´±F("{kŸh²ILs|¶ý28ªöš`Ž ”¼Atne2Ê !8NxÂŽõ¿Š1@XÛAåù6I•Ÿ/dÙž¸Àã8¥ŽÎÞ/+˳TòAm‡êgÚµ±F(5QÍå«ì}©#;OÆÃù‘Vï-!¾¶kk•-ãr†+œŽG=EOŠ1@'mQGJÒltˆ 60„Ý‚ìNYÏ©?Ÿ·&¯QŠ1@bŒPE£QF(ÅQŠ1@bŒPE£WìÿÚ¿Ú[OÚ|#vxÙ»v1õ«TbŒPE£QF(Å5ùFÇ¡ªškùze¬r$Šë 6à…Õwb€(ÝÚÙ^0kˆef¯˜‡ðUq£é@çì󟬓ëZØ£.1{£EV¤U”ŸÞD"¢#ª¨páEKŠ*ŒÅÅEu#Cm$‹÷”qSâ«j#ýo÷k:ͪrk³.’Ni>æl77÷cˆî#’Øéš-ïn`¸\Ã8`ÝG¾jm q?üúÕmGþBõ_ä+Ä~Ò!]MÞÿçþG¨¹%VT¹U¬7Pk“6.'gcÚ­XMsnŸ?gDÈ%,zÑ®uƒþý*iÁ:Ç÷?¥Z„¡ˆ¨ÔŸº¯ëêKš•(&–®Þ…&»¼ºˆw9 ‡¹©m5 R&ëN2F Ôº#'—"q¿9÷"ªêÌzDx$(óþqSÍR£ˆSm·°í ÔtytD÷÷ÓAx2¨Õ]ç¿ÇžL:ä?*MW‹öÏ< þU±4‘}‰äÈòÊc¿*ÔgZ¥KÍ«ÜiŠw"Óî¾ÕÜtà㿽ZÅdhŠMÄØ&?ZÙÅz*²©EJ[œx¨(Uj#qF)Ø£ÖsŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ÅìQ@ÅEsŸnñg†©ñF)J*I§Ôi´îŠ:u“Z#ïefcü=1Q]i­=ð˜:„8Ü^=+Ob°xZnš¦ÖˆÕWš›ŸVPÔ¬^ìG岫)?{¦ÿª¬ÅKu…¾`i÷â¦Å«T`¦çmY.¬œT:#}@äÀêW°n Mc¥eYge%y ½3ZØ£ÏÏ#W‹ªãÊÙÎê£:‹P?•<è×;È_ï¯^iqz³+¨N7×JÑÅsêTœª®ºËá¨>š•líÖŠrIË7­XÅ;b½8B0ŠŒvG ¤äî÷Š1NŪ$n(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(§bŠ~(Å;Å]øªX¼j¶Ë{Óã™,䀕ÞÒ2“¼íSÚ€;(Ås6Þ)?c‘™c»0éGP3FJ,¸,6…#+÷zûô¨¤ñÀºò¢Ò<Äó-âÝöù2Œõ8'ñö ¯b¹³â™„®™›©5ÓÚ´ÆìÛy/ ëMÒüY-ì¶¢m,ÁÜs4Oö…bZ#‡`3ГùPMŠ1\½—Œ Äï.ž#{K#x¡gÞ²(϶ž:ÃÞŸ/Šä´‚ÞãRÓ~Í Í´“ÄÞxbJ¨`‡‚A8çµt¸£¤’Íg ³ÃäÊèãÝ»a#‘œ â¦Å7b¹Ok÷:[[Zé×[\2½Ã´Åpȃ„»±àcž)5ï\¬ZeÇ— Öwr>Uo™"VCÈìOO΀:ÌQŠå¼CªßÚøD¸·¹š)®î!Žg†‘Ø21;Tƒ“: ‚Ó^Öl`&îÒæõn/’ÚÑ®#²¾ä$’¸Æ\th°Å®r_ËÏ#i‡ìv· ms0œe$m¹Âãæ°ÈúUkê'Ì‚{8®.åÔfµ·&Ú &IÜÛz:à“è(¬Å®fÍw"ÛXéF[å™áyÂü¶ À6ì“ÇO¤¾ñ<°=ÇÙô·™lí’æïtʆ%`NÁÜ@¸u ‹b¸ù|Uum©j;-ÞîÔI‡#b@­rY•IäžàþÓi7ÃSÓ ½©æ®v¬‹ ãï/§ÿª€-bŒS±\¿Œ5kí6êÕ,§ò–K;ÙXlVËGd<ŽÇÿ¯@6(ÅrÔu»ÍBÈË-õÍœ¶ÅîêÉ`Tl»»'>¼WcŠn(ÅR×g–Ó@Ôn­ßdÐÚË$m€pÁIŽ¢¸ˆÑ<ð²¬IŸ˜©eÚÇÓµdA©ëS¦Ÿf×O ¾¼™"¼hHð"VØFb=:væ€;QŠá¢×õ}BÊØEv–²¦Ÿqu$«·šÑɰ 8ÉÇ­.¡âùZ]A{mi¹­^õ®â%Á*r)ÉoqÏZî1F*­þ¥i§EÛȦfÚ›bwÉ÷Ú:÷ªš…åÄ>$Ñí#“l+9•vƒ»j©^zާ¥]89».ÍýÊânÆ®(Å;ÅͪjðÙjš°ÔKÇe¨<"Õ¡M®Âãp³ƒëÚ´£BU´M-¿nÇeŠ1X?ð’³ke™s,1Ü wÎÖã'…ÛŸïg¾* Ïݶ¨Ï£@–—_g T—"UC€TãƒþzÕ,fÒ¶öêºì.dt¸¢Š+˜¡Ø¬¦ðæöRÚ5’¦s#å›qbÛ‰ÝÙϽjÑ@SxsHŸRmBkM÷,èìÆGÃ2€•Î©ÐøJƒPûtVj³‡g{V=X.v‚}@­:(/ èp¹hì@ÊH˜ó\¨W`pô­KKXlíb¶·R±D»P,@ú’MME¬ËýKÔn~ÓulLÅvI^2Ëèv‘‘õ­:(ëÂú-ÚÆ³X®Ø¡ò#²/û§iùïÍJÕ³E£Q@ÛJ±{ù/¤¶I.$A;å¾Q’Ôôª¿ðéÚo²~æåŠ5ó_åI~øëßôíŠÖ¢€)Í¥ÙM ¤Rù,¤I ˜le)ëÎ=jK»kÆ·71ï6ò‰¢ùˆÚàzžµbŠÌ›ÃúTú‡Û¥³Vœº¹;Ø+0èÅs´‘êE6_i2¬ªö§÷³›†"WHz²~R}±Z´PDžÑe¶†Ý¬@ŽÁ6HêpßxN{äœÓ®ü7£Þ]¬¿w§aéÒ®Ñ@*†££Øê’C%ìNïï-’WB»±žTAW誌åÍf;=.ÒÅ÷Û£†Ùåå¥wùrOñÜžj¨ðÖ.ÚèÚ#Lg;¥r¥ÉÎí¤íÎ}«ZŠ¥Z¢m©=|Ådg¶‹§=ÿÛšØ÷‡ÎæÚX Ûœgß§6`ö“Úµ¾a¸˜Ï"ïo™ËÎs‘ÈнEÖ¦žóÓÌ,ƒQEf0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(…ø‹¨jOuc£h·Cté%̆ 6ÕS‘ë†ü@­-?ÅpÅà[]vò9çUEIü ƒ´“’;ÿ:ÃHñ¯ã SX´¹}+Ê?f®-wy‘Ž PçÏûU/„ôKÛkM{Âúœ2›gËCsåî\§§)À÷ žïÄv·ú}™È÷èd ª€gsF2xÏCYiñFwVò5´i<±xÖø‡?ïg?¥cø'LÖ$½šóT³’)´û!eh³¡PüžFzŽƒ>õ©ÙëÚ‡‡š­/\–þ9·I¸8òã^§§ qÏ4Øê7躗Šã·¾Ô…Õ¾œ_ËgÄ1(Ñà䇠ç4šWŠíô¿ hÇQkËËÛ¸‰HâS,²`œžOõª—67²ø‡Æ¥•ÉŠëLÛy,äµxäçŒuªM·g¢øn5²Ô…¤q0º[8ñp­“ÈÊË¿µiø‹Å1j^ Õ®4©/,îí%‘\¥ˆ™v.Óõ;ô±ò/lî%Mð­Ü>_œ¾«ÉÏÇÜx{T¿ÒüWV³$²jfxVD(&PÌ~Rzðr*I}â ‡Ó|B¢Ó.Ójw$ÛH%ü(OâuåÕ…Ök+™­åûJ.ød(ØÃq‘Yý¾§áôëË_j¦k•‰­®¥.O\ôÇâ+_âuÕ÷…Ö+i®%ûJ6Èc.ØÃsVôïxwM½ŽîÞÈ™¢;É#0Së‚qšÈѼBÚjø®ÿSšêæÞËQ(ˆyE.T p#Šé/¼Cgcý—çG9þÔ‘#‡jƒ´¶1»ž=³\kèš•Öã;hìæYnoÌB¾j‰7es×Ú’î}[W¸ðºÂ?¨ÛGcw$± äã Á98 –÷ÆúEž¡=™K¹¾Ìq<Ðú8£ñéU%ñŽ©wá«Èn5Kt½–QQ•U“k"Q»¦GÏSXö‡Tðôî”ÚÍà»–YbºA˜Š²ãçn€3­TÐm.®4ÿM´ÒÅ÷&WD,±ƒ/ˆéÐõ ¢ãÇúTÞÁöMFY,¥h¦@I³œã¾>•vëÅÚU¾—e~¦yÖøâÞ(cÝ$„uzƒÅcøzÂîøL<ëIÓí7SwFGšüã‘ÏoZɇJ™| ¡%ö…;ÛÉ1 ´w6ÙUqÎxëí@®‡â+-mç†î ¹·Ç›osÉ= ¯\wSXwíz·ãOùE±ÔT ‚{ç¾>¾Øï]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs3x#MyîžÞóQ´Šì“<óíŽLõÈÁëÏzÞ°²·Ó¬¢³³ŒG+µvbŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š)²8Ž'‘³„RÇÔê†óþ<§ÿ®mü¨"/XÍK ž«$n¡•×O”†¡o"Ÿÿ 5¯üøjÿø.›ÿ‰£Ã_ò+é?õåþ€+N€3?á&µÿŸ _ÿÓñ4ÂMkÿ>¿þ ¦ÿâkNŠÌÿ„š×þ|5üMÿÄÑÿ 5¯üøjÿø.›ÿ‰­:(3þk_ùðÕÿð]7ÿGü$Ö¿óá«ÿàºoþ&´è  §ñEŒh^[]N5 ½Œ«’HPG$’8Ó¿á&µÿŸ _ÿÓñ5‰ãÎÏþ¿ú9kb€3?á&µÿŸ _ÿÓñ4ÂMkÿ>¿þ ¦ÿâkNŠÌÿ„š×þ|5üMÿÄÑÿ 5¯üøjÿø.›ÿ‰­:(3þk_ùðÕÿð]7ÿGü$Ö¿óá«ÿàºoþ&´è  ÏøI­çÃWÿÁtßüM5üQco$¶ºœQÆ¥Ù䱕@9$cµjÖ?‹¿äSÕëÙÿ•Kÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øš?á&µÿŸ _ÿÓñ5§EfÂMkÿ>¿þ ¦ÿâhÿ„š×þ|5üMÿÄÖ™ÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øš?á&µÿŸ _ÿÓñ5§EfÂMkÿ>¿þ ¦ÿâhÿ„š×þ|5üMÿÄÖ™ÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øš?á&µÿŸ _ÿÓñ5§EfÂMkÿ>¿þ ¦ÿâhÿ„š×þ|5üMÿÄÖ™ÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øš?á&µÿŸ _ÿÓñ5§EfÂMkÿ>¿þ ¦ÿâhÿ„š×þ|5üMÿÄÖ™ÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øš?á&µÿŸ _ÿÓñ5§EfÂMkÿ>¿þ ¦ÿâhÿ„š×þ|5üMÿÄÖ™ÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øš?á&µÿŸ _ÿÓñ5§EfÂMkÿ>¿þ ¦ÿâhÿ„š×þ|5üMÿÄÖ™ÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øš?á&µÿŸ _ÿÓñ5§EfÂMkÿ>¿þ ¦ÿâhÿ„š×þ|5üMÿÄÖ™ÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øš?á&µÿŸ _ÿÓñ5§EfÂMkÿ>¿þ ¦ÿâhÿ„š×þ|5üMÿÄÖ™ÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øšhñE‹;¢ZênÑ%Œ­´ƒ‚8ê3Zµ ÿÇæ·ÿaÿ¢b  á&µÿŸ _ÿÓñ4ÂMkÿ>¿þ ¦ÿâkNŠÌÿ„š×þ|5üMÿÄÑÿ 5¯üøjÿø.›ÿ‰­:(3þk_ùðÕÿð]7ÿM>(±WD6ºŸ˜áŠÇöw1“·ÇÌ9éÍjÖ<¿ò9ZØ>ýKÿ 5¯üøjÿø.›ÿ‰£þk_ùðÕÿð]7ÿZtPgü$Ö¿óá«ÿàºoþ&øI­çÃWÿÁtßüMiÑ@Ÿð“Zÿφ¯ÿ‚é¿øš?á&µÿŸ _ÿÓñ5§EfÂMkÿ>¿þ ¦ÿâhÿ„š×þ|5üMÿÄÖš¾$µf ö-Urq–°•@ú’0¹¨âñUŒÑ$°Ùê²Fê]tùH`zvò+Fëþ=&ÿq¿•Qð×üŠúOýyCÿ  ?á&µÿŸ _ÿÓñ4ÂMkÿ>¿þ ¦ÿâkNŠÌÿ„š×þ|5üMÿÄÑÿ 5¯üøjÿø.›ÿ‰­:(3þk_ùðÕÿð]7ÿGü$Ö¿óá«ÿàºoþ&´è  ÏøI­çÃWÿÁtßüMð“Zÿφ¯ÿ‚é¿øšÓ¢€3?á&µÿŸ _ÿÓñ4ÂMkÿ>¿þ ¦ÿâkNŠÏ·ñ ­Åݽ°¶¾î$1¡žÙ¢ÏüXÏzg¨õ­zÂÕ?ä= ×Ì¿ú"JÝ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¡¼ÿ)ÿë›*š¡¼ÿ)ÿë›*Ëð×üŠúOýyCÿ  Ó¬Ï ȯ¤ÿ×”?ú­:(ªº¼—zmͼ<2É*HŒT£c‚÷®BÛV½Ôì5 GÍš5Ó´¦ãÊ ÎÒ\œÈÀ÷â€;š+‰Ó|QªOuKgÙVh­œÉ*«’UI`YòO9iÏ®j+ê¯,sZÛ—¶óa˜ª¶<ïÞy@sÑ‚sõÝÑQÛùÆÚ#q·ÎØ<̓ »ãÛ5%cø—þ<ìÿì!kÿ£–¶+Ä¿ñçgÿa _ýµ£{$°ØÜKo•#fEþóÀüèz+ŒÐ§…¡Ò/¤ñ%Ì——„y°4žbHÄÈ}Ìüc=—‰¯g¼´iÏì×wrZ¬OŸÝß3sáä`c"€:Ê+“ÄÚäúsIö(õ…ÌÑ4(û¢h†OVî:z^…Í­_i3ZDeÉ&o‰'’MŠòJF÷Ëêzûã€ÞQ\zx¢þ;Óopt÷TÔa´ibÝ´«FÌNKpröäsÖ‰5;ÝJ K$±"k»¸ƒ°b6DWi<’ ý:P]Xþ.ÿ‘OUÿ¯gþU—¢ø—SÔuXcšÎí'’T_Þ"È›3ÛyféÈÚ1žâµ<]ÿ"ž«ÿ^Ïü¨bŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Šç|e$‹•ÝOl“êQÅ+Ã)Œ”*ùéY ­Ýé'U‚ÎgÔa†êÞig“ÌÚÒ˜$dޤuäÐsEr âMdiÑ·Ù-ÇÚ^Úé'Ê«œˆÖLçžWq#­*øžöæµ}:'žÖK‡š}â#±¶í\àƒëžžô×Q\ü:¾£s¯ÛXÀ¶g{îå|³™ˆ!àŽ ÎÙø¯S‡L·µ–#Ó>ÚæåžB$e* l’@Îy B¢¸K½_QòõùšãäŠK3CrÃùg ‘Ã`úŸn*ý—‰¯g¼´iÏì×wrZ¬OŸÝß3sáä`c"€:Ê+“Ѓÿšßý„þ‰Š¶+’¸Žé´ïIa,‘ÜÁçG±ˆÜV(ŽÓŽ €F=è­¢¸ŸøH.͵æ»fh.n!´³‰ÛäAÑŸË:Žƒ‘Vá"ÖŸlEµ’ÝË© #¹Ã& “’ÛiÈ?­u´W&|E©C®Çgt–I\-¾å Û‰£);[=”}j­¯ˆ5í « w´‰…ÍÛù׎ì›QÀ >n9ë€: í«_ù­?ì?þŒŠ°ßÅZ­Ä}•½œhšPÔgV'!˜#‚ŠÖ‚µx—M¸Û·ÍÒå|zeâ4½E„àdô ¢¸ÄRÏâÁq%ÝÃYê2ÉPº¸Ž ¸òÙIrÛ[¡ïZgÄ×nVÍ¢Ü>±%€ ¤â1» Wp9à{s@]Àéz†·s†L7É%ÅÌ7EÌ»¶66ãxæ#ŸNµ,^3Ô.lî(ì û5šÜÊ“–ÌÄ–Èž>ï|ò@ æŠÁÒµmCQ×/ ò­ã²¶˜7šKÆqÁ5½@]Ǥßî7òª>ÿ‘_Iÿ¯(ôW®¿ãÒo÷ùU ȯ¤ÿ×”?ú  :(¢€9ïÝÉ‹ö+e‘î5è±€X©åÈý1Xz~«w¦xzëO…&´{ÄtÈà¶‘²ŽAÀ$wW{Ep÷÷’ÜYiWÛ2MjëÚVŒ2m8'Œ20§=3U›XÔt¥½¸€††mBòÙcX—‰ó˜›“’9¯A¢€8}_V×ìµE²Öñ4Pðʿñôç‡!V6-Ï]¸®Üg=ih Š(  SþCÚý|Ëÿ¢$­ÚÂÕ?ä= ×Ì¿ú"JÝ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¡¼ÿ)ÿë›*š¡¼ÿ)ÿë›*Ëð×üŠúOýyCÿ  Ó¬Ï ȯ¤ÿ×”?ú­:*³µX¦‰m¡ÎY¥AÄ…¾ñaß=óÖ§¢€+.Ÿb· p¶VâtP« ‰w(>bììöVÌÒ8‘ɉIfñÉY¢€ (¢€1üKÿvöµÿÑË[â_øó³ÿ°…¯þŽZØ  ÑiÖ0\µÌ6VÑÎÿzT‰C©4%…”wmv–vërßza~­ŒÕš(¯öm‡”‘}†ÛË<¥Â«}à8¸ïPßèöWÖÍ F±ŒGæDŠ 9 È ¯±­ ("ÃÚm´ð4 r“¸yñ¡ò… °«Ðéö0:<Vñ²*R%K}â08Î}qVh  ñØÙÅr÷QZ@—}ùV0¾§©¬ÿȧªÿ׳ÿ*جȧªÿ׳ÿ*Ø¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š( »+Kè„W¶°\ÆpI£õÁïɦ¦Ÿc¡´ŽÎÝm›¬+„?ðb¬Ñ@LÓÞÑmÂÕ­åa0©@}—¥—MÓç†8f±¶’(¿Õ£Ä¥Sèâ­Q@ xU¤ ä!ÛX=Búg¾*ÅPEPEPEPEPEPEPEPEPEPEPEPEPEPEPXúü~kö?ú&*ج}þ?5¿ûýh-šÙým ¸Ç’#1œýÞhK 4Š(’ÒŽßÀ·<¨ìy´Ã¤é…aS§Zú `_Ý÷ùxãð«”Pi1Ë$±ÅÉ)GU¾O|*J( ®¿ãÒo÷ùW5§êW–µ‰ H'ÓüÉÞD,BÇgŒŽòs]-×üzMþã*ætý:âêÇÂ÷QG C§ùS¤ŽTí’8ÆFÏñÅ[o¬ÚMíÝ¥Ôf+7ºî"Är€ ~œT¾+{Áq Í9òV(-âù™ž!#r[y8Ç¿Z¹oá«h,ç´7—ÒC-³ZªI("(ÈÆc÷9\r½r C©xª+´Éd¢´»Žf‘eŒ‰C&Ъz’qß<}jO¥è?Ú1Y;Iº0br ¦ææÁ÷ÇóŽÙ4˯ é×ÚÅv×­¬rƦGÜ[ÌsFsÇcfëG†óCþɸ¸¸xö¢ù¥‡˜vAÎ1œÚ€*Ëâ{8®^'·»Å*Ã4áŽ)V9ëÈŽzÔšž³%†¹§Ø›bÐ\Ç+É6GÈëÛ9´¶þ.´Õ`ºIp—Q[™ÓÏPêÊ:ð‘ô$zS,<&_ΓX¥’K¤¹Ú²oÎÔ)†b£ ‚zÛut&±Ó®!±¸¸¹s‘ W7Ž5é…ì;OÍCÔ—ÒøNòP¢K‚e`£€ZÙÉÇ·5Ô×-¬–2xJÎb¦Krbr§#+làãò®¦€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ †óþ<§ÿ®müªj†óþ<§ÿ®mü¨šðö‰4¾Ó%î©{H˜"¶®Pp38æ´°'ÿ¡‡Wüáÿãu?†?äUÒ?ëÊýVbÿ`OÿC¯ùÃÿÆèþÀŸþ†_ó‡ÿÖÕ‹ý?ý :¿çÿ£ûúuÎþ7[TP/öÿô0êÿœ?ünì ÿèaÕÿ8øÝmQ@–¿¤Mogo»YÔfó/m£a‹ä&dù†r;g#Ú´ÿ°'ÿ¡‡Wüáÿãt¾(ÿ;ûÚÿèå­šÅþÀŸþ†_ó‡ÿÑý?ý :¿çÿ­ª(ûúuÎþ7Göÿô0êÿœ?ün¶¨  _ì ÿèaÕÿ8øÝØÿÐëþpÿñºÚ¢€1°'ÿ¡‡Wüáÿãu™â]"k_ jS>³¨Ü¶“÷S¶¶TŽv >ýk­¬oÿÈ¡ªÿ׳ÿ*Oì ÿèaÕÿ8øÝØÿÐëþpÿñº—SÔu;Ëh`±µš;©|¨Ýî™íŒç Fp>B:žÔë°}²k;Å0ÏÉÊг"0ùö€2_hÎ3|PØÿÐëþpÿñº?°'ÿ¡‡Wüáÿãuaµ»(¢s&ÝÒL€FŽüF厀8É<z‘‚lß_Ûié];/šþ\acg,Ø'('¢šÎþÀŸþ†_ó‡ÿÑý?ý :¿çÿ©Ÿ\´FŠ@ÀÚ=¤×M7?"ÄP·ÏÎ}ÆÜb¬ÝjvvŽé<¤:%˜ï,I%[“ÅPþÀŸþ†_ó‡ÿÑý?ý :¿çÿ«0ë—2D¶ÒnÝpmÜ:º2¸ŒÉŒë€:ã¿9.°Öl5E´™œ¼~j‰Ð:qÊ–£8éš©ý?ý :¿çÿ£ûúuÎþ7VåÕ­ iÄí*qXÑäfc|m œà“ÆxÏP'kÛeµŠèÊ<™Lar\…_̰üè7ûúuÎþ7Göÿô0êÿœ?ün¯\j¶VÛüÙ[)(„ªDÎÅÊÀ~Sž=ý G&·§F´ìQ•\ºÄìˆd`0¼sÉWûúuÎþ7Göÿô0êÿœ?ün¥»×¬íæÆ^YMÄvçÁ3ª‘¿rÎ3ž*KífÚÃPŠÖçz,I1—cP¥F2S»ù¬2[ûúuÎþ7Göÿô0êÿœ?ün´lïí¯¼ÁnϺ2¤‘´l¹é•`?J„kZy’dóÈ0îÞLlím¤)Ɔ `gž(§öÿô0êÿœ?ünì ÿèaÕÿ8øÝIqâ 8mŒÈ³¹Y¢‰ã0H®¾c©\㓎9Æ5u/ídò¶KŸ6g>S˦íçmÏN>”ý?ý :¿çÿ£ûúuÎþ7VôíbÃS YLϺ1"î“rŸâ€Èút©ïomìbY.Y€w¡™`ª =å@¿ØÿÐëþpÿñº?°'ÿ¡‡Wüáÿãuaõý1"IZá¶2³"s°T—|€A-Ž‡Ò£þÞ·û\ð2:.L Ìób.W ÉÀ‡µÖí¯5­-„¾˜»Æñð €ÀdÇ‘Çöÿô0êÿœ?ünì ÿèaÕÿ8øÝ_™Ô ˆ‘Œàí#Ëm¡¶îÛ»s·œg8¦6¯`¶‰tn1 –Ív­±¹‰B’ØÇ£/y  ØÿÐëþpÿñº?°'ÿ¡‡WüáÿãugûsMû4·vXádWÝ©È ò‘’ # Qý·§ù+ –FÜåk†MèØpÇ»Z­ý?ý :¿çÿ£ûúuÎþ7VŸZÓÐ[3?Ú•šNåÂ…ðXgÓð5.•|šž—k}cÕNAìzæº:l²G O,αƊYŽÔ“ØPV“¢>äÜ1³.#ò×ìök # ’Ç$“ÀéíQj ×—ÍqöÔ çE4k$EÌe œ)ܯM:Ùâ’q.ù €ªU#j‚Ì@ã8ÏRjé’1*Ä]DŒ¥•3É z ÌS¨<=Ølí&œ¼vúl– „Ú\8Œñþ¯§=}¹žÓN¼QŠîöú9ÌP<*©—Ã;Ìyù>žÃ¾Œ²G O,αƊYŽÔ“ØS¨/û&Oíßí%¹ULå£H¶³ü›pÌ{ò2|qY—^¼CžÝn–äÃ¥Íemð¶åP¹%ŽOÈaô®žŠç¯ôkç¶žOµ,÷“Mh¡Ò )ƒgi'$e‰çŸASG¢\Åsöèïãû{;³»[“TR6nÈÀ‰?‹±õ­º(.ÇG—³yæF‚9Õ²¸ÞÒȲ3{r§j—H±¸Ó¬mì乎h­àHWlE Û‘“óÛxõ÷À¿EQEQEQEQEQEQEQEQEQEQEáÿøü×ì"ôLU³XÞÿÍwþÂ'ÿDÅ@4QP]^ÚY*µåÔêç e 'Ðf€'¢šò"FdwUFâÄàëšm½ÄP¬Ö³G4MÑã`Ê@V4¿ò;ZØ:ýlÖ,ÜxÚÓ?ô ŸÿFE@TSc‘%‰%‰ÕãpYNCЃÜUiuM:“m-ý¬s‚‰¦PÙ<Ž3žõJ2nÉnŠ)²H‘¨iP8äœõ$øÔ€ê(¢€ (¢€!¼ÿ)ÿë›*¥áùtúò‡ÿ@vóþ<§ÿ®müª—†?äUÒ?ëÊýPQ@SX–T‰¤A#‚U °p;ã"‹ú)‰,r3¬r#˜Ûk…`vœgÐàŠ}QEQE¬ÿÈ{Ãÿõó/þˆ’¶kYÿ÷‡ÿëæ_ý%lÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPPÞÇ”ÿõÍ¿•MPÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  Ó¬Ï È«¤×”?ú­:(¢Š(¢Š(¢ŠÆñGüyØÿØF×ÿG-P»·ÔžóÄs¤Ú€Á‹8ј#1‡’£¹ÝéßÞ¯ø£þ<ìì#kÿ£–¶kZU]6Ú[ÿš š¹ÇÏ£nºrÏ6³-³[—‘ fiDä.c½xéžµ¢hÚœ·(ÚmÒ„n÷6f@Ís·Œ6?Jô+©cä â’×þO˜¹NûH¾ÒšHtµ¼“ìúl(“Ff"à³G}¹ãÐÒÞ^ê2êÓI Õ`ÓfºŒl@é)Qð/\në·šîj«KkÈü«»xg9Û*úqÇ]ûñ¿Ÿ^Ÿä.^Çš­Í¯›núŒÅ¢ªä³: F z{ô­ý ûm\G<·ÒÛ˧Ç#›†fmÄ0ô8í]0ÅK¤Q¯ ˆ¡@úO©«ŒçN*6_ðn5cxÇþE Wþ½ŸùVÍcxÇþE Wþ½ŸùW DÚ´RI}£´q»,w¥œ¨ÈQäÊ2}Hˆ¬Ù¬îRÿP¼‡í‹!Ôí¶*3„hÊÀ®vŽcx$ç{bºZ(‘Ô?´…œL?´YÖâóÅæÿ¾>_Ì¿wåû»LuíZ~%”Ætµ/v±Iy¶Qj\;/“!ÇÉóñ[tÇŠ97‘š&Þ„ºpFGàHüh”’RKtK¿´ 2ý!vÈñù žÎT¼äJšúòææý¤5ôóä,c’7aûâÛ³Ÿ/;Fp>•ÔT7V°^Cå\&å0Á ©#}ÅsšT—2_m…ïÚÞ=X©—,±}“ 6îBï óÜŒóSè^ÀÚKÜI|æ}8µ×ÚØ,£ÊÀ!¸VùŸŽ3ƒœâ·-- ³ˆÅn›T±c’Ibz’O$ûšš€9]Uï“[y!]@î-ñ·Íth²›ÈU1‚ÙÎæÈ=8¨o#¿†Æ?&;ðÂêõ„0 y3±BYzpr7„žÕØQ@ÏúoÛÿæ#öï·ÓO³ýŸýûÿWÿÝRøŠ\jö0»ê¶¸fK"û‹RBsÆO·<ñšèi†(ÌË1E2¢”WÇ  ŽÑù åç‡Y‘|Ù^ôM…¦õ…ÈVrî'ÚÂt÷*zâ‡û^çû7ö¯öWýÞoŸ¯¿nïÞmϕӟ½Šêè RÌÏi!¸Ž=Kì¿Ú…Ÿ|r4¶Ú \neß·¨'žA¦o½“{Þ®°±°”Û-¸páüé0}Ï/nÿ—í]uÊ"j­¬æ[‹Ä”^"ÛÊc0nãæÞ"ÁN¼nÔÕÍ'íkâ µ›í¯óNùwª/Î6¨*xÎ ƒæ­ú(”“My5éWeê£ê«3H­ _ØØd7@7eNG–«Ìš¨Äsͨ%¼~rÂR)åv"iî(ê~à²_¯gEbjî='NYä¹oñ¡eeØs€„œîÛ¤œg™h·“5¼SêbÔjÅ´’,‹Ù7Iù•w×$w®¢êÖ È|«„Ü †$#¡r¸¢ÒÒ 8ŒVéµK9$–'©$òO¹ n¾_Dûu¼•%Wó]<½¯´ôòÂä!ŒòzÖu—Û¯|1/•ý¥?Ÿ¢Içý£{y“² ž^î¹þïw<×wL†(à†8aEH£PˆŠ0€s×¶×vÇR†Þ}CÉ0Û:>d•·I·œýй rÈÅL¦ý¼& Iv—¹™¥òüߘ‚À6vdŒüÝ3ÍoQ@œö²ÝÛÏ ©5ˆº³h„Í0“p˜y„nùö…ÚyèA#¦kfö §×ôðåm’ü·eFpÑl Ž¿ÅÇ|Ù­:(޲‚î[/í)5§ó,cpbyK‹‚>pøé³¾_½žsW¼»¨¼/¢ÄRí»X U|€æ6Üãœfº:(Ζw^LZ Š]HÌeY<¿%F[ÈW#`ôÉàÓ-Ò÷6×3E©=ÄV·ñ!b±>b˜‡Í AÁläœ+²¢€9æk;‹£wöãjbƒË2Ç;|å™[™9î™è;ã©«^"´Ö‰¼ûš”~\üÇ©Ç psÚ¶È 0ÀœóK@¥¯öÄ©§C!¼úâF ¦ŒfP»¿ùšX^ù|EíÔmy*J¯æºy{_iéå…ÈB0 äõ®ªŠä!ME4×–XoŒï¥X#²îY ‡“Ìç²e€°}H¨¶]:B·I©¼j›Ã"O½a6Ì2 Ëãya×<öÈÚQ@|ñëÚÎXVçÏ[k•èZEŒÜC´AßåÆA$õ«áĹWº2Os-¹Ùå‰á’<wcÍfr:uÀãŽõ·Er“¦°muH½aµ¸[y¶ë‡pLd¬Up>§Ö—U{äÖÞHWP;‹|mó],¦òFÌ`¶s¹²N+ª¢€0üD'i­1x#!÷4 (ü¸ #ùSŽ@àçµ^Ñ$¸—C±{Á ¹6éçyŠU·í²¾jõQEQEQEQEQEQEQEQEQEQEQEQEV7‡ÿãó]ÿ°‰ÿÑ1VÍcxþ?5ßûŸýlÖ½?•{ Çk/™$.t-%¸¡#*äã¾úVõÏêPðÜz}‚]m†;g¡mÆ%uÈÃ[jœ¯_QÍ[ðø›È»iVMpZ)%„E$«µ~f\ ätV­V%Ç>3¶ÇýgÿÑ‘VÝcKÿ#µ§ýƒ§ÿÑ‘Ph7©…go$‰5µšyŠÖ’¯*€ \ì:ö¨dŠãZ†{¹…̪Ѣڻ,€Ããv6ŽAž1] Ñí£ÌåmüüïØV9·Ö" ·7K4qD40É"±¡‰*á3¿vwŽ˜­á¼77Ó«Þd_[$J¶ùY€¹¦>þOûÞõ½ESÅ6Ó·õ§ù~,\¡EW)AEP7Ÿñå?ýsoåT¼1ÿ"®‘ÿ^Pÿè®ÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  Ó¢Š(¬Ý~“K–{ecwj¦{r‹–Þ àß=î iQU 8IIÎßÙÜYÛÙ[ÛÉ:ÛaÚâHã‘Ýä8 °ƒrw“Ž3Š‚ðj)¦X’ú„ÒªÈv¢cÄ»qëßÌ~:sô  ß ë2k|LêKÇ^lò³ÈÈ !q÷yàô<à`f©Áâ ëh¤{Ûu˜¼•ŠÊ†$@'ã=OqŸ—v×M³´hšÚ†Ý0ÇýZôžqØžy>¦…Ó,‘·8™pI ‰X<€ƒ×,þ\P|úåÍœ7-}`‘É”—‘¤sï¨å'hÚ~eõûSF¹x²È'Ó¢H໊ÖV[Ä4›6•yÿX¹äwÆjâhzrA<>KºO üÉÏ–F ‚I*=†*wÓíÍÝ|éÒáþc̉³iëÛËN:qõ  ¯jWö/*ÚykÓ.®7“–WŒ&Òéžr}9[ŸOi3Û\éø¹&?)#‘¤ HFv¦A'ÎíZwÚmž A»ˆ¾"’—(àS‚2äZK­.ÎîG’xI‘Õº»+ …ŠàƒÁÛ‘ƒÍG§j3ÞØÏ)±’âfA›”9Ae8É__J¦I—vâ€ãþ¦{­¶³w;Í ¸–•¤ó§ …HŠ É>YÀ `’O'B ÆÞQ,q?˜%ó·<ÎÇ~›¹''i#ÿÔ)’èzt½au$¹&9 obì d$àñÍW:ümguu £‡NŽý2Ø.HBôãý_^zûT¿ÚÒn9­U8YM¬ÿ&쪑†¸91ÍIu¢i×ë­Î "©#¢² áHR'éž*_ìË?í·yMöŒîϘÛwmÛ»nvîÛÆqœq@õ¯­µ› —ì·3¬F-ƒ=næ[Ÿ°ÇaÛÕÝ^6¸"5 ¨ÄïÛ“‘*séRÝh³XÉkõóf†I^IGpŽ­‚ÌsÑHñš—ûOòV1ŠUˉy›S¼6ãž;ö”Z=n{‰,á´±V–ág.$›hˆÄêŒ2ç–8Àì=x­§k÷m¤ »X÷Þ[Ã#ÌeÚ¬ÏÆåÁn„®G\ Õ³ŸinÐ4„6ñ´QàžŠ–ú䪜ž3UãдØþϲŰUŒœ€îPA8m¤äg8íŠÒ¢™ ) ²¦ì33Î[’rzöç§AÚŸ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@cxþ?5ßûŸýlÖ7‡ÿãó]ÿ°‰ÿÑ1PÍQ@Q@cKÿ#µ§ýƒ§ÿÑ‘VÍcKÿ#µ§ýƒ§ÿÑ‘PÍQ@Q@Q@Q@ÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  »yÿSÿ×6þUKÃò*éõåþ€(NŠ( Š( Š( Š( Š(  mgþCÞÿ¯™ôD•³XÚÏü‡¼?ÿ_2ÿè‰+f€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ †óþ<§ÿ®müªj†óþ<§ÿ®mü¨›ð÷†ôÉü9¦M"Ýï’Ò&m·Ó¨É@N| ­øE´ŸîÞÿà|ÿü]Máùtúò‡ÿ@§@ßð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñu³EcÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÖÍÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ[4P%¯è}­¿’.¿}{mî¼™þS2gcƒî9­OøE´ŸîÞÿà|ÿü](ÿ;ûÚÿèå­šÆÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹­š(þm'û·¿ø?ÿGü"ÚO÷oð>þ.¶h  oøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøºÙ¢€1¿áÒ»{ÿóÿñu—âmO²ðÖ§sn.¼Ä¶“ï&qÊ‘÷Yˆ=}+­¬oÿÈ¡ªÿ׳ÿ*?áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâéukVÞúÎ;K›%Šî$ m™Ù?v~æ1×Ú™·,W—6×–îë ÔVßh… .‘‘[<»ãŒàŸZwü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü] ¯Å D)¦’Y®V$Pq…¹=8'¨ »¨ê `-Á‚iÞâ_*4ˆ –ÚÍÜ€÷  _ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtÙ|Cyw7û(³º¸•JþñZE+×ù˜p9«wš¼—FÔÅ4³â=‘Æd/¿dœFÄç­Vÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹§Ã­%ÅÄP¬3@ÿl6²$±‚wL½C` cž~œä;LÖáÔž–·0‹›´BÓ*" ¹Æ‘ë×xÍEÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿR¾¹wòZµ½ÎاKwŸjùjîªTuÏ;Ôtêj5ñRÌÐÁa{,žd‘¢ª ó<¶*äÀ`rq÷†9È ÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿO]~ B‹[[»‡Ød‘#EÝ TîÉîV?)¦Úk±¾”n®co2-:+é„c‚Xárzü×ÛšOøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº™µËuyKAr-¢iî¶( aÁÜ1´Œ‘ŒŒf«Ûx§N¸ûF7©‚¸ 29hש¹äppy Â-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÕý:ùu o=!–!œbM§<TG=AªÖÜ·ßcû=ĘÚU” ÀbW–0š‡þm'û·¿ø?ÿGü"ÚO÷oð>þ.–óÄv–wÍãÈ‘a2Š!Ep ³v¶yÀàóÓ-‹Ä¶“ÛE-´3Îò\›QE„ ã;¶ãhê9úÐÿÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÓ—_†U_²ÙÝÜ>ÂòG®è€fS»,9ܬ02~SPê^$Ž K‰,mfºhìE꺅„!Ê’IøŸ×Â-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÕÛËÿ±ÚG;ÚÜ;9Ê@»”‘Ÿ˜“´ëœ{Öiñ™5“ZYÏq Ä7ÉS"´NŠyÝ··BsÆ=À%ÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹¥oZym<0ÜMk$’Ü"®È•”0'$òNÀ5mõHÜe$ÿG¹ŽÙ¸³ùx#žŸ¼\ý Sÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹¦nãþ­CT6L²Ú€±±_›Ëfœ7û<óØã›}¬ IŸ>KïB$À' bÀOÌOq©½½ýìM ˽´2ªÄ¹vgyޏÇÈ=1É'ÐøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº?á$´û!›Èœ¸¹û7”<ù›wãvíŸwý¯n¼Töz”—:¼ÖŸe–8’ÖÕÜråÆÎGÝôê=²ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]Cˆˆ†Yï-ä…!ŽòF@ªÅ– äØîsÈfuñfVG°½Œ$éo#º¦#wÛ´6yÞ½3ŒóŠOøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøºKé·÷ÑZÀÄ™óä¾ô"Lz,8üÀT×úäRÁ%µËˆ!Yæ–5R‘#9 ñ°çñ@Â-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÔ×ZÜ—ëk5½À "D&„,ä[sr@ÈÀÕ{:Måå­¤ác´’æÞiPyR…@þ.øE´ŸîÞÿà|ÿü][µÔ–çO–ñm§Q'aÚYð3ò•b§>ǯV?ØK3ÅÌ즸Q‡óqŒsÎ}ï@ ÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿIcâ}6þú+X“>|—Þ„I€O@ŇŸ˜ ƒþ "Z „ó¢"HÑFÆ3Ѿg‘ÏŒ` ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñunãVµ‡G]P’ÙÕ à@^¤÷‡RïT®|Oej± ¢•etó Nñ£*äŒüÎÉIÍ;þm'û·¿ø?ÿGü"ÚO÷oð>þ.¡¸ñ~“Í/–’4ÐlVPÀíf x ü õ«rkÇ{-¹¶¹+ ÄvòLv+¸R¿Å“ê8P_ð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtº¾±&›­VÒ{©ÜNØÂð¿0çæorñ H²»ØÞ¬VøûC•L@ÈÜ7gîÜ€FqÒ€þm'û·¿ø?ÿGü"ÚO÷oð>þ.Ÿ>½7ïf¶W’ºÌ ¦ÖÆ$Ú2ÃøNrp8>Õ/öͪèï©ÌQ™dÀepå žqÃqï@ÿáÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâém|Giwou$M$–¡KÃI†$ 1^Ç¿9Å$^"·œl·´¹–ã{!·Ca´)cÛp¯ñwÇZ?áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâ铸‡ì÷S—³¸{X¬¢ºfX¼AŒ›‹†# AÀëÖ¯êz”Zd1I,rHeDŠ…A-‚z±pSíÖ€)ÿÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÓ®|A´…^Òðª[¥ÌÎ lXe ñ´äOëLo髨‹-ÄŸ;ìûæ<ÌíÛ·vþ¼gn=èáÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâè“_FÓ®nâ¶¹H’ÖKˆ§xƒ$Š£90>„*Héê!mzHuµ¼A¤^Hcb@·i˜’Ž?w¦Rv€Mÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿW¬oáu{;«fP¬êàs‚$véÔwÖm¿ˆ‘UÚþÞXc1 €£Ë>SH}KgddçÈ?J“þm'û·¿ø?ÿGü"ÚO÷oð>þ.¥]rIMÕ­Õ©ŽÝ®BʪKÆ¿x¤ò288<Ž*!®<¯§y3컹0±rŸ(òÙ÷‚8ìO‡\ ?áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâëfŠÆÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹­š(þm'û·¿ø?ÿGü"ÚO÷oð>þ.¶h  oøE´ŸîÞÿà|ÿü]eéŸuy¬yÂë÷7¾Rm¼™>Q XÎdûžk­¬oÿÇæ»ÿaÿ¢b þm'û·¿ø?ÿGü"ÚO÷oð>þ.¶h  oøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøºÙ¢€1¿áÒ»{ÿóÿñu—.§ÿÂSig‹¯'ìSËÿ“nݾ!÷·nÆ;gÖÖ4¿ò;ZØ:ýð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñu³EcÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÖÍÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ[4P7ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]lÑ@røoL‚š5»ß–]×Ó°ÈädÁú£áï 铸sLšE»ß%¤LÛo§Q’€œøA]%çüyOÿ\ÛùU/ È«¤×”?ú áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâëfŠÆÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹­š(þm'û·¿ø?ÿGü"ÚO÷oð>þ.¶h  oøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøºÙ¢€1¿áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâëfŠæn4»M7^ÐþÈ&eÌ›¼Ë‰%鏯ö8ëÚºjÆÖä=áÿúù—ÿDI[4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQET7Ÿñå?ýsoåST7Ÿñå?ýsoå@&©ö[ i¾Fÿ·XæoÆÍ‘!éŽsŸQZwšþ•cz,OòälbqÂî`0¹>¤V-–u£øbþÊý-&²±oƒÍ ¾4Ã?Z5? _jŽd¼Ö•ܬòëò©GÝ•þ\Ž~Ô²Úþ”º‡Ø ×ïüÁ<¶Û¼ô]øÛ»Û9¬‰|k‹0Ù¾óy%¢›‡0F ç–vg1žÕb_ ;øuHïÄ L%eŠ Žøþp@e>êO½×q%ÊÚêÞWy%ÐV·¿?ÞGR~až1@[x’!ldÕ 6Œdòã7ÚÜg(Pe¸ëÇ<¾$Ñâ·†v¼ è] q³ à’<qŠÅoDÃÎ{˜èÎf;¬ÔÁÊí#ÊÎ:`ç9ÈÍKsà¸%ŽÓËšÔK- l#t`Í»"1…RpyëÎhN÷ÄÚ5‹ª\Þ€^¸]‘»ƒ$Ê‚1Åj£¬‘¬‘°d` ‘ЃXSøe$k.èF“i_ÙÁD m7Ïü_t8­›(>Ëe¶íþLkìc8Î(3Åñçcÿa_ýµ³XÞ(ÿ;ûÚÿèå­š(¢Š(¢Š(¢Š+Æ?ò(j¿õìÿʶkÆ?ò(j¿õìÿÊ€4n¬ãºšÖYÃZËç&ÓÁ;9ößҡ“J‚O´ny?Ò.¢ºlÃÇåà:~ésõ?„—Úžž`“¾Ñ(†<‚w1è8éõ½iTyL»2¼’ù( 0 Û à` óÓ‚:ñ@_i‰}moÓ˾ÝÄ‹(X°d‚¥Oöúc©¯‡bA“¨_DñyÛ]3‰X3ŽWÔq韦5n®"´µšæáöC 4’6 Â’p=¨¸¸ŠÚ1$ïµK¤`àŸ™˜*Ž=I€3öž[A×ÚȈ’Û£.ÉUT( ‘ò€È,Ú,S]É9º¹E’xîeØÒ&Ü»žˆ Œã^kN¡P›Óf™Ö1)P§I q’sÁô  ßÙ0fÞéí,ÍᘶHÊy¤– qêÄŒç­'öD&9’I¦s5ÄW.ä®KÇåã Æ”¹ã¹Æ8Æ…e¤%“ÅåÝÝ4‚!·g#1À€8‰Å-öo|÷-+ʦâ8£m¤qå»:=Øç9vëZP@Ð"O¾»|¢W?»ä„ »6@GŒU›-. ÒX$”µŽ×a ‚¨NÒxÎFæïÞ¯TÝÞ\ŒÛÌO(UFbUq»“ó:œñ@òxzÖHî#yî OÌxÊü‹;|qê23ž§¯³&•o'Ú7<¿éQ]6áãòð?t¹úŸÂõe¤%“ÅåÝÝ4‚!·g#1À€8‰ÅW½Ñ þ­s4÷Çk=¬P4q°hV²¶Aã :zÖÍG<ñ[Æ$™¶©u@pOÌÌGæ@  Û­Þæî[Ÿ´ÜFÒɬf7ÆT©ÉRqòŽ3ni‡àsY›»¶¶’Ýí’"ë¶a‚Žp:Î+NYâ†Hc‘°Ó¾ÈÆÌÛKcòR ‰o­ÜíVrû#ržSnUrB’¸Èäç¦qЦú l{»k››Y˜’ %p¹6)6ÕϺƒÁÎdm607Ú®Ãà °ï|Î$Áb[*#ǧ£ESÓ4è´Ø¥Hä’FšC+»…±tPà‚©ZxgO³šÎXŒÅ­FŒ3 ü`ñÈQ€=1Z—[F$ö©tŒó3QÇ© SÌŠ%XˆmÌ¥Úqާ <Ž;óèh…––O—wtÐB ÃnÎ6F:c€ p7Љ4¡†Þ;[Ë»c²Z——t‘¨ùCeHÈÉäy5¡wu •¹žáŠÆ ¯ X’H$’@Àõ©¨¼ök5ÙVi¢(—Æ99ÏNsœóœÖ|^‚Þ4[KË»fQÞ2€È¥™°AR 66Œñ[Pch±ù®ÐÞ^@’mócŽA‰J€ – °8',šT}£/'úEÔWM‚8xü¼ÇOÝ.~§ðµ,ñDñ$ަ}‘ï6ÒØü”ŸÂ‹,I* êR§ÔAö4ORÒ Ô·ùï"ﵚÔì |’mÜy~AÇ­Ew¢Au,ì×Åu´@…vM€9Œ€Á´è  ?ÙVÿmûVùwý«íXÈÆÿ'ÉÇN›yúþT&ÜéÒÙ“Ë’g›vì2»HdÈ>Ìr>ƒ­^¢€3$Ñ’{9íî¯nç321’F\®Ò áB…ÆG÷y?ÅÍ<7÷‘Ü3óWËÈʪ°ÆÌ`„N1ü#­š(6MÚK{¨ZIÊÝY­›’ùm‹¿$}ïÞN{UFÅoíÄ-<°€ÙÌ{Nx#0 ŽzèzеE`?‡K·ŒÜOØ`´òÑÆeT2e_ œa—AëW£Ò+“$wwI ”ÌmÕÀŒ¹9'¦ìIÆqžÕ£EdÀ,æ³7wmm%»Û$E×l(Ã/:Î*[ÎéåiüÇY§3:d`“’GN›÷íZTP;hÎÏyur̪ ÎÀí8(¿^§¹¨dÐìæ¶Ky|ljgšr¤˜Ê$ ?zØïÓšÒ¢€3aÑÑÞ[ÛÉä0˜Gu giP9àrrxÓ-ô(-ÄE.. ‘Ý}¨Éòϰ¡ ‚¤ŽõÎy­Z(FÑ@‘´¯+*€d|nos€~‚ŸEQEQEV7‡ÿãó]ÿ°‰ÿÑ1VÍcxþ?5ßûŸýlÕ FöêÕ‚ÚÙ¬ÀFÒI$²ùH€cÛO'ÓØóWë'WÒîµ ˜;«e† sÅ»JŒÙሹÆ8ÎhȾytˆ¯­-^Vš4t…ŽÓócïØÎO^‡­3FÔÿµ-¥”$c˔Ǻ)|Èß«`dsŽA©óÛ_MnP_$O±0ñÂF$S’pXü§·Ó<óÁ¦X½’\4³,³\Ìf‘‘6.p…ÉÀŽ眚»XÒÿÈíiÿ`éÿôdU³X—!Œ­„lΙ>Ö#8>d\ã½X±ÖóU¹²”X³åK»"m§kàvÚÜSΨÄÙM À%îà±-òãˆÇ>ƪÚxv7±–Þâo6×;™äg0Ú[ “†ã¸¥»Ñf»2L×Â;§Š$Yc‹ å€Ïq!ÏõÖÖÉÙéo=ûþ¤ê-—ˆ-î ¸šhÚ$ŽëìñmF›å ¬ŒòqÏmukkuYXµÉaˆÛ$«lŒq‚FsŒsèj£heb–;[‘=ÂÊ¡+µbXö>PzŽqø¿MÑŒ°9¸W­Âª¬[Öȯêz#ñöä’õtþ_/Ná©*kzt‘Ë"ÎÁ#‰¦,Ñ:‚‹÷™I0tÏQJ5›ŽÞk…AS †;³·jã-œ`†³O†æhåY/ÕÚKImZC .ÁÀù˜—ä‚£ÐuàTúµŒ‚ìjP³™Ä$^f;h,TX)÷§ìðíÚ2×È.Ë#[ÓÙIYdfÊ,_pPÄmÆî ñÆiòk¿œÎ'FxÄq;– €Ü('ŒŒÿõ«3NÓ¯¤ž}GÏ\¼îQ¥·8hÙ#S”Üæ1ŽsÏZг҅¬öÒùåÌ1Ì­•Æö•ÕÙ½¹SÇ¿µ)„z¿é?.ö ±Ï{ÌW £§ÙVee'%_~Lcåõõàq˜ü1ÿ"®‘ÿ^Pÿ裷Òÿ³¬¤ý÷™³OŠÛîã>X›¯}ý;b¤ðÇüŠºGýyCÿ  稠¥îl4iÑE J(=(*ÓZ[:;¯ ¤Œñ+D[•2€sŽF?¥[‡PµžaRͤ£|uÚHÃ~Q´U6ö³•’ÐD¬áÖªpF}TnjK]6HZÙ^à<™òPG†)Q¸çœGAY®~§\Ö¦âí¿‘£EV‡ QE¬ÿÈ{Ãÿõó/þˆ’¶kYÿ÷‡ÿëæ_ý%lÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPPÞÇ”ÿõÍ¿•MPÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  Ó®WÃÚž§‡4ÄÃ×r¢ÚDEžl Ï>õ£ý­«г{ÿñt³Eckjßô,ÞÿàDü]ÚÚ·ý 7¿øÿ@4V7ö¶­ÿBÍïþAÿÅÑý­«г{ÿñt³Eckjßô,ÞÿàDü]ÚÚ·ý 7¿øÿ@Š?ãÎÇþÂ6¿ú9kf¹-QÔ%³·ó´;¨6^Û:nšæ0™0ƒ pO©À÷­Oím[þ…›ßüƒÿ‹  š+û[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øºÙ¢±¿µµoúoð"þ.ím[þ…›ßüƒÿ‹  š+û[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øºÙ¬oÿÈ¡ªÿ׳ÿ*?µµoúoð"þ.²üM¨êøkSŠãCº¶­¤Ì¯4,å=•‰öéÞ€-ëz5þ±¨L°ÛÛ%©†&’3!fs–eà ¤m\žõfòÚ÷Qðí´Vøºi-šâ0ãl¨_cÿ^ím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâè>Má¿”ÿe-Θ·ÉfžX_š(€p¬BðË'{5ZïAÔ$‚Çe°ó’вº‰ZTusÓ0ñçsèMlÿkjßô,ÞÿàDü]ÚÚ·ý 7¿øÿ@ ðæœö/tþDöñK³lR˜G#9!bW9É8íT¬t˨,åû)V÷ìrE-ËN]Hq‚vœH'-‚¹Àêjÿö¶­ÿBÍïþAÿÅÑý­«г{ÿñt‡wåÜÛ=¡¶¬ÎÁåF>I³'ǘç$œuè*S¢IËhêÒÇ©x¬€,PÁ;°¨íÆ>\ŽkSû[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øº‹W°yõO>]7ûFn#‰w¨ò$ÜÄ·ÌF2 üÃ$m¬CCÔ&Ò­ ]<<ñii r…£˜)ÈË62‚O¨À­Ïím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâè6ïIžIo™t„t¹¾ŽvÈŒ–O$òîˆpr˜‘“UÓGºX­æŠ×‘[¥âyFH†7Ê­£tÇ[_ÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐ>¯¢jWQDmEÕÌzrÄ— ¡a0'.ß/8;”dúŒ ±{¥ßϬÜ\ÚZ˜dž&æWBb&£iS¸a±•Á^¬kCû[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øº«áí*K;öœÚÜÛ/“±ÖF€  ç/ÍŒ™ŽyéÍ7TÒ®gÄÚ4ë& ³¢¢Ý%\á†àF ŒŽƒ7?µµoúoð"þ.ím[þ…›ßüƒÿ‹ ¼´º—ÂÑÚ}–9.<¨•àJðWp°Î8Éç¡8&² ÒõKKiæ±²òî!»ó-cc)âTeœ( cØu&µ¿µµoúoð"þ.ím[þ…›ßüƒÿ‹  kÃ÷Ü[YY ¼«* þBË/ÍÉ.ß/8;”d’y¤¶m«-É€¬gSûAË.B}ËÏûü~½9©µµoúoð"þ.ím[þ…›ßüƒÿ‹  Ðõ%¶ºHôÏ%î4Û˜$Ñ…iX.Þwaà ÌsÏA“ZéW;n ¾Ÿö8^âÍ–ßzrc˜4’pqÊãÜíé“Wÿµµoúoð"þ.ím[þ…›ßüƒÿ‹  ÝE»µÔm¦¹ŠàOo´\„$ä‚?…w°$ç F1ß6¯£I>¹%òØ%Ä% Æ6ƒ8S6åäŒà´Mƒ€vÚ®kjßô,ÞÿàDü]ÚÚ·ý 7¿øÿ@cÑdmbžÅRËûE§û#2‘ ^C¨RÆ œí7¦j滥M©^Âñ**Îác•ÌÆ?-±íµŽ{c×ïím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâè íaœÛÚ\ÀZ$Y"’HO‰™trªË¹ˆ?7Nx²ÚY2E'öú ¼„éûã9b¨M…¼±¬0ñg®jÿö¶­ÿBÍïþAÿÅÑý­«г{ÿñtœú ìöö‰"*¼6—b&gÜ-äwC÷*^Û~• º4òCv,´?°™4«‹r<Èÿy+lÛÑŽsƒóßV¿ö¶­ÿBÍïþAÿÅÑý­«г{ÿñtZãF’KÛÛÁj¦åµi`—#p‰D!È9ã…ÔûñYšl(º†€~Æ¿hÉç^«¡ûIÈ pwOñŒã½nkjßô,ÞÿàDü]AÝä3¼ñxFtšO¿"Ël¾§4_ÅZUæ¡<Ímb%o²‚a°²I–þû|ŸÃÊŒûŒ ŽM*æK€òi—m2G‘šoÞÝò¯Ë·ùr 8­?ím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâè;MÒn ½ÒÚM+eÅ´Žnï|Ä>y1ºîàîl’ œ3PÚèWpÇi› M9@S*ÐÌE'9?.ÓÆAÛì+_û[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øº¥¤éw6÷v¬<‰í÷}²ózµåHìw± óŒb¢±Ð®,´û1”kqý‘$#~Ýóâ=¡™NO!ÆAàgqZ_ÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐEž{™"ÓÚd’ÉÂþé1ϺCµXó·9$ã¯AZ~#Óîï|ï²Å¼¶—wüÀ~ñü½ƒ“ßiç§'ö¶­ÿBÍïþAÿÅÑý­«г{ÿñtJûÃê×ÛXBm]¬œ& É;Xƒßf2{Ž9£IÒ®mîì XyÛîûeæô?kÊ‘Øî9bæÅ]þÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€1Ã3aYÛ¥‚}¢-&ua¹r.™b sž¹C†è09V…îŠñJ=>Â#o<ÀDU‘ÖGó22ÛJõ 7žµoû[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øºË±Ñ®"¸·i4ÏÝA©ùñ©.6ƒa )ÀĘbÔdÕxt;ôÓÞm;̽6°Gouæ'ú,J¤g9pÍòç9­Ïím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèµÆ$—··‚ÕMËj6ÒÁ.FáˆCsÇ #©÷â·áw‘X¼M ÊrÀ<ÁëëÏ5“ý­«г{ÿñtkjßô,ÞÿàDü]lÑXßÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐÍý­«г{ÿñtkjßô,ÞÿàDü]lÑXßÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐÍý­«г{ÿñtkjßô,ÞÿàDü]lÑXßÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐÍý­«г{ÿñtkjßô,ÞÿàDü]lÑXßÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐÍý­«г{ÿñtkjßô,ÞÿàDü]lÑXßÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐÍý­«г{ÿñtkjßô,ÞÿàDü]lÖ7‡ÿãó]ÿ°‰ÿÑ1Qý­«г{ÿñu—¤j:„WšÇ“¡ÝO¾÷{íš屆,¡Ë ‘ê2=è­¢±¿µµoúoð"þ.ím[þ…›ßüƒÿ‹  š+û[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øºÙ¬iäv´ÿ°tÿú2*?µµoúoð"þ.²åÔuøJm'þúó¾Å:}ŸÎ‡vÝñùÝ·ãϵu´V7ö¶­ÿBÍïþAÿÅÑý­«г{ÿñt³Eckjßô,ÞÿàDü]ÚÚ·ý 7¿øÿ@4V7ö¶­ÿBÍïþAÿÅÑý­«г{ÿñt³Eckjßô,ÞÿàDü]ÚÚ·ý 7¿øÿ@wŸñå?ýsoåT¼1ÿ"®‘ÿ^Pÿè«K©êrBé'‡®âFRFžw$ÏÕGÃÚž§‡4ÄÃ×r¢ÚDEžl Ï>ôÕQXßÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐÍý­«г{ÿñtkjßô,ÞÿàDü]lÑXßÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐÍý­«г{ÿñtkjßô,ÞÿàDü]lÑXßÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅЬÿÈ{Ãÿõó/þˆ’¶k™¸»»º×´?µé“Ym¹“o™$o¿0KœlcŒ{ú×M@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@CyÿSÿ×6þU5CyÿSÿ×6þTKÃò*éõåþ€+N³<1ÿ"®‘ÿ^Pÿè´è¢Š(¢Š(¢Š(Åñçcÿa_ýµ³XÞ(ÿ;ûÚÿèå­š(¢Š(¢Š(¢Š+Æ?ò(j¿õìÿʶkÆ?ò(j¿õìÿÊ€.\ëU¤æ ½NÊ WIgUaß¡5f ˆ.Tµ¼ÑÊ£(Á€È :z‚Њ¡«E$—Ú;G²ÇzYÊŒ…L£'ÐdøŠÍšÎå/õ È~زNÛb£8FŒ¬ çhá†7‚Nq·¶(£ŽHåRÑ:º†*JœŒƒ‚> ‚? ur:‡ö³‰‡ö‹:Ü^b8¼À_÷ÇËù—îü¿wp)޽«OIJ˜Î–¥îÖ)/6Ê-K‡eòd8ù>b2ãž(dÉ•b.¢FRÊ™äŒ=Gæ)ÕÈÉ©%Š:%ßÚ™~»dH xüOg*^r¥M}yss~ÒFšŒzyò@±É°ýñm‹€ÙÏ—£8JéžHÑ‘]ÕZFÚ€œ8'ÔàøurÚT—2_m…ïÚÞ=X©—,±}“ 6îBï óÜŒóSè^ÀÚKÜI|æ}8µ×ÚØ,£ÊÀ!¸VùŸŽ3ƒœâ€:*+•’[© ÓG¨@¨¹bòâ2ü#‚ÇžrF;Òn’UšùõV¶–æëÍXžRˉH‡>`›w:ü¹ãÕÓc‘%‰%‰ÕãpYNCЃÜW+Û±öŸö·•ä·ÙþÏ¿~ï1ñælþ-ž_Þùs»5ɨYh­‚ÿÌ}àX¢s²`²è>VN¸'®(°¢¹y?´<ë¯+ûKûO|þWÞû6Í­åg?&>çO›w^3LÓãÔ6^ºÔH6nkiU–^Å|ÙXsÂáO¯Jêè¬ ™ÍŒ¢u¹˜„3™ eÚ¼'ÎsÁÏ9ÁÆ+3Ãï|5h<õÔ)mäóVãÍp²†B ³ ãÝ~¼PUErÚ”™»¾ž)¯V/¶¤d/˜ÀAä¡%XûÎ¥NGÍŽàÁ#]Ce`—7:“Á.¤ËòG,r˜¼—8ÆæËžNïÈPaHî±£<Œe™Ž¦¹(þÛå§öŸö¿“ä7Ù¾Ïæy›¼ÇÇ™³Û<¯½ÆwfFÇS¾°¿[ÓvÓ.‹Dì±ÉpVPã ûǸã¥uÔÓ$bUˆº‰K*g’2@ô˜¬}h¿ö]˜¶[ÓHŒm(uM§—Ú ‡œHÉëXŠ·/ö¿M\ˆc½ž˜H3*yY#æÁP1’sŽIÁ ÖŠä$þÖû4ŸkþÐþÔòbû'‘¿Éßå®íû~Oõ›³¿¶1W®n/òòÙc¾-&¡lñ2Få?¹óÈ“#=ÉÆh{ΈDÒ™ËLîmÃr}°sô¥I#vuGVhÛk€rTàC‚â+™ûŸëvIÑ™ž÷j1“s’îSiƹ} 5S¨Û=ÝÅ߆û\mo(8<g)ØÁAÛ·56·euq¨ê&+w–6µ´Êã`“HÏ'‚Jñö‡­mCªi×K4ö²ÇÌ®“+Ç«xüjWº¶Ž8¤{ˆ•&eXظË}Ðr{z×=¬H5-;Q:UÉìÙãódâl‘òƪ@-Ÿn=ê­Íä’Admf6úUä $8iЩ_drŸJéSWÓìÚ&£f×!ŠDê_pê6ç9ö«•Îiš+ÜE#^ÜÞ,K¨Í:Ú•EL‰Ù‘³·v ÷¹úS¼E.5{]õ [\3%‘}ň)!9ã'ÛžxÍt4W«cìQeo…òiÊÀÀd(gÁÈÛÈ|ã`kBÁ¦}P<ãTûC\Hq‡y?6̃òôÛÓæÝ׌ÐüRG4I,.²Fê]NCЃÜR³ª• À8POSŒà~þUÂÙÅ®[i6Vóý©A†ßsE„E6) >ÜCN8V…½­ËeKr÷ÓǤ̌ÑÊŒ‘˜\ ‚ÌÛwã—ìH¡ R.¡q¶¡½Ä’¡ËOL>s‚¼ðpH=Nh®¤WV,(pÀ‡Áüüë‹ÔW}*ÙÂêBôihà§›ƒ>ÒH*€ Ù;Î9k{E‹ËÔµ—Ùp¾}ÊJ¦PûYL)ÈÝÇPÀÈÀ   guä`¨£,Ìpõ4µÅÉa¨?‡R':ŒÒÝhs„’IùácÚ¸'ån\cŒàç5jßí~|^_ö§ÚþÖ6ùžo“ömÝ÷|¹òý~}Ýhª¦‰#2´AÔȪ“<€s‚G¡ÁürúD·SjªÑ¾ ä_]­Á”¹‡É @¹ùr çƒÚ¥Öìîd½Õîí¾Ø²Ç¦FmŒ êU3>_¼GËòó÷ºs@-Êê¯|šÛÉ êGqo¾k£E”ÞB¨ÙŒÎw6AéÅ[Ò~Öiß.õEùÆÕåOÁCÐ|Ã4¿Erú‡ö¢ë—_aûd’4oäçzÃò~_T`_Œ îµV4ÕŽËYÜß¹òWzËm2àï]Å|É , €xç8 ÊŠäá‡Q6) ֠ѽͪ¡0˨óWÌ*df|m<ç`ûÖ¾™æYÏyo/ÚÞ/¶·i7É…0£˜äíݼdœgjÕ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬oÿÇæ»ÿaÿ¢b­šÆðÿü~k¿ö?ú&*Ù¢Š(¢Š(¬iäv´ÿ°tÿú2*Ù¬iäv´ÿ°tÿú2*Ù¢Š(¢Š(¢Š(¢Š(ÏøòŸþ¹·òª^ÿ‘WHÿ¯(ôWo?ãÊúæßÊ©xcþE]#þ¼¡ÿÐiÑEQEQEQEQE¬ÿÈ{Ãÿõó/þˆ’¶kYÿ÷‡ÿëæ_ý%lÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPPÞÇ”ÿõÍ¿•MPÞÇ”ÿõÍ¿•pw·×–G…çÓâYnH•‘LaŽDQtïï×rã[¼OjW6çÛž·Ü}•WawPæÖàôÆFyæº? È«¤×”?ú­:áíµ]j-B??SóâMdéÍ@‹½6nÜHÈéÆ*+]oP¼×d°–ûí)&¥qi%£m¸Ü7î¡§é-SíGûmR+¿³„ÈØüãî¶9ä 0^]ÝèÈ·ÓyòÚëÑ[y»— p úWgXÞ(ÿ;ûÚÿèå­š(¢Š(¢Š(¢Š+Æ?ò(j¿õìÿʶkÆ?ò(j¿õìÿÊ€6h¬MeoSPÓž«uww>KƉ NÙœåRzšŠ=RúÖòò)£6°ÞÁmç<\oH‡Ý ƒó>O#¯1@1âŽGäEf‰·¡#ø?ÅÓ”«iiœF+tÚ¥‹’KÔ’y'ÜÔÕ‹·=Ä–pÚX«Kp³—M´DbuF sË`v¼%®¥rþÓ/îxžãì»ü¶ùŽ‹žW¸nF=@= l$QÆò!šKµˆi²´^ÙÞHĵÃmb—´¨ló¸ ãµoÑYº¾§-ƒ@Á­.ïõ“l鎀+3{®8ªx’Sj×VöH#Ó⿼ÛHGÞv´å€C訠†ŠÁºÖ/]D–¶È–¢þ;S1”o8˜#ü›qƒó.sžø«š–£sm{oigf—ͲüóyaBû§®ÿóØJŠæÏŠüÅól´ë‹˜V8Ýʤ…¾tWB¡Rv°ê´V·_FöŽ-í$XŒ±†‘ÝŠ#ðФãÉö¼jS Q™–bŠeE(¯Ž@$?£ò‰·<:•ÜwÑÆ¶‹wäÇ(s˜Ç²|À¨ëÏ~§,“Äw1ÆÒ0᲎öãtøhÑ‹ðÞX'z}@:+ |C$—þTZtò[‹ƒneTÁ¶û›v‚Nþƒ¥[½Ô®"½{[+%¹xaJo/å%€ Á­×Ž´¥EcnRþoØ×ì?jû'›ç|û÷ùyÙŒmßÇÞÏ|TÐêÞh¶ýÆ<ûÉ­~ÿÝòüß›§9òºvÏ· TW/?ˆïŸC{´±ŠÞI´É/­‰Ÿ~…'pÛ×çuÏ|V”z´çY]:kD‹ æc–;7€¨Ü ädätšÖ¢³n¯¦Šþâ8cyVÒÓÏhe¥f,GýûoÌUøId1D©d’\ÈÎG#È  \’V2Àüê0P,€t4V*kWs›8í´Â'¹Ši \HbÙ岩ÎTœÜzqÏáÖîîä•¡Dެ-¦¶Ëe–I‹‘nyão¹ÀüQG ‰³9 1ËIüI'ñ§×:Þ#¸妜]šY£ˆïvÞ"rŽÄ$lW¸àõ=034ZíÕÊk¥¹™!ó¦Ši L£s( •ä’ŒFvŒc$f€7(¬$ñ ’_ùQiÓÉoöƒneTÁ¶û›vƒœýJhñÙâ•§…Ø´˜‰q™9Šyc 1Ÿ—ýs‚Hýƒˆ¦–ñb]6f‡Ïû;È‹#m`ÛXýÍ¥CgÝqÚ’-^úòm*D·[{+餂PÎÉå;.å+ò“€x'¦ oÑTô›—»ÓÒIpeVx¤ `F(ÇóSW(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬oÿÇæ»ÿaÿ¢b­šÆðÿü~k¿ö?ú&*Ù®kÅ3ékwoñ´iÞ'òÖöeŽÆF\ç«vç¯NµÒÑ@Ò\M‹ ®—7ö…ÚÁïбCÇ›ó08$s‚iž,4F ž!ÕÊ9•™¿|ýH'$t9îQÍnQ@b\ÿÈçmÿ`ÉÿôdU·XÒÿÈíiÿ`éÿôdTÏjšwü#Ö‹ûRðYFÒ¨•I@¨73Æ;Ö|çB:Ž´uhnLËå·ÎÇ‘6\ã묢ºUuÊI=|üÓìMŽAõ=b ±Mu½ÌQD)_v(¥Žß-™¾bGÊGJ¿u=Ó\_3Ϻ5 X#„ƤÍ’3Ÿ˜ãÓ?LtSxˆÝ5ý[ü¿°QEÊPQE çüyOÿ\ÛùU/ È«¤×”?ú«·Ÿñå?ýsoåT¼1ÿ"®‘ÿ^Pÿè€4袊(= P)mæYèÚd ¹íîZÕãn»zSìy#ñ•¡§ßO5Ũk¯6Yw}¢ßjÿ£ü¤ö /$ç5·Ef¡n§\ñJiÞ:»þ? ¢Š+C(¢ŠÆÖä=áÿúù—ÿDI[5¬ÿÈ{Ãÿõó/þˆ’¶h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¨o?ãÊúæßʦ¨o?ãÊúæßÊ€)xcþE]#þ¼¡ÿÐi×+áï 铸sLšE»ß%¤LÛo§Q’€œøAZ?ð‹i?ݽÿÀùÿøºÙ¢±¿áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâèfŠÆÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹  š+þm'û·¿ø?ÿGü"ÚO÷oð>þ.€Çý„môrÖÍrZþ§ÚÙÛù"ë÷×¶Ñ>ëÉŸå3&q–8>ãšÔÿ„[IþíïþÏÿÅÐÍÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@4V7ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]lÑXßð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñt³XÞ1ÿ‘CUÿ¯gþTÂ-¤ÿv÷ÿçÿâë/ÄÚŸeá­NæÜ]y‰m&7ÞLã•#î³zúPQ5´3É’¦æ·“̌䭴®}øb?ôûWówEŸ:d¸˜ó"mÚzöò׎œ}k?þm'û·¿ø?ÿGü"ÚO÷oð>þ.€-Ûi6·xa`Ë€È̱ç®Õ' øRO§Ú\<í(°¹£b^Wsû¶Üƒ$’# tüê·ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]YþÄÓ¾Ðf6嘻ɵ¤rœÄ);FwñÎi‰áý-7£»æ3ï&wÂѸœ ¨#1ÅCÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@—G±[yaòäa1Vwyœ•9S¼ÜÇòâæ@û°Û³ÈyÀÏJ‡þm'û·¿ø?ÿGü"ÚO÷oð>þ.€.&ÀÁ4g)­–ÕÕIÄ7¼>ûtçš±-¼SI’&æÌ‘œ‘µ¶•Ï¿ GãYð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtb]N—¬.¤—$Ç3¡mì] Œ‚Äœ9©%Òležš 4!vU®TFAÇj§ÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@`Ó`·¹@dAºW)æ1RÒXàœuú“êrÆÑìý¯Z3´‚V>cm.(b¹ÛÇU_øE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº}¦Œžf«-ìQ©6Ù6$yavžOÌN?½øÔÑèº|s¬Ë…•ƒ€Ó;)aüEIÁoöˆÎyÎj·ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]_»Óí¯$ŽIÕ÷Ä+$Œ‡R2ŽE‹§Çk-ªÀ|™m…«©‘Žb°¹ÎF7·¿>ªÿÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅЗÑ4é.~Ðоÿ5fÚ%pž` †ØÜäqÍ7QÑáÔu {‹†.eb;!%ÊîR0„c¾jøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº³.‰¦ÊášÜ€T¢HÊŒî†Pv¶=Á«pÛÅ “Émk‡HrNæÚ«ŸnGáYð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtº¾‡üRÃhòhäºg‘¹ º½2B…íÇ\ã%·myªË{v ŠðEŒ;(ùØîÁøpxâ¢ÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹  Ù?kûW’Þg™æíófÿïlÎÝÞøÍ-î•e {¨™›nöFMëýÖÁ‡±Èªð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtoûÀ]ý¤BÛ÷ù›|ÆÙ¿ûÛ3·w¾3Dz=„W‚é"q*ÈÒ®erªìb8ÜsÎsU?áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâèÙÒ4ók±·Ì1Zµ¢.öâ& õôE篱é6QÞ%ÚÆædƦvÛ³v Ám¼nëŽõOþm'û·¿ø?ÿGü"ÚO÷oð>þ.€.O§¤×¯+…h§·6ó£ä•ÿМÀª?ì=8FG(!Ìž`¸I¸€ ó7nèëÐJ¯ÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@àÓí-Þ‚†Ú(ðO ÅK}rTž3QÁ£Ø[Ío,0•{hVÿxØ …g›““ɪŸð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñtnM"ÆHÕ N»$yU£•Ñ•‹6H#$ž3Šdš™$qÆÖÄ"! #.å'%[æäá³ÔúÕøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøº·ýaö¿´ù-¿™·Ìm›ÿ½³;w{ã4¯¤ØH°«Û†Ü5ÌycòÈX±n¾¬N:~B©ÿÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅп싵ý«Éo3Ìóvù³÷¶gnï|f™‰aop—@ÂH™ž frˆH í\áAÉè*¿ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]\°ÓÒÖ³4ч,ÁˆVg;œíÎ[‘žŸ‰«µÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@4V7ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]lÑXßð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñt³EcÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐÍÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@4V7ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]lÑXßð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñt³EcÂ-¤ÿv÷ÿçÿâèÿ„[IþíïþÏÿÅÐÍÿ¶“ýÛßüŸÿ‹£þm'û·¿ø?ÿ@4V7ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]lÖ7‡ÿãó]ÿ°‰ÿÑ1Qÿ¶“ýÛßüŸÿ‹¬½#@Óî¯58]~æ÷ÊM·“'Ê!‹à ŸsÍu´V7ü"ÚO÷oð>þ.øE´ŸîÞÿà|ÿü]lÑXßð‹i?ݽÿÀùÿøº?áÒ»{ÿóÿñt³XÒÿÈíiÿ`éÿôdTÂ-¤ÿv÷ÿçÿâë.]Oÿ„¦ÒÏ^Oا—þ?&Ý»|CïnÝŒvÎ(­¢±¿áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâèfŠÆÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹  š+þm'û·¿ø?ÿGü"ÚO÷oð>þ.€6h¬oøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøºÓ¼ÿ)ÿë›*¥áùtúò‡ÿ@Z_ éBóF·{ãR˺úvŒ‚ø?CT|=á½2i“H·{ä´‰›môê2P€è(ª¢±¿áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâèfŠÆÿ„[IþíïþÏÿÅÑÿ¶“ýÛßüŸÿ‹  š+þm'û·¿ø?ÿGü"ÚO÷oð>þ.€6h¬oøE´ŸîÞÿà|ÿü]ð‹i?ݽÿÀùÿøºÙ¢±¿áÒ»{ÿóÿñtÂ-¤ÿv÷ÿçÿâèÖä=áÿúù—ÿDI[5ÌÜivšn½¡ýL<Ë™7y—KÒ qìq×µtÔQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQET7Ÿñå?ýsoåST7Ÿñå?ýsoå@¼1ÿ"®‘ÿ^Pÿè´ë3Ãò*éõåþ€+N€ (¢€ (¢€ (¢€1¼Qÿv?öµÿÑË[5âøó±ÿ°¯þŽZÙ Š( Š( Š( ±¼cÿ"†«ÿ^Ïü«f±¼cÿ"†«ÿ^Ïü¨ukVÞúÎ;K›%Šî$ m™Ù?v~æ1×Ú™·,W—6×–îë ÔVßh… .‘‘[<»ãŒàŸZÓº³ŽêkYdg k/œ›OìdçÛJ†M* >ѹäÿHºŠé°G—€8éû¥ÏÔþ_ŠˆÏreiÀyR(ÆA–Ó4Z_Æž]ÀþÊ,î®%R¿¼V…‘JõÆ~fÜjÝæ¯¥Ñµ1M,ødq™ ïÀ g±9ÀÀëQ`Y›q4Ì¿gžÝ‰a—2³±8ûÄ®xõ~îpXdŒã“RêzD”ÐË4³#DŒ£Ë g%[<ƒÈhÐŒwÇ%Ž ·rÍ [ÍoÎeÀù¸ŠO¹É÷ª×Z½Íä·?i¸¥–9X&ÌoŒ©S’¤ÿã8öæ€ÿ ¢³4Ð\Å’h¾Ðê» E¼°àç¤lsŒqëÅ>×V–çV†ÔØÏm–òMûõP[ €ck}ãyéÒ&‡g-²[Ëæ²[Ë‹¸d¸‚i$6‰—( gÌ|ƒw*ÈÒ—ÅîÞãíWe,Í´©cv±{`Пˆu)´ u7’é`÷^Wödñ¦à›€3maœtê:V×öÜhÙö{#Ïû?Úv¯—ænÛ·®ï½òçÏzi6ãÃÿØ¡åû?پ˻#~Ý»sœc8ö¨ÿ± ûFÿ´\yÚ>͹|¿3víÝ7}ï›Æ{PvñNž¹ Àal×vŒü¬T§_¿•<{jö§©E¦Á’Å#™¤¢!PKN2ÄÀ=OµS éï;LLÛšð]ãpÆáŸ—§Ý$’G©5Q±[ûq O, 6sÓžÁ #ž„z¢€ “X·Ž+©)×ì¶‹w"•ìmø'ï~ìð}©®Aü–­ms¶)ÒÝçÚ¾Z»ª•sÎõ:šŽ[K.®á‰­ÍÖ7_ž5ÎÜ’¤än<Œg<æ‘4C&©yusq/“-Üw 0ØÅ#Œ)n3ÈO ÐÚs47À4~|Š63E»x$ôF=:ߊskÐÅ Ä—V—vÆgº "®é#QóÃFG‘Uí<:Œ²ÿhÍ,ÈóÜȶû‡–¢W~GÎÇÇ\ š°Ú 2ÁqÕåÝÁšÙíCÈ˺8Ø|Áp dàrrxë Rk½V{G±šã·Žeiväîg€Ç ‘ß®qÅjU94ð÷ò^Gs`o'wNW+éÍuW3s¦<šhŠßCXa7bCjY ³‚nçv>\‘üXÍ3MФ‘ìbÕ,[ۥ└£/Ï*4cãîƒÛ¸ ’ââ+hÄ“¾Õ.‘ƒ‚~f`ª8õ$ –¹û>ò_YYKngºm<范,Qã.7g¹ÍSH]d—Hótÿ:V]7tgË ¨à¶Î«!Æxó8é@Ýý­’±¹” H^sÁ?"cqãÓpüêÍq×zëØ"ý‰eœé÷Öêw©0™1&âGEÊdg¯¡&·tý5l5{Ƕ·Hme‚»0HMÄ\É= Ô¨®."¶ŒI;íRé8'æf £R@®Z=ðXWLòîÖ ·7>z¯Ût,89;€n[nÀàš°º]ÁIÍ®ö+w¹³tµÜƒ\Á¤|)*2¸à¾¦€:{ˆ®c2@û”;ÆNù•аçЂ*Zãn4+Ù$sqk5Ä,ó˜âˆÀv3O#†>` nVNW‘Ž•n&âÄûNž×²†ƒÊ»y×0*ª†¸lä3p¸mØ8 Ž â¸Bð¸uÈHþò±VT•‡a§Ëk ê6ÙG¯-ÓF›‚¬»ÙŠ©È*;aY0hw~]ͺéÍ ¼ífv*1òO™8F?ÁŽrIÇ^‚€;*Ž â¸ŒÉ nPì„à™X«Ì\Ìš+Ã!þÊ[­1n’Í a~h¢± Ã,œ}ìÕ˜ôÛµðMöž¶Þ]̱],pù€ã{9A»8èÓøÐCEq÷þ”Þΰ[Nbb¿exãwÌê]NíÍ•ÎwzÕ‰4«ÆšèGc¶úG£ÔüÐ6«+lÇnTm#.zâ€:idX¢y\1TRÄ*–8€rO°§W…t,55‚ÎæŸO–‰daÇŸ÷˜ƒÏJ¹}£ê_ÝÃlDV®êw}Û†M€c®ËçÔŠéj¼7Ö³ÝÜZE0ií¶ù©‚ äd}x=«ÃÚT–wí9µ¹¶_'c¬6AÎ"_›?3óÓšš]2è]ßßÛ [¡sæA–š?*5d>€•=z kJ1•Ô»zÜLÙ¶ž+«h®`mñLѰFTŒƒƒíUîuK;RD²9a(‡lq<¿füaA?wšæ"Ðo¾ÍwNÒ‹x'áܬj¬70,¤0')œæ´&Ѥ—U‘…«Gê+pÓE Œ²}œ§U!²?÷×|šèöTçu®ÖÙ³o¨[ÜH‘§š²:³*Ë ÆHR œ0Þ_ÏëV«UÒ®à[%‘㎠¼ÉË3fXX¦æ$üÊŽ=@ÚmÒÃuqa§‹R¶Ö…eÐçå%Wr½{f£ØÓ’MJÞ¶îgKU[Q³Xnæi‚¥‘"rT˜PÇô ñëYZ‘saxËqóAmËg-’ÅðÒo˜QªiwSë ä 6W›>Úw·Ë;‡÷}Óì+°Œ%h»ëj׋f³©¸hÌ¢/â 1ɾðëH·ö­~Ö"_ô…RÅ6žƒnyÆ?‰1Uæ´sâ+KĈyikŸr¥š—ÀMËŽWo*=K£Øßÿj¥íçÚÕa¶hnd‰‰,ÊN<¾06O'>ÔÐQ\®«¥ÞË­½Ü:~æK‹y#™ {ŒjSxÜ͹N ª=Éɤ“@ºò–¬ò]Þ3\–9þY'®2Ñœv<ãƒ@;OÜ¥±lK"3ªàòªTŸ«/çU®5k+vd’I ¬Â±ÂîÛÊoÀ ?/5•¤iͳ ÄZ7ötIi$Rèw¹hÈ?)9û§æ<žý©nt›‹MÝã@ÚŠÎZ9¶6Ák³ ©|ÜzþµÂMó»$„ïÐÑ:Õ€…eó%;¥òB y ïÚ[iM»‡Ê3Ó¥;ûZÌ.X΄£ÈíäV*›w¥sÆáõÏNóDˆ›­£”F·†iÜ\8õN»‹îÜy*:ôö§Ïg5­ý¬öpKp–öÓ®}Ì]š2£sœó´ý1ô­9(;Y½oÛÌWeøïm¥!ŠPï$^jíŽz öõçÒ¤žx­ãLÛTº 8'æf £ó VF‡¦ÜéSɪIÈóZDÀòŸº×g?/§9ªi7 vKi^mÏöŠOöï1?Õ CäîùW¸ÇÖ5cÊÐwCGUQÛÏͼW8x¥@èÃø”ŒƒùW0šM×öüw/¦¨Cw)™×Ë"H™]FIbíÕIS€;T'Ð/ßEµ¶IUž4BŒ D¤ãvNKarpÁ”n9äŒVc;ª*(e’Bþe¼‘#ÊÙö'¡$~œÔ´QEQEQEQEQEQEQEQEQEV7‡ÿãó]ÿ°‰ÿÑ1VÍcxþ?5ßûŸýlÑEW·¾³º–H­®àšHŽc1O¨(Å_íÖfóìkƒí8Ï“æ ÿ÷ÏZ!¾³žâKx.à’hþüi ,¿P9b±¥ÿ‘ÚÓþÁÓÿèÈ«f±fãÆÖ™ÿ lÿú2*Ú¢›‰,I,N¯€ÊÊr„â«KªiÐÜ›ioícœ M2†Éäqœ÷ªQ“vH tQM’DCHꀠ±Ç$à©$ƤQEQE çüyOÿ\ÛùU/ È«¤×”?ú«·Ÿñå?ýsoåT¼1ÿ"®‘ÿ^Pÿè€4袊(¢˜ÒIJ¤M" ¨Xe€ëßXÑLIc‘c‘ÆÛ\+´ã8>‡SèØŠ( Š(  mgþCÞÿ¯™ôD•³XÚÏü‡¼?ÿ_2ÿè‰+f€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ †óþ<§ÿ®müªj†óþ<§ÿ®mü¨—†?äUÒ?ëÊýVfxcþE]#þ¼¡ÿÐiÐEPEPEP7Š?ãÎÇþÂ6¿ú9kÖ´½Eµ?ßÙ[ÌÎñ¤!6œOCµ¶ú•8I¦¢´ÿ4ÿOÅ‹”å5]&úÞo3ÞL/Ò@ßgD8ÉØ#“ëT-àÖî`1C.¯Ídÿj{†eq‚¾Yúƒ÷xÅwTTÇ%8¦Ã”ⴳ⠭bÙ®Öúk™>Öá·(„.õ@~C­v´QX×­íd’ôV ÆñüНý{?ò­šÆñüНý{?ò¬lÑXz÷Ú®u <·Ë$ò¨»{}Ê (ÐÕóŽûk2ÃR¿·´Hmc’k‹«‹‚I|ñDB0 î¥ÆážHûÇŽ1@yã r(®vßYÔ.¡UÝei$vßižiyĄ̂@WÆBÄî8àsQ[kº­ÍÌ- 5À·c¹päHU‹†ã @ØI߀žŠæb×n"[vò‘Ρ²Û&æ%ÛÌPƒ$œ ®¤ã‚zS£ÖµYo£Hí¡6ÿjû+1Ú¾aS‰s&F0Ä.ÒHy ’ŠæaÔ¯µ½ ¬ÐGmzMÀŠ=ÂE‰W#sg$®F3Ži5io&×¼ˆ®Þ8U …R2ÊK;“$6#CÔæÓÑ\äzÕü©isµh¯£’H¡ Ûã@…•™·`Œí``°æ¡°ñ-ÝýäpA ¸HšÁädù®yû£ißó@M«j“ÛÜ\ElöЋKQs4— XK ?¸Ù<ãŽk)µFÏJ‹Éhåž(£û@–6rf|/vå ÷†>ñäqêÖÑ\ÒêWëqy²â)k§KxÌ,Û#Œs€ÜüÜrTdç=YMVæ_ ÿh:Gö‰”¬arªÅŸbFr§ƒßƒÞ€7(¬=Véõ8 s ÚNî°|¬æTU$2Ê‚HÁ¿$ŽWQÖ/-n/žá{{O*=„òM'wd4g'Ôþ´W2ºÖ¬» šTîb‚&|–Ë8eY£#‘œŽ*X5{ù®M‚½§Ú<éT\ùm唌&âvIÜûq»øIíŠèh®j=rþ{q"HÖYn'•£fRªåQ”n0FnIíUcÖ5ËkAÃÄÖ©O$›TI+¨`™i¯ÞQœ6IéÆ(¯¢¹›ýJúè"[M0Ïö5Q¸LB¾ƒÇÝn1ÓœÕísUšÈ²Z¸|C©< °Á ‘!iæ›jùa7º¡ Ò.I;Ž8õ ªŠÊ»¿½L±d†ï®Þ(Ìnw"7?CÎ7åT#ÖµY/£Hí¡kµ}•œ…_0©ÄŒ¹“#bkd¼æ€:J+™ »ÖñͧØî-åºò‚·™(¹¶pIÊçŒãžµ%ö­x-'·SÜ­‚4†<ü“Êv ð3ž:ô ŠŠçfÕ·‚ÐÅ-±¹[\¼lYÈáÎòцèîòGkúUõÅÆœú…ã@°>é"XÔ‚#à±'’W€?ÀNŠà.|[­Ç¥Es2XÇö« ®”">è€ !9nû€úóíVeñ«§Y\[yö/6•k\És»uÄŒ¹  7\`gœ“Ò€;j+‰“ź™–æHb±Aw °¶}Æy‚ïQƒŒ‚O8ìk{TÔî-/a}žÖÑ®®K!fÚ ¸#…~Nz Ø¢¹W×õx ¹{«[hÊÛ‡Œ3( #°TlŒYI'æÂýß~-6¯¨E}%ƒ›IgibŠ)UQY•Ù•†ã’ª™àŒî( ¢¹èu]J{„²‰¬Úcs,f-¶4h€– »9Á~÷cYöúÞ«ƒÝ<öÒAóLÓ˜YÂ$ª2«îA³iΠӌƊ@AèAúRÐEPEPEPEPEPEPEPXÞÿÍwþÂ'ÿDÅ[5áÿøü×ì"ôLT³\Λ”ÕEÚÙÝÃom`Ñ´ nGÙØ;#Â3;IãwAƒÎ+¦¢€9)-®Úùm-DëöŠÝ0’Ì‚ðì|ìí Œ€1»ºU­ØÔ4»xÄÂÛOi7 lÌL«±”&H’AÊðq“Íu”PX—øÎÛô ŸÿFE[u/üŽÖŸöŸÿFE@  Þ¤Z¼^$ÖÖiæ+ZJ¼ª@%pO°ëÚ i’+jìnæ2«F‹jì² kØÚ9rxÅt4WG¶3•·óó¿aXäßXˆ,ÜÝ,ÑÅ@ÐÃ$ŠÄ"†$«„ÎýÙÞ:b´g†ðÜßN¯y‘}l‘(fÛåfä˜ûù?ï{ÖõOÛNßÖŸåø±r…Q\¥Q@ÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  »yÿSÿ×6þUKÃò*éõåþ€(NŠ( ³uøM.Yí•ݪ™íÊ.[zƒ€|ô#¸5¥ET$á%$;gqgoeoo$ëm‡k‰#ŽGwà‚Â6 ÉÞN8Î* Á¨¦™bKêJ«!Úˆñ³œŠ’TÓvT󻺚+¢8¦­u{Áÿ?ÈžP¢Š+” ¢Š(Yÿ÷‡ÿëæ_ý%lÖ6³ÿ!ïÿ×Ì¿ú"JÙ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¡¼ÿ)ÿë›*š¡¼ÿ)ÿë›*¥áùtúò‡ÿ@§Yžÿ‘WHÿ¯(ôZtQEQEQEâøó±ÿ°¯þŽZÙ¬oÇý„môrÖÍQEQEQEãù5_úöå[5ãù5_úöå@ÞT~w寛·nü|ØëŒúTé¶B°Ícm$JåÂ9 £ü&€/ϧØÜ¼oqgo+Eþ¬¼JÅ>™R­š]=ÒZ@·0ÒˆÀv穪²kúdpÇ+NådG‘BÂìv¡Éd`œûúrkzt‰+¬íˆ‚˜œ¥A6H8Ûœâ€--­²˜JÛÄ ºí‡?v1Œ/ ÇR%š]µÚZ@·/ÃL#ÛêÝj¯öÞŸå,žlŸ4¦žD›÷…Ý·f7´g§§¨¨$ñ&›ö)îa•¤ò­žåAÐ:¯\0NHuó@íôûiŒÖÖVðÊÙËÇ«àž@ïùTŸf·ó|ß"/3~ýûwmÛœúíã>œU8u« ’G‘£h¶ùˆÑ¸`[îà dä8⃮iÂ%s,Ÿ<¦žDžfð»¶ìÛ¸¼ôôõ  0XY[ÆñÕîìíçeA–%bê9)&Ó4ùæi§°µ’VxT±§$T+­iì„Ï´.ýÆ' Ë2§a’9ëR.«bò4kp ¤ÆOq;§¥iìª/²þá] ú^!Ì–¯ûÃ'Í ŸœõnN:Ô«il$ o„2FRA·<ýk>~Õ¤+(dQsy\©Þ~UPIdŸQÉãÜÔcN°Ç8²¶Ä¡cD»‘G@8\ëºpÍ&^SÈ“ÌÞq]›w·žžž´6¹§ x¦;¬¡Š¬p»¾á‰P G€,.Ÿb·Fél­ÅÁmÆQïÎ1œã9Á#ñ¢çO±»Iugo4Š»CI±Ó$tªW¾!Ó­ ’A#ÎRÜ\†'pP‚Tä;OZzëvª…ç&52¬*¡œÈS~Ý»sœzgðÆîA%Õ¼Ò*í $JÄL‘Ò«¶»¦‹xæóܬˆ –N•*à’(¿ÕRßEþÒµˆÝ  ƒ°Ê\€£‘ÆKÔbãN±ºŠ8®l­¦Ž/¸’D¬·Ž(“N°”Âd²¶#ˆ·D§ËÿwŽ? ¤ºôK ¶ovîN j»x#דÿ|šŠ fúòØÍc¦,žZ8=ÆÌ>ÐJ'Êwœdíüpv "Ê+§ºh#–ååiÒ"—R{Œ€¤þÌÓüó?Ø-|âûÌžJî-ëœg>õb'ó"G*ɹAÚÃ{zuV—N±š8c–ÊÙÒˆ•¢R#>QŽ:v¤nžªTXÛ1˜ˆ.6g;ztÏ8«TPVöÐZB!µ‚(b4 £ð5´ ³+AYÿÖ‚ƒpæõàÏaRÑ@ýŽ×i_³Cƒ‹ÜþïÓÛ¥%¥•¥Œf;+X-М•Š0€Ÿ ©è å·‚bLÐÇ!(ÑÊTã+ô8Ô«k!‘c@åB– 2Tg>ƒ'ó§Ñ@Çik†H­¡I 3T’ØÜsêp3ëQ¾›a'“æXÛ7ÙÆ!ÝŸ,³Ç…Z¢€ñÆìŒè¬ÑÈHÉS‚2=8$~5Z]6Õžy¡†(.æB¦æ8ÔH21œãœ{úUº('OС¶¸–âu¶’Yc10ŠØD…IËddäœ ’{*ä:m„ ² h—*v¤J£*r§Øò=*ÕWû3OóÌÿ`µó‹ï2y+¸·®qœûÔÂÞmöa b ž_•´mÛŒmÇLcŒT”PWÓtùl–6̾P‡ ‘åƒ>6™§¼ñÎö6­4@ä0©d jŠÌÓ4?N>bB’Ü™Cs")“.ÅÍŽœÖ‡“˜òyi½Ô+6Ñ–8÷ŸÌÓè  ù4]= Kxía†(•âŠ5Uކ9?*›û7Oû'ØþÃmölçÉò—f}vãjŠŠ;kx¼¿*“ËB‰µÚ§Ðp8ö]4m)$IL²Wî0A^üqWh EP†F‘†bì@Ë’O¹4ú( Š( Š( Š( Š( Š( Š( Š( ±¼?ÿšïý„Oþ‰Š¶kÃÿñù®ÿØDÿ蘨fŠ( Š( ±¥ÿ‘ÚÓþÁÓÿèÈ«f±¥ÿ‘ÚÓþÁÓÿèȨfŠ( Š( Š( Š( o?ãÊúæßÊ©xcþE]#þ¼¡ÿÐ]¼ÿ)ÿë›*¥áùtúò‡ÿ@§EPEPEPEPEP6³ÿ!ïÿ×Ì¿ú"JÙ¬mgþCÞÿ¯™ôD•³@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@CyÿSÿ×6þU5CyÿSÿ×6þTKÃò*éõåþ€+N¹_ZkÍáÍ1 Ö-#ˆÚDQÀ±Q°`æ ýqZ?bñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øí(ÿ;ûÚÿèå­šäµû]i,íþÓªÚ˺öÙcÛdScùɆ?9ÈœgÖµ>Åâ/úYà¸ÿñÚÙ¢±¾Åâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚÙ¢±¾Åâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚÙ¢±¾Åâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚÙ¬oÿÈ¡ªÿ׳ÿ*>Åâ/úYà¸ÿñÚËñ5®µ†µ7¼Õmg€[Iº4²1–ùN>mçãµtmg¿VŽù¤ÈމcÛÓs)'?ðY2øeZ(›m#C-ÃââÔKɼü»†àŸ^9©þÅâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚiðò i ŠqÉgöUÛ ®Ü–.Ø\ ¶G@1Š5­ì²Jeˆ±–7D–20¨…B²än;£JwؼEÿAË/üþ;GؼEÿAË/üþ;@ i¡-£ÀñI 4"VÄvë™h èäy›¾>e¥œ¨ûJnª¤c¨ÇPsêª?‡Ö[meºb©êì©‚Ï( ¸çƒó?¯Þ¥ûˆ¿è9eÿ‚ãÿÇhûˆ¿è9eÿ‚ãÿÇk&îîÆ?HÑSN™æe³óY`ÛY¬§¡$“ÆyÇŠŽë@b&š'^=ÖfƒÌ‹nY3È Àuê Òý‹Ä_ô²ÿÁqÿã´}‹Ä_ô²ÿÁqÿã´€«‰wmmö- XGiªˆÞG cb‘Œ*àôêMNš öÎZÇPòŒùS3ý˜ïw.§ +#„tãŠؼEÿAË/üþ;GؼEÿAË/üþ;@Ú­Õµ¼â1+B#Ýà‘Æ## í=ÇÞ©­ô*êÞ}æ9§œ˜ÜÒŽÿ¤¯¿µEö/ÐrËÿÇÿŽÑö/ÐrËÿÇÿŽÐEΟ}nn,ì´Kn-šVµ%$Éf2+ç óHù$à`t®ŽãNI£²‰d6²¬›6çpPBl©ý‹Ä_ô²ÿÁqÿã´}‹Ä_ô²ÿÁqÿã´ xeâh«vÂ+õ©³",YÔsÎâÍôϵLº5Ô~}¼—•e<Ï+"E‰WyÜÁdÝÀ$ŸáÈϱx‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€5cYVI È­#ËP¸*1ÎNyçéRV7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@5áÿøü×ì"ôLT}‹Ä_ô²ÿÁqÿãµ—¤ZëOy¬}›Uµ‹mîÙ7YÞþLYaóŒéÎ=h­¢±¾Åâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚÙ¢±¾Åâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚÙ¬iäv´ÿ°tÿú2*>Åâ/úYà¸ÿñÚË–×Zÿ„¦Ò?í[_´ýŠvó¾ÄvìßË·\óœþÖÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øílÑXßbñý,¿ð\øíbñý,¿ð\øíiÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  ­-¦¼°»O¬ZIR]À©aÜæ}qT|=i¯7‡4ƃX´Ž#iDkÅFÁ€O˜3õÅuTV7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@4V7ؼEÿAË/üþ;GؼEÿAË/üþ;@³ÿ!ïÿ×Ì¿ú"JÙ®fâ F{CþѾ†ë72lòíü­¿¸—9ù›=½:WM@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@CyÿSÿ×6þU5CyÿSÿ×6þTKÃò*éõåþ€+N³<1ÿ"®‘ÿ^Pÿè´è¢Š(¢Š(¢Š(Åñçcÿa_ýµ³XÞ(ÿ;ûÚÿèå­š(¢Š(¢Š(¢Š+Æ?ò(j¿õìÿʶkÆ?ò(j¿õìÿÊ€&Ô5w±»†¦^ÍçÉåÄñ¶»m-™Á+u¥>ßX²–éí$‘mîRA“3 vbŠøž;ƒõ§êr]]iÒÆÊÖäÌû$yR'ùqúÕ9ô‰d{çSkBÞåIÎBGää:þí±õ¦€/NÍ"Y..a€4¯ù² ÜÊÅHã¨é×Ô‘RÜÝÛYÆ$»¸Š'¥p œŒŸ`OáXzóÚª[µ°˜Kt|ÆvVYKŽ6ãʑɎnëñ\É>maIdŽô¾$$(y$ŽqƒŽ¤PÇÔíhʾ\¶ò\ ·,"É-ŸöÁôÀ54×vÖâCqq B5 åÜ.ÐIœôƒùÁo\½‡ÙÚXUžÊöÛœ#ÎêÃhÇÝ\Û·‘êV÷ÑÝ.­|,ã1¼c;G•óAÞÛ~QûÐCc‚Ö€7“Q´˜Ãöiâe“Ë ª@m…ýyàg'qŒ¶Ú…ã”´¼·•CŠUbèx=+Fµžòåï€c«\æ2J:ý›ËÊœ ß1ëÆpM^ÒtylÃþ…§µ´»3ó9òŽGŒ£uõ~MFÒ;\Ï ‚6yeP¹*wã†l`™ÚhV%•¥A ņ bàû’õÍbÞéRµÜù-$—«sehÊÇ÷€89±wâÍΟu&ƒoh\Àmß8Ù4nŒFùAÛŽé@g¾³¶ä¸»‚$‚;½¤Üê76Ò[´!cÕ„¤ò|Ȥr ‹iéÃwé@–·v·‘y¶w0ÜF7DáÆ}2)¢þÉ¥š%¼·2@3* c¬3ÇãU´ëK¤¿»¾¼X#’ácO*. &îK2NïN€VMLJ¯g’ñÁ3:*ÈçsVOL ;Hm¬rNp1Š×›\Ò᳟n·x ©™ªÀ30œãŒäúM\[ˆnÙ£;Ý£\0ù™s•ãkd{JÁ%ßÙîdXàK™f¶+]Ë(")áÆyäp¼{ÔÖÚf¡ݺ¿Ù¾Ëo{=Ð`ì]„žip0dÇSœvé@–·öW¥…ݽÁ@ ¤€zgŸssoi šîx ˆ•¯ækšðõŽ£o¥ØÞIon’[i~TP«0i‚·Ïòü¤Çå˜ûVίkuyomöo(I¢FWm¼m# Û[iÉÓ#ŒÐï©éè»ßZªOþ©ŒÊŸîóÏáP®µ`×3@³¦è&òe&E–dÉÉé€GäÀ‘i¡jv‰8 a9¸I"a;»*«K$€ò¿7úÌ8ÎÑÍ^þɹmY§ Û›ás÷Žâ¿e0•Æ1ׯB}9Ô’òÖ%--Ì(y„´€a?½ô÷ªí­i Ú½‚Aw)†&I`¤õ϶>¤õ—y™u š .Ç ã AŠI ÜààyÅA/‡µàž7’3]´Å¼÷vUkc ä¯$gpèN(¢µ¾³¼.-.àœÇȤ ·ëŽ”=ý”wki%åºÜ·Ý…¥Pçè¹ÍfiLö·Âææ(‘’%JÝM1 OßáGÊ8Áúúéhú…Ρ,Л)®`s!ýYBC§q;N“ŒŽ(a5 .M´w–ï8ÎbYT°ÁÁã9à‚ E¯auz¶¶—1\;#¹1:¸]¥AƒóÈÖ]LJ¦ŸO[o6(ØÝÝÌò.rU˜.8凘Ÿ‘ç¥Y±±¾¬wpÙBÚ½¸îÌ[,„T`|§ŽÙêsÀ»­^ÂÖaÜÄ×ãO!dS ÞÁAÛœã,Ò¦ŠþÎk—¶†îÞIãûñ$€²ýFr+ô{ü›t[6·þÐ[Ï9™¼Ïõ¡ÊíÛŒz0)ºN=•ÅŸž#t² ²Su3³’¥s埕 Ï_lPÌZžŸ1”E}jæL¡fSå×w<~5k:hk@·H/%0ÂÉ"°fž¹öÇÔÞ°?áÕÈóÓ0ÂcâFØÄIƒRcÁ³u8­_°_Iqku$VQËïŸ"DÍ‚†Œå¶üÍóg8{Ðø5Y­ÏŸ&Äv̪vnŒHî:Ù£ûJÃí[ýºÛÎŒxüÕÜ rIȬko\Eý”,>LðÇx€ŸÞ4#1•ã¦âIÎ8œš> º¼,mÌPÞI?Ë!\««¯Ü ÃxÉ$“ƒÈÍhÚëš]Õ½¬É}n¿k@ð£Ê¡›=±ž¹ã¢­ÜÝ[Ú {«ˆ BpG Á8çØøW)oákÔ²û,âÞU–¢ý²eTŠœ"à8!wsŒFOZèõ &»¹Ó¤6ZÜ™œ7qåH£ù` iÖtÑsl€™áyãa"í(¸ÉÎ}ÿCéR¦¥a%«]G}löêÁL«*”œc9ÆrGçXW>¼‘aXÞÛ %ËÌq‡¸Yc+:œgš®Ÿ%µÝÔ°Ûý¢æ{%FÍ"“©ÜÇh'ïñÀQ@gS´+m$2,ðÜ;"ÍE³[<”®*{k«kȼëKˆ§8߆úŠÍƒLœéÚ¤wKmæê ìbš%ÊÁ<ÜžMM¢Z]YÛL·y%Þ¡_yUÚ åT±ã©Æ8 çZ²†Î[˜$[Ï*T‰’ÙÑ›{¸@9 Xu"•5CæÁÍ…Õ«\KåGæ˜ÎNÆ|ü®p0‡ñ"±âðíÛi³Y\ O%žØ$[‹®Èä Ã,¹ÚGà=y«šŸ‡ žÒ]:+{(Ä’4žTa>ôGäåÇà(J-OO῵‘c!\¤ÊB’pÁà“ÅH.íY¶­Ì%¼Ï+Æwã;~¸çqXÒh×wÞgÛÖßOk·bÙ,T†9Q¥F8Éæ£Òf\åG¸ÚÙÇÒ²µ2êãY‚îÛÈDP•™Žâ¨å±³[¯å*I9=)–Úf¡ݺ¿Ù¾Ëo{=Ð`ì]„žip0dÇSœvé@Pêz|ñË$ö²$+¾FI”„\g$ƒÀÇ9¡u+·’áo­Œ¯ •v¡ô'8ÉA¥ßÿÂež£hô)-ãŠ-ÆI  ?20A\cžI­Fѵ»ì¶I™ÄÌ‹F¸iุá¿´òX”’©û–Œ$ œíl9É«š]µåš¼2,¸¸—zÈKaä.¼mÿiç°ëž4h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Ãÿñù®ÿØDÿ蘫f±¼?ÿšïý„Oþ‰Š€6h¢Š(¢Š+_ù­?ì?þŒŠ¶k_ù­?ì?þŒŠ€6h¢Š(¢Š(¢Š(¢Š†óþ<§ÿ®müª—†?äUÒ?ëÊýUÛÏøòŸþ¹·òª^ÿ‘WHÿ¯(ô@tQEQEQEQEQEck?òðÿý|Ëÿ¢$­šÆÖä=áÿúù—ÿDI[4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQET7Ÿñå?ýsoåST7Ÿñå?ýsoå@¼1ÿ"®‘ÿ^Pÿè´ë3Ãò*éõåþ€+N€ (¢€ (¢€ (¢€1¼Qÿv?öµÿÑË[5âøó±ÿ°¯þŽZÙ Š( Š( Š( ±¼cÿ"†«ÿ^Ïü«f±¼cÿ"†«ÿ^Ïü¨fŠä|I¨jÐê÷ñXjÚ+M$Þ…£îpÏÆXt!@¬„Õµ kfæ;ÇYfk7rÈA¢î.9 œ<žhÑh®ãÄZ’Z)UÝký©ºj?g_ÞDcfn1ƒ´Ž v­}?WÔ%ð”·¯/˜ëpcK¯+áóùÛzp¤·§ÔQ\ÍΨÑé¡ ÖšhÚìD·b8‡7\/xöqžišmþ¡©½ºêF"ÉyæÉFÌÆ9Qªãî¶z ç ãMÍj7’\ø"ÂúyDRÊl¥yä)2ÄIÇ·¥A­;:Ç6¯åiþtªš–ØÇ˜Pªä®Î­ Î9òø ²Šáµk›‹8OutêdÒuUÚª³í+µ°FrËóàzqÆsÒéïu¯yeqv÷+̬èªT»H@ãäÎO=hRŠäcÖnÍu?2í¢ smä+}Œ—@Ç‘´á³»nzOšñî š$¾þеŠòÄÇs„åÂîL  q…<âÅutWý¥{mæAä6P ®¤Y%‘SÌ´Ê Ѿpð0~jЇT»{ÄKíEm.@Õ!\U.À0ßņF6íÉh§¢¹ý*w·ðî¥/Úäš[{‹ÂIEvB$rÑŒœa±ïØc°kWÏÌêK+î³ò¥&)ó'ØÿqBž1Ç8ÏZ쨮VMFî ù,¯5f·µŠáÐÞºFýTN¨I]ƒ>cóáÇZ–Òîk_ÞÁ6éâ[ÉR]˜Ë $!¶Ÿ~q@-Çßê:½¥ìößÚP,°•òvU7;€9Ø"bÃ$¯ÊAyç“bMZífºd½Ý{Ω¦yA·*+l< Ãvî'61’(¨¢¸Ã©ßM¥êůí/"]6YVYv>Þ%P:å['­^¾ÔõHoîìm³,ð‡»O|ðìùS§S'Ëë€h¥¢¹Ïj—Wì’j×y;ÛË9ò02± ^3ò±-ÇÖ§û|ãÅck¬ÆÍ…N—»,Ü9þ JôÍiN›íÑ\MØÜ¢¸›=-aðD—–Òœ†ŽÏd¹1w}Ç=óÀÍji\}»oÛÒ~Ùäýƒbÿªßý7}ߟ9ÇjÞx]_$¯k­»^‚æ:*+“XÕ’g„JIV6¼±ÿ Ĭ:l qÓæ­}nñí®lá’ÿ첇2]a8a·jeQœ±äeV„©Zïq§sbŠãaÔ&‡J²Xõ„Ï=ÛBÆ‚B&ld¸!sœí Iç¦)ê³2K¨> ÑÍ>•g&ÔT!Y¤urÆ6“É' »œàˆÎÖŠÂðþ­ö…¹Šîö9].„0±t%Á\r ü}ðž¸ÍW¾†äxªîúÇsÜZÙ[Ÿ'¾˜ÓQ\¦±%Ü?i¶¸Õ%òá{ üⱩM÷[øq´lŸÄ‘Ré:¥ÍÅÝ€kÿ>{ßl³Ø£ì˜R{ à üÄç9 šŠå<7­Ëq¼×ZšÝDÚÚnÙ•[8ÛÁÚ?ÝÏCR Zᯀ†nM÷’4ý‰þ§~7ôÝ÷>}ÙÇjéè®Qu Ï5^÷WkKI®n“ÎÙˆ¼©J¢e”Œ°Ï'?pÎIo§¸ð&¥w4Ë<«àÑ.#H«•#ÂŽúÐIE`hÜ/‹~Ä×™‰› *£ÊÝ–ô`Jô\U¼U«]XO0µ½0¼6†dˆˆÂÈÙn2À³}ߺ c¹äPQEeêÓÎϦEeva[»’,j¬Jy2?TsX_ÚÚ¼:mк7^éßiehÕV¾Xm\à,¬Nw}߀;+“‡RÔZÆä¦¥ëö›X£¸…–R¾dª®7ÕtŒóÚ¬X]j"kŸP’tžþâÑ£hбùÛ[…wî†yÇ'Šé(®IÕ¯mô D°¼4èšE( Z6èת®~ã;s“òg¡ÅhE©jMarbÔ­çÿHµŠ+ˆ™fÛæJªà‘!àŽƒ#<ö ²ŠÅÕ®¤³–ÆÞmI­-Ýͼa%Ô.Õ%—h-–=?‡JÁ§¿Öt{›©Y™m®Ù~EÀ’4Y0FAe`x#¯¡ €tôW!*K'ˆd/åY?¶Ljl˜ä wäs‘òúç1ͬêkˆ¤Ô!¶Hüå[‰]"3²M"c˜Ø ›`Ίʻº»Ã‰rÓEÉŽ3#à…RJîÆàqÔà°ã©èkãmfçH.mç& £ºòÙeF3µX ú0àŽqÍtR¡Î¹›²×ðWv:Ú+—¸fÓ56†)!´ˆÁmÓCD…w\ÁNB‚ÀsÔMªßEdg‚ãí}¡í¡›bþ÷r-øâO—Ž WÕ$ߺ÷þ¿®¢æ:Š+Ã÷w—†àÝHH¶"Ù¾P7J¹ÞÿŽWÛŠÏVº6FeÔwÜ´a®-ü~ÈK¨cÀÈÚ pÙÎ3ØÒXi¹8ßk~#æ:š+›mFäÁr¶zÚcY­R;½¨ÜÉ(W_”8vþ*//¯-­î£mCo‘z"ó¤ŒÈaWÆJì-Ô€êE 6íuøùyy‹˜é(®Z]^ëÉ’_·4W mkjÑ*›¢Q[• œ–%p§ŒSõYn¤:ƒÉ¨I½­ý´jª¨©01bH=7éë‘Ma%t›ß×ËËÌ9ŽšŠçí5?³\B.fŽy$¾åU ëpŽÞÆïsÉäÕ_íJhm¤K挛[`#B¦‘‘‰ÈôÁÀÇ"…„›{ÿW°sUcxþ?5ßûŸýM§]´s][^]ùØ‚*³æ$“ 庂¡ðÿü~k¿ö?ú&*çœy]Š6h¢Š (¢€ Æ—þGkOûOÿ£"­šÆ—þGkOûOÿ£"  š(¢€ (¢€ (¢€ (¢€!¼ÿ)ÿë›*¥áùtúò‡ÿ@vóþ<§ÿ®müª—†?äUÒ?ëÊýPQ@Q@Q@Q@Q@ÚÏü‡¼?ÿ_2ÿè‰+f±µŸùxþ¾eÿÑVÍQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE çüyOÿ\ÛùTÕ çüyOÿ\ÛùP/ È«¤×”?ú­:ÌðÇüŠºGýyCÿ  Ó Š( Š( Š(  oÇý„môrÕ)|A}ˆ¤‰j–­r°+`±lÿ´¤ílÿ Qõ«¾(ÿ;ûÚÿèå­adnÅÙ³·7#¤Æ%ßÿ}c5µÂ7çWÐM3”ÑbÔou›Ù®ä·‡R•ÿhºª*· åc{fªé^%ÔcÐÁ[1³³µÛ±’ã%¸SŸldç’+¹†`ßäE~c—}Šæ=IÇR}j¥éÅbS§Ú‘ú a_Ý÷ùxã𮿮S“|ðÓK|¯ù“ÊÎfãÅ×vצ­âTŽU’c´å-Ø&Öë÷²ø=¸´¥EfZk1\Þ›HášBŽÑ<Ê`uÎr7QFHÇNy^kv¶WÍÂ;h–I¦l@ÙÀ99$ã ¨  :+ØÏ­S;Ç$Qùq˜ä,d$. ±^Ç<äS®»ƒÙÝ¡)ˆÚá<Ì… NwmÆÖSØäwâ€5h¬âbòm.¥wI‘B¶6âXÎ{œàÕñœ¾¡E;B²ÍxÁˆ7#‚Ùn9Âäûv –ŠÅÔ5Óèìíe•Œël³P°?0cŒò@ÆF3Wu=I4äVx&—vOÈT\³²ôÎM]¢² ñ ­ÍÄq[[Ü˼FÌT(òÀÃ*[wF ?Vµ=I4äVx&—vOÈT\³²ôÎM]¢³®5›X4Û[æY ]ìòS…f,»€;ˆ€z‘U®üMeg?hŽXæ•YÄñ£ªƒŒ’ÌóÓç¶hjŠÅ“Ķ‹ÏµÜÐGoÌ’¢.ØÑÁ œrɃSÝëPZ_Çi%¼ç|‰m ¹±Ž #‘’ð4§Ee.¹Ú½ÊY]´BS6 , ¶ùz¶#¿Q¼Qè&ò$K6‚Y¦•Êþïkl†ç-ÇÏÏ8è(¬Ý#[µÕÞt¶ ¥Átq†ÎQ˜ ã9ª'Z¾ƒ^K;¸`¥¶<‰œ¡wqyÇ!9÷u ‚Šæåñ$ÐÁk9†7É9TPrÑ«lõfhùéóV¥±ÕÖê?¶}à‘Ná²´G·$ã·E  +8^\Eç–—w'÷¡r®³ŒgžHãѺn·£,(–·P‹ˆ ÄM*¨€¨= #ï gµiÑXk×Ku,1X»bùmcû¤È6or>o@y8Œ÷Óx«O‚žE‘e—yò]ãF]ŒU²YÂõpN{PíBmZÞ=.ßPD–Xî|¿)~vÞFÞ=r~†©éâý,Ø8•¥XXoŒ”‘°6•ݸà P@õàн¥´VvpÚÛ©X c@Np `sô-d¯ˆ-šx—ì÷"·ùwWË`€–=sŽ:‘Ϥº×"ŠÁæŽ<ß±µGŽ›U°z’qÇ¡æ€/^Y‹£-ÄðI;^&ç¨ ‚â)ÖV‘YZ¥¼¶)',rX’I$ú’IüjŒúÔv—pÚ\Á1‘Þ8ÚD {c·“ÔŽý YÓõÔI"‚hâGdY$ ›X©+ƒœqÔÔPÊ+–Y}Œ\Gc|Kyg…¤EUG×wÐþ>¼T«âĆÅ$»°»k˜í–{¸íÑX[©ËÞ€98ì(¤¢¹é|a§Ç, [ÞI/Ir‘ƒ™+“œÿÏ­;ÍR;¸íž)]š6•™v퉀Y‰#Ÿ~†€/QXø»L™'xĬ!€Î”s"‚XIa€Ø<ýj×öì*ÒÅ-­ÔW” *—“~í»pÄsµº‘Œâ€5h¬ŸíèŽØÅ•Ù¹iÌÜÞ¬'vÜm#œ÷R×ÅMË&Ÿsæ–vHã1–1†*þbvž'ŽœŒ€t4QEQEQEQEQEQEQEQEáÿøü×ì"ôLU³XÞÿÍwþÂ'ÿDÅ@òFÇxLóƒÞ°´(æûH¹Ž{¹,M¾[© ûD™HªIظÝèFkyÕ]C+ # J£‹¤[yŸgÒìbóPÇ&Ët]èz©ÀäJÁšæò õ‰emIa¥Ð0ùeðSËÝ÷‚~\äš4»‹Èõ-d7IrÒ ™Ð–€F;£PÇhÜt\g×J¶Iuö´´·[ŒcÍ€øéŒã4°ØÙÛÏ$ööE4¿ë$H³ýHë@Ö%Ç3¶ÇýgÿÑ‘VÝbÍÏ­3ÿ@ÙÿôdToA•äðö4Ò3»ZDÎîrI( $ÖsÄ“ÜëSÏ{uÙå7[—Uˆy1·ÝÎÓÉ'‘Þ´âÒ4¸wù:mœ{УlFå=Aã})ÒiZl·h“O´y¸>cB¥¸ã<+¥U„g)+ëþi÷&Æ뺫[™Ò<ÛÅNjîfEb74‹´|Øû§jåÍýážì~ä[ÛÞÛÛ¨ƒ±v„’HaÀÞxïߌƒ«-•¤Ó¤óZÁ$ÑýÉ0Y~‡¨§›xìÃÞâFÊ™†0ÇÜm\aéMÖ§tÔ­?àýáfIEW)AEP7Ÿñå?ýsoåT¼1ÿ"®‘ÿ^Pÿè®ÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  Ó¢Š( ô4Q@͵åÔVŸÌò;\gŠbÇ.ÓzëÉúƒìkFÏP¹•¬¤—È1^çj"ÑáKrsÏL ­oŽ8Ì1”ˆƒíB:`vÇjHím¢™¦ŠÞ$•þóªÍõ5š‹]N¹×§4ýÝ]ÿ¯×þ–Š(­@¢Š(Yÿ÷‡ÿëæ_ý%lÖ6³ÿ!ïÿ×Ì¿ú"JÙ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¡¼ÿ)ÿë›*š¡¼ÿ)ÿë›*¥áùtúò‡ÿ@§Yžÿ‘WHÿ¯(ôZtQEQEQEâøó±ÿ°¯þŽZÙ¬oÇý„môrÖÍQEQEQEãù5_úöå[5ãù5_úöå@&Ò3¨­ég2,F%ù@$øð?*¤4(PDmîî –7™„¨P±¾÷S•#Çlð9«wÚ…µ‚ÄnL™•ö"ÇÈÌpO  ž€š[ûkô‘­™Ï”ûd£el‚¬zw  ’葼⽽€˜V reE$Œ³só7 ƒÏZ}¶´ûâ»»ù*Á¼lÙ$ôÜy$à’2zV–º ˜:nL¬4ä),0ÿw—ã“”VíÈÍI’–÷FX£+Ì-÷v$±àdòIÁ$dôéZÉæŽÞ '™‚Ç—v=€&€3l4(,f¶‘n®¥[Hš(#‘—ljqÀ‚p’N ©ŸJ·{ïµ³Ê_ÎY±‘Œ„(Nœ“õüªò0tW\ía‘‘ŠZʴЭíV$3ÜM˜ ŽV]°©ÀÀ㌜œ}M7Oð原=¬Ð™í¡1'˜Àä’IsÇÞù˜gКÓyâI㜠$¢úŒÿ1ùÔ”™¨è±ßË4Ÿkº·3Áöy|†Q½ìuS‚77#j ÚÏ,®..#YLd¢lÀؤãågxäÖÍþ¥YÕʲÍ,£ý[d °åOqÁê2FqSǤA“›æLÐÂÈÁ˜ÍµÃN9ÉúеÌ2Éå£3fý¬¥H#$ê :IâŽh¢vÃÌHA‚s“úSåwµ€Ï¶Ðâ†ò ©nî®d·Ï”f(Jä÷‚†n 1?K>‘o:]«¼ ÝJ’—R2Œvíã±@yÏ9«sÏ´FYÜ"O©8©\Epe¾ã˜ß‚0À~¢WZ,ÓKj?´.ˆŽc;Îξfð»WnÐ9Ln9à¹#ž'c¬Œ®ŠèÁ•†A ŠZÊmÜÃcO:}Š3±‹KnR3ÇPäúÔIá»T€D.nˆXR K.FÉ ŠùÛ÷ƒ¡î mQ@ìíMª8k‰îÛs<Ì éŽÇ@W¸Ò-®c¿IZSöâ ° Ú .Þ8Áy­ (!¼;böñ@Í6È­–Ú<0°`ÀãïeTçØqVm4Õ·¹73\Ïwq³bË9\ªç$ ’xÉÀô«ÔP;Í:+ÉD’I*°‚HWañ–uxúštÁr³Ç»)À«žA'sÇä*ÕŸo¤Aor³‰fr²Ë*«•ÀiOAž9ÇÔûbÐ!Œ ‚òò!ÈcuUŸ˜íàå˜åpy5¯EW¸³Žáí™Ëÿ£Iæ(‚v•ç×ïgêSþÊkfškK‹†;¤š;W,^kdœ7`’N g§JÔ¢€9› Iut.᳎Íí!†YQ™àÀ $“ÉÍh.ƒdiî®§y|Í!O»nU(yãšÖ¢€2‡íÖì\ «œ‹“räÆãž Û’9àqÆ1W!Óâ‡I]69$¬>H|øÆ7gÏ~jÝÏÜøCN¹´ŠÙå¹Xâ²ûmuL©-Óï£'§µ>çÂÖw73Ë%Õè[¥E¹‰$ “ì¸ÏN­Ú(—Ó<&ªd—RžV2]µËZÇ'î Ýòdc'/Ç+rãL·¹’éçÞâêÜ[:瀟6qܸçè*å‰y¡Í= ·þк›Ì’?2I\TC»å  g sŒžæ¦m &ÄytnÄ¢Qu”ó T mÛ¬Ã{“ךբ€3ít‹{kˆ§W•åA&YØìårÇŽ¿(qФJÑþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.¹›mÝ”VðæŽöw¯tðÝ@|Ÿ,‰ÞÒA%¼µùˆÀÃ1'“À¨/t[™ažà[¹¸¹½fœDÑù­Êª©—ld©àŒƒÍhkjßô,ÞÿàDü]ÚÚ·ý 7¿øÿH DÓL6vo¦Ëu´·rÚ—‹äȧjc‰QÜžµ:è÷pÅ:Z_ a ;×Ê·‘Ø‚Ž( €H p9­?í]W9ÿ„fó>¿h·ÿâéµµoúoð"þ.€2î|=4–ksj/gXííbg*YãP»Ün8 wIÔƒÅZ‹Dyf‚;›D[o¶Mq$y]¸Uòâ\ ¦:qƒV¿µµoúoð"þ.ím[þ…›ßüƒÿ‹ vâµÓåŽ{¹[”ŠÜH›m®$f}¥s×R ã®’ëMìÝ7N…7Á °‰I#„Œnzå•GãUšêñ®–é¼!9¸Q)–Ûx]ù©ÿµµoúoð"þ.€2ƪE¥m`DZ´ÓÜ8Ï–ìKwãhÚ9ë²®YA©iñ]Ù[iÊÍ,îñÜ»©‹a?.áäªáqŽvŽEXþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€5!-¹ãò iŒ8Ç`tç*ZÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6kÃÿñù®ÿØDÿ蘨þÖÕ¿èY½ÿÀˆ?øºËÒ5B+ÍcÉÐî§ß{½öÍòØÃPå†HõôÖÑXßÚÚ·ý 7¿øÿGö¶­ÿBÍïþAÿÅÐÍý­«г{ÿñtkjßô,ÞÿàDü]lÖ4¿ò;ZØ:ýÚÚ·ý 7¿øÿYrê:‡ü%6“ÿaÝyßb>ÏçC»nøŽüîÛŒñŒçÚ€:Ú+û[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øºÙ¢±¿µµoúoð"þ.ím[þ…›ßüƒÿ‹  š+û[Vÿ¡f÷ÿ ÿâèþÖÕ¿èY½ÿÀˆ?øºÙ¢±¿µµoúoð"þ.ím[þ…›ßüƒÿ‹  ;ÏøòŸþ¹·òª^ÿ‘WHÿ¯(ôU¥Ôõ9!t“Ã×q#) #O;’çj£áíOSÚbGáë¹Qm" "Ï6  çŸzꨬoím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèfŠÆþÖÕ¿èY½ÿÀˆ?øº?µµoúoð"þ.€6h¬oím[þ…›ßüƒÿ‹£û[Vÿ¡f÷ÿ ÿâèÖä=áÿúù—ÿDI[5ÌÜ]ÝÝkÚÚôɬ¶ÜÉ·Ì’7ߘ%Î61Æ=ýk¦ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¡¼ÿ)ÿë›*š¡¼ÿ)ÿë›*¥áùtúò‡ÿ@§Yžÿ‘WHÿ¯(ôZtQEQEQEâøó±ÿ°¯þŽZÙ¬oÇý„môrÖlÿÚð—©_íOì¯57ã~ß7iÆ;ù}3ü9­¨Òö—ÖÖWv:ºcMM/*,²Q ÍŽ¸ñ‘\tVz¬ú ®uhàšþé$Û#ª¬@ÝèPO½.›¢O7'PŽÎè3ºÊÄ(³Ñˆg©®•‚Òç_Òä.c¸ó¡ûA·óSÎ ¼Ç¸nÛœgqžôúóé`Ô<ûë:-k"ÊpJH˜3ª“Éã<{œqŠ»pú®¡©HÑ VÞÖ]B܇Œ¬^Sú.ìgßé¼ ÝKúÓüÿs¥Èh0êðÞiR\˨¸™nVåg,UB¶#È= úš¯àɵ+‰tùš]FXšÞCt÷,Z2w|› ï×8üj%ƒ²“RZÁÿ/ŘíëÆ?ò(j¿õìÿʶkÆ?ò(j¿õìÿʸŠ/]êºm”ÂÝBÒÞV‚K2£Ó8'§­+PÊAR2<ø¸[/ÝK=½ÛÅ-”(­¬’«òäeT€~a×Ö«ißkÒ×Mó­î„a‰ü²Ò£D¬ a7.O‘žh¦¢¸ÿ³ê“AjÒI©#­¦œ§kºüÍ+ ‰Ø'\ôàúT—¾}¤Ém$º—Ù«±vI+Hñ}”±ÜË¿wLô8é@eÈ^j &ÅÏö“:ùûcO0;ÿºÞËʾÜ}ðW9ÝÚ·5ˆg¸›MŠ'¸Hšèùæe;<©$t¶þ8ïŠÒ.¡ÂÈ$.y c'õ-qwVÚŠÉi*.¢ÒÆ.á¦BÂ1r˜öÉ„6Òz½N*kÉn!ÓïZÕõ4²3Ú,FS ›q˜ ïùðT¨ç¹8 º›‘ÍK ¬‘º†WSÀô ÷› yÞEÎÿ´ýŸíìßiÝæy{W®ÿ›ïoÆyÆ+[ê²éJòjKq‰Īò)k²Èy² ç¨Èé@‚º±`¬ C†ô8ÎàGçK\må½ìZÕÿ–o¢µ–çÌ‘Ò9äÝû˜‚cË`q‘ ;OPF1 {ùnt•»žøÇÉ!;¢ÜÂHü°à1þðNN{Šè©²IJWTRÁAc’@êIêk–±‡R¶Óìä'R–i´‰á^V-çÐ7d#òã§nAÅA_8–—ÒBe°’?5&lp œÉÏ)=9ÇS@‰u°ÞA!sÉ?¨üé$’8”4®¨¥‚‚Ç$à©$ưõ¸eÄPÅxî¶HžC0ùÿvTwPH ‚é±/žÒîš”–²’?’vpDÿ¼Údù²SÛÔ¦€;W’4dWuV‘¶ 'Ž Àõ8þ\”±êokX¥Ûï¦k3rº¯Ùd _ y„»±kÃÉx/Ùžâõáòx³ÛʃÌÈÆ ŽÇ8ÏÝyúPGH޲"¼leYNA¢¹÷[¦ñS#}½íä$8ÓÊìGÈF>‚²ì,µì7HN¥–ú$iEäOô³+pq’Üv)Ã@­!u°ÞA!sÉ?¨ü뙽º»»¿ibSM; vÅ,nW÷Û¶ŒÎï,slU{ëk—X¦´MWÍþξŠÝ¤gÞ®J˜Ãc¦@8ÝÏ Ÿ˜ ëè®jö{Ëù.šê0ÂßbD>[ÆFg>iŒ”ŒñÐsÅW‚ M5TF¹¾WŽëj¯“3¡€7s'–r˜É#vsÔÐ[MI#vuGVhÛk€rTàC‚â+ IûZø‚ífûkÄ|Ó¾]ê‹óªÊž3‚‡ ù†i·ßO©´EïRݵA“º'ìˆè¾g§ñ{ÐCEcÚý®/]+ ©'ŒÜ¬@·ïYUÜG†lòT. Îx<Ö,R1ÜÛÆÚŽF³(äO¹‰pÒs÷qžƒã ÊŠÌÓ#–ßûNMËAÇîLŽîÅ HNÖ9cóî};V, ª½„ÑÜEeiíDD3-Ì«œ‘Ñöîßßx ¶¡k»d´ms Û&.=î˜9ƒakyÖ™5&þâ)D²ÈÊ w–H'ùcÃNG<Ò}†Y|£ÚÉ ÂËØw¢–G\<{³Œ’}1žÔÒÑ\ΓößµØoþÑûWÍý£çùžOÝ?swË÷öãgl樽¦ªº›,Ú©¹þÉžy?{&ï´í‹b‘ëØ^ÿ7&€;JFuR¡˜ç êqœÀÊ¹ËØ.ìÎ¥¹Ôe„ÁlÈDÎ͸ÈâB­É(RBóŽ€*¤W2]Y›”Ô;mWtlË?µ¹Ùb¾a –铜Šì(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Ãÿñù®ÿØDÿ蘫f±¼?ÿšïý„Oþ‰Š€6i²H‘(iQI –8'~$N¬ŸY‹«KgX ²ÃynéµI*<äÜïœçÛ4©$‰m$®¨ˆ2ÌÇRi¶÷]B³[MÑ7ÝxØ2Ÿ¡›¯‡žÆKx¡–Fà™Õc$: Ae¡8Vùzò=iÚ>u ÌREÍÙ’%‘ 6݈¤•<Œ²±çÖ€5+nõ{Pro~Ù w±™íUC}‘¥Y0XìtÆå#>£9ç¥vÏ S•=?àú|öÿ2o¡¼ІRÀ@<àô?¡ü©ÕÊÉit³æ8n­¥–ÖÅœ¬`LDŠAµHü2{š}ð»ƒSÿG†ØfWæšEh²»Ï)à¶wnl‚}*~¬›²—õ§ù…ΞŠÂ¶žìÝZÛº^nKû†•™g–|ÒŸ7B0S˜Ž*• ¿þ˽G}H8~õ–MÌw|øBr8ë°‘ƒòò*~­Ýöü]‚çUEQÑL§KˆÎ“#帙‹67rÀ˜ÆyÇ^jõa8òÉ®ÅÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  »yÿSÿ×6þUKÃò*éõåþ€*@Ó¢Š(¢ŠC@­Ä ̳Fbr¸aµ‰8>犒¹˜,î­4½:( ‘¢™­šXöœÂêÈX‘Øú©«zÚ~Ñk»ížÍöÏ7w—÷OÝÏË÷±½«57ÕsÃE&ã.ÿ×é÷w6袊Ðä (¢€1µŸùxþ¾eÿÑVÍck?òðÿý|Ëÿ¢$­š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*ÏøòŸþ¹·ò©ªÏøòŸþ¹·ò oÃÞ ·‡ÃšdMcª±ŽÒ%,–²œ .÷­øI-¿è¬àºoþ&¦ðÇüŠºGýyCÿ  Ó  oøI-¿è¬àºoþ&øI-¿è¬àºoþ&¶h  oøI-¿è¬àºoþ&øI-¿è¬àºoþ&¶h  oøI-¿è¬àºoþ&øI-¿è¬àºoþ&¶h K_Ö๳·Ûg©'•{m!ól¤MÀLœ.G-è&µ?á$¶ÿ ~±ÿ‚é¿øš]Ì™ûE³ÅœÁ/MÀg§jé«Yÿ÷‡ÿëæ_ý%lÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPPÞÇ”ÿõÍ¿•MPÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  Ó¬Ï È«¤×”?ú­:(¢Š(¢Š(¢ŠÆñGüyØÿØF×ÿG-lÖ7Š?ãÎÇþÂ6¿ú9j”¾ ¾‹ÄÒDµKV¹X°X¶ÚRv¶„¨úÖ´¨Ê­ùz »5ËC¯êfù ±ÚFÕ$°U„œnÃg8íÏ•P·ñF»5˜ŸÊÓ6}÷…FÁ_½Ôñô÷®…ªû}þ¿ä.dwW'ªx–úÞ|[ tÕ¾+>íÌI9E AŠÎ¹}[SÖua`º‘uH +ß*8¢æRFyäàzÓ†m^M%oÕ/ÔŽöŠãÓW¾Óõ«ˆngYC^ÚÛÈd'jƒ,Td–üiÑx¢öæúKX „a%¸"i‰ñÆÀ?xç$ôÇj—©ºÚ×ü.Èë«Æ?ò(j¿õìÿʹïøIõ$j ™[N†O,—ò÷5ÁCòîôï×ùU½bþòçþ&²¿X<Û8q¾B°dÜ8$óÍM\Jqr}?àš$ξŠÁ×,ѵ-1„÷©ö›¿.UŠòTVQ Œ+9U “DÕ5 ¶Óè¶Ûbn”BŒ¦2<¾ ,sŸ3Ûï@´W?w©^Ã%òÚ,eÖýaËî…û:9!7 œöR8ÉÁ9Íɵ7]Îþ3 ™ÞØ3°¬’"’3ƒÑ‰öÍjQXWº½âý¥lÖ1^‹pJï!|äíÜ °$ŒÓ'JOêR$“Ù[A,6ñÄîÙP²oE|†y¨ù° SÓ𠪊æ®õ+ùÔJ“[Ãn58í| Jv̪~mØçåÇÝ=j]Q¼ÓõkF‚Hü–·“1ºœn2‰ ó3Ó o\€‚ŠÎÓ®îžþîÆñ ’KuüØP¢û¸*IÁ}zY¶úž±w~-á{ÖV»ØÍ ±Q Â>~q’wL`õ ŽŠå¢ñõÆ—6§ÚÇ´K$¬^Rñ¬„+dmûÛG$¹>©¨G{tT[}–Úú R¥{‰Y9݃/¡Î;u  Ú+ŸW¿·¹‚häÊ-y÷‘v‘+[€7è`0Û~ãVÔmEÝ»}’k¨dµU‘Q‘šM˜+¸G'¯q@‘«=ò>Æ·]l‘¶°¿q)9PÙ## g¨÷ªvÚÆ¥vÒAØÁ-´r4¯*1Y6Ë$(Ü6Ýä’N7´ÑÑ\ñ×nž}=Ö8a¶¹Š ÌRìVÆÓƒ”í‚T‚r8ÅF×:‚ø3W¹kµ71Ï.UB6„w7ûwò­Ì%L?n–ë{’lÈÜGsíL›X½T¹@mMµ½ì6¾^Óæ°‘c;³œp\žœ€zb€7è®v WU¹¼[tk(DÓ\¬Nñ3aa§#p˃Æ1µ=KvüIctG†xÞ<Œâx¢g?wæÝÓîç× ­¢¹ù5mBÓ¦»Z=ËK-À„jdo™7‘åã¹Ü´«ªj3O%´WjÉo –YJ³$˜w\˜mÆÏ›“‚qÏZߢ±t›÷½Ô¤ËǺu¤Â&n¦Ï¼ø Ú Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ±¼?ÿšïý„Oþ‰Š¶kÃÿñù®ÿØDÿ蘨fŠ+[-.¥ik%ÌÖöío<¬ñJc%×fÞA1ÇCjÚ¢³´é.o´ GyŒ7s[FîáA*ÅA<:æË$þÓ&™ÚId´‰Øä±( $ÐcKÿ#µ§ýƒ§ÿÑ‘VÍcKÿ#µ§ýƒ§ÿÑ‘P iñYèöZ”馢 Es"Zyr(Ú -&ãž3žiÐé‰}¯j—-:D[˜Á3Ùù®G“ù[pÇ_C]-Ôñss”ú¿ó¹<¦¶¬Ò]ZÚ›•7þâ9cÀÜ#_4 #· „þüÖ}®±vðbmGåócYîUSd!•ÉÁÀÇ*£2»¹Îk­¢…^ þçõwåýy…™Ì¶¦û‚Ë­yKÃså"ý¡·°ÇÌ8~î7nÈâ·ì%šm>Úk˜ü¹¤‰ZDþë OEgR¤f¬£oëÑ[XiQXŒ†óþ<§ÿ®müª—†?äUÒ?ëÊýUÛÏøòŸþ¹·òª^ÿ‘WHÿ¯(ô@tQEQAèh¢¹›k˨4­>+™äv¸6ÏÅŽ\3¦ô'דõØÖž¡s+YI/b½ÎÔE!£Â–ä瞘< Pª&uO (¦ïßðþŸÜjÑEg(QE¬ÿÈ{Ãÿõó/þˆ’¶kYÿ÷‡ÿëæ_ý%lÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPPÞÇ”ÿõÍ¿•MPÞÇ”ÿõÍ¿•RðÇüŠºGýyCÿ  Ó¬Ï È«¤×”?ú­:(¢Š(¢Š(¢ŠÆñGüyØÿØF×ÿG-h› #v.͹¹&1.ÿûë¬ïÇý„môrÖÍ5&¶±Z bÖ%3ÝŽ$?Çþ÷'ž´ÕÓ¬Q6-•²¯–aÀ‰@Øy+ÓîŸN•fŠ|òîlš„ÚšÞÍHV"tRˆ‰ py«É1Ë$±ÅÉ.<ÇU¾O| ’Šr©)hØX¯5…”âQ=¼‚b ›âS¼€NG8Fûö7b0ƒìË qí,z¶Hϸ浨§³ƒºb²([hÚu½¤vËg ¤q¬@ȉPwIëÏ?Z£âèaºԱċ$¶ÌduP áp2{ñ[µãù5_úöåS)Ê[±ØÖx£‘‘¤Y£mÈXd©Á‡ÄÓM´ ¿tî²6P|θÃR6®°ô©h©´º}ŒÊ‹5•¼È¡¢Sµ‰ÉaÇ’Niº†m¨›av‹$pJdòÙC+’Œ˜ öÓø ·EB--•QVÞ©@A…CŒ¨ôaT®tK7³k{;{[`År¢ÝJ8¬¼drxã­iÑ@Ú^‘„L Äò4Æl¬A`O‘‡åüýjävÐEåyPFžJyqí@6'(ô(ãØzT´PyìlîD¸´‚T‘ƒº¼aƒ0sÔàŸaRIoÖæÞXcxHÚceHôÇLT”PC¦iÆØÛ S`Æ# í$Æ1œ? tš}Œ³E4–Vï, Ý¢RÈLqVh  ϧX=×ÚžÊÙ®2šbRüG8ÏÊŸ=¥µÃ#\[Å+ `¥Ð1Pà ôÈàÔÔP6¶–¶qyVvÐÛÆNvÄ}p)RÚÞ7+ øe@Üw7æ@'ÔóRÑ@N™§—…Í…©x,-ä®c ^8Ú¥6Ð6üÁÞë#eÌëŒ1õ#jàûJ–Š®öO·}¥»m.W1ƒ‚ÿN}sÍéöPAäAgo;Ãùi…Ü à €sì*Å׎7dgEf·!#%NÈô8$~&«Í¦éóª¬ö6Ò„fu¶ŽIIäŸZµEA%¤·ÜKm Íú¹0Y>‡¨¥[KeŽhÖÞ“–iT Ä„õ,;ç¾jj(¸±³ïn- òdÆøü±µ° ÐJHtûv ¼E[p)® çס5fЬÚ}‹Bak;vˆ¢ÆPÄ¥J.v®1ÐdàvÍJ–ðGn-ã†4„.Ѩ ¦:b¤¢€*G¥éÑÀðGaj‘H¡^5…B° ŽG'ó§ý‚ÏÉý’ßÊXÚ žXÚ±¹qއ#¡À«P-KNŽúP"YnæxDŠê¤®Þ^OïI¤é©¦A*!BÓIæ?—ÚQРUê(´z}ŒP¼1ÙÛ¤R'–è±(V\“´Œr>fãý£ëKö ?¶}³ì–ÿiéçyc§ÞÆjÅÝ¥ìb;Ûhn#!eŒ8ל–ÐFc1Á¢@6)Æ@ô=…KEB–v¨ûÒÚ0˸FÞFÒßïcŒõÅ0iöB!³·„h—–\c¡ÀÈEQ‡I³Pžü×3J$:ÑüŠ˜SŒ…ýM^¢€+M§ÙO‘=¼‘o/å¼JWq$“‚:’IϹ¥{9bKHD¥c ; z8«PUÓ4ô´kD±µ[g9hD*ŸuÆ)$ÒôébŠ)l-^8Õ#B¤'Ðc­Ñ@Ikm)c-¼N[h%í;—ò$‘èjZ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ±¼?ÿšïý„Oþ‰Š¶kÃÿñù®ÿØDÿ蘨f¡¹´¶¼@—vðΊw•}y©¨ b„h%e\(ÜTdŸA“ǹ¥Š(á‰"†5Ž4P¨ˆ0€ÂE‹76µ?õ ŸÿFE[U/üŽÖŸöŸÿFE@Ûj÷2 ™§Óã†øƒ»¶Év7B¶ò>P½ñš»¨]Ü%ݽ™…e™F’`YQh'Œœ°î;ÔCC…U"WBÚ)VXí÷.Ä*Á€g #ô©î4ÕœÆæêá'‰Ù£™ î@ÝW‘‚½=~kªR¥Ìšóÿ÷uýIÔ¯eª™ÖØíf2\´Kb³ÿ{å8ƒŸ×!ˆm€¸2ÛÜÄ`·{‚®s"c<È<Žjx4ˆ!•eó§’ArnK;YÌ^_ÅûØ\E-«K‚æ*[³ž”kû çþ†-cþú‡ÿÑý…sÿC±ÿ}CÿÆë2_Kl/ëMŒOl‘H±"2¼>ð^ÎqŠÛþÜÓ0 ¹³f Fÿ\3•éìyéï@ÿ°®èbÖ?ï¨øÝØW?ô1k÷Ô?ün£èí Íkt&• –dRŽªêƒ$îÛÓÜgÛ4åñ^޲$3݈ç"=ëå¹T2(eËmÆG'›¯é3Ágo»ZÔ§ó/my¦?™“æ\ ù‡lä{V§öÏý ZÇýõÿ£Åñçcÿa_ýµ³@ߨW?ô1k÷Ô?ünì+Ÿúµûêþ7[4P7öÏý ZÇýõÿ£û çþ†-cþú‡ÿÖÍý…sÿC±ÿ}CÿÆèþ¹ÿ¡‹Xÿ¾¡ÿãu³Eca\ÿÐŬßPÿñºËñ6“=·†µ9ŸZÔ®Um¤ÌSö7ÊG8@}ú×[XÞ1ÿ‘CUÿ¯gþTa\ÿÐŬßPÿñº?°®èbÖ?ï¨øÝI©ê:å´0XÚÍÔ¾Tn÷L‡vÆs#8!OjHuØ>Ù5â˜gŠdƒåèY‘|û@/´gǾ(ŸØW?ô1k÷Ô?ünì+Ÿúµûêþ7S¶·eAîdÛºIÑ߈ܣ1Âð'€OR0M›ëûm="k§eó_ËŒ,lå›àôS@ÿØW?ô1k÷Ô?ünì+Ÿúµûêþ7R¾¹h´{I®šn~Eˆ #n3Ÿœû¸ÅYºÔìíÒyHtJ*31ÞX( ’J·'Š£ý…sÿC±ÿ}CÿÆèþ¹ÿ¡‹Xÿ¾¡ÿãubbÒæH–ÚMÛ® »‡WFW™1‚½p\wç#Ö͆¢è¶“3—ÍBÑ:N9RÀÔg3@°®èbÖ?ï¨øÝØW?ô1k÷Ô?ün­6±`·ídÓ0dXØym´1PÁKch$Žy¨Î¿¦ïtY¥wI"±ÛÈä²’œsŒãQ°®èbÖ?ï¨øÝØW?ô1k÷Ô?ün¬>¹¦¢Dÿhg¡‘|¸ð à³mhÏ8èi-5›Y´áw3yElã¼™0[ËGŽqÏÝnœñÒ€ þ¹ÿ¡‹Xÿ¾¡ÿãta\ÿÐŬßPÿñº¶u<]5»\mu,¥Š0L¨Éñ· HÎx4‘ë:|‹+yÍŠ33y±< êÃpÔf€*ÿa\ÿÐŬßPÿñº?°®èbÖ?ï¨øÝhÙÞÁ{In_ ÛX¹§[ݽ¬“Iç#ˆÊ¬7ÌT0P@ §8þFëv[9~Î`švvW ¢"¡¾]½‰9Ðó€?°®èbÖ?ï¨øÝØW?ô1k÷Ô?ün¬mYº1òÉ$(Ë*<|HáTŒ®H98= G$1¼C¦ š!4Í"—]©m#Q¶¾0¼àõÇN=h/ì+Ÿúµûêþ7GöÏý ZÇýõÿ«kºl =Ã’8d‰ÝDg£±…_sŠžÒïí7°ù{~É8‹9ÎìÆŸo¿Â€(a\ÿÐŬßPÿñº?°®èbÖ?ï¨øÝø›Mt÷–í,Â+f¹UºùˆU%y :gœU˜õ­>IÖ–@ÌÁh]W~>éb0ý’sÛ[û çþ†-cþú‡ÿÑý…sÿC±ÿ}CÿÆêÕ¾±asvma™Œ¡Ý9•K!!”1$`ð½:ëW±´»6·˜F$*#c…9’J‘õÀêF@)ÿa\ÿÐŬßPÿñº?°®èbÖ?ï¨øÝY:Þœ¶ÒÎód\f€ý…sÿC±ÿ}CÿÆèþ¹ÿ¡‹Xÿ¾¡ÿãt[ëñOs§Ä°· Y˪$ªxï±ÿïŸz¿¦]›ý: ³–&]ê¹ÏÊzÄ`þ5¤èÎ ò_Ö¿ä+¦Pþ¹ÿ¡‹Xÿ¾¡ÿãta\ÿÐŬßPÿñº‚ù·‹•hw]5¿–—{§r»Œ{zq»¯J¾u½?{¢Ë#²HÑ•H‰e$0qƒœtãÔUKV:8…Ñ_û çþ†-cþú‡ÿÑý…sÿC±ÿ}CÿÆêÔšÖi#\e7åcfÚ¹ÁfÀùF{œt4±j½ìÖòÈ“yHX¿îÑË`ߌôéÏ5>Ê}‚è©ý…sÿC±ÿ}CÿÆèþ¹ÿ¡‹Xÿ¾¡ÿãu³Ef3]â(^F×µYB)bŽÑmlv8Œ­Qðöq/‡4É^ÕbiF‹jå1“õ®’óþ<§ÿ®müª—†?äUÒ?ëÊýP?ØW?ô1k÷Ô?ünì+Ÿúµûêþ7[4P7öÏý ZÇýõÿ£û çþ†-cþú‡ÿÖÍ¥ca\ÿÐŬßPÿñº?°®èbÖ?ï¨øÝIi­-Î×RFx•¢-ʉ@9Ç# ŸÒ­Ã¨ZÏ0Š) fÎÒQ‚¾:í$a¿ •$ÍeB¤ou±Cû çþ†-cþú‡ÿÑý…sÿC±ÿ}CÿÆëfŠ£#û çþ†-cþú‡ÿÑý…sÿC±ÿ}CÿÆëfŠæn,$²×´?3Q¼¼ßs&>ÐPìÄôÚ£®{úWMXÚÏü‡¼?ÿ_2ÿè‰+f€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ †óþ<§ÿ®müªjdÉæÂñçÔ®}2(˜Ó´}[Jð½ÝØŠX¬¬0Ku“|h;ôÆÜô5wRðûÍw¦Üé7PiÇOª µ„8ðqÓõ¦Yiõ½œå§•oÄ›´òN`g÷žÕ?ؼEÿAË/üþ;@ŸÂ+.œÚŒ¬ðÞ]È«±§sèAù8Åâ/úYà¸ÿñÚæì¼7­]´·å൶°žÎ7‘cʇP£îÀ“·§J× n²Ô-¾Ý¶_›ÉûžHAýîs³ðÏz»ö/ÐrËÿÇÿŽÑö/ÐrËÿÇÿŽÐâøó±ÿ°¯þŽZÙ®z÷F×/¢Ž9õ»LG4s.4ò>d`ÃþZzбö/ÐrËÿÇÿŽÐÍö/ÐrËÿÇÿŽÑö/ÐrËÿÇÿŽÐÍö/ÐrËÿÇÿŽÑö/ÐrËÿÇÿŽÐÍö/ÐrËÿÇÿŽÑö/ÐrËÿÇÿŽÐÍcxÇþE Wþ½ŸùQö/ÐrËÿÇÿŽÕ}CF×5 ì®u»Cñ˜ßnžAÁ¿y@×¶_j¸±—ÌÙöIÌØÛß»tÇ·ßÏáUåÒ<ϵþÿh½†ïî}ß/ÊùzóŸ+¯mÞÜÃö/ÐrËÿÇÿŽÑö/ÐrËÿÇÿŽÐW^’kdŠ+Õ‰–iäó<œºù²ù0*Ã8ÎH=Á㵫[»™´Æ²eG†ìÈÒ2n<™$ddÀp{Ô_bñý,¿ð\øíbñý,¿ð\øí1¼8¯iäIvÇ}­Ô0LniÝY˜sÆ8õëÇ0_é·±L5)n|û¤x¶˜-NØö‰%7À‰N@9î=*ר¼EÿAË/üþ;GؼEÿAË/üþ;@ô:æišöîFVþÑ7Kº,È¿gò~é9^rFrpzÕí?HûÓ?¿ìFÓîc~|¿›¯êús×Ú¡ûˆ¿è9eÿ‚ãÿÇhûˆ¿è9eÿ‚ãÿÇhÒ.î5[÷–q›ßEp#òòÒyqÅ‚< ÉÈÇðöÍNº,Ð4SZ^"\E-Ã’êVi<Â¥CÁÛÎ{{â“ì^"ÿ å—þ ÿ£ì^"ÿ å—þ ÿ Á¡\Y¿™e~©,‘”¸i ß¿.ï¹FFÓºGõŽ8¨¤ðäÿb6°j ɧÇc)h7_˜c;ÎG?‡ZŸì^"ÿ å—þ ÿ£ì^"ÿ å—þ ÿ ôI^;›F¾ÆŸpÓ3±aÏ›»pßž™bGéÎ)–žë>æ²%»@­‚G€z–Îw/µ?ì^"ÿ å—þ ÿ£ì^"ÿ å—þ ÿ  Z>Ÿ&lñI8—|…ÀU*‘ŒµAf qœg©5KLÐf±Ô!»’õ'háxYŒG|Šœ³<ålrxÿ±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€&þÈÿ‰Úüÿù}û^ÝŸôïäíÎàYü=ê¬þ󭧇íxó`½‹>_O´H=‡÷ö©>Åâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚšóHûUä·~Ï3ì¿.ÌãÉ™¤õï»ÝyéE–‘ö[È®<ýþ_Ú¾]˜Ï2ÉëÛn=úñÒ¡ûˆ¿è9eÿ‚ãÿÇhûˆ¿è9eÿ‚ãÿÇh¥Ï…äŸL†Ãû@yQØ­™ `R<Å€ç¾z b¶llÚÖ[É^Q#]L²œ&ФF‰Ž§û™üqÛ5Gì^"ÿ å—þ ÿ£ì^"ÿ å—þ ÿ 7‡Civö&ëˆtÉ4ýâ?½½cñž1åô÷ëÅ:=àm†[èÚÔ\‹¦`ÚÆMþaÃn8]üããŒÒý‹Ä_ô²ÿÁqÿã´}‹Ä_ô²ÿÁqÿã´•¤]¬é5äáb‚öêâxl»È-žF×'ïíVµ=B[Ç–PÌ0F `¦'wçïXd{{Ôbñý,¿ð\øíbñý,¿ð\øíT¹Ðf‡N™-¾Ê.f¹¶lÛZ,*Š“+g$àn<Ÿ¦*Ìz%ÌW?nŽþ?·³»;µ¹1°eE#f쌓ø»ZwؼEÿAË/üþ;GؼEÿAË/üþ;@ØèâÒâÖo<ÈÐG:¶WÚYFonTñïíOÒ,î´ûh,¥š9mí­’$ei%r2y?ÂñÏ®±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€þi$ÔwÞŠúb)[?Ö¼Üá˜tàœç­=´k™å–kËèä’F¶?»ƒb ¦L¸õÎ:ñúQö/ÐrËÿÇÿŽÑö/ÐrËÿÇÿŽÐAœª ¾CÏ<¾[ÂJ°•÷òŒ•$àž0zw¨†g¢Ôj)佌V3³òñ¦þAÝò’ý~–¾Åâ/úYà¸ÿñÚ>Åâ/úYà¸ÿñÚŽ÷És}-ç™nò¼Í"¥Å°–08Ђ¹?ºG\U£¤/ü#“é " š "2$* $"àunŸ¯z‡ì^"ÿ å—þ ÿ£ì^"ÿ å—þ ÿ þÅ—Ìò¾Ø¿aûWÚü¯+çß¿ÌÆüãnþ~î{f¬G¥Gý“w§M!xîšà»´+³øoÆ}ª·Ø¼EÿAË/üþ;GؼEÿAË/üþ;@Ühw—‘Ì·º”n^Æk5)m·h“oÌ~c“òôà}*ÏöLŸÛ¿Ú+rª™ËF‘mgù6á˜2÷ädøâ¢ûˆ¿è9eÿ‚ãÿÇhûˆ¿è9eÿ‚ãÿÇh†áÛ¹t­õ  ²ÿe$A<ê»·|ß1TqŽžù«š†ƒ5åó\}µùÑMÉ sB§ w+ÏäóOûˆ¿è9eÿ‚ãÿÇhûˆ¿è9eÿ‚ãÿÇhš‹&«©^•‘ayJ[¤ˆT¨?4„ÎÉüªOìY|Ï+í‹öµ}¯Êò¾}ûüÌoÏÝßÏÝÏlÒ}‹Ä_ô²ÿÁqÿã´}‹Ä_ô²ÿÁqÿã´4:G•ö_ßçì÷³ÝýϽæy¿/^1æõï·ßˆ5Í M\Ê¿l ¶æÆ\!çç_˜yîAŒRý‹Ä_ô²ÿÁqÿã´}‹Ä_ô²ÿÁqÿã´ýbÒöåô£k",°]y’Jcʨòd\íÈ8%€ÆsÍCo¡\Y·™g¨*K"¸gƒpr]äÜ£pÚwHþ£‘ÁÅ?ì^"ÿ å—þ ÿ£ì^"ÿ å—þ ÿ  ·~’çNŠÇíãÊK´!á,ê7 Ï|ôÅtH"‡ ¶9 `ô¬±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6h¬o±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6h¬o±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6h¬o±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6h¬o±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6h¬o±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6h¬o±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6h¬o±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6h¬o±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6h¬o±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6kÃÿñù®ÿØDÿ蘨ûˆ¿è9eÿ‚ãÿÇj½®®ZKu$:Ý 7SyÒgO'æÚ«Çï=PCY:¾—u¨\ÀñÝ[,1˜.-ÚTfÏ @uÎ1ÆsLûˆ¿è9eÿ‚ãÿÇhûˆ¿è9eÿ‚ãÿÇhmBÇQ¼³òP†U•°Ä·G+p0G<œÕ2Ök;1ÍjBŸ[@aE_M¥›œçœÕ±x‹þƒ–_ø.?üv±x‹þƒ–_ø.?üv€6k_ù­?ì?þŒŠ±x‹þƒ–_ø.?üv«¶®6£ùÖí<øáhGüKÎ6±Rxó=TPÛÃJtûÛd¼d{‰üØ¥ Ì#9 y-ÿ}VÄ0´cFQn‘ª$aygœç¦1Æ;{ÖgؼEÿAË/üþ;GؼEÿAË/üþ;Zδæ­'ýHVHDÑnv¬^ÂÖ©vn‚­¹gÌ2¿yN:t©WH–¶·H“Ç$ìâÜ¥e“yRÁÛÎ{{Ôbñý,¿ð\øíbñý,¿ð\øí7ˆ¨úþ,‚-{lµÿ—$±”™Úʼnv}ËÈ s#uÈäqÅH4UMRMF)¶\É0rÛ3˜ö*Ï<ƒ·9ìqéÌbñý,¿ð\øíbñý,¿ð\øíX©vï¿ Y4V7ؼEÿAË/üþ;GؼEÿAË/üþ;XŒÓ¼ÿ)ÿë›*¥áùtúò‡ÿ@]ôÿ:26·dU†þÎ=?ïíEe¤kÖ66öpk–žU¼KnÓÉ8QŸÞ{PAEc}‹Ä_ô²ÿÁqÿã´}‹Ä_ô²ÿÁqÿã´³AéXßbñý,¿ð\øíbñý,¿ð\øíHÚ*›{YÊÉh"Vp¿ëU8#>ª·5%®›$-l¯p Lù(#Ô¨ÜsÎ# ªÿbñý,¿ð\øíbñý,¿ð\øíO"6xŠY³fŠÆûˆ¿è9eÿ‚ãÿÇhûˆ¿è9eÿ‚ãÿÇjŒMš+ì^"ÿ å—þ ÿ£ì^"ÿ å—þ ÿ Yÿ÷‡ÿëæ_ý%lÖ$zN©&§ew¨j–ó¥¤"¤vf2IFN»Ï÷³ÓµmÐEPEPEPEPEPEPEPEPEPEPEPEQ>œeN>´¿ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©dißóéëGöFÿ>‘þ´vŠ¥ý‘§Ϥ­ÙwüúGúÐÚ*—öFÿ>‘þ´dißóéë@hª_ÙwüúGúÑý‘§Ϥ­]¢©®•b‡)lª}A"йEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÝxëS†þúÛKv·¾khí H&•Cí6vçü t÷>+Ó­µ³t¸+« · €Å¶0¤ç=Çl ÕkŸ yú¯¦}»iÔ¯ZìKäçÊË+mÆyû¸ÎGZlÞ ‚Mfká5¿•<ÂyK(ä}Üd,’ ã¦>”biòêFÈÛÞ&.ÚËÏx‡•æáÜ~ßÒ‹4ùïca»Í9·Šé¢Ä2H3ò†Îz‚:cŠÉÒ|5y>¡s=õÌÚG¬Ëy©Œ~ñùw\{{UÛo 43ÛDÚ›¾›itn ´ò€*ù$eó’$ã¯ãQŽ únŸu,¶SùI$CÉ $T?6îsžç¦@¿¨êÐišjÞÝÇ2ï*« ¨iÛ¢ ük2o ´MWM7¤h^5ØEþ¬—Wç}ªö¯¤6«¦Co%ÑŠæ #š;„AòÊœ†ÚON¼f€)ÍâÛ(,’âkKôfº†ïB g@íšCã 9nV ¼EÞ‘Ë+DC#B?9d€@=éÏá뫈ìÍö¬÷[ߥás v‚6*ƒòŽzóU§ðlk3_,ÖþTó‰äŽK(ä}Üd,’ ã¦>˜  Pø®ÒmAl–ÊýeIäˆ(œ $…ÉÏn3Yú_RmÊæúÊá¯.Ußɶ@~E8.2ßw·'9Ïí7Áa¬ÚêÚ+)¶–Yk`A †|åˆÏþUø %­¤Bþ $´W‰{%•LlÛ€*ÇÏÍïÒ€.ßøÎÅ-$“NŠâñůÚwÇ dˆvùœ‚9=kJÛX|/o¬ê,±+Z$òì•€:õ•§¡è—:n£¨_Þj?mžøE¸ù"0»Oþè2O\[øÃRÓ.b€XÚAæ$€å„bLœcûv¨ôÝ\èísªXI%л{qŒ$ãj©$îl§©©µ®©}ru¼–ÂÅ’Š‘´l¹Ï;ƒ§½$¾ .f  6¡-îǶïJ“‚F8?¥_µñ^›uöB‚uŽî 'ŽGPœ:žs¸`û{Ö…ž£öí=JÖÖr&‹ÌŽڮð럯zãõ Koáí'Cµ{‰îåÂÜÅDå¼Íç$(ÚçëŠî¢!…"‰B¤j@ì€9Aâ«ÿøG¯µ ,á‚k{óiµØ•„U,äœdç§á}b}^ ³9¶”[Íå­Å®|©~Pr¹çŒàÕi|($Ó®í¾ÜË$Ú‹jH"Få²RpÀ~­ H}0ÝËqvn®®åK ŒF¹…8Gþ¨üA}ewaö{{[º Î屑‚@ƒÏÒªéþ%ÔĶO©Ú@Ðê6’][% fmPÛ?x•#Ç5¯>ˆ—ìÚŒ²æ9¬~ÄÐíí¸±;³ïŒb³¬<-ui$NúËÌÖvÏo`Mº³îÜyùÈzt  uO^ZÏ£ˆtÉ Bx£ig!L{Á; gpp~½gj>/º³¾¼}¶+get–ÒC#‘q&q—QœcæÈã n_èòßÛéKqy™¬.b¸’O+s"xåÉ9ïŠÏÔ¼%ý¥«5ÍÍòµ³È®ÑTóRÁ/P¹Ö€$Ôuû¿µ[Xi¶mÝÅÔ–è×±²¦#]Ìà–R:3Y7^2¾ŽÚÞ?ô+k±=Ä-$rK1`¡>l¶¯´+ÛÇŽáµr·–×O5¤ÂÝql6ùesó gž C†¯m-4ýrX'g’K‰u™œä¶ÜðGn:½ýóxh_@–÷÷møÖØ•ŽBOÜr1œûÖ ÏŠu‹ É4Ë«{ ïX‘Iq<´+ä“‘‚xê+z¬¼2º6›xöì‘yipWs)=[ò~•oàë¸ôï±K¬!XÝf…ã³É2°"F;Žó×9ëž´ÏøIõí?ì"Ëû[í_™óù;<¿3v3œãŒgñ¨.¼e}µ¼èV×b{ˆ.ZHä–0bÀ%B|Ø;…_ÿ„Bo7íÿÚÍý±çùßkòoÜÙ·ËÏM¾õ,^½´´DÓõÉ`žI.$hÖfs’ÛsÁ¹üèãjwøFmTËiq½¿ZžZÏÓ%Ž¢g¶Tvµƒ+«UäzóÆ+^úiíí^[kG»”}ØQÕK~,@ƒaá‹:Úëìz…­½äʨ“Á§EŒ ʼO¹Çµt´ËÃâ[é<šòië<í’4q¸TŒ)o˜î9 íÉ­Ë Ï;F¶¾¹(žeºÍ!*åA?…P²ðÿÙ<ÞûVýÖòAçùxûû¹ÛžÛºf¯Á§¢hÑé²·™Ûˆ±ÃnÒ}¨•B÷Ä—Ê4ÈmΟo5ÕÚä–í™cè2‹ƒ×œõàzÖÄúmÕÖ•©ØÝßù¿l¤Oä…ò×pÍŽyã5CQðÔ×v6ÑjÇö8D_½´I•ˆo¾ëq×4‡|Iy¬j–É$véiu`n‘U[z2º¡çgwaÚºšåt}%ôïA½¤ëce¦ežM¸‘Ë«qƒŸ^Ãkª Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ²jz|WbÒ[ëT¸n‘4ÊÿÀsšµ^S,¶¶šՅ嬺ÿÚ${”»¶‘Þq’C#.ãç®ëºžª×ÈóX¡²…í14¨ÈËaUÌ9ãiíõÍzMæúÕΨ­â;ßíKÈfÓ…£ÇR‘fEÝòžÄçΟ¨k'Åw1-ù·/m­ÚYpñqÒ%BrÄñíŠôZŽYáƒg,qùŽ7°˜ô=OµyåÅÍÜv¾¡6«©í]^KED¸(‘GæIÁ*LŽƒ€9ªbåï4«95 뇎ÏÄ"!!ò‘È%Ž ç£ž{f€=N£’âæŠ&%›>Z3ϓߚó‹ K_“Wb—¹¿L$²ydo”nÚ<½›TtÃnçךMê;¯xeާ{wvDæî;‚H†O(äGËÎF`(ÒâçŠ &f›>\lÀ3ã®|w©+‹ñÌ–ñøƒ@kËÉìíöÝožUÐmN„ ŽqYójÚÆ™áý[º–åÚH&·–2OÎÄ1…ÊôÉÀÉ÷ D¢±ŠÝé> “}Ä’^ÛX»™¤mìdNrsž}k—ÖouC§Íos©I"µµæå‰¡2…aÀéßðôÈ=X|,«lÒÖß×ÞK•A¢¸ËsPP•"¾Ì©svö^JŸ´ÄvæMØÏ9'#b‹sQ—_û?Û¼ãý¥5»Zy*6¹Ãî<` ¿¨TåæºÚýËþ˜s#³ O¹Oß^h²Zê¶ÒLÑ–ÙáV%K²“méÃ÷«¶òÛ[i ¢êO{y‡™sY¤‘H!°ÝÉ9œ×Fµ¥ý•îÿ±]ÛÜl8*@ûO¾+ÍKO*,’çb¾N| àü?©i6ºíö¡"iÉi I,p2,9|˜s¹ùjÕÔìàƒâ…s6á.|ÂÒ3µázž˜ –êêÚÎ5ÝÄPD ÊáWó4–·V×ùÖ—O8߆˜®sÆÉfL¹½–H36ɸž%å¢ç¡ì{Jçã¾™tÍN}:4‚»·Iõ>ŒIñ²¡ÎÒ½ ¹ I¢¼îmBôxsÄ/¦ê×6òÀm.™ØÈFå2€ýHË4šž·=Ý—Šî´íFàB’Y gWeØ @ÛG`yéÖ€=ŠóýNY4ýZâËP×5xck‹5óùaÈ8O¨/5 høžxþÞmîî5·å‹þY*0`yËÁôÅvï®èÉpmßV°Y•¶ÍÊ œcÎsÚ´+‚ðÖ‘qyªê÷iujG¬Ï¾),–F|0'NW#Žœuªú~¥|ú¥–u çÖQhï,XŸ*82rBãÚA÷ E¢¼êiõ%±ÕïÆ©¨ÓW’ÖMŽX[Ûùƒs(ä‚öЬú¥êÅ® #U½º³ŽK5Y摉Ž&ݽƒ`20XqÏ8 Nª[Òɶ:­ˆœ>ÃÚplãÎsžÕ“à™îç´»3Þ-ݸ›î$’\ r7º©ažüýkŠÔ¬%m#Äš“KZÁ¬È$€Û1ÿz½%ê½}=}hÓ.5&ÖäÛ\êvPθ).XddpNzSµõšÞGf×p ™rBdÙyä/R8?‘®ëI¼Ö¡cl$7–ñˆ•Wa##9âÞK‹{ûYaˆ$‰2² ’H8+][­¨ºkˆ…¹Pþiq³ièsÓç°ÜAqˆÖ++”]"Poí-Þ'÷l¤•-ß#Ó½áÍcEÕ|?k£­äRËöŽh°r@èk}m1(d\ªÙL‘»ƒÓ ŒúŠçmçšçáT’Üd:T€“Ô`êÑÜÉÖÖ!÷7†¢a}ÿyó`äf€;øµM:h%žûY"‡ýd‹2•O©Ï£SÓÍ™¼ö¦Ô¼åÙÿ}gæwS¬–—+f`¼²Fµf¾Kƒä«(_ àúÓYwΗ­sißÚ,Ò_Giû‚|„D0r2r2s@«ÐÜB³[Ê’Äã*èÁ”ý§×%áiu¹l-šÖ 5l<÷#DмɼâEEA#žq\ä7:¬^Ñï¤Õ¯;éHº–k–Eˆ.ý£z©eõ<çp(Ô*´Z…”Æ 弆}ÞNÙTù›~öÞyÇ|t¯?‡Q½NMsY»ƒNhæh®­Œ€Êá†Åf( asŽ0Þõ‡jo­<¹¸ƒÌ]C2BÛ$7cÚ€=B£óáûGÙüØüý›ü½ÃvÜã8ëŒ÷¯/¸Ö¯¦Ð4–›Q½IÞÆY‹;F²:±î©.Ø‚@îMiiòÝOâ[ ØgWÔ.ô¤í¸ŠIsó¶2p^zÐw-å¤2Ó£¡³º–í¤Ž_6US‚2z}k¥—ÅV¶ö×Ò][\£éâ´"…8iBà)Ï8ÝÏOÆ€7¨®WXñ-ÝŠëÞDp3i¯l±‡CƒæmÎpÜý㎟'‰¡öCk|£í¦ÇÏ1+ÍnÏ~ß®(¡¢«Y^}¯íè×y4?¾nücæ_U9à×'ÿ •ð·óŸO+gì%vnf ÀïÐnxÍv´W><]§µ„w+Ù–K†¶¾Xó|ÅûÀŒà`{Ö¦“©Ûjö+wh_ab¬®¸d`pTQ@(®JË]ñ§ký­¦éÖRéÍ)Xà.Ây6ÒÀ“´t'¬Úø‚îmÄW­M.âæ(@S†®Ww<Ÿ\b€:J+ƒÔõn¸9õÏ#wê:`uÁâ€:š+•¾ñŠ >ÒòÂÚV©-•Ä2G™í$…ãwLrG54þ(Ûi³ØDWíšØÜGp„W•·ßœíöÆ{Õm[ÁÓß&£ok¬5­ž£(šX ¸Þq’ àíWPó“G ËË.|´,>:àwÅI@ †é/®¥šïÍ·“g“”ÉÀù¾n­“Ï=+ëÚ‘Ö5+ý;\k¨ˆÄ‰ö@ì6&ц-õíÞº9dŽžYc³»©'°¢7IcY"utpYNA¡€9ðœmا†4¤R í#œ¹ù”· Ç'<íWíü3=ôa«Kmc,ë<–É‚XÙNF?*訠 oè×ZݤVÖúØãWÝ*ù^`”vR7=»Ô7:Õï†eÑï5ÙЬ±ÚˆÕYX(@ßìú÷­ú(¶¥o=Þ=½¥Ñ´šD*³…ÜSÜ Žæ­üwö)u„+¬Ð¼va&VHÇqÞzç=sÖºw¾³Žñ,ä»n¤]É H°ç½HàþF§ [þ ¼ß·ÿk7öÇŸç}¯È]¿sfß/=6ûÐþÓ¥Ó&†âYe¾•eÝw¹—ç’X¢°gJéRâ '–榇djÀ²g¦Glö¥†h®"Á*KgŒG½eŸÛ?…†ƒ#¹‡Èç?Þäžüãð¬¹ü'¨\Es$¾ “íפh[p»bRIPI<œ×O Äg‘4rùNc}ŒcªqÐò8©(MѵK Hm“X€EÈÛb°T1ÉÇïd|ÝF=ê+¯ ÝÜêKq&µ+A Ã\ÛÂñ1HAçÎJ‚~íttP/£økUÒüòºôr4êåäkæ3v±bÄœ:qŠv³àëMbÈý¦w‹¤K%Ø,”#'Ë œ¦k¦¦E4SoòeI<¶(ûX¬:ƒè}¨:b×WR‘Y‹X¡ ƒvKn'’x…[²†ê”]Ýý¥šVd>PMˆz/qëÞ¬Ôs\Ao³Ïš8¼Ç¦ö ¹EêO¥dKáÈdñ\zïžFÈÀ0mᤨrsÔ+Ò©OàØ$Öf¾Y­ü©çÉ–QÈû¸ÈY%AÇL}1]/Ÿäy©çmßåî¶çÇ\g½$—G4PÉ4i,Ùòј| œøÐ<>h´ÍRÍo9¿º’ä?’Íä¥NC1ïíYö~ ¢öõÌz„w¥c·ÙȤmT òç<žzt®²Šæ-¼$ÐÏmjnúm¥Ñº‚Óʫ䑗ÎH“ŒTŸð‹~ïoÛæ1ý©Ÿ+ý¬ù}_Òº:(µ”7Pý£íwiß3<_º å!Æޏçžù¬1áGîþÐÌCVþÓT0ò͹3»¾G8ãërMFÆ+µ´’öÙ.[¤-*‡?ðæg{i–Æê ˜Ãm/ À>™ùÎ\ø.9â“7Q´¦þkØÌ¶ÂDgTd' =ø­½LM'N[ThØî,̤@“èª~¡’òÖ)^)naI#Îui*ŸÞ#²ñ×¥s‰á+˜ck]râ %¥2}•#ÔÜUdÎ@ϵ>¹fÔ!±Ö¤µ±Ôdy.-þήIq‡ÚÄñŸ¡®Ž;»i&Xc¸…åhÄ¡Áb‡€Øô÷éSP5§‡â³Ö¡¿ŠcåC§-‚ÂW?*¶CnϧÅRÒ¼'ýœt?ôï7û'íýN<ß7þqÇ>ÕÓT~|?hû?›Ÿ³—¸nÛœgqžôÌÏàùZÞD¶ÔÄ2\ꑹ·Üã1»œuÏéV/¼?©êzëI?Ú e$[0ž^Ö x Îp;ŒWEQÜ\Ak Ms4pĸËÈÁTdàr}ÈiḬü[s®Ã9i€Äðlà1e%Ï}½1Ô“š³¢i?Ù"üyþoÛ/dºû›voÇËÔçëZtP=âo ¶¾ê~×*#ØCÚ¬¥yÎäl‚­øãÚª^ø1î$»1j¬‘Üý™$„I–‰BÜÀÈ=묢€9ð\±X xuQ®¦5‘m@ÚÁví 1ßôÅZ‹Â›-­Qï̓ǩJyLXó_~QÈõé]½ÄP,ö³G4/÷dƒ+}¦-õ›N°-ÜVfUA ÜJýà¨ÈÏ¥sÚoƒ`Óõ4¹I­ÚåiQ ”~h$“ƒ)É Æ0}ê÷‰ü>¾ ³Šµ5¬‘9"U]Çk)V^£¨5£¡e7‘äÞ[Éö€Æ’©óBýí¼óŽøéVh—Õ<o{¨›¸%·„ð û§t=«BÓB[K½VhîJ® ‘¢ªÆ’=ƒ¯@+bŠãWÀŸè·Ñ6¤Š÷kŸ&ÐFƒc‡ÜP6 c•èòiVÒk1êÄÌ·QÅå|²¬¹' £ƒËϵ^ ¶ö:¦±âHîêöÉÖÔ,²Jêî¿ñŒ1ã=Ç­R°º–ßÁ>Y.î,ôé$]Ü[’¬ƒ-´n€OS^“Eyn›xÑZIFò-*mjqsx¤¤›|µÙ¹€ÈÉÆOzãQ X-äµ´ÍÞ rK |(b9?/LýêôJ(Î5MJåd˜_êÚ«%„o¦ìS¹ƒê:¶v§Ö´]õk¿[£ÝÝÃñ8ÎØÞ´úƃ-¶£{}©n^xn2DSù-ò€@ÛÎF`+Ôè 7µÔîÿ±n&Òõ]NïTîa•K¬2änÆ~ë› :RͨÒ®[FÖµ[«?6Ü\Ü8.Ð!?¼(çœã⽊ó›Fñ|7âÓµ;Ù¬ašØY^<Œ_,ëæüãñ4ßKªéú´–+«ÜÄ‘@­i,÷•Ù‰c„Fó6ØÛ[³ù>c:+òn9Ú=²N(Í"š¥ø:]BþæÖç™q ê2?ˆdŽÂ¯O©^ gS¿²ŽxnM̱;#²ŒlfÇ|cŸzôŠ©q§[Üj6wòóìȈ<|àÈïÐP5;æ±Ñÿá Ô¯ì-d²‘üøK#É(| b9ÎÌw5WÄzÍõ¾ö‡QÔc¸·´‚Hü×h¼Ìõ>R© ½¸Œt¯R¢€<Û^Ôî£ñ²–º¥òÝE-¯ö}¬nÆ)Y•w t#8üy®®Ð˜¼q¨Eú¹¬¡šQé fQø•ò­;m:ÞÛP¼½ˆ7zPË“‘ò®ÑÛŠ-tømnîî•æ»pÎÌGFG°çó4çþ!€Câûˆä˜J‚Äæ·ÜߨcÐp)Þ'ˆKÿ ‘&AåÍbÿ#ÆÕÎqÔ`“øgµzMæ³j:£xã·ÔÚ6[ˆ–Ò)'”‰`ÀÁ؃†Ë})Ú»“þ$¾—Q¼s¦ÖñDÒ‘¨¸ õí×ÅzEç~#¸¿ŽïÅj—Ð5­ZÞ(æ"0YW9^àútªÞ'Õ.b:éŸWÔm5e gm 2£CòüÜÿ6NxÇá^›X—¾¶¾šs=íù¶¸pòÚùÃÊr9î2€#ñµÍõ¯‡Ì–Ñ“4k,ŠH1ÆOÌr#êÀ®WûCRM ä·Õdžä_¢é«ÒKç7FÌê¾bu9çµé4PšË©GöO õÝJ+iã¹7³,Î$Þä63Œ7Ð}sV­¥Õuðµæ¡}j÷pÝÚ'(ò*€PŸ|`ç¯&»[:ÞãQ³¿7ŸfDAãç6G~‚­Ðhš†³?‰aYïÊÜ©âÑ啱'ËÙµ!·søÔz.£¨JâÜê·w3›k†iQÖ6í/ .PƒÐ)ç¥zMäçRº“Ãú¬&þêëËŽÝŒÂ᥌±™AÆå Ž«Ò´õJú=KRÆ¡}¯â&Ÿd„ùRÅòàíÆ ¶IéŠôZ(ÎüGqߊ/ Õ/¡:kZµ¼QÌD`²®r½Áôé^‰EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÄÜøÃPµ·U’ÞØÜèIÈ ÁD1ೞ¸eç‘íWãñ_—5ë]BdošÎÎ+tÌ’”rrq€{ñÒ¥¹ð¤Î¥~÷mý£[˜¶p…€ÁÏ\*öíÖ«Éà¸_EÓì¾Ò=” škq"ÊÏÛžsŸ^0(.¼d‚çIkY®-ï>вı:¼`| drNsÚº3P·Õtè/­´3.åÈÁˆ>àäVxFhÿ³d°ÔÒÒâÇÎméf]¤`÷úÖÞ‰¦G£iú|.Ò,*~vêÄ’IüI4oãm:æÊ+¨¬õ'`!„™¹È^pq·“œ Š‘üc§ˆ¬šk뇼2ªE @º´xܬ <Õvð\gAÓ4ãu˧34rËl$GÜNCFNç×µUºðÕõ¶£¡E¦N!0 ¦–ê;TTFu\f1ƒŒ~hU¼[§µ½œ–^^=Üm*Coç§°$c޽hŸÅºtpéÒÁ ÝÐÔ•Ú·‹s˜È#9Ï?¡ªñxEìb±m'T{[›X•á U›yÊ’0wdŽ:±eáx¬fÑZ –Ù¥$˵—&S&2sž9ÉèzОÖn5•Ô Í£[ý–òH rô8cóý½)x²ÂMAlå‚òÛxÇ,ñlIXŽsÐÈkFÒ_J—P?iób¼º{•CÓc–Ï=½+ÛÀ«¡ĺˆ™#iË)¶äYT© àä‘»‚*³7Œ!}.îæÎÂôI£ÜÛ™áÚ“(þ sÐpHàã ¦CâÉU„—vŽ"]%oäŽ8Á“;ˆ8;ñŒ ã®;ö©í<3wŸ6Ÿu­M=¡³kHc¤`ƒó0•&›áÃkyÅÕâ܄ӖÁ“ÉØC»©ìqÆ€qâÍ6ݦNâ(¢“thc/ÜAÎK¾˜ïWt}bÛWŽcK?—,3(‡çŽGpk Aƒ6-ëM+Γ$ï;v¨¥I!”ŒwÉ­F] W|$ϹŒ6©@©4ZióÞÇÃv!šsoÓEˆdgå œõtÇÄñ}ƒêd6·Ê>Úl|óò¼Ðpì÷íúâ¡¶ð“C=´M©»é¶—Fê O(¯’F_9 N1RÂ-û½¿mÿ˜Çö¦|¯ö³åõýJ¿®jRi­¦ˆÂµßGlÛ—<0cÇ#޼ý*’x¾Áµ²[åm6>yˆy^h8v{öýqZÆ•ý¨Úyóü¯±Þ%×ÜÝ¿h#oQ޽k7þoÝíûoüÆ?µ3嵟/¯ëúP{î†é¯ìgYVþK[xbU/&Þß{|Ç tÅYiÂ;&ŠÞúw¼2ªE;Z×¥]áº6öñÛÄò£-¼ïÇzzž×á0ÓžÖÒ{X/nšê7•b‚ Ψ§kŒ`ŒuúUkŸžG‚ú„—»$¶!Þ¡v•'Œd~”Ë?\iööŸÙúÁ‚êÚ)`3}œ0xÝËãnx ž¹ü(åߌtËm¤Gu2y+<­Y£t/’úMjjZ­¦›¤É©Ü96Ѩl É`HRE`ßx.;«±r/¤xR)žêÒ;†}¿Ä¥¾ëׂ=«zûOZCØC(€­å«ÂFã  Ãâë13Xê"y%Gmäƒ$‡Êàí#óT¡ñ]ôÚ¯©C¦™•Ô±,|FQn1ÎFN@çÐS-¼ö…n-uA ìwtO°X£Êíeç#¯5¡cá¹-´=_N›P3É©¼Ò<æ »Lˆü óŒgµ9¼Kºwmqqyyl³˜m"ÞUp lÀÉúÕ/Æi6eqsk5ÅåÒË'“eí±£•ÜA<~µno ÎOŸOÔÚÒîÒÔZ4¾Hq,| <ŒÿT³ðuÆŸmd4ýe¡»¶†XsnHŽåñ´ž'®hìþ.ÓâeA{r¢$šV† Ân…ù}&‹ŸiÖ÷RÄÑ]¼H±Mt‘f™±€Íœ÷zŠO Ý¥ÓÏc®\[½Ä1Åtæ0ï.ÎþÁ=GwḒîÕ$N¾™g¹¶òƒ3°ÆpùÈhÏ€-Ýx¯O´Ô¯l¦†ì}…CO0‹1 )¼dƒß îM¾%KèîËN»{Ø_ì’ìÝ[£[n?ûR\øf¹5Ï´\1WXÁU\¶&Ðsžyè)ÞðòèÒË3Im$’(@`²ŽÜ?Ýä“îqí@øcS—Yðý¦£:"I8bU3† uö«YÞÒ¿±4Km7Ïóü€G™³nì’zd㯭hÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYõ=>Þámî/­b™ºFó*±ü ÍZ¯5·ŠÆÒîXõ>)ïd’&y&™Q”€<Â;Ü À(`Á€5Ûhö®ÞKk´•À…ʺFXìRAÈ! ޹â€/ËQ²›˜Dp±Y_xÄdu {­Eý§§}íŸoµû.qçy˳?ïgÁ¥¤1xSU‰\G ¦ºì¢UyP„q&2Júžk:2Æiu©Æ;Q~­ ´2}ŽFò¶±û¹°Øäƒ@6§§ÁoÄ÷ö±Ã/ú¹e ÿBN XóÊów¯—Û³Æ=sé^Gkæ[µ½Åã[ÙÛÌ.š §´i!*Î0‰û¤à‘ìzé­–ê@š¼E ¥Šùè^OµtéÐ[zëaÕ4éà’x/íd†/õ’$ÊU>¤ ?´ôï±ý·íö¿eÎ<ï9vgýìâ¼ÎyôÝMÿµ-ͺD²Û}¢ÂÙ Ùl’ešL 1É€w©üË?øIµü±ÿßÛó»Ê>Vÿ#nüc¦þøë@’×–‹göƺ„[cwœd1뻦)æâlnLшy†RÃnÜgvzcæ¼Æxu |/}äi²I¢™/.bìaTçË%XƒµylÉÇ¥uŒîÿ ei"17öC¤ƒÀˆ€xõþ4ÒFé,k$N®Ž+)È ô Ó«Î|:nõ.4ý3T¿’&Ò³»²ýžë²©ãhÇaÚ¶¼¨]ërÜê—L"H¢¶X™ˆ_1ToLî8ϵu”W)k«iúo‹µõ¿»Š‘­ö8݈‡øÕi¼G{¦Õ'Ýxº³Åä˜À& 1QÓ¡ÀÁê}k±`j7§dþõÀždv”Wg®Ý¶•uruVžd³óelÁ6Òg‘ÆðÇÓ?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰£í3ÿÏ(?ïëñ4nŠ©ö™ÿç”÷õ¿øš>Ó?üòƒþþ·ÿ@誟iŸþyAÿ[ÿ‰¢€+\Ï­´·3¶È¡BîØ' IÀöªqkVr£:­àUBåšÊeL¯?AÍ'ˆÿäZÕëÎoýÖn u;o ÞM-ìm‘1˜!hÞíçù é*îa·xgÚÓÉåÆ0NæÁl~Jk˜Ôåo5K•½º_³_Ú¤Q¬¤ ! 1ÜǃÇ~µ W)q¨é†æâVÔ§(–#m‰BÊlÎÑÆÜdóï@G§ØZI§Àò[ÆÌÈ %zÓ,L&Êm1šƒdŒåË]ǯ֮iò ¶ÿ®b€ìÛùõ‹þù£û6Çþ}bÿ¾jÕWû6Çþ}bÿ¾hþͱÿŸX¿ïšµEUþͱÿŸX¿ïš?³lçÖ/ûæ­Q@³lçÖ/ûæìÛùõ‹þù«TP_ìÛùõ‹þù£û6Çþ}bÿ¾jÕWû6Çþ}bÿ¾hþͱÿŸX¿ïšµEUþͱÿŸX¿ïš?³lçÖ/ûæ­Q@³lçÖ/ûæìÛùõ‹þù«TP_ìÛùõ‹þù£û6Çþ}bÿ¾jÕ”!Š ù’Õb(Çv¨n¯9|‹x¼Ù±¸ŒáTz“V¥ÿ”ßõÍ?›Vd‘¨¿¸Y"ŽG.³"H›B‘Ï¡é‘Uv&ì‰#ÔeŽeKÈQÈQ$o¹rzüªÅÞ¡cc³í·–öÛó³Î•Sv:ã'ž¢²µA  ­¥¤pyƒË‰V0¬Ì{œzBhÖå­u©ørôÝ]ýœ&’°UQ缊àç ñ9=zV׉  €3y–ÛA8ù©ßµjZj6ÌËe{mpTe„2«ãëƒV«šÔàÔ£[½jqmm5„âÌ„±ËQ6Œ w¨%¼ÖÍä–V÷I4v©:0X”HÌ[¨oàåçÔô ²™±Ì›á‘$L‘¹H# àÀ‚+jwßÚGJy¹–xåF Ø înØ8*ÉŸö…Ce¨^ÞIihnͰ”Ý»L‘¦æòæ*ª2èrxÏÔQ\t~!¼:müó\ÇE¦bmªHT3×vÄ8éÍhÛè5HžöyÅœÒG&MÌ m¼ÙäqÓ¥t5‘¼Â‘Äò;JŒg8êG¡©* ¡æ¸Rå"2ny»PîŸþ}%ÿ¾“ÿЦ­Ô 2UDä÷ 3êpÔ¶è¢h°±œ¶¬¸üsÇJçu3iÞî‰)»M­"Qû©:€F:èeº¶„È&¸Š3yŽÀÚ¼üÇÐpyö©«Ô¦¿²½Ö§šâ¹IGGŠ Š0òc*ÌÙçÿÕSê:µÒÉzé~mšÚöhí¡ó¶NàIÈfÆ1Ò€:Tš)ž9Q• V*Ùƒ‚¸"›Õ½Æ<‰ã“(²|ŒÊßtý>•Ê[Mykó¥Ïú=Æ©wA°c•³ž¹Êúãª; Rê×J‚(äTAe§"¹Qû¯0•f>¼×Ö€;)%Ž2‹$ІFÚŽ7êp ü)õÆÜOuu¨Çlš‹Mö}Y#ŠfD%snå¾èIê*{ ïnu½à–%m¿LŽ)þLŸóõ7äŸüMLŸóõ7äŸüM(·€L³cªln éŸOjŽ]>ÆhYÛÉbâ6‰J†$’q޹$þ4ÿ&Oùú›òOþ&&Oùú›òOþ&€.Ÿc1S5•¼…Æ»âSµHÁQÇLv iö"è] +qp:Kå.ÿN¸Í?É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ª­ÖVÝæLŒf9Y2=ðhòdÿŸ©¿$ÿâhòdÿŸ©¿$ÿâh?±ùù¼ÿÀ—ÿZÀ#‰ Hº=À‡dz?<™?çêoÉ?øš<™?çêoÉ?øš%µ¶˜Èf·ŠC"ynYܼü§Ôrx÷¬ÛÍÞêyä¶òã|¶ JBÁL™û¹µiy2ÏÔß’ñ4y2ÏÔß’ñ4}’Û}š2°pç9o©ÉçÜÕ{:'´xmbµ„º,g}¸t(½®F@ÉÀÏ«LŸóõ7äŸüMLŸóõ7äŸüMRÒôxlQÌ‚eiD¹XB*¡Åçh 1×<ŸZ¹ö;MÈße‡r9‘O–2¬z°ô''&—É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øššŠ‡É“þ~¦ü“ÿ‰£É“þ~¦ü“ÿ‰  ¨¨|™?çêoÉ?øš<™?çêoÉ?øšŽïO´¼`×`0 ÈÈqÿ"«L>D‡ëq!ÿÙªç“'üýMù'ÿG“'üýMù'ÿRãº4UjEYIý䈪ˆ¨€*¨Ø *†¥$ö–ë$wI}¿2¯¡ö¢¨Ì·gÿP×5þUÍÁm-Æ›ª^®¡{Ô7W>[ý¥Ê(Gm£a;qÆ1Ž•ÒYÿÇ”õÍ•fÂ=YâkûÓkq+Ë%¾äÅØ– ôÝ@ï\Ím[جҭ”wW˳nðHUàäðzà{ÓG‰šBòÁb^Î9 F˜Ë‚Dª…H\rG˜23øö«÷z42´‘Ï=±x„2 " àƒŒdò0yëMþÁ³O9¥†BªGËå ?v¿­Uµñ,W7ñÀ‘!ŠIÚa.dr7Ç JžsÜq[ÕŸo¥-­Á{k»˜ái †Ü1î''ªî’NÅhPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPn»ÿIÿ]ò4Q®ÿÇ’×AüŽ.nB¬ò€x£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€µÜÿÏÄß÷Ù£íw?óñ7ýöh¢€$óH»d•Üg8f&Š( ÿÙ endstream endobj 11 0 obj << /Length 12 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 652.6 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.8 0 Td <18> Tj 5.9 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <22> Tj 3.8 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <14> Tj 7.7 0 Td <17> Tj 3.7 0 Td <18> Tj 6.1 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1F> Tj 6.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <03> Tj 6.9 0 Td <13> Tj 7.7 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 313.5 Td /F2 12 Tf <41> Tj 9.7 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <17> Tj 3.7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <1F> Tj 6.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <03> Tj 6.9 0 Td <13> Tj 7.7 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1F> Tj 6.5 0 Td <1B> Tj 7.6 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 299.5 Td /F2 12 Tf <26> Tj 9.1 0 Td <22> Tj 3.8 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1C> Tj 7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <11> Tj 7.5 0 Td <02> Tj 7.6 0 Td <19> Tj 4.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.3 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <3A> Tj 6 0 Td <05> Tj 8.5 0 Td <14> Tj 7.6 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <25> Tj 8.2 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 9.9 0 Td <04> Tj 3.7 0 Td <0E> Tj 9.5 0 Td <03> Tj 7 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <3D> Tj 5.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <13> Tj 7.3 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.1 0 Td <1F> Tj 6.7 0 Td <03> Tj 7 0 Td <03> Tj 6.9 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 285.4 Td /F2 12 Tf <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <07> Tj 5.7 0 Td <02> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <18> Tj 6.1 0 Td <27> Tj ET Q q 0 0 0 rg BT 125.5 257.3 Td /F2 12 Tf <25> Tj 8.3 0 Td <17> Tj 3.7 0 Td <22> Tj 3.8 0 Td <22> Tj 3.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <40> Tj 7.6 0 Td <02> Tj 7.7 0 Td <17> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <03> Tj 7.1 0 Td <22> Tj 3.8 0 Td <14> Tj 7.5 0 Td <18> Tj 6.1 0 Td <27> Tj 3.7 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <05> Tj 8.5 0 Td <21> Tj 4.3 0 Td <19> Tj 4.8 0 Td <03> Tj 6.9 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <21> Tj 4.5 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <22> Tj 3.9 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.5 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <03> Tj 7.1 0 Td <22> Tj 3.8 0 Td <14> Tj 7.6 0 Td <2C> Tj ET Q q 0 0 0 rg BT 90 243.3 Td /F2 12 Tf <1F> Tj 6.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1C> Tj 7.1 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <02> Tj 7.6 0 Td <19> Tj 4.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.2 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.8 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <14> Tj 7.7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <02> Tj 7.6 0 Td <19> Tj 4.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <13> Tj 7.3 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1C> Tj 7.2 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <2C> Tj ET Q q 0 0 0 rg BT 90 229.2 Td /F2 12 Tf <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.3 0 Td <04> Tj 3.8 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <11> Tj 7.5 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <18> Tj 6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <23> Tj 7.6 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <0E> Tj 9.5 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <38> Tj 3.2 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <23> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1C> Tj 7.1 0 Td <04> Tj 3.7 0 Td <3A> Tj 6.1 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <19> Tj 4.6 0 Td <3D> Tj ET Q q 0 0 0 rg BT 90 215.2 Td /F2 12 Tf <1A> Tj 7.1 0 Td <21> Tj 4.4 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <03> Tj 7.1 0 Td <1A> Tj 7 0 Td <1F> Tj 6.7 0 Td <1B> Tj 7.4 0 Td <04> Tj 3.7 0 Td <21> Tj 4.5 0 Td <17> Tj 3.8 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <14> Tj 7.6 0 Td <27> Tj 3.7 0 Td <04> Tj 3.7 0 Td <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <17> Tj 3.8 0 Td <20> Tj 11.3 0 Td <02> Tj 7.5 0 Td <20> Tj 11.1 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <40> Tj 7.6 0 Td <02> Tj 7.7 0 Td <17> Tj 3.8 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <2117> Tj 8.2 0 Td <0322> Tj 10.9 0 Td <14> Tj 7.6 0 Td <18> Tj 6 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 187.1 Td /F2 12 Tf <0E> Tj 9.5 0 Td <03> Tj 7 0 Td <2F> Tj 6.6 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <0A> Tj 3.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <02> Tj 7.6 0 Td <18> Tj 6.1 0 Td <03> Tj 7.1 0 Td <21> Tj 4.3 0 Td <02> Tj 7.7 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <20> Tj 11.3 0 Td <03> Tj 6.9 0 Td <2C> Tj 3.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.7 0 Td <1D> Tj 7.1 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <13> Tj 7.5 0 Td <1A> Tj 7.1 0 Td <20> Tj 11.2 0 Td <03> Tj 6.7 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj ET Q q 0 0 0 rg BT 90 173 Td /F2 12 Tf <07> Tj 5.7 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.2 0 Td <20> Tj 11.3 0 Td <03> Tj 6.9 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 144.9 Td /F2 12 Tf <0D> Tj 8 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.8 0 Td <0A> Tj 3.7 0 Td <04> Tj 3.7 0 Td <0F> Tj 7.6 0 Td <0B> Tj 7.5 0 Td <10> Tj 7.5 0 Td <10> Tj 7.3 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.7 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.6 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.7 0 Td <22> Tj 3.7 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 130.9 Td /F2 12 Tf <18> Tj 6.1 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <14> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <2122> Tj 8.2 0 Td <1D> Tj 7.2 0 Td <15> Tj 10.1 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.8 0 Td <0F> Tj 7.5 0 Td <0B> Tj 7.6 0 Td <10> Tj 7.4 0 Td <10> Tj 7.6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.2 0 Td <07> Tj 5.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <02> Tj 7.7 0 Td <22> Tj 3.7 0 Td <19> Tj 4.8 0 Td <17> Tj 3.7 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <19> Tj ET Q q 0 0 0 rg BT 90 116.8 Td /F2 12 Tf <12> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.8 0 Td <1C> Tj 7.2 0 Td <03> Tj 7 0 Td <03> Tj 6.9 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <06> Tj 7.6 0 Td <1A> Tj 7 0 Td <07> Tj 5.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <14> Tj 7.7 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <21> Tj 4.4 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.8 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <27> Tj 3.6 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 88.7 Td /F2 12 Tf <2E> Tj 10.4 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.6 0 Td <14> Tj 7.6 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <18> Tj 6.1 0 Td <18> Tj 6 0 Td <0A> Tj 3.8 0 Td <04> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <21> Tj 4.4 0 Td <1A> Tj 7 0 Td <1F> Tj 6.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.6 0 Td <14> Tj 7.6 0 Td <07> Tj 5.6 0 Td <03> Tj 7.1 0 Td <18> Tj 6 0 Td <18> Tj 6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <37> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <02> Tj 7.6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.7 0 Td <11> Tj 7.5 0 Td <13> Tj 7.6 0 Td <03> Tj 6.9 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj ET Q Q q 120.2 335.7 371.8 297.1 re W* n q 371.8 0 0 507.3 120.2 184.4 cm /Im13 Do Q Q endstream endobj 12 0 obj 15448 endobj 13 0 obj << /Type /XObject /Subtype /Image /Width 1050 /Height 839 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 63598 >> stream ÿØÿàJFIFÿÛC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÛC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÀG"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ï袹]%í®nî…Ôº³Ü ù‘J=×”…_?ZꨮR=emî–öO<[Åixí”ÈX¤ê¹çñÇ 8éZºF³ý£s-»E¼h²Š_1H$Œgc§¸æ€5¨¢Š(®OÂÏkua§Ë4ºÄ—ŒŠÌî÷^[7^Iùý*{ÍZâêM>h#òìšùãÞ&!åÚ’‚ ÷r¤õì8 –ŠÀÑ5;»»Ø ¢Ú6À/3<€¾î¤˜ñ޽³ß~€ (®dÞ\Ái¨i^|†ð\ˆmäf%¶Jr­ŸöAoûâ€:j+ž}r+¸„#>ÛötóîÒDJÅ‹vŒvóõ4‰â€Ñ;}Œ—ò£Q&D²,6©ÇBY0Úé@›¥j˪a‹lb¤,[£8'n1Øcó­*(¦O'•’ãvÅ-\ ç-Þm×TÖ5‹ˆ$»E“ÌûcBˆXd*®Bð=AÐ~di#OÞ|Ÿ!ýò ýžb/C ´Óå’irÁ‘€M‘¸'ËGlíš>6àÃ<À–š•[3éÖ/qn‘ªÍöq¸)²ÃÉ$`sYvþº·ðôzZË HçÌeo:# 8¶¶ÌûÉŒŒ*ëC©ÜLÐíѵŽUFóÊP€'r—ÜÎÆr3Y:F¾Éá/dŠYÌ0[ÄY™Œ’Ìá*`2ês‚Ì !HÚX‡O—KhîÏŸo<­"Èð$×åU„`Í—/ˆ”«Ø TðKt}UƒN†Êâ;hág´žGó‰‘á6ÚrÐã;ºóŒ |Ï*ÇyhÖcÊšY$—z ù|꤮%ê@ÁSÔsMÑõë½YVXt½°+Ì´ 2(äùF9Ûæsœp27´W‡DÔÒÖÚ, ?²BñÊÙ¸]Ñ’Xí"V,ew¼r£&áë‹Mcí׆ i˜ò¼eÒgÉ$ÜnÈÈ#€ÑjMb{hµ)dµižÞþ+d‰%S¸?”ÒUpyœyÈÝŒ`Mjî[£aŒPF1䈀U‰°’q2q´ ÈW=ÚK$1Z )¯-®I20ˆ¼¡±P)bŽGÞÆ8ÉуJ°ÓüÉ´½2Æ‚…T¤KîûK*ä Øý*;M^KĶšßI¾k{”ŽEŸt!B¸$y›¸Ï`Àoß!ÆHê7§[N¼’ì\G<+Å´¾Tª½2U\mb#k¯P9ÏÔ€ZˆH"A3+Hoe] žä œlšuPEPEPEP\ƧotuW·´í¹½¶¹‘ј6Æ‹,³Ø€,u†âTãï-tõ“>±$W²¢Ú«ZÁq¬²pâI6mÚ›pW÷©’X½ÁÀÈrønâ-?H‚l§Ú…e\…’Q,ztce±Ÿ›8=)ÇÃ÷wZ˜¾º’Yåó¤Ž62*öÅT ‹c“‚Ý3OƒÄÒ½¬óéÞI¾%µO<6K"Ÿû[‹;f?ٲܸFV6² ¬!·õÁýÓ 1@u%– tÑí­¡ò7XäkcâU•X‘’Œ¥XàŸ»ƒ<:&˜­ Òéº{]D©‰’ÕT‚ W©P002pªr^\i:lM¥ÎÙ–÷…²ÿ·" -–$œ²áV¯ û“s¯íÿnOÓü(ÛþÜŸ§øPPðý²<«›¨Ì"Uܬ¹e‘·2ž:g¸Á÷¤‹ÃÖ±ÚKmçÜ2Kd,‰f\ˆÆìcŽ 9öùÖÛþÜŸ§øQ·ý¹?Oð  i1Û¬ëiuqn'`äFW é©÷íSiÖéñJ±¼’4Òdy1–bÏÀ«;Û“ôÿ 6ÿ·'éþêŠâW†’8$†1eC7=·?Z~ßöäý?¿íÉú…cYÛ‡‚ãO›H¿K{Ç•åyÞ£y,GÈäã'üjFðõ´¡ÍÕÍÕÄ¥YwDƒ ¸œ€rrN9­]¿íÉú…Û“ôÿ Ì‹B·Kļ’ââk¥“Ì2¹\·ÈÈ€ãsRÚiko|o%º¸¹ŸËò•¥Ùò®AÇÊ£<×5{oûr~ŸáFßöäý?€E7oûr~ŸáFßöäý?€0N4ÛÛì]WʼišCæ[na%±ûÏsжšožc»ït냉Ô4e™TœneîH#ž ÔÛþÜŸ§øQ·ý¹?Oð  [Ý ÞHÎæhØß‹©¤Ê–_ܘþ\©ÝêSZV1XBñÆÎí#™$‘ÎYØõ'ztô«Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþê)»Û“ôÿ 6ÿ·'éþêÍÕ?ä!£×ã艫Coûr~ŸáYژơ£üÌÓ®?焾ÔwRÓ[R´…3hÊŒIŽîÔ\FO®Ü‚sƒœ`œƒÆ$³Ñ,lôô²HÙ£V…Ég9fˆ F8î<´éÇNMTÕVY%³VæxJJÍmir ™˜ÚùÞ„ª‚ÀÝ]x=FVÚ­Ö«,÷ÒNóÙÔ#(ñÁç0AÁt™ÎBHÚrh CÓc?, @e(­+°k8Eܪv®Ê0 ¡é¤4¶w[Êð‘òª` …Úˆ6Ž>Pq‘\êÇ©KooPJë êd´ËûÓ<;¼²x ·ÏÉ‹åǶډ“_0E£=Ü1£5–¥&S-ä2¹]í? ”ÛÙ@í¢Ž8bH¡EŽ4P¨Š0€³­4ý*ëM¶{X³lÖ±Ç u&!†¾r¼'æRIh´²¿d¶šçV¾3,>\Y€³…$dƒœ1ÆNJÁ±‹W¶ð¤VÄ\ÇvÖ¶ÛYQÊÇ ì.ÀC,Š¥òÞÝTä@ »DP­‹@­¾vo!7[ŸŒ9,Á÷€ »Æ:bÖ—¦[iV‹mjhT ÌÙ.U=³µ¦ƒ¦NÚX%žõJαA.ërAò°åev¢°pY²ÃÊ¥H£Âv÷w–QÞÞÞê‚Û´;¥;xKœ3n9ÁÉ[&€6bÓ4Ó-ÞÍÒ<· 4ênñ*muà·ÊFàc€£¦*-ODŽð1‰m3,¾l©wmöˆÝ¶ªÚH!‚¨ƒŒIÈÎÞK¯«êQ7ö¥¹ŠB’ec-r…ÁAð2 vÚFY,7i}-› BâÊ)_É‚+Ãî<¸HpìêΊÍ(?1å”c´£°´ŽÃO¶²„³GoÄ…ŽI ÷⩯‡ôÅrÂNPƪn$+’­ˆ×v#ÁE#n1´cªú4w·Úf›¨Í«Ý†šÞd…RŒJ)oùg»ç8=øÅbi£^¶²Ap—Ò,Ö_7šò;'Ëo–8;÷+Irv‚¶íøLD+2ÄYÌ$W$ŒÄ(b]X1ÎÕ'žHäóR M\í³‰~tmÚSËÛŒtºÁÚ8®wH¶Õ.ïÖÚþmI,£óöe‡Ì\[”Ëg´„e÷pTà@Ñ>»,ºUÃÇv—!mÊ"”‡FÙæ»a„jAgR¥ÆÝÜ è£ÐôØÏËJ+Jì#ÚÁÀ@Nw*«òŒW!·Š'’$Ú×$ä͵W>Ü*¸ƗV ïv&¹³2Ïpfóã¸Û$!ä…UË*ìyà bæ›e}sum Íæ¤Ö;.!e·ÝÌ;T–v|Þa˜7“‚ÖQM‰"DiFU»c,}Nú)ÔQEQEQEV=þ„·ú¬Ws5³,OŠZÕLèQƒIsÂ’2AüÍÈÈÆÅsœ×pj¯:ý¦L^ÛD’Ãp<˜#v‰Z9#Ü2Çsœìc‡S‘´`èÚy‚ ¿Ém‘ÎÙDÊžscB¨*4C£iðº8·Þéœ<®Ò1$£d–$±Ìi‚rFÑŒb¹ØaÕíôÍ4ùº”¯qd~]pðnuF´Ã †lg– Ûê—°¥›jBÄ;ù^d²£yE­ƒï.Cgçnï˜u^Šh ‡CÓ`hLP2¬ c¾Ã°¥“;Y€ †`Oʼð0éôý6;[ÿ>(£‚éíL[h(AÝ“Ÿ”rÇŒrÌz’O7aý»=õ”÷×qÎËnÂ1k. yheÜC¬Jwy¹¥Çoà-õ¦­s ßZHnÃYé²Ûny½ôlä•OsûæPC)  Ó†·Ê á¢b¹V’ÞXÉÁ*qµÀ#iÁàü§ÐÕø£Ž’(Qc*"Œ °¬rˆl­PÝjìf,ê™OecnÔã 0R ¸¶¯Ãeví ïªj¨ZÝÖ ÈbòyÎÖÆIÆ(] KE·T´Uê«‚˜Êäçæ#É““…¥:mÆlæ9c%ÚMÐÎñ0-Ø*A ‚y#<Ö$}ððÅŒ’]jyp¶‹t­3‡Á’=ý0Pªî® -“ÍixgûHYÍ­æùèéËóɆ6|„y'NA€aÑì`žÒhc•γÀïµcÆ1·8=$ÀôjÖÞ+KXmmÓd0¢Çäœ('ž‚¥¢€ (¢€(T771Û gÉf8DQ–sè>ft†F7º©*¹ÆãŽdÛÊ® ÃIæLß+1Ùê€ó=ëÕ}š1­W٢ݥÅËßË Ç–”²*§;rX`žçå«ÕÏÝ4/ƒ-¼2²Œñ8ôÉôiF?í8<¨b‡1˸Fs‚˜Î?Æ–#™¨´aKv£c ¢ ½’â+Id³·[‰Õr‘4›ûnÁÁÿ;›ë±I'"&ö ÛwÛ·×Øv—j+–d¶•Ôá• ßÛÐ ¾Lƒþðª¤F:Çýð(Ôsâ)° aÑ¿úþÕ=eI)bF7nê [±™ä ­–Uû®{û{ãÖ€-QPÝK,04Ãç2òSv Ü~”øZF‰ZT¹¨mØüh'• ‚I¤8HÔ³a\ÜÚ—(Þ,nO-Ç–ØA'×'ð­MsÌšc)ó”³1”¦Ð¬¾Šzæ²­`6wQF¶v¾làª8˜¶ÁÜà¨ÏÓ<×e¨Ç«œ•¥Í.Dì[‰î£‚åБÒbe_®IÎUýÈlÙe•åd–EÞç$áÍ`=ÓiñRêÒ_,ž݉f=q‡Çô®N·{{b%uwwg,«´|Äž™>´b9ytê,:š“RzêœÓHXËm'§—>ÞÕr³-Ì™‡ÉûûF?.þÕÆv,Ç f'Ð;gùÕ«køG9'î·÷¿úõb_»/Ù¶yø±Ö²íúD}~ÿ¡  Z†âuAgc„AÕMYº¼R¹¶kgòçÊ­ÛI Žàí2æ³åÜj×ÔŽErwË<¦SÉòåeEö¦©ÿëU(µK‹iüæy&°<àQýñÈöôæ¬[Eq~æ á…Ç›ƒþ€z9«V’éwW×u¼åçŒnuÚØM¿)Á#MrahÕMʳױ¥IÇE_FW@èÁ•†A¨®óäpHË È8<°ªº5»[Eq˜Z1q 1ÂÄ`{qV®ÿÔúèŸú®Ó"yl­¢ ^KŸ˜à#±'¯Aô¦-µ›8O6éIé½ä\þufñ¶Ëhé±ÿЪêm›yY_nž€ôе’݉ÿ³aÿž—÷ù¿ÆìØç¥Çýþoñ«QbRz‘\Ëkv:άZÝç´KÛx‹´Øò„‰€«ƒŸ™²G{ÔnfÃÿ=.?ïóÙ°ÿÏKûüßãXkšÓý—6Ö_½Õ%´?¾oº¾gs¹×¾: ñn?ÎÓƒ&›²Ìß5ç‚w‡(Ü}Ò@ïÆ{õ  OìØç¥Çýþoñ£û6ùéqÿ›üjµÜ×2Í¥Ú°ò&šO6uŽBv¢ ‘»#qAÐdɽ–æMuT½¹ŒË}Æ©! bi‘} sÆXÐÿöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5‘©ïu}FÜ]Ü[¥’K•!LÈåþc¼ÁÁÈäñZv2>« ZM$’B÷VñÈÍÚÊHãÓÒ€$þ͇þz\ßæÿ?³aÿž—÷ù¿Æ¹ë;»«­Ã6ò\ÌP*'˜HC°3‘¸r *G=kSC¹•mµ(ey&7RE;nfPªàÜØÉô  ¿Ù°ÿÏKûüßãGöl?óÒãþÿ7ø×?¤Ouø~êK¹æmZ6k„y &3 *§…Æ6ñ޼ÕïÆâ%{+›¥Ô¥!-"Žf X’P©`x  /ìØç¥Çýþoñ£û6ùéqÿ›ükÕ.®¼½sSK©ã}.eH"YBÛrômÛˆç§ÅYÓU­uß/SþÑ[›‹‰ÚÙÚíž s¡à„pTtã¥lÿfÃÿ=.?ïóÙ°ÿÏKûüßãYúñ—û]\[ß ã‰ŽÆå€ˆêH*X z¥g+Ýj-,M©Mþ‡¥Ã2Mo!A,®ù‡Ü>AÁã“Åt?Ù°ÿÏKûüßãGöl?óÒãþÿ7ø×"š¥íö‡¯µÄñMf°´P¤…SýTr0eèÛ‹‘ÏN1йÕוo¬©üɵSlЙ–"óLAvtÈÀlã9ö ‹û6ùéqÿ›ühþ͇þz\ßæÿ‹C’K›'¼‘Ù…Ô¯,`œ…8Lz ©5£@ÿ³aÿž—÷ù¿ÆìØç¥Çýþoñ«”P?ìØç¥Çýþoñ£û6ùéqÿ›üjåOû6ùéqÿ›ühþ͇þz\ßæÿ¹ESþ͇þz\ßæÿ?³aÿž—÷ù¿Æ®Q@ÿ³aÿž—÷ù¿ÆìØç¥Çýþoñ«”P?ìØç¥Çýþoñ£û6ùéqÿ›üjåOû6ùéqÿ›ühþ͇þz\ßæÿ¹ESþ͇þz\ßæÿ?³aÿž—÷ù¿Æ®Q@ÿ³aÿž—÷ù¿ÆìØç¥Çýþoñ«”P?ìØç¥Çýþoñ£û6ùéqÿ›üjåOû6ùéqÿ›ühþ͇þz\ßæÿ¹ESþ͇þz\ßæÿ?³aÿž—÷ù¿Æ®Q@ÿ³aÿž—÷ù¿ÆìØç¥Çýþoñ«”P?ìØç¥Çýþoñ£û6ùéqÿ›üjåOû6ùéqÿ›ühþ͇þz\ßæÿ¹ESþ͇þz\ßæÿ?³aÿž—÷ù¿Æ®Q@ÿ³aÿž—÷ù¿ÆìØç¥Çýþoñ«”P?ìØç¥Çýþoñ£û6ùéqÿ›üjåOû6ùéqÿ›ühþ͇þz\ßæÿ¹ESþ͇þz\ßæÿ?³aÿž—÷ù¿Æ®Q@ÿ³aÿž—÷ù¿ÆìØç¥Çýþoñ«”P?ìØç¥Çýþoñ£û6ùéqÿ›üjåOû6ùéqÿ›ük3V´ŽÞÿFtyI7Œ>y õzÖýdk¿ñ÷£×ëé<ÔíI´³i :­²Ý+1d‡ì¦àäpX"©8Æq¸õ$zî—-×Ùâ»Yr©(¥PÉ–h m$á$UµH.ZÜÚEve]<ËGˆHªÅIeù ’£'ï8&¡Ó<;%®‹”×+æy¶“9UÈ„2“×½ÓŠº|A¦,o!š]«·iû<Ÿ½ ÁAåýàË(Êd|Ëê)Ç\Ó|¥’9Ú`Ì@X"y\㪠ۆS»!”ç 3A<7&ËH¥½VŽÁcŽÔ,8"4’'ÃÇs%F@P2N@|nŠ‚'¶›ÊÂÆ·Ö¢t åE+•Ë~åNî>ó w  hõÝ.K¯³¥Ú³–U)ØÅ”2á±´‚9tX&¹¦º» Ø*®å-(ÈÇ‘ûÀIP6g%—ûÃ4…¡YD‹rÁ–X– O³ä¸?f0ãÇ>µŠÍíqb"$e,T3…uaç“'(¹`9n9@'Õu]"â;(®ìúî3–R;BË6Le Œ` VÜ8µšõ«‡ñ¼ 7!‡”pq´ýîyÈボŒèt·´…m¤´‚æƒp†1!ŠÈòÕ#k­œóœ µhé÷?ÚöwŸlWŽÞÝàexrò*Knr‹À\uõm¿ˆt«˜ ðÝn`‘[Ëqæ@ù8ùÎHR$1 FN*Liºå®&·Šæ$~b¹ƒ”p;£Œ©ÁÏ pAèk:}£Ó´øÑšáôû1nª˜Fv Rr![å$€H«^´º·Žö[Ã9{«4} Çæ€#Dù¼¿“9CŒvÆyÍkQEQE½•¥¬³Kmk2NÛ¥xã d<òÄu<ž¾¦§¢Š(¢Š(¢Š(¢Š(¢Š+2yôq¬ÆÓC_Gˆ–àÛ–ò‹tC.0¤îáIï|Ã:uÎêZmäú®Ûd¹Žn ¹‘–HŒå²\0ób0_—…$òØ¿oâ*æ<7[£Ø$VòÜy€>N>s’…É B‘“ŠÄbyaæ•ZMØCo pWnC.Ü©;Ó€[zã9ªÞÍž›»Ãiö« 7—Ã:¼.¬Fzf•Ï žGZ‡<ÛÕ¼¼»ß16O*=ŠÎ¸± udç'‘À  ÃYÓÌñÄ—ü͸‘š,°A  œ®9;—F[½£Êq©i;nUÛ Ë!Ë0AÂäãs(ÏNk.ÇÂPÙÍlû­%1,;å’ÉZmÑ¢ ØäŠv/$e°A ëëHﬥµ”²¬‹€èpÈz†SÙÁ±Ðyõ‹$’&’W–7òÚ8 y\ªÇåPNtÉè7œšh¾‘õ«Ha’ l®¬äFI*Ñ€CgH“Ó·^j£\Bñ]ZÞD/‡›æË4ÖO0«7ʈ«–8QŽx!ÖÚ<–—ºkÛÝ/Ùl,Í â˸;yÞvŸÃëê0,ºæ› ­½ÃÎÆ;˜„Ðí‰Øº–EP3’dAŒgŸ­\Ó|¥’9Ú`Ì@X"y\㪠ۆS»!”ç 3œ¾—u’¾£ºH Œ@%†A“œ–"Àä£1[¢ ‰í¦ò°±­õ¨yQGÊårß¹S»¼Ãè`kzAž8©bf“nÈþЛ›pp3“F=r)©®i®®Âv «¹KDàJ21ä~ðT ™ÉeþðÍËXÖÖt9X‘Q~U^ÇE {VLz%ÊéÑØ6 ¦ÞÕbª°`ƒ+!î;ÈØ íØ-ê6€Xoi‹å†šQ$›¶Ãöy<ÒWnáåíÝœ:œc;NîœÖŒRG4I,.²FêNCЃÜV]Ž$§ö”÷K-ìžhH¶!,!¨,Ha^ 9$ž:UÍ.Ïû?J³±ó<ϳ@ïÆ7mP3ŽÝ(*¡§ùÄÏlÂ;Œ`“÷dþ=E\óÑ¿ï“G˜¾ÿ|š™EIY“()«3ŸÓíÝüðÝ­Ä^Lkò @$¶z{sZöÚm½¬âhÌ¥À#/#7ê}ªÎõÎpÙÿpÑæ/£ß&¢ÁÓ£-µî>Šg˜¾ÿ|š<ÅôoûäÖ¦Á,k*pH>‡VæÒ4¶•դܨHýãz}jט¾ÿ|š<ÅôoûàÐ}½³\î ÆyÇvÿëV’¨EF¦ù‹èß÷Á£Ì_Fÿ¾M>Šg˜¾ÿ|š<ÅôoûäÐv«ç‹Ëcone-‰“©%'ð5Bà¦;›iW=Q¡2©úÒº1}þø4y‹èß÷Á­á]Á%cž¦3w{œíŽ˜³Lž]ªÃ °fcBøä uÆyçÓ¥t€``S|ÅôoûàÑæ/£ß&¢¥GQÝšS¦©«!õFx"-ÛGM½Wÿ­VüÅôoûäÑæ/£ß³42À‘[r™=HFÏò«–¶Ûpî0GÝŸýz±æ/£ß1}þø4ú‚îš51¶Ù#mÈOLàŽ}°H©<ÅôoûäÑæ/£ß&€*Ù^Á •n˜C/Fëß‘ê+#Jͦ»wz-æt”ÊjàÎëŽÂºÑ“’„ýPÿ…ÐtVðþî+ØÈÎ¥KÊïƒØ'úÓîÿÔúèŸú©<ÅôoûàÒ9Ô«¡e=ABGò¤2Õí¼— •"£ÆûÁeÜÊF:Z¥.›y,nsn©RDMžF?½Mò-?çÙ?ïÏÿZ"Óþ}“þüÿõª”ÚØVLÖEÚŠ§°ÅgÏ¢ZÏöÍòL>Ùé,’_ÜÌè·ó]En ùjLŒÊÜ.âyÎ #5?‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@—J¸o=–ñšSgöheÊNw9À'åèݧê,wº|+uqmoÌ,;9ØT®w)èTtǾj/"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€y¡ÅxCÉwt²˜>Ï4‘²©ž?Fùp:žT2qаºy'K{˘V@ì"  e ŽsžµSÈ´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ A•o§‹Ë·[WW¶•Šo„¨ÀÁ ã=AÎMX³Òc³hŒW7'kHòa‰Ýñ–~9#cU"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€|;m]]ªÇÇl»×¡ú”㯦ìã§JYô#%ø½UÔ ˜@°e G*‰$òq׊O"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€$»Ð­n®ä™åRfFža²b˜Ú[Œö‚2ÎjEÒêI}quspñ0¤…BC»ƒ€ª ãŽIâ«ùŸóìŸ÷çÿ­G‘iÿ>Éÿ~úÔbçL{›HíÎ¥zP¤Œ…7L3»+×ÝqÔÔ7>´™cHežÕVÜZ°€ßè‡ ôç‘ƒÉæ›äZϲߟþµE§üû'ýùÿëP¦ðõ”³3+Í2y~m¼dåÙ»†3ÀpF@ÍEyáØåµ½ÌÑ—wš8‰(æ`G™Œg9$ã8Ï8§ùŸóìŸ÷çÿ­G‘iÿ>Éÿ~úÔ«)oo ±Ä¡z0)õäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅäZϲߟþµE§üû'ýùÿëPÅdk¿ñ÷£×ëé<ÔžE§üû'ýùÿëUøàMKG1B¨~Ö܈öÿË }¨æ©©Ib-cV–QÊ®Íuv¹Œ+„ûËó6âG=ðzŠV>!¿¼„_ùÑÙùö±y3HÞzB~÷m2ç8;‡\díMh÷0Äb½¹´tÈß Sz‚®¬§ çˆÉËíôë+[Tµ‚Ú%…6aJç” ’y$\ÏÊ=(Ÿm{Sû%Œ£ì›µ8¢š ÂØ· ,(U¾ÞOÔlåzsÄpxŸT¿Žì,TÜJ¦RUDSˆ@6´‘ò<õRwu\íù°½$zm„O+Çcl3‰%e‰A‘ÁܸäƒÈ'¿4Ù,tíFÜ‹&ŽfžÜd¶ÐaÛp9ŠçáñEë߯’Al!‘â·• -ÁùÁÚß5Ð ŒFG;²­‡Äº»X­Ôºr…»Š9-1‚ ÉšL€y äˆÇnùz@,¤ºž×ˉ¦]ĪcêrB98Á9‹Žãhö¦Ãc§¼X¬`C;m¹ÿG &$dî8ùÇÌyäd‘×4‚÷ºÝ̺lfH,îýá4aƒ³³È’£ý’Ä“µ¸éZÿji5û%ŠX¤´¸²–T(X䇋œ†ÚÀ‡ã#гý›aö°}†Ûìóïå/—×?wëÏÖ¨Ü]éˬ‰¤Ó¼É­Ý-šûÊCä»ãjdüù‹÷A?'®3añ¦ºuÍÔv¯¬ÖáLjÛmÆè•É?2.ò>]¡HÉûÂ_ßÃ7Ø›¨}žs Ü%ÃEŸ"8*Éýò§ž«žørØ[¼ Kösyp¼+D¹ ÆÊ¯ËÐàâ‹ %²I{,ÒÌþd²Ë·s¶‚B€ʪ8§®MQŠþþ[É·µŒÚϼÑ9b]Ù²²dÌ€Sæ#¨Ýòæ·ˆ54´±œGi+jQE<•d–(Í“¸âo¼Á\í9Àè$µ²mJ+‰-"kÅCåÎaË"Žߎ>ñã<äûÔSZéZ|w²Z[BŸññq"Â2Åýí– äŽù  -Jâþò{]>kkÏ+Q0N²3EÿèÆU~ìòOÌŠ{ü»;¤ƒ_²³V͹²”¨frá‘â$¶!‡$d`óó¹$VѰ™­Ô¹”6å‹so ns´àžË׊ÊÑïRõí`k¨×jNcÔsÀn r3@:n¿wyp¶ñ6Ÿqu-»NmD†&´*È rŸœîùÈÎÕåñ.¥&¶×J‡´²’KÇFU/pŽ<‰gý_—vœñƒ£i¦-µÐ¸{«›–D1Ãç2Ÿ) ¨ ÙÚ¼±còõäæ=JûJx!†õbºµºC)%‘yjW÷Ûh,œóŒç $U}fá§–âÙížÆ¨-¶…,Òù¢,H®8q´çoQž 3P¸Ô~ËüvÒÛê–Mr‘,dyiòf7É!ò%8_ºxç€jz<Ú͉’Â_í)`ÜŽlËInß‘ØPâQ‘œyÆá4Ól#ûO—cl¿kÏÚ6Ä£ÎÎs¿›©ëêh·†?äUÒ?ëÊýVEmmoiÁiPB™ÛHFNNã©©h¢ŠlR,±$Š+¨`JœPyØó@¢Š(®~û]’ÓW6ï5¤j.!-dâk!Aæ!Ü>P\Œm9òÛ‘ž6渊 ŽWÚ×cŒ`͵›Ü+ªÜi‹st%’êçÉÞ’5¶å1³¡[‘¸`ªœ)#‘ÉÈ$ ÔÅŽŸ5Ìvžf¥o‘Õ± i!-“óßÀÛ¥rsº‹~îßQ}Ö£¥Ù´m*Ésq !U…”*™Ó‰ñ»ž3Ñ›+CÄm`1¬FO,`Fq”û§Žœ Š.ÒÞâÞ[X–·ŠH£Š% €;+7uÊÌÐ%¾¿ªÜÞFÃLòm•àŠu” (ò$lAvu ¯˜ß,äŒdù]­­ŸÚjžív¶Û"Ô!‘ã\ç ‡'8ùHçë[Ïeh÷©zö°5Ôkµ'1‚ê9à7P9?™§ kqp"Ç·d{ÕÚA\ƒ z`P%Æ¡|-dI^-¦¥mo+¢: UÚ#•ò¤y£©`vœŒ6¯·]ɨ܄’Ò+[KˆíÝ&4…•!ó€x]§$c#w.tÛ ´d»±¶]ÄŒ²Ä¬ ´1ÈëŒúqO{+G½K×µ®£]©9ŒQϺÉüÍ`§ˆneµÓD_dûUÞ›ö¶›vh•@‡» ˆpäÖ¶uqujÆìÅçÆå"*p ;O=™`pÂ¥m€óqcl<íþn"_Ÿ~7çŽwmÏ\ ô©m­­í X- ŠS;c‰¨ÉÉÀu4-Q@Q@wüæÅÍÊ>T1àqî„þ´‹ÛƲ,×ÅXè9Ïü?úæ«V²©Ó-Á?òÉz}TUÉnÆz—aÅí硺ãÿ!Ô77¶ö{~׫Ëîžl°®4©?åòàb^XäýÑYa‡ûsW%>Õæ®ÝÝ|ƒn=³»ñ¤Õ˜ÖÆÄned‹PºtaÊÑG×˧bOùý¼üâÿãur[…"x€`v#:â•g…öl•̦ÀuÇ­!Œ¼’xl§–+Û­ñÆÌ»¼¢2¹O’QQ.£r…¾èf„géûº‹Qÿm×ýqýÔ7Áq«éðÝ ÄâPGüÇ8©“²5£9Ùùþ åÜ·üÿ]þqñºlr‰Kµ—+÷‚´'_ÝÑåë~Oöv•Œý£?6Ïîý_çTa†;mCS†ÄaQ#ƒë³¿ãIIÜÖT" ÝïoóKõ'—R³‚o&mm£—û4¿"•kÏíççÿ®oN¼²²ð„W/l× ‰›µP¥ƒÿ`Ädç>õдð®ýÒ Ø@l°ùIéŸJ³”~$ÿŸÛÏÎ/þ7F%Ïü~ÝãþÙñºEtfeWRÉ÷€<­:€xëj‰Fõ¤e °¸Ï©ÙQZ\¤òˆå¿½ˆ·þèý£_#íð®H3ŸNÇáQÌÖ ÞXE`ÀG€Ùaþs^DñuT›M[]=Jjn6iß¹jöâ+ ›½ZhP>ÀòÉ }9Oje­ÜŠÍg«K:©Á1I ¬ïÃi&4GŸí«ò»•ùru ~U£²ˆÇÛR$fÚª’—Ó’«Ï^1^²wW<æ¬ìO‰?çöóó‹ÿщ?çöóó‹ÿÓ<øxýêrû>ðûÞŸ_j’˜ˆ­ ó\Íß]af¤ºSÏÉîjm\Ç£Ù}®ïR¿1î ò$DäÿÀ*;þBÿ×Âÿè Zú±Ó…ŸüM¼Ÿ³në¾î{R{M'%utR´„^i©}£}åÈ›Ô2Ä?ç¯Ú>Ïý¥qçìßåï‡vÜã8Ùœg½lÃöS¥°ùfò—åýÜcµpZÓ}“ÄÃTÉ goýsw•[òÈ?…4)[™Øéey¤…5+†–,o@ð–LôÈÙÆjLIÿ?·Ÿœ_ün¹¿~ëSÔnnHîa‚gÞq·sI´~hü+¡iá]û¥A°€Ùaò“Ó>”<‰qÅíØ?öËÿÓtã%ÍœsO¨]G˜DŽ@‹ÀÏ=éõŸïì;}½<¤ÝôÀþ¸¬êÏÙÁ˱táÏ5ä¯|˜K»æ_ï(~›*â–ÔO£xß6Ò¤D?÷ÅT™´õPbXÙŽýà1ÎO·õ¥ƒgÚ§û9:Œÿœ× MGQFRM>ÇeZùŠjÄγïò5+‰<·(ûµ‡Ppœj ™n"ÛêWÆÙãÂÀààòÖ¸ø$–Êæö8 ªÏуÉÉäËÇc»)TiÚÇu,$jSSRëg¦ÏïÛÏ¥µ; e€fÔnc ÁAf„džƒý_ZS&ÙV&Ô.DŽ U-Hp<¿qY¶–\øxYjÄ´²+o;÷2å‰^¼?ÅCáï2[GÔµ •ç;¡/ŒHØ©úd‚ÇëíZ-Ž9$¤Òw6±'üþÞ~qñº1'üþÞ~qñºažœÊƒ ¼üÃ…õú{ÓÁ R<‚;Ó$…$œÞ˽ºØ±£.<¬ä–?'°¤ónÖÚy/%SrãŒH¬í‘œXI³¦Æì’x€+©!•®-ÁÐü•uK:†[ë¶R21Gýû¬»Ïù´¿úáqÿ´ëI§…wî•Âe‡ÊOLúT?Ïíççÿ ‰{^Ýÿä/þ7H®ŒÌªêY>ð‘õ§PbOùý¼üâÿãu_íÐý·ìgSºùc3÷‹g€2öŽö±ÞðqåSSÑ«ê­ú÷ÓÎçAs¨ZZJ"ºÖž d$“@¤\ö©„¡Pj7%Ýwª‡‡%xä~ï§#ŸzýûWü$—Ki¼ŒÚ|`ùîTžNÀý8ªVú“Yi–ÿ`Ý$Pi“:¬Š2^6EÉÇn½+S€ë1'üþÞ~qñº—^݃ÿl¿øÝdØÜ\&¬,ä¼7‘Ékçï* ©Ü@àçŒóÇZ× ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆê®¡§Zê1*]!; (ÀT‘òJåm–èiוÞy/"¾uÂð9Æqø ØîÎSqv±×G °rRÕo§C´ÄŸóûyùÅÿÆê¬º•œy3km¿Üy  ù¬Í jMüóoÉÿ©$¥ÈÆîA?ÃÈÁïŒôÁ0i×–V^ŠåíšáQ3vª°ã,ŒœçÞ®.êæ ©ÍÅ;Øé1'üþÞ~qñº1'üþÞ~qñºcO ïÝ* „Ë”ž™ô§+£3*º–O¼ä}i™‘O$é5º­íÖÙ$*Ùò³¬xù=EM‰?çöóó‹ÿÕ{¯õöõØÿè·¬ýwF³¼†[‡u·Ÿhs9UôþxÏ^ž˜©“i]Ñ„g5;_ÊæÆ$ÿŸÛÏÎ/þ7QÏ2ÛBÓ\êWD¿yäxUGnIJä-î..mg¹Ši ŽÖ5‚+Xç}Ò>уÉÉäËÇc»Bþ;Ø|‹{‡ºDHg'¬ê@-Ï8À8϶ja>n†ØŒ7±Z½ok_×cj×P´¼Çi­<îJÅ4 @õÀJ³‰?çöóó‹ÿÕkyn°í} ´£!£œ¿×9UÅLg„g2 Âo?0á}~žõ¡È?Ïíççÿ¨RIÍì±Û­‹2ãÊÎI`sò{ ˜À ƒÈ#½WOù Oÿ\cÿО€,bOùý¼üâÿãtbOùý¼üâÿãuÌë:e–›4„¢—Ì6æR¾aÎr¼ö'§LcŽ0i…Õ'±·{KÉdº½;Õá¶Û¦7 çê{Ú2~ö^ѧkë AMOGÝv߯ü=ôÔëæ™mâ2Ï©\EêÎð¨‰JŽÖò ÀÆÓV–p½LRBØü’³uñ.›ö;G•'•¿îùÙ\~;wcñ¨õ-M’;èì¢k[Èd·V•Ñ:¼›AàœŒnëƒÏjÔà7q'üþÞ~qñº©u»ûSGÝq<ƒímÄ›1þ¢_î¨5,r$1l–é]¢Àwr äôÎ0j —FÕ´¥WRÉvÛ€<ÜKÖ€/kÖ¥´ n³Á¹‹ ±1Y:!>j²„Á}Ä)n˜‘XkÅ´ö\ýšm\½ž÷–cö¸”„«ÚKÇ!f Í&zõ:Ž«‘§Çqp»•Ÿ`ýìQóÉë#(íÓ9ö¨ãñ¤ÍÁòÚ»D†è( RŠA!òC§E n#hš-¾ @³XoºûÅsàÆc°e'kcFN8¨I¥ÜËáÞçK–Y­ XÞäʪ…‘Ûc)Áä0p›:v´ºªÜÛØ_äƒÎ„¼j¾hÀÈ8$›õRFMEý½ZV™tñK3ߢÕE¹™AÇÎáA9áwyÆpH¯”ÖÚôwãJ‚Ye·†#7˜Àɼ;obU•A–Û†Ú9¨$Òî'W·]>[xî5K{„+"&ô ˜à£dÝ»v<ŽùFÛVž}z[±ŸìÂÞ)–bq¿Þƒò€Ü‚<`ÐÚÜpE5ÌS„µ¼Km‹çù¼° Çp>`<`àãnG 7ú%ˬöPØDtãt^Þ$HH÷Q€@‘YR=Þvì)l@99«i¡êiÓÎ¥ ÌÀ<72´o¶EŽÜÌÎ`жHVÊ»rN7®|Emkd×KG8‚He–Ú7+¼ÌáÊAá_cŒ¹|Bòߤ֗R¼OuP±¨áqi°Üû@9Ûò€)¾•÷7wq­´ÄZð‘Ã4¢XØ‚#]ÞS1wɸ…g,;¥ÑtÈõ=DÍ5•£iQ4ëVòù–¿2Û`(‡]Ë!?.ƒÜ[ÅÚî­o´@ÛDk$nd;Ä` ¬v’Ì£çÛ÷½›ÿ„†3:Ú®Ÿ|×¼eT,…B·l,ªÀîÇlîÀ Z<^'±š)Z줷’躱å bͽ±±¹ÁåýÎ2SÃòÏe«Y9a7Vî‚K†BS÷NäæEE“Éc·}u ú­µªÇ*¤ö¯p¬ñíÎ9!”ã ¯qÈÁuâPtNîÆÎw{8¤d.«2Žwa²„dµñœ ‚oí$}Ú;]Êò/ašhÌ!¢U;7Þ ¤áÇÊÇ;†q’>+_ß_%¾n[Q·’ 7Œ¬ B$+Ï˲Œ#£u¨Ë½ÃÚO Mq,ŽÌa¤ –Ãã dFàppE5õËt¿–ÔÛÜâ Ò gØ<´wPg99.£€pzà` m3J¿ƒU¸¹»°Ý ŬÂî%¸˜²•TÊFð¦F-ÉÎÜå¶ü<‘Ç Ù,ZsiÉå Z·Xý©ï“Ï<àäTVÚý­Ö¡wa 3Ý[+·”²ÄÆ@§\í9 aöž}Ž§Õ¯ì¬¯ lY¢2Kms÷‹ñ„$…#?x„¼¤æ•/‹­¯íbŠÞF\%ÃüÅÑ`J©LäñƒQhëÖM¨i¢ØB³+\[³ÆØÃ"̌ق6ƒÇzÉmGUµñ%†›uwCäaå’Ô‘tÃÊ÷2Y™Bö8È;ÐWK+²Dî±´ŒªHEÆXú 3õ Pý…ªÿg ¸Vê1*¶G•&dòbÿz¬<âÄ)rN@99—MÐWp3jbâÍ„¯(gUTf ç‚vȰ9­1â(c²Ó%’æ{ûq2˜ÑTdù` ðY¥E$y8Óàñ­Ä™†Þå­7ÅÚð¢=Ò*2 nßϘƒîðO<hNéUífWƒí ÈÁ¡ÂŸ0cîüØôçŠå“B¼»±Ð"¸´XšÊÌC8™•¶‘$—å'!ãIG¡ ƒŒ‘ZmâkD…'–Úí"™QíØFÎŒè›ÕT–ÆdC‚a¸äó[º…ôõ‹I»-qpÐËî#g%Â’pA#Ãq@š“{5Ôsml·–óÚù÷Ï&ë•d·€º )Èl'ñ·»×A¼’ÞÞbÐàÊ“ÁjèâLÊÒÙWh'¹'Û&€EPEPEPÄ´¤ª9ýƒU’+”cK‰Â( …Nÿ€Ö¶(Å4ÚØ,eE £»±•ÙÈ$˜ñÐc°ö¦\ØZÞ7v1Ï·îù°nÇæ+cb“w([D& 4@¬dEÊÔ8è)#³·‹ÊòìÕ•­Š1@øoî?ýðjHäŽ&WÁ2Èßtô.Hý kbŒPJEr‘¬iq8E@0©ÀðX¡twv2»9“: vÕ«Š1TäÞⱘЫJ²´È€…cʃŒàã¾åL{;y<ÍöjÞiLÃäcñÎ01ô­lQŠ‘™‰ $’H–å^B °Œ‚Ø8çŠ~ûÿ|ÐÅ  MKOMFÐÛËç ÜÖÖ+M*>ÞáÑaaŽL©pàF3ÆzcÚ©Ò-ôÔÔ®–8"0&6/1µ•¡gnp:òsgb€tëµEqÔñ”DÕfÏœ¨I@ìrljàÙ!·*1¤[—»i/§]]EtUŠR¡p ã 9ÏÔ’fÅ eÑí$¼–í.§†iœ³´RJ”YÆ@"$9`G *½¯‡llæ´–ÚîT6ªAXœ±TXÉÜÈYK"*¥FcÍ^Å  ÷ðý¼qƒopó40-⸗Çä`ªT¤ycrÀàÛ@Ñtu²º{éåÅô˜í-8@Ë »Ìr§'ÜG8¯bŒPËgš¼Û%V‚'ˆB l`Äœ®ìåW¡t{æÑí?ÒEÍÔ÷Iq·),ƒˆŽ~]Ê7S‚ŘdàüÍ™±F()nl´š­æï='i÷F]™*0Whªœ*Žœõ9’M6ÒO´n™ÿÒ.¢ºl0áãòöÇOÝ.~§ðv(ÅVµÑ-­%I ¾º »ÚÀ ŠD¸ ÆW`Á9'ø‹`bæ™ Yi¶ö·Ïw,H§”Î}Où'Ô“Í3b€#›H°ŸW‹S™åy£Rv1g*AØNã<ò@"ü¥^'EŸËfR©Sê2ÏÔU1F(µ¾‡c6I<³­„^T^c¨8®v’¦$ǰç9¨4ŸYØM!’W•âò®®Øáºd!`ÈNqèxÀƆ(ÅTMÉD*×sº[l[dfL@ˆèá Æ€–Üp½y$Þ¿µŠõ"ÿHxe…üÈ¥ˆ®äl$•˜r_\f(Å[‹ÊŠ$dÊ¢…œ±Àõ$äŸsÍeØèv:{;ÚO,nb1FÛÔ˜ ¿.F CæÏŽå‹YÅ ôý.ÚÁlB]K)±·{hŒŒ¹(Å8‘å¨Ýryª±xzÒ ‚ û¨íâh¢ ´[³¤ç ;Htäæö(ÅTMÉcXÚîwXPGj“ýC+(L/81Æ~}ßpg99‰h³Ó5ì¦HÙYЦБÓb*ÿÀFíÙmÖñF(´]>k©.ßÎ’t›pqò•0œÓÁsÏ\š‘nðê°Ë}<‰ªnóC^SgÉ…ÂsŸº=ó6(ÅMqZÊòa­e2¦`’ŒœûaÏ㊟ÌOï¯çT±F(ß_Î1?¾¿RÅ  ¾b}:<ÄþúþuKb€.ù‰ýõüèóûëùÕ,QŠ\TWR46ÒH¿yG>*¶¢?Ð&ÿv³¬Ú§&»2é$æ“îfÃsp†8Žâ9-€™¢Þöæ Á,3† Ô{æ¦ÐÇÿÀ­VÔä(ßUþB¼Gí!BÔÝïþäz‹’UeK•ZÃu¹3bà`vqÆ=ªÕ„×1¦éóötL‚WòÇ­çX?à_Ò¦œ¡ŒqsúU¨JŠIûªþ¾¤¹©R‚ijíèRk»Ë©‡p©Ø{š–ÓP•'òn¹ã$`­K¢2yr'óŸr*®¬È÷¤G‚B€qÏ?ç<Õ!J8…6Û{ÐGG—DO}4# *ÁÝUÞ{üyäÈ®@ãò¤Õx¿lóÀÏå[IØžL,¡Æ;ñÒ­FuªT¼Ú±-Æœ!h§r->ëíQÀN;ûÕ¬VFˆ¤ÜHÝ‚cõ­œW¡‚«*”T¥¹ÇŠ‚…V¢7bŠ1]g8ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPñQ\ÃçÛ¼YÆá€j|QŠRŠ’iõm;¢ŽdÖˆûÙY˜ÿLTWZkO|&¡7×JÓŬ›¦©µ¢5Uæ¦çÕ”5+»ùlªÊOÞéƒÿê«1BÝao˜Ú}ø©±F*Õ)¹ÛVK«'ˆÃŸF90:•ìƒSXéFVYÙI^B¯LÖ¶(ÅsÇB3çHÕâê¸ò¶sº¨Î¢ÃÔåO:5ÎòÆWûÄŸð«×šc\^¬ÊêÀõãÒ´q\ðÀ*•'*«®†òŸB*¦¥[;Eµ‡bœ’rÍëV1NůNŒ"£‘Ã)9;½ÆâŒS±F*‰Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠ~(Å;Ë“âß³}¶²MŸÙ÷.ÿ7nï3ûØÎSÓ4ÓbŒW;ˆ'µ†Iµ7[ ‹´I‘Ácå4ŒL ‘‘œç#ž¹«3ëw6pÜ5õ‚G$vr]Ƒϼ: ”£iù—Ôsí@8£¬êwVÒ<QFdí g|%˜¡÷zÿµžÜíb€Š1NÅs‰y~—Ûî®å‰ìÄ€Dné¿h]Ê7+öùˆ¸Åt8£Ÿ«æ‹oÜcϼš×ïýß/ÍùºsŸ+§lûs—‰¯$°’óû*1VQß?úW>S† “–ùŽ9 “b±§Ö®—S{;}>9¹ªíq·/ä‰rFÓ·>½:sÃ_^˜Z[È–pùÒI4np@VʸRÍ’8Âýq@x£„|E+ÃçÛiþd+aô…¦ÚÊ®í'äÿ=õ,oEì—>R&<µ6|ôG°'  8£ìV_ˆõìÝ)¤Iã‚iaŠI ŒÇŽxàe¹ô  ,QŠç´ÍbkËM­ÂHïy%­Ó¦Ò²ŠS‘Ž%¸õ¥ŸP¾ÿ„"Æú9dûdñÚnxÕ71‘ã €ÃnNã׎h Å®~+Ý[O·¹¸»‚æhŒGoËB²–wÜÅòíù—úÔñkW$$ÒØÆ–ÆäZ´‹>æoòÎhÊïã9¾(gb¹í?ZÔî<øŒ\@ò³ÿ¤Ò"òrß»aØp #8­5¹/Ùd°²ómG”$v”#¯˜ªã Œ+©<ŽøÍkâŒVM–³-ËÙ<–k®¡Ÿ³H%ÜÇå.7.ܪ“Á5VÃ]¹6Ú:Ü@$k»X$’áßË î0B»IHÈê1ž”ÐbŒS±F(¸£Ê>£ªOwm S^6ùoƒ E€9ΨŸëF0Çž:×A¤ ïìèÿ´ÿãç-Ÿ»»ŽÜíãvÜgg8  x£ìV³¨]YkšbG Œ’5Êm#|H§=F ™úf€6±F+–O\Ū_oVž$²…PñÌÁ‰*¥ˆ>In‡ŒUø5Ë«†ŠÞ-1–íÚO’gx“jËdÜGΠ|½sé@X£ƒe«Ü•îU·˜¯eh÷¢¨ò¦UU'ÆrRsÔ[ѵwÔgž`HžŽLÇ!ue}À`•_î™ô§Š1NÅSÖ/“KÒn¯¤Æ!Œ°ã-Ø~'€-bŒW3¤kó5—Ù^x5-An…ºÉª¤›È•0àu^•b-_PYeŠKHÞâKÿ²Ç› €[‰3¸.HÈ'¦~olPö(Ås¯â‡ÒÞåìü…›M–úÝ’pÏ…U8 ®üë¼=Gj·6³ïÙŒŸ0+ëƒÁÎO\˜ob¹û väÛhëq‘®í`’K‡,3¸Á 6í$u##¨ÆzWEŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒVoˆo&²ÓWì¬æâhíâr2‚îǶIü+nµFãV–ÛV†Â6c G,*Uö¨%äcÈ=±@V(ÅdÅ}pšý½¬²¤^Y™cÙ‚ÐØ=Ô‡ŸOzŠòÿQ‡Åúu‰¥Äs0ÚK;•U?6GË‚Ü`œþ”·Š1\]ž»¬ zKŸ5¤¸k•6Ïo²8¶c)&>l€3ÉëÚªÛxŸU† Õº¸s2i†è››C‚`ÁJܹ<zuë@ö(Årº>½=©¿ô×!`0ìÛƒ(Þ¤ò"mãŽüÓç¾ÕGˆ-ã¶¾Žušt?bŽ DvÄs$ŒFU½}¹ Ÿb¸«?j‚[KÙ§Y`¾7€Zù`¼ÅpG';yÏ­-‡‰/,U'Õ®Öæôµ¿bÇå»0P€ŽÄ°>h´Å®wÁz­Æ©m¨ Ûè.æ‚í4;v„Ú¤cW;°O\VÆŸ©ZjBSfò0‰¶¶ø0à@gð  X£•á[ËCÃvww’y“ʤ»m?1©ž&¹»·NŽÊå­žæú8EEb†Ï ì+oa/jé_TÚû…}.lbŒW,5û­*MFÖô¶¡%´ðÇ ªmi £  ôÇaéÅYo\ y¿²'Yæ¼¢ $©!eŽ;ßÒ´x:«eußå~¾BæGAŠ1Yš]ì÷:®§o8eû1ˆÈ!KF€@©ïŸÃ¥jâ°œŸ—â®RwЧý•eöeä~à?˜sgvíû³œçw9Í\¢  èô=6)Þe·Ë9‘ˆy—.Irœrzœt¥‹DÓâŽT3¬Ñ\K+Éû³ü#q8_aÅhQ@£BÓ„r§•)ó¼½ì×;r|Ų=kKQ@+?ûOiò[™æíó_Ëß×vÌíÝžsŒçšÐ¢€(G£ØEx.’&¬*þõÊ«°!ˆ\àgqÎ9Í £iëk%ªÛâ-VÑ—{s†sœôvç¯=jýWû:Óíhò¿{çý£vãþ³Ëòó×ûœc§~¼ÔO£Ø¾ÏÝ:”i•ÔæFÜã ò sŽ=*ýB-2 w}ºyžBÀ‹,­´¢î*¤œà íÛ¿°¥ÑtäÒ´‹k ù)†aüLycø’M^¢€ T2ÚÁ4ðO*n’Ü–Œäü¤ŒŽ METe˜»7BLeó·n?av3ºH£û:ÓìØù_èÐy~Zn?/–ANsž Ëš·EEqmÔb9Ór«¤€d™X2ž=«cØý¯í^Kyžg›·Ìm›ÿ½³;w{ã5zŠÌ}Mvv0Ê¥ÙÙŠ\H»·°8oºI'oL“Ç&¤mOk„›ìødÙ…WeC·î’€í$`c#ŒJ¿EQ¶ÑìmnðBÁ×;‘™cÏ]ªN>ÀS‰§)¶Ûj‘lj_PåÃm<Œç´h bŠ(¤:eœ¬ñC¶D2w1ƒ¿~ìö튷Š( VëOµ¼b×1&€üÄ|·pã×jó׊µEgN1„û>ÇjVFV=Û0AÈ#sr9惢iæ$ŒE"”râEÖMÇ©Þãžù=…hÑ@EÓ’ Û,G,[K6HÁœr{?¥>ÓK´³çeó]3I;ÈYA$¸ž™?\¢€ T76°],kp›Är,Š2@ܧ ûàóSQ@n´‹ÉÚyá&VURêì¬6’T‚Á<Žy4[é6Å P°d˜Üi˜P¡bIäí$sõëÍ^¢€(6§µ¬vÆß0ÇjÖŠ»Ûˆ˜(+œú"ó׎µ+iÖæî‹>tépÿ1æDÛ´õíå§8úÕª(Å¢ŠÎ—CÓ¥™åx\ù½ã8ÛÕ¤ýEKý™göÃwå8Ê&ϘØÞÇ»Æv’:zz ¹Eg NSm¶Õ#Ž%¾6¡Ê3†ÚyÎ hâŠ(Å¢Š1F(¢€ QŠ( bŠ(Å¢Š1F(¢€ QŠ( bŠ(Å¢Š1F(¢€ QŠ( bŠ(Å¢Š1F(¢€ QŠ( bŠ(Å¢Š1F(¢€ QŠ( bŠ(Å¢Š1F(¢€ QŠ( bŠ(Å¢Š1F(¢€ QŠ( bŠ(Å¢Š1F(¢€ QŠ( bŠ(Å¢Š1F(¢€(ëöžžöâO*PË$Rc;He8úUï<7¤_Ü›«Û$yÜ0«²¬˜é¸~ ÖµžšoüNÿ´Ô¬vþD€€œ±üp£è=êÄÖ6Ó^ÛÞKé탈ŸqCcwp:ÕŠ(2ÛÃúU­Ü—PY¢Ë `If`¶œ.{à m¯†ô{Hg†òîË;3å?º7ì8­Z(–›¤ØéI"ØÁåù„bììØ,Iâ«Â7¥i¶¢ •nžA+:ÜÈ0é• ƒÓ¦1ZÔPm¾ƒ¥Û_½ôj·nËn$ ß{ N{àsFŸ iZkHÖvh†@²Å¾Prdœ öV•VËN´°3›HV#q)–\w1gžеŠ(  hàœŽÇýsé]n­âí?K¿’Ëì÷·sÂæ[X|Ï%}XäcŠä¾%ørúK‘¤[Ï:]•[¨aŒ¹. í|lŒÿ;TÒ¯tÿê·2[k³[ßx_J®N9Y1Ûž¿ã@ºÿM»è’é -Å­ìªdu€¶ôÝ‚‹þߥeê· {ãûË;ÏÞèöKj’¦.¼ òàœg’qíI{¢Þiº/‡f·Ònñg~.f¶üùdÀg§àOZ¾š"êŸo®5-)å±{(ÓÂvoýßé¸ Ü}hž¹¿JÐm&ÒüM{¨¬Ú¤Q´ßlßµ²™SÐðHúWQ«x»NÒõ§ù——j»äŠÒ0Æ=[‘Y>5ÑOµÑ4Òu8åxí¢'kÄÝ9¨¿âcáŸj×ߨ÷𮥱£’Õ7²ÊGaÏè(a|i¤ImasŸ$7·Ø2 Tœpù#{fž¾.Ó þ«g‰Äš\M,ĨÃë·žOnq\™ðÞ§/ƒu{©­ë›ß·[Ú ÜÑàôÀï‚Ü}+7PÐõ³¥Z^[Ø\}»Vk„½Qf0ò)†8èÔ´B=WL‚þåŽ9×r¬ Æ{à‘ïÖ¸M6ÇPñŠjƒGÓ/ãøO¨YIar—NÎV…ƒ·+Œ.2zU«=>ù|GàÙZÎàGm¦ì™ÌMˆ›Ê# qÁÏ4§¤k:}©ñ Ô÷÷ï ¥Û ¾ÖAXÎâ6Æ?.xŽÔ–þ>Ò§¸³ƒìº„R^L‘B%€.àÇóžWÜsí\åLJõ;í+ÅÇk4rK©™áY ™C±ùIëÁÈü)u­ZïTÕ|/öçOXu”´ë·-¹ruÛÇ_¥vÖ>!³¾þÔòcœeÈñ͹@ÜW9ÛÏ#Žø¬éo–J.SË8;€o^˜Í`Âu}Pñ-šèW·_ÚSI,D¹ »«vëõªÚf“¨-·‚]:è}–{†œ4-û¬È –ãåõ ¢oé‘‹dŽÓQ¸¸¸ÍðÁºD\‘–ã¥gø‹Ç!<1§¡,Œï7”ÆXIŒ«úF)·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~¤·¿Žâ%b™ioÞ&Þ¿ÖŸU“þCiÿ^Íÿ¡-hQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEU[ýU¿ý|Çüêõgë.©m ¹Â­ÄdŸAšá¼Wuuu¯Kuemu2芭DA.C¾îAÆÁŽ­=[ZÔVúÚ-:à˜µˆb6Oå©ò›pÞzsò6yÏJèÿµ,?çê:?µ,?çê:ågñü^-KE½-Û–Ùàx•p¥s‘Õ?Å¥e]_Kk¨›¸ÛËx.µM­ˆÁNvñ“îOÖ»ÿíKùúŽíKùúŽ€8KÍ^òÿÂzäwWkqöi­Œr…Rp·ø@ŸAøžµ-æ§}u»$ÿÚ m¬F-n<°žqò\íÀÀá¸È®ÛûRÃþ~££ûRÃþ~£ wÁú¶«¨Ý‘{yoq·ñ ;á“#å8B÷ùI'ޤV6»ö«}_Å·¶Ûž/! ¸ˆwWƒþªØü ®ïûRÃþ~££ûRÃþ~£ *]gYµûµ­Õ½¬Iel`YA?h%FìŒÍé…*G^j/yž_‹a–éÝ‹Ú2DøÆ ‘€ãùóÍw_Ú–óõÚ–óõqú†“&‹œék§‰ßSˆªÙÄчÛ˜,{ŸÖ›o®kWVålµ/´Ü½Œ“ÌŸfUû«‚§~W “Þ»/íKùúŽíKùúŽ€9'Ä:¾§¬ÚÀ²·½—í1~í~[uó”ñܪs׿§x‹ûþƒÿ “äe®Ï3?{Ín˜ç8ÏJë?µ,?çê:?µ,?çê:ᆫ¯XèÚD/t¶aí]Ì×<`ÿ"£äìÁÆ>µ©¨êÚݽͥ ˜ µH"2ÅòÃ(aæœ0Î6Øn˜®—ûRÃþ~££ûRÃþ~£ FÿSº³ñ6¥Ü­•´—P¤÷‚&!ädg#ž2sŠ5=wWŽ ?ÉÔaŠmÝþ×,F!3†ÀJ?npÏc]wö¥‡üýGGö¥‡üýG@ޝ¯êöwvþeêGºXÁ 9fvûß$Ї²°#½v)ÿ!´ÿ¯fÿЖ™ý©aÿ?QÓmn"¸Öà:‹v]Ë@´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEKTû–ßõóþ…Wj–©÷-¿ëæ?ý €.ÑI¸zѸzÐÑI¸zѸzÐÑI¸zѸzÐÑI¸zѸzÐÑI¸zѸzÐÑI¸zѸzÐÑI¸zѸzÐÑI¸zѸzÐÑI¸zÒ4ˆŠYØ*¨É'€:©7ü‡Sþ½›ÿBv©7ü‡Sþ½›ÿBvŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ©jŸrÛþ¾cÿЪíRÕ>å·ý|Çÿ¡P®?ÖU[»˜ìí&ºœâ8P»`3V®?ÖV.¿ ÍäVÖ6Ãhž`ÒÈÑ—EDù°Ø#© 1‘œš¹¦ßC©XCynG(ÈWe9Áz‚¥·¼Žâêî݃Zº£’8$¨n?ÌËi©ZÁe$o<&ê+¦kxYVH™ó*(Éç‚HÎHoz‰-ŠÞË ÒçJkðò@¶ÄoO ÞX+¿’1רàÐWeyìrI°Í$'pîŒTþJÏÄ67º4z¤S Ê‘ oVg õ`zô¦ø^‡K‘ZÕíº’&M»TÈÄ zc8®yt»ëM'I{kiH¹‰{ú6GB$#¶•?‡¥w5{«Ám-r]4×ÙR¹ÞâÆÓÞ°®¬'}réîÌÈíp’[O›JB¿(q÷Ag'®j4ÒäE‚ ki­$]jIX`¬dKµ*TŒ2Œòq@ j‡Ï¶†âÂæÙîd1 ”Æz!|ü¬x‘Z5‡{gv—ºHYî.™.%c4ˆ¿&ap3±@$vïX ¥Ïqam µ•Ä7ÑÛÈoex™|Ùårlj˜€;PwTµ-Etå·Í¼Ó½ÄÂÒ-¹-´·ñ1…=ë›´´Ô&ÔíåžÚe‹T‘nnC)Ä>SEoBG–1þÉ­nGÒ¦M"C|O*&ªùr áA8É[±Õ"¼¸–Õ¡šÚæ% ÐÌ 6ÓÑ‚8ìjõr÷ð_j—׺|3Û•ÓÞÚ•LO#³n8cqɪ±i¤Ú\Ïb“$ñ$sGØ^Ý|ÈÎá׆b2¤ŒäëžB’F‚'pä‚ËŒ'äóÓŒqžMI\¼v·rͦޘ$K‹›¹g“r .¨Ó`úÔ6Vÿ펥ŒöúÙ´d–y!ei$ïûÒ0Ù<ŒøP]Yúïüçÿ€ÿèB³ü7jÜÍ$BXƒÄ¡¡6Mn€‚yç†npHÏAZïüçÿ€ÿèB€7ê“Èu?ëÙ¿ô!Wj“Èu?ëÙ¿ô!@h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*–©÷-¿ëæ?ý ®Õ-Sî[×ÌúE{¦÷Ú}ŒEŽ<ÒÛä*³ë~ºwþ?[4P7Ùõ¿];ÿ£ìúß®ÿÖÍö}o×NÿÇèû>·ë§ãõ³Ec}Ÿ[õÓ¿ñú>Ï­úéßøýlÑ@ßgÖýtïü~³ë~ºwþ?[4P7Ùõ¿];ÿ£ìúß®ÿÖÍö}o×NÿÇèû>·ë§ãõ³Ec}Ÿ[õÓ¿ñú>Ï­úéßøýlÑ@ßgÖýtïü~¡»Óµ‹»g‚F° øÉRùàçÓÚ·è ©7ü‡Sþ½›ÿBv©7ü‡Sþ½›ÿBvŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š¢­—²¿ÈÿãKWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@j®¡³Ã€¦ô•dÉàçµ3¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿ÂŒê¿óÎËþûoð£¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿ÂŒê¿óÎËþûoð£¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿ÂŒê¿óÎËþûoð£¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿ÂŒê¿óÎËþûoð£¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿ÂŒê¿óÎËþûoð£¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿ÂŒê¿óÎËþûoð£¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿ÂŒê¿óÎËþûoð£¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿ÂŒê¿óÎËþûoð£¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿ÂŒê¿óÎËþûoð£¯üô²ÿ¾ühÆ«ÿ=,¿ï†ÿ3ªÿÏ;/ûí¿Â’.Π.n„Œ`FÄõ ÷Ô¸Õ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãF5_ùéeÿ|7øÐÚ*–5_ùéeÿ|7øÑWþzYß þ4vŠ¥WþzYß þ4cUÿž–_÷Ã]¢©cUÿž–_÷ÃÕ祗ýðßã@hªXÕ祗ýðßãOÚû1=þõZ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š( _ø~©-¥¿)$R˜_0H\[n:ûÖíyöƒ¨6â µ]IŸûZI#°LW)æ)ݳ`G9T÷úV©7Š®%u»YÚñÚâ;F,Cy›ÕTuHçÞ€=Šó-2ÒYüG,–VWk_™žìgÊXèNp ôïV4ý6ù5K"tûäÖQi//˜*H2rgÚö öþúÛN³{»Ù|¨€Ï‚q’éîEX¯7¿ðÛO¡xŠé´Ùå¿mNF€bL^r’QzŒò5Òø¢Þk ÛÇak;[¬°´ÖÑ)YFä ÁÎ1ǵttWs¥-Þaog¥j6ÖM¬Ææ7Xö0fsóßôÍUŸCÔ#ñ‰WQ´w1ýŽh­ZA*Ì2UT‚O¾hÒj½…õ¶¥e唾m¼ ”|žqÐóÚ¼÷GӮϊlåŸIº‚)e¹ŽótU••¶ï±Þà £~ºF— úuÒ[ÅÉ4byOž[†(IÊàÉê—Gmo-ÄͶ(»¶3€Iâ’Öâ+»Xn­ß|3"É`Œ©ž†¼ÞóJ¾X¥M^ÃTÔ¥:rÇa$hI…ðÙˆVÎÞrr~•ÔKk¨·Ãx­,VH¯Æû®"å}Qõ –Šóëm>_'Z:N•ea&ñ'F -Æ ©äœq‘ÔÕï é2iž!´hmn!†m Ã0m¦pË÷‰þ,gJÚÔ¼S¢éWfÖþéâ˜0-ä`I¤µe¬é÷× ok9i^´*˜ÙO—¸®y¸¥¯j½”ó$zy ŠØ3‡b c«tâ€;zŠêâ+KY®®d0£I#`œ('ž‚¸=V-F62¾r×~û&cˆ¹Y¹$7§_òk£žÞsðúKa †s¥ÄANíÞV6ã®sÆ(Y|U¡Å¤ÁªI|Øâ“Ës¹†r1ŒŽ‡¨­šò+ÍVmì›vbµ‚;ˆ@…‰i$ò7(긗>™­[û+óâõ»L»GUˆ™’tdù›±·ùBñÜФU WYÓôu‰µ Ú?8cw,G'…¹*Âeñ‰Ñ™ØtÛ‰5Ïðþð Š>„¿åZÞ.ƒ}Ý”ío¬¸‰%U“Lo™±ÔyÇ\ãÖ€7ìïmïl’òÝÉÁ*Ì¥8:T ­écsz·‘›kW1Ë/;U†23ߨéQhpÝÍá»XuÔYn^· »=˜t4FÛ\ee>á€" >#ÑÆ¤tã|‚ä1B¥[nà2Wv6çÛ9®oH¶qqu©izœñÏ©Ã%´²ÄVpÁp@Â/N˜Çjf³õî³ zèm£’1öIVÄÅÆ>sž™ £Nñ“ª\›{Å–P¥‚ìeÜÆTqš5OizDéýÃG,‹½Uay3Œü â¸ÝÆë|þÇVžÞ×M–⹋nÂ@ù Æ d:ž1ÍXÖí¤O&m.Ç_‚c§GŸÙÉ „dªJ:‚23¸‘øÐMÿ 6‹öÈí>Ü¢ivíXeA8“ž‡­êz­Ž“ K8‰]¶ ÚY˜ú&¸KLÖf–ãLŠ;ä7×M8û2˜Kü…ägòýÜg WWâ»Élc´¸´Òd¾¼‰J-Áf!yéÆ8Ï­M'Š´8­!ºmA SîÙµ˜íûß(ï‘Å:ëÄú%¡„O¨F<ä!PXl=Qîq\¦éZ¤z´z^­uÐMûí ÊggW-³²ž€ôâ©Xiz®‹¤j7]ÝÌÚžœÂaMëáÁW?ÃÀç§Ü^ø›G±½6w7N'IT‚Gœª‘Võ=VËI†9¯åhÒYI¶6rÌA  ž€×=ާex#ÓáÖWR&ÙD¨Ù´pªªÅ±Æ0 “ž•Ñx³ývÿah¿ô €r3Uìï­¯„ÆÖQ ‚f‚NÚëÔs\h“Çyý¢–7Kwÿ !>`WÏÙËòqÓaúUuÑä¶šxåÑ®ÛOM^g¹†Hó¡ ùD÷ÕNx3@™Ey¥ý¬ÐxsNŽòÎèZ¾¼ÞÕ‰óVÜ«a1œƒ×Œ÷®«ÁVÓÛi7 ,[À×r=¤8IA‘ßzèh¯<û=úêIdtËߗĆôÌ!&?)³ƒ»ñü;Õ]2ÒYüG,–VWk_™žìgÊXèNp ôï@òë:{ýÉË¥?–68˜uSÇ:ô÷«õçVÚDÖÓ¬0ésÄcñ(˜²ÀB˜0ûX1´gðϽ1ü<òÜ›™,.¼Ù|E"ÈÀ8ͳnÉã¢_Ö€="Šó['QLû"ZÜ: ^ã0_ÜÿË2 ºgÐ÷Ï5»áÛ%µ‹HKûMBk„’àÚÊð”¨GGÛŽvOn(£Ô5=2ØÜ_Ü$1[©$ã€9?…z”°Eup‘Éq Š$<–cÐ?ŸJÅñ朷Þ™¢²7‘´~IX·È£ÌMÛxÈàãµ*ÓV{íîÞÄIq¥™2E—X€brÀd.qí@’$Hd•Õy,ÇV\Þ%Ò!°‚ùî˜Û\:C#îÁÁà)"’;-6ëTÕc›K‘šO'Ï’â2ÐÜ`»wd½ð5‡¦ SNøaVÖ· ¨ùf4ÊmèZB7ŒŒŸÂ€6¬HLdAÍtôW(Þ1™Má<Œ^5Œ,'_ßÌ*¨ã#$žƒé&ñ›Ù¦¢ºŽ–m§²h!¸V4»±óc@\çô ²ŠÆð߈"ס¸)G-´›$Ê%C‘U‡QþÅÞø›^ŠãS–-Bè-¶¤öñ+X¡¶$—^×§­zmçºïˆ5;ëV°ë3[›UˆÚ[Gb&³F©m¤ŒŸSßÚ­]xƒX¶ñnmq †Úk(d¼ƒbádvdêFF¯~ÔÜU]CN²ÔàX5 h®"VÞEÈgõ5Íx[Ôu‹í_íóoŠ6ŠKeØ«±$ Àp2xÛÖ«\øšþÃÆºµ½Äá´Ûh?wE_ÉuÆNv¿S@ÀWŸéºˆï|!©ßͬ´7šl·±mó6"§+Ç9çÞº Aô{{½GQkǺ†9FaDòò¹ m={Еͥ½Ù„ÜIJy‰cÏð¸Î÷äÔÕÆ\êÚõÜ&ïOyVÊKÙ"/²Í$1'Ê_âÜÁ³×ÔÕµÉ4«ÅÓï—PšˆÐ¸´)q gï„€ ±×šíj{A(¶‰có¥idÛüNÝOÔ×!³¨Åi¬ƒ«ý¢Km>Iã[‹3oq€pv ËïëÅt’ÞßxNÞh§Ù}=’:˵Ö8Æ:Э†úÄ—^›Y¶>TÆÁç^Øá ï×V ψõ-.[–»tÑRðM ª:d½¯4ÝQ\ž"Õ-,n£—P¸ûXhp·V ŠŽÛKÆ áý”ŒñQŸë]>;‹‰d’ñ¢IÅš‹‹r GœqÆMzÍè¾'°h-moõ3%üÒ4ad·1HX6ݬ£ x늡éV·ÓéBÜ^>Ë6íUÞKcå¨äž”ÙÑ\Ÿ¤-âҴƺ»‘]å‹ÏUX•i;ú6Iõö¬Ý?ÄšäÖ¾’57“_ Ï6²?3ca2Øùp=:ûÐhúm”šŒzƒÚÄב.Ô˜¯Ì£žüOçV«¸ñ¸I²Ô!ÓՒ攉n–k'ÊE4MÙÁ F8ü+2ïÃVWjVInmc¶Ê°T}êzuÏáíZ×7Ú[Iqs"Å JYÝŽYPø«CšÚ{„ÔGn“z2C´€N{`V­8|.Âi0“ÃVrÜ<=ÑŽIi`Þrºã ÃÏ8 qUôß ù7Ó]ÞÏ#‘}-Ô0«æ0X¬F3¸늵ÿ >‹ö¶ý¹|Ÿ3Êû¿÷vcv}±S>»¥&Žuv¼O°Ž²€O|cÎsÆ1šÓëUy\n¨n¿¡Yëöik|eTŽA h˜+t ŒàðA Ô³iqO4Í,× Öÿgkmøˆ/¨£`ã9©¾Ûmýž/Ìʶ¦?7ÌnLg'=8¬ø¼S¡Ëi=Òê"ƒo™¹Xnû¿)9íÍsŒ¯má;[eǨê~{¢D. Àó#NB)Ç ëZw:d:­Ž£#È&²‘´ïñíÇJ]3U±Õ¡yl.ªµÆÒ¬§Ð©Š¬|G£HéæùÈb„`¡€É]ØÛŸlæ€$Õôk}X@ÒËqÖì^íäØèHÁÁç¨öª#ÂZq´¹†i®æšæD•3nO¸CŽÜU½;ÄZF©rm¬oVYv– ±—pJ’aôÍOªêÖ=ºO©\#w¤©bXöÀÐü"š{i·ÖsÍu;_•iî$X®6óŒ cŽ*?øD,ZÓP·–òúo퉦’IŸ1FßnLT×~,Ñ,®ÞÖæîD•c³JFî˜È\~µ·@º—†¬õ ç»k‹Ëw™'[yv,ʽqü±Kÿݪêu Õì $‚Y-â›lR8d€3Øg§m{K]6mE®±m†)Ël«†Û·n3œ‘Ú´¨Ž—¥Á¥‹±nò7Úîžé÷pÏŒ€8â³àðžŸìs¬×fg7Z´¹†9ñÆz’zãšÞ¨.¯ ´0‰Ø¯Ÿ(†ÕurîÛšK‰7±? ØYóxZÂm'RÓZ[‘£r×2°eܬX1 ÆÊŽ ÖågniŸ/úPù¯ ùýpÏÉÓØóÓÞ€i¥Aiª_꼆kÿ/Í FѱvŒqé×­RÕü1c«ÝÍsu-¼֢ÔùlUy†Aù·þµmÑ@šN…i¤\ÜÏjÒæá!FW …¦ÅƧZ¥©xCMÔ®o'¹’çuܱJáY@5(ã¡çúTòx«BP6/¨Ä'呆Úж6ƒíššMKŠÂòùî±oe1‚áü¶ùÆ2y#‘‘@ ‹@´‹OÕ,–IÌzœ³K1,2¦A†ÛÇÓ9üjõ•ªYXÛÙÄXÇoÄ¥º£>üVeÿ‹4=:ök;ËÆIàÇš¢ &@#$)­-÷ŠtK ¢Šæð‡š:†IFs†Ê©â€(ÛødI¶·-qn-o$žÆêÞP®O˜Žý äsÅXÓ­ÄSOy4÷$¯tó~ûz} sŽ;Ô×*Ñ-­lîd½ÌW¡Œ ‘;ï Ü($c=éÇÄÚ8±ŠõîÊ[Í8·Gx]s!ÆÈúž=è¼-h«xg»¾ºšîÙ­^yå ëu À×§Ze¾‡>‹g#éú†§zñ@c·µžd1ç_áÇêå߈´«)nb¸¹`ö¬‹2¬.åK‚W 9È¥Gˆt­iÙtË–˜ªî$Âè1œu` Šðx*MÝ•¥û ÀœåÏÓ& ´ðäWVÉ&¯ [‡ÓÅ„°¤»“b¶C€sßÛõ®Š«Ùß[_ ¬¢AÍœµ×¨æ€1Oƒt÷ŽO´]_Ü\9B—2Ï™bØr»N8Á'µ;þ'þ>¯þ×çyßmó¿»nÞ¸Æ6ñŒbµæ¿µ‚úÚÊYvÜ]0¦Òwm·8ÀÀ#­_ÚÁ}me,»n.ƒ˜Si;¶€[œ``Ö€¥i–úMµ¶22îgg‘·;±9,ǹ5œž±I±°†âî3`Å­îÀ• ÎyÆ9É+vŠÂ›ÂÖ’‹w[íF;ˆ—í)qû×V9!‰#>˜ÇlS´ï ØéßÙ~D·û0L!ÞÀîóN[wûcmÑ@ÐðNš¶ÖÐGu‚Ýí·$ #bX«|¾§¶*õ—‡­l¯lîážçÌ´³[0 .$ŒtÜ1Ô{b´.¯ ´0‰Ø¯Ÿ(†QÎY†Tdà`vÙÑ@×¾°¾mPÎóÿÄÍbY‚°|¿ºWŽyç5•«xVdѵ;}.I®îµO-f’òà|¡GÞ/=:{öÆ+®¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<²æÊô ~ÜCâ5šæúᡊÞöi•‰sž•cW³Ô¢‹[³þǺg¾[ŒÛB^%ò„é^—EpZþŸ{7ü%¾UÃý¢[ؘùvnÛÇ8ÁÎ:VwŠtË™¿·}#Q»Ôf™ZÎâfaù~^8ãæÈÇ9ükÓ¨  Û$µ]oSxl®b¸a;†Í…;vpp88šçZîm+Å^#’MR»Žð@!0Z³¤›bÁºc'v”P“k6ð[Û_Etåmmš fœÂå‰ ê#“ÁǵmA§Ü&¹!Õ4ÝJëR7‘µ½ìDª,AW«d¨ •ïžõßÑ@+¼–Æ;K‹M&KëÁ!H4¢Ü†bžœcŒú×?¤Asàk—¶Óo&¿ûH“}ÍžÙË´¨]•q•zvßÑ@5Ãè×M5‹ß L›dMÆSØcë\,ñÞ겦¯>™©B  •à6,(ù1¦ï¾Üçß^“EyßÙïÿá'ÿ„£û.ûì_kÏÙüŸßmòvoÙ×ï~5ú&½q¢^ÜGi·™ï.VÎrÂU2…PrÁsž­^‘Er׺v¡{ðÛìH[ÓfŠ"\ŽWo8çõ¬›Ë‹‰µKy|9}*Ck [ÍnCƒ–ß´p£¾>•ßÑ@^—¬çízŽ™«O{=ü;µ£Â© #Ïú´’sך‹VIîµÛx—B»Xm®ÞY↷™6¶e ̇<k¹¢€8->Q©\‰µ]T‚;kY¡¶³ŽÍÑ#Œ®oã.Ê`zsÍGâ#UºÒm>ÅÅ-mâ¶¶0Ü@7¡#fÍ‚IÈ }óè4P=<z‡Š,b¼…¥¿ÚXªŸ)î Ú$s´d¨­‹+¿¶$­ö{ˆ<¹Z£¨´ðN‘æŒêÙ/Ð`)¯G¢€8WB½½Õ¼]:K©[«A’ %ÑW§ÍÈÆîiÖú5桯iÎÇPÒã]$i-”ÆMüÆKÓ=:ð+¼¢€<½l¯£Ò¼&ÒØêÖße[µœØÛ·H pAÆî¼õÉ­]R͵}IµúÅÌK«Æ'û|$KåímÌpÊ7c5ÝÑ@‡ƒ,µ+Mw^þÓŠLâÞ(çe N¨¬¡îq·8èM^ð¼öž ÓຆH&@û£‘ °ùØò t4PŸø›N»oµÕ½åÜŒðù`ÄÛ d¤ªß»ïÚ¡&‘$ ský…9‰µi™™mÓÊ ùd*•:Î>õéôP˜%…Ëiž¾“©]Cl·‹s BåÔ6=:cž‚´¬ôíe#ð¸’)…Ô·ŠÎÀŸ$²,1ìqÏ¥w´Pà.úÛV†i£»–Ý–ì=£F²?»³ížCééV¼]¦_¾¯: ^-b³ºxÔ‘íÿ.+µ¢€<ÞëFÔá%›lwQÈ·Q›I¢´iBÀoUUTŽ}êÜz >•âYÞÚý.î/§XÌ@ïhLŠß"’ºŽ3]íæÚvŸ~"²UÒ犵¨$R°I(·9‰ØÆOCRiúmòj–Dé÷ɬ&¢Ò^_0>TdäÎ+´í^‹EyÚh“Çyý¢–7Kwÿ !>`WÏÙËòqÓaúW¢QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEr#Ç1,öðÜX˜™št¹ýîD=ØíÎí¾Ø÷¨.|K©È—AÇBûzBΤFÅ͹$(Î:˜ïZWÞ Ò¯[Ri^åN¢èòu ÿwŽ3“œæ¯\x~ÊâîiÜÊ<ë`Ȭˆ²Og<úÐ4|Q­ZÜÃ$–‚ê1¢¥ìÐ¬Š€Çt›¶ç;@ùGδî|[ 2;K’î;kTº¹c0ŒÆŽ»€ƒ¸àŽ*ÒxVÉctk›¹7éÇN,î¹ò‰'?wï ã=8S.|!a8P·7°n–Óe çÆ£?ñÇë@ ?ŠcI&òmL±&‘ý¦ŽdÚ\s„Æ8é×ߥC§kzï‹ ¶ò£K´¸î¶oÉRÇ®väœü¸Î03íVu/ éúƒ£y×v¡m>ÆVÚ@¡¢ì§ ð?ýy«6ú ­¶£i} ×KkAhá¶HÇMÃsÏ  ßx»û õ¢’Åd†5Vw7*®Àœ|‰Él~sÆ:…ΗያÛ9|©¢hðûAÀ2(<GBj-_Â6µÍÜÓ\ÞÅöÈÑ'He ¯·î’<ËÚ´µ}. cJ“N»yRm,È@o•ƒ£G¥`MãˆSOŠõ-c0Ý\46%ÈŒH«÷‰ ÈàrOµxÕ®ÓNv–×SÞ´éå‹…P3ócsŸOʯIá+4³Cqwnïqö˜Ì.«äÈF§Ä:ƒ‘VaÐ-¢ºÓîMÅÜ²Ø v4²ï.d1bG·À–ž/˜ßùO¤²Úi7íàŸ8n3ƒú{Ó,|uiy¬Åd° Šyš¤©}Ã8-UúVŸü#6[6ù·þÒþÒûËþ·9ÇO»í×ÞeáÛkÁ5½Ýê²4‰kçbfÉ$(<’pI„õ)ï¼#i¨ê2ù’´nò>Ð3†=€ ¬Ý?XÔç¿ðéš|Eª-ÌïEÀ@F¹Æx¯|Öþ—¤[iš,zT-#ÛÆŒ€ÈAb $ä€=k7EÐÞ8t§¿óçGÁ V]’¡Â†=þè˜9  [Ok2[xfKtkÉoã¹2ÂÅÍ)¹m¸\sÐV‘ñt“Á£¶›¥5̺¢LV6˜Gå´xÜ ÷Ï>Þõ1ðuˆ´Óm⽿„é«"Á,Rª¿ï>öNÚ¯}á0×ZMmg§Ç:´±K¶U.rI?Z|^.{Øl†“¥½ÕÍÍ»Ü4-0ËUm‡œÙ¢Õüjt¦C>–Ë”’H²Ü*J7u %±ß «Ïá;ìö‘ZÍyfÖ±4+-¼»]‘ŽX1 ç'Ÿ­Cyà2íeO´_CÐÇ ‰Ãî“I"€#Ô¼]&Ÿ©j0)¤´Óžqr'jÈ.9Æzf´ì¯g"¿Ó._zˆÒæÜಥN=OçYOá?·x‡UºÔeœZ\< ±Ç( 8D‰7jÕ²²œøŽÿS¹MŠcKkqIEËãÕ˜þTÍkZþ·m¨ëå%X­´ô·XÕ “™$\7̇$®ïaïÔI¯kú½›x“ì’©3Z,;‚)\.ïá;²N9éœöÅnßøfÊýµ&š[…:—“æíe|£•ÛÇùÏáEï†loFª&’àjŒÛX †06•㎃®h*çÇvöº£YÏmX¥H&ar»ÕÎ3µË('ãéLÔüU~Ú^¯5­‹Û%…ÏÙÅЕs ‘0©ê¬ON=sÓ]<5mḎûP@î²MMµ&pÜØÉÀÎÒ–_ ÙK¥ßéí-ÀŠúèÝHC.àåÃàqÓ*=h?Uñ|Úuî§ÒZkm1¢óç…!dä)‘žŸ­¯‹æ²MJ{]!î¬ôé<™góÂ~󌀸'pÉý+BûÃ6WË«,²Üªù~vÖ_—`m㎜ç5ÍøƒÃZýÎ¥­ÄQÞÊ­½/[±ã.è~mÜtÐWâf L7“&üºÆ‰¸(,ÇŒ±àäûV,^7ŽM2kﱎÒáb»0Î$£t‘H8öà×Cªé–ú­ŸÙ®LŠ«£ÆÛYNC؊ϗ÷‰myyuž'M(o8ŽŠÃÛì0(›ø¦ÿËÒDZ{Q%’(MÈRª€I+ŽAÏ·½ÅòOŽúv•%Ìš¢LV30CGÀ’1ŒçŸjŠïÂOö­ K˵´°[€f,AÂí qÈàŽsÅkZørÂÒM-­Ì¨4´‘!]à ¼ Ÿäñž1Ö€2l|uiy¬Åd° Šyš¤©}Ã8-UúS´Ï}¾[ýšÊ°Ç$›ui†ÎÍÛ­iÙxvÚÆðMowz°¬"ZùØ…Y²I O$œEC…,¢½ûT—WÓºÆñF%›>R¿i7ORq@³øÒâïÃ×·vÖëm$"WŠá%#tŠ¥Xù[ðGãZ7¾-kY¯%M2Itë Ä7BP ·Âc$ Ã<Š{x/O’+¥¸»¿žK”Ž6–Iºª8pÛê$S]øOO»¼šgšía¸‘ežÕ%Ä2¸Ç,¸ÏaÐö  z¯‹æÓ¯u8Æ’Ó[iŸ8œ) !HäŒôýkª¬[ï Ù_.¬²Ëp«åùÛY~]€·Ž:sœÖÕQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEeÂG¤}ž ƒxsÜ}–2c`L¹#n1‘Ó©â®Zê·w7Vöòï–ÑÂL6ˆÎ2F•Âê:ôÚέk´¿d&¾µ!ÃNê˜P}C+~uΗªM¡YÝMi2‹ËùnïíþÎÒ²îÈ@Ñ‚¥€qšï¦¿µ‚úÚÊYvÜ]0¦Òwm·8ÀÀ#­Y¯3›Jž8´¨éúý”FìÉÛ°tF ±J†bzÙÇÒ»OÁ{má{uâåîW9e;A÷ @W—Ãáë¸<)£¸³¹å'P‰¡yX¿ËÌ[*3Ðc®y¢âÇÈo[ê¶·÷°fñ¾Ì!+/—…ÂìN\g8úP¨Q^ršmêYè£Ä:uýýœvr+Aghå/”,ÏÜÀÏcéV!Ðïo…-µ«{‰V(®…ÏÌß WaÓ€^q@µõµð˜ÚÊ$LÐIÁ]zŽjÅs> °|šÔ&Åí‰Ô$dcÕx‰ù6ž„ž3\¾Ÿaª¯ˆ ¸·Ó®ìæv»I\ÂøÉFòËÈXïÁÎéW7ZZËspû!… ’63µ@É<{Tú•¥ÌñÁ ¥žHá~FÆNÎ1øuö®ÇHh—–é¡ê1^1ÒåçÈI§ÆFûí¸d0éV4ýßN–¯c=µ´¾[rd„ I|ÂHä}ìüß­wÔWš;\Ô4K½BâÒâ+¶k{gˆÆK´1湃1'Œ]7‚l§³´»ß祼“n†)mŒ8çjb=Ž;ñ@-çZ~›|š¥‘:}òk ¨´——Ì•$9³‚ í{R¦‰Å-±B¾Xã äs\Êh“Çyý¢–7Kwÿ !>`WÏÙËòqÓaúPyg}m|&6²‰4pF×^£š±^_>‹w ÝA›4v««Êó*Ú4‹$$(…oQÏñ‘Wmˆð½ÒV†]^l•·w ƒaØ¥w.K`““Iiayý™¤wJÔï,â¶ž?³¤n^9¼Ó°•ë˜ôéÔW™ë:F§=âyÖ÷û>ÇZ \É ¼7‡Pœ|Ç­u0´º¹ðDö¨’Ü\‘"4%˜‰'>„ÐIEyåþ‹wk>·k§Y]ÿf™ìähc-ûèð|ЄžIã84Ë2êO ø‚-?N½‚Ây­£ÆÂA‡_0„ê€=Šó½KE¾¶mzÓIµ¹ŽÅ¦´"«°‘0|ݼǦ@9=+Á6SÙÚ]ïóÒÞI·C¶Æœsµ ±žÇø –Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ŠáàÕ5ÝVy/-õkK TxBÛÉË V\±ç8`01–qÖº‹ Ë›Ý#ÏHâûP2G´±dF(yÁ;I_CÅhQ\H×õ‘áÍBæy"KˆuFµ’Xãޖц˜ e€ç­P,¿f’Ðj£ì‘]*>­öQeÊc°ÆqŒs@‹PËio5ÔRÄ­=¸až©¸a±õÀ¯?‹ÅšÚž’1\+Omd%–o,¬c?uH<œuâ·lüJ÷ÚD–÷6‡Ä«"Ds³q\ç c§8ϵu4W>¹­ÚÝIco©Ç³Al·æÝ@†gb@6϶pjOí­kûþŸíûGÚvý»È]Þ_•æcoÝÝÛ8ü(º¢¸;Ÿj  ^[-Ô#U¶–å åTÿÓÆ[…Ô“Úº5øA¤Ô㘑§„€ûÁsŽ{PÝÈXø²÷û:Aw¥±¼‹N[äpÿH€ÍÀùO|`ÖÆ•®¦«¨K´‚+x¦3oþ)à¸Ç÷psžý(^ŠÌÓõ®u½ZÊEŒGfÑʃ“¹7óëQ¿ˆ¬’?1ÒeO¶µ‘%G¹Ëuû¿)÷ö­½…KÙ.ߊºѯEcÛx† ‹y'[+õaóИ3ç'ªàŸÈà÷©ô}fÛWù ,o‘$ÛHÈåI­)P©Û[Ñ£ErRx‡V† CQxìšÂÆõíÞ0Ž%(.àwžGjÑ“Åz\z¿ök;ù¾p€·Ë€ç¶3»Û8ǽjðuVÊþžVÿ4.dnQ\ý߉£wÒÚÛΦÎqÉ$YBÞ`Bg®Î+ ¬gJpW’þ´ÿ1§p¢Š+1…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sxZÁïÌrK H±™9;Y”²rIùHëZöÖðÚ[Çon"vªŽÂ¥¢€2‡­VÎîÚ;‹¸þÕt×fHåÚé#ü¤žÇ5øVÖ;r‘_ê1Ü4¾sÝ­Æ%vÆ98Áã­ê(ÿ„;ODƒì·7ö³D¬¦âñ$¡ŽæÞH9Éæ´_Fµ:Ñ y­í¼¯(4M‡ õ õþµ£Espø:Ò;dúŽ¥5¸ å#Ê BÊA ›T`Œ:ü"Oü}_}¯ÎóþÛç?~6ýìcãÅt4Pü":+iOa-¢JY\}¢UW˜ÎX96NsëW†‘jº hцKV·6ùLÚWôÆy'§Z¿EaéÞµÑ„×æîúal g”1¯"5È}j?h¢h¦)ãòçšV‘оòƒ¢®îøP+ ¢€1æÐõ;›ø5+ûi.Š@§j…TžƒÖ£“ÂÖR]^âìÆnMуxò÷sÆ3ÎOzÜ¢·Xš«gä+#<1h¶SY½Ýô°I¨óqg¢€>œœžÕkIÑ Ò¤¸’§•® —2•<¨ÀÆíZ4R–"¤“MèÂÈÁ>´i¦2^^¼Ü›™-Œ‹å3–ÝÈ œggµ[]Ôî+›¨Ä’ùÏI¶7|c'ŒöÁô­:(xНvFTš¤šuÝ‘’.êäܹ 2¸|:dV­TJ¤¥ñ1Ø(¢Š€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€3¶/¬¿÷ùÿøª6/¬¿÷ùÿøª­«]=–‘{wS%½¼’¨aÁ*¤ŒûqTZãR¶Ód¾¼¿°X–&EœƒaÆrxIÐ ×Ø¾²ÿßçÿâ¨Ø¾²ÿßçÿ⪄ºÞ› ãZIq‰’E×Ëb˜¹8ÀÎá‚xíPÝkQ­ý­¡ó ·F XÄÛWä€ÿwp*2{ñ@»Ö_ûüÿüUSû| €pnpyÿÕ¨&Kˆh÷lpw)Spyr×_ë‡ýsOýTT—*¹Ó… «ÍÅ»hoh[ÿÓ_ü ÿìèþзÿ¦¿øÿÙ×7EeíŸc¿û2ÌtŸÚÿô×ÿ¿û:?´-ÿé¯þöuÍÑG¶}ƒû2ÌtŸÚÿô×ÿ¿û:?´-ÿé¯þöuÍÑG¶}ƒû2ÌtŸÚÿô×ÿ¿û:?´-ÿé¯þöuÍÑG¶}ƒû2ÌtŸÚÿô×ÿ¿û:?´-ÿé¯þöuÍÑG¶}ƒû2ÌtŸÚÿô×ÿ¿û:?´-ÿé¯þöuÍÑG¶}ƒû2ÌtŸÚÿô×ÿ¿û:?´-ÿé¯þöuÍÑG¶}ƒû2ÌtŸÚÿô×ÿ¿û:?´-ÿé¯þöuÍÑG¶}ƒû2ÌtŸÚÿô×ÿ¿û:?´-ÿé¯þöuÍÑG¶}ƒû2ÌuvóG9;DÙ؂}ú›búËÿŸÿЬíýHÿ®cÿCzK§šêí O7ÊF ¶& ÎänÆIc§'5ÑyUXòMdz4¶/¬¿÷ùÿøª6/¬¿÷ùÿøªÄ›íd‚_.x“š9eQÔ˜G_J·¨ê76÷ö–Vv±M%ÊHù–sP›}³ß¥6¬f™¡±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅU4½–7 ¨-¥¾"y_mÎí¡Hç•^0y=¸õ©’þÊE™£»·aúÒ²åÿ½Ï!“l_YïóÿñTl_YïóÿñUKMÕ!Ôg½KsÅm*Ʋ¤„™Elñè[…P‡Ä±Ëm¬?ÙÊͦy§Ê/þµP° :¤wÅnl_YïóÿñTl_YïóÿñU·Ö–þP¹¹‚—î,’-ôÏZÚí¾oôˆ¾YmóŽã }ù{ЛÖ_ûüÿüUÖ_ûüÿüUVÓõ+=I$k+„”Dæ7ÚAÁËŽ=j{‰V y&»–?@3@ؾ²ÿßçÿâ¨Ø¾²ÿßçÿâ«$ÚÏ>Zo>YöïtŽR‹ôÆO×® I¦\8¸6Ï!• y‘;uÀ8 úõûÕ8´®$Í-‹ë/ýþþ*‹ë/ýþþ*²lõ-FöIšÞÂ×ÈŠâH =Û;©;Ddvéš¶ºª[‰nîm É|~ýJá[i98éÆ} ÅHË{Ö_ûüÿüUÖ_ûüÿüUPÕ5‹M7M–í爅¥‰ ¡|ì €§¾xéž´º¦¢Ö:OÛR+“¬eö‚]•zàôÝé@¶/¬¿÷ùÿøª6/¬¿÷ùÿøªÊMZx5´Õm ¶ ̲Çq½LnÜJ®:ƒž•qµ=9B¿µcLÌ¿1y9  ;Ö_ûüÿüUÖ_ûüÿüUGö«}Œþ|[ü¶mã ÙÆÓï’*Ô­£´—°!v@ÆpS!ˆÆãŽxäv9¨ÞÅõ—þÿ?ÿFÅõ—þÿ?ÿQ›»UMÌ $~kãåN~cè8<ôàÓ¡d·Kj×–âáùXŒ«½¾ƒ9  ö/¬¿÷ùÿøª6/¬¿÷ùÿøªuBCÉ4Н(ŠBÇ·'%¿¼=¨M‹ë/ýþþ*‹ë/ýþþ*šÈÌ ½ÚäãŸ+ÈUª4VÚ[¼AÚöUˆq´”fÏ¿Ýéï@;Ö_ûüÿüUÖ_ûüÿüUgÝj¾EíÕ°Ž1ö{E¸ó%›bœ³ ”|½}êÌú…´Ë Åå¼R¾6¤’ª±ÏLh}‹ë/ýþþ*‹ë/ýþþ*³­5«{23ÅÄrÌ‹ ”nq2î¯;síK¦ê«yf—3y£ZÅpß¾¦ðIÜ008=ùéŠÐؾ²ÿßçÿâ¨Ø¾²ÿßçÿâ«6ã\²O³5½Å½ÄRÜy2H“)X¾F|’?ÝöëRÿlé¦êÚÝo`i.”´;\àp~½=p}(îÅõ—þÿ?ÿFÅõ—þÿ?ÿN¢€±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅU-RîHP[ÇÄÍ…ùwm^íŽý‡ÔŠv—xo-s £9¥‚öÒâY"·º‚Y#ûè’+õ¥K±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅT7öV­¶æîÞàâIžrSßò4I{iÊ[KuO'܉¤›è:š›búËÿŸÿŠ£búËÿŸÿŠªÚ~¥g©$ep’ˆœÆûH8 ãòãZ©§kÖ·±]Ü4Ö±ZÛÊb›€s‚FOerr jl_YïóÿñTl_YïóÿñUWvÓy~UÄ/æ©hö¸;ÀÆHõ#ó¨ŸTÓ‘ÞþÕUÕYI™@`ÙÁô88ú³±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅU WX¶ÓQCI Ü<‘¢Àe ÌÂä¼dŸÂ´h»Ö_ûüÿüUÖ_ûüÿüU:ŠnÅõ—þÿ?ÿFÅõ—þÿ?ÿN¢€±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅS¨ ì_YïóÿñTl_YïóÿñTê(»Ö_ûüÿüUÖ_ûüÿüU:ŠnÅõ—þÿ?ÿFÅõ—þÿ?ÿN¢€±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅS¨ ì_YïóÿñTl_YïóÿñTê(»Ö_ûüÿüUÖ_ûüÿüU:ŠnÅõ—þÿ?ÿFÅõ—þÿ?ÿN¢€±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅS¨ ì_YïóÿñTl_YïóÿñTê(»Ö_ûüÿüUÖ_ûüÿüU:ŠnÅõ—þÿ?ÿFÅõ—þÿ?ÿN¢€±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅS¨ ì_YïóÿñTl_YïóÿñTê(»Ö_ûüÿüUÖ_ûüÿüU:ŠnÅõ—þÿ?ÿFÅõ—þÿ?ÿN¢€±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅS¨ ì_YïóÿñTl_YïóÿñTê(»Ö_ûüÿüUÖ_ûüÿüU:ŠnÅõ—þÿ?ÿFÅõ—þÿ?ÿN¢€±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅS¨ ì_YïóÿñTl_YïóÿñTê(»Ö_ûüÿüUÖ_ûüÿüU:ŠnÅõ—þÿ?ÿFÅõ—þÿ?ÿN¢€±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅUmZF‹I»–2C$.ÀP3Y0érÞ){k©‡Úëö©Aê~j‰O•ÚÆÔèó§&ìý‹ë/ýþþ*‹ë/ýþþ*°´œÇ«´ rÓ GÉóYÁÁ\Iõ­úq—2¹5iû9X©«Z½î‘{iQ%ż‘)n€²3íÍg]xz×û êÒÂÎÎÞê{c ‘# ’GrqšÖû]·üüCÿ}Š>×mÿ?ÿßb¨ÌɻѮ'þÒØñwwo:dž?/ ñ×ä8úІßFÔ!–ÊöÆÒÒöK€Û›ÌpÞgc‚þ¼ût;Ÿk¶ÿŸˆï±GÚí¿çâûìP 2˜Ü*,¸ùÂ1*± d~Ë]®õÍ?ô]?Úí¿çâûìVi´³lo¹µb$óŽÏQR.JÈêÂW¹K±‰Em}ŽÇþ{Ú~mÿÅÑö;ùïiù·ÿXûö•.Ïðÿ3ŠÚûü÷´üÛÿ‹£ìv?óÞÓóoþ.c þÒ¥ÙþæbÑ[_c±ÿžöŸ›ñt}ŽÇþ{Ú~mÿÅÑìdÚT»?ÃüÌZ+kìv?óÞÓóoþ.±ØÿÏ{OÍ¿øº=ŒƒûJ—gø™‹Em}ŽÇþ{Ú~mÿÅÑö;ùïiù·ÿG±iRìÿó1h­¯±ØÿÏ{OÍ¿øº>Çcÿ=í?6ÿâèö2í*]Ÿáþf-µö;ùïiù·ÿGØìç½§æßü]ÆAý¥K³ü?ÌÅ¢¶¾Çcÿ=í?6ÿâèûü÷´üÛÿ‹£ØÈ?´©v‡ù˜´Vרìç½§æßü]c±ÿžöŸ›ñt{ö•.Ïðÿ2mýHÿ®cÿCz}Ô2E4²,o$Sa›Ëåãp1¸üÓE:ÐÛ[d «|m ¶1‚Or}jÇÚí¿çâûìWL/³Sœ¤º³.H.5JºÍµð%–XÌ/÷BœyíŽI§jšcßkzt¬%ðÅ0‘⢠¶Í£*Açò­/µÛÏÄ?÷Ø£ívßóñýö)·s4¬aêúEĆd³ŽIéW6êd›s©PKœàòj ýïí;í-WÉŽ OÝUåfdëèG^+£û]·üüCÿ}Š>×mÿ?ÿßbÊ47ky©ÜÝ۴ί—V;Dh¼àõãÿ×Ö±µ=þmé­# ¨nÕT°Ä°Êíò“œt!†zõ®£ívßóñýö(û]·üüCÿ}Šçõ=&æMFyZ+©í®­RKy#V\nÈ;ûÝZ_ì»Å×áÔ–Û0¡Hšq¹€R<ãÎ Äzã=ð+ívßóñýö(û]·üüCÿ}Ч¢[ÏkÜSÄS7sJC«¹`F{ãœUù¢Yà’>äŠU¾„b™ö»oùø‡þû}®Ûþ~!ÿ¾ÅPY/­w+=Ú¹<´0‰CŒgî’:t=)úm¤Ëp÷w•˜ElÁ9$ÀÉj¹ö»oùø‡þû}®Ûþ~!ÿ¾ÅS–‚JÆN£y\Ïsö”•¯f•nÜ!S!*vÛÈÇ}j¾Ÿ¤\%æœ÷VÊRÜÞ–,Tí2J^럧zÞû]·üüCÿ}Š>×mÿ?ÿßb¤g!‘«ÚèóÛ :[)-GïPy,ªà©Éèw1žzã­ok–3Þøìp¡i Á¯´ádBØ9À´~×mÿ?ÿßbµÛÏÄ?÷Ø  »ýÒµ²ŠI/.-$…^YšF9S…ÜäàgñT/4YÖîB¶÷Ú\Y¥»Ejñ)M»²¤>Ó»±®ívßóñýö(û]·üüCÿ}ŠÄ]&éuÄ ˜Ó\¥Ô›œç"í G|á>«PÚi×öRÚ]=“\yFíZtܾdÛ•ÆH9溵ÛÏÄ?÷Ø£ívßóñýö(‘þÆÕ­tû«x¬ÖfºÓš¶U •¶óè$cŽ;kHYßÛê©%Œ,’FnK¼m Šqá°01ǹö»oùø‡þû}®Ûþ~!ÿ¾ÅMU¥šf\²D@?tÒ‚Ùê)ÿk¶ÿŸˆï±GÚí¿çâûìP]ÙG*8Ø õÛe ?Ç™w¦=ö¢Á%²M7 ó¤€FãzòEm}®Ûþ~!ÿ¾Åk¶ÿŸˆï±@楠26®šU„1Es§,Q¬A#.çÏs‚¼šƒWK»g¾‹ÈY#½Ô-ÝgóûÑ›zäôÆ 9®«ívßóñýö*°‹IkÙ}¤ÿËl&ÿûë­c éR&KUÿjÏpä2äÆÂP§9ÿixëUWFÔb°PÐ.øí´õòšEV‰˜¼yÎ==uŸk¶ÿŸˆï±Q\>Ÿu †å­fŒõI °? nÚÚ}WUšy-dz¬rH…Õ¶·Ç'¡ •ÈÁúUË 6ö×S¶­”³Þƒµ—åY$ צ çž•³–Ñ,6ïmkÑ#* ~¤û]·üüCÿ}ŠšŠ‡ívßóñýö(û]·üüCÿ}Šçši¤ÔÌÑÝGûÁ÷!bÈŠ~P21î~¾ÔÍ)®m5$m“´R-·FÀíþr1‘üµtŸjµÿŸˆï±GÚ­çâûìVJ–¼×:Þ.ðäåVµŠ>#³šÿF’Ú,í,Göœ ’F8Ô7ú ¥j+e’^\ZI ¼³4Œr§ ¹ÉÀÎ;âµ>×mÿ?ÿßbµÛÏÄ?÷Ø­NCœÔ49åyc‚Ñ<‡·³h*Ù9gÏeüéÚ­®¯=ãµw‚¸&„FÑ*²!RG?6þÐcÐý®Ûþ~!ÿ¾Åk¶ÿŸˆï±@–ÖWñjO¤W6ÖR4­(™ãd²CGƒ¸Ç8×mÿ?ÿßb€15&{˽Vhí–C6•öx•É“2d ôê¼ôª×ZV Ðj6kkæ5ûÆéu½qÍ“Ÿ”©#õí]'Úí¿çâûìQö»oùø‡þûOD·žÖ;¸§ˆ¦næ• ‡WrÀŒ÷Ç8¬Á¦^Å}›Í6úœ÷&ë™Ëí#'Á#ð­ÿµÛÏÄ?÷Ø£ívßóñýö(œ¶Óõ;]J=A,wy’Ü7‘æ¨òDž^Üœãªvçïwªðh£Kš9lÔÏýˆ¶‘唑/ï2 çŽ«ÏOzêþ×mÿ?ÿßbµÛÏÄ?÷Ø jm7SXîí’ÈËö‹Ë{?ÍP)+‚s‘°ûc¾x=]Cö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾Å3R‰®4˸cy!uQêJœVÚ•‚í,%ReÞîmd%Ç÷OËü«¢û]·üüCÿ}Š>×mÿ?ÿßb¢Pæw¹½*ü‰Å«£C†vÕçº{7¶‘ð¦6@ +ÀÜ¡®†¡û]·üüCÿ}Š>×mÿ?ÿßbœcʬMZ®¤¹˜YÿÇ”õÍ•Qoéhò+Ï",ržF·F¬ÞWo^:Õë?øòƒþ¹¯ò®ZßR°HÖ,¤š9nd»»EµRG,í´sÎjŒŽ¼r2(®>f’ÉÓU¾ž×ìúlBÜÇ1O2`~Ÿ} òœõéQ µ†êöæîê;˜.l—ÉE.°ïzw7Šíh®GM¹¼“WQs¨E ÒÝH²[Érûž<°UXËŒm!‡§^µ×PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\­çü~Ïÿ]ù×U\­çü~Ïÿ]ùÐͶ£h–Ñ#M†T§®>•/ö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øVË+ÜÊêr¬äƒíš( ÿÙ endstream endobj 14 0 obj << /Length 15 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 708.8 Td /F2 12 Tf <15> Tj 10.2 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.7 0 Td <22> Tj 3.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <23> Tj 7.6 0 Td <1A> Tj 7 0 Td <07> Tj 5.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.7 0 Td <04> Tj 3.8 0 Td <33> Tj 4.6 0 Td <08> Tj 7.6 0 Td <09> Tj 7.5 0 Td <0F> Tj 7.6 0 Td <27> Tj 3.7 0 Td <08> Tj 7.5 0 Td <42> Tj 7.6 0 Td <43> Tj 7.5 0 Td <27> Tj 3.7 0 Td <08> Tj 7.5 0 Td <27> Tj 3.7 0 Td <0B> Tj 7.5 0 Td <3E> Tj 4 0 Td <0F> Tj 7.5 0 Td <44> Tj 7.5 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <08> Tj 7.5 0 Td <0B> Tj 7.6 0 Td <27> Tj 3.6 0 Td <0B> Tj 7.6 0 Td <27> Tj 3.6 0 Td <0B> Tj 7.5 0 Td <27> Tj 3.7 0 Td <0B> Tj 7.5 0 Td <3E> Tj 3.9 0 Td <43> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 694.8 Td /F2 12 Tf <15> Tj 10.2 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <2F> Tj 6.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <34> Tj 4.5 0 Td <27> Tj 3.5 0 Td <04> Tj 3.8 0 Td <04> Tj 3.7 0 Td <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.7 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <02> Tj 7.6 0 Td <13> Tj 7.6 0 Td <14> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <3C> Tj 4 0 Td <20> Tj 11.2 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <21> Tj 4.4 0 Td <17> Tj 3.7 0 Td <23> Tj 7.6 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.9 0 Td <22> Tj 3.7 0 Td <03> Tj 7.1 0 Td <27> Tj ET Q q 0 0 0 rg BT 125.5 666.7 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.8 0 Td <19> Tj 4.6 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <19> Tj 4.6 0 Td <19> Tj 4.8 0 Td <17> Tj 3.6 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <03> Tj 7 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.7 0 Td <37> Tj 3.6 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.7 0 Td <2C> Tj 3.4 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <02> Tj 7.6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1A> Tj 7 0 Td <18> Tj 6.1 0 Td <17> Tj 3.7 0 Td <1F> Tj ET Q q 0 0 0 rg BT 90 652.6 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.9 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <03> Tj 7.1 0 Td <14> Tj 7.5 0 Td <27> Tj 3.5 0 Td <04> Tj 3.8 0 Td <04> Tj 3.7 0 Td <35> Tj 8.6 0 Td <24> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <20> Tj 11.3 0 Td <06> Tj 7.5 0 Td <22> Tj 3.8 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.7 0 Td <23> Tj 7.7 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj ET Q q 0 0 0 rg BT 90 638.6 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <02> Tj 7.7 0 Td <23> Tj 7.6 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <0A> Tj 3.9 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 260.2 Td /F1 14 Tf <0C0F10> Tj 23.9 0 Td <11> Tj 8.4 0 Td <03> Tj 9.4 0 Td <05> Tj 4.8 0 Td <09> Tj 9.6 0 Td <08> Tj 8.7 0 Td <22> Tj 7.9 0 Td <0F11> Tj 13.6 0 Td <08> Tj 8.9 0 Td <05> Tj 4.8 0 Td <1103> Tj 17.5 0 Td <06> Tj 10 0 Td <0E> Tj 6 0 Td <0F> Tj 5.2 0 Td <1E> Tj 9.7 0 Td <1B> Tj 9.9 0 Td <0A> Tj 7.3 0 Td <0B> Tj 9 0 Td <02> Tj 6.3 0 Td <0F> Tj 5.3 0 Td <03> Tj 9.2 0 Td <06> Tj 10.1 0 Td <23> Tj ET Q q 0 0 0 rg BT 90 239.7 Td /F2 12 Tf <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <04> Tj ET Q q 0 0 0 rg BT 112.3 239.7 Td /F2 12 Tf <26> Tj 9.1 0 Td <1B> Tj 7.5 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <26> Tj 9.1 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <38> Tj 3.2 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <02> Tj 7.7 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <18> Tj 6 0 Td <17> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <36> Tj 4.6 0 Td <41> Tj 9.7 0 Td <30> Tj 7.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj ET Q q 0 0 0 rg BT 90 225.7 Td /F2 12 Tf <1B> Tj 7.7 0 Td <1A> Tj 7 0 Td <07> Tj 5.7 0 Td <14> Tj 7.5 0 Td <15> Tj 10.2 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <22> Tj 3.7 0 Td <22> Tj 3.9 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <03> Tj 7.1 0 Td <13> Tj 7.6 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <30> Tj 8.2 0 Td <02> Tj 7.6 0 Td <06> Tj 7.6 0 Td <45> Tj 7.5 0 Td <0F> Tj 7.5 0 Td <0B> Tj 7.3 0 Td <04> Tj 3.8 0 Td <2A> Tj 12.1 0 Td <30> Tj 8.1 0 Td <25> Tj 8.1 0 Td <26> Tj 9 0 Td <18> Tj 5.7 0 Td <04> Tj 3.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 211.6 Td /F2 12 Tf <1A> Tj 7.1 0 Td <02> Tj 7.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.2 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.5 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.8 0 Td <26> Tj 9 0 Td <35> Tj 8.7 0 Td <25> Tj 7.9 0 Td <04> Tj 3.8 0 Td <20> Tj 11.3 0 Td <1D> Tj 7.1 0 Td <14> Tj 7.5 0 Td <03> Tj 7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.8 0 Td <04> Tj 3.7 0 Td <31> Tj 8.7 0 Td <02> Tj 7.7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.4 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.7 0 Td <1A> Tj 7 0 Td <07> Tj 5.7 0 Td <14> Tj 7.6 0 Td <15> Tj 10.1 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <1F> Tj 6.7 0 Td <1B> Tj ET Q q 0 0 0 rg BT 90 197.6 Td /F2 12 Tf <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <18> Tj 6.1 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <40> Tj 7.7 0 Td <02> Tj 7.6 0 Td <17> Tj 3.8 0 Td <06> Tj 7.6 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <2204> Tj 7.5 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <03> Tj 7.1 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.8 0 Td <11> Tj 7.5 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <26> Tj 9.1 0 Td <35> Tj 8.6 0 Td <25> Tj 8 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1D> Tj 7.1 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj ET Q q 0 0 0 rg BT 432 197.6 Td /F2 12 Tf <46> Tj 10.3 0 Td <03> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <1A> Tj ET Q q 0 0 0 rg BT 90 183.5 Td /F2 12 Tf <18> Tj 6.1 0 Td <1A> Tj 7.1 0 Td <20> Tj 11.3 0 Td <06> Tj 7.5 0 Td <22> Tj 3.8 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.7 0 Td <21> Tj 4.4 0 Td <17> Tj 3.7 0 Td <23> Tj 7.7 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 7 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <03> Tj 7 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <42> Tj 7.5 0 Td <10> Tj 7.6 0 Td <0B> Tj 7.5 0 Td <09> Tj 7.4 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <19> Tj 4.6 0 Td <1B> Tj 7.4 0 Td <04> Tj 3.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <06> Tj 7.6 0 Td <45> Tj 7.5 0 Td <0F> Tj 7.6 0 Td <0B> Tj 7.4 0 Td <18> Tj 6.1 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 161.3 Td /F4 10 Tf <697020666C6F772D63616368652074696D656F7574206163746976652035> Tj ET Q q 0 0 0 rg BT 90 150.2 Td /F4 10 Tf <697020666C6F772D636163686520666561747572652D616363656C6572617465> Tj ET Q q 0 0 0 rg BT 90 139.2 Td /F4 10 Tf <6D6C73206970206D756C74696361737420666C6F772D737461742D74696D65722039> Tj ET Q q 0 0 0 rg BT 90 128.1 Td /F4 10 Tf <6D6C7320666C6F772069702066756C6C> Tj ET Q q 0 0 0 rg BT 90 117.1 Td /F4 10 Tf <6E6F206D6C7320666C6F772069707636> Tj ET Q q 0 0 0 rg BT 90 106 Td /F4 10 Tf <697020666C6F772D6578706F72742076657273696F6E2035> Tj ET Q q 0 0 0 rg BT 90 95 Td /F4 10 Tf <697020666C6F772D6578706F72742064657374696E6174696F6E2031302E31302E31302E 31302032303535> Tj ET Q q 0 0 0 rg BT 90 83.9 Td /F4 10 Tf <6D6C73206E64652073656E6465722076657273696F6E203520> Tj ET Q Q q 117.4 296.5 411.8 329 re W* n q 411.7 0 0 410.7 117.4 255.7 cm /Im16 Do Q Q endstream endobj 15 0 obj 12427 endobj 16 0 obj << /Type /XObject /Subtype /Image /Width 1050 /Height 839 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 111444 >> stream ÿØÿàJFIFÿÛC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÛC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOÿÀG"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ï袹]%í®nî…Ôº³Ü ù‘J=×”…_?ZꨮR=emî–öO<[Åixí”ÈX¤ê¹çñÇ 8éZºF³ý£s-»E¼h²Š_1H$Œgc§¸æ€5¨¢Š(®OÂÏkua§Ë4ºÄ—ŒŠÌî÷^[7^Iùý*{ÍZâêM>h#òìšùãÞ&!åÚ’‚ ÷r¤õì8 –ŠÀÑ5;»»Ø ¢Ú6À/3<€¾î¤˜ñ޽³ß~€ (®dÞ\Ái¨i^|†ð\ˆmäf%¶Jr­ŸöAoûâ€:j+ž}r+¸„#>ÛötóîÒDJÅ‹vŒvóõ4‰â€Ñ;}Œ—ò£Q&D²,6©ÇBY0Úé@›¥j˪a‹lb¤,[£8'n1Øcó­*(¦O'•’ãvÅ-\ ç-Þm×TÖ5‹ˆ$»E“ÌûcBˆXd*®Bð=A ·‡_ò ,LÖ$;œþ¹­áÛQ4n..„qLóGñ±ƒÀÆqóÉã¶9­m¿íÉú…Û“ôÿ ¡e¤Ac,A,ß¹µK\tOºOFOLu­nßöäý?¿íÉú…:¹ùciµ˜5Gе?´CE[}§¯$yF[ïÞÛþÜŸ§øQ·ý¹?Oð  Ïìh'V˜››yåœ] »á B2: Èäõ§É£C<Ös]\\O-œ†Dw*7Ø…P1ä ÐÛþÜŸ§øQ·ý¹?Oð  šf™o¥Ç4vÛñ4Í3n9Á=‡°ô«´Ý¿íÉú…Û“ôÿ IX¤NËHUI¸Ë{ 3õ"¹Y4ÙÒ[(ôývrÙ%´(ê.X`k«ÛþÜŸ§øQ·ý¹?Oð  ¹tX/Idk˜#º+%Å®åÚìûØž;[ëZ›·ý¹?Oð£oûr~Ÿá@¬ NÞäêïuk®ŽaXL–­k±ÔÉAËÐVîßöäý?¿íÉú…bØèñµ¥¿”—útֻў&‘ƒÍœnR çê;TŸðŽZ$a-§¹¶/&CŒÊ¹'æ$rÍÈÁäóZÛÛ“ôÿ 6ÿ·'éþ—‡ì¡¹4±H²+¡B>P¨©°q÷J¨È?áRÅ£ÛE,2+ÊL72Ü®Hå¤Ý¸:|ç…_ÛþÜŸ§øQ·ý¹?Oð  ¡áûdyW7Q˜D«¹YrË#ne‘¢V•nG*v?IåH ’i5,ÇØW76¥çJ÷‹“ÄKqå„ö$IõÉü+S\ó&„XÆŠ|å,Ìe)´+/¢ž¹¬«X ÔQ­¯›8*Ž&-°w8*3ôÏ5ÙB*1çjç%isK‘;â{¨Æ ¹t$t˜™Wë’sŸÇG26YeyY%‘w¹É8sXtÚ|Fº´—Ë'…·bY\añý+£Ó­ÞÞØ‰]]ÝÙË*í1'¦O­Ž^]:‹¦¤Ôž…º§4ÆR2ÛIãiåÏ·µ\¬Ës&aò~þÑË¿µq€ 1™‰ôÙþujÚã~ÎIû­ýïþ½X—îËömž~ìu¬»cþ‘_¿ßèhV¡¸`AYØáucSVn¯®mšÙü¹Ã²«vÆÒH#¸;EL¹¬ùwµõ#‘\òÏ)”ò|¹YQ}€éêúÕJ-RâÚ9žI¬x”|`r=½9«Ñ\_¹‚xD!qæàä? ƒŽjÕ¤º]ÕõÆo9yãv¶oÊpHÇS\˜Z5Sr¬õìiRqÑEÑ•Ð:0eaGB*+¼ù2è2,*®nÖÑ\GæŒ\H#Lp€1ÜU«¿õþº'þ„+´Èž[+h‚—’çæ8HìIëÐ})‹mfÎͺRzoy?Y¼m²Úúlôªº›fÞVWÛ„' ="­Fä·bìØç¥Çýþoñ£û6ùéqÿ›üjÔD˜”ž¤W2ÚÅÝŽ³«·yíöÞ"í6<¡"D *àçæl‘Ç^õŸÙ°ÿÏKûüßãGöl?óÒãþÿ7øÖZæ´ÿe͵—ïuImï›î¯™ÇÜãîu<[Äs´àɦì³7ÍcçyàáÊ·t;ñžýhSû6ùéqÿ›ühþ͇þz\ßæÿ­w5̳iv¬<‰¦“Íc¨ƒ$nÀÈÜPt²oe¹“@]U/nc2ßFñªHB˜šdEBœàq–4¿ý›üô¸ÿ¿Íþ4fÃÿ=.?ïódjF{Ý_Q·wécd’ÅåHS29˜ãï°pr9aÆ7pxäñ@öl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5Ȧ©{}¡ßëíq–ãË™¤Þ<÷Â9=kv²u_ù i_ïMÿ¢Í7ì6ÿôñÿRÿñUÐ¥½í—’Ó ò²°iäpFÆ8Ã1@ü«3SÕ5Í7PxÅ/c»lZ:eDgu‡~™ê8ÉÈè·ÂÜ¡ÒVúT–àHDŽ‹€O–ý¿ý_AÒ€/N»ä·Œ³ypv±O¥1Ò–tX¯œ@Û]Äà(;CwaÙ…I'ü|Ú×oý•«.ý–Mz;Žmn/˜§î¹[xÊ©ö'·|V”áÏtDÛV±b ­>âS»ÜK þ¼ŒŸÈIW­mm® óQ®”ne*Ó‚¬Tô> Óõ tÈÞÔd¶V¾)Ü:Ï~iÚGüy¿ý|Ïÿ£^³jÍû­¶/öl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5›m⥽T—OZ=ä¶k?Ÿ“½ víèvã¯Sz…¼G :ßO©²¸¸B³4‘˜ÆXAíœw4±ý›üô¸ÿ¿Íþ4fÃÿ=.?ïóQºÖn´ý1¯5; ,È‘F—òÌq†%@\wÆ{Ôú.¬5E¸4GÂ1ŽO1 U°3× ÐÿÙ°ÿÏKûüßãGöl?óÒãþÿ7øÕ×LzäZsÅnÂgtSÎùª–ù“hÛsÚ¢°ñÞi÷w‚Ò"mâ2}šËÎØèTmoÄПöl?óÒãþÿ7øÑý›üô¸ÿ¿Íþ5ˆKi åÚJÑDÚèÈ÷Tù‰A‚7gíEçˆ%‚öKK{4«z–‹™¶†-›¸ðpNþ¾Ô£ý›üô¸ÿ¿Íþ4fÃÿ=.?ïóQë.¹›,Vß¿wLW[ÝT·Ì›Fî{UŸ±C{}§ky줻Œ¬Á؄ۑŒ gpÁÏ=À  ÏìØç¥Çýþoñ£û6ùéqÿ›üjÖ³u§éy©ØÅfDŠ4¸ß–cŒ1*ã¾3Þ§Ñuaª-À1¢<ŒryˆÙ‚­ž¸è9€'þ͇þz\ßæÿ?³aÿž—÷ù¿Æ¨I¯ˆu¨ì&Km’3¨xîwºBÿ:mùF÷5UüTÐAÝÕ€ŽÎâÒK¸™fÝ!U @+´HqüF€6³aÿž—÷ù¿ÆìØç¥Çýþoñ¬Sâ¶÷l’YaòH[{êâIcqQ†Î:t扵ýHÞAk¼S ñk:´å …ôöàŒsœ€ 9-ÖÚî%å!ãrC¹n…}~¦¤§^ÇìõÍÿšShªúœLöÌ#¸Æ ?vAèßãÔUÏ1}þù4y‹èß÷É©”T•™2‚š³9ý>ØÝßÏ ÚÜEäÆ¿ ‘”Kg¡ç·5¯m¦ÛÚÎ&ŒÊ\2ò3p~§Ú¬ï\ç Ÿ÷ bú7ýòj)ÑŒ:1‚Û^ãè¦y‹èß÷É£Ì_Fÿ¾MjlƲ¡GƒèqUnm#Ki]ZMÊ„Þ7§Ö­y‹èß÷É£Ì_Fÿ¾ gÛÛ5ÁÞà¬gœwoþµi*„P` o˜¾ÿ|<ÅôoûäÐè¦y‹èß÷É£Ì_Fÿ¾Mgj¾x¼¶6öæRÑÈ™<*’PòT. Úc¹¶•sÕ*Ÿ¡PAý+ óÑ¿ïƒG˜¾ÿ|ÞÜV9êaã7w¹ÎØé‹4ÉåÚ¬0«f1„/Ž@Ç\gž}:WH7Ì_Fÿ¾ bú7ýòj*TuÙ¥:jš²Tg¢!âÝ´tÛÕúÕoÌ_Fÿ¾Mbú7ýðk3C, ·)Ô„lÿ*¹km·ã}Ñéÿ׫bú7ýðhóÑ¿ïƒ@¨.ái£Sm’6Ü„ôÎçÛŠ“Ì_Fÿ¾Mbú7ýòh­•ì™Vé„2ñ”n½ù¢²4¬Úk·w¢ÞgIL¡v® ÜàŽ¸ì+ -9(OÕøPEaÿ?áNâ± €aŒêT¼®ø=b­>ïý@ÿ®‰ÿ¡ “Ì_Fÿ¾ #˜ÝJºSÔ$*C-^ÛÉp±yR*Éÿ~úÔét«†óÙo¥6f†Y,¤çsœ2~^€}Ú~¡¢Ç{§Áb·WÖðìÂó…Jçrž…GL{æ¢ò-?çÙ?ïÏÿZ"Óþ}“þüÿõ¨÷šW„<—wK)ƒìóI*™ãôo—©å@#'« §˜Òt·¼¹…d. ÂR8ç9ëU<‹OùöOûóÿ֣ȴÿŸdÿ¿?ýj ðôiVúx¼»uµu{iX¦øJŒ  3ÔäÕ‹=&;6ˆÅsrv´ fßgã’1Æ0Wò-?çÙ?ïÏÿZ"Óþ}“þüÿõ¨‡Ã¶ÐqÕÚ¬q¼v˽qj©N:únÎ:t¥ŸB2_‹Øõ]B „ PÄr çøòO'x¤ò-?çÙ?ïÏÿZ"Óþ}“þüÿõ¨K½ ÖêîIžYÕ&diàF&)¥¸Ï`8# æ¤])¤—×W7s HT$;¸8  ž8äž*¿‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@.tǹ´ŽÜêW¨ HÈStÀã;²½}×MCsáûI–4†YíUmÅ« ðŽˆrNy<ži¾E§üû'ýùÿëQäZϲߟþµ:oYK32¼ÑC'—æÛÆ@Ž]˜Û¸c<dœÔWžŽQ;[ÜÍwy£ˆbŽfy˜Æs’N3ŒóŠ‘iÿ>Éÿ~úÔyŸóìŸ÷çÿ­@°B–öñÁÛJG ŸXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlQXþE§üû'ýùÿëQäZϲߟþµlVN­Æ¯¥gûÓè³Mò-?çÙ?ïÏÿZšö¶2 =œL:àÁŸé@w§÷×óªwŒ÷OÁ÷ÍÓþ¹½/Ø4ßúÁÿ€ãü)ÑZØÃ ’8£qÑ– øâ€&“þ>m?ë·þÊÕþ’ןjŠX"–)¦Y‘¼æã`Š ‚à‚½}êI<©l‘ïÎ2¥GäZϲߟþµ5&¶vW":^¢â%¸º’xâ‘$÷ ‚T†\‘';Õ-7ÂúŒû_]k—ïd¿m/"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ†ÛܰëÚ\iWsÉ8ŽyÚະŽÏ¿*qÆOj’}Æá—ÍF1­£Ùù@á|¶+Ÿ|üƒÔ>E§üû'ýùÿëQäZϲߟþµ!þÃì^Òêúòå CJÊ"§*TªŽAÇ'=*í´–ÈË-íÅÑ'ïLì6ªŠÏò-?çÙ?ïÏÿZ"Óþ}“þüÿõ¨©á»xî"–;ÛÕÜ=ÄHv£>íà|¹ î=I#<SC¢¬w2]Iy5ËB`Yœ hÔxÚ 9 Ô~E§üû'ýùÿëQäZϲߟþµ áÛy »IšìÆdŠ3”ÆÕ ÁöúчmaœNn.¥”] ²Ò8%œFc玘9ǯL(ò-?çÙ?ïÏÿZ"Óþ}“þüÿõ¨"ðå¼WQMåà\µÌQî]¨Ï»xû¹ î=I#<J<7§ý’ÒÖC,ÚÚÉhªì>tp îÀëòF(ò-?çÙ?ïÏÿZ"Óþ}“þüÿõ¨ÿØq½‹Ú]_^\¡(ciYCDTåJ•QÈ8äç¥]³¶’Ùe½¸º$ýé‚=†ÕQYþE§üû'ýùÿëQäZϲߟþµ0xnÞ9RT¹¼"Þâ(w¦ÐÏ»zò¹!·0ä’3Á—§xq¥¼D»¶¼M>I-„Ws£®W › €§’wr=+_È´ÿŸdÿ¿?ýj<‹OùöOûóÿÖ ¶ˆ%µ6×:õÄ[£eò»8ä('•ÎN)fЭ¥»{¡4é3Ý%Ðe+òºÇåàd ç9õ=*?"Óþ}“þüÿõ¨ò-?çÙ?ïÏÿZ€-ÞÇìõÍÿšSjÒÛtp„8ÆV<J“Ì_Fÿ¾MU¸ç6.nPqò¡t'õ¤X.Þ5‘f¾*ÀwAÎàéÿ×5Zµ•N™n ÿ–KÓè*¢®Kv3Ô»/o=ý×ù¡¹½·³Ûö½^X7tóe…sù¥Iÿ/—3 òÇ'îŠÈÓ ?Ûš¸¹)ö¯5vîëäìqíß&¬Æ¶6#s,k$Z…Ó£ †Vˆ‚>¾];Ïíççÿ¨ã’Ü,iİ)׫ÚA#6ÕT”¸>œ•^zñŠõ“º¹ç5gb|Iÿ?·Ÿœ_ünŒIÿ?·Ÿœ_ün™çÃÇïS—Ù÷‡ÞôúûT”ÄEhgšæhžúë 0E EЪž~OsSjæ=Ëíwz•ùp_‘"''þPéßòŸþ¾ÿ@J×ÕŽœ,ÿâmäý›pÿ]÷sړغi9+«¢•¤"óMKè5ï.DÞ¡– qÿ|U_=~Ñöí+?fÿ/|;¶çÆÌã=ëf²(}‡Ëû7”|¿/îã«‚Ö›ìž&¦H[8 ó뛼ªß–Aü)¡JÜÎÇH“+Í$)©\4±cz„²g¦FÎ3RbOùý¼üâÿãuÍø{÷Zž£srDos >ó»šM£ðGá] O ïÝ* „Ë”ž™ô ‘äKŽ/nÁÿ¶_ün›§.lãš}Bê<Â$rXÎxÙïO¬ø÷aÛíéå&ï¦õÅgV~Î]‹§y¨÷%{à$Â]ß2ÿxùCôÙW,¶¢xuÆù¶•" Aÿ¾*¤Í§ªƒÆÌp§ïŽr}¸Ç­,>Õ?ÙÈ0ñÐgüæ¸(bj:Š2’iö;*ЧÈÜSV$†uŸ‘©\Iå¹GØð¬:ƒ„àûQËq–ßR¸–6ΞµÇÁ$¶W7±ÀXVyâŒá”LËŸûå³ÿ­Ï môhmª4êˆO$ _¥zg±‰?çöóó‹ÿщxÅíß¿ú¯þ7LYá}›%Fó)†pqëRPbOùý¼üâÿãtbOùý¼üâÿãu®èÖwËpî¶óíÎg*¾€ÏëÓÓ‰oqqsk=ÌSIv±¬ZÇ;î‘öŒNHÇ X®;ÙJ£NÖ;©a#Ršš—[=6~Þ}-©ØK(„6£sf 4#$ôêúÒ™6ʱ6¡r$pJ©h²@ëåûŠÍ´°šçÃÂËV%¥‘[yß¹—,Jóýà1øŽ*y’Ú>¥¨L¯9Ý |`*FÅOÓ$?_jÑlqÉ%&“¹µ‰?çöóó‹ÿщ?çöóó‹ÿÓ ðŒæTMçæ/¯ÓÞž` AäÞ™$)$æöXíÖÅqåg$°9ù=…'›p¶¶ÓÉy*›”bEglŒà*ÂIãÒ‘?ä%?ýqÿBzo†ä_ífŠ|y¿ÙÖÆßwxöüÛàXÏáZBÑo±né û\¾\íöÉÃÁLñ;,rlHV„Ç¥O4Ëo–}Jâ(ÇVw…@üJUkPµû5õ‘-ËZÊWtL™8b0zކ°uñ.›ö;G•'•¿îùÙ\~;wcñ¬ÚjFŠ>êwþ´4­o ¼ m5ig ÔÅ$-É*|Iÿ?·Ÿœ_ün¨ÛßÛ5õä- ·’ žd’là Aú¸<Õ¶žߺT –)=3é@‡âOùý¼üâÿãu ¤“Ë i/n· ~_(   ©êµú‡ÿ®ÒÿèÆ  kÛÆ²,×ÅXè9Ïü£Rì8½¼ô#÷\ä:е•N™n ÿ–KÓè+7þ_.f åŽOÝrŽ„§©Qõ67d“Ä]I ­qn>‡ä«ªYÔ2ß]²‘Aˆ‚?ïÝeÞÈÍ¥ÿ× ý§ZM<+¿t¨6,>RzgÒ ¡ø“þo?8¿øÝKÚöïÿ!ñºEtfeWRÉ÷€<­:€Ïíççÿªÿn‡í¿c:иì‡Ëã<~ïž9§^Ü­¥¤·ÈEÎ=Oaù×-£\ÅjòëÛÝ  ÈÝ@å€?ÝÈàÕ(ÝÔ«Ë$¾ÿC¯;À$ÞÝ€:’bÿãuV FÒáÙ-õ§•Ôd¬s@Ä Jm×Ù5=eûB‹iãd2«cðïY«qwiq•êÚN³FâàXm\ò¼àÜT›‘9š$–+û§Ô2²˜ˆ ô#÷tìIÿ?·Ÿœ_ün³t)bOéÁäE+e°,`äûV‚Ë6Õ‘KÝ€yǯҀ#i'±Ä/n¶î†O8çûLÖ‡2~_ðH›wIC4ÓN ˈæ|ìI±|uÆè X®7Ù¥Óß]G rY¢Aäùu±s¨ZÛÞÃm0K+ŒùLT“ž7cÀÇæ'»îçË;7{nÇéYµf‹Œ}ÖÛ6m¯ínÜ¥¦³$ì£$E, @ü¬âOùý¼üâÿãuGí¶Ë«W€Ç"ÀeYÎÍ¥\àç#’:Ò­™ą́0›ÏÌ8__§½?Ïíççÿ¨`’w–á^öëɵqå6©çä÷50!€*AGz­«ËzŽ¡•¥‚2òÒ€,âOùý¼üâÿãtbOùý¼üâÿãuÈêö–º Ò^Ú åceþso\©†OC׿CÏæ·ÖC{%ËnY®d£UÈ;qô韼[<q—´wµŽ÷ƒ*šž_Uo×¾žw: BÒÒQÖ´ðHÃ!$š$zà§µL% êƒQ¹.ë½T<9+Ç#÷}9ûÖïÚ¿á$º[H­äfÓãÏr |òvçéÅR·ÔšËL·ûé"ƒL™ÕdQ’ñ².N;uèqZœY‰?çöóó‹ÿÐD¸âöìûeÿÆë&Æâá5ag%ἎK_?yUNà8ÚõqwW0­Nn)ÞÇI‰?çöóó‹ÿщ?çöóó‹ÿÓxW~éPl 6X|¤ôÏ¥9]™UÔ²}à#ëLÌŠy'I­Õon¶É!VÏ•œmcÇÉê*lIÿ?·Ÿœ_ün«Ý¯³ÿ®ÇÿE½gëº5ä2Ü;­¼û@ó™Ê¯ óÆzôôÅL›JèÖŒ#9¨ÉÚþW61'üþÞ~qñºŽy–ÚšçR¸Š%ûÏ#ª;rJW!oqqsk=ÌSIv±¬ZÇ;î‘öŒNHÇ X®;ÚñÞÃàô[Ü=К"C9=gRnyÆÆ}³S ót6Äa½ŠÕë{[úþ»Vº…¥ä†;Miçp2V) b®UœIÿ?·Ÿœ_ün«[Ëu‡kèm E åþ¹Ê®*c<#9•yù‡ ëô÷­Aø“þo?8¿øÝB’NoeˆÞÝlXÑ—VrKŸ“ØTÀ†©AêºÈJúãþ„ôcÏíççÿ£Ïíççÿ®gYÓ,´Ù Ô ­¾a·2•ós•ç±=:cqƒL.©=»Ú^K%ÕéÞ¨· ¶Ý0q¸g?Sخѓ÷²ö;XïX8J jz>ë¶ýá獵_4Ëo–}Jâ(ÇVw…@üJTv·^6š´³…êb’Çä•›¨˜Ç‰tß¶mò<©<­ÿwÎÊãñÛ»G©jl‘ßGeZÞC%º´®ˆÁÕäÚäcw\{V§»‰?çöóó‹ÿщ?çöóó‹ÿÔ1ÈŲ[¥v‹Ýʃ“Ó8À©UÑ™•]K'Þò>´"!f½»88ò¿øÝJÖ÷ˆ2Òßþôÿd¨.N-¥>ˆ•kÜH­ Gppjâ®Kv2v‹Û²¼_ün«Üj¶²îu—…ÏE’hŸÀ¥Kߘd%qÉÏsXþ6ÿf½&?µ}¦_µoÆ~ñÛœöÛ·ªZ³(ÙYC»"j7,ê àÿ«ïƒùSñ'üþÞ~qñºÍ·»Æ±{ÉÛÅ ‹Ž¾ø}§…wî•Âe‡ÊOLúR—ROJÑÞÝdÈŠwyG‚Àà÷©‚ÌΨ—W¬Ìp0úgº{U{ïø÷_úíþŒZ· m½¶?íŸý©¥v&$‘ÜÂ3-Åê™- þIMÄŸóûyùÅÿÆêæ¤êöÓÌàõ¬-lÏÿåáµÝç}¶íëÓ·½9+ ;“¦£i%ÇÙÓZvŸ8òÄÐÏÓfjÄry©¾-Bå×$eZ"2ÿWØ‚*¥ƒiÆÆ×ì†#hòqNÞõ‹tg±S<Šei§UBÈÀ=%8“þo?8¿øÝBÒN/cˆ^ÝlxÝú¬äï³ý£OYá}›%Fó)†pqëQIÿ!(?댟Í(ÂIŨ¹{Ù#¥h—t©¹ˆb¸BrI$3M4鼸ŽgÎÄ›Ç\n€gð¨tÉUuû¸ÀFŠçìûº<ãœ{íý3[÷:…­½ì6Ó ²°XÏ”ÅI9ãv1œÆkZ”ù]•ÿ¯‘”[j÷1â¸ßf—O}ulÉfˆg“åÓ-¯ínÜ¥¦³$ì£$E, @ü±¯Š -íXû˜žvﻟ,ìÝí»¥j}¶ÙucjðäX «9Ù´ +œärGP:V+cy«I¤^ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆé†xFs* &óó×éïO0H òïL^÷·ù ÿÓÖ ·dY¯Š°ÐsŸø6¯ZʧL·ÿË%éôQW%»ê]‡·ž„~ëü‡H²owDÔ.Y£8p"Tã8?»ã‚ 'ü¾\Ì@+ËŸº+›¸–î×QÕn­î6"^Û+G°û–%9'ØñŒRjÌkc§ÄŸóûyùÅÿÆèÄŸóûyùÅÿÆéž|<~õ9}Ÿx}ïO¯µQÕe»h#þÍ“qâQ&ò9 »+œã¯½!–î“ÌX’Yç™âÑÉå•aæ/ίgØÏ…Ÿþ§øVE•Ê]éös¤’Hâ ZE²%ä3zq]gÜAaÑ@šm“Í.HS #stí‘ø‘õ·ÓÖQö´ŒD_ºS¿?ÝàŽxúãPñ%¡Õ’+Ä÷PüªÃ$:3 ê “‘ÐpNp0Öl®õ WX‚FÓe³³µ.ÄÜ.خѴF[¡Æ ¢2Œ–†sXÔJÚÙöóágÿ€éþgØÏ…Ÿþ§øU[­L´ûwÚ.J}ƒËûGîØìß÷zsíš³ý­ÅíÕœ2nžÓgœ»HÛ¸eyèxô Ð_ìûùð³ÿÀtÿ «¨YÚE/ ¥¼n.aÃ$J¤|㸧TµOø÷‹þ¾aÿÑ‹@ÞN-læ¸#"$.GÐVCë7Éÿ.vøÎ3ç7_O¹ZÈ΋|üûÉÿ š¡¦êÖ–0¿œ>éþHödÅþ×ùÿʤši'c®…8ÊN7,iúœ×7gžÝ"m¤ü®[¡ƒ=kR¹Ý"W›Ä3–œ\’( ÊWENœ›Ž¦xˆ(NÈ¥1-)*ŽAÿ`ÕdŠå#XÒâpŠ€aS€?à5­Š1Z¦ÖÆ2¢…ÑÝØÊìäLxè1Ø{S.l-o ›»çÛ÷|Ø7có±Š1I»”-¢  P V2"åêt‘ÙÛÅåyvjžH"-°ã`=@ãŒûU»û¦µTØ¡™Éëíÿ뫸’$ PqéšÊ5¡)ºkt[§%7³3/c’[ˆã˼Lª6žIö„4ñLc“Ì‹;Ï´ñF+RSkTRógþýÇþ=P¬!g–ažd¸ÞÄ1Î8§Š1JÈ|Òµ®bK¥ØÍ76› ’ÿ}­ÁoÏ+ÙÛÉæo³VóH2fï#'Žq¥kbŒS$ÌHQ$’D·*ò]„dÀÀÉÇÕ6ûÿ|ÐÅ  ¹íã¹…¡¹¶óbo¼’E¹O~A m•²²ÛéÐÄ«0Kp¹*r¤àvï·Jz[Ä’ Ø+„†`í8éíZ˜£’ñÈobFû7Rvž¤®?‘¦ËjÓYýŽhc–#H»à}ÊÅ‹d0`Aäò1[£]ôŠ{˜ÑÛH“Å1S#ÄwFfóä qŒ€ÒœÍ:+P–QÚÉJ‹Cº3†ÀÇJ×Å¡êîÂ+•Y‘iv0,‹› k"•p–à¨8Š”ÙÛ¶íÖjwGåÃÕ?»Ó§'Ž•­Š1@ÌåMŠ"eU!Ê¢‚9k–hÜ2ü§‘±Góµ±F(çM²¼Iw§C;´4¶áˆ™#Þ¦ŠÞ8qäÛyxEA¶,aW8: œzÔÅ  [6ÊòA%Þ îÐÒÛ† zdz•-¡B…-B”B‹ˆ±µN8p8{V®(ÅdÛYÛÚ¶ks–òáÛ“ïSa¿¸ÿ÷Á­ QŠÏÃqÿïƒTàÒtûi–km.Þ)Wî¼vÁXvà[˜£›b(Ö8¡dDUV2Њ­.—c4ÞtÚl2Kýö·¿bûÌ1‚xäŒ }jâŒRnàdýŽÜckĆQûžŽz·N¼žzÓ$ÓìåŒÇ-„NŒæB­Acձ޾õ³Š1@&‰pÀÊ‘ÍmXÈ ªêO@kJxRâ ”ŠQ€$d#‘RbŒPv™¢iÚSÉ%œd”ÎÌYˆÎq“Û§ä3šÑ£b€ (Å ©êjÍoÅfÄñ1 2pjæ(ÅDï£#£²° ƒráYš2m¸f‰ˆÈW¸•xún­ÌUT‘a¿¼‘ÜF‹E˜œ—$šN)î\g(ü.Å KÉ‹[\B¬ÃŒ¬Ç‰5kûgLÿŸè磌¤xªËV¾šÒ OyÊ$~¼uÇ> qš™'T»$䙟Ÿø¡$¶&Rrwnç¦â¢º‘¡¶’EûÊ8©ñUµþ7ûµ›Tä×fU$œÒ}ÌØnoîÇÜG%°Ó4[ÞÜÁp"¸%†pÁº|ÔÚâøõªÚü…ê¿ÈWˆý¤(Bº›½ÿÏüQrJ¬©r«Xn ×&l\ NÎ8ǵZ°šæ4Ý>~ΉJþXõ£\ëü úTÓ‚t1î.Jµ CQ©?u_×Ô—5*PM-]½ Mwyu!îr;sRÚj¤þM× œdŒ©tFO.Dã~sîEUÕ™ôˆðHP9çüâ§š¤)G¦ÛoaÚ¨èòè‰ï廬ð$dP8#;ª»Ï<™uÈ~Tš¯ížxü«bi"ûÉ‘å”8Ç~:U¨ÎµJ—›V%¸Ó„-îE§Ý}ª#¸éÁÇzµŠÈÑ›‰°L~µ³Šô0UeRŠ”·8ñPPªÔFâŒS±F+¬çŠ1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ âŒS±F(¸£ìQŠn(Å;b€Š1NÅ ⨴“&©p!µ’ra‹;ßšOïZ¨-ÿä-uÿ\!ÿФ  Éçdzf"ùk±0ð«Çæàp8öçú†N£u¹JŸ9ò ŸN+իʵ/ù Ý×gÿÐz–*+˜|ûw‹8Ü0 OŠ1JQRM>£M§tQÓ¬šÑ{+3á銊ëMiï„ÁÔ!ÆàzñéZx£ƒÂÓtÕ6´Fª¼ÔÜú²†¥b÷b?-•YIûÝ0ýUf(B[¬-ó»O¿6(ÅZ£7;jÉudâ¡ÑsèÒ&R½ƒpjk(Ã*Ë;)+ÈUéšÖÅ®xà(F|é¼]WVÎwUÔXzü©çF¹Þ@xÊÿx“þzóLk‹Õ™]Bq¸¼zVŽ+žR¤åUuÐÞX·EAôÔ«gh¶°ìS’NY½jÆ)Ø£é„Tc²8e''w¸ÜQŠv(ÅQ#qF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜUh?ä-uÿ\!ÿÐ¥«xª±È^ëþ¸Cÿ¡K@ëʵ/ù Ý×gÿÐz­yV¥ÿ!;¯úìÿú Wŧb¹qâ|[öo¶ÁöC)³û>W›·w™ýìg)éšé±F+‡ÄÚÃ$ÚŒ­…ÅÚ$Èà±òšF¦ÈÈÎs‘Ï\Õ™õ»›8núÁ#’;9.ãHçÞP ÊNÑ´üËê9ö  œQŠÈÖu;«i (£2Fö„³¾ÌPއû½ÚÏnvq@ ŧb¹Ä¼¿Kí÷WrÄvb@"G·tß´.å•û|Ä Üb€:QŠÏ‡UóE·î1çÞMk÷þï—æüÝ9ϕӶ}¹ËÄ×’XIyý•Ž+(ïŸý+Ÿ)ÃÉË|ÇNœÐIŠ1XÓëWK©½¾Ÿ€\‹Uv¸Û—òD¹#iÀÛŸ^9ᯯL--äK8|é$š7G¸ÀVʸRÍ’8Âýq@x£„|E+ÃçÛiþd+aô…¦ÚÊ®í'äÿ=õ,oEì—>R&<µ6|ôG°'  8£ìV_ˆõìÝ)¤Iã‚iaŠI ŒÇŽxàe¹ô  ,QŠç´ÍbkËM­ÂHïy%­Ó¦Ò²ŠS‘Ž%¸õ¥ŸP¾ÿ„"Æú9dûdñÚnxÕ71‘ã €ÃnNã׎h Å®~+Ý[O·¹¸»‚æh¼È#·Žå¡YK;„nbùvüËŽýjxµ«’ilcKcr-ZEŸs 7ùg ´ewñœƒß³Š1\öŸ­jw|Æ ® yYÿÒ ‚i@ù9oݰì8‘œ VšÔ—ì²ØYy¶£Ê;J×ÌUq…ÆÔžG|f€5ñF+&ËY–åìžK5Ž×PÏÙ¤îcò——nUIàš«a®Ü›mn 5ݬIpïå†w!FÝ¤Ž¤duÏJè1F)Ø£ÜQŠåQÕ'»¶‚)¯<·Á…¢ÀˆçTOõ£ãŽOk Ò÷ötÚñó–ÏÝÎÝÇnvñ»n3Ž3œP¼QŠv+YÔ.¬µÍ1# FIå6ƒ‘¾$Sž£Lý3@X£Ë'ˆ®cÕ/·«O YB¨xæ`Ä•RÄ$·CÆ*üåÕËEo˜Ëxí'É;¼Iµåƒ2n#çP>^¹ô  ¬QŠÁ²ÕîJF÷*ÛÌW²´{ÑTyS*ª“ŽÀã9©9ê-èÚ»ê3Ï °$O G&cº²¾à0J¯÷LzÓŧb©ëÉ¥é7WÒcÆXq–ì?@±F+™Ò5ùšËì¯<– ·BÝdÕRMÈd J‚ p+Ò¬E«ê ,±IiÜIöXâ3aP q&wÉôÏÍíŠÞÅ®uüCpú[ܽŸ³i²ß[²N𪧟q÷‡¨íW&ÖgŽöâ1d¦ÚÞî+W—Îà .Þpdä~=([bŠ1@ Ŭuµð¦¯z&ÅÅ»^ŸhùvHá8ÆŽ´øµ+ìÉm:¨‹ûGìñìq÷~Ìdù_\rzà|Àx£ÏØk·&ÛG[ˆwk’\;ùaÆQ·i#©F3Òº,PqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQŠv(Å7bŠ1@ ŧbŒPqF)Ø£ÜQЧ­ßÿeè·—áw´U=Ïaùâ°Ò]j÷XŸJVamK(§‘Á$àŒíùÐQŠ1XI¨ÝÅ6Šó\Û\E{º M¾3&ÒÊêzÿ =ý©Þ ¿Ôlµ%-„+isvÊä“!Èc´.0®síÞ€6ñF+½×5[O$2´Ë ßÇl}›÷oûÏ3{9ã=ºTvž Õ"×"·¿’EóšäI ¶Û#€F #+ã.òzö Ób¸Ïx†üÊ%Öf›ìòX‹¯žÝrI`3ŒS‘÷¾nEXÖuMI¥Š}"ýž¨lì„yÎïœÈeüPWŠ1\ŒºÖ¦5g™n@µM]4ï²ùk‚¥F_w\å³×TZˆo–æÊöþíM•ë]ï‡Ë[¬;ˆ ŽO ÎsÖ€;ñ.zàšß¶Ô­.¯g´ä3[ñ 1:ôb0hÖ(Åexzòâõus&ÿ&þhcù@Â)àqGŠîîl<;ssg/•:4a_hleÔGBkoa/j©um/¼WÒæ®(Åsj÷zýå¾£r÷ðÅd.•¼µG~ͧh’G?Z”øžxô»ËÉô‹ˆÞÙ£z,¡Ø/ÊÌŠr3ϧÔêèãªv××ÖÝÅÌŽ‹N?ù ]×¼?úµVÒþê_}Žâ3úÌbÞ¬ŒŒ½@É8¾=»Õ¤ÿÅ×ý{Ãÿ¡KXN›ƒ³w-W•j_òºÿ®Ïÿ¡õZò­KþBw_õÙÿô#P3ÖñTÿ²¬¾Â,¼Üóî9Ý»~ìç9ÝÎsW(  èô=6)Þe·Ë9‘ˆy—.Irœrzœt¥‹DÓâŽT3¬Ñ\K+Éû³ü#q8_aÅhQ@£BÓÄr§•)ó¼½ì×;r|Ų=kKQ@+?ûOû_Ú|–ßæy»|×ò÷õݳ;wgœã9æ´(  èö^ ¤‰„«#J¿½rªìb8ÜsÎsBèÚzÚÉj¶ø†KU´eÞÜÄ¡€\ç=¹ëÏZ¿EUþδûOÚ<¯Þùÿhݸÿ¬òü¼õþçé߯5èö/³÷N¥F%u9‘·8È<‚Üã§OJ¿EP‹L‚ÆÝÆŸnžg°"Ë+m(»Š©'8{vïì)t]94­"ÚÅ>Ja˜Xþ$“W¨  ¶°M<Ê›¤·%£9?)#ã§BGãSQ@™f.ÍЇ|íÁߨcÝŒãî’(þδØù_èÐy~Zn?/–ANsž Ëš·EEqmÔb9Ór‡IÉ2°eÓK´³çeó]3I;ÈYA$¸ž™?\¢€ T76°],kp›Är,Š2@ܧ ûàóSQ@n´‹ÉÚyá&VURêì¬6’T‚Á<Žy4[é6Å(X2Ln4ŒÇÌ(P±$òv’9úõæ¯Q@GÓÚÖ;co˜cµkE]íÄLÎ}yëÇZ•ôëGówEŸ:t¸˜ó"mÚzöòÓŽœ}jÕbŒQEgK¡éÒÌò¼.|ÇÞñ‰œFíêÈÒ~¢¦þÌ´ûa»òœegÌlocÝŒã;I==[¢€3†‰§)¶Ûj‘lj_PåÃm<Œç´qEbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQE£Q@(ÅPŠ1EbŒQEVÔ,¢Ôtû‹+€|©ã1¶:€F3T&ðíü6í«Â·qD"yÑš2ã¾vH'œõ­Š(1´x¾Ý§¼{#µÓÕ¼¨p7‘´ ]ß[»±¶½kssóo(š/˜®ñשëV(  ßì/ûOûKì‹ö­Û÷nlnÆ7mÎÝØïŒÒ[hU¥ä—PY¢Ë `If`¶œ.{à Ó¢€3´Ý LÒ¥y,-DNË·%Ù°¹ÎÑ’p3Ø`TWÞÒ¯ïšöæ Mà Bés$(è>Vµ¨  æÐ´ÇÕ¤ÖŠnƒß¹±¸ ÛœgñšK}J¶¿’ö4YäÝ–,H¾öœ ÷Àæ´¨  –úm­ä÷–ð,sÜYgæ œqÐu=*Þ(¢€2—ÚZ]½ÒC*Êò™›mÄ€'$íÝŽ¾Õ<ºEŒÚWö\°–´À žGÍœõ½^¢µuª6›“ÓÌVFm¾ƒ¥ÛEqv ­Êí”Èí!qèKqHº–¶’Ú‹bb™•¤Ý#–b¤Ëž08ÍiÑG·«¿3ûÂÈ€YÛ‹ó|#ÿI1Kî?pqŽIªëÿ!›¯ú÷‡ÿB–¯Õÿ!›Ÿú÷‡ÿB–³m½ÆY¯*Ô¿ä'uÿ]ŸÿB5êµåZ—ü„î¿ë³ÿèF·EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPTü†nëÞý Z¿Tü†nëÞý Z³^U©ÈNëþ»?þ„kÕkʵ/ù Ý×gÿÐzÝQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Pò¹ÿ¯xô)jýPò¹ÿ¯xô)hÍyV¥ÿ!;¯úìÿú¯U¯*Ô¿ä'uÿ]ŸÿB4ëtQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE@Èfçþ½áÿÐ¥«õ@Èfçþ½áÿÐ¥  5åZ—ü„î¿ë³ÿèF½V¼«Rÿ×ývýЭÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÈ|N¼º±ðºÍes5¼¿iEß …n2+ _ñüÞW3Új–wkmwåÈQ÷Üäv8ëŸJÝøgu}áu†ÊÚk‰~Ò²˶0ÜàVÄ¿_Ir/ô‹yçK²«u 1—%ԯ푟ñ ·VñvŸ¥ßÉeö{Û¹á@ó-¤>g’¾¬r1Ådëþ56ï¢K¤$··²©‘ÖÛÓv /û|>••ªiWºŠu[™-µÙ­ïм/¥HW'¬˜íÏ_ñ¢÷E¼ÓtOÍo¤ÝâÎü\Ímùò È=€ÏOÀš]Vá¯|ygyâ;ÝÉmRTÅ×’a>\ŒòN=©Úæý+A´›Kñ5j‘FÓ}³~ÖÊeOCÁ#éWE]SâMõÆ¥¥<¶/b¥xNÍÿ»ã=7»õ©¼k¢,:Ÿk¢i¤"êqÊñÛDNÖˆºs@Ú¿‹´í/P:‘yyv«¾H­!ó cÕ¹Åñ¦‘%µ…Ì>|ÞÜ}˜2 Tœpù#{f±ÿâcáŸj×ߨ÷𮥱£’Õ7²ÊGaÏè+8øoS—Áº½ÔÖ õÅïÛ­íPnhðz`wÁn>”Ö/‹´ÃªÙâq&—K1*0Ázíç“ÛœV¦“¨Gªé_Á±Å:îU”ØÏ|=ú×–ßèzÙÒ­/-ì.>Ý«5Â^¨‰³yà õêövÑÙÙAkÄpF±¯Ð âLš·‹É¨Ë%”­Â(ci ¶s€¼wÇÒ²5)5_¾“`š æž-nk‰îb¦Ñ‚÷þ‚®xzÂîøL<ëIÓí7SwFGšüã‘ÏoZ§ã/¸4EÒfÔcµ¾•Yæ´B®ë»iE#øÁåúVΙ¨ÚGâ}U$¾Ô³mk’ÇtÃɉv)ÈÈlrx湫M/Q]Á‘6Ÿt$¶ÔKΦÌKç–àcœš¿{£_ßxŸÅ‰Æ—vq¤:G`‰ÀnF _“â>‹»\5¶£äç¿ÍÎÒN=ñ[¶ºÝ­Ö¿{£GÂâÍäfa 9ÏqÚ¼×Äwúƒx ÛJ¹Ð®­>ÄcI'•v¡+ÀÙêO|{×GpÚ–‰ãýKQMòúÞþÖ6¶\€Êª>cÐrZÓéI¥¶¢ðݬ {ö#”\‡Û»?{îã¿_j$ñÖ’–ÐLßJ÷2C pfI6ãæ=9ã<ûWšF«'„´«±3kþsÃä±!<¼Æ>îxÏJêüjuTÔ´Ö´·¿“O¾Ðtõ~{zùwö Ô|m ønþ÷K‚éníXFñMÍ à¸ÏƒÏ­Bšâ_·…g»›Tµ¸»Ýû¸—ËŠfÂd¸'”ÉÊã<Xzv“©6Ÿâø™}—i@³îvÄüç†nG~µu`¾»“Àî4Ëè…Žè®<Èy{V5Éôâ€7µéVW·©õÙµ8¸’Ú é®ã‘R_xÓG²ƒN¸-4Ðj!ü™!MÀmÆAÎrq€5Ïé²j¾}ZÁôÍ@]\<ÖóÀ›Ñ÷ ç°ãõ5RÃúžšþŠ{Y]¡¸šYö!uƒqBÀéùæ€; Å6åÜöEuosÜðÜDZ¶úã'Ô~u¹\¥ÊüQ¾¼ki…³éÁb‡amÉÆî™àñí]eQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEžH]^íŽp-¡< Ÿ½-hVyÏö½ÞÒ}š2>ô´$d™xH}¹ =ûdÿCŽ„Ÿ0Ô¿ä'uÿ]ŸÿB5éöüä§1žwž²ï}?ÈÀ>a©ÈNëþ»?þ„hÖ袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*ËH/¬å´ºŒI ÊQÔ÷¦¢€9ˆ| ¦F Šk½FæÖÝ÷Åk4û¢SÛ€󮞊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬ò¡µ{µ` ›hA¡ù¥­  ?ä3sÿ^ðÿèRКò­KþBw_õÙÿô#^«^U©ÈNëþ»?þ„hÓV…†R ¦#+ #z_íHÿçÖóþü5E¥Ç‚ÿ¾ÿú«”ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj?µ#ÿŸ[ÏûðÕ=ö¤óëyÿ~íHÿçÖóþü5OEAý©üúÞ߆£ûR?ùõ¼ÿ¿ SÑ@jGÿ>·Ÿ÷á¨þÔþ}o?ïÃTôPÚ‘ÿÏ­çýøj¯gt—Zµã"ºì†!Æs!þµ~²t¯ù jßX¿özׯ*Ô¿ä'uÿ]ŸÿB5êµåZ—ü„î¿ë³ÿèF€=#Jÿÿ}ÿô3W++O¿´†ÐG,è®®ù·ÌjÏö¥‡üýG@(ªÚ–óõÚ–óõ\¢©ÿjXÏÔtjXÏÔtrЧý©aÿ?QÑý©aÿ?QÐÊ*Ÿö¥‡üýGGö¥‡üýG@(ªÚ–óõÚ–óõ\¢©ÿjXÏÔtjXÏÔtrЧý©aÿ?QÑý©aÿ?QÐÊ*ŸöŽ3ö”Ç­Ú–óõ\¢©ÿjXÏÔtjXÏÔtrЧý©aÿ?QÑý©aÿ?QÐÊ*Ÿö¥‡üýGGö¥‡üýG@(ªÚ–óõÚ–óõ\¢©ÿjXÏÔtjXÏÔtrЧý©aÿ?QÑý©aÿ?QÐÊ*Ÿö¥‡üýGGö¥‡üýG@(ªÚ–óõÚ–óõ\¢©ÿjXÏÔtjXÏÔtrЧý©aÿ?QÑý©aÿ?QÐÊ*Ÿö¥‡üýGGö¥‡üýG@(ªÚ–óõÚ–óõ\¢©ÿjXÏÔtjXÏÔtrЧý©aÿ?QÑý©aÿ?QÐÊ*Ÿö¥‡üýGGö¥‡üýG@(ªÚ–óõÚ–óõ\¢©ÿjXÏÔtjXÏÔtrЧý©aÿ?QÑý©aÿ?QÐÊ*Ÿö¥‡üýGGö¥‡üýG@(ªÚ–óõÚ–óõ\®òêòßÅš”v7?g{­FÎ}Šÿ)‰àývÚ–óõÚ–óõq£ÄšÊÖ×Ú·Ù!‚[˜¾Ûöuc3Æà*‘Œ‚Nö«¾½©[Ë 7ÿdh죖Ú?²çí²r¸`Hçhäfº¯íKùúŽíKùúŽ€9+Ýc\:´É÷Ù‘o--¼Ÿ%'›-É8'"ŸöûÉàÓÒòežH<@m|Ö‰AePàcûŒWUý©aÿ?QÑý©aÿ?QЈFÖ ùV^“­_Ùx~’ûìb!%¤^@¶HY²¹#ÔƒÎkÐÿµ,?çê:?µ,?çê:ã¯üI­Xj2Ç9>]«-Üëå¯ü{·–»C3ó×娮uÝrÇìbïRcÁ˜£… ŒÌrFÂþ¸ùŽk¶þÔ°ÿŸ¨èþÔ°ÿŸ¨èåOûRÃþ~££ûRÃþ~£  ”U?íKùúŽíKùúŽ€.QTÿµ,?çê:?µ,?çê:¹ESþÔ°ÿŸ¨èþÔ°ÿŸ¨èåOûRÃþ~££ûRÃþ~£  ”U?íKùúŽíKùúŽ€.QTÿµ,?çê:?µ,?çê:¹ESþÔ°ÿŸ¨èþÔ°ÿŸ¨èåOûRÃþ~££ûRÃþ~£  ”U?íKùúŽíKùúŽ€.QTÿµ,?çê:?µ,?çê:¹ESþÔ°ÿŸ¨èþÔ°ÿŸ¨èåOûRÃþ~££ûRÃþ~£  ”U?íKùúŽíKùúŽ€.QTÿµ,?çê:?µ,?çê:¹ESþÔ°ÿŸ¨èþÔ°ÿŸ¨èåOûRÃþ~££ûRÃþ~£  ”U?íKùúŽíKùúŽ€.QTÿµ,?çê:?µ,?çê:¹ESþÔ°ÿŸ¨èþÔ°ÿŸ¨èåOûRÃþ~££ûRÃþ~£  ”U?íKùúŽíKùúŽ€.QTÿµ,?çê:?µ,?çê:¹ESþÔ°ÿŸ¨èþÔ°ÿŸ¨èåOûRÃþ~££ûRÃþ~£  ”U?íKùúŽíKùúŽ€.QTÿµ,?çê:?µ,?çê:¹ESþÔ°ÿŸ¨èþÔ°ÿŸ¨èåOûRÃþ~££ûRÃþ~£  •“¥ÈkVúÅÿ³Õ¯íKùúŽ©èꎇ*ÞQÔ|ô³^U©ÈNëþ»?þ„kÕkʵ/ù Ý×gÿÐzF•ÿ þûÿèf®U=+þ<ý÷ÿÐÍ\ Š( Š( Š( Š( Š( Š( Š(  ³ÿÈJÃý÷ÿÐ hÖtÿò°ÿ}ÿôLÿ„‡IÿŸ¯ü†ÿá@”V_ü$:Oüýä7ÿ ?á!Òçëÿ!¿øP¥—ÿ “ÿ?_ù ÿÂøHtŸùúÿÈoþ©EeÿÂC¤ÿÏ×þCð£þ'þ~¿òÿ…jQYðé?óõÿßü(ÿ„‡IÿŸ¯ü†ÿá@”V_ü$:Oüýä7ÿ ?á!Òçëÿ!¿øP¥—ÿ “ÿ?_ù ÿÂøHtŸùúÿÈoþ©EeÿÂC¤ÿÏ×þCð£þ'þ~¿òÿ…jQYðé?óõÿßü(ÿ„‡IÿŸ¯ü†ÿá@”V_ü$:Oüýä7ÿ ?á!Òçëÿ!¿øP¥—ÿ “ÿ?_ù ÿÂøHtŸùúÿÈoþ©EeÿÂC¤ÿÏ×þCð©íu{É„6ÓŒàFÃ늻E&áëFáë@ E&áëFáë@ E&áëFáë@ E&áëFáë@ E&áëFáë@ E&áëFáë@ E&áëFáë@ E&áëFáë@ E&áëB2º+£V‚(h¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Lÿæ¯õÿg­ÊÃÓ?ä9«ýcÿÙèZ¼«Rÿ×ývýתוj_òºÿ®Ïÿ¡ô+þ<ý÷ÿÐÍ\ªzWüx/ûïÿ¡š¹@ –Há‰å•Ö8ÑK3±ÀP:’{ o-\Àæ7 Z$Íd•õ#¥Uñ rMáÍN(‘¤‘í%UE,J;šã¬4­bËSÑ¡‚ LÚM$2:œC$‘ ÆÞ˜q‘ŸïcµzºÆŒîÁUFK€­T¹ÕôË7T»Ô¬àgPê²ÎªJž„dôã­q–VzÕÖ‘©Ãw6§+I§:¼2Âè øà+3’Nr>PƒøTÖš=ÝÞµbÑ=ÝœI£Æ†YmÃüáÎPù€à÷Ç\{Piowku»ì×0Í´)o-Ã`0Êž=AÈõ5p—vº•¾½|Ë 4÷¸€O%¢2É"ˆvóÝvÓ5µ ŽMD-ÛÉk–fßFE)+㣠3×¥wÕJ×VÓ/eò¬õ;‰1‘N®qô²üý©-¥ÅÞ®.#šFHÖ)‰ùB RÀ››q÷â¹½ÒytïYG¤Þ[ÞÙÝ g¸–Ù£ ,Xn g ŠôZd²G O,αƊYŽÔ“ØW¢Á®É­cP»Ô-0<—m9 UËíˆØ¹õõ¤´‹]›LÕ…çÛD–z|–pŒ·úDƒwï@þ"@@\“@ª:ÈŠñ°da•e9zŠuq:XÕ¡ ß dN%‹ÊgÈòv.wçåÎwg?7¥;A]þÞF¿¹¾Èy|øÚòJäí×Û鋟_Zí(¢Š«?ü„¬?ßýÖg‡u‹D6š3—[§§B@ÚÃÌq€}~RqéZsÿÈJÃý÷ÿÐ sLÚ‚¼‘Šhí"{[‚§j̳Nqžüôozì,o#¾ŠI"W9¤„îª9Sød‘§‰.#¤Q,ŠÌˆO,#é‘ù×-µ+Î[›9bC¨ÜMwlÐHVy æ> ¨$cƒŠ³§éqC«hó›yn"Ar«$–M’Y‘m#(£çÁ<ècO×›P¶Šê"ýmeMë3˜BíÆr@·éZ}Ú_éÖ×±+*\D²¨n 0gó¬ i·¶Þ³ûEåðakƒg$q¨SŽŸp?ZÊŽÅÖÂÙuM6êàcÁª, æ‚ã|¿1ÇN¼PwEyøÓu˜C¤ÐO#iæ=EYA>tÅcÞ«ýã•›öÅtºu¦©oäÍ3H4é,%˜Èä¹· `±ƒ@RÞÅ£obÊæKˆä‘H&Üçþû­Y¯>[ ÉmíWNÓ®mµÒçŽâáá(^såð\õ$†ÃgðzâÔZ[+©ì#.!HçŽßìl¾dlXuᘌ©#9€;9$)$H"‘ÄŒAeÆ‚rrzqŽ3É%rqZ^Ë>—~måŽâêòk‰7!Ì ÀëoL ƒžõ ›ÿÂ5smg§Ü[kÆÍ’k‰ ei$ã?½# “ÈÁ?…vUs«%­äpOit‘I*·/–]º½»“ÆqŒ÷¬m bÓšâî8o´q£ÛE¦¼ 6ìnÁá›æäŒð3Ú¬\Ý ß%µå­òÛZL† ¶’2M/g.Wчڟ\§Ù§·¶ŠMAî®ÝŠÉ1ÇïNÌ…ù¹ŽBõ'$Óôç½[¶ 5Auˆ<±º¦6¯™¼}ß½¿;¹Æ6ö¡á•›OOé^AÌuÉ8¹5#n×SÝy¸oµ#A 8<gÙר?*µá¿µ=n~ØØTýåÆñ¹¹Ýò·CÓ;I^F;ÔÔÃò&ù¯a¦l[ÜAu Ïk4sDÙÚñ°e88Ï­úéßøýlÑ@ßgÖýtïü~³ë~ºwþ?[4P7Ùõ¿];ÿ£ìúß®ÿÖÍö}o×NÿÇèû>·ë§ãõ³Ec}Ÿ[õÓ¿ñú>Ï­úéßøýlÑ@ßgÖýtïü~³ë~ºwþ?[4P7Ùõ¿];ÿ£ìúß®ÿÖÍö}o×NÿÇèû>·ë§ãõ³EaÍe­M Äͧ…u*p_8"¯¦ŸÙÙEr Iiµ‘‘ÙpáJäŽ0HÁê ]¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ÈÅP6vÙ[ˆ-Õ–0Ìß3–$±,I$’I$žjj( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( °ôÏùjÿXÿözܬ=3þCš¿Ö?ýž€5«Êµ/ù Ý×gÿÐz­yV¥ÿ!;¯úìÿú ÿO7ßdJ[˜÷¾ ³÷ «9Ô¿ç§ýößáF•ÿ þûÿèf®P<ê_óÎÓþûoð£:—üó´ÿ¾Ûü*åO:—üó´ÿ¾Ûü(Î¥ÿ<í?ï¶ÿ ¹ESÎ¥ÿ<í?ï¶ÿ F}E³%®Õ8vÎ?*»QÜǼ¿îå@!›Qš•cµ êeÛ8#éOÎ¥ÿ<í?ï¶ÿ “Oÿu·ýrOä*ÅSÎ¥ÿ<í?ï¶ÿ 3©Ï;Oûí¿Â®Q@ó©Ï;Oûí¿ÂŒê_óÎÓþûoð«”P<ê_óÎÓþûoð£:—üó´ÿ¾Ûü*å™1¾ûm¦ä¶ó7¶À±÷NsÅ]Ϋÿ<ì¿ï¶ÿ Žù X¾ÿú­¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øQWþyÙßmþvŠ¥WþyÙßmþgUÿžv_÷Û…]¢€)gUÿžv_÷Û…Õç—ýößáWh  YÕç—ýößáFu_ùçeÿ}·øUÚ(–u_ùçeÿ}·øVv‘¿ûgUó6‡ýÖí½3óô­êåÖâæ×YÔZÞ(¤óAß!\cw >´ÑW•j_òºÿ®Ïÿ¡îÿµ5ùõµÿ¿ÍÿÄ×w§\Ky<„Ä¥äfÆâq“ô ÷Jÿÿ}ÿô3W*ž•ÿ þûÿèf®PEPEPQÜǼ¿îåRTwñï/û‡ùPzüƒ­¿ë’!V*¾Ÿÿ ëoúäŸÈUŠ(¢Š(¢Š(¢Š«?ü„¬?ßýÕ[½núÑ.bxGÎÏéV§ÿ•‡ûïÿ ç´Ë­B{I-¬.¾Ì,m<þ#VóžLÈ?.¶=h{þ'ßõ ÿÈ”Äûþ¡¿ù­é·oÒí/Bí¤»}7(8ýjÍeÿÄûþ¡¿ùøŸÔ7ÿ"V¥—ÿïú†ÿäJÓMÛy±ÉŸ¥)èjõä–²XÅ+#]OäüÏ´(ØîOCžñïÖ€.QU#½ß«ÏaåãÊ‚9·î뽜cÛ?Z©¿h-Vk­Ð––t ªÒ|±HP±Ú8Iàg­kQTŽ­b·BÜÊÛËù{¼§Ù¿û»ñ·9ãÎx§Þê6¶-Ü4›åÎÄŽ'‘Ž:œ('#ŸzµEU›R³ƒN]BIÇÙ\!Y,rãòHüêí½?ÉY²6ç(#X$2nFÀ»†8íÜzОúÖž‹lDÌÿjVhDq;— @nÁaŸOÀÑe«ÛÝiv7î½ ±]NC0àtýz1ÔP…Ÿ.µa–G%Þ0±ÂòPá°€x'¥55›f¹dÜ<&ÞHæþs² Àª9ÿk¶(JŠ¥>«gº<ŽÒ#ùl‘ÄîÛ¶†áTxe9sOþѳþÏûž¿f;ð}qŒuÎxÇ\ñ@¨¬{Ï[Ca%żrÍ"KFŠHØ3°Q¸,=qÏA“V5-FkYá¶´µ[‹‰QåØÒl9Áç,  wê(BŠÍ¸Ö ‡GµÔÄrÉ ËB"8‘”€MßN¤T–Ú½…ÕÀ‚ ˜»ga1²¬˜ëµˆÃcØš½EejÚõž™ ÉbòMo¢£PÎ žÙõ©¥Õ­ iÄí*qXÑäfc|m œà“ÆxÏP/ÑYÓëšu¸C$íµânHÂÆz3ÑîqÒ˜šå¯öńۢ’)Ö;X«–\e±…'qÎ(RŠÊ‹]µòYç# fM‘Æò±ÈɸíS€vçŸéW'Ô-`´ŽéåÌRãË(¥Ëç¦Ð¹'>ÔfŠÍm{MXÑü÷`ÊÍ„…Ù”‚X•Áãi—:ÒCpñÇ•´eq' '”Çž±Ÿ|öë@´UÖt÷—Ë•ኻÆÊŽdír6¶'‚x^XÇlfˆO.%… y+bG rG\ÁÆ4¯EfnÙF„Í!ÜPVä—j£²l.@ÊòOÎ ëN¹×4ÛWÛ-Áâ%˜”DlHJ‚ü§“ÅhÔrK°àНyy%µõ„xîåh‹ïÁB#gc‘òÔ~4ûŸ¼(ßh†´CYÜ×i’I`ŒÓ\ìMìpÜU{2@ª:v©h¶÷WO­Iwºn•&‰QâǪ…SùŠé~Ð= h†¹›¿¬6ò4V7th³ ²VGÚ!ˆëÆ3œã8ÕÞMg Éu ÆÖ@ñä)1†‘CuÊô'ÔP÷Ú¡£íÐ×#m«ˆu&)¬GNŠÙ帔¬dBAÃF Fî:ñWeñµ¼n×V—ºª8‘K:³„Ç» ޾ÔÐý z‚÷Q[;I. ltw9À¬­+Ušþòö ,&¶Ϊ Œ„œª¶ yù¾˜÷â¤×ä?üÿB¿EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\ÃÈRûþºWO\ÃÈRûþºPë"õò¼kÖDÿëäÿxÿ:ê4¯øð_÷ßÿC5r©é_ñà¿ï¿þ†jåQEQEÇü{ËþáþU%Gqÿòÿ¸•G§ÿÈ:Ûþ¹'òb«éÿò¶ÿ®Iü…X ŠÊ¿Ô¦¶ñ“§¢Æb½YÌ„ƒ¸lPF9÷¦j^"´Ó®f­î§6ñ‰nÃ,(s‚Ù#О3À  Š+?ZM}ö{x.æŒH±5Ìqn‰\€@'9èG8ÀÏZK?YÝêÿÙ‚ ¨g;Ê(}½xÎáí3@4Vg†õµmÎþácYgBÌ#(äŽ2O¥iÐYÿä%aþûÿè±´Í[­2;‹Kϲ½Ä o>bß¹±ya¹¹äsÒ¶gÿ•‡ûïÿ ¹¼6ð¬0 HÐ`( ¶‚;[h­á]±Äz0*JM£Ò£Ò€ŠM£Ò£Ò€ô5™ª†ZD¢9#¼%Ê!m Ã*‚p8`3ïZ[G¥-g]i÷'Q7ÖqÁ+İÈ%„ȬªX©2~fïÞ©\xqä±··†÷Ëx̬Ó²û¤mÌÈAIÇQÏ àVõ„ž‰5:›C¹7?5š´Û‹nǘOMÜôÈìj櫦Ë$ —*‰`Ñ:GÎ9 0äcŒärx­(ïJ¹‹Âöše´¢I­ÞÕ@˜ùc•í¤öUÎ3Î)cÑ.b¹ûtwñý½ÙݭɃ*)7d`DŸÅØúÖÝ—c£‹K‹Y¼òís«eq½¥‘dföåOþÔ‰£°ðÜZCÜ‚ðÄ‘Ç:Ç¥1±¶äòS×’;V­‹.„æÖÊÞ+°ÝdY#,³Á.@aódÎGÌx¨¢ðãÅd° Õó#·´†7òxÞFub7sœ€FGCÏžçjŠçd𲙞d–ÕäɸÜÚ € +È6‚Ãy„gxâ´n4½ÖvQZ̰ÉbÊбˆÈB˜*01µÕ£Ecÿdß¤Ææ-M̱yS;ÛnR3.ÐmÆö$ñŒæ›ÿüh¨Ü#³‰\-å.9Ï;³n¼ô­ª(›ƒÂ6ñÃög6¿gX^1Ú*Mµ”¯Í&NHòÏ|ÕÙt»û‹GŽçRä ÄVÛj)Ãä®ì’Hò ¯EbG¡ÜÚË,Ö7é“ù‚C$ÆÖ–IpÁc ò¥+xz1ewi ÁHçÓc°L®â€7^Ötã§¿TPf¦õMR9eËÈì•Uòd\–Æ,>µjçï ³U/4Ë;çWºˆÈT`|ìü  ·QÏ$mgKC”Þ>„qYRè-{%Äš¥ÊLó[oÜCåBrO,Äœßð­oøG´ŸùõÿÈþ4Â=¤ÿϯþDñ  s JÖ2Û´öhÌcd’1Ê8`[ ór£ŠÐÕ,N£§ý•¥KÆåÂçî:·L÷ÛŽ½êÇü#ÚOüúÿäGÿ?áÒç×ÿ"?øÐ/ìâ¿Óç³›"9ã(Ûz€GjÊŸ@žñüÛÛõ’eXÑ Ú¬‹!ÈÜrI@3=«cþí'þ}ò#ÿði?óëÿ‘üh½­‹[j7·"`ÉvÊå6r¬/\ôÂŽ1L×ä?üÿBoþí'þ}ò#ÿði?óëÿ‘ühRŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¹†ÿ¥÷ýt®ž¹†ÿ¥÷ýt ÖDÿëäÿxÿ:׬‰ÿ×ÉþñþtÔi_ñà¿ï¿þ†jåSÒ¿ãÁßý ÕÊ(¢Š(¢Š*;ø÷—ýÃüªJŽãþ=åÿpÿ*Oÿu·ýrOä*ÅWÓÿämÿ\“ù ¤Þ$Ñ–øÙ›äó„žQù[hî—ÆÜûf€VÑcÔî­.åݬöÄonÊÎ9ܧҪÏáki÷™oõÓF"¸a*ƒp œÂú8ǽYðëZt÷kkÆéžIbUØÃ-7Œãd}{Px¼;i÷Ú-î.áŒÈ²µ´r퉜#èÁÇJŠÃÂÖVŒW°Ü]…¥dGe*<ϼ>îO>ù­Ú†âî S¸”!žAyþ' ?C@é:t:N™…»HÑ@»TÈAcÎyÀµrŠ(¬ÿò°ÿ}ÿôZ5?ü„¬?ßýÓ ×¬§¿†É7ùó<ê•ò˜«g8$qŒŸaƒ€ J*/µ[ÿÏÄ_ËûãïÿwëíQE©ióÅ4°ß[I™Y%R#»ñÐõ  TSDˆehƒ©‘@f\òÎ=äj·ÙmÝöË}¾Q›>jãË_¯Ý½(ÅYµ ºKW¼·[‡ÁXŒª³Ó94ƒSÓÌ;µóP1dó—r…á‰탟LPª*¾«cq¥C©‹˜ÒÒTVHá@Ïœ“ŒzñU®|G£Û‹f7öò-ÌþB4r«Øç'<Æ~£Ö€5hªé¨YIvÖqÞ[µÊýèVU.>«œÓm5->õÊY_[\0]Åb•\ëÁé@¨¬ñ­é‚K¤’öÞ/²J!”É*¨ T0ê}ñõÒ®ùðùšžNÝÞfá·o®zb€EgG­ØÏ$‹m2\*yY’9¡ó çNG^˜É8«Ú;çO¶[ï·RÓ/š¹Œ¥¹à}hÍIõ[!möˆgKˆÄñÀL¯µÝÕ<ö,3íOþÒ°ûD–ÿn¶ó£¼~jîP9$ŒäPª*5žp‰*3”0$©ïô÷¬ØüCc%ž¥r«64Ó/P„, ^y«sØô  j*¹¿²Ÿc7vâäÿË0oÿ¾sšÏ_ZÏ$Qéöóß<†aˆ?—ÊeVÉg«) æ€6(ª «@T»V²haI¤ûC FHb3òýÅN—ÖrF’Gw#«2²Èe^¤àw  TQ\ÛÎ@†x¤%A±ÁÊ7Fã±ÁÁöªÇW°ûlVqÜÅ-Ä’˜ŠG"±Œ…fù†r8R>¸  ÔV|úæ— ­ÕÇÛ­ä[D/2Ç*³(±ž¹ãëS OO3Ǿµó¥£Î]Î žA  TU-GS¶Ó"yn›j$3ËÑ6äNI;†01êFFf–úÎ t¸šîáq”‘ä[ŒðO€OÐPôUx¯ì¦¹{h¯-Þxþük"–_¨ÎE15=:H$/íZŽ$L¥PûœàPº*¡Ô¬ü¨fKˆd‚f*%YS`³œóž™?€$I-í¤*Zk¨#P‚BZ@SÆï§½OEUmJÁlÅã_[ bp&2®ÃÿÎ)š–©k¦Ø}¶w&dTÚÊ7– @ïœçÉ  ´U95m6!!—Q´Am}Ó(ÚrF<«ÀúSæÔl`Xž{ÛhÖa˜ËÊ 8ã‘“ÏQùгEAmyiy¿ì—PÏåœ?• m§Ðã¥5u–X’öÙ¤„* T”©až?³EdÚøJ¹òȺŽ5–æ¥uPÁË£Ÿ¼ Gj¼oì…çØÍݸ¹?òÇÌÿïœæ€,QPÃumq$‘Áq¯ÄŠŽ¡ÉÓGàj¶Ÿ­iÚ…¢\Au™Ñ¤]Ñ)ùÀ™Î3D:•¤ÚŒ¶LßøòúÐú*«jV j—M}l-ß!e2®ÆÀ'ƒœüX–XáŒÉ4‹¬Çvë@¢«\j6¡ÍÍå¼!V2J«´‘O*\@æ0“FÆD.€0;”c$zŽG>â€$¢¡k»dµOqÛ°J\ ã=9ÈÇÖ£ƒSÓîeX­ïíe‘—r¤s+=@¥Z¢¢[«fDu¸ˆ¬‘™P‡dËQÈçÜUVÖ´ÐÖ/`]Êa‰£‘X N3Ÿl}Hèý ·–°ÜGo5Ì1Í/ú¸Ú@þƒ©¦Åe5Ã[Ãyo$éѬªYppr3žbŠ«¥a:ÊÐ_[H°ŒÈRU!>¸”£EU]OOhe™o­LPœHâeڇМñS[ÜAu Ím4sDÝ6 §ñ%žš½»é6šI|›³EÀÜ<ÖU\óެ3ÏçUÿá ˆ %{ Ä´Šg… *å 9ldvûÐÅyâ­$½ßcxðX°§—±>E~…Ãi\ÝÚÚD%º¸ŠØà4®‚zŸ`Oá@QUeÔ´ø#ŠI¯­£I¹‰žUþ„ž QÕôý2$¼»… q™<²à; À'œí8ú½ES¸Õ,­ÞÉd¸ý5ö@C 9Ú[9ôãR=jK[ë;Íÿc»‚ãaÃùRÛõÇJ±ESMF»{`­½.>ÎI*o(K‘“’6žÜç<`QÜkš\í;_[´k2BÅ%Sµ™€óÇ\Ÿ`OjТ«Åg5ËÛCwo$ñýø’@Y~£9–Ú…ã”´¼·•CŠUbèx=(Íž5½0It’^ÛÅöID2™%UІO¾> úUèÝ$dÕцU”äê :ŠÊŸY’El¿²/ä’Ew•¡Úê¥Aa™>òõÁæ§³Õìo$hb¸ŒN¯"Y×Èå Ûœã* ½EWµ¾³¼.-.àœÇȤ ·ëŽ• Ö¯ak0îbk‚ñ§²)o` íÎq–é@¨ªË¨Ø4Ò·¶ÆXA2 •w IâªÚkúeÍ•­Ó]ÃÝ Ð¤Ò¢³ ã¦OåÔt8„î\qëT­õ«+‹ÈíöÏ)œ"9Ÿ*Mß¹P¥hÑUÍý»û!»·9Ç“æ ùÆ~îsЃøÑ õœ÷oÜOß$—ê"€,QT"Ö´Ùïâ²·½‚i¦FuȬ0»N8=pÀ`Oj¶n ó4ccˆÛæ+aO¡;—ÜzДUqdÒÍÞ[™ •ƒ1Vãñ¦¦§§½«Ý%ý«[¡ÃJ&RŠ}Îp(ÕRÓR´¼K™ ™wÚÒîȯAé†û‚Ç^Óom­f[¨b7kº¥•°ÎŸN{(JŠ…n­žå­–â&¸A–ˆ8.G_â_ÌzÖ|~!±’ÏR¹U›i—ÎŒ¨ B¯<‚U€9ìzPµ\ß٠ϱ›»qrå˜7ÿß9Íg¯ˆ­g’(ôûyïžC0Ä Ëå2«d³Õ”Ps@UÕ *]«Y40¤Ò}¡Σ$1ù~â§Kë9#I#»‘Õ™Yd2¯Rp;ЊæþB—ßõÒº(®mç Cþµbù X¾ÿú­å®4ßí={RµŠp-|’ìW“Ä‘˜¿0ƒ8ÿkÞ¬O£__Cp·"ÎÙ›O–Ê13¿1ÊŒŽ=O5ÐÑ@Ö÷ÃR¹¼¾[t2ÃjÈÏ¥ÉÉ*?¿éÿ×ė·Orî'„F×1ÏüzfhúuÜÄz` ë( {RÑõ BY¡6þS\Á:æCú²„†Nâvœ1'TöÚ<°µ›fÐê7rŸ™dó°:uýâçè}mQ@íÞ…wuàˆtF6ââ8àŒ’Ä£ÙI9Æy ÓN=ê­×†/­5å™´HΡowD•R"Œ‚IÈë]eÈÙx^ö Û5‘ìþÍgy%ÒÜ o>]Û¾VãÅÉÉÎUðF…}ZMõÜP[%­¼¨¨¨Ë,…ÛþZ8Æ8ëÖ»Š(ô­B-v}JÝm%Fhã–V\†Ž$9!N1q×!NòoøG?³üȼï3Îè|½Þo™³vÒ¶¨  Ò¯înnngK8^i,ÛlR3q ÛÛ$¨É#§ݳU5-&örEX¼™lî„qDYÙÞL¶@#*}@$19Àé]UÏÿcÞÌÓK0µŠG’ÓÄÌWd2‡'8‘‘Œv=éŸØ÷˪Es)µ6ðÝË9ýáPQÕ×îÆàd’sƒÈÍttP?áfKI®^A"³yÎ;ÛÆJ¡÷ÏÌsß5¡á»«âY¡ŠúFºPäÒ;ln3ÑéÃLç§¢€9ÅÐ'与H>Øn¼Æº› ïÞ”>\ƒÀ9è:X¼;ç_BÚ•½Å¼/xÊŽ<ÌùÒ¬ŠpW¸Ã×ŽŠŠÁ¼Ñ&þÓK»¶XàX<˜*‡Ëóí”@<¯J‚ëÃ÷wV’%¼WÝ´²*Qctºƒ€I+ógæô®–ŠÈÐ4™4ϵyξM°ìÏÉ çbŸq“ùÕ[ þÞM*ÏÈÓY±*³%6\‘·’A<œžk¡¢€9/øGu7·x¤{P[O¸³ÊÈÛs&Ü0@€(Êô½N*Õö‘ª]^4àZ¨iíçÚ&eÆP•8OŸ•8bzÀÅttPF¹¥O¨™<—Cé÷6¿1?zO/iéÓä9ü*{Ë)oeÒå•bÖãΕ7ê~SŽpÌ tü+BŠå!ðµÇÙ’Òg@Ã$Ip.¦w%¦ï,ªpÄž¾ØífçGÔ/9%ŠÆ xÊ$Èž`Pã ”|ù‚;æº*( ×D–3lΰ©[×¹™²Kaxñ¹ùcÊç ëÇ­5ðÕÚÛ.ùÒY­æO ^0ÐF¬¨Œëóó–ÈÏ8ë]MÎåtüE rnÍÏü}Jv…2$l’Øõ\‘Žõ~m>y4[;2ñ¡{fv ±O—"3`ÆBœ¥iÑ@h÷v’Ãul–²Ï÷nÈîQXM&àÛ‚’NäTøræM;ìâKræÆörd•†8û£zãWMER‚É¡Ö.n×`†[hbU^ £HO˜uÇÐÖv¤^[¾› ÿfi»¶K$ÙB¿0 Îry9 VõÌAáë±£ÜÚÊm¼ù4ˆôô`Ä€È$'n@;”þÐ"è‹ò\G$l7^c]MwïÊ.Aàô ttP&ɬ-¥öo’æy‰Náäf÷Ú@ü+¼7ptÝ.Ý^Ý^ÎÈBýJ¼á|tåI‰ïót®šŠÁ›J¼º[ùî"´Yî|€°¤¯°ylX6ð Ï\qµzÓ?±ožsi)û-Ü$æ²²ýÐ7}Üò“’z×CEdi–ú…„A&H¤3\å±!c{1ËíÎTr@àã'Ø6·1ê·7°ˆXK*»¯!bpgãÔŽÝjýÎiöW~xÒÈ6ÉMÔÎÎJ•Ï–~T8'=}±Zz…µåîŒaÝ.›c0'r+ìpvðpqÅhQ@Í®ªZê_*ÚJæGa·F#RKlÎA‹ÓÄqZZvŸqi¨X[yMe D xÙÏʸÀ\?ñŠÔ¢€9äÑõÕà¹cnb†òIþY å]]~à\nÆI$œFjLJôË­;Í[!bÙq$L_h]ÝØ‘…%±Ï<ÖÍÏ&¨.¯Ës7’OòÈW*êë÷ãpÞ2I$àò3VdӮƥpñGg-½ÔñLí6Kǰ(À\`ý܃‘‚Iæ¶(  ;H¼·}6þÌ Ówl–6&I²…~`@ œäòr@ªcÃW‹Ÿïbgµµ´bÌñ‡h–Pß2ŒûÀAÇ"ºª(·Ño-&Žò­Z}ò—†K‰YNðƒ>c%€Œv‚zwItKá}ms²"ޘм~hÀ.%È<à¨à×GEaE£\4ð\\ pßÚ y,JITýËF’Nv¶HäÕÛÍ·:=ìzžËhXI9~d€Ù8ÁÆ hQ@¾•§ê-oc¬2A%ü‚I&Šf1©óA H*¨£§sÒ­[é7öFÊ[ck$‘%ÂH®ÌоlŠÿ.ÈR¸ŒŽâ·¨  ƒ¥L|9a¦³Dd·6»É'iò±Çp§~TË}XM‘Ì Á¨Ü]9ådó°x¹újÚ¢€9»mPpZ]-“Eo¦Éb ;°°@† È#×Ò[]+Qì’JÐ3Ã|g*d,Dfö‚ì7g‘Óky* ŒŒ6ìçœ-u´P/ÿíÔ¨Í"[Ç*F‰úTÓ‡Û">þNÀ0<õõÑK Én­ngŽÎŽðÏ"ÂIÊù Ë76Xr@ãŽÜëÑ@•¾™$Zž‘¦ù±?“gÛ•FaÇ–byêÛMKºÔK}˜ÂØ]Z·˜Ä`ÈiàŒ§?^ý+fŠÀÕ4)®µuncUEƒdBW‹qO8YyQ‰FÏ+Ò¯h¶ ao0‘$žc+•åÁÀ³òNçéZ4P=o¤êK§ØéRýZYÉ ¬Œd‘b`Ê6mÀ'hÉÜ{Ó[IÕdÓï4¦[4´ºžviÄÌÏåÉ#16œ6>÷¿5ÑÑ@è6ªßß^ÙÙÏ$ó¤»ÄÑDh¸Ér¤ñëI¯Åq$úA´…%xïKâBB€!—’@8ç8êElQ@Ý®‹¨X煣‘%fTtŽÿ.åyŒd(§¿‡¥W–ë,nÒééñJùݹD€“Çï^ž†º(]Ó.µk+h•¢ŠEf2üç #%N9#ÌÈÈÇju…àÔc»¼ŽÖ&ØÛ¢[±`ù*rr£màsŒžkZŠÇþÊŸûWí[âÙý¡ö¬dçgÙ|œt뻟§åTmô-F dÙ ŒHÅ@Š@än+¸)~m¾§5ÓQ@æ‘ OeqgçˆÝ,ƒl”ÝLìä©\ùgåC‚s×ÛgIÑå°@cúžÖÒìÏÌçÊ9r2×ÔVÕ€úV¡»>¥n¶’ƒ#4qË+.CG§¸ëǧ{úU¥Å…¬Íä²fW”©#k3î £¨ÜG$tzhQ@¦³’MnÒô2ùp[Íy%Ú21íòÒ²î<=4ö l%Ž&7ws<‰œ…•fŽ9aæ/äyé] ‰¤i3Úß «˜¢FH<•+u4Ä‚A?…(ãëë è÷ù6è¶moý ·žs3yŸëC•Û· ô`WCEsšF=•ÅŸž#t² ²Su3³’¥s埕 Ï_lUkŸjRiXÇ%·bY» aÂNBåב€HÇ<×YE`ͦêOsq´Zno-rìòƒ(pÕä÷è:Ô–:]Õ®¡m90²#^ïùŽ@ša"‘Ç$mŽ:÷Ç;TP5ýyu¬ê E [F ÌÌHùqDp£ ‘·9ùºÔúv‘ynúl3ý˜A¦îÙ,lL“e üÀ€9Éää[ÔP&—¤\X @€‹;¶Ÿk–o,î^9æ3×síIq¦jyr"û7Ù®/`º,ÎÁÀO(Û·òÏ ç¾1Þ·( bãÃ׳ÉxàŠ ds¹Œ«'¦P¤6Ö “œ bžºØ—틺ܤñÈ"{©fY+®Üd}òF‚^Ý%£ÙÜZ›Ù.–{«Ÿ8,$•Q± dåO8篵cAáÝB "M47K«xbšbíº"‘,g`Ûó—pÉ\]UFÆÉ­¯µ+‡ØMÜë"•ë´D‰ƒø«~u¨xnêãE¸†Öhb¾‘®”9'cÅ4ŽÛŒô`zpÃÓ9éè qt Åù.#’¶¯1®¦È;÷å— ðz†–/ù×ж¥ogqo Þ2£3>t«"œÀ nðõ㢢€0o4I¿´ÒîÅ-–8&Ê¡òüàAÀ;F%+Ò ºðýÝÕ¤„ÉoÄ÷m,Š„”XÝn àJüÙÀù½+¥¢€24 &M/í^s£ï“l;3òB¹Ø§Üdþužßò¾ÿ®•Ó×0ßò¾ÿ®”úÈŸý|ŸïçZõ‘?úù?Þ?΀:+þ<ý÷ÿÐÍ\ªzWüx/ûïÿ¡š¹@Q@Q@Gqÿòÿ¸•IQÜǼ¿îå@éÿò¶ÿ®Iü…Xªúüƒ­¿ë’!V( ƳÍká[¹í¦’¢!ãb¤1sÈöÍe딯«ëb¾v† äL¤ªI–à Æ9ë]{¢ÈŒ’*²0ÁVUxtÝ>Þ `‚ÆÚ(eIDª® åtiä¶Õô(­µ;›±}jÏw×m„ !†I+óU Ç®^A¤ÞÆúŽÂå®n./¼È¥,’H=9Àé]Åž›§Ø35µ±a†0Ä©Ÿ®Mo6°,ÐÇ I÷R5 £èIEPYÿä%aþûÿè°/5K›;äŽímÔÝ^îXã@ò‚…a\¨!›99­ùÿä%aþûÿè´hÅtÚ HE iO— ò¬p»m<¹n0:÷çÖKǧ¥ž–·÷V×Zg‘rDŠá¡óK)ESþÈó{ñë]•Â]¶»Ô†Ÿq¨G§[i{n^Y\n,#$ýâN8 ÈÅ]˜[Câin6é·Wr^D¢ -ÏÚc]¨»•‰û«‚Ü uæºê(ÍêÍ ŠáY•9Â> ‚)ôQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s ÿ!Kïúé]=s ÿ!Kïúé@¬‰ÿ×Éþñþu¯Yÿ¯“ýãüè¨Ò¿ãÁßý Õʧ¥Ç‚ÿ¾ÿú«”QEQETwñï/û‡ùT•Çü{ËþáþTŸÿ ëoúäŸÈUН§ÿÈ:Ûþ¹'òb€*êw`Òîï|¿3ìм»3ÛTœg·J±ño™so£i ¬wíp²¥Ð”*¨ïx5»©Ú}¿K»²ó<¿´ÂñoÆvîR3Žýk7þm0hri©oM-¸†Iá…Qß|Çã<Ыâm­'ºûfØ­öy¥ãu*áNÒ3‚O\b’ÏÄ6—ºÈÓ­ÒfÜN²˜ÙTŒ‘ŽG·^ºÕŸ Í{Ó_êb[™ãŠ!"Û…TH仹$޹ïZ§LoøH†¬—j-Þ"™È XÙã“èhFŠ(  ³ÿÈJÃý÷ÿÐ hÖtÿò°ÿ}ÿôWEÄca4dHv¡Ü>cè=zʤÞÄ”TOsoo#ϤmµØ¸O¡=#󤸼µ´Ûö«˜aß¾dsޏÏÖ•ÐÔ$ôHšŠˆ\Û”Äñ”â6Þ0çÐzô4¯<(Å^TR6äŽó<Zw+ìIEF. 1I(š?.2C¶á…Ç\žØ¦Ïwknê—0ÄÏ÷C¸RßLÒºŒ›²DÔQT#×4yfXbÕ¬V`ª‹p…‰=€ÏZd—è¦Å$sD’Âë$n¡•Ôä0==Å:€ *(n­çwH."•“ïpÅy+Î:r¬>ª}*Z(¢›$‘Ä¡¥uE,8$>¤>¦€EEssoi šîx ˆuy*ÄÒÛÜCu Ím4sDßuã`Ê~„P”TS\Á|ùâÒîq¹¹ì22{dT´QHî±£<Œe™Ž¦–€ (¨…Õ¹‚9ÄñeÛ²Mãkî .C’F=s@ÑTÓVÓ$»6‰¨ÙµÈb†:—Ü:¹Îh—VÓ º6³j6q܉çPù<‚sÎE\¢ »½´±ˆK{u´lÛCM @O\d÷àþTëk«{ÈDÖ—O8†SøŠ–Š*8î ™¶Å4nÁð¬ ÚÙÚ~‡¾ IE6)#š$–Y#u ®§!èAî)ÔQEQE5$@ñ²²ž…NA QEQMwHмŒª£©c€)ÔQTF³¥¯²NËíü¿+Ï]û³¸Îsž1W¨¢Š(¢¡ŠîÖgDŠæi#óQUÁ,ŸÞ£‘ÏJrÏ H#Yc.ÁˆPÃ'i¸ö$èMIE4I•¢¦EPÌ™äœ=äiÔQM’HâPÒº¢–  ’RHSN Šl²G O,αƊYŽÔ“ØS¨¢šdŒJ±Q#)eLò@ÆHƒ#óê(¨ã¸‚I¥†9£yaǘŠÀ²dddvȨ†£b׆ÍomÐë•wÿß9ÍY¢¨G®hò̰ūX<¬ÁUá {žµj «k‘›kˆ¦U¿vá¸nAã±í@ÑTfÖ´˜6yú¥”~bïM÷7.HÈÉäpyö«‘È’Ä’Äêñ¸ ¬§!èAî(ÔQEQEQHî±£<Œe™Ž¦€Š*7žÉKTÌÞ8_Ìð=MIED—0Há#ž&fß…W§k~D€}-QH޲"¼leYNA¢€Š( Š( ŠFuR¡˜ç êqœÀÊ–€ (¢€ )¢HÌ­u2*†dÏ à‘èp#N Š*8'†æ!-¼±ËÎ088˜¾z¹vòØ49IX!”0N=FkgÉr¯tdžæ[s³ËÃ$x<îÇšìätëÇënŠsèðé>"¾ckt°Oo F†ÖYT¿™3?(§.ãPzoÚ?n7ÝÄ‚ßìûÿïõð-ÕÓÑ@½‹]­œ¬é«¾ ,ä7 K̼`F\Îs·gëÚªÀ—Î&€¥ô™l$ÍI›\'2sÀ OAŽqÔ×eEcêÊÑjÚ}ôK=´ *°Š3#Fí·kí'€Ã€HÝT%f’åf67öºl’ÈÒ}dYe}¨ÙPoPpãÀžµÓÑ@}õ¶£>”|Ø.dé:„k¹ s¹£ò•±üe@ã© Ôªš«kY’âí$‡¶ò˜Ì¸ù·ˆ°S¯õ5ÕÑ@t]]h7ÐJš³ßɧÌ.ˈšlp<œà'uíSÛý¯Ï‹ËþÔû_ÚÆß3Íò~Í»¾ï—>_¯Ï»­uTPf‡ éÌ×OrÒËu>gb®h<·Ž£±XÖÂfÐtìwkwm%¨—t #Q£1ÞFÒ0§'9ÖQ@„›åÐïô¥²¼7²ÝÜIµ"™Ù$ÞFÜ †Îjçö4š…þ·ÍÍä6— H¨eò#ä©n Œ‚:z×GEcëÖ³Üͤ¥»ÏËÍÍ,*Æ<™F~`F2@äwªwZwö}Ä[æÔ¦µ¸y%»’ÞcK„ ‘.ÕaòŒg®’Šæí-¯î¦Ó#½’ù!ܳâFŒœI”$*Gͳ>ü7½\ðµ¢[h6 a’;²E¾h`à ?)ÝÎfÇl8ÅlQ@ŒÚJÚKý¤îmm„©ûųûÆfãïÊsš¿âCæ\[[í(·‚d¸µá˜‚Ƕz Ÿ@wè N5ÕX ÷¨ÿkùP[Êc0nã,\GÊuùwØšQ ÒJ³_>ªÖÒÜÝy«ÊYq)à'ÌnãÇ_—ÿû÷þ¯þº£’ ^8æÑïZòK»Ä #±Œ&'ò²§å •Ç85ÕQ@¾‘Í%ÇÚî/Í­XN·ò¢î8ï+·8Ý÷FÞ~•±¢ÜK.™d—+'Ú~É’³!Áb¼üÝ3r:ôõ«³Eð¼3.èÜme=Ç¥>€9m!¤·¹š9®µx‰¿„ `L$4ÌGÏå çw~¢£5Í—PB×Cì9Tî&á^@r9ŠE‘×ïZëh NuarÝjÜÚª ±º5|¾c3ãiç8Þ¶ôˆ¦‚]B ᡎä ÎÎJ£' Ù$n-ßÔv­(œðÝ­ÊÝ¥ÕâÝ ŸJ³Wi™ùy›ÁÃŒ÷÷9«§iLú„1Hº„QÆÚ†÷ó%C–ž2˜|çyààzœ×[ErˆuY4¶iÞú9N±,V7,$ÞþoÊ9Æ7mù€Æ9Å[–k˜¼ }1ûLÚ\2Œ‹€ÛNN¦Ï#Œó]2h£ž!™â‘Jº0È`F4ÌywRÅ:šƒÚ‹›At¾ñ:™HÝÎПNQ=Ψ-þÏl—‚î+»·ó$Fí+1‹,~R¼ÇŽp0WUHê®ŒŽ¡•†# Šã.%›|ñi²kÛHº`“™w‡—´¨nwr~ïñÞ´®`½7··I%öèõe…ßg”D"B¡^dÉç'Œ׳Ó,윽¼D9P›™ÙÈQü#q8Ê·@¸¼7€[5Ê¡Óî¾hWv$Ì[ß{÷÷¦ø~I“M¸{ˆîñ„§›æ3:…¨œ 烞sŽ1[4P!£ÚêÖz®¡sd©öÿ1nŒnÎêX—Bë´m OZ±§#K±Ó&Òg–ö Ì-,{ÃÓy¸Ú{·\œâºz(2¤(¼˜Æâ&²Uñò’b@>£#ó¦£e¢iYÛL.n,ÆeØwBÅFÇaØ!/Ÿ÷«²¢€9[‹ìýt¤3jv–ɧÁ mggçÚÒðO–ø éÖº[¨äd€4Í …d-,E #' `ðr01è*Í&âØ#Ð"ïªÉ%í¬R]ìÖØY–•d‘[VX²»zÕ×iÜ–CR6i5«Æ&™N%lùÊìŽÿ0ÐÚÚAh$!k™–,YrIÏ@ÐSPv“4×êÈ— \$LŒ§g•@z Û¿÷ÍspYjŸØ×¼Ú·ÚSH†xÁš\›¢²nÏ'*™^œôæ»Z(ž¹¸¼KËËeŽô´š…³ÄÉ”þä?Ì8"LŒ÷'9¬ûØ/®#×­Šj3 -nvówgä@¿tñСäpÃ&»(\&ÔÚ5ê u$"Ê]—aÀ}§ÌãžNq‘ŒÖi†ño–áaÔy­´àÙglbÞ«òä)éÁcеu´P;¤ÛO«lòA*ªÿie™uÒ2þ`=G5YSUmk2\]¤‚ðáÞSƒw6ñ uãp>¦ºº(›¶µ¼óí¦–KòfÔ.£™ZY¬¾ÙÆp£ˆðÝy<ŠÄ°·Õ“M¶€K¨Û9 @ü7ÌÓè–KÍΟytu jó–ä"8ÿ~±£€¼§8Æ'mO®A}-Æ«-¼—ËäiÈö« º«M™O}ãÂdsÔdt®ŠŠç®n/òòÙc½-&¡lñ2Få?¹óÈ“#=ÉÆjK »IÔÚšÃ+^™žDlàEŒ´l$Œc wºz(ˆtÔ™wS„šE¨‰£W n‘&8à‘ÜOµ\TÕ[ZÌ—i ¼8D·”Æ`ÝÇͼE‚xÜ©®®ŠÊÑ­¦û5ÛÝÉtdžæuÄ’0Û•ÂmùFÜGlz æì Ô-tXà)ª¥êZÀ,U ¾Z·–¹ü#nÈ~‹€+¹¢€34øgþ×Õ.'{¢eHݼ°žTd•^‡æÝϨ>õÍ%®°oÃM«3Z–Ì µ;°@ì½0ݸÁ®âŠó2ßQ´Ñ´«{˜u¸m#‚Q*Z ¢}ß.qÎÌgùsM¾Ÿ]7Û\ͪý¼hÈë›}£Ì`¬àqØdôõí^“Q}žµ¯)<òžY“oÍ·9Æ}2hÄP_Ée¥KJ×ÐÈÇ1Ú²$¼mÞTdñ‚sÁ5.æi/Ùÿ´¾Ëösçý·ÌÏ›•Û·¶üíùzVõËjPjfîúx¦½X¾Ú‘¾c’„”E`Oï:•96;ƒ+z‘B/fÕ%°2JsS$ á64»Öu=qž1]mÆÜ¦°ò°7Œ/²/²þâIî.K”uvíÙÞ1øUûé5KYïo­ãºœAz[ÄKAùG “œöÃ{×GEq—6ºÌ3<}|eEŒ[I2Êí˜êŸw:cµnø‹Îû ÝÓ!·gW“°#8\uã5­ErÚlׯc욊D‰x$!¥ˆœJžV[9û„‘É<O5Ÿpº…Î…pº’jÏ{%ŒbÝ!Y6’aÃ…ùwoßÜã®æŠÄñ,¦3¥©{µŠKͲ‹RáÙ|™>O˜Œ€xçŠÎ0ëÛZÞõdK[·‹s²îq"y_S·±ë†Ïzê^(äxÞDVh›r>éÁ#ñ§Ð$ßmØÿÙÚÞO¿hûG™ænó>^þwló>ïÛŠ.…Ó…¤š¬zq’MÍ4sÉ&v¦Üe—fwõ=}±]mÈÞ®¦šNžLš”ÒªÊvF9Ü6*X«Ó~Tó»¯ÿ¥¯‹åõáfÿmb|¯Åú8'ºÖýÏ_é×3xŠêþÑJ\ÁkÙä`BHCM¾2}+ŸL©ì+ÕÝZU¿³‚C<±Æ–ó3‰âVÃÙqò”Æì©æ»ª(Ô,/$÷‹Ö¹–ßNeBFä¸Ì‡2ã“ÈÝZ:Íž¥c¹¸¼ºIåxä•ä?f˜.vª€7ëÜ×CEr«ä©:éoª*‹6f7fPMÀ*P.þyÃÛòò)t퉵h¾Ö/ÚR×ÿ¼ÜnʬÓ†Ûê+©¢€ (¢€ æþB—ßõÒºzæþB—ßõÒ€Yÿ¯“ýãüë^²'ÿ_'ûÇùÐQ¥Ç‚ÿ¾ÿú«•OJÿÿ}ÿô3W(¢Š(¢Š(¨î?ãÞ_÷ò©*;ø÷—ýÃü¨=?þAÖßõÉ?«_Oÿu·ýrOä*ÅQEQEQEUŸþBVï¿þ€j”ÅíÝÆ“*[$6WÒ’æ†gO)ÙC.ß—8‚z`ÕÙÿä%aþûÿè– N·¹Žâ(\'ºk ã ¬1Ì–3\Âë?˜£fÉÛ·?08‡l޵vç^š×PKim!ÛæC”¸,ÊÒ(^€°åŠ“ØtÍ…ðö–©°A!O%à g […àp:`b&…§Êåž9‰,ŒÒ$ù™1µÍË «óxë@TS!…!VT݆fs¹ËrNO^Üôè;S袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®a¿ä)}ÿ]+§®a¿ä)}ÿ](õ‘?úù?Þ?εë"õò¼uWüx/ûïÿ¡š¹Tô¯øð_÷ßÿC5r€ +?SÖtý*H#¾™Ñî7yj¼…¶ã<(>¢e«ØßN°ÛJæV‹Îñ:›Šçæ¸4zŠ( £¸ÿyÜ?ʤ¨î?ãÞ_÷ò  6Zu«ØÛ»#îhÔŸÞ°íõ©¿³-?¹'ýýñ©4ÿù[×$þB¬P?ìËOîIÿ_ühþÌ´þäŸ÷õÿÆ®Q@ÿ³-?¹'ýýñ£û2Óû’ß×ÿ¹ESþÌ´þäŸ÷õÿÆìËOîIÿ_üjå™5…²ÞÚDöHí¸yÙN9ÏNÛ}Ü =¾‰#ÆÙÁûqÁÇzÕŸþBVï¿þ€k'N¾»³³Ñc 6×S´.[;ÁýãqÛøGç@}šãþ€RàÃÿ¯GÙ®?è'þ ?úô^k—P]ÜÊ©Øm.â´•X1‹„ùÎEã8<в÷×öÚ奥Áµ–à E‰^ £ ’X†àrEVû5Çý¤ÿÁ‡ÿ^³\Ð Oüõêî½}w§ZÅqj2yÑÇ'™œáäTãïÊ«êËǬÿgAuckåÆŽò]s½œ¨£róò“ž{q@}šãþ€RàÃÿ¯GÙ®?è'þ ?úôÍW_ºµÔ®m {Uš†IQŒ—a€å r½6’p+OW¾šÔÙÛÚÍÍäÞTf@J  Y˜€Fpñ‘Ú€3þÍqÿ@)?ðaÿ×£ì×ô“ÿýz¿¤ê2][]}¬"Íg3Ã1@v’ À@*AÇ8ªv¹y,štשn–º¤lð4X]à1' •ä‚;ÐökúIÿƒþ½f¸ÿ Ÿø0ÿëÓnµ}V 5-;O³´m¾@Íò¨;¸m¥GC“éR¦©y7ˆîtõ½ÓàH%EH$‰ŒÒ§–ŒÅNð?ˆºqŠgÙ®?è'þ ?úô}šãþ€RàÃÿ¯OÒ5KËýNâ)/tð°O25¢ÄÂ`ŠìªÙ/ßçn9«ÚÄ·Öö¯qg5¤I m$†â6làg0Ç~yúPwÙ®?è'þ ?úô}šãþ€RàÃÿ¯Q6¹}qkW6Ú,áî&vwrÙA‡^FÑÇ^jÂj—“xŽçO[Ý>‚TT‚H˜Í*yhÌTïøˆû§ }šãþ€RàÃÿ¯GÙ®?è'þ ?úõ³x/%2Áçæi£.úÝëœÿ„Žò[}.O´iö"í&/-Ìlñ–GU]¿:à6I'ŒP¯³\Ð Oüõèû5Çý¤ÿÁ‡ÿ^‹½OPYM†™lÆÚ' < |霃Ìû£ŽO=kKY¿};O3D‹$Ï"C±À.ìgÛ'?…fýšãþ€RàÃÿ¯GÙ®?è'þ ?úõ{K½¹–ööÂûÉk‹]æB¥UÑÁÁÚI åXu=+N€9ï³\Ð Oüõèû5Çý¤ÿÁ‡ÿ^º(žû5Çý¤ÿÁ‡ÿ^³\Ð Oüõë¡¢€9ï³\Ð Oüõèû5Çý¤ÿÁ‡ÿ^º(žû5Çý¤ÿÁ‡ÿ^³\Ð Oüõë¡¢€1-lšYÂ\iOo .oY¿ V›N°SƒŸ÷ùÿÆ´ÞVãýeWûŸýÉ?ïóÿ`Óÿ¹'ýþñ¬ýwR“M†ÝÅÍ0ç˜#å€#¸¨õ§ÛÞ4/u¨^ZK#d¶èBxlœð0y  ¿`Óÿ¹'ýþñ£ì÷$ÿ¿Ïþ5›7ˆ,£6áEĆiü‚Ým-ó.28ÇèsПS½–Îm="T"æèBûáv;qï•oì÷$ÿ¿Ïþ4}ƒOþäŸ÷ùÿƨ®½¦=Á·K†iC¼xXœüéËœ}ï”ñÔöÍGkâ >Úì‰ãûJ–H¼‡g “´HŽ=èKì÷$ÿ¿Ïþ4}ƒOþäŸ÷ùÿƲµ/XYÙË$Rùó _´Æ‰0uÁÁÈ*r{w©#Öa·°‚mFFW‘³¥¬ªŠ ïv÷hýƒOþäŸ÷ùÿưiÿÜ“þÿ?øÕwÕ,Öûì{ÝçXâw ž›ˆ/âE"jÖ2]‹T˜™ ˜ÁØÛKªI<ž YûŸýÉ?ïóÿ`Óÿ¹'ýþñªZåõÅŽŸºÊ4–òWX ú3\vøQo¬ZɤÚ_ÈÅåWj,ňû  ’FOC@~Á§ÿrOûüÿãGØ4ÿîIÿŸük*Ã]Škc-Öåv¸š8£Ž.ÊŽFv[8Æxê{StßZÍaf×Ó$WSZ­Ëª£mU üÙäòž§ÓÔP¿Ø4ÿîIÿŸühûŸýÉ?ïóÿRÞœb’C3¨nåx][æ8\)9< š{êÖqÛ¤îfU‘ö"yŒØ'6î<zP¯°iÿÜ“þÿ?øÓÛL[˜mÊKæLHP%~Ã$õÿ9©!•g…eMÁXdnB§ñ~5Z_ùiŸö×ÿA  ßÙ6_óÎOûüÿãGöM—üó“þÿ?øÕÚ(—öM—üó“þÿ?øÑý“eÿ<äÿ¿Ïþ5vŠ¥ý“eÿ<äÿ¿Ïþ4dÙÏ9?ïóÿ]¢€)dÙÏ9?ïóÿÙ6_óÎOûüÿãWh  _Ù6_óÎOûüÿãGöM—üó“þÿ?øÕÚ(—öM—üó“þÿ?øÑý“eÿ<äÿ¿Ïþ5vŠ¥ý“eÿ<äÿ¿Ïþ4dÙÏ9?ïóÿ]¢€)dÙÏ9?ïóÿÙ6_óÎOûüÿãWh  _Ù6_óÎOûüÿãGöM—üó“þÿ?øÕÚ(—öM—üó“þÿ?øÑý“eÿ<äÿ¿Ïþ5vŠ¥ý“eÿ<äÿ¿Ïþ4dÙÏ9?ïóÿ]¢€)dÙÏ9?ïóÿÙ6_óÎOûüÿãWh  _Ù6_óÎOûüÿãGöM—üó“þÿ?øÕÚ(—öM—üó“þÿ?øÑý“eÿ<äÿ¿Ïþ5vŠ¥ý“eÿ<äÿ¿Ïþ4dÙÏ9?ïóÿ]¢€)dÙÏ9?ïóÿÙ6_óÎOûüÿãWh  _Ù6_óÎOûüÿãGöM—üó“þÿ?øÕÚ(—öM—üó“þÿ?øÑý“eÿ<äÿ¿Ïþ5vŠ¥ý“eÿ<äÿ¿Ïþ4dÙÏ9?ïóÿ]¢€)dÙÏ9?ïóÿÙ6_óÎOûüÿãWh  _Ù6_óÎOûüÿãGöM—üó“þÿ?øÕÚ(—öM—üó“þÿ?øÑý“eÿ<äÿ¿Ïþ5vŠ¥ý“eÿ<äÿ¿Ïþ4dÙÏ9?ïóÿ]¢€)dÙÏ9?ïóÿÙ6_óÎOûüÿãWh  _Ù6_óÎOûüÿãGöM—üó“þÿ?øÕÚ(—öM—üó“þÿ?øÑý“eÿ<äÿ¿Ïþ5vŠ¥ý“eÿ<äÿ¿Ïþ4dÙÏ9?ïóÿ]¢€)dÙÏ9?ïóÿÙ6_óÎOûüÿãWh  _Ù6_óÎOûüÿãGöM—üó“þÿ?øÕÚ(—öM—üó“þÿ?øÑý“eÿ<äÿ¿Ïþ5vŠ¥ý“eÿ<äÿ¿Ïþ4dÙÏ9?ïóÿ]¢€)dÙÏ9?ïóÿa„Xõ Ä^\ÎxÅu5Ì7ü…/¿ë¥>²'ÿ_'ûÇùÖ½dOþ¾O÷ó £Jÿÿ}ÿô3W*ž•ÿ þûÿèf®P?¯èóêzö*™ÒÚÝgó¥†o-“r®ÜAäƒÒ³5Ïj2êE¬’Yí–Òß͸ù§ 1fŒ±9åOSÅvtPqáí\YÍq§Y‹YVäµ­¡™O“DZùÎIÝ€{V¯…4+­2þéïÀŸe²bÀ“ö|œtûÀÀk¨¢€ Žãþ=åÿpÿ*’£¸ÿyÜ?Ê€#Óÿämÿ\“ù ±Uôÿù[×$þB¬PEPEPEPYÿä%aþûÿè±-­5+­3F{m;IÚrf±ýâíÀFþösžÝ+nù X¾ÿú«V–‘YÚÇoàˆ02r}I  }KA:†¨²5½¼p™b–YDÎ^B„<¼mÏnÎqÅ?L´Õ¡Õ§¹¾†ÆA3°óÖw.‘ ìEB˜¦~n¤šÛÛîhÛîhW´Ö5 aÚL‘É1óÝQJH®ü„œíÇ8ǽAªhw—²]ÉY«jVkms½Øù$nùíù¾÷C·îƒ]ßsFßs@Æ¥áË«©ocAjñÝɉs+7lUU~P8ÚHärÇ­hßYj^EÇú*ÝYÝ´°Íµã!— qJ±è­km÷4m÷4‘¦é÷¶­'ög[Éešï ÙRB…TãÁ':VMƃ©ý‚ÎÉÚ'†É ¼ì®{Ø팷Br}:W[·ÜÑ·ÜСcª¾¯ ÖÖö3ÙÛÆ<˜fãÙ'wÀFzsSjv7ºí²2ÛGimsÀ”HÆVÛÎÝ»p2xÎãÇjÖÛîhÛîh&KÛ½rÒòåm¢†É¤1˜ägyC £vTçz•Ê`ò1žiF‘xtϳÜÇ Ó Ì‘¤—rã,»w9çñ[_ØIÿAGþÿõ¨þÂOúê?÷ûÿ­@iP\ÛiÐÃy?Ÿ:ƒ¹òNy8<œ ž¸Í$¿òÓ?í¯þƒSa'ýuûýÿÖ§ÛèÑAwɺ»•âÎÑ,€ÈÁí@TQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÌ7ü…/¿ë¥tõÌ7ü…/¿ë¥>²'ÿ_'ûÇùÖ½dOþ¾O÷ó  õK™RÐÝÉeiwu*OqlaÅWwmnjҶ¨ºE…ÚØjgQ+w ×LYmËà|ÒÏ^:Vå¼ZP†ææ‰ò’(e?9ìjÂXÙÇhmÒ¶<D`!ÿ€ô RmjúâêÒÚYc[ëA$¶ŒËÊѳc>Ù<ŠÌÒ÷'ž¼Ð+Šõh'‘l%ûF5ä+âa(¹ '<õÆF9Uý/WÔn®ä³ÔR×÷šz^FÐC6œ“žx­˜ôÍ>/;˰µO<›l*<Àz†ãŸÆ-­¼i$±ÁH!òƒªB‹ŸOj]?þAÖßõÉ?«_Oÿu·ýrOä*ÅQEQEQEUŸþBVï¿þ€kF³§ÿ•‡ûïÿ HµÛ¯>È‚óÏùIV²™p J` ƒÉãƒ@TT^A5‚_DÌöï™YQ‰e## Œ“ŽØÍO@Q@­ÄWv°Ý[¾øfE’6ÁR2= K@Ó"‰V"s)`vœ`c©è#ŽüúuSb‘e‰%@Á]CÊTàúƒÈ>Æ›$ñE$I#…iŸdcûÍ´¶?%'ð  (¨­n"»µ†æÝ÷Ã2,‘¶Ê‘p}ªZ(¨m®¡»Y,#‘¢bT¹Nàädq}*j(¢Š(¨EÔ&ôÙ†&uŒJT)ÀRHœ`dƒœð}*j(¢Š(¨àž+ˆËÂáÔ;!#ûÊÅX~RPE­ÄWv°ÜÛ¾øfE’6ÁR2µKEOÜ¥±lK"3ªàòªTŸ«/ç@QQ¬ñ5ËÛ̱¢». Å€9ú«~U%QEQETqOÒMm–öH0~VÚ“øÔ”QEEuq¥¬×7²Q¤‘°N “í@ÑEQEVŠþÖiÒå #‰ €>[~}˜@h¢Š(¢£Yâk‡· ±¢»/¢± Çk~T%Q@WM$ñÆûšÈ0FÖÚü0?K@\D·QÛ3âi¤UÁåT¨'?V_Î¥ Š( Š­kkvÀ[J$&ç”|í?ŽÓùUš(¢Š(¨àž+ˆËÂáÔ;!#ûÊÅX~RPEEÄ3IÈÇ÷›il~JOáRPEG<ñ[Æ$™¶©u@pOÌÌGæ@©(¢£·ž+›x® pñJчñ)¤ Š)±H²Ä’ `®¡€e*p}Aäc@¢Š(¢¢–â(d‚9kNæ8Æ ÜÛKcÛ…'ð§™J±Û™K´ãO@ywçÐШ¨¥¸Š ŽGÚÓ¹Ž1‚w6ÒØöáIü)n&Kxi…W¨Ž6vüA'ð%›o®é×1M*I2Ec$“[I.Ó†™@ȤÓM¦i@Öâ8“r&L±-󌂼Œ‘¶·¨  ]#KšÓRk›¤I&:}´p1™$Rûùëýνxô¬øtËØüEèÓöbòV–T1üñ2¸RX±sÉBW€1À8ÕQ@î¹£IqªÎ-VYNHìØ‘‘02ž2~R '´šÎÆXæµ[`f&4T•Ú£$!*Aû¼wÆI­z(‡MR[k¥Mòd¸Ón`pV•‚íçqfèÃsóÐdÖ…ö†ñßÈlìKä<¶Èʢ௜HüÑ»®ÜfºŠ(#ÃÖof—Û¬¾Ç×>dPîSµ|´ÂHƒÇnÜb°`𼉣\FÚtbëû"‹•Ⱥ &âxlù7Óž+µ¢€9]WK½—[{¸týÌ—òG2÷Ô¦ñ¹›rœT{““QÏ£^±×»[”IÓtŽçä\| ¼HÍuÔP¶}†«f$&âpí óºFe8-ŽASÇLcïT$Ò.d²¿K'ìM6X [Ó÷ó0OÊHã 76 Ý]e—§é«a«Þ5µºÃk,íÙ€@Òn$zà¦IëøVU‡ÞÄ—š\BÖ6¾$0BæLÀ<ü€ŽG~•ÔÑ@:øR’Vò©. ¼ ±Éú;,j¬ °.§pfÊg9®—X°þЛMG…f‚+£$ÊØÆß*@2Q¹”cßÒ´è 2mï„–Òi­“ÎH ˆÀD_¾‘”þðF@ ò6ã=Ö‹yÁº¶³ó¯!³µ1LÎ…žX™·«1ÁË+œqÛWYEq¶þÔ`·¸¶#|vñ¢Û& ÁÝdIí’¥yõ«O£Í5½Ôpißcµš{B-7"à$¡¤|)*2¸à¾¦ºŠ(š‹Gº¶×žò(CY­Òˆí†Ð¨žLiæ¨õR¤`öΫuÝþçSylŠ­È;ÀÍÄA‚ìr¼ô+§¢€9ËmÍ—MþÑ´Žd[k†¸WÃ(šWÈÇ~Cóíô¬¥ðþ¥$­ä7R\x9c’ôvXÕX`]NàÍ”Îs]ÅËjZ÷W×KnXÉzŒB˜ËË…¨ß•ûã$63°{ÓÐtãi§MÐÈ‘K#0†cmRÆà£#“Ï5­EqpxnfÑfŽM5æ=+{pJenÍÉRÜÊwq÷¾µet[³­}¢X®_¶EÒ¼*¢-Ù ¦O»…+ÐúŠêè  ?XK}5 +u ߌP¸ù\…õçŽÃ“YÚf•{¶:Ž–×J-Â\4Ë›pŠ¡ÆCnûÊÍÆCnÁÇ5ÖÑ@ņŸw¦]Ç,Q*’^©XÚ5È–Tx߯ÝÚ zŒtÅQÔ4=Bm*ÚÓÃÏ–Ç (Z9‚œŒ³apqó($úŒ íh  ý6 £¹Ôåš#¹¹Y#‚q伉î¬? À‹BÔ-tÍ&;XFOØÅüÀØÑ4dÈpN©Ç^=9ëè OGЮ!¾·{È'2"¸¹™š.ã*Gð®÷œáñz]Ãî†ßí¶÷«›o!ºh³"´›óå°Îw“ýï\×WEs7ZUÁÕ®.'Ó¾Ýd× ßg܇~a…UðÄ‚Ž0NyÍV¸ðõõÅ¥³.ØçW†è 2b‹Ìó#\÷ÚÎ?½]}•áÛ[È,mM_\Èdœ ‚QÈÿeEs:F•uqáŒÙéÿg3è >bÿ¥J軃Øg–ÇÞÇA]Ý:@¥î„è÷°ÚiŠï.ß±]+ û'Ê2y;ß¹þPwnæŸ>•rúýÍÂiøy/¡š;ÝëòD©uÆwsµ—ç<ôÔQ@¦‡¢ÝÚê6Ó\Åp'ˆ7Ú. ÂrA»Øs†#«é×W‹H¦¶¶Eè ”–Fa†àðÃÃgëê(ìmà«»j‘ÜÉm œœq[ Ó.­fk³iö;Ylá_/ÍçH&^y®¸€FÈ4sÖ¶·éwi Ù2Å£spÓù‰´£ùÅp3ŸùhÈZˇBÔÉ¡O"HšHÃDe¸8`IÊ?%æ¶{WkEro¢N41²¸qö³2Û»@ÛWaP `GŒó´3r1Z†Ÿ-φ­-¥²Žiákgx >GBáKž~PÓÏã[”P;g¢½½Ý¥ÒÚ¢\ FêIän0¿œW'<‚Z3^ܧ{hlÖ;å¶µ¶ŠFwB±?>9 ­ŽëÜ0+®¢€15ý:îæxžÄ¯F´¹;€+KR¸8Ç÷«?RÒnŽ®n-tÐ|©íÚ)còòcB›†Y²¼TGRrk«¢€9ÛkKû+»{…²i¶½ò•Y%¸ŒrG^q’3Ò²WÃ×í1ÜÛÜ<¢Þ…âx¶+« Ì ) å3œ×qEaø£MŸP†ÌÚB¯vÁŸîó· ¤<=s&‘"Of­u‰½¾YIK„Y3ƒž%>oÈõ®ÆŠåE»:×Ú%Šá¥ûa”]+ª"ݹÚdû¸R½¨«~#ÑçÔî¡HW÷(`»`À@ÁÔûòxþýtP/k£]ÜÛX>­j<—Íqx…ƒ(~£îqïõ¨åÑoüˆb†ÜâKå‰6ºÖ1Ï¢B=CŠë( pi qö4þÈ[[D¿3=»:ÈuÉPJŒ±*çÔõ5©¢ZÉe§}žHÄa'›Ë@A •ŠŽƒi^;t«ôPö]Ûè7Ágû|—1£°Úà\™T3€ÃLÒjk©êºuü+¥ýœ=ŒÑ(™ÐÈò2à*ÄõÉ玘®‚ŠÈm( w´YÚêHü‘$·/+F¬Fâ¥Øãp:àU ôIæÔî]-´Ö`b›Ë"1iåä!‡ÏÆ?…tÔPkkÝ-‘‡˜ûÝžFvvÀ,Ä“À“Ú¬ÑEÌ7ü…/¿ë¥tõÌ7ü…/¿ë¥>²'ÿ_'ûÇùÖ½dOþ¾O÷ó £Jÿÿ}ÿô3W*ž•ÿ þûÿèf®PEPEPQÜǼ¿îåRTwñï/û‡ùPzüƒ­¿ë’!V*¾Ÿÿ ëoúäŸÈV7‰‹©i‘¤ -µÇš×'²"Ë/=·x< èh®Z/ÛÁmq6£³‹ù­mÄ$.õN„–`½;ävÅX‡Äéy¨iØ[¼¶ºŠJÆS€T¦Ïc×ðÆh¡¢¸M3ÅÚ¥æ•-óÉcº;Y§0‹)Ç(¬Gï m<ߦGZكŖfh. ƒsÜGîb‘À;IÎz°ìq‘@Îék´H—(Æ)¤*ȹ_,°*yûÇc`wÅoÛÊ'·Š`Ž‚D µÆr3ƒï@Ïÿ!+÷ßÿ@5‘uâ;ËK™$1Ã=¨’â5Xã`s;cy?1Ìdž§ëÏÿ!+÷ßÿ@5?önŸöƒqöo8¶ó'”»‹zçϽs÷z®¥e{“ÜY;љÉ/,(òÇ*7»Ž7t©&Ô5;KÛõiíg”HYcI™I+¸pÿeúVÜZ^ÿ'Oµx*Û!Q¸dsŸ¥,:nŸn… ±¶‰ Sµ"US¹zÇ‘èy  H5­Yî—u´-n·d‘°©’i`L¹Ø.ÒqŽOZ•u›Ñq¨$‚Ôy1O%º”0¶‚dÜWÙÚTœsÖ¶>Áeö϶}’ßí=<ï,oôûØÍ cf’Í*Z@²N1+ˆÀ2öÆ€0]ÔÜÅiQÉxòH¬DvlT;J4ƒæýà<9àgèë{PMµº1ÚŹ&yØŸ4(F8FÈSÔ‘»oƒ[GJÓM¨µ:}§ÙÃny+°\c§Ëae4qG5¼‰1+Ĥ'û£~_Y¼žÒ«D&šaï¤Ïœ*‘“…=HÏ5ÿ  m ™aƒ+ äÓ®ÂK$T€ÜÉîqžøç£¹¶·»‹Êº‚)ãÎvH†}pi°ÙZ[°h-`ˆØ)\nÁnž»F}p=(/HÔµ+‹áô,rAç#©E#1#–?{ǽ@·÷¿Û׺}´Ñ+IrÅ$¸ ꊰ@vª†’äõþñ­«[;2æÎÒ rç/åFw×hŸO²¹GK›;y•Ü;‰"V À“‘ÉÀ>‚€0¢×o®£%¬`6ð4²¼ûŠI‰>RÚ¿»'w8 85-îµy¨cˆ@öÉs»¨‹!QË’#x8¸ÇLñ¯.Ÿc0„Meo ƒýPh”ùîñÇNÔ“i¶§±¶–R.ñ+1ÇNH  67ƒ{w, ˜'¼;¦b@ 4˜É8ÇaÅP]sSXîb’;sqZl- F¤M/–r»‰ãÏzzô‹+D± ‹P£±%²=É$úæ«Å¥éÐÿ©Óícé÷!QÐî»÷  ”Õu'Ô[Kßf· 3©¸h›aUŽ'ÀMùÜ|ßï 4ë+û´ð¬÷á’yâ’w<–VU™òœãhÀü+Z}>Êå.líæWpì$‰X3'#“€}KÓ1¤\üŠ /''rM`iž ¹¿ÕÍc„+Êò£NëPWëÔ¸Ø=*¾©©Aá˜MÔ‘LeÑ$ºFÕÃ"'Þ}Ù$ïÎFÒük«ŠÒÖF†ÚÙ#)DªŠ1Ð{R+CÄm`1¬FO,`Fq”û§Žœ δÔnî/4–iln¥¶¶D¹Mà ç¹ÛòœæªøjûPk}" é"™n´ï=\+oDcæbNâ|Ìç‘Þ¶Å•¢Ý›µµ€\°Á˜F7‘é»­:;h"ò¼¸#O%<¸ö ”z”qì=(ÿY¼·ÕLQÙ.`·u1`d*9r@o7éž :Þ®ó,PÃç¹HvÇ’« …wH “ÇŒ`ž{nͦØ\LfžÆÚYH»Ä¬Ç9"6Ÿe<DövòC¼¿–ñ)]Ä’NêI'>æ€3Ž«r¾¹Õ^–æ y¤Ø:MØåIàíéž3ŒÕ kY‚[´[ky>ÄTJ@TW,¥F í9 ôè:Co¶6ÆÌ6Š¥qŒc¦1Ú£šÂÎ{„¸žÒÞIãû’<`²ý >©©aímšÄoE¢™#faþŽ&,pÃ=Æ8íϬvÚÆ¥vÒ@c¶É#Jò£“l²GòÃhýÞI$ãp­ÿ³[ùžg‘ýþfíƒ;öíÝŸ]¿.}8¨¦Ó4ùÕV{Y3:‡…NŽIIäŸZç$×u·Ç, ^ÚÚ dÏ”Ò ˜“—POÉŽ£9_Nw4kÛ«»y~ßqÍÆ/•—æÀ8 ÛO8ÆOOz³=…•Ë3\Z[ÊÌžY/bW9ÛÈéžqK•¤QÅv°"BÛ¢UŒÁQØàžž¦€'¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®a¿ä)}ÿ]+§®a¿ä)}ÿ](õ‘?úù?Þ?εë"õò¼uWüx/ûïÿ¡š¹Tô¯øð_÷ßÿC5r€ (¢€ (¢€ Žãþ=åÿpÿ*’£¸ÿyÜ?Ê€#Óÿämÿ\“ù †ïK·¼Ôlïf.^ÑdTN6°pnçSiÿò¶ÿ®Iü…_[\^\ÚC&éíJ‰—iw Žz=(ÛÂ:}¥¤pZMu ŠáçŠTußa‚F1Ž0A«ƒD€O§Mö‹£-†ðŽÒn.ƒsŽØ«Ò]AÔ6²JiÃÐõ`¸Ïå‘SP]¶‡kmáÓ¡Ç$ÆØÂðîb7ílçœc<žÕPxNÀ0{±n]$’ßÌ\®€Ì1œü£8 V­Î¡kkumk<…fº$B Ç^ƒ€295j€9Û¯éWRÝI)¸ÍÍÂÜ80 îàqÐïlz訢€*Ïÿ!+÷ßÿ@5£YÓÿÈJÃý÷ÿÐ hÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\ÃÈRûþºWO\ÃÈRûþºPë"õò¼kÖDÿëäÿxÿ:ê4¯øð_÷ßÿC5r©é_ñà¿ï¿þ†jåQEQEÇü{ËþáþU%Gqÿòÿ¸•G§ÿÈ:Ûþ¹'òÉê^½½ñ ÌÏi¾ÎmFÖR|Å£HY\ã9ê@Çzë4ÿù[×$þB¬P †o¡¿·xì•#†âñ"}ÈL1¾<–çäã¨ÏJM/ÃZ¶›©FÖ× <Út–ä<ñmšR:€ª;ÿœóƒë]åÇ ˜n´Ymôø‹[ÛL.œdJQv峟½»‘Óž•¦øw\†ßPŠ+cb×:xŒm•vùÁŽzyÄr}Ojô(‰ŸA¼›G¹†ËKm5^h]­–åXÌ«÷Æ9AŸ~¸æ·<-§K¦é²C*My™Ò9eG(§|ŠzghȵµEUŸþBVï¿þ€k.ÓO+®¶–Ò§Y¼†tgf §ý•(ÄuþíjOÿ!+÷ßÿ@5£@Γª\Ü]Ø¿óç¸ÝöË=ˆ>É…'°Ü0À/ÌNsš—BÖ^þM.#t²ÊÚ{IvªDÀÄ9ÇB ?uéÒº(šžëQ—\x"Ô$†Ô¨E‰Õû(”J“þG'Ž•Ú­âÚZG&¤ñHÓ]DeÛyžT¥,À€p©'œcÖQ@¥®µ¨\.›œ ºœI* FG3Ž€z«ž)Ôn4ÿ³47ŸgB²UU/!p0Ãu?(!cÁ­cd©-óÉ#:Fc6 $#Œäàu=¸Ç5f€9yµk•×îmÓPËÇ} 1Ùl_ž&H˶q»ÌÙÏ稪–šÖ³ 2¬öó\y¼–÷µÙÑ@„©,ž!’¿•dþØp„ƦɎ@Ç~G9/®sÚΦ¸ŠMBdÎU¸•Ò#;$Ò&9!QI ù¸öìè  ]>ãP¹ÕÕ..B$VóI q€¯#™CrÃp(ãƒÀ÷%¦{OjF]I¬­ç¹+%Ó,ciXa)æ\w¿\ýÞ9$žÂŠçlou Ë­*6ºhÒH®%¬J 뱪GÊ[<{·fA¨ë £\^6«!xtˆu<˜ðÎË!*~_»û±ïÉæ»Z(•Õu›‹]mÑ/öGżmˆÕv9@ÍÈ.à Nì¨Ç89¿á¹ã[im¤½ó® åÞÙw³6xve?ð!Û¶é¦42,…AeéœgùPMΧtš—Ù¤D²ƒx <Ê\Mì¤|ª{ Ç>Õ›&£«CÞGp× %Ýä kå®Ò#”»9‰G^‡×šê¨ &kûû½WOí8nct²Þ7Ç"% ‘¸`å½=jK½~þÆæB·êÖÈù²¸E&x¤ "ÁQ¼[‘ýÚ쨠JãRÔmxîu=—öÑÆ ¶òÓý5¶)'ÉË–_”Œb¤Õ¦¾”êL'óÛR³Š rW%­ß%±ž¬3׌u4P5±x¶q³O×Ê̓ٴG~ðy Pd`r$Õ©/.™Þö=:I%·‰cû>õÊ»áŸ$g8:dòp mÑ@óßÞ] áÔ'¸¼1I䯉D2>Ò$ç*HJ­g©j eiuq{$¿kÒ$¼e)òÝDdlP?ëóÒºª(ŽƒZ¼6Ú‚ V'1Åo$s»ÆÛw;+ò‹´p$0RrN)·…üƒM¼³gšO²]ù’²®ñš̪¿+¶á¸8í]ˆš´æò8ìŒzœÉ…J´J@å›î\eN:LÖoÞ I¡›SþÍmÄ‘>Ô>t™`Wæ8x'uoQ@zeÖ¡yªÆ.eh4ûyå¶¿ë$óCHÈhãØ{æçöGö¾£ÿ ‘œ§Ù>ÑÓËØ3åçø·ïÎ9éí]EÃê­ šå]-ͦ—æ-Þ7ûSgÌÏÇ\ûÓõìÿ²ë?Ø>Gز.>Ñö\y^f>Lmùwc~qÏLö®ÖŠæ4½?û/Ä–èÉb‚âÎR¿c¶û:’­w ͸üÜ1ózÖÄÒná’­l‘á‰HÙÙÃ`ž3ûµüýëZ¢kxÚí.y"ÈƒøþM`ϪÞËa#¥ÌV÷&{xü‘o„<Ê„ànÈ'h•RóSÔ­®¥³mAR®^3y;$D~ê'U-岂|Çþ¾½zê(žïRfÓîþÜ>Ôlnš5Œ “”xÈe–Aؙɻ«ÜK(·Ì¥¢—P·_,|ðmeŽ>Km>µÙQ@œšÅÄvWòXêßÚ-6[ƒ.ÄýĪÑò€9ùŽÖÉh»žûNפ-p^oköË¢«¹É>0¸ÆÜ ì£<žk¬¢€1#Ö'K™•/-#ÜÏs• ÁÏÊÇŒ|§>¢{ËÝ>8àxRÙ]|Ùo%Rñ«±%† õb£§Zè( D_Ioâ ä·Ô–MFû U>j40‡~™árx8yëLûDñÞG:^,"Õk宯uœc*,p2qÉÛžížÆŠælu‰ÛLi…ürÈ—5óPIç|ªv¡‹ºõ Ç Ž*๸’ïI¹–ÕífžI ’&`ß&Ælþh¸Èž‚¶ª&·î£¸l—YTvÆO×@ÚÖ¥³@{5ÄÒÜ©Œƒ½ß… ô¬+®t>çH·I¬Z+›cmçlvK*«t,Í¿¿qÒ»:( «èlµ¥׳ØÈËõPÒ~å$ v€:¶8›aª]È·M.±nð-©‘¥„­äcßål·ºÊ(™²Ô.îŸL{à©rÚƒ¤¶æ5ÿGż¤qž@ œÿ8¬á©\ÞiUÉ‚æÍäš1DÌÃvÑ€1’®2¸$íè fÒkÛ›«{H/ ªHúƒ¹Š(òJ\…^ªGñœsÎyæ³gñëhSÞ˪ +´±ŽkxhDä¶~bÃŽÞk¸¬ûÍ&+É%2Op±Lšq²@;ŒŽ88#=è-zþ]*(/f¶ÊÏ®K)ó»hÿV&µªjzm¸WÔ ÞCcç²mVY>lKtÆÕ<×aEs+¨­¦§s?ÚcŽÒ]YVi… ’‘–=`œý=j”Úíü‡+ ¬Îh¦•Ö?4‰¤P£1¶pªœ žõÙÑ@÷ÓÏýƒe,â?=ç³óÌ®ZhÃ`0Èêq‘‘ÇB* 'Q¸ŸÄv“^yÁ<Ò#E]±…p+`÷ÈnH8¿Er×òO8ŠãRÙ:êqF,6/úµv·MÜ€vqÎ)/5K›;äŽímÔÜÞîXã@ò‚…a\¨!›99®ÂŠåæÕ®W_¹·MC/ô0Çe±~x™#.ÙÆî73gç½’ ê¡¶Š n$Hk‰’õ`ª¿ÉEK@¥®µ¨\.›œ ºœI* FG3Ž€zªöšÖ³'ïV{y®<‰^Kûž6H]¢0TîÀù˜ç‡‘ß­:[‹³ªËmmqö;U³¤H[gØÃ÷œÉÏaÐbºJ(/M»ºmY^òâgŒµZ]’º@ =PŸU½–ÂGK˜­îLöñù"&ßy• ;ÀÝNÐ=+£¢€9ÍOR¶º–͵Hb¹xÍäì‘û¨T·–Ê óøFBúõŽ{½I›O»ûpûQ±ºhÖ06NQã a”Y`:d`g=•ÆÁ®ê÷Ê-ó)h¥Ô-×Ë<Yc§RÛO­M&±q•ü–:·ö€‹M–à˱?q*´| ~cµ²FÚë( Nî{í;^µÁx½¯Û.Š®äS$øÂãr@'²Œòy­õ‰ÒæEeKËH÷3ÜÀ¥D@psò±ã)ϰ­º(Ÿ{ËÝ>8àxRÙ]|Ùo%Rñ«±%† õb£§Z†[­FmdäñÂ×âÔŠ3„û(˜Jžwùôé]5ÉͪÞ-¥¤rjO5ÔF]±'™åJQrÌ*’yÆ1I¹u,š4zª.­íÙá‰T³;6 Œ:|§+‚H"ºÚ(‘Ó/îm縊ââ+;VšðÛHÀ2ÈââBÛóŒ`tŒÇ>›ºMõÕç˜.-J"cdàY~ŠÀ0ýG¡5£Eq67/f×qÏ«µŒm5Ä©3GgO"$¯8œ~nåÖ¥ªý–öäÎÖ¯k£%Ù€F§2Íœä€Pqì=Áꨠe®58%ºvÔå‘mu{``:IäîÝ…ÏiÆ1Ðg5j÷-¯Çmý¢Â9nå·hØD¦ ö¸,>e,pÙû¼×WEcxNæ)<;¦Â.Äó­œLà°,21Î= ²úü§<æ¶h¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ æþB—ßõÒºzæþB—ßõÒ€Yÿ¯“ýãüë^²'ÿ_'ûÇùÐQ¥Ç‚ÿ¾ÿú«•OJÿÿ}ÿô3W(¢Š(¢Š(¨î?ãÞ_÷ò©*;ø÷—ýÃü¨=?þAÖßõÉ?®_[Ô/ì|j³C,­em§¬×6à’ YÀé¸ ¢âº?þAÖßõÉ?§›hs9‚31O,ÈPn)œíÏ\gµpzo‰uh4-*t[™äµ’âIî\Á\Œe“Ž*íᬮ§<öÏFKŵ`]wn9•°O‘Ôcêz†Ò´×·ŠÝôûF†˜ã0©T>Ã3Ú[<ë;ÛBÓ*”Y ÁOP§µrþ2¼º¾ÛÛBÑË'™ÚĽº‰7ž¿{tx¾aÅ:?êÐO"ØKö:kÈVÄÂQrNy댌r®ª (6‚ÎÞ&‰ FR%RŠNH ö¦Ç¦iñyÞ]…ªyà¬ÛaQæÔ7þ4Èk:þ­aý2+¼Ö÷´åü¼lB ŽûrIý+´´v–ÒHå.‹Ä0­‘Ô ž?F³µckhI‰JG”"‘‚  Š|0Åo ÃoE *"…UÀP3ÿÈJÃý÷ÿÐ hÖtÿò°ÿ}ÿôVÅå«:"ÜÂ^FdE ³/ÞÔŒŽØ  ¨¨Ìð‰fXרpÉm»±]¼ãÓš’€ *9ç†Ú#-ıÅ v 2N'Ô)ÆXÄ«‘DŒ¥•3É=Gæ(ÔR;ª »’qÉ8ó5LkS]}”jvfã—å ×~ìãn3œçµ]¢›‘ÍK ¬‘º†GSÀô ÷ê(¢Š(¢›‘ÍK ¬‘º†WSÀô ÷ê(¦Ç$r©h]C%NFAÁPA…:Š( Š)¯$hÈ®ê­#m@N êp ü :ŠDu‘ã`ÈÃ*Êrõ’IJWTRÁAc’pÔ’ã@¢Š(¢Š(¢›‘ÍK ¬‘º†GSÀô ÷ê(¢šdŒJ±Q#)eLò@ÆHƒ#óê(¦¼‘£"»ª´µ8,pN©À'ð4ê(¢€ (¤GY^6 Œ2¬§ Q@ EÙdŽžYc³;©'° QEFóÃ"IcB ‚€ûÇ ùž©  (¢Š(¤wTv $ã’pæi#’9T´N®¡Š’§# ਠ€E6)#š$–Y#u ®§!èAî(2F%X‹¨‘”²¦y c$A‘ùŠuSe’8byfuŽ4RÎìp¤žÂ€E5$ÙÕY£m®ÉS€p}?ˆ§PEPEPEÏ B“,¨b“iG 6¶î˜=ó‘­IEPEˆë"+ÆÁ‘†U”äê(h¨Eå«:"ÜÂ^FdE ³/ÞÔŒŽØ§á̱‡/°.á’Ûwc»yǧ4%TsÏ ´F[‰cŠ0@,ìdœO© P”SL±‰V#"‰K*g’ z ÌR»ª »’qÉ8ó4´U!¬iMuöQ©Ù›þ_”']û³¸ÎsžÕn)#š$–Y#u ާ!èAî(ÔQEQESb’9¢Iau’7PÊêr„â@ØäŽU-«¨b¤©ÈÈ8#ê#ð§PEPE5äÝU¤m¨ Ác‚p=N?¥GY^6 Œ2¬§ Q@ E6I#‰CJêŠX(,p2Nú’@üiÔQEQEFÓ²ÚhèRT°ÈÜH^=È z‘@QMŽHåRÑ:º†*JœŒƒ‚> ‚? ‘™Z êdU Éž@9Á#ÐàþF€EPE#º Ë°PH'“€?3K@S^HÑ‘]ÕZFÚ€œ8'ÔàøuR;¬hÏ#Efc€© ¢š’FìꎬѶ×ä©À8>‡ÄS¨¢Š(¢›‘Ê¥¢uu T•9}A~$‘»:£«4mµÀ9*p¡Áñê(¢€ (¢€ *4žšHRXÚX±½Éž™³DsÃ+mŠXÜìW°?+gèpp}IEPEG<ðÛBÓ\J‘D¿yÝ‚¨ú“RP\ÃÈRûþºWO\ÃÈRûþºPë"õò¼kÖDÿëäÿxÿ:ê4¯øð_÷ßÿC5r©é_ñà¿ï¿þ†jåQEQEÇü{ËþáþU%Gqÿòÿ¸•G§ÿÈ:Ûþ¹'ò™â_.ƒ -ZêIY‰[iXÔeß¡è1ùÖžŸÿ ëoúäŸÈV^§á¸µ]Y¯/.îb"8¡sÐIÝ–œð1í@/u­6Å`77!~Ð7FYË/\àÇ=zVBøÒÀhI2ì¹{fmAfé`¸\‘ŒœSàðÍÕ´v-m«¹´·kS+[†9i<Î{tªø.k]>KKM_Ë¢Úà›`Þ`°GÍòðÄwü(ZéL Mr°Ì¬ÓFCb0P?-Œt#ÿ×Ri&ÚYþÔUbeGV‰ÕÁoº6¸ç·Õ%ð¬FÏSµšèº_Å dªm)寧<®Jd~UÓî-̶BIÙcÓ£HÀ^ÅG'9<îÈíŠÐ>"ÒE²\}¨•y J¢'.\ •ØìÏJ½gwo}kÕ¤¢XdVûW>|'!Òc³}Aed¥ 4ÕAÚ ¶å¶Ö¶ô›'Ó´È,ä¹’å¢d?3rOõÀöéÿä%aþûÿè²t‹ “[‚ya¸@¨œ’Ê¿5Ê•ÈéÈ$\ØcZù X¾ÿú­å$Ó^MzUÙz¨úªÌÒ+H—ö6 Ð ÙSƒ‘Àãåªó&ª1ój oœ°”Šy]ˆš@7u?pG‚ٯ׳¢€0õkI®ü7kku\ÈÒÚ €cåÀ–=ä¨È“ɚɽƒZ·¾Öé<‚ÖÒE†ì)bÑ´°ü§‘™«Ž œÔñÙQ@sÚÜ˦\y’êéujè¾Lñ¸Û*™ †vü¼ú29é« ØÝEçÍ-åÜhonX[2Fƒ3yMØ ƒ÷»úVåÄYǨãE¦§òZ[­ŠF$©.D€| ïÝ»lb¬êo®Zê7Z%äÐÙ¹š4]ÄN% »=öç†Ú먠 -eg±ð¼1}¢å¥ŽKXžXÜ™_2Æ­ƒÔ’ üê¤PÞ\­´*ú’Y>¤ÛYžD—ÈòüÄüÀyœ ó÷}«¥–(æ@’¢º†V†yR?þúætŸ¶ý®ÃöÚ¾oí?Ìò~éû›¾O¿·;g5—¦ÅªÃ¢Ûŧ®¥¥„kr·ÿ+†ˆÕˆä'™Â‘ü=뺢€1<8—*÷FIîe·;<±<2GƒÎìy®ÎGN¸qÞ³5í!gíu¸¼Äqy€¿ï—ó/Ýù~îàS{W]Efk0Íq6› or‘=јìòdêW7müqXK¯Ÿ§ÉêM5Æžð3»2¾øw ûZ\ƒÇµvP.Éy%½ÒX6¦¶=¢ÄÒ™£24ÿ>ݸëÇÞíSÇoyòÛ½6«©2†i$'É6„ýòrWÌ<ðp:] ÂéÑ_Á¢$;5hïc·‰lP „jÁ0áÿY¿;øÛ¼b¶. ¾7z…½îF¡j wØ"ÌÈ^„}üŸf÷®ŠŠå&‡UŠÜ]ÛKyö·»¼\K#ÖÏö}ÿ÷ïý_ü uIgò]Ú\¼—ŤÔn’Uwr‹ï¶|§€>XðqÜs‚+¢¢€8ëÔ-âÑtÌÜD/,íË‚J˜<¥AþÎá±qêMjøˆNÓZ$bðFCîhPùpGó§ÁÏjÖ Óy°™öy{‹…ÎH8ÀÎ:àzTÔ‚ZöoÛ´wá†8¬Mæ†wü£ ë¼ã$sŠ£3j‡HïÒOìËí ³³y›“Êä€ÛˆÉ\üØÏ|×YEr÷ÐÝÙß¼).¢ú{y 3,’;œùÛö½œ¬D…è3€3TÇÛç;írÉo©Iö´î-û Ûܽ‡_ïsÉ®ºêÖ È|«„Ü †$#¡r¸¢ÒÒ 8ŒVéµK9$–'©$òO¹  /%à¿f{‹×‡ÉýâÏo*3#2;ã?tmçéKsé½½ºI/·G¨Û,(®û<¢!½ ó&O8Á<`×EErzpÇîñî=«¬¢€1´¹îmfš TÌ÷2\mYUÄà©+·¨PG¨çï çëV2M¬Ýã»ÌÉa‡yPä—Çð‚ÓíÉõ® €H$AÈö¥ FòJ©mÖkåÓ’åÀ}³Ìø1DW”a!]Æ^A >–­m/®_L†òâÿÊû5ÃJê^Nøü°ÛXv“Œœœ÷ÒQ@åäW7^Óâ]5Ê›9gT$ÈxË’æÈŽ:‚=E7O³¹¶¸´™~Ø ºØ™ >Á3²½$! Žr9æºZ(‘ƒûI[Ci´Í­°•?x 6xÌà œ}àã ùNsZú¸¼7€[5Ê¡Óî¾hWv$Ì[ß{÷÷­z(#Ãfsc(nF&!s!,»W$ùÀÎx9ç88Åsl5)lob1jL.4»•x¦Y¤>vhË ¹Áqòlñ]Ý™a›­hH²F³]Œ2¤"%ÊŸ¨##¸¬yµ;¸×/{äÛÌ–w"ÛÜF|Šž\ Èç q]ƒÊTçcƒŠŠÖÖ;u‚Ý6ƹ I$œ’Iä’I94 ·%¼Åu²MAІI_ ÂÀn^\0ñ‘œ`ž•aÞùü!©H‹t·Œ—f!¼ÑóIå€:çqlVíÊêVú•­ÔÐÙÍ|lÈå™faŸ8>Ü0n¢,…#ôæ hõQm½Õñ²2Ë—û4þ`MƒjÉæíÏ™É9鑌WcErq­ê¬ ©É«IÙÿpÖé"7™½¾øByÛåãyÇ\óšž{IÁZ\2ÃrfÒGq"…x÷p¿6@ã¨Ç¨®–ŠætŸ¶ý®ÃöÚ¾oí?Ìò~éû›¾O¿·;g5>­öµñ£Cö׈ùCd[Ö1óÌXeOÈqÐ §5¿Erz€ŒŽzv4PƒcuŸ4·—q¡½¹alÉB ÎAå7`‚ÞïéX–qê0èÑDé©Ç|––ëb‘‰jDK‘ (;÷nßÛ®ÞŠäu7×-u‰-òhlÜÍ.â'…]žûóŽÃmhë+=…á‹í-,rZÄòÆäÊù–5l¤Oç[´ÉbŽd *+¨e`g• ƒøá@ÔPÞ\­´*ú’Y>¤ÛYžD—ÈòüÄüÀyœ ó÷}©ÚOÛ~×a¿ûGí_7öŸæy?týÍß'ßÛ³šé¨ M‹U‡E·‹O]J7KÖånþW «ÈO3…#ø{Öÿ‡å^èÉ=̶çg–'†HðyÝ5ÙÈé׎;ÖÝÈêÚBÎ'Ú,ëqyˆâóß/æ_»òýÝÀ¦:ö­½f®&ÓaîR'º"s²žLJòí¿Ž+NŠãÖ ^?O’7Ôšk<=àgve}ðîö´¸j°Éy%½ÒX6¦¶=¢ÄÒ™£24ÿ>ݸëÇÞí]EÏGoyòÛ½6«©2†i$'É6„ýòrWÌ<ðp:XÚtWðh‰ÍZ;Øíâ[a°E øÖoÎþ6ão®êŠçn ¾7z…½îF¡j wØ"ÌÈ^„}üŸf÷ªÓCªÅn.í¥¼û[ÝÞ.%‘Œk'1eOÊ+¸çººGUtdu ¬0AP5¥J?á!µŠ 5?)¬eiñ¤Ápñr÷äôùyã½,ö—“ëŽÍ. °> #"9dTò~ÊŒæ nò3É­«=2ÎÉËÛÄC• ¹œ…Â7ì8«tÍÙÍ{e5¡¹Kùa_¶Ã!8|’ÝOÜS†=^k>[;¹¬£’îÖqi¥´…D›Ë$Îdû¿1`Hê8=q]¥È\Ëp·V°Þ¾¨ÿ´¥±“yÄëåœ/8 F;`ŽÔ—1k>bJâdw´³[É"Øñçï †$1Lí9×ZbŒÌ³S*)U|r ‘øí§ÐW‡Rå,dûLÓʦcåâd`˜aÙ›ÏÞ9çéXK³•`öòj s>œëÍgr®ü¤ü¯µ¥À'£5ÙQ@sÚÜ˦\y’êéujè¾Lñ¸Û*™ †vü¼ú29驯‰Þ$kï,9ÓÃe¾ë1aqŸeØ7v9®ÖŠæ½ÀÄÇíÂûþš}Ÿìûÿïõð-Õ ÅŽ«,0Km5ÂÞ¾§rUî7:C „)à Áï•ê0+­¢€9B÷{¦:Eª*ì‰Z2|„9YùVã®ñȩɭMs—†uX­’WsÑ*(efu`w9#è}Á­z@Œ(gœZëÏw`²+†á[æ~8ÎsН$·Rx†ñ`}A¦PP)sÅåÄdøG<äŒw®ª˜‘GÈñ¢«JÛœ÷ŽÉü…r­öíó}»û_ËÌÿeû.ýÛüùqœqž^Ýÿ&=ªÄqj0ø’æáÖc`÷Š F¬±‚ $$}ä# <žœt´P3«}·íwû?´~Õòÿgyg“÷GßÛò}ýÙßÛ©.`½7··I%öèõe…ßg”D"B¡^dÉç'Œ訠SCMTê6Ïwqwça¾×[Ê#ΙÊcv0PvíÍK«}·íwû?´~Õòÿgyg“÷GßÛò}ýÙßÛ®šŠÉÓ,ü»ímgU¸ºI‘ÆåòcåyãÃ#Ó†9Ë-:í4Ye…5n-ôH%Tc:yÄ®:¶/#q‚+¹¢€9EMUµ¬Éqv’ Ä[yLf Ü|ÛÄX)×Àúš’ÒÂîãRAu6¦°Êצ@'‘Û8cm #ÈÀ®žŠç®-#¥­Ú\µÑk'˜Èàù‘ï'#1>˜Ïj‹HûoÚì7ÿhý«æþÑóüÏ'»åûûq³¶s]5™á¸g‡@²7or÷2B7ڙÕôǧõÍe·ü…/¿ë¥tõÌ7ü…/¿ë¥>²'ÿ_'ûÇùÖ½dOþ¾O÷ó £Jÿÿ}ÿô3W*ž•ÿ þûÿèf®PEPEPQÜǼ¿îåRTwñï/û‡ùPzüƒ­¿ë’!V*¾Ÿÿ ëoúäŸÈUŠ(¢Š(¢Š(¢Š«?ü„¬?ßýÖU¦­¬Íyo‚ÞFs| ~vÕ")‘–Ù‘€HàsO¶¬ÿò°ÿ}ÿôS[é–v×|1“2LŒ@ó3à–P~¹õ4˜šóÉ—p[K*›+[”‡=<ÖqÙIà “Ï×7àÔ^mµ€HêŽÂ($o+žñœãÐyÐ4m=mü…€¬~LP HÀ„Œ’€äI9ëïSGakƒX¬_è쬬ŒÅ·nÉl“É$“’}hþY Q*Y$—23€‘Èò($•Œ°?:ŒË5µ=S[Aqij°§]ÎÉpJ²ý»woÝ»;xëÏ>´¡iŒSýªªªlIQ•xPÊÔ5;««{í*+eŒÇsrc—{`íò¸àÿw?€ò2,¼Iu‘c6§i½î,’hÞ7ÜÒ±1§*åËJ§Œ÷úWEsi Ó@Ó)-‚XÈr¥X3Áç‚F:j¹Ñôö·†¶( 6ñ©bvÆvñ×ý…ç¯h='SšýçŽâÊKg‹i«„psк)ÈÇ!»V{ÕµW³]6ÞöT2€b d-·åùŽpp>^Ù«³kSÇ{q²V¶·»†Õåó°ÄÈ#Á ·œyJ™ü?¥¹‹u»b(R® *¬3†'®sÞ¬¾Ÿhþvè³çN—ódM›O^ÞZqÓ­eéþ!šþhD:l¾EÊ–†R²÷KäÆAÇP[¨¨´í~ñ­´wkûËxdyŒ»U™øÂü¸-ЕÈ뺵m´‹[<0°eÎÀdfXó×j“…ü¨ãдØþϲŰUŒœ€îPA8m¤äg8íŠ5-FæÚöÞÒÎÍ.%š)eùæò„(1÷O]ÿçµ ï‹{H¯!µI`{AvwMµöœ NqÜà{õÅýGG‡QÔ-®.ü¸a–=ˆì„—)Îå ãF;æs¢i×Cl¶çi„@U$tVŒg B8ÏLÐ{fx¤Ô¶ÙÆb±uÌ{€›Ý–6‘ÀÃòsž'¼A<ȉ Œmr׆Óa•3ä™wn)œ`÷úúM¥Ù<ÂÑ1[‡Y$&FÜYB…mÙÈ "òQž´Ø4{yD±Äþ`—ÎÜó;û n䜤ÿP  ¥ñD‰kosq§ìŽîØ\[„”»6Z5 À/™W¦{Ñ6»¨=›˜¬<‰ã¹¶LÉæ,n²Jà¼`ç±ùxÎyéZ§GÓÚÞØ €ÛÆ¥‰ÛÛÇ_öž¼u¦ÃìòÀc•–VGwiäg%H*w“»‚ñ@´Ïɨ\Û…Ó§[kLSl“‚À¶P(Ìy"’MböoÜk1[Go)´kˆPË¿fàOËׯð9ãBÛH±µ¸à \ìFe=v©8_À ”iö£Kh‹ýCäy{ú½»qž½(:=nàíšKÖÔÜ‹V‘gË 7ùg ´ewñœƒß6µ«I¦vÛ,‰ bÒ<žZ&1Ál ÏÀàò*Hô]>9ÖeŠBÊÁÀi—xÜTœÿhŒçœÔ·úež£·í‘3í ¼HË•8Êœp2F]nhõ â6Jm`ºŠÕæó¾mÒ*!1Ó2y÷æªÃâ­ñ}ªM:álš'™fT“!U å²F@ã y"¯Å¡Ûj]_Î ’K:̃{]±¢ ®pH*H$qš’-NŠBënHÃ#2(o¼ Ú¹ö€+ͨßGmºîÌ[±šÝTÅ8pÂIUH9^Ï”÷®¥¶(p#ÀÉ?*囓é׃Z?fÒ>Ðn<‹<¶ó&ÄÝ»×=sïD6ÚD í1— ¢ Ü3œuÎ~”Žºî¦æ+H¢ŽKÇ’Eb Û³b¡ÚQ¤7ïáÏ?K7z…ìÞ ½¾-®ÒÚf8w ‚¬FN3Ôàžø«ÆÏF6¢ÔÛX}œ6á–›õÇLÔû¬~Ïö|Ûù;vyy]»qŒc¦1Ú€1÷S¶½¿‘¦‚X#Ô-íÙ?¼Hìù° ÝŽzŸ­.“­êW·6O5¤iiz¦J+ O_0–<`£ö­tMHü´KEr¶Ð ®6œz«M£Ò’(t¸.^æìãžO¿"*†o©šÅñ¹ªÙjwvúzY­4ß·9X³a˜#²Ö\~$Ô ¹ÕnX^[D‚9 šŠrN~èÏ>§ž:Wa*iÓ<*Ú;É’ìÁIdçå>«Éã§5¶Ò r`±ýâßäO™E> zP7qâ­Jû8þÎk„Ô£²kŒ7’Êñ–Èù² 2jêëWþ ծܤw6ñ\Æ%·b™èzÇÕÛÍ#Fº·´¶Ú{[:ÃEF ‚¸ÆãW•tä´û"-ªÛ)䀡6ž£oL{PLú®§o¨gJlÌÒ´>\Â6 q)!†ì·ú¬FK”K«ê+k"F¶Ïq á¶y +ýÊ›' †$a8­i“N¸ …µ”H¡_xVÜ$ž 3Lkm%íÑ ²ke9”BƒþÒ€)i7—7šÄ®×=³éöÓ"F­Îdäz¾6ôÇ4çÖ¯-l„±y šðÊòn“jÇ1QÆíÁqÕ†Bð6à€7Wì 0™~̲ªyaÆÐÁ3¹ôö¨åƒJ™Qf†Ê@ŽdPʧk’ÃÐ’IÍ7Vºº‚Klü‘%ÝÁˆ´ªX(»çŒŸw¬ËmcR»i ì`–Ú9W•¬›e’?”nGîòI'‡ZÜy-‘àf·!$§dz>„Õy­t‰ÕVx,eÌê°ÌrHÏry'Ö€)è÷×WÚ´“;„¶—N¶`*s9“<ç¯ËÏžœÓ:Þ®ó,PÃç¹HvÇ’« …wH “ÇŒ`ž{ofÇíhÍ¿Ÿ³Ëó>]Ûs¹ëŒö¨æƒJž"x¬ä‡y-ÕJî$’p{’IϹ  ¦Öu ,ìŒkmÌâRé·ÎÈFÛ‘µÂÈÎ_ŒÍU:¥ÍØŽèI$Bx4©|´s…2\6ð>£ƒê5¿,:TÑÅÑYÈÿ«VU!>ƒµ —„Ž+5Q´ª |¬Y&$Bs@ôÝZâóPû$BKq'ÚðÊCíñ¸ÜçPK­ÝÅÍéû!¶†Iãç"f1ès‚NÌíÇCœÕë-í'¼¸’ê '»”;²€£B¨ÆO@?2~•0‹Lmv#´,0fw‘é»­dÝk:…½Ñ¬îtéobhQ•T +eŽAÏc8L“ócp5¯<UÊ:\Åg*»‡q"«`ÉÏS€}$¶úLÂ46R?ÕT>_û¾;Pjº¬ZÍ핾ÉÚK–ò¿v–« ,FE>fzŽŒqÎöÚÎ¥yˆÓìV²Eng”Ê|Å× U°É’rØÜ5©=®‘rd7XÊe È]·0 Ï\”²Ûé3¬K46R,ꃪû¹éøP[Ü^ÿ¤ÏÎÛ‰>ÄIrÛž0sÈ'9çžFG|‰4í^òáôÙ§û1ƒRݲ(Ô‰!Âù‰$61ƒÀÁ"´Ýté-¤‹jÖÁBˆX)LƒoL l0ép\=ÄÙÇ<Ÿ~DU ßR94­\ê1ê—iotªŠ4óa† Ü•9 ô xä;r²ëZª^6›PÍt³:y±Åò•Xâ¸Ò/?½þ÷ð“M©N–a<«jò€v [ƒŸfýFi³Á¥\£¥ÌVr«¸w*°f œõ8gÐP3ªÜ¯„îuW†%¹‚Þi6…“v9Rx;zgŒã5VóYÕ,®ÚÅâ·šâC”Ñ&ùžo3ŒãÊÇÞ\î´M‰¶6ÄÛ l1»JãÇLcµ6dÓ®‚uµ”J¡_xVÜ$ž 3@O¨k7aU6ö÷úHH ²âq¸,‡o#¦IÈزÏÅW—pèºh–ÜrpÏž„¸æ·–-aŠŠÌE ‡‰®ÔaÐØûŠTM£hÒÑ e™ …K}â=3ßÖ€3tí^òáôÙ§û1ƒRݲ(Ô‰!Âù‰$61ƒÀÁ"³]Õ#ƒJÔ&XØÝXI3$A„P©0|î e¶†cÇ<ãÔ×I :\qvqÏ'ß‘C7ÔŽM=Fž‹ µQf$h؇Qè>Qǰô  Ú®§ý—µÌÍ´bVyû¿)*Þ„Œwû³·ª¥•ÝÔ©g°DiíÊ1y Erîù~öÑÁÉ¥ij–—¶pÙ,öÑZ#¡x‚‚P‚s…±ãÓ­O4:\÷ qÕ± –—¡=ùû<—3J$8RÑüŠ˜SÔ /êjh¡ÒḒâ¬ãšO¿"ª†o©êh:këØíñs=”Îf´+örèBÉ2©ÈÜr=pÜ‚1ÁÏ·ÕïôëyšåÒå®gº[rC ̳lHùc€{Œ`õ<ž‚}&Ú8!²‰ÕEEà€síPÜÚZ\]Y¿Ÿl[L×%Q–”îù³ž9f=2O9õn°÷©6–Ó"M%ÙG$Œ<‰IÊ‚22ÆzYƒ_Õef‚ÞÞ4 #LûÆÛ,‘ðEÚ?w’rØÜ?‰ä´vFwš6Ü„Jœ‘èpHüMWš×H¸UYౕQ™Ô:#ÌrHÏrNI  ‹½Pˆc··¥¥´Ï;Û|Îé€Á‚힘×#GG¾¾ž{¨5(£¡ØU†Õ'vx*ñÐrO9ö«Œl\¹clÆD¹;NåŸQÉãÜÔQ[é0Û›xa²ŽÁüµT ¸AÇL‚ϵ^¢¢ûLóÞ/ûìQö˜?ç¼_÷Ø  h¨¾Óü÷‹þû}¦ùïýö(Z*/´Áÿ=âÿ¾Åiƒþ{Åÿ}Š–Š‹í0Ïx¿ï±GÚ`ÿžñßb€%¢¢ûLóÞ/ûìQö˜?ç¼_÷Ø  h¨¾Óü÷‹þû}¦ùïýö(Z*/´Áÿ=âÿ¾Åiƒþ{Åÿ}Š–Š‹í0Ïx¿ï±GÚ`ÿžñßb€%¢¢ûLóÞ/ûìQö˜?ç¼_÷Ø  h¨¾Óü÷‹þû}¦ùïýö(Z*/´Áÿ=âÿ¾Åiƒþ{Åÿ}Š–Š‹í0Ïx¿ï±GÚ`ÿžñßb€%¢¢ûLóÞ/ûìQö˜?ç¼_÷Ø  h¨¾Óü÷‹þû}¦ùïýö(Z*/´Áÿ=âÿ¾Åiƒþ{Åÿ}Š–Š‹í0Ïx¿ï±GÚ`ÿžñßb€%¢¢ûLóÞ/ûìQö˜?ç¼_÷Ø  h¨¾Óü÷‹þû}¦ùïýö(Z*/´Áÿ=âÿ¾Åiƒþ{Åÿ}Š–¹†ÿ¥÷ýt®‹í0Ïx¿ï±\á!µ;Ò È"€$¬‰ÿ×Éþñþu¯Yÿ¯“ýãüè¢Óm-¥³W’Þ'bï–dŸ˜Õ¯°ÙÿϤ÷ìTzWüx/ûïÿ¡š¹@þÃgÿ>ß±GØlÿçÒûö*Å_ì6óéýû}†Ïþ} ÿ¿b¬Q@þÃgÿ>ß±GØlÿçÒûö*Å_ì6óéýû}†Ïþ} ÿ¿b¬Q@þÃgÿ>ß±GØlÿçÒûö*Å_ì6óéýû}†Ïþ} ÿ¿b¬Q@þÃgÿ>ß±GØlÿçÒûö*ÅŸ5¥°¿²AmGvÜ¡ã5{û>Çþ|íÿïÒÿ…WŸþBVï¿þ€jí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆí+ùþ¶ÿ¿«þ4¿Ùö?óçoÿ~—ü(þϱÿŸ;ûô¿áIý¥aÿ?Öß÷õÆ¥†æÞãw‘vÿ÷é¬äzŠ2=EVþϱÿŸ;ûô¿áGö}üùÛÿߥÿ ³‘ê(Èõ[û>Çþ|íÿïÒÿ…Ùö?óçoÿ~—ü*ÎG¨£#ÔPoìûùó·ÿ¿KþgØÿÏ¿ýú_ð«9¢ŒQ@¿³ìçÎßþý/øQýŸcÿ>vÿ÷é¬äzŠ2=EVþϱÿŸ;ûô¿áGö}üùÛÿߥÿ ³‘ê(Èõ[û>Çþ|íÿïÒÿ…Ùö?óçoÿ~—ü*ÎG¨£#ÔPoìûùó·ÿ¿KþgØÿÏ¿ýú_ð«9¢ŒQ@¿³ìçÎßþý/øQýŸcÿ>vÿ÷é¬äzŠ2=EVþϱÿŸ;ûô¿áGö}üùÛÿߥÿ ³‘ê(  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü(þϱÿŸ;ûô¿áVh  ßÙö?óçoÿ~—ü+ŸÚ©©^ª(UW0®¦¹†ÿ¥÷ýt ÖDÿëäÿxÿ:׬‰ÿ×ÉþñþtÔi_ñà¿ï¿þ†jåSÒ¿ãÁßý ÕÊ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š«?ü„¬?ßýÕ &-: ­íí¼"I$–Fˆ1 ¥‰=2x~ù X¾ÿú¬—ÿ’q}ÿ^W?ÉèM±+IR FŽõ‚Û°„ä©aÛŽž}*×öm‡üøÛߥÿ å|‰t½{GÓU ±šðÜÛ0éòdßÓ,}O¥,7³›ÈÓg:»jF9m<ÖÚ°o#ý_@¾^6:÷ §û6Ãþ|m¿ïÒÿ…Ù¶óãmÿ~—ü+‰·¸Õ Ñôë‹;ÛË›ËÍ"yH’C&]|½¥Tñ‘¸ûžù­Ï LeºœÇ©Ás‰O’·o;£ää’ü®A/·A@ßeÒÍɶ–¦`›ÊˆG œxã<ýp}*OìÛùñ¶ÿ¿KþÍêoqZéIä‚åµ EI#8aTcÛ;ǧZ†iæ´¾¹²šúé4صIçyÛthÖáÀ2g*¥Èç#í@Wöm‡üøÛߥÿ ?³l?çÆÛþý/øV†î$’Æí̲ÏmË­¬ŒK´‘0rynw{€+˜]nà™¦Òç“uÆ›4‘Â÷O; ”© ¸RÄ¢úPoý›aÿ>6ß÷éÂìÛùñ¶ÿ¿KþÆOª"\]+Q»–ÄAjf˜Ï$›¥a#©bpvõ#¦qOKµß›{-FûìRjÑÄ®.d$¡¶f 3v–ëèGc@‡öm‡üøÛߥÿ ?³l?çÆÛþý/øW%§Ýj ©b]B(•ZÖk§Ý"|ÁTD~\ci :ã“ɨ,µ”_±\ »û™Æ›<·ñ,ÎzeB“µXÜ1‘í@›iúrŒµ¨¦%ÿ dVšd­*¥Œ‰ö6mÀçñ‘ÈÁŽ+ˆººŽæ×Q¯í”Ù\ÆúI@v$a!Á g²œ iËy*Ë:K{:i£Uò¦˜NÀÇÙШߜª—ÆNG^¼ÐQý›aÿ>6ß÷é£K]-ç’´µ2ÄuòF@=Nœ}¥rö-s¨jÖÖ‡P½û5ß’é;4Käí;úœ30 œàuäæß‡®'»¸Ð®F’WÒY®\õl´{ ÷ÈÖ€:ìÛùñ¶ÿ¿KþfØÏ·ýú_ð«TP_ìÛùñ¶ÿ¿KþfØÏ·ýú_ð«TP_ìÛùñ¶ÿ¿Kþ Ö6HÃVÜÿÓ%­ ©}L†)Q^7R¬¬2È#¸  ¿d³ÿŸ_ûô)Ú‰t””GfBÌDh}â:`+ Bð~—¢jWÖêÏ#±òDœù G!}O^O8ãÔ¿ ÿÈ øþ„hÃ3n?1ëëTnõ{[9ÄK+K·~È¢yX/L àpzÕ×ûíõ®{Xk853:kK¦_•[ÌÚRU•Èn¸ÉèAæ€7`¸[ˆRhŠ8È$#ȧù‡vÝÿ63Œó\uÎ¥s™5ó¥¼ÑHds;Û¡0 K@+–ú÷ÅYÑ“"I.o>Ñ;é±m‘%m“Μ6žœžôÐ_jVÚtI-íÇ”’H±©99cÐqVw7÷ç\νmq¬êOcoEmnÂO6cY$0­’ª§ÞY5o=tÁª\M Ro*FB÷(Ê»r¸9ûÄþô×îoïÎÍýãùןiËýˆÇP¾»ŽA¥,–{fuid!÷1*rÄazôÕÛ©oöêw1]\Ÿ*kxÊù­¶8Ú8ŒŒúžpHäŽs@¦æþñüèÜßÞ?q‚õ¢Ž7VôÙ.ñ,°]´žJùg e?0ÀïÆqšŽ=EÁ`yî¿y=ב,—’Äp¯…\òÌØ# } vsÝ,<’;b5ÜÁAfÇÐrjMÍýãùןÉt^ÎãQr‹¹4(Ý]geÌ‹¼>8È8ÈìO©­Vòd¸ÔówlH=*ÜÚÍøi¬Öí²ò]ÌÇš#-»v2FH郓Ҁ:+˜:Þ®ó,PÃç¹HvÇ’« …wH “ÇŒ`ž{Kk¬j7˜EVÒEng”Ê|Å× U°É’rØÜ4ÑQ\lj5Ò`¾‰m‹ 6;Ùã;°'Ü/–=xã—ɪê°ëW¶Vû'i.[ÊýØ>Z¬0±\4Š|Ìõ㜦ŠÈMVqá‰õIáEšerˆá””ÝÜ9ÛÓ'ÅC íìS½¸¸µò¬¤† MÆíó KÎÞÀ9 Ž(vŠÁÓµ{ˇÓfŸìÆ KvÈ£R$‡[æ$ØÆŠ¡½¬¾—5ë}€tص¢'ùƒ«Ÿƒû³ó{Ž(­¢¹³©^Ûk†%†KeÔ`ƒÉ}Æ@$Ž!•9À±lcŸ›¥>ßPÔ'žKCoJ÷ÌÏ2¼˜ò§¸çwLàvÀ †Šä“ÄÚÍ©ºµ²‹ËŠd‘\  ^5|nihù°ÖäÞµ™Æ±}hÌÌŠ‘N™9Û¿r•úf<ÿÀ¨ýÄ]jWÚ~ƒ«Íqu3Ar׫o1sºÞUyTÊB¾„c¸­EÖõ)/ó¤c†Ôî(§‡Ú[q“9îg#ó ŽŠãê—·–p¼Æà—Ô2«w-¢á'U\”ÜN9vÛ&ã]ÞXjâÆ& óCmùÓ<ñÄÌn›,Alì±?-tôW5sâ Ë8%iRÞF†y-K¢²Iå‡'Ÿ”Œž{ÕÝU¹Õ ÞrD¢ÝV)vþ¼gÌ' ùqߚآ¹ë}CPžxm- ¼m+ß3<ÊòcÊœ"ànÝ3Ûb¨Ã«êê–“¤± ¾³µòãpæ8ZQ+’@`þï¡åFG9ëè®|êÚ‹­bû!¹7ífÒ”c“p]ÙÈÀÏPFi–úž±w~-á{ÖV»ØZb¢„|üã$î˜Áë@Ê]ø’ù4Èo­Òß9/eˆÆÎ~`N7dÌxaFòãÈf霞FI:P¥ÍI{}wycnÓÆ†PÁ3BV`°´ƒlØ‚O#œ€A¹«Kwg¨Z½¥Ä`ßÊ–Ûg£jJû€|Ç{à~4W7m­jÛ£…¬ x!i%yU™$Û#§Ë†_Ýç'8 )‡Tši¾Ò¢M˜âv ³¸n„sŒë€GÓÑ\ÄšÅìšÅôg²m>k˜¡Bé*m\àÙ8Î H==¤]oR’ÿ1ÚGö1xmNâŠx}¥·3žávr?:èè¬ï/5+»í2i’ØIËÂõ Û7‡ A###å*xç­mOw04Nθ&9`öe ÀдW!sA¢Ksouvnµ>Άk¹]v À€Xñ´{‘ŸSV¥ÖµT¼m68¡šéftóc‹å*±Äÿq¤^{ýïá'€-‹ý¯r¾„·Äxó &O,1*Oî#ðÏËô ªŠæ>Û©ÞM¦Ç;%³.¤b”!ÿZ« 8ÈIÞF ’zxàľ$ÔÚâg[iû:{ØbuS³n-–S¸s…éùu”V¯¨Kö‰m¡*Ã-ƒnBC~òãksЪŽ= õ¨£»¼Â:µÕÄË4Л҅C&<€ †Èû¼`‚;ŒÐEEciÝ}‰ü…¶gòÓå,Î|½çæ Ý~RçµV¾Ô5 o½¬3Cåϼq‰P•‰˜ÌK0Î|¼cŒ’½1ÈEEPÒo&º[¨î|¦–Ös <@„•[ q÷°FO ÖÕõK½8ækk{‘=™ÂFÇ $Áz†Ã©þð<ŒŒ´ÖQX:v¯ypúlÓý˜Á©nÙjDá |Ä’Áà`‘T-õýjâÚܤÆYl£½b‘ª®8_šUé‚IçÈ[Ef\ê3GáøïÕaŠy2É‘Uœ¨ÇÉ÷¹l u8äu¬ëmNòêòÎ+ƒ±âÔÚÞMŠc/Ù^A•ÜÝÈã'•ŽÀ%ÌI-ÌþÒÙo'ŠâálU®Îü»Æç¹9=zÕ{­~îÖþ8æRo-­¥I¡ „v2À©. nžO0ÈÁ ¾Šåî5eí¥ŠO*Úx®­“jå–IBQdb?È$qÖ—D·¼¹¼šêe‘â[ë€$:œà€²¸ÉÆÌ Œã•tôW!§kš€ðò݉ d°´¦Yƒ4·¢G$6î ÝrA«Þ&ŸOÔ$†â(¼›Y_í.c!|¢9êKàÿºh§¢²no¯ Ó´àëoíã¤ŅˉŠªIéæŽÿÃW5û©mtYç¶“c)U2Ÿ-K€ÏÿROá@TW;}öi±—MÔ.{‰Ò0“\<ë2±ù›i?Â2ß.:Vm–§«Å¦µ÷Úb›ÈÑ-®äYQŽóûÖ8ù¸bÜäÇ`ÚQ\âëz”—ùŽÒ?±‹ÃjwSÃí-¸Éœ÷ ³‘ùÕ«}RìiZ–¥r‘3‚¿1lžqÐŒœÍs«jÜǧÄ-nnÝß÷§ Pà£H¸oŸ¦óÀÏТ¢¹«{PMµº1ÚŹ&yØŸ4(F8FÈSÔ‘»oƒ]-Ì7ü…/¿ë¥tõÌ7ü…/¿ë¥>²'ÿ_'ûÇùÖ½dOþ¾O÷ó £Jÿÿ}ÿô3W*ž•ÿ þûÿèf®PEPEPEPEPEPEPEPYÿä%aþûÿè¬ý‚Ìcq)œ~ìq!êÿïryëÍVŸþBVï¿þ€iñjö2Þý‘%s.öŒ„. ’¡ñ´àÇÒ€´-à>›fЫ˜¨cÔã}ê ´>ãV…Ä +, Å"+"…bÀ€GšHüE¥ÍÍ ÓI®àRÚVùq÷°îóצAA«ðÝC;……˃Ê)ÚÊÙÁ ÐôéŸOQ@Õ¥­ìb;Ëhn#!e@à\dúu…ÉSqem)EØ¥âVÚ¾ƒ#¥Y¢€![KUB‹mRÊåB \m?Qµp{m”\ÙÚÝìûU´3ì9O1m>£=*j( ÿÃV×lÈ¢Ú;wË)öU-÷·2 Ï­>m'Ô¾Õ,²ùË6~ξnT†Uó?ºÏÍmQ@æÓ짃ȞÎÞHw—òÞ%+¸’IÁI$çÜÕ-GE[¶„Äm£XSb$¶«*ÇèÈ8ÚÃòö­Z(„z6œ¶¶ÖòYÁ2ÛB!¦]‚ŒdŠ’M+M•YeÓí>ÝÁ¡S»hÂçŽÃéVè ÚÞµ6ÞRˆ lòÀÀÛŒc˜ªðé¶«öy'†îmÐ"\<`¿ýE\¢€+ÃcgÃÜAisÉ÷äHÀfú‘É¥V‚&ˆZÀ#h„,‚1ƒÎ:rjz(¹°²7k6vÿiÎ|ï-wçûØÏ@ÐSÒÚÜꀣõ?Rjz(³µ’Ùí¤¶… ’ñ2¬IÉ$t9$Ÿ­7ì_lûgÙ-þÓÓÎòÆÿO½ŒÕŠ(ìía”Í´)!,ÅÖ0 -Ç>ûF}p=)f³µ¸ ‹he(WÞ·I稟ÌÔÔP eh¶én¶°c`ÉŒmRA  óRE PïòbH÷±vÚ ncÔŸSïO¢€"Kh#pñÁ²ïÃ*F㹿2>§š´û„ÂÖvæ"‹Cí(¹Ú¸ÇA“Û5fІ+;XcŠ8­¡D„î‰UpFTvà‘Ç©¥KkxÜxâŽkY"W…HO #Â¥{kwrïLÇfI@IÚw/äI#ÐÔ´PeÓ¬ÎVÊØ€DÄD¿½¨n9üi~Áeö϶}’ßí=<ï,oôûØÍX¢€!ŠÎÖ‰.!¶†9¥ÿY"Æ?Ôõ4ø¢Š+ if.B¨brOÔ“š}Ù­ü¿/È‹fÿ3nÁû·nÇ®îsëÍ2{ +”t¹³·•]ø’%`Ì9œ3è*Å‘ÙþÏåGäíÙåívúc¦*Ò´Øàx#Óí…B°Ç<“ùÕº(¬íaŽ(ᶆ4„–‰UpF@ìpHãÔÔQéztN^+ Tcœ²Â œõíß½[¢€*æØ@› ±¶ Sµ"P2§rô#ÐÔ‚ÎÔE4BÚåŒÉ°bBÜþ{榢€!û¯Úþ×öh~Ó¾w–7ãÓw\Sg°³¹v{›H&fO-Œ‘†%s§=³Î*ÅCm Ãm pÄ¿u#Pª>€T+¦ië °­…¨ŠcºD®×=rF95jН œq¤Ï'ß‘#›êG&›.™§Ï1Mck$p"G…HŒÊ1ÇNÕjŠdÐÅ<- ñ$‘0Ã#¨*G¸5 :}»‚ÊÞ"­¸‰WsÀë‚GК³ED-­ÄÀ ‹ÉnÈö «´‚¸ôÀ¤’ÖÚYL²ÛÄòÌEÙ%%séíSQ@SLÓÒÑ­ÆÕmœå¡¨F>¥qŽÂ§Ž(áR±Fˆ¥‹£’rOÔ’OãO¢€*3O/ › Rð(X[É\Æ@¼pµ>[;IŒ†kXd2…Y Fð§ \ÅOEGq7P´70Ç4M÷’E §ê Cý™§ýœÛ}‚×È,Çä®Ò@cÀð«TPUÓlnÛeÚX®"Q‚à Ž;Ž­-¶ŸehÛ­,íàm»sJ§qÀéVh  É´K[‰ÏHVä܈])f‚PwúÕ™tÍ>xâŽkY#‡ˆÕáRèãð«TPOmo'™æAy©åɹÞœü§Ô|ÇsëLûŸÛ>ÙöH>ÓÓÎòÆÿO½Ö¬Q@ kuÙ¶†Çi>WlîaèNæÉï“ëDvÐEåyPDžJyqí@6'(ô*ñì=*Z(#moÝg{¬”3®0ÇÔ«ƒì=)ØÙÁp÷ZAò}ù0¾¤rjÅ^æÂÊíÃÝYÛÎê †’%bê9)ŸÙzwž'û¯š»@“É]Ãn1Î;`cè*ÝZ=:Â+“s•²N[q•bPÄàŒçÎ üÍ$ºfŸä’M>Š«m¦iör´¶–6°Hßyâ…TŸ©–=>Æ(^ìíÒ)ËtX”+.IÚF93qþÑõ«4P°Y}³íŸd·ûOO;Ëý>ö3RÇq!HãDRK£’I'êI$ýiôPhtë#hಶ‰ÕH•A`AuŸjYôû+”t¹³·™]ø’%`Ì9œ3è*Å ´µdTkhJ¬f%e~‡aQ+M6¢Ðéö†Ü6á’»õÆ1š·EW–ÂÊhâŽk;ybW‰HO÷F8ü*ÅP\ÃÈRûþºWO\ÃÈRûþºPë"õò¼kÖDÿëäÿxÿ:ê4¯øð_÷ßÿC5r©é_ñà¿ï¿þ†jåQEQEQEQEQEQEQEUŸþBVï¿þ€j¢è3 Væ½G0ܼ˾_ ¬»7nÆ~0AœÕ¹ÿä%aþûÿè´hœ>Q¢¤¶²Iog£5͘”€á”O'¹=+nÖÝ­V8QÓìñB‘¢ÂFFr8Æ1Àü¬Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s ÿ!Kïúé]=s ÿ!Kïúé@¬‰ÿ×Éþñþu¯Yÿ¯“ýãüè¨Ò¿ãÁßý Õʧ¥Ç‚ÿ¾ÿú«”QEQEQEQEQEQEQEVù X¾ÿú­ΟþBVï¿þ€kF€ (¢€ +ç[TÖˆn.®î§‡P†WBc™³ Ürˆrp£$`b¾€°{—Óížú5Žé¢S2/E| ÀrxÎ{šžŠàäñž¢—÷Q#é²4ƒZ¥’Ç'Ÿ"Û¸Ägôìk¡·ñ=ÅäP,7KÓ4Ý4`E$‹œ¨9ÏcÔ`â€6è®TøÇíÚmΟ¦]´·Ké•S †û¿7'åúpyéZ^&Õ.tˆs_ÝL°ÛÇ&v’y$àƒ€  Š+Û¾‹¦Þ˜fš{ñµ-à]Î\¼ ‘ÀÁÎOjd^/±œªAg,ÅäS Â7 B1àdý}¨¡¢¹ëoi÷/n±Û^â{at[Ëcs),AãOéQÙxãD¼K‡IÛÀní§rŒ¬prGž”ÒÑ\ññu²¼±É¦jqÍI)‰ гmÅõ$Ü犊_¬¶ÚuÆg,Éu}öIm2ÈûØ'Ž0HÀ<ô šŠæ ñ\~uÅ»[\]\Çs:,V°Â8ÛŽ[ñœŒúSçñ–«Ãm{s³¥áŒ±d‚NHÁNEtTU õX£Ko" îžé ‘G]Å·Ì@æ^ýÅW“Äè¯'ÙnÚUZâ_,(ƒr†ÃCd f€5謙õè¡¿{5²¼•ÖahÕ6´†1&Ñ–Âs“Áö¨Ä n->Ïcq,sEp^%UóQâtB9m¸¶y9ãà´V;ëöèeó&ƒÉ¶–13yÎȸ$óÈ`cÔç“øšÎÝJÜC4WVŒÁ#ÄŒUbw Œ:Ÿ½Þ€6è¬câ[&·´šçœ]‡(±…ÏÈ@n¬2A=$öÍ_Ô/EŒSÓn`¡b#Ü’@ޤеEs·ž#o±5ÝŒhSì—J2D².Ó‚2[8<à`Ö¦¡}-¥æ ví*ÝÜ òÙ³ÉÝüï€@/QX©â(¤Óíï“O½1\ Ñî¯Ë€w\9ÀÉÉÁÀÇ5J÷Ä—†BÚm§™nðZɲ)ÉžM ]xÀÂòG®è€fS»,9ܬ02~SPê^$Ž K‰,mfºhìE꺅„!Ê’IøŸ×´U+ÍElãµ/kpòÝIå¤H°mŒØ<㢞sÚmž­äF‘Ì2LÛ\Äꎧó¹»dpy  ôV#ø–ÕV[KÉX`›(ªv‰˜ªóu,1ÆzÑ>¼êÖë ǘoM¬Ð0_0%¤!¶ÿtç8Á4·EaMâ½:Œ‘!wRÍxÑ£Ã9ÞÀX`g¥\¶Ö-îï"·µŠiD¶ésç*€‹îÚNNyÚxÇqï€ *ž£¨&ž-÷A4ïq/•B%¶³w …<Öl>.Òe›o›¶2®é)t`ÁT±8V,>POÌJÞ¢²âÖÑ®<‰l/¡Û½Â‡E%ÑJƒ€¬N~aÇ_§…|Ij`¸w¶¹G€Â/‘Ÿ÷¯±1µˆëž3ž:PÕ‡7ˆ¤fÞÂä+]EnÒȪQXȪêpÙÈË à®GSQÂUmnŒ·`ijˆè˜D™ãSó°É;;gœñ@ ”5ëI.­`·Ži¾ÓL®€`#’ˆ$8çã©ÅKc«C}y=¼0Ì Èd`»K+m#ƒsÓ dr2(BŠÌþÛƒí>ÏqäyÿgûNÕòüÍÛvõÝ÷¾\ãïLÓõi$Ò¯u èL1ÛÍ8 ª ÙìÇ'å>œöî@5¨¬˜õØåŽ/*Æí昶ÈWË,Ê Á·lÛó/;ºœu«š­½Ü¶ñIJž9d—|¶TeoB±ø½EbŸÚ-µÛ,–Ñ\eQ~Q)!ó÷‹ `g’;d…¹ñµ¢/Úí® ™Ý•a”Æ„àHbáù‡FÐ͵g.Ž5HË´ v€£,[vÍ£»Ž¸÷¨ä×a† ÞâÒê)`h• *¥Ï˜ÛP¬Aç¡ìhVŠ£s©‹³'Øîd¹¸RËn›7¨Ý’X(Æ@ëÔñšÊOZÇn­t„LÍ)òƒ$eQetRC°çåè2rÑÑYC^´’êÖ xæ›í1$Êè9!X‚A#Žp:œUX|DD2Ïyo$) w’2V,°H †ààãÎy €oÑYƒZM·;¬oKtI E»«’Œ1Tõ#ç]<@'žÍ-­%>mᵘ3!1‘“¨b<Æ{àPÝ…oâH^Â;–‚âX–ä¹#UHw ~Abz0$ Ø­Y—[†;ÙmÍ­ÉXn#·’`«±]•þ,œïQÀâ€5(ªZ–¤ºpŒµ´óoÏ1í@õf`ç“Y·ž&Œiw7zu­ÅÀŠØMæì²oPÀ°n…IÀ8µoÑX·zéV ki;§Úã¶7 £ËÜdãïnã,3ŒdS&ñM”%ƒÃ:þöH“{GÆÅ_ig×F;àvŠÆ>%²k{I ŽyÅØr‹\ü„êÃ$ÑrOlÕ”Õ¡“W“NHfgˆ€ò»T•Ü3Îì`õÆ3Æs@Vv¿}6¤½Í¾ß0K Ñ´€‘PªAc†< ©k¬N»Re–òyIò¢†Åí[ ĉŸ‘ó/9qÍnQY‘ëpK-œpÛÜÈ÷bBP<½ŒªûòF0[ß¡ÆxÌ—‰ôÝ6îK{†9‡sAåägî– x ü ÐÕ@j°Oû8E7ÚÉ]£1Ÿ39û¹ù}sÚªÚ…¹3[]Bmí¤¹*á72&7|¡²#†Ç_­mQXëâ̬a{IÒÞGuLFï·h8ló½zgç%¶¹ÍâÛ‹{˜Õæ–åu]Žñ–  ?ÂÇ‘Ûð  J+™ƒÆV)ak-éV¶Š[‚Žb.¾ë6â0sÀò÷ÈTVeÞ¬†îõ[EËCo,Š’®0èU‡³)žÔÏíøC4Ogv—;‘RÝ•wɸ1R>lcýHÆÓœPµŽÚák‹(¡³›t×mm:>ÐБ??621žø4-mµ+{!qk,ÜÚ €Å@Gáwmù‰qÁï@4V{_\/ˆ!°h[Éo$«&ì³hÆ1Ø|ÿµeiþ"–âêÒ9d´y.˯Ù#KlÁY¶¹$Œü¤t^zdPKEciš…ôÚ‘´¼6²™/ÙÔÿ£¾GîØä‚H$çºxäU–¾¸_C`Ð ·’ÞIVMÙf*ÑŒc°ùÿjТ°,5ÉnõƒaX ÓB¨bubc$ü¬IRvŽ@æ›áývçS¼X§X¶½¹˜„‰“Ë;€Ú‰O̼qî(¡¢³Úúá|A ƒ@‚ÞKy%Y7e˜«F1ŽÃçü}¨Ö/®,!·’Þ‘^â(¤fll"¦@î~jТ¡¼¹–¯9ŠYvcä‰w1çõøšž"·’$hí®^V¹6¾JlfyfN¡¶ãh럯|lQY âe[Ù^M VicE]Ð…vC»-ƒó# )$àâ®iW/{¤Y]ÊI< #è ('Üк(¢€ (¢€ (¢€ æþB—ßõÒºzæþB—ßõÒ€Yÿ¯“ýãüë^²'ÿ_'ûÇùÐQ¥Ç‚ÿ¾ÿú«•OJÿÿ}ÿô3W(¢±gñ&§ua—¨ÝIhPJÐ"”0êàô>•<ö$SI5ÂZ¤7/lMênt88ç‘@tUWÔlS~ûÛeØT6eQ·wÝÏtÜr§¸ãÓëÍkQ@‡C³U ˆŠ–Ȫ¤aV.ƒ§©Áöô¢]»’{™$2y±•ÈÊ"”ŒžAäV•{¡C{e¤×W~Z++üጡ¹;·Ï‚;Vu-:-F8–I$ŒÃ •œ6èÀƒÁ=EOoqÌfHr‡xÉÁ2±VúE>)X’T Ô0 ¥N¨<ƒìh#þ»Ck%»\\²É Ì$–\…ƒ?ðõÈÈúž¼cBîÍ.¤µ‘¤’6µ›ÎB˜äíe äb=}êÍG,ñC$1ÈØißdcæm¥±ù)?…gÛìú|1Ï:gÃäÄãa%p£œ©ùG ×i ðý¬0Gšá–8í£RÅs¶ §Aêp}‡¯5¨$S+DnU NÓŒô= àñÛQM’x¢’$‘´ϲ1ýæÚ[’“øPaÐ íÝÜ )4Äê ŠÒ4›IÇ.Ø#Ö­êr_ lÏ<m/›ÄFCmeþ AcW(  ½ ]ô»Hc• ¶œÏ4ìã-ÕŠžä³Oàý*Í&žaàû=É•¤BåH£XpGLÖ•5$WgP1¶Ó• gðOQÏQî:ƒ@K C¯Ùo.íßaI$—t ³1Ý•<îf9?1©[C³6÷0/˜‘\Y¥‘U<,j q×^‚´ª%¸‰®¤µWÌÑ¢È˃±`zuFü¨9,–V²ye‘ÞÎO1XàmŒ™l trxÇ?•T:$!£xn®axÚs¹rD¯½ÔåOÆ1‚1Öµ À$öªÖ…®£ –Î_1Ü¥~ò+Ž£û®§ñ  qè‘ÅbIñv±Œ°é—NÝI<ûtÅ:çD†yše¹¹†St.ƒÆW*â/+Œ‚1·±ïíÅiÔsϼaæpŠ]Pýæ`ª?@  ÕÐ!…Wì·—vòl)$‘²î”f%²¤gs1ÈÁùXm8!¹–ÚicžkT·W-»fÍû[rr瓞ƒñ³ms ÔFXrt'|ÊÅXsèA-WšÍ'’ÎI]ËÚIæ©›c'>Øsøâ¨ 8í^Ýn.%·øË#q‚¼còÅkQ@©á«XíE¬w7klÑ$SDvÎB ß.rU@;HÎ*äšT}£sÉþ‘uÓ`Ž?/qÓ÷KŸ©ü/Q@u .+ë‹yÚib’ÁJm<63÷þèä`^j€ð½²X½”W×ÑÛÉ Ã*+'ï¨@OËÁ ãg5»Ee>… K‘wvý \ýYvyÃçîç†HÎ94ã¢Â«‚ææ c’ihÊ–k—uÁRÉGaZtPUî… í”v“]]ùh¬¯ó†2†äîÜ’ÝK4wwP Ê´ÑÂà,„2N7€ÊG´h  I€jÚ>lßiÜrû‡)Œy}>îyÇ\óš ¾³[v€]]yfÚ[P¿»Ž@輟”œž9ÍoQ@dÒ “íž_ô‹¨®›pñùxŽŸº\ýOáSLÑ ¼ÿhº¸•Ù.®'ŠÀƆG|0ã9ÚØëŽMlÑ@öþ‚Ö†Ööö„q¤ˆŽ£ÍØ¡A'nAÚ ¤t­(c•&䘺HÀƇ ÚPO~µ5gá>Îk9b3´i0Ì0wñƒÇ!FôÅX²ÒÉâòîîšAXmÙÆÈÇLp âqZ4P^•¢A¦J\ÜÏä@-áó™O–œd ×jõÏARdCý¢o|Ù·} \ìÊíå½3‚§×¨ùТ€2cÐ-ã¾K¤¹¸.åSäÆö 'nH!Û©ã¶)bÐ-"†(–IÊŬC,3‹w.º’yý1Z´P~Ÿ¤Ç`éå]\¼Q!Ž]†È—#€ôn$Ò£—C‰ï徊òê ‰vèÊ|¹UV2žDÎsÊŒbµ(  'I·:,ÚVé3G$nû¾s¿;›>¤±=:š¯ýƒ f•îîÞçr2\3.øö† ËŒaߨ9ÜsšÖ¢€3SE…<—ûEÁš;Ÿµ4¤®éaC»ŒciÆŒT–šTaòÞCöSkâ9C³“Ç_ÝNõzŠí#}BÒ[̆)"P9BsïòÖ©Ç£"Ì${ÛÉ|°â#ƒäî%N2NbqZtPVŸ£6ŸlÖÐê—–cEd„l'øÁXÁ-õÏ^A«­g_AxÌæXbx—‘‚¡$ñ×ä­X¢€3£Ñ ŽùnDÓ²$¯4p<´‘Á ÃŒäîn¤˜Ôvš6c÷7WYH ½¹%OÙÐã„ùÙ_½Ÿº+VŠ®ÖqµôŒÎe†'‰y!ÊO~AúÓ'°[›o"yæqç¬á‰\‚² ztëŽùæ­Ñ@µ(µ'µ™QÊœ®2 °aÔy‚5RÛC‚ÞáfûEÄŽ·iùö¿Ê1t 8ÚzzïZ”PHÐaIK{»»wrþcFËûÀò4›NTàí‚0FzÖ…•²YXÛÚDXÇk–êBŒ ûñSQ@Q@Q@Q@sÛ}§ZÔÁžh„l˜íç;ºåO¥tõÎÛ,o«k (VG1«+ ‚þ *YA&Íš•Ãy‹½0ñËÇ#äär9÷Æ_^\Ç}qÌJ¤¬ °\àüWS¤xsLÒo¦»€ïv?ºsä©úó×z“Çê_òºÿ®Ïÿ¡ô„‚$]¨®«è%p?/–ŸôÓþÿ?ÿUõk§²Ò/nâ d··’U 8%T‘Ÿn*‹\jVÚl—×—ö Àdȳl8ÎOï z@¦Ðô‹‹“u>›o-Á ™\rGNIÏaN:>–\¹°„±,Kä–ûǯ~þµºÞ› ãZIq‰’E×Ëb˜¹8ÀÎá‚xíPÝkQ­ý­¡ó ·F XÄÛWä€ÿwp*2{ñ@‹¤”Øtè aFÒ0¿w¿lœzf£†{ˆmÚ!!20íÜ[’HßÔÕø&Kˆh÷lpw)Spyr×_ë‡ýsOýTT—*¹Ó… «ÍÅ»hjÀ4‹s›{(â;<¿’U_—9ÛÃôÉ'õµÐ@i–à1½xSÕ~ÿCéY4V^Ùö;ÿ³!üƹ·Ð™dVÓ`"E àºüÀ€~~@ ~T­ˆÊÊÚt%]B°2/Ì@~~‚±è£Û>Áý™æ6d‡E™ÝåÓáwvÌÒ),á??$Rš<,XÇ¦í¬’¨+»ï`‡ïßÖ±h£Û>Áý™æ6LZ)Š8NŸ Ž5dD2.[ï7ðqÞ‘ Ñ$FÓ¡+*ªº™•çäÞ•EÙöìÈ1½é¶Ìíol"2\Ç8]Äzáù©¾Ýmé'þöuÍÑG¶}ƒû2ÌtFòв±G,¿tý§‘ôùéßÚÿô×ÿ¿û:æè£Û>Áý™æ:Oí úkÿ_ýÚÿô×ÿ¿û:æè£Û>Áý™æ:Oí úkÿ_ýÚÿô×ÿ¿û:æè£Û>Áý™æ7šM5¼íÖÀùë²\Î?x¼ðß?#“Áõ4é'°”ƒ,%ÈR™k€~S‚GßéÀü…sôQíŸ`þ̇óE±·ši%Ž9FU þsÊ `d1ÈwæjTµ·ŽW™#+$€q#‚Àg9ç©üÍRÑÔúæ?ô7¤ºy®®Úó|¤`›b`¬îFìd‘€:rs]÷‘åU$Ü{2ïØ­~Íöo#÷<¿+{mÛÓn3Œ{S’Ú‘¤DevY„® 8ç¶OçXó}£LKåÏcsG,¢@Ê:‘óëéVõFæÞþÒÊÎÖ)¤¹I2Îc o¢¶s»ô¦ÕŒÓ.%­¼r¼ÉY$;‰8ÉÏ=Oæh’ÒÚU•eˆºÌ»d #ãÐóÈæ«¥ì±¸]Am-ñÊûnwm G<ªñƒÉíÇ­L—öR,ÍÝ»?Ö•/ýîxüi t–¶ò°ic.ÁJ‚Ò9 £¯Cš‰´ËˆÄöˆÑ˜Ö2…˜‹÷Wè2p;Tzn©£=ê[˜Þ+iV5•$ $Ê+gBØü*„>%Ž[maþÎVm3Í>Qõª…€`qЕ#¾(Z+8cŠ8­Äi Ý«°pF@Ï8õ43œÛƒãï·G9q×¹ŸSI-õ¥¿”.n`¥û‹$K}3ÖŸö»o›ý"/–A|ã‡8Ÿ~Gô®cd³µ[pÀ"fLœt>çó4E¦ØCp×Ú$s¾wHŒÁ›'''9äóI§êVz’HÖW (‰Ìo´ƒ‚ —zÔ÷¬òLÿv5,~€f€!µÓ¬lË›KU€É˘™—wךQ§Ù ³v-”\°Á›so#ÓvsT ¬óå¦óåŸn÷Hå(±AŒdýzàÔše˃lòP§™·\‚¯QϽS‹JâL±•§A±Ãei8Ī…€´ç¯zjhú\r$‘ØB’FK#.ASêx5VÏRÔod™­ì-|ˆ®$€³Ý°c±Š“´FGn™«k©Ú¥¸–îæÒ —ÇïÔ®¶““ŽœgМTŒ|Zm„-s ¢G;çtˆÌää䃞O4ÇÒ4É<¿2Æ&ò•V=Ù;ýÐ9à œzf£Õ5‹M7M–í爅¥‰ ¡|ì €§¾xéž´º¦¢Ö:OÛR+“¬eö‚]•zàôÝé@:ÄÞ}°Ú¡¹òÛsoÿ¾³šHô½:+“sœip[q•K'g9ÎpOçTÓVž Am5[h-ƒÂó,±Üo@·«Ž ç¥\mONP…¯íG˜ÅS3/ÌAÁžNhIl­&.fƒÌÞ6÷c¸)ÊçžpI#К…t1%[Uarñ‘±½G<qSýªßc?ŸÄ-›x¶q´ûäŠu+híÅåŬ]1œÈb1¸ãž9ŽGj}®cg¿ìv«o¼åü¦dÝõÁæ‡Ól$»[¹-Q®WîÌÌÅÇѳšÝÚ¨rna#óX—*sóAÁ秘u %º[V¼·ÊÄe]íôÍ-Í…Þϵۉü³¹<×fÚ}FO›6c8a=ªÈ÷°vc¹¶íÉÉë·ŒúqVªI¤Uy@DR=¹9-ýáí@¾“¦¼pÆöQ2Aþ©Ib#ÿtgœtÛ „Ú!ˆÆ±,ÛJ.v®3ÐdàvÍLÈÌ ½ÚäãŸ+ÈUª4VÚ[¼AÚöUˆq´”fÏ¿Ýéï@mímíaXm¢0Ľ9T~Ô#JÓDë8²‹ÎB É–Ü ç èCuªù·VÂ8ÇÙíãÌ–mŠrÌ0N>Qòõ÷«3ê6Ó,7–ñJøÚ’JªÇ=0  ‡N±‚áî µHç“ïÈŒÁ›êAɨΥÞ#§Àcw2ó†aüDg“ïQZkV÷dgŠ;ˆå™(Üâ6eÜ^vçÚ—MÕVòÍ.fò!FµŠá¿| Mà“¸`` p{óÓ}bH£$àLã’r{úÒì_YïóÿñU›q®Y'ÙšÞâÞâ)n<™$I”¬_#>Iîûu©¶tÓumn·°4—JZ®p8?^ž¸>”wbúËÿŸÿŠ£búËÿŸÿЧQ@ ؾ²ÿßçÿâ¨Ø¾²ÿßçÿ⪖©w$(-¿ãâfÂü»¶¯vÇ~ÃêE;K¼7–¹ž3²U¯ÐŽže{ìåËÏз±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅU=bý´Ý9î’3 쳪õÁÇÞÏJ¡w®Ýéí2_éñ+­¤·1ù7Õü° RJ:Žpjˆ6ö/¬¿÷ùÿøª6/¬¿÷ùÿøª­¥e$M'ÚíÇ–UdýêþíCž9¡u==掿µi%Æ‚e%Áîy  ;Ö_ûüÿüUÖ_ûüÿüUB—öR]5¬wvíp¿z%QœÒÁ{iq,‘[ÝA,‘ýôIúÒ€%ؾ²ÿßçÿâ¨Ø¾²ÿßçÿ⪋û+VÛswo pq$O9©ïƒù$½´Šå-¥º'“îDÒÍôMM±}eÿ¿ÏÿÅQ±}eÿ¿ÏÿÅUm?R³Ô’F²¸IDNc}¤qùqÇ­TÓµë[Ø®îkX­må1 MÀ9Á#'²ƒŽ99€56/¬¿÷ùÿøª6/¬¿÷ùÿøªŽ+»i¼¿*âóT´{\àc$z‘ùÔOªiÈŠïjªê¬¤Ì 0làŽz} Yؾ²ÿßçÿâ¨Ø¾²ÿßçÿ⪆«¬[i¨¡¤…îHÑ`2…f ár^2OáZ4Ý‹ë/ýþþ*‹ë/ýþþ*E7búËÿŸÿŠ£búËÿŸÿЧQ@ ؾ²ÿßçÿâ¨Ø¾²ÿßçÿâ©ÔPv/¬¿÷ùÿøª6/¬¿÷ùÿøªuÝ‹ë/ýþþ*‹ë/ýþþ*E7búËÿŸÿŠ£búËÿŸÿЧQ@ ؾ²ÿßçÿâ¨Ø¾²ÿßçÿâ©ÔPv/¬¿÷ùÿøª6/¬¿÷ùÿøªuÝ‹ë/ýþþ*‹ë/ýþþ*E7búËÿŸÿŠ£búËÿŸÿЧQ@ ؾ²ÿßçÿâ¨Ø¾²ÿßçÿâ©ÔPv/¬¿÷ùÿøª6/¬¿÷ùÿøªuÝ‹ë/ýþþ*‹ë/ýþþ*E7búËÿŸÿŠ£búËÿŸÿЧQ@ ؾ²ÿßçÿâ¨Ø¾²ÿßçÿâ©ÔPv/¬¿÷ùÿøª6/¬¿÷ùÿøªuÝ‹ë/ýþþ*‹ë/ýþþ*E7búËÿŸÿŠ£búËÿŸÿЧQ@ ؾ²ÿßçÿâ¨Ø¾²ÿßçÿâ©ÔPv/¬¿÷ùÿøª6/¬¿÷ùÿøªuÝ‹ë/ýþþ*‹ë/ýþþ*E7búËÿŸÿŠ£búËÿŸÿЧQ@ ؾ²ÿßçÿâ¨Ø¾²ÿßçÿâ©ÔPv/¬¿÷ùÿøª6/¬¿÷ùÿøªuÝ‹ë/ýþþ*‹ë/ýþþ*E7búËÿŸÿŠ£búËÿŸÿЧQ@ ؾ²ÿßçÿ⪴º^Ÿ<†I¬ã‘ÏVrÄŸÄš5i-&îXÉ »=@ÍdÃ¥Ëx¥í®¤bk¯Ú¤©ùª%>WkS£Îœ›²4ÿ±´¯úÁúÿØÚWýàýƳ´œÇ«´ rÓ GÉóYÁÁ\Iõ­úq—2¹5iû9X©«Z½î‘{iQ%ż‘)n€²3íÍg]xz×û êÒÂÎÎÞê{c ‘# ’GrqšÖû]·üüCÿ}Š>×mÿ?ÿßb¨ÌɻѮ'þÒØñwwo:dž?/ ñ×ä8úІßFÔ!–ÊöÆÒÒöK€Û›ÌpÞgc‚þ¼ût;Ÿk¶ÿŸˆï±GÚí¿çâûìP 2˜Ü*,¸ùÂ1*± d~Ë]®õÍ?ô]?Úí¿çâûìVi´³lo¹µb$óŽÏQR.JÈêÂW¹K±‰Em}ŽÇþ{Ú~mÿÅÑö;ùïiù·ÿXûö•.Ïðÿ3ŠÚûü÷´üÛÿ‹£ìv?óÞÓóoþ.c þÒ¥ÙþæbÑ[_c±ÿžöŸ›ñt}ŽÇþ{Ú~mÿÅÑìdÚT»?ÃüÌZ+kìv?óÞÓóoþ.±ØÿÏ{OÍ¿øº=ŒƒûJ—gø™‹Em}ŽÇþ{Ú~mÿÅÑö;ùïiù·ÿG±iRìÿó1h­¯±ØÿÏ{OÍ¿øº>Çcÿ=í?6ÿâèö2í*]Ÿáþf-µö;ùïiù·ÿGØìç½§æßü]ÆAý¥K³ü?ÌÅ¢¶¾Çcÿ=í?6ÿâèûü÷´üÛÿ‹£ØÈ?´©v‡ù˜´Vרìç½§æßü]c±ÿžöŸ›ñt{ö•.Ïðÿ2mýHÿ®cÿCz}Ô2E4²,o$Sa›Ëåãp1¸üÓE:ÐÛ[d «|m ¶1‚Or}jÇÚí¿çâûìWL/³Sœ¤º³.H.5JºÍµð%–XÌ/÷BœyíŽI§jšcßkzt¬%ðÅ0‘⢠¶Í£*Açò­/µÛÏÄ?÷Ø£ívßóñýö)·s4¬aêúEĆd³ŽIéW6êd›s©PKœàòj ýïí;í-WÉŽ OÝUåfdëèG^+£û]·üüCÿ}Š>×mÿ?ÿßbÊ47ky©ÜÝ۴ί—V;Dh¼àõãÿ×Ö±µ=þmé­# ¨nÕT°Ä°Êíò“œt!†zõ®£ívßóñýö(û]·üüCÿ}Šçõ=&æMFyZ+©í®­RKy#V\nÈ;ûÝZ_ì»Å×áÔ–Û0¡Hšq¹€R<ãÎ Äzã=ð+ívßóñýö(û]·üüCÿ}Ч¢[ÏkÜSÄS7sJC«¹`F{ãœUù¢Yà’>äŠU¾„b™ö»oùø‡þû}®Ûþ~!ÿ¾ÅPY/­w+=Ú¹<´0‰CŒgî’:t=)úm¤Ëp÷w•˜ElÁ9$ÀÉj¹ö»oùø‡þû}®Ûþ~!ÿ¾ÅS–‚JÆN£y\Ïsö”•¯f•nÜ!S!*vÛÈÇ}j¾Ÿ¤\%æœ÷VÊRÜÞ–,Tí2J^럧zÞû]·üüCÿ}Š>×mÿ?ÿßb¤g!‘«ÚèóÛ :[)-GïPy,ªà©Éèw1žzã­ok–3Þøìp¡i Á¯´ádBØ9À´~×mÿ?ÿßbµÛÏÄ?÷Ø  »ýÒµ²ŠI/.-$…^YšF9S…ÜäàgñT/4YÖîB¶÷Ú\Y¥»Ejñ)M»²¤>Ó»±®ívßóñýö(û]·üüCÿ}ŠÄ]&éuÄ ˜Ó\¥Ô›œç"í G|á>«PÚi×öRÚ]=“\yFíZtܾdÛ•ÆH9溵ÛÏÄ?÷Ø£ívßóñýö(‘þÆÕ­tû«x¬ÖfºÓš¶U •¶óè$cŽ;kHYßÛê©%Œ,’FnK¼m Šqá°01ǹö»oùø‡þû}®Ûþ~!ÿ¾ÅMU¥šf\²D@?tÒ‚Ùê)ÿk¶ÿŸˆï±GÚí¿çâûìP]ÙG*8Ø õÛe ?Ç™w¦=ö¢Á%²M7 ó¤€FãzòEm}®Ûþ~!ÿ¾Åk¶ÿŸˆï±@楠26®šU„1Es§,Q¬A#.çÏs‚¼šƒWK»g¾‹ÈY#½Ô-ÝgóûÑ›zäôÆ 9®«ívßóñýö*°‹IkÙ}¤ÿËl&ÿûë­c éR&KUÿjÏpä2äÆÂP§9ÿixëUWFÔb°PÐ.øí´õòšEV‰˜¼yÎ==uŸk¶ÿŸˆï±Q\>Ÿu †å­fŒõI °? nÚÚ}WUšy-dz¬rH…Õ¶·Ç'¡ •ÈÁúUË 6ö×S¶­”³Þƒµ—åY$ צ çž•³–Ñ,6ïmkÑ#* ~¤û]·üüCÿ}ŠšŠ‡ívßóñýö(û]·üüCÿ}Šçši¤ÔÌÑÝGûÁ÷!bÈŠ~P21î~¾ÔÍ)®m5$m“´R-·FÀíþr1‘üµtŸjµÿŸˆï±GÚ­çâûìVJ–¼×:Þ.ðäåVµŠ>#³šÿF’Ú,í,Göœ ’F8Ô7ú ¥j+e’^\ZI ¼³4Œr§ ¹ÉÀÎ;âµ>×mÿ?ÿßbµÛÏÄ?÷Ø­NCœÔ49åyc‚Ñ<‡·³h*Ù9gÏeüéÚ­®¯=ãµw‚¸&„FÑ*²!RG?6þÐcÐý®Ûþ~!ÿ¾Åk¶ÿŸˆï±@–ÖWñjO¤W6ÖR4­(™ãd²CGƒ¸Ç8×mÿ?ÿßb€15&{˽Vhí–C6•öx•É“2d ôê¼ôª×ZV Ðj6kkæ5ûÆéu½qÍ“Ÿ”©#õí]'Úí¿çâûìQö»oùø‡þûOD·žÖ;¸§ˆ¦næ• ‡WrÀŒ÷Ç8¬Á¦^Å}›Í6úœ÷&ë™Ëí#'Á#ð­ÿµÛÏÄ?÷Ø£ívßóñýö(œ¶Óõ;]J=A,wy’Ü7‘æ¨òDž^Üœãªvçïwªðh£Kš9lÔÏýˆ¶‘唑/ï2 çŽ«ÏOzêþ×mÿ?ÿßbµÛÏÄ?÷Ø jm7SXîí’ÈËö‹Ë{?ÍP)+‚s‘°ûc¾x=]Cö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾ÅMECö»oùø‡þû}®Ûþ~!ÿ¾Å3R‰®4˸cy!uQêJœVÚ•‚í,%ReÞîmd%Ç÷OËü«¢û]·üüCÿ}Š>×mÿ?ÿßb¢Pæw¹½*ü‰Å«£C†vÕçº{7¶‘ð¦6@ +ÀÜ¡®†¡û]·üüCÿ}Š>×mÿ?ÿßbœcʬMZ®¤¹˜YÿÇ”õÍ•Qoéhò+Ï",ržF·F¬ÞWo^:Õë?øòƒþ¹¯ò®ZßR°HÖ,¤š9nd»»EµRG,í´sÎjŒŽ¼r2(®>f’ÉÓU¾ž×ìúlBÜÇ1O2`~Ÿ} òœõéQ µ†êöæîê;˜.l—ÉE.°ïzw7Šíh®GM¹¼“WQs¨E ÒÝH²[Érûž<°UXËŒm!‡§^µ×PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\­çü~Ïÿ]ù×U\­çü~Ïÿ]ùÐͶ£h–Ñ#M†T§®>•/ö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øQý©eÿ=¿ñÖÿ ( ûRËþ{ã­þjYÏoüu¿ÂŠ(þÔ²ÿžßøë…Ú–_óÛÿoð¢Š?µ,¿ç·þ:ßáGö¥—üöÿÇ[ü(¢€íK/ùíÿŽ·øVË+ÜÊêr¬äƒíš( ÿÙ endstream endobj 17 0 obj << /Length 18 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 125.5 708.8 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.7 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <21> Tj 4.5 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.2 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.8 0 Td <19> Tj 4.6 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.6 0 Td <1D> Tj 7.2 0 Td <06> Tj 7.3 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.4 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <08> Tj 7.6 0 Td <0B> Tj 7.5 0 Td <27> Tj 3.7 0 Td <08> Tj 7.4 0 Td <0B> Tj 7.5 0 Td <27> Tj 3.7 0 Td <08> Tj 7.5 0 Td <0B> Tj 7.5 0 Td <27> Tj 3.6 0 Td <08> Tj 7.5 0 Td <0B> Tj 7.2 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <06> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <19> Tj ET Q q 0 0 0 rg BT 90 694.8 Td /F2 12 Tf <0F> Tj 7.6 0 Td <0B> Tj 7.5 0 Td <10> Tj 7.5 0 Td <10> Tj 7.5 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <18> Tj 6 0 Td <03> Tj 6.9 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.4 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <2204> Tj 7.5 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <40> Tj 7.7 0 Td <02> Tj 7.6 0 Td <17> Tj 3.8 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <02> Tj 7.6 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <3A> Tj 6.1 0 Td <20> Tj 11.3 0 Td <22> Tj 3.7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.5 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.1 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <06> Tj 7.6 0 Td <04> Tj 3.7 0 Td <29> Tj 6.4 0 Td <3D> Tj ET Q q 0 0 0 rg BT 90 680.7 Td /F2 12 Tf <19> Tj 4.8 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <06> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <12> Tj 6.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <02> Tj 7.7 0 Td <11> Tj 7.5 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <18> Tj 5.7 0 Td <04> Tj 3.7 0 Td <33> Tj 4.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.6 0 Td <18> Tj 6 0 Td <34> Tj 4.6 0 Td <27> Tj 3.4 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <3F> Tj 7.8 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <18> Tj 6 0 Td <1D> Tj 7.1 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <20> Tj 11.3 0 Td <17> Tj 3.7 0 Td <19> Tj ET Q q 0 0 0 rg BT 90 666.7 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <14> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <1A> Tj 6.8 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <14> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <1A> Tj 6.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.1 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <21> Tj 4.3 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 644.4 Td /F4 10 Tf <696E7420766C616E2032> Tj ET Q q 0 0 0 rg BT 90 633.4 Td /F4 10 Tf <20> Tj ET Q q 0 0 0 rg BT 96 633.4 Td /F4 10 Tf <697020726F7574652D636163686520666C6F77> Tj ET Q q 0 0 0 rg BT 90 622.3 Td /F4 10 Tf <20> Tj ET Q q 0 0 0 rg BT 96 622.3 Td /F4 10 Tf <6D6C73206E6574666C6F772073616D706C696E67> Tj ET Q q 0 0 0 rg BT 90 597.4 Td /F2 12 Tf <2B> Tj 9 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <19> Tj 4.6 0 Td <03> Tj 7 0 Td <07> Tj 5.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <23> Tj 7.6 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1A> Tj 7.1 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <0A> Tj ET Q q 0 0 0 rg BT 125.5 569.3 Td /F2 12 Tf <41> Tj 9.7 0 Td <13> Tj 7.3 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.7 0 Td <19> Tj 4.6 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <0E> Tj 9.5 0 Td <35> Tj 8.5 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <33> Tj 4.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.6 0 Td <15> Tj 10.2 0 Td <1D> Tj 7 0 Td <07> Tj 5.6 0 Td <1C> Tj 7 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <19> Tj 4.7 0 Td <1A> Tj 6.9 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <24> Tj 6.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <34> Tj 4.2 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <1D> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7.1 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 555.2 Td /F2 12 Tf <26> Tj 9.1 0 Td <35> Tj 8.6 0 Td <25> Tj 8 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <15> Tj 10.1 0 Td <03> Tj 7 0 Td <2F> Tj 6.6 0 Td <03> Tj 7 0 Td <07> Tj 5.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <40> Tj 7.6 0 Td <02> Tj 7.7 0 Td <17> Tj 3.8 0 Td <07> Tj 5.6 0 Td <03> Tj 7.1 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <1F> Tj 6.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <14> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.8 0 Td <14> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.6 0 Td <02> Tj 7.6 0 Td <20> Tj 11.3 0 Td <03> Tj 7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.3 0 Td <04> Tj 3.8 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.2 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 541.2 Td /F2 12 Tf <36> Tj 4.6 0 Td <41> Tj 9.7 0 Td <30> Tj 7.8 0 Td <04> Tj 3.7 0 Td <08> Tj 7.6 0 Td <0F> Tj 7.5 0 Td <27> Tj 3.7 0 Td <0F> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <08> Tj 7.6 0 Td <0F> Tj 7.5 0 Td <27> Tj 3.7 0 Td <0C> Tj 7.5 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <01> Tj 7.9 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.2 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.8 0 Td <15> Tj 10.2 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 7.1 0 Td <18> Tj 5.8 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <43> Tj 7.5 0 Td <0C> Tj 7.6 0 Td <08> Tj 7.3 0 Td <04> Tj 3.7 0 Td <33> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A22> Tj 10.9 0 Td <18> Tj 6.1 0 Td <1D> Tj 7 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <08> Tj 7.5 0 Td <45> Tj 7.5 0 Td <10> Tj 7.5 0 Td <0B> Tj 7.5 0 Td <34> Tj ET Q q 0 0 0 rg BT 90 527.1 Td /F2 12 Tf <07> Tj 5.7 0 Td <02> Tj 7.6 0 Td <13> Tj 7.7 0 Td <13> Tj 7.6 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <08> Tj 7.5 0 Td <0F> Tj 7.6 0 Td <27> Tj 3.7 0 Td <0F> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <36> Tj 4.6 0 Td <41> Tj 9.7 0 Td <30> Tj 8.1 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 501.9 Td /F4 10 Tf <697020636566> Tj ET Q q 0 0 0 rg BT 90 490.8 Td /F4 10 Tf <697020666C6F772D63616368652074696D656F7574206163746976652035> Tj ET Q q 0 0 0 rg BT 90 479.8 Td /F4 10 Tf <697020666C6F772D6578706F72742076657273696F6E2035> Tj ET Q q 0 0 0 rg BT 90 468.7 Td /F4 10 Tf <697020666C6F772D6578706F72742064657374696E6174696F6E2031302E31302E31302E 31302032303535> Tj ET Q q 0 0 0 rg BT 90 432.7 Td /F2 12 Tf <05> Tj 8.5 0 Td <13> Tj 7.7 0 Td <14> Tj 7.3 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.9 0 Td <13> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <21> Tj 4.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 7 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <02> Tj 7.6 0 Td <07> Tj 5.6 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <21> Tj 4.3 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <14> Tj 7.5 0 Td <03> Tj 7 0 Td <18> Tj 6.1 0 Td <17> Tj 3.8 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 410.5 Td /F4 10 Tf <696E74207320302F303A30> Tj ET Q q 0 0 0 rg BT 90 399.4 Td /F4 10 Tf <697020726F7574652D636163686520666C6F77> Tj ET Q q 0 0 0 rg BT 90 377.3 Td /F4 10 Tf <696E7420666120302F3020> Tj ET Q q 0 0 0 rg BT 90 366.3 Td /F4 10 Tf <697020726F7574652D636163686520666C6F77> Tj ET Q q 0 0 0 rg BT 125.5 341.3 Td /F2 12 Tf <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.4 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <2122> Tj 8.2 0 Td <1D> Tj 7.2 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <23> Tj 7.5 0 Td <1B> Tj 7.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.6 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <18> Tj 6.1 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <22> Tj 3.8 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.8 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj ET Q q 0 0 0 rg BT 90 327.3 Td /F2 12 Tf <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1D> Tj 7 0 Td <13> Tj 7.7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <26> Tj 9 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <03> Tj 7 0 Td <11> Tj 7.5 0 Td <06> Tj 7.6 0 Td <1A> Tj 7 0 Td <23> Tj 7.6 0 Td <03> Tj 7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.7 0 Td <1A> Tj 7 0 Td <2F> Tj 6.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <02> Tj 7.7 0 Td <22> Tj 3.7 0 Td <19> Tj 4.8 0 Td <17> Tj 3.7 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.8 0 Td <21> Tj 4.3 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj ET Q q 0 0 0 rg BT 90 313.2 Td /F2 12 Tf <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <18> Tj 6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <02> Tj 7.6 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <3A> Tj 6.1 0 Td <30> Tj 8.1 0 Td <15> Tj 10.1 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.4 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <36> Tj 4.6 0 Td <26> Tj 9 0 Td <3D> Tj 5.8 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <02> Tj 7.6 0 Td <19> Tj 4.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.3 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.8 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <03> Tj 7 0 Td <15> Tj 10 0 Td <04> Tj 3.8 0 Td <19> Tj 4.6 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.5 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <18> Tj 6.1 0 Td <38> Tj ET Q q 0 0 0 rg BT 90 299.2 Td /F2 12 Tf <18> Tj 6 0 Td <19> Tj 4.8 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.5 0 Td <18> Tj 6.1 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 251.6 Td /F3 18 Tf <43> Tj 13 0 Td <6F> Tj 8.9 0 Td <6E> Tj 10.1 0 Td <66> Tj 5.9 0 Td <69> Tj 5.1 0 Td <72> Tj 7.9 0 Td <6D> Tj 15 0 Td <6174> Tj 15 0 Td <69> Tj 5 0 Td <6F6E> Tj 19.1 0 Td <20> Tj 4.6 0 Td <61> Tj 8.9 0 Td <6E> Tj 10 0 Td <64> Tj 10 0 Td <20> Tj 4.6 0 Td <54> Tj 12 0 Td <72> Tj 8 0 Td <6F75> Tj 18.9 0 Td <62> Tj 10 0 Td <6C> Tj 5 0 Td <65> Tj 8 0 Td <73> Tj 7 0 Td <68> Tj 10 0 Td <6F6F74> Tj 24 0 Td <69> Tj 5 0 Td <6E> Tj 10 0 Td <67> Tj ET Q q 0 0 0 rg BT 125.5 228.5 Td /F2 12 Tf <41> Tj 9.7 0 Td <13> Tj 7.5 0 Td <1F> Tj 6.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 6.9 0 Td <19> Tj 4.8 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <24> Tj 6.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.8 0 Td <17> Tj 3.7 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <23> Tj 7.6 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <14> Tj 7.4 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.6 0 Td <2C> Tj ET Q q 0 0 0 rg BT 90 214.5 Td /F2 12 Tf <19> Tj 4.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <2F> Tj 6.7 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <17> Tj 3.8 0 Td <21> Tj 4.3 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <03> Tj 7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.8 0 Td <21> Tj 4.4 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.2 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <1F> Tj 6.5 0 Td <19> Tj 4.8 0 Td <22> Tj 3.7 0 Td <12> Tj 6.4 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <2F> Tj 6.6 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.7 0 Td <18> Tj ET Q q 0 0 0 rg BT 90 200.4 Td /F2 12 Tf <07> Tj 5.7 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <17> Tj 3.8 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <20> Tj 11.2 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <1B> Tj 7.7 0 Td <1D> Tj 7 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <14> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <2F> Tj 6.7 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <17> Tj 3.7 0 Td <21> Tj 4.4 0 Td <12> Tj 6.5 0 Td <04> Tj 3.8 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <1F> Tj 6.7 0 Td <03> Tj 7 0 Td <17> Tj 3.7 0 Td <06> Tj 7.5 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 186.4 Td /F2 12 Tf <21> Tj 4.5 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.1 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <22> Tj 3.9 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <02> Tj 7.6 0 Td <24> Tj 6.7 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1D> Tj 7 0 Td <24> Tj 6.7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <05> Tj 8.5 0 Td <18> Tj 6 0 Td <18> Tj 6.1 0 Td <02> Tj 7.5 0 Td <20> Tj 11.3 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <23> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <0F> Tj 7.6 0 Td <0B> Tj 7.5 0 Td <10> Tj 7.5 0 Td <10> Tj 7.5 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj ET Q q 0 0 0 rg BT 90 172.3 Td /F2 12 Tf <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <21> Tj 4.4 0 Td <1A> Tj 7.1 0 Td <02> Tj 7.7 0 Td <22> Tj 3.8 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.8 0 Td <21> Tj 4.3 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <06> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <02> Tj 7.6 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <3A> Tj 6.1 0 Td <19> Tj 4.7 0 Td <1F> Tj 6.6 0 Td <06> Tj 7.5 0 Td <14> Tj 7.6 0 Td <02> Tj 7.6 0 Td <20> Tj 11.2 0 Td <06> Tj 7.6 0 Td <3D> Tj 5.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <37> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <1B> Tj 7.7 0 Td <1D> Tj 7 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.4 0 Td <21> Tj 4.3 0 Td <17> Tj 3.8 0 Td <1F> Tj ET Q q 0 0 0 rg BT 90 158.3 Td /F2 12 Tf <19> Tj 4.8 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.1 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <0F> Tj 7.6 0 Td <0B> Tj 7.5 0 Td <10> Tj 7.5 0 Td <10> Tj 7.5 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 133 Td /F4 10 Tf <74637064756D702075647020706F7274203230353520> Tj ET Q q 0 0 0 rg BT 125.5 105.1 Td /F2 12 Tf <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <3A> Tj 6 0 Td <19> Tj 4.7 0 Td <1F> Tj 6.7 0 Td <06> Tj 7.5 0 Td <14> Tj 7.6 0 Td <02> Tj 7.6 0 Td <20> Tj 11.2 0 Td <06> Tj 7.6 0 Td <3D> Tj 5.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <2C> Tj 3.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 7.1 0 Td <07> Tj 5.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.7 0 Td <22> Tj 3.7 0 Td <14> Tj 7.6 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <12> Tj 6.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <14> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <1A> Tj 6.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.2 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 91 Td /F2 12 Tf <07> Tj 5.7 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <14> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <1A> Tj 6.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <15> Tj 10.1 0 Td <13> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <14> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <1A> Tj 6.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj ET Q q 0 0 0 rg BT 90 77 Td /F2 12 Tf <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <02> Tj 7.6 0 Td <24> Tj 6.6 0 Td <04> Tj 3.8 0 Td <11> Tj 7.6 0 Td <1D> Tj 7 0 Td <24> Tj 6.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.8 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <14> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <1A> Tj 6.8 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1F> Tj 6.6 0 Td <06> Tj 7.6 0 Td <14> Tj 7.6 0 Td <02> Tj 7.6 0 Td <20> Tj 11.2 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <19> Tj 4.7 0 Td <06> Tj 7.6 0 Td <02> Tj 7.5 0 Td <19> Tj 4.7 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <02> Tj 7.6 0 Td <19> Tj ET Q Q endstream endobj 18 0 obj 26720 endobj 19 0 obj << /Length 20 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 708.8 Td /F2 12 Tf <13> Tj 7.7 0 Td <1D> Tj 7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.3 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.5 0 Td <2C> Tj 3.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.3 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <06> Tj 7.7 0 Td <22> Tj 3.8 0 Td <02> Tj 7.6 0 Td <23> Tj 7.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <11> Tj 7.6 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.6 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <1D> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.7 0 Td <21> Tj 4.3 0 Td <17> Tj 3.8 0 Td <23> Tj 7.6 0 Td <02> Tj 7.7 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <22> Tj 3.8 0 Td <12> Tj 6.6 0 Td <2C> Tj ET Q q 0 0 0 rg BT 90 694.8 Td /F2 12 Tf <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <02> Tj 7.6 0 Td <13> Tj 7.6 0 Td <13> Tj 7.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.7 0 Td <1A> Tj 7 0 Td <2F> Tj 6.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <06> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <18> Tj 6.1 0 Td <3E> Tj 3.9 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <15> Tj 10.2 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.7 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <1F> Tj 6.7 0 Td <1C> Tj 7.1 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.3 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <27> Tj ET Q q 0 0 0 rg BT 90 666.7 Td /F2 12 Tf <01> Tj 7.9 0 Td <1D> Tj 7.1 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.7 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <04> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.6 0 Td <1D> Tj 7.2 0 Td <06> Tj 7.3 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <02> Tj 7.6 0 Td <13> Tj 7.6 0 Td <13> Tj 7.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.6 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 644.4 Td /F4 10 Tf <73657276696365206E746F7020737461747573> Tj ET Q q 0 0 0 rg BT 90 619.5 Td /F2 12 Tf <01> Tj 7.9 0 Td <1B> Tj 7.7 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.8 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <1C> Tj 7.1 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <18> Tj 6.1 0 Td <02> Tj 7.6 0 Td <07> Tj 5.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.8 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <22> Tj 3.9 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <1F> Tj 6.5 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 597.2 Td /F4 10 Tf <6E657473746174202D616E207C20677265702032303535> Tj ET Q q 0 0 0 rg BT 125.5 572.3 Td /F2 12 Tf <30> Tj 8.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <02> Tj 7.5 0 Td <19> Tj 4.7 0 Td <03> Tj 6.7 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <14> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <1F> Tj 6.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.8 0 Td <0F> Tj 7.5 0 Td <0B> Tj 7.5 0 Td <10> Tj 7.5 0 Td <10> Tj 7.6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <36> Tj 4.6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj ET Q q 0 0 0 rg BT 90 558.2 Td /F2 12 Tf <11> Tj 7.6 0 Td <03> Tj 7 0 Td <12> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.3 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <14> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.6 0 Td <02> Tj 7.7 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <1D> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <06> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.7 0 Td <03> Tj 7.1 0 Td <18> Tj 6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <02> Tj 7.6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <1A> Tj ET Q q 0 0 0 rg BT 90 544.2 Td /F2 12 Tf <40> Tj 7.7 0 Td <02> Tj 7.6 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1C> Tj 7.1 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <21> Tj 4.5 0 Td <17> Tj 3.8 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <15> Tj 10.2 0 Td <1A> Tj 7 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <21> Tj 4.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <02> Tj 7.7 0 Td <07> Tj 5.7 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <02> Tj 7.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <20> Tj 11.3 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <18> Tj 6.1 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 521.9 Td /F4 10 Tf <736572766963652069707461626C65732073746F70> Tj ET Q q 0 0 0 rg BT 90 508 Td /F2 12 Tf <1D> Tj 7.2 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 496.8 Td /F4 10 Tf <2F6574632F696E69742E642F69707461626C65732073746F70> Tj ET Q q 0 0 0 rg BT 90 449.4 Td /F3 18 Tf <50> Tj 11 0 Td <65> Tj 8 0 Td <72> Tj 8 0 Td <66> Tj 6 0 Td <6F> Tj 9 0 Td <72> Tj 8 0 Td <6D> Tj 15 0 Td <616E> Tj 19 0 Td <63> Tj 8.1 0 Td <65> Tj 8.1 0 Td <20> Tj 4.6 0 Td <6E> Tj 9.9 0 Td <6F74> Tj 15 0 Td <65> Tj 8 0 Td <73> Tj 7 0 Td <3A> Tj ET Q q 0 0 0 rg BT 125.5 426.3 Td /F2 12 Tf <2A> Tj 12.2 0 Td <1D> Tj 7 0 Td <13> Tj 7.7 0 Td <17> Tj 3.7 0 Td <19> Tj 4.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <23> Tj 7.6 0 Td <17> Tj 3.8 0 Td <23> Tj 7.7 0 Td <1A> Tj 7 0 Td <11> Tj 7.6 0 Td <17> Tj 3.6 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 7.1 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.4 0 Td <04> Tj 3.8 0 Td <13> Tj 7.5 0 Td <19> Tj 4.8 0 Td <1D> Tj 7 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <33> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.8 0 Td <20> Tj 11.2 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <07> Tj 5.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.3 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.7 0 Td <19> Tj 4.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <18> Tj ET Q q 0 0 0 rg BT 90 412.3 Td /F2 12 Tf <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.2 0 Td <22> Tj 3.7 0 Td <07> Tj 5.7 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.5 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <06> Tj 7.6 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <24> Tj 6.6 0 Td <03> Tj 7 0 Td <14> Tj 7.6 0 Td <34> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A02> Tj 14.7 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.7 0 Td <18> Tj 6.1 0 Td <18> Tj 6.1 0 Td <02> Tj 7.7 0 Td <03> Tj 7 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 398.2 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <2F> Tj 6.7 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <22> Tj 3.9 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <02> Tj 7.7 0 Td <24> Tj 6.5 0 Td <04> Tj 3.8 0 Td <11> Tj 7.5 0 Td <1D> Tj 7.1 0 Td <24> Tj 6.7 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.8 0 Td <12> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <38> Tj 3.2 0 Td <19> Tj 4.5 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <1F> Tj 6.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <11> Tj 7.6 0 Td <1A> Tj 7 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 384.2 Td /F2 12 Tf <12> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <40> Tj 7.7 0 Td <02> Tj 7.6 0 Td <17> Tj 3.8 0 Td <06> Tj 7.6 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <2C> Tj 3.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <23> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <1D> Tj 7.1 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <14> Tj 7.6 0 Td <03> Tj 7 0 Td <1A> Tj 7 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <1D> Tj 7 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <1D> Tj 7.2 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <46> Tj 10.4 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.3 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <03> Tj 7.1 0 Td <1A> Tj 7 0 Td <18> Tj 6.1 0 Td <12> Tj ET Q q 0 0 0 rg BT 90 370.1 Td /F2 12 Tf <18> Tj 6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <06> Tj 7.6 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1A> Tj 7 0 Td <18> Tj 6.1 0 Td <03> Tj 7 0 Td <22> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <37> Tj 3.7 0 Td <02> Tj 7.6 0 Td <18> Tj 6.1 0 Td <19> Tj 4.5 0 Td <04> Tj 3.8 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <20> Tj 11.3 0 Td <06> Tj 7.6 0 Td <1A> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.5 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.5 0 Td <27> Tj ET Q q 0 0 0 rg BT 125.5 342 Td /F2 12 Tf <2B> Tj 9 0 Td <02> Tj 7.5 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <06> Tj 7.5 0 Td <06> Tj 7.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <02> Tj 7.7 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <1F> Tj 6.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <22> Tj 3.9 0 Td <17> Tj 3.8 0 Td <1C> Tj 7.1 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <3A> Tj 6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.5 0 Td <3D> Tj 5.9 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.5 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 328 Td /F2 12 Tf <22> Tj 3.9 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <02> Tj 7.7 0 Td <24> Tj 6.5 0 Td <04> Tj 3.8 0 Td <11> Tj 7.5 0 Td <1D> Tj 7.1 0 Td <24> Tj 6.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <02> Tj 7.7 0 Td <07> Tj 5.6 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.2 0 Td <06> Tj 7.3 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <23> Tj 7.6 0 Td <1A17> Tj 10.9 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.3 0 Td <19> Tj 4.8 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <12> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <19> Tj 4.6 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <2A> Tj 12.2 0 Td <1A> Tj 7.1 0 Td <1C> Tj 7.1 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 313.9 Td /F2 12 Tf <18> Tj 6.1 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.2 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <2F> Tj 6.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.3 0 Td <19> Tj 4.8 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <3F> Tj 7.8 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <02> Tj 7.7 0 Td <18> Tj 6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 299.9 Td /F2 12 Tf <18> Tj 6.1 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.2 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <26> Tj 9 0 Td <0D> Tj 8 0 Td <2D> Tj 9.8 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.4 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <04> Tj 3.8 0 Td <11> Tj 7.6 0 Td <1D> Tj 7 0 Td <24> Tj 6.5 0 Td <04> Tj 3.7 0 Td <15> Tj 10.3 0 Td <17> Tj 3.6 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <02> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.8 0 Td <14> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <19> Tj 4.6 0 Td <1A> Tj 6.9 0 Td <04> Tj 3.8 0 Td <23> Tj 7.5 0 Td <1D> Tj 7.2 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <19> Tj 4.7 0 Td <27> Tj ET Q q 0 0 0 rg BT 125.5 271.8 Td /F2 12 Tf <1E> Tj 7.9 0 Td <17> Tj 3.7 0 Td <1C> Tj 7.1 0 Td <03> Tj 7 0 Td <15> Tj 10.1 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <14> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <47> Tj 5.5 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.8 0 Td <06> Tj 7.6 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.4 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <06> Tj 7.6 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.7 0 Td <18> Tj 6 0 Td <19> Tj 4.8 0 Td <47> Tj 5.3 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.5 0 Td <04> Tj 3.8 0 Td <3A> Tj 6 0 Td <18> Tj 6.1 0 Td <1B> Tj 7.5 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.6 0 Td <3D> Tj 5.9 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <19> Tj 4.6 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 257.7 Td /F2 12 Tf <33> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <17> Tj 3.8 0 Td <20> Tj 11.3 0 Td <17> Tj 3.8 0 Td <22> Tj 3.7 0 Td <1A07> Tj 12.8 0 Td <34> Tj 4.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 7 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.3 0 Td <19> Tj 4.8 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <02> Tj 7.6 0 Td <07> Tj 5.7 0 Td <13> Tj 7.6 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <2A> Tj 12.2 0 Td <1A> Tj 7.1 0 Td <1C> Tj 7.1 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.7 0 Td <03> Tj 6.9 0 Td <18> Tj 6 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <30> Tj 8.1 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <14> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj ET Q q 0 0 0 rg BT 90 243.7 Td /F2 12 Tf <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <15> Tj 10 0 Td <04> Tj 3.8 0 Td <14> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <1A> Tj 6.8 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1A> Tj 7 0 Td <1C> Tj 7.2 0 Td <03> Tj 6.9 0 Td <18> Tj 5.8 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <17> Tj 3.7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <20> Tj 11.3 0 Td <1D> Tj 7.1 0 Td <02> Tj 7.6 0 Td <13> Tj 7.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <26> Tj 9 0 Td <0D> Tj 8 0 Td <2D> Tj 9.8 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.2 0 Td <03> Tj 7 0 Td <07> Tj 5.4 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.5 0 Td <15> Tj 10.2 0 Td <17> Tj 3.7 0 Td <14> Tj 7.5 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <2C> Tj ET Q q 0 0 0 rg BT 90 229.6 Td /F2 12 Tf <18> Tj 6.1 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1A> Tj 7.1 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <21> Tj 4.3 0 Td <19> Tj 4.8 0 Td <03> Tj 7 0 Td <07> Tj 5.5 0 Td <04> Tj 3.7 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <19> Tj 4.7 0 Td <27> Tj 3.6 0 Td <04> Tj 3.7 0 Td <04> Tj 3.8 0 Td <36> Tj 4.6 0 Td <23> Tj 7.6 0 Td <13> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1B> Tj 7.5 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 215.6 Td /F2 12 Tf <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <02> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <18> Tj 5.8 0 Td <04> Tj 3.8 0 Td <17> Tj 3.8 0 Td <21> Tj 4.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.5 0 Td <03> Tj 7.1 0 Td <07> Tj 5.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <07> Tj 5.6 0 Td <03> Tj 7.1 0 Td <1A> Tj 7 0 Td <14> Tj 7.6 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6.1 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1A> Tj 7 0 Td <18> Tj 6 0 Td <03> Tj 7.1 0 Td <22> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <21> Tj 4.3 0 Td <1D> Tj 7.2 0 Td <07> Tj 5.6 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 201.5 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <40> Tj 7.7 0 Td <02> Tj 7.6 0 Td <17> Tj 3.8 0 Td <06> Tj 7.6 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.4 0 Td <04> Tj 3.8 0 Td <1A> Tj 7 0 Td <13> Tj 7.7 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <2217> Tj 7.6 0 Td <13> Tj 7.7 0 Td <02> Tj 7.6 0 Td <24> Tj 6.6 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <24> Tj 6.6 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <27> Tj ET Q q 0 0 0 rg BT 125.5 173.4 Td /F2 12 Tf <36> Tj 4.7 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <02> Tj 7.7 0 Td <18> Tj 6.1 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <02> Tj 7.6 0 Td <06> Tj 7.6 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <02> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.5 0 Td <04> Tj 3.7 0 Td <07> Tj 5.7 0 Td <1A> Tj 7.1 0 Td <20> Tj 11.1 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1A> Tj 7.1 0 Td <1722> Tj 7.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <23> Tj 7.6 0 Td <2C> Tj 3.6 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <1B> Tj 7.7 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.8 0 Td <1B> Tj 7.6 0 Td <1A> Tj 7 0 Td <06> Tj 7.6 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <13> Tj ET Q q 0 0 0 rg BT 90 159.4 Td /F2 12 Tf <15> Tj 10.2 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <17> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <07> Tj 5.7 0 Td <23> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 7.1 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <1D> Tj 7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.8 0 Td <20> Tj 11.3 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <12> Tj 6.5 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <33> Tj 4.7 0 Td <2217> Tj 7.6 0 Td <1C> Tj 7.2 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <1C> Tj 7.2 0 Td <03> Tj 7 0 Td <03> Tj 7 0 Td <06> Tj 7.6 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <1C> Tj ET Q q 0 0 0 rg BT 90 145.3 Td /F2 12 Tf <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <03> Tj 7.1 0 Td <07> Tj 5.6 0 Td <13> Tj 7.5 0 Td <03> Tj 7 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <13> Tj 7.6 0 Td <13> Tj 7.6 0 Td <03> Tj 6.9 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <34> Tj 4.6 0 Td <2C> Tj 3.5 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <13> Tj 7.3 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <02> Tj 7.7 0 Td <13> Tj 7.5 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.6 0 Td <1C> Tj 7.1 0 Td <03> Tj 7 0 Td <14> Tj 7.3 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.7 0 Td <1D> Tj 7.1 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <18> Tj 5.7 0 Td <04> Tj 3.8 0 Td <14> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <15> Tj 10.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.8 0 Td <11> Tj 7.5 0 Td <12> Tj ET Q q 0 0 0 rg BT 90 131.3 Td /F2 12 Tf <22> Tj 3.9 0 Td <17> Tj 3.8 0 Td <20> Tj 11.3 0 Td <17> Tj 3.7 0 Td <19> Tj 4.8 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.7 0 Td <1A> Tj 7 0 Td <1F> Tj 6.7 0 Td <1C> Tj 7.1 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 6.9 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <18> Tj 6 0 Td <19> Tj 4.6 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <33> Tj 4.6 0 Td <12> Tj 6.7 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.6 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <1F> Tj 6.6 0 Td <22> Tj 3.8 0 Td <02> Tj 7.7 0 Td <14> Tj 7.6 0 Td <03> Tj 6.9 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <3C> Tj 3.8 0 Td <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.7 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.2 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <18> Tj 5.7 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <04> Tj 3.8 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.5 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 117.2 Td /F2 12 Tf <22> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7.1 0 Td <22> Tj 3.8 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7.1 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <18> Tj 5.8 0 Td <04> Tj 3.7 0 Td <18> Tj 6.1 0 Td <19> Tj 4.6 0 Td <1A> Tj 7.1 0 Td <19> Tj 4.6 0 Td <03> Tj 7 0 Td <20> Tj 11.2 0 Td <03> Tj 6.9 0 Td <13> Tj 7.6 0 Td <19> Tj 4.3 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <02> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.8 0 Td <07> Tj 5.6 0 Td <1A> Tj 7.1 0 Td <1F> Tj 6.5 0 Td <1C> Tj 7.2 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <23> Tj 7.4 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <03> Tj 7 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.3 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <06> Tj 7.6 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.6 0 Td <14> Tj 7.6 0 Td <07> Tj 5.6 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <34> Tj 4.6 0 Td <27> Tj ET Q Q endstream endobj 20 0 obj 32185 endobj 21 0 obj << /Length 22 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 708.8 Td /F2 12 Tf <36> Tj 4.7 0 Td <13> Tj 7.4 0 Td <04> Tj 3.8 0 Td <3E> Tj 3.9 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <1F> Tj 6.6 0 Td <3E> Tj 3.9 0 Td <13> Tj 7.6 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <06> Tj 7.5 0 Td <27> Tj 3.7 0 Td <1F> Tj 6.5 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.6 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <02> Tj 7.7 0 Td <13> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.2 0 Td <20> Tj 11.3 0 Td <03> Tj 6.9 0 Td <13> Tj 7.5 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <22> Tj 3.8 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <03> Tj 7 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 686.6 Td /F4 10 Tf <2D2D747261636B2D6C6F63616C2D686F737473> Tj ET Q q 0 0 0 rg BT 90 639.2 Td /F3 18 Tf <43> Tj 13 0 Td <6F> Tj 8.9 0 Td <6E> Tj 10.1 0 Td <63> Tj 7.9 0 Td <6C> Tj 5.1 0 Td <75> Tj 9.9 0 Td <73> Tj 7 0 Td <69> Tj 5 0 Td <6F6E> Tj ET Q q 0 0 0 rg BT 125.5 616.1 Td /F2 12 Tf <46> Tj 10.4 0 Td <1D> Tj 7 0 Td <06> Tj 7.6 0 Td <03> Tj 7 0 Td <21> Tj 4.3 0 Td <02> Tj 7.7 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <12> Tj 6.6 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <17> Tj 3.7 0 Td <18> Tj 6 0 Td <04> Tj 3.7 0 Td <23> Tj 7.6 0 Td <02> Tj 7.7 0 Td <17> Tj 3.8 0 Td <14> Tj 7.5 0 Td <03> Tj 7 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.6 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <06> Tj 7.6 0 Td <18> Tj 5.9 0 Td <04> Tj 3.7 0 Td <17> Tj 3.8 0 Td <20> Tj 11.3 0 Td <06> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <20> Tj 11.2 0 Td <03> Tj 7 0 Td <13> Tj 7.5 0 Td <19> Tj 4.7 0 Td <1A> Tj 7 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.7 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.8 0 Td <21> Tj 4.3 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1D> Tj 7.2 0 Td <22> Tj 3.7 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <17> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <13> Tj ET Q q 0 0 0 rg BT 90 602 Td /F2 12 Tf <21> Tj 4.4 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <20> Tj 11.1 0 Td <04> Tj 3.8 0 Td <26> Tj 9.1 0 Td <17> Tj 3.7 0 Td <18> Tj 6.1 0 Td <1F> Tj 6.5 0 Td <1D> Tj 7 0 Td <04> Tj 3.7 0 Td <36> Tj 4.6 0 Td <41> Tj 9.6 0 Td <30> Tj 7.9 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <1A> Tj 7 0 Td <18> Tj 6.1 0 Td <03> Tj 6.9 0 Td <14> Tj 7.4 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <14> Tj 7.6 0 Td <02> Tj 7.6 0 Td <1F> Tj 6.6 0 Td <19> Tj 4.7 0 Td <18> Tj 6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.8 0 Td <2E> Tj 10.4 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <21> Tj 4.3 0 Td <22> Tj 3.8 0 Td <1D> Tj 7 0 Td <15> Tj 10 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <11> Tj 7.6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <24> Tj 6.7 0 Td <1F> Tj 6.6 0 Td <03> Tj 7 0 Td <22> Tj 3.8 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <19> Tj 4.4 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1D> Tj 7.1 0 Td <1D> Tj 7.1 0 Td <22> Tj 3.7 0 Td <04> Tj 3.7 0 Td <21> Tj 4.4 0 Td <1D> Tj 7.1 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 588 Td /F2 12 Tf <1F> Tj 6.7 0 Td <22> Tj 3.8 0 Td <1A> Tj 7 0 Td <18> Tj 6.1 0 Td <18> Tj 6.1 0 Td <17> Tj 3.8 0 Td <21> Tj 4.3 0 Td <12> Tj 6.8 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <06> Tj 7.6 0 Td <07> Tj 5.7 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <17> Tj 3.8 0 Td <22> Tj 3.9 0 Td <17> Tj 3.7 0 Td <13> Tj 7.7 0 Td <23> Tj 7.5 0 Td <04> Tj 3.7 0 Td <13> Tj 7.6 0 Td <03> Tj 7 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 7.1 0 Td <18> Tj 6 0 Td <27> Tj 3.5 0 Td <04> Tj 3.7 0 Td <04> Tj 3.7 0 Td <2E> Tj 10.4 0 Td <19> Tj 4.7 0 Td <1D> Tj 7 0 Td <06> Tj 7.4 0 Td <04> Tj 3.8 0 Td <1F> Tj 6.6 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1B> Tj 7.7 0 Td <03> Tj 7 0 Td <22> Tj 3.7 0 Td <06> Tj 7.5 0 Td <04> Tj 3.8 0 Td <20> Tj 11.2 0 Td <1A> Tj 7.1 0 Td <1C> Tj 7.1 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <18> Tj 6 0 Td <03> Tj 7 0 Td <13> Tj 7.6 0 Td <18> Tj 6 0 Td <03> Tj 6.8 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.2 0 Td <21> Tj 4.3 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <1B> Tj 7.6 0 Td <03> Tj ET Q q 0 0 0 rg BT 90 573.9 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <21> Tj 4.4 0 Td <22> Tj 3.7 0 Td <1D> Tj 7.2 0 Td <15> Tj 9.9 0 Td <04> Tj 3.8 0 Td <14> Tj 7.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <1A> Tj 7 0 Td <2C> Tj 3.6 0 Td <04> Tj 3.7 0 Td <15> Tj 10.2 0 Td <1B> Tj 7.6 0 Td <17> Tj 3.7 0 Td <1F> Tj 6.6 0 Td <1B> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1F> Tj 6.7 0 Td <1A> Tj 7 0 Td <13> Tj 7.6 0 Td <04> Tj 3.7 0 Td <20> Tj 11.3 0 Td <1A> Tj 7.1 0 Td <1C> Tj 7.1 0 Td <03> Tj 6.8 0 Td <04> Tj 3.7 0 Td <19> Tj 4.7 0 Td <07> Tj 5.6 0 Td <1D> Tj 7.2 0 Td <02> Tj 7.5 0 Td <11> Tj 7.6 0 Td <22> Tj 3.8 0 Td <03> Tj 7 0 Td <18> Tj 6 0 Td <1B> Tj 7.6 0 Td <1D> Tj 7 0 Td <1D> Tj 7.1 0 Td <19> Tj 4.7 0 Td <17> Tj 3.7 0 Td <13> Tj 7.6 0 Td <23> Tj 7.3 0 Td <04> Tj 3.8 0 Td <1A> Tj 7.1 0 Td <13> Tj 7.6 0 Td <14> Tj 7.5 0 Td <04> Tj 3.7 0 Td <1A> Tj 7.1 0 Td <14> Tj 7.6 0 Td <20> Tj 11.2 0 Td <17> Tj 3.8 0 Td <13> Tj 7.7 0 Td <17> Tj 3.7 0 Td <18> Tj 6 0 Td <19> Tj 4.7 0 Td <07> Tj 5.6 0 Td <1A> Tj 7 0 Td <19> Tj 4.8 0 Td <17> Tj 3.6 0 Td <1D> Tj 7.1 0 Td <13> Tj 7.4 0 Td <04> Tj 3.8 0 Td <1D> Tj 7.1 0 Td <21> Tj 4.4 0 Td <04> Tj 3.7 0 Td <1A> Tj ET Q q 0 0 0 rg BT 90 559.9 Td /F2 12 Tf <13> Tj 7.7 0 Td <03> Tj 6.9 0 Td <19> Tj 4.7 0 Td <15> Tj 10.1 0 Td <1D> Tj 7.1 0 Td <07> Tj 5.6 0 Td <1C> Tj 6.9 0 Td <04> Tj 3.7 0 Td <03> Tj 7 0 Td <1A> Tj 7.1 0 Td <18> Tj 6.1 0 Td <17> Tj 3.7 0 Td <03> Tj 7 0 Td <07> Tj 5.7 0 Td <27> Tj ET Q Q endstream endobj 22 0 obj 6201 endobj 24 0 obj << /Type /Page /Parent 23 0 R /MediaBox [ 0 0 612 792 ] /Contents 1 0 R >> endobj 25 0 obj << /Type /Page /Parent 23 0 R /MediaBox [ 0 0 612 792 ] /Contents 3 0 R >> endobj 26 0 obj << /Type /Page /Parent 23 0 R /MediaBox [ 0 0 612 792 ] /Contents 5 0 R >> endobj 27 0 obj << /Type /Page /Parent 23 0 R /MediaBox [ 0 0 612 792 ] /Contents 8 0 R >> endobj 28 0 obj << /Type /Page /Parent 23 0 R /MediaBox [ 0 0 612 792 ] /Contents 11 0 R >> endobj 29 0 obj << /Type /Page /Parent 23 0 R /MediaBox [ 0 0 612 792 ] /Contents 14 0 R >> endobj 30 0 obj << /Type /Page /Parent 23 0 R /MediaBox [ 0 0 612 792 ] /Contents 17 0 R >> endobj 31 0 obj << /Type /Page /Parent 23 0 R /MediaBox [ 0 0 612 792 ] /Contents 19 0 R >> endobj 32 0 obj << /Type /Page /Parent 23 0 R /MediaBox [ 0 0 612 792 ] /Contents 21 0 R >> endobj 33 0 obj << /Length 34 0 R /Filter /FlateDecode /Length1 24976 >> stream xœÕ¼ |TÕ½(¼Ö^{Ïì=Ï=ïdB’7!‰‰‚ 1 È£H3I&¯ yDP"Š€ µ”¶ÔB¤jñˆQUk¨Çjk[±J/ÒžsÐãÁdsÿkí™$ µ~÷ûîﻗɬ½öZÿõ?Ö^¡«£;ˆLh#"È_×ZÓ¾­á‘-¡7Âöº5]ʥ兠ýGøì®ooh}óó»>@ˆtÁ˜m -½õwÿ¼¨!n'Ú¬ üÛî*¡iŸÒŽFè¨WÛôÝ}(µ±µkm¥;kÜÏxJK¸®æW_Ù.!4=Ïh­YÛþa5›þ%Ü+m5­Á!Ô¾¡›cJø¢=ÜÙµ e]Aè;2}ÞÞl/ÖueÂ}BÂmЇá¢ÿLÐÔÑ{Žð‚N/J£Él±Ê6»Ãér{bb½qã╤ä”Ô´ôŒñ™&ú&eeçÜ›wcþä)S ¦Ý4ýæ3ý…³fÏ)*ž‹þ¯ý‡ ¨qèz®ßBk!jB«ÑftÚ£u¬ÿE^¤ô¼'б¿E'p&Œãè…³ ‡Nœz½‡ïF‡ðÛh=Ú:©V¡xlÞ\šP­ð6»þ޾ÃV¦}MÂÛ:'¬Ôt>Ðiý8WjR—…>BæAï&ÔÄWÕÁ®9Œ>Ž[ëGèEorßá2ù |Ö¡k¼ ð ›ßzÀt|8Š?9Ð3+¼ˆæëçëLX§_ªàé:’‡÷ëâQ5ZOªBôí@eø]X9ÑÓ:'F>EàÒJþ[–*ÿº,i’ïš[EÖ+¨|ÀÜ«œ¸r¥|)',Æ 4q€OKùÓ?zø§I¾åK•׊æD UϾʥФwÐ ýEs&Q9Õ«{øzáx=òúMü«H÷*…•²Ï^¸Ég/œ½ã°%ÙÒ’lIõ<ê$qC«{ô–/ÿ£C— 6çû›r²¢uþ8I0’°¾ÖŒÃÈ`y«Î’*šl(UÇÉòÙÁsCƒçä‹òÅPöÅÜKêôÁܼ`@ªZú’‘`ÉH¾rzªmÊÔeÇmx%<4V-0U­ #®œÖF ?á7fÛªm;mm§lÂʤü<[’+MÉO²å¹ðæSjÉ:!kZrª‰¿tW«Ïej¢~bÊ•ø÷ù ‹ºýÉ›Îdvr›¤sŸªyäóć§Y|r†)Û+_ºpîÒ¹¡éçmøº+_̵À¿† æeÈ{‘7‚ü“ââ8о‹=f˜{é0öS“ò-8%9=ŸáëtçåN†&÷6^zTÝŸ÷Xó?<ŒW­êÛxÏA>chvÓóMá×Þå š‡:sÿó?ÃQÙK@—(•ù8ÑՇć…¦˜è»öí¦êq¢äò¢8ìµN4ä‚(߉žºpAVAö‚¿]‰÷Çoˆ'o¡·ð[Ü[®·â„•À÷$ÃhJÅå߈òr‘> Ú:=¿dè“Çíýnânßg/žW?Æî?ÿ;æÎêvmÙð€Ì!ñÝ÷7¬?6€óÔ!|£úîϾpòд+àé…÷AK8dGùoAA'pÌét‚ÝÆÉ`e]2âô¢Ë¢Þ£‰3Ë¢¨/åt–0’M"áúZ±ÉV‹Ù(êaFf‡DòÙ7lžÐôs<@*:¯—…Ï<¹zá3ú#‹ŸÑ{=ëŠÜ,K>>ÞŽñJ¿y¼0^7Þ<Þâ³M´ë€ÎÏÃp òHÚÏ¥ª‡çÝÍ9ĹþÓáõÃÛ×ââ¹W¾Šoš/?ÔÔ„ç©'¨/¹I]Ÿ٘P Zì÷ad‹'f~·T,9¡O1ìvn÷V+wY¤&úÞëÉO²øâe”aÎI¥’Ê=—{é‚ ú&_¸â}£Vôä<¹!m iÊ¿1„’:äšórí.'J•Áô+zpûŽ]»vlðÄ84ù‡ë¿ürpÝ'>ÿ7/túµ?ðû?þâ©æÃUê/._V_[Pãš›AWçCœÿ-àƒò'‹’CÀÈÚgC‚{»Yê³0Dn’}v1Ãä³äÄÊ—Î]È=wö‚܆ÃxŸÚ¨îRPAäƒ €ÁTêŸ(Å]ö '˜hÍìBÁô 1NT¤ø”LJÑé¼:“Ó€ìÜDùÒà©øàŸ†!8„W˜H r“#¼Ð»á7ŸÄLßu )ù#BŸòj÷»·½ÿÅ‘'^W?Q¿ìþ°­ÝpôчŸxz`Uî±c÷oÞü¹]ØãËzáG›ŸR¼ïþä׿æáäûw?±à©ú]ܽmãÀÉÕàÅcÁ‹‹ ³ýI(ìºÛ¤[j=†°¤Ç.+“‚x‹Ý,¥º‘͘DC'ø2Àÿ/ü!îþábÎñUq˜ Á$¬q.T¤°ø}‹8ðú¥Úsò$wæX§^þ£úê'Ü—ßÛ÷ðÁË{šÔüÑ‹§Ï ÿžÙ ÅìÃÌ…nöÇ2¬ HÃ*‚ÅÈMƒ9 ELúBnŽ_Êñ,òlôô{x¼2-OaúŸÁI»Ã—Ÿ¢þBýàY†Q¾ SËÕ Mx!ž ×< 'uú=õ ÚRßÕQH}H=ÉäDV3êâÞ 2÷Øœf“°G'Z 2¶ãAÖ£¢¦œú‚ ®±ØPl,6;‹]p-ÅFð ÒNÌ2Ÿ|<k’ƺöæ÷Ïc‹úË“º™ wÝŒ_Þ³ñ‘{wàWcCÁô?Ÿy_}ËÏN¨‡Zñàž¯îÝ{ä>ê‚–öÑOýiD¿ÖÔÉ]Ö 3 nª5U+ñ6΀<:)Áf°r p¤8G¬‡i¦zÎ^ evÔñ­X0`eœÂܸŨ_0`‡í!óŸ ¤ùÏt+±òVÁª³ê­¢5ÖêµÆYÇYã­ &+²âD”ÕI6Ö­D “Cˉ4 nkDóm¼n¸êÆmKþǨ_A ÿ¶zµôý=òãþå[ó—oR«RSÕKŸ~¦þÕùûöüê¥3oùgs©^Ý<9u@FsýiI‚ÍEPÂn1f·÷‘Õ¨ÏR-n·ÇyùÎç²AV™“<©‚£öÞÇ7¤€ÖOa9ߨx A ‰ç® WÅku/E#y“àon ؇›pw$Ÿ^¹¬ð‹q˜ø—á~[-qã8/ê·Z-F'õ[¬±_/­8C1ÁŽÓÏà8\*ÆsV/âÜ.ïN0áúŒüû#ñœËbD=ä¢Õä™ä2‘x‰Ô†<Lî )ö@Šò‹ø¶«R/–gi¹½³||Ћ4ïÒ[hÞµÜ#/Ã!¼óz«KÎ2u Œ– kº¼Wr‹…ra±®\W©_bXblÄ®Z¨ÖôkP^ËÝAîໄ.]¯´Ö´ÖÜké¶vËklk¼kâÖŒš!LÁ45H‘´/â¢am2~¶XíìÅçà‰xb?ÞÙ£Ææö…³ëroÓLŸ2û¥'È/››‡Ó¸÷››¿ªº}…l}}ÎM7#-;â/BvÚýYz³ÓËìÙd }Â8»…à>ÃvÙnvŒóé¬>G†yïóê2ËIÐ2%ðAò9šßeO¿xÑ“;DÕÃî)Èy:;qCâ@"M|˜É$À¥™LÞØd'šýh:7U4çÉû~ËÀáC*ß_Ý ÕC©h~¡¥íï ¿ÒÔÄ¡—v=÷3ȃP¤~ø(¢Ù‹üén^ÍŽÝmNÜ­·õ9@³õÕæíœÝç’Iö¡üq^êڴbµÐÕªí—PŠœ²!e …ùÐH}ÃåßhL=iQn¦è|Þ€ºªøù2MIqý‰·ß·k×} âMâ)—/ãÉ«\fÓW¯‡Nýâ¿ÿàϯ+’ÒývâAÿ c¿Ãé0ôK'|Í0à¹4c%6×Oˈ~„¡zpÌp:Lf“lãì3ÌfS©Ã€‰h3S ·òè€Qt:ì²Ùd¤ZN‹s«`qA=¡•@,(7ø•:Z[Œ”ÕnªÚW@+°Ûàu¤bŸa¼#ßl(pÌÁó %Ž[ ·98d9º@[ú÷Ü:¤Ç"g†2Aõ’Π7L:§ƒåÎâ ¹³NÖ{DY”%»ÁiŒ1¹g:3¥tCŠq‚<Á–æHwNC7á™ÜL2“Ÿ)ÌÔÍÔOo’ 7™¦š§Ú§9 œÅ¨‰E(%¦yæyò<Û<û{nh0š#S=~‡Þœ§%GY¤P„ CáXò7yЦê:>EKryMHLùÃ+ªªB^²ú—+ÕOð¹Mê›ÇÔ£jò¿e±m?ï[{ÒŸ«G§NÅw6ÿ¶´ÿ¯Âµø7MW¥V¾<ÚG›ºP‰ßC${Ÿó€lê³ ¢3ûL«Ï–Y˹ܡsgY@É‚:>çøNunæ&ÜpinÂ1&GvŒ”H¯ÎÎΚ=+;{öÿ8:ü×pÂê¬9s²²gÍúj|uÉqðm™è=!ØojÒ “1!‘‹WfMÆR£IIâÝø{è °3Ãý=×AˆÛ3ª'(FSR¼Á!~†UÌp§r“¬¨hË_ÏiNÂÍ`‡.Ð,û‹‹#6¥öŒG™HgiFb†’‘”‘œ‘²Ü°Ü¸Ü´Ü¼IÈ (ªé´Œ~Cã´e•å f3s Ë‘bPL4Gr zAté]bº>]ÌŽÝ»3¶?Ö°l*ÏF«ÊÈÎ’¶“žÿûÇ{/WßX(ît$Ý—²#agúvG5¨)+ ¤IÉfŸ×Š2Œ‚7Ù=!S«Z Ò¤NsÙsêÅ/þ„^)ÝyJ•'„'¬zß7þ4>Í&ƒü 0¨t º=§cNÇžöšé@þHÌpŒÙ6™%E¼|­ôÏþlë=[º:wœ8¤ºù`ó¿ºøæÜÔv—¼ªú©%¿ÿ—ýiM_ø®ûðóÿiêœ_üüÁ<]Ò»)Pûnfæû#q"b< û}^§Þ‰ê«ÿ×£:Û&üÖaÝömÂ:Ûdià’1q}ç³ÇY\}*>*bñÿRO¿$ºû]nI´öËVQ-ý’$:œœÝ5C–­Ö+TŽ¥n«H8³ _ŸnuŒS¦¹ß;‘\«É ³¹õvB>>Cð‘(ì膨|ú´½2¥úJ¶[5bÙZD¤Ö ’ðCwMŽ[iùçÿ^”¬’[ô¸E¯ÕëN3­™î©Öwgžu‰x«µAl°6¸==â÷ëÓb /é!4 &Á¬³ ‹Î*:ŒN½Û.9 £Ãä0Û-²ÅesƸ<îñÒxÃxcº%Ó: ‚ãûD§Ï•éÎŽ›lšlžl)ó®™qÅÒÓóK‘c™´Ô°Ôx«u‰m „¼F©ÞTon°­ r­Æ^ë:ëÝÕqk¥µ†µÆ>y­m­}£ÏµÍ±Í¹ÕµÕ½3nuüŒô¬áYã wø™ÌHi‹&¡Ú®œÞ–ÇÍ: 9>>ý0þÓÓê Þýðð¥}ê™]‡©`‡Œø‘æfõPÓ&üÔfõ7‹l‹¤{ý´Ó¤ÛI7ycˆ×5GòZ'ŒîaPä<©Ä†c9ÈÄFj §ÛÝÞ:‰kܽwïîÝ{÷=ø©ú{þ<ŽU?)þë¹sçÏŸ;÷×:œ‘-Wý%¸7A§hu•¡åø½FIOÂB­´‡‘.U4XMTïÏó!+vÈã’‰úâ3w;ÄGõ¦|ÊîXˆ°ü#ñ&I“ô >eœ5å§{õSÜ&i[¼,ÂŽ¾$øÃ_"ÅpÐÎ ²,9kCÖ@dØÆò™hé{3[œJà1¥Y>Ÿ7t>tziµýžõí­Ñp£º/Z£‘ç‡V|üßéé6Vÿ|pçh¹v¸YÝ)Ö´{^+ÅáƒMæ¬ýN—ÓÒo¶¸àk†Õ¢×^ñÌiáÅá~^‡úã¾f`är»b½\Ü ¡\=âE¯[€@C@P"bŸÍëb¯‚ôP¶™ì¼d÷Œ“Ï~0yDÒ·(ß®íc»ú¦**[º55Ž w\ ü# г¤¡ –¹¨Är+ºU¿Ì²ÔUêõ–FW¯¥×µ m³8 Xâ$"™uV!Vðêâ¼ØËyI¬1Öä5»¬±±±^WÜx”‰}œ¤ÓLãÍ–tkºœnËŒÍôfÄp3¹2“ÌC%x®¥Ø:7n9^Æ-#Ët° ùVËbë÷’Ø%Þ%qM¸‰k" úFc£©‘…­ú¸µèv|;w;¹]×kî±tY»ä.[—s­k»;¶ÛÛwÚªßnÜnÚjÞjÙlÝì¼ÇuOì=Þ{âVPÃrŒ ZFí+²ÂU}¸?¼Cý/ܦº6òé½jËœ¦¾p7~·çAôêQ§@ôš¡žß»ñÉæf‰#S ޏP±?Ãz§m£ùN£^ÚHɇw@’i¦‰V‹bŠÝAÅÙC¼ ƒ³ÈÕ^0}qQ”Ïû&Nô18ðeøWÖ ÏÀêºu*÷7¶-ûä¯UÓsªüÜðMÑzñÔ‹ñhª?ÎÛ†ˆ¼Áp¶™B¤:Áfµ¦Çg EJK !gäÝÛyÏyRN 'ÒWpP‚I¥sù‘’¹"úÒ€ÆáÐ,õµ‹\®ioÅà’>ìì_öákûâ‹¿ýðßrð¶_¿¨iÇñOâïàŸø Õ=\ý)TŠ'ÔŸö? ø½xå#ü:ºñÞé—HTmÒ!d’Yð»táª"/.,˜RV6¥`!{ù1¥¬1W„Ä<à´ïñ¯ ¨ÝèÛV|Arg¶˜±l±˜©EœÈi ˜-9²ÉÈ ¼(qYøR‹‘#Èa•ˆ¶™ôµ9©­™ŒQ;Ä`µëF÷I.ý/ì“$º5ê .ÔŬÌWÄÊ~gæ FÁâå¹D£×’ÆeS-3¹éÆ|ËBc±e)÷c•¥Õ°Üa첸E¬ã‘DIÒõfÑ"ZcÁí¸\+ÆJNHc̱–t”ŽÓ¹t’ɧšÓ-ùÜd²ñFÓs XX7‹óEƹγ¬@+ðRîV²‚_j\fZaYe]%¯²­²¯r¬r®r×£ rAÒÈ7õb½Ô`h0֛栥ÑÚ$7ÙÝ\'Y#t‹ÝÒC·±ÇÔeîµÞ.ßnëu.ûJÝñ‹–.özD=rHíÝÍ%=‹§àªÇðr\ð8>ú ò«YBäLOðÏ~UÀ ŠCÛ ¶ü„½ÙJFÓýŠ%Æ•dJº¬!©:T&Îkwaä±'a—¶ë/hG0@¡¡L”)«/ç¤Ñ'B_*ñô¥$m“G¶Ñqc©¦g¥¿o:UõŒÿáº'~öÀ»\5QÍê²³ÞyúÙ y*ž7ñ¶>z7Íê!Ÿz t1;üspúöx|— îÞ)ƒ³/u9ìzHXjݲ‰à°A4rè‰G´¦Ú<©.›Íœ*¥ùT—¥rIì•ó¹³çÎ] U z¬ðòä^š~q¬Ò·´Ú‡©œÕKëŽ-’^´[í±ú{¢}¼=ÛžéÈtNµÏ´8 œ%úyöEöùŽùÎ¥ú¥öUöåŽåξѶ‡!g~ƒ=Q§ÔEân½St:Òõ©bº#Ý9YŸ'æ;òÅú"qŽ£Ø¹X_%.vT9ú€pÔ9»ôÝb—£Ó¹ÑÛï=æ=åMEˆ¸0 ÓYK@1˜{ ÿŒ3q&¼ïÕSÃ'Nªh‡ŠNRgöÕ{|FóW¨©‰¿ë«¿ñ¶¯îhÒÞ€é¨oC©h‹žÑ “(žõ<)y4ŽðãÂÆ»SaW­Í̇­:}lJ¼Qä /X7R,:!Ö’jR,±N9uœÉfOJy…G«=ZÎÓòîVÛ4†çj/ô ,°aº íæ`·ÛC7 HzzJÊh ÊT--úò¼]ÿÞÓêÁó³Ûk?üíð!(>ÿÝg?îÃ{￯ú÷±cE…ZÔ„ß¿÷–á'›(~ujÿé;÷ìao®æ«çñËè#i§ßDÈK"ìˆH \ šn ÒJhs~ÈnþmK_w=ðjÑs›Ò~òùr€P}å#]-p/µùÓLºX’6¹I…­\­»ÚKRàŒUNµãTÁ†Ø»MPÀ!Vñƒ-i¯@´‚ÿÉĸê8޹¶Ñ\_;$tÜAzHH+ŽdšyÅFo}ëˆOqóN=÷ñÇÏÂ_žT/«¯Àõ9õCCêŸÿügœ@xhªþª›q¸ €ŠÃ@…µû'ÉÔ¾ô²U¶–ÊzlIØ ÔÚ¨iI©z{ªlLÕ[Ífe+—䌔nÑŒW ÆRÙÒÝ'&Óèq‡ãŠ‹EÐã×"W»k£«ß%Œª1Ž{Lƒ¯½†7 ÿÊ™^ëšóSÝz>»¹ùr/ÿׯi¢ï« C¤ï«,è„¿À q"$‡f=$‚žô3D=Å œŽîê—ê‘I¤ùŸ@³$êu5>Y¹ëo²j{Úêµ›¬rt—Uf»¬FebÎÄò‰í7NÆhë‚'SÙ Le'  ÑýÆ®ñ†Lc¦)Óœ™˜©d&e&O• ÓŒÓLÓÌ–‚„i‰Ó”iIÉSSJ %Æù¦ó¼Ä¥$©$y™aÄÐeæeʲ¤eÉMR‹¡ÅØbj67'¶(-I-É¡”u†uÆu¦uæ^˺Äuʺ¤uɽ)SN˜ÈÑ[›çêÛÔ« }mÇ–ž8Ù)SN"ÝfG¶Ø±z2äWä_R·”ót¶R­´+cvÁ™6%ÂѦNOg ‡V^õöŠ»w‘ÿ&}U˜“={ÒQ\ÿÒOæÝ=c•~qÅŠ[GÞf©}Í_­>ô\RÒûÕË×ÝI9õ9‚SÙžÆØÄñ2; {éˆX6ÜØ/¼=ü67"R•º„{—VN¨Õ'Z%LݰÝ,…µö»¨ë5¥Zl*ŸA한|Y·úJäU ;èb®ÓE«í;4?Ú^½|iú¹°Nçr¥L†j5Ú  ‹^ânߢ¾TZt¯ß"ô¹s汿¯(§ßGÿ}¬ø(dšá$p3ÝêŸ/ uÈã°ÖqqF¤çc͜˖˜0.Îëb3Å8l2Ô,`d6Ø 1ôèÐt—&²Q3˜›{–þ‚ Ÿ}rpI"$É‘G’ {¤Ÿûä'±oWÿR…ã§×coÃã!|£úƒ ì>ÛÄöz—°½^7JA•þ‰)z‡‡ e·õ9ÜG¼»åí†jr—ó@*ïó8t.·òã½æ ©ì¨M®vÖæÎGŠªoÞÏþëÑ´‘û•ÐÜŒ?þ[¸@A'ÔñlAA>¿µ™tm1!Su±ÄI{ZÛ"9<ûôªäpòÁdB_==FË6Ên´O™éùJ'§·`2ïóË—?ÿâòå/ö]©iomm¯Ú‹ðýmÐ(÷àùx¾E=¦>¥>­k¦Ûeãžz Ç·×Ö©KÔïÿLýS¸¶Žb¸òé= Ã4TçO6!]Њ‚®Ä–„Þ”`\ÈU®ÜDgw™t’COHÓp§åtìoÑPÌŽÆUÖ韣D‘ý}ä³Çìˆþ­$ÍtÅ<¨È Gÿ€!}«?öO*¯ùËyü›¨^X‚œBšÂ?ê¹mg_½rIHD7‘ߢù‚]†ÏÜqô6|o†Ï¡­Ö5¡ÕÐÞŸ£t,¿éÊe€1Úõº÷P’.€:¹h>‡:Éxþ2¬Ïù÷ ýkh—£Õü:T¯ßƒæs_Àg'º‰ÎåïF±Â€Ÿó·¡Ådàç£mâ W‡VCß|ÝIT­G(ÀÖ\‡þ°¦  ’ˆƒÏ.á]´šdÂØuWnâò€ûùWªxúµîIô(÷$Zí]@æ]9Ïð݉:Ž­‘ÏLø<®» 0Ž¢×€GÉhú·ëqÎÄÝÁýšÌ äI>†òǽ°K8¯û®NÕ/ƒâ‹’$7˜ › 5¾mršæ˜¶™SÌ›ÍÏYr¬S­ë­oZ?“ÿh˳ýŰo²ê(t<ç¼ÏyÞUàªwír}è–Ý]î{ÝöÄyîòìõüÆóy̱öغØßx§z÷~Wב⥤­.K)liQ*è¨N¥"ØìX dŒQ–;j”Ê`G¨¾"ÜZÓv½×l Öt•²nÈyN³§“®+Ô©Ô(]5`kMG³®¿ÓÑñô®±««}ZvvOOOVmôAV]¸õ[m6\j³áÿ)JfƒÙPìh uv†Âmt|c°#ë5tÔ´u>¥¾#¤ëk:‚>¥+¬Ô´õ*íÁŽN˜®íª µ…Ú`:@œŽìj *õá6@¬¦èi‡át@W#@o ÕÛ€­ã“‹éˆäLPj:;Ãu¡XO „ëº[ƒm]5]ŸúPK°SO!² Je¸¾«§¦#˜œÉ0é¶w„ÝuA&ÒBµÝ]A†ÃU|J¨­®¥;@1é u5†»»™ÖPd!:¾Cã&€íî„ñ”ŸÒdT·w×¶„:}cÖðÑ5³ÃJgD£C€j„ük–¦ÈØvÊè®ëØB=áÖ¯O b¨ïîhƒƒlb ¬t†}JgwmS°®‹öhP’©ñ&G˜ÒY±šÚ Ø…Û r $¬ ‡FP ®í»QjÚÛÁÈjj[‚ôF=À¾F05]JcM'@ ¶]ÍXnTÇJw[ ‚ròÕ¾%Y£ñ›%Ûn¡ÖÍDGU£´P/6Ø^S×\Ó¤=¶…G|È·W­«–ÇH[ê5´æ)ŋʪ”ÊEÅU·V)%•JyÅ¢%%sŠæ(É…•pŸìSn-©š·hq•#* ˪–)‹Š•²eÊ‚’²9>¥hiyEQe¥²¨B))-_XR}%e³.žSR6W™óÊU) KJKªhÕ"65ª¤¨’+-ª˜=n g•,,©ZæSŠKªÊ(ÌbZ¨”VT•Ì^¼°°B)_\Q¾¨²`̰e%eŰJQi€f/*_VQ2w^•&UA§O©ª(œSTZX±ÀG1\$W(lH` 0”¢%trå¼Â… •Y%U•UE…¥t,åÎܲE¥”G‹ËæV•,*Sf)…³i¸)³–”ú”9…¥…s‹*G¡Ã"䌲ƒN˜[TVTQ¸Ð§T–Í.¡ àcIEÑì*6xœXÈн¨¬²è–ÅÐã¢K€@æ±%€€Bø™Í0cä—¹NÕ¢ŠªTn-©,ò)…%•…âŠE€.•'Ì 4.~Rá•Eð¥2¢}_×EgGœST¸VR4¾6–éWÑÚº`{ÕkN’9TÍ‹ú˜æjÎÔxn˜¯ÖÇš Ó`_,i^îê ÁqÂÔ€†CTÒœp`M‰ò§Z-LnrÇѨPü»PãH­8ÊÚӿðJ7Ãs›£ ‹é\-<íbO£küã|LnTº-0+0“¦0º›Í£œie}c)ŠÂï¸J75l»}c¤CÛ­LžQY·Ã¨Z»fûþ¾:³RÜu2/Ñ2;áêÕÒÿfª£œÓ°mÑè®k´n”¢ÆÖoµBÔꆦ­lÎèŠö›®ácß”M0¢ŽÁÓÆŒÕcJo˜ÉE“P[;À0E06b¡U‘™55Ì|ĨÆú¥Q.|Ý#´Áø®ˆEt^56j/£\ëÆÎSÝ5iÕF83ªoGBl^Í7È”BÖ|FÓ¢p„ËßVâtL/÷žy ;ëkÜú¦ù”/½#4´2+ 1›Žz6ŠWÄûi=¶”¯1²«}åílgÝ¥†Í‹R`ØR™µáHŒ£5Fú:ÆøÒ¦EšG׸–Gÿ”¦±¾.p•¦Õ09}{ ®^çZ~\7_Dæ-l^è¼zGÄ^­WÁötŽheÔn®"Áˆ¿ ^ÅùFU€ÍO¾NlL¡ûÚt|4ò&_£iší,¼&ÖÔ2ÛÁ·;bQ)¬§¡ëp-ˆÖ2^·E,º.-’Õ0ï™1VöÞßl1ÌÛ+ì»3‚ciÓ?Öºëùqú´›ºšË×ã¬2†{cåøÿÆf;™ÆîQ«‹ZÍ$ZFr‘ŽÈŒ«!¶3Ín†ß ©iñ±ñ÷Ú<ä‡×úÇTÕFl¥+ë¯âÖ‡­TÈ8Ry]J¢Ð®–Îõ´#ºÂ\F_ãÔB6ºøXãKFz4},a´ÎŽðVƒ©é½¦ Çpw6£‘JöXµ(¢S…ŒwWS¡YÅ” M…‘ß³ÇðlTúeéΑõ"¦e_çʭ̋بB&ëÊ.3û-`¾xŒ†Eå¸8¢Ÿ‹F0»š¿Q;ŠŽû6¾Cƒ]ûj Îaú´0‚aå7þ9ÜQÿU1®ŽÕ?]#þûêH>6“ÍPÇæ¢¾1>wlf yã¹llë5ãF{5?­Å¯Ñhl.÷M{ZŽ?š G³͇kµÒØL8Àrv-'ìÉR´8ÉTzØÓÑø®U‡­lÄØú¯“­«QÖ™q-,-Ϭa™]­ó:Üü¦HumÅØÎb¿¶JkwE²J_wd,íﻦJÊúg2ˆÒòÏøßÁäÝ©±BŒÃ4¿ÌŠÀí@Ñzm”'”õìYë5RÕ> mº6/¥?¿Z;¦‘íÛž¶«dÛ½+…mÏ‘mù{·¦ ÷®$÷úù­€×Ö4²e³MØ’@¶œ¸rÚ…ßl#›`éMò/9än7¹k¹ÓH6ÂF•lh‘… ±äŽõáŽ\²ÞBn_gnwuVÒ·‡ôÚÈZéY£=—ÉšîqÂ…t#]0©+tª¤C%«ÛÍÂj•´›I»Ÿ¯'m­3„¶fÒ:ƒ´4›„™´lä›M¤ÙÏ7Á’M—I¨ñ9!¤’Ɔ•Bãs¤q#ßPŸ&4¬$ ~¾>aPð2 H‹Ôª¤F%Õ«²„j•¬Ê"·©d¥J¾³€¬XO–«dÙ²T%·ªdÉsd±J*¤ÂInÉ%勬Bùz²ÈJÊ ý³ÈB#™ %É¢P²‡ÌË%s‰,Ìub;)â BQ,™3Û!Ìi&³gÉÂl™UhfɤÐ/ …Fâ—ˆŸò±’Ÿ¹‡Ìà' 3JÉÍÓÂÍ Èô› Ât'™îço2ivaÚJR0Õ&ØÉT™b&“U’£SÈWÉyáF'ÉË5y’{ƒ$äH®&Ÿ$’“#äÌ!ÙY.!;†dŸæ³ B–‹dmä'IaÒâ›è| ÈD b¢“Lôóõ ’9>GÈ,$ã±ñ9$¾2T’>¤™c„´•$5Å.¤V’˜–b')~>Y$IJŒ´’(‰6A‰!Êi>K´‘Ä|‚$øùø2ÎJâR‰76GðV’X€›CbTâE=*qËÄåt ®fât8§“8ý¼ÃAì0Îþ±{m*‘áKžE¬€¿u±À3‹JÌÀCÌ~Þ¤#ÜýS›‰ÆÖ)@D½MDo#:!WЭ'Ìr ÀøI€r‚+ R >›và‰ÿÇþCÿ#ðÿâúŸ'ÐQï endstream endobj 34 0 obj 15491 endobj 35 0 obj << /Type /FontDescriptor /FontName /CAAAAA+BitstreamVeraSerif-Roman /Flags 4 /FontBBox [ -183 -235 1286 928 ] /ItalicAngle 0 /Ascent 928 /Descent -235 /CapHeight 928 /StemV 80 /FontFile2 33 0 R >> endobj 36 0 obj << /Length 534 /Filter /FlateDecode >> stream xœ]”Mo£0†ïHüÛC<6¦•¢HiÒH9ì‡6Ý@ÀÉ"5€9äß/¼ï´Zí%уgÆóØ0‹Í~»o›Ñ,~]uˆ£95m=ÄkwªhŽñÜ´ibÅÔM5~"þªKÙ§ÉbÊ?ܯc¼ìÛSg–Ë41fñk ¸ŽÃÝ<¬ëîñðÇPÇ¡iÏæá÷æÀG‡[ßÄKlG“¥Éjeêxšk~+ûïå%šÒŸöõÑŒ÷§)ñŸ÷{ðeoUWÇk_Vq(ÛsL“e–­Ìr·[¥IlëÿW Í:žª?å0GÛ):Ër¿šAEp€@ðÉ9À[@`W ‚žŽa/„Àš°¼X`Cp€-{ãÊ7e£;†a›Ш¥OàŠú`S«>oúT³ô) }<>èS 7KŸ‚è`jéžô ¯ú„@}6ú”ú„-@}€>9¢>hTèS`SÑûaŽú°4}g ôÉY@ï½ }<; OŽú;ÐûÁÁ‹ú°4} tàè“£GjNïï£@Áéû†ƒwêƒ}œúpEï‡è#ðqôñ\™}$³èÚÑGØŽúÀÔmF à@}rlêéSà¶½ú ÌÓÇAÛÓÇÁÇÓÇáuñôqhÔ«Ãô~„_ïçW:Ș=_c¢º Ã4!0¢0æ™Ð´ñkŒõ]<ýù M$:endstream endobj 37 0 obj << /Type /Font /Subtype /TrueType /BaseFont /CAAAAA+BitstreamVeraSerif-Roman /FirstChar 0 /LastChar 71 /Widths [ 600 666 644 591 317 722 640 478 636 636 336 636 636 672 801 636 636 640 564 644 640 855 798 319 513 401 596 644 605 602 664 560 948 370 319 640 563 693 765 317 1027 536 1023 752 317 842 875 564 685 734 526 390 390 729 395 310 274 400 511 837 337 511 336 660 640 819 636 636 636 636 872 459 ] /FontDescriptor 35 0 R /ToUnicode 36 0 R >> endobj 38 0 obj << /Length 39 0 R /Filter /FlateDecode /Length1 17448 >> stream xœÝ{ xTÕ¹èÚ³öž÷û‘I†LfO†@^HHD2!$ IH&*šIf’ $™aB‚B1PÅW| ¦^bMÕªWÄh¥jOm=žâi«=j+œ~ç6¥ÚK=VÃæþkí=“‡Ôz¾sÏw¿{³Ù{¯çÿ~­‹ÄH‹FÞŽ^_øÔ=§†Bo!Ę;úcüþch‡öGpé wõþì/{ƒÞköuõ$:w\øÚ¬!‡±;àóìxß…Pó »a`™°KýèÏìîmi2u…þ· wO¨Ã÷Dßè&„\Zè_ßëÛþ×ÃBŸ¬çû|½µ;NgB Üúp(ûå_Ahéd> „whYýãq0ÆÀE~#'}f9¹B©Rk´:½Áh2[¬¶4{z†cF¦3ËÅ»³=èÿï’1ÛÈ®6ôcDP‚ޝƒ™›™vèíç~ÔÆlcÂÚ:t3ºíF†ñt¿‹Ù ×) ïeyYlÁø)€‚P3Ú„v¢ƒÇìÍl'»ídÚ™}Ì>ùW2ÇÎ+Öî„{̵“6SWêDËQ"v÷Ì'ЃŒšû@þ1“ƒºOÜG9£ZÞeô²N†ØK”%T8 Ü»ÀU%`ß»ôúú~”àÞ•[eŸ_+aNζ¡ }ÚĨ™\"ûöÖÁÈáŠ9‰dxØr\³éµµœ£°"–µËJØÙd¥ý:ô>zŽÒ݉î~#:IŸ£_àR¦è'²Éà^Eë×3n¹ž)R €¬Ü‰vÊ:‘ /GQ„¬è99Çbƒ yãˆ,§Æ?â]Ó¿ÙêžS8­ËüjÑ%ø®\ihagp­#\æÎQް9žßþ­ÉßÎ)\ÕмSµ\‚ZÕ¶ÆšZ Iz0 ãUËç»è°Üˆ äðjÙ·‘ümFÉõÊXTtöÜØ|d<7vnlžÅä6å¸MîNGñŒñ Â…þó?Gäyàƒ7—hÅ‚vxç\ …\î2 ùF£Uâ~551ýz¤ÊU˜sxêX”k4˲­ÆKcç‹Ï7Â5-¹XüÜŦŋç½ #÷Gr·f?­P0h½7Ókk°uËö=òAÛ£6…B‘¦˜¥X¤Xdì6Ê×3ëKJKLžR7C6 %¶GG™_àÝ/ËÔ£Âã½/'Ø_~ˆ'_a/K82ÿÊÇø8· ÙÑ-^§]mT¢aVf|T7d ËeÇÒ £âŒ]“n¼´d¬ø­sgßÉŒ_?o<{‘ÒˬÑ4¯Q7ßÔr¥#/@MGéW^¹Æ´èšÖçê3nÍÈÀë- ähs›¬i%Å •èOö¬ÒŸ>ø ¸Élá×…eÞ¥²ïªyåý‡ñ÷ÌõÂs‰Ëñ}Ë×ÝøØÎ¡çA_ÍW>æX°U Ð:ÇkACZùù°6œŽ—Ú®U-5…c—ˆÞÎ/Î{ΘáÍhËÀÌúœâ…&ã,O¶ÜfM³óÈdDnú” ßtã¦M7ß¼Iø½ð*¸hã`– ¯6¿Bâëè«‚ð£ML8¤‚É~)üUøBx—XN‘°Ž«J´Èƒ6y drªÙ#ݰ!;k˜W±6ã¿ëÏt-@Š¥ö%n}©ÓˆŒºkf…ÅÅç‹/¥ÏJ‹A¢(ÕÍ Å™TŠ3ÑLIŠ^•1§È|1ç`øc†¾ü8|pΑËíe+ƒ/¹pá©£§{šÖï _ÂunM“°2A­¢òÌ0pèD o¡ÃªÐÙ<ÌÙWžaÖcf˜;fD¦ë-™+å†R‹QWÍ¢R‡Ü(«È" þ&ìú¢½X ü™)ƒÏ!— ¹PJ’Õ,ÊjÊJL‘k¿kÄ…“&M¹K³‰|™(Ó¤SýÀÌ_½G¶?óüÁË»wV­Ýè¿-KnmþÅÏ.¿›HÈJ÷yBð$xpsx© Õ{ót÷kî5ÜoRܧº÷›î⢦µf}žÒ,·æ›Õ9ø¨,;Íxé|ñÙñ%ç/],VÀC/^@sÂùyÏì.»,åvôvKí[Ûè(W2t’ÌаûÄï„Ç~)¸_¾<þòåû¢-³/‚|(¼ÙrŒÔF4¬¤~§<Ї‡­a§Ñ„–*«äåöb'‘륱so‰Ö=f€,óbêªUŽªFÕo£·åo+ÞV¾­z[­…ÁPÉ9Îm“ÜOÎz’¾€Kën¹©^öþåœoíÞe=Zpý›0&üš™Ëè%ãµü󉣯™7+þüÖØO2FùÂOä—Ýr+xƒÕzs’ÞnÎ0¨¶†‡ .êúRÝpˆâlâ©çÇ—,!&2vžzAÒž+÷ xžò M\¤—#ú'ƒ a'²Æ¡¶`_ë½Á6¦ýA1çPøwÂeÿ.|hX=ó!XùS.ŒˆVÎ2ørþš&f| XŵkAéh­7¥™”* ÆMÜãi‡uªaÓ1zRV‚Œ•f¥Q[ª¯È‹ë>G·èâEjׯ³‹M¢t.G‘£ÜQï¸Õ1àù&Ï\F²V÷d[fk7Éjcß~õrõÃ2vÁßrµ²%Âkk›Þú¡ps‚˜ñ™ÐFUR¶ˆúa.úŽw~Ö,ä2¦é¹YŒkX?ëqeÚ£–¡ô‡™aeXy½‡M+±ËJ³ P§zŒvMqžñÒYÈarD²_?QxXðâ ]ùeÖr[yZ¹½<½ _]`+J+²htúÀk€pdkˆ9™’ú˜Uº`áµ’ªžRàg™Ò”ÞØîƒ‚¼úTß÷žúòò‹[7DÓ7ÝúÖ&ÆÉ¨„û;6¬®oôËî¼<–ØÓÜðÔ÷žyº|ç¶:.dgŸ»üÁ»=€¿‡D£u …Ï Öq roºÛ¾ëö›vhUÛpx†Þ¬u kŽ\7ÃHüƒæíó—΂E c “y™¡Ì¸l[Æ6Ç£™D'rV ýîbÖ.êGf2š‰?pŸ]+ü\„o 5ÌóÌÖÝ ÿøÀ쟟xïܹß|÷Lsò÷13¦“yÜ[!ÜóÒiaTx®WŽ ÷…z 0liŽÊå´Øý.{ÜlÈ›Gx›!ì*àž,•Cž§FY»Üa×ZÕÈl+5tnülR $ãYÂÁYãëÔ¾ˆqY.±Ú¬rEZšÍʺi OK¦ȬÉ| ðŒìú¼ÜÓ}ô±×^~(¼ÞÿåPBóðÞƒGŸ|tÙ‚ûîßw[ÿ^}‚;éñ¼úìžãN×[?xçÃÜ\få]ß=ñÐðÈ–;ö ìÙ¹ 8*‡ ïCðjŸf)ÒY=¬D²C™ƒFí°UyLÏ” ]J£0J‘Åfª€µäìYðê³`]4^‚‡PS+6OJmNïÈ)Åûgç©æ©eëÑYœ )’S¶E|V®ªjXÉh„¿üìrÙ‡ÿîýµÃuœº®6ºs(1þSê4»ð¼ÅB¼²—ì—@»"þµÞt|Re¶²õh•\Wª5Z ¥¦ àÇÏ‹)+û Ø‹Æe/²·Ù÷ÛGì³ÞB±ƒÔÁÊ™”¿^S Õ¯ 3·¼"iˆk^ Á`ß—qJ±ÙˆðsÀsó“·R¯“´kܼJ-SjÖðn>_£åÝló$—ö¤ƒB§f;†l§Ì‡g‡óy[©uÊì%6ˆ=ÊzÛLg=2çS;9;–ôÛÅÔNΟ3þÛE’kMv©pÔÿš úlÍöê4*Z£Ñh5:^…äà@Á££8O•§ÎÓj uyú…ž*O«ªUݪiÕ¶êZõ­®V¾ÕÝšÝêÙ Ú Þ Ù Ý Û ßàÚÀopoÈÞà٫ګޫ٫ݫ۫ßËïuïÍÞë9¤:¤>¤9¤=¤;¤?ÄrÊ>ä9¡:¡>¡9¡=¡;¡?ÁŸpŸÈ>áYÁc‘©$‹M¶RŒ¤äd¸´¦¹˜,F´ò¶Mú;{¢5Á{ÿáþO¾¸åÝ›TCƒ=!oÓ=ï<&\>íøÀÅämÞ¾ªÚ[íÈÉ;tÛ“'\náRo_Õ²…Km9¥ï{ö‰,¢ ’oom8P±×ŽìCXgÒª“øQBâÇRyñäø1N¼O8;ïiC&Aœ4&SI‚{û¬?ü£p^x“YÀ˜C¿‹‡;"÷oߺwãN=SûÜ3Ì,FCe~¾ðë=·¿ùŸ¾=¸E¬®¨}ªÐ|¯Y>¬dѰŒ)EF.å*Ô¢]JVIlRS¤iÓì׌hÀ&sRv(+—Ì/‘Hp€{å‚°˜ý%;|öSï͆]FÊÔêdú]ef¤Ëì»2QfÚ.[tÓjíi£Áb•ÙjÉy%Íi”k°Þˆš!<ÃnÅÆá ó1|Ü™™nO³Yô¥CitÊ‘CY"w˜œÆsp@¢iÏd¶C_2f/‘-–FS§{±Â¨ü£x‹=úT’£ ²’£Í2N§Ôc ²`+²b›ÎfØuF‹Ñj³ÙÒr,9ÖRK©u‰}Iú’Œ%Ž%3–dV§Wg4Yš¬ëÒ×ed¬¶4ˆë9š‹f—Ú©e•3 =1ú’ Ì»#:ËŠM¸²²¢!×(ÌÊŒ~üNfÿÎOâíi¶˜ÕׯèÈaK‰ËûdqRËÐNˆêˆê(-ôf!>Žq•…Äõmªð,«ÚìpÚå(Íc×Úfù@ ¿”Ì?Ïÿå"D=ÜÅÈfEîI4‹DjK2dƒ)1ŸW<~ë¨Ðß>…$ôcæ¦åÆŸ÷'2öõ=ýè]--]]7܀㠗þçÿ‹ÙièæÑ¬,áóÎà¥/ßyêW¿zŠÜ`[ÇÁÒ?ƒZ×…Vxg9Êr«#.·Æ Z9³EµaÞi’©³Ý®2©³2 rž”5çÆH¢1åÒä̵§6’~(SÉ7&ööñß.¾‘±2^áᣭŸÞ¾E~çÞûîÚwgíæ?÷.œš^(Y üû'—„Oró™êûîþñ?¾ñãòe²‰ŒÛ@ÆóAÆäT—í5£¸V7o#§:»Me7ØÈ¡NJêäP—:Ê™ŒSr?ÙÒÚº…Üp˜ù³Žmùp”ûQË{ÌŸýà=a¥Pó^œÙÏl†ën!, Áµ ð‡¿‘âÏA^¯Gk»<ò¸ÁÏša@qÛ¶áY¼:K›¦²EY3Q4×Éq„¨ÉišIŽEi•.Hj~Br²A›] Õ-Ë¿å¼ð%3“10ÅÌaX8.j=4ò·-©Ôñ ¥¥ŒæŸ3Zá.á!!(ø²²egð/àñRhÁã­èïMš]V‹z—JmW­F Æ ªeÄb™l—B©`v!F©TXj­­Nk4É̵:6ߢf°Ò¤“cÙ°EÇ4J«ÅlÔi5j•RA¾ÖlœÞf<÷–‰8zÑ(ÚÁÓSÙæêž¿`h ˆzË êõ"Ë••BÍiÔÚtí,äÁ6ߘoʵ.bâ…ìbí ´‚©Ä•lµòzí èU«6c=ZÏÌÚ£ÓmÎ`؆?¿¹¹s»0zé·ÿYx9&»qûÙ‹ììË×Êj‰ñFÙƒ—;ñ÷Á£_•½€Äš††¸ëD[ÄS-'Z8×ЇZõᩇZz¦e+é©–þÓNµãG–ÿô¡Öô·µ‡ehÚ¡BûåíW;ÕîË­ËÍcÞr¨cgº]ZM–Kæä]î“ÆAnšvбÃfÞF« ­Û©´›m23RZlóg:-È0O¬.Î'« ©¸ UôëÂØÕK‹§QQëò,¹K‘«ÎÕäjsu¹ú\W.ŸëÎÍÎõ”©Ë4eÚ2]™¾ÌUÆ—¹Ë²Ë<-êM‹¶E×¢oqµð-î–ìÏFõFÍFíFÝFýF×F~£{cöFÏIõIÍIíIÝIýI×Iþ¤ûdöIÏõÍíÝý×þŒûLöOù¼‚†‚Ç F X0’¯Ô3'Êü)uÅÌÃÎ_>4Üwê£÷Ÿff3êÛ™œgxÿÝ?ýèŸN o ïÜ+|´’i?~´?r£¿`Ñ5o¼ðÁ Ï=¸¿«s½oÁ¢¿yõw(&VUzØ>˜‚^Oš‘Óh-+í¤Ø<¦ 3Ã8}ek”•¢j]©Á¨¹ÆA¾ü‘ïxö…ÄYœ´£§Ñ F²!òI|NsPCr G²ZÞ?cd†lÊñ‹Ú“u É^z@—Sb¾XÖ²±c';{¼Qü."+H\¾ïõ‡O1ïÓuNÀ¿‡\¡D‹¼ 2ùÞ­ˆ2àú±f$—«ˆqˆÞ©ArûŸ»5Ò,C¿7²¿¿|ð§²–Ë®!¶Šýå—yì‹ÿÈ\ 8†Ç¯ÁJg o–„&F¥±Z-ù­éµ(#.ã¶iwI7ͮԙ &¤fä™ ¥³äû«XéÑ”zÖD’D±E‘)uñBˆQz´Ý[¦VÉ”»tzb—\¡‡W­Rêa9–“z!_´JŽäC| éuPÈY(% ™!UÐr?åŠ4-L) =är$=è Ùn»Š»‰½‰“¯w‹©[%%sæ'ž¸¬}'£c´û˜ýÛ„=4]·É#é$úÒ•e‹ðÕ1ï5ª"ر…ñ·ÓÍr™¥ÏAô$ǪáÉÇuÓ¤öK¡ººp¨¾¾¼Ãuu!<§>¼©®®¯ïòkd >Fô÷©2„=qüVÃ’¿ —’þòïÅÑÒ“¿b¼ò¾°X¡…ú¤!ýþ•îSÜ.8'ý&’ASf²?CŠt#~ÍçÖ¡fî *’ý„Ø ªæ¾Ú8;kf¡k¹"Ô,¿­ãîAûñ&TŽÕ¨šÝ‰ZØQ3m½rævÂ}î6¸Cò¯\XåÜh¼‹`lî!“»„ìòÏÑ:9‹Ú`ïû²Kè% )ÝŽ~Qñ.¸þ"[*;‚nÄï²³Øýì¹"î3ùuò Â¤Ø¨xM‰•íÊ¿ªÚÔ3Õ;ÕÏhôš;5ió´ýÚÖ)%ng¢9DvT‚àãHÖVÀ LgÓ}J&e)ù0P³–ImbQÔÆà;R›…öF©Í!-Ú%µå` wKmš‡ŽIm%Ø÷/¥¶¥£ R[§² Ë„V½˜Ú(µ”«Þ%µeH©>%µ1*V?+µYhÿ›ÔæPº&]jËÑ\Í<©­@mš[¤¶ej^–Ú ã=©­3ÏÒ¼W '"Á®îŸÛ‘ÇÏ›W·'øeÁX4 øz ùš¾Ž¹|EOßHVEùÆ@4éøç¦Öðë߈;—…züWç¿v¢1ÐðEüü¹ó祑5tÉœ«ì Fy‹øü^_d#êœNñÄzÒëŽÅÂeEE›7ožÛžœ˜ÛêýFÌëÔWã^§þÏ’¤SëÔ Ho0 †úÈúî@$øº"¾¾XÀ_ÈwF²±£Ûé ò±ïëKðá@$ Bí1_°/Ø×x:€p²2Öà;C}@˜¯ø Ãr² Ö Ð{‚>jnv5Y‘Àü¼/ u}€÷‡:â½¾˜/Fèé ö¢|.H7ðM¡ÎØf_$G)‰‘?Þ `üA`-Ø( S6òÁ¾Žž¸ŸP²9ëÅc@LoPBDÖGDiØxÖv ùÞå:oï F» 'á($8‹B>UÀê *±? 5!À†‰ c’è(¢Íݡޯn jèŒGúa€nô‡øh¨ÆÛ7:bdD”qOOh3a¨#Ôç>¢eD¡Í0ékõ(¢-QR†ÐŠ"¢â(ÑKxÂÄ9>Úí¶Ú’Ü€`ï›Âi¨,#Â÷†"«2ÎÇá@§ÍM’5u¾×— zCþ`g›¯'æ ëóû)÷¢øyØÊâ=¾EåDƒ]}”®žD¸;J6+õu(Ù‘¤(:“hu~Qh¾ž«ö$阀äõõ$øàSv"ò'Jt-iD‰(‰n’.» ˆÄoEüQ>;åÙwr‚Ï&Λ- ´S+yM{ü‰Àƒ ý¡`Š´À–ø ï ‡ÁÉ|í=2!r°§)¦Ûã»}Q€è›*@7aã~>Þç—HΞ[²E¿^³Qˆ’àÝTuDQ>¾‡Dð™ä°¯c£¯ Xì ¥bÈ77­)¨ p‘žN‘¬•U|u}]3ßT_Ý|CEc_ÓÄ74Ö¯«Y^µœÏ®h‚~v!CMóÊúµÍ<¬h¬¨knåë«ùŠºV~UMÝòB¾ª¥¡±ª©‰¯oäkV7ÔÖTÁXM]eíÚå5u+øe°¯®¾™¯­Y]Ó @›ëéV TMU¶ºª±r%t+–ÕÔÖ4·òÕ5Íuf5­à*›k*×ÖV4ò kꛪÆr[WSWÝXªVW¨²¾¡µ±fÅÊæBØÔ ƒ…|scÅòªÕ« …õÀr#O—Ì*_µŽlnZYQ[Ë/«injn¬ªXMÖ鬨«_Md´¶nyEsM}¿¬ X©XV[%Ò¬TÖVÔ¬.ä—W¬®XQÕ4„,“ؙٰ¢ª®ª±¢¶oj¨ª¬! cMcUe3] ²IÔRr+ë뚪֬…X—D YYEQð¯’RFÙ¯v œæúÆæ)7Ô4Uò5M„„êÆz —èvׂ<‰òê$z‰ŽÈØW­V‘݃˫*j`!ã+k©}Umé„cľ%'ƒ$ ¨b-¤–+0ã}à¾âm‚MƒÑ $F¹©B¡„I ‡¬$a"a”„ð‘ *›ƒQêï{CRþ‹úzìJ­‚˜éëmÑ™S*™Ñ lÙ Æ ¤ð¾8ŒF‚[¥”‘RÖt–éôGÑ0d¬` '1ÖFH^£”û:C‘^‰u*¾ŽXY2–Æø. ÜŒ‡"]sQ% ¡0J  ¢.ÔbˆG¹¨åÁ»*Ûy¨Zäoy´ ÖÄPî êE…0Zƒú`ý\hU ¸x¨ž“°¢´€wöôÃÓ+¿ ‡Gëè ´šh+ˆ:a]àù¿ñzþ¿°ƒPÙC×Zy4èœÜRΔ9ßoʃ´btÄ3½ðŽÀƒWÆWƒŸœû?§IRc]’µÿÝ\än 0{)Ä(“ºêv ; » ÿ…)>‹RzQ#zR°ƒ’T§jÿë¹NJN¤6œ²èØ4«›àh3•Gï7Âô†Nà!B­5J÷L`ôÓ'ÁQHßqú—×à(–Z3ÙŽ ¿!ªQC·ŸR”(-Kyh³´ÓPC4FLèar\šÂW#B¬I²6é/R›&ïã)ß>I[í’d&ìM”Hîó}N d1fD¨…$)S“5 Jo'öܯHëëö¹$R<ôR/ RŸNF6BLŠ~âˆH-‘«’î'[ŸÈy˜be(>º/É•ŸRKtÖ7I"]°ŽpÔ-E&ÅRµ"ц“8¦Ë(úwyšëüS,ÍGõôÍ)˜Šgº<®F[¡¤óº/ø5Q="E ¥«w ÜäH4e•I¿™žER¼ L‘üfÊ•ŸîϾJnÌNñ=}YŸÌ¼ÙÓ,MôÚi¹¦ú~h½qÉ’Zè‡ÙàU¤@[¨¬û$Ã%f2®ÔŽÉºéþzé¦Ñž§ï¨Dc€ZÓß¶‘»«Åq2§«¦Jùj’å'Io²ÿ+>•jC^â&éuI"•DOª‰H;¦B SËÞÏ.Ikb~ì£ò^‡üwD­¿ÍU»ä+1)?vN‘ÖJTEqÕ£:è\õÐkF7@…ÙHçj`Œ‡Ú®fÖAo9Œ.§ú© 3d>›zæ Ð&ëÑZ K„ÑO»FlžöIo¬¯Xdoj¡8ªZ]ÙHa¯†ÑZxWIëÈŽJY }Ò^Hu*⫃]ÍÔ‡È>B‹Hi3ŒO`JU ؤl5ôþJi¶`×Px„þB*)Ò®KÑY-QZAeD ˜•@Q-í‘ѵðn€uMTž”g‘Ú:ÊC5Ì‹¼TQ DMˆU»p“+€®fJÁÔ,­,¤~–Óýë*:*RV/i™´' Ì•d)ÒAä¿.…¹‰ò_ Oùo†‘fª› €Ÿ„›´Âê”­¥üUP9ÔS Ëè‘"‘gmjeã$­TRy½Ê—SLT"MWå$ mªv®fI +(UTRµtuȱ ÖפFD{¬¡¼VJ²aŠv/ÚDí$éVR‰f×Ö*ɦ*¨ì¦r!z¡‚ QÒ³r’Ì&´_'i·2¥ëzje_•Ê Ô«èª ªë¦”ª©ÿ®–(_;ÉÂ’z\+Ùg}в©òMúQrÝ7‰"¬$î©\Ní©V¢°)%¿w"~UAŽë çŸX*~OÍä“+ɉ ur-Z8)æN® Äh¼‚®í¶nbTŒÓbþš8M®å¾î›€XãOTÂÉjDŒáâYir%ì§5»XFSUŠ˜GB©Je3Èïâé°—®˜|þ‹R¼"gqiÇtXb飕Á½Š4¿.SM?1†iî±l¦í˜T¥þâÒZ2¾uÚ)92í”õ÷täåïÉ?Bõ–ÎXA*aR_ΕàFPò¼6!"N:×;MëÖG •¡éu)‘A×$Êý’ÆC´¾˜K¿-þ-ÁlôÉôÿÂL~^ zÏ¿-àŸ¯Â?ð[jü=~³¿q¿~ÿø |öþ‘€_ð+£+¸W¶ãÑøåyøÌvü’Ÿð‹þ~Á€ŸSãÚð³³ð3jüŒ—}úî<ò”ƒÉÂO9ð÷Õqß_„Ÿ„דn|j~BƒOž0q'‹ñ >1ÈŸ‹=˜ÅðÑ0sGøÌøÈ÷ ¸#§ñ÷bNî{x^çñã9¸Çü˜?ªÃ‡9Íð#¯ç9d~(‡{x=~ØË>ÐÊÁ2qfá_¸òŠ÷ {È„jñA/û€ÐàïÀ÷ëð}øÞ{üܽ¾PÜãÇwï×pw[ñ~ ÞïeïºSÇÝeÅwêðwö©¹ïã}j¼×‰‡îØÎ øØqÇvüm Þ…wAgW1¾ý6 w»€oÛdàn³àÁ7(àð²;`Åoÿ–‹Û.ào¹ð¶­§¹mÞšXÏm=·²‰-9\b=NxÙ-9xó"Ü;ú7â8¼â_à˜GÈo2àMƒl84— 84÷ ¸WÀ=F¼qÞ ÆÝîRã./ÛéÆíØ/`ïqûiìÛŽÛ|K^¯1pë|“ ·¶8¹Ö9¸Å‰o(Æë4¸¹ÉÁ5ÀMÜèÀkÒ¸59¸AoäÒp=¼êí¸nu&W·¯®Ñq«3ñj/[kÈäjçãU0½ª_ã×oÇ5:¼r…š[¹¯Pãê*W]Œ«–k¹*®U²\‹+—¥s•ð²t\áÕsÛ±w¡Šóê±w-¿.+?—Âkéz| ¸./¹6[bÆ×–™¹kÓqÙb5WfÆ‹ÕøšEîšíxì^dÀ‹Ù…*¼ÐË–.HçJà*nA:.Q9¹’¸8OÇ x¾ÏÓj¸yY¸hfW´Ïu«¹¹YxN¡‰›sžB.ô²*œ?KÉå;qžçyÙÜÙ&.÷ž c³Mx¶—¥Ä9"ç4žiqs3ó°^gÀìØÍ+9·»Y^‰y/ë‚YW>ö>›ešÃe•a§gnÇ3lØQŒ3Šq:L§ Øž–ÇÙ7â4è¥åa§ælYØšŽ- d‹›a¯y;6K¦9ØÒ1 Øs†L¬7bý «æt_`­k½¬Æ€Õ°T}«œX©°pÊÓXaÁr+·bN9/Ëb3ÇÚ1;ÈbÆÀa3Æ^V-™}Ì ²H™ÿî;™‚ÿ7Ðÿm&~œè_‚R endstream endobj 39 0 obj 10054 endobj 40 0 obj << /Type /FontDescriptor /FontName /BAAAAA+BitstreamVeraSerif-Bold /Flags 4 /FontBBox [ -186 -235 1359 938 ] /ItalicAngle 0 /Ascent 938 /Descent -235 /CapHeight 938 /StemV 80 /FontFile2 38 0 R >> endobj 41 0 obj << /Length 386 /Filter /FlateDecode >> stream xœ]’Ënƒ0E÷Hüƒ—é"Û<)BJI"eчJûÄLR¤b!‹ü}a.‰ªn@Çž¹øà òãîhëAï®5 â\ÛÊQß^!q¢Km}O*QÕf¸#¿LSv¾ŒýÅ­¨9Ús+6ß"ø úÁÝÄb[µ'zâÅ7W‘«íE,¾òKŵë~¨!;ˆÐ÷²LTtž2_ÊîµlHܾ >IΟ=ðÑœ&á£ù >šå$|4zà“¦ ³ÏŠ>1> ŸiðÑè™}X[Î>ØOÌGÁ'â¯àóqÔ|?|j½ÅMßotºtžÓÇH™«sã4ñ8óMóS[zŒ|×vÜ7?~E–ÀÑendstream endobj 42 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BAAAAA+BitstreamVeraSerif-Bold /FirstChar 0 /LastChar 35 /Widths [ 600 914 461 666 699 348 727 709 636 699 526 647 795 695 430 379 562 608 379 581 695 695 695 695 860 727 722 727 695 695 699 744 871 751 581 369 ] /FontDescriptor 40 0 R /ToUnicode 41 0 R >> endobj 43 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 44 0 obj << /Length 45 0 R /Filter /FlateDecode /Length1 1235 /Length2 94464 /Length3 0 >> stream xœ|¹ct&]×5Û¶“ŽmÛ¶}ŶmÛvǶmuرm§ƒÓ÷óê{¿çœ3êGÕžsíµ×š5wÕ¨QäÄŠ*tB¦öÆq{;:&zFn"yK[cWg9{;Y:e€¹+Ñ_†œ\ÕÒÅðoì_BÄ `äbio'jäò—ט‰Lˆ˜Ùˆ˜Y¸Y¸¸YX‰˜™ÿ+ÐÞ‰›ÈÌÉÞøïXÔÞÄÕ`ç¢âêà`c 0U8Û»:™œÿFü­æß—"±wðt²4·p!¢TSÖ ¢¡¡ý„‰‹‹‹ÈØó¿˜¿E8[šÛQü½pØØ;ü³‘Èß迉$v§¿õšþ3CÑÌHÌÔÒåŸF‰(-\\¸ÌŒ1zg3z;€ ÕßrÅìLEìmÿIã óZ¢–N“¿ýx2üߊYÛÙ»Ûyÿlfigú¯ÆL]Ôì,]R¢ÿü‚ùÌàBÄÊÌÈÁÁÌNp$x˜X0ü³¤ª§à_$Ó?°‘©¯·ƒ½‘™‘3À×Ò ð÷ãílä rqrøzÿŸÄÿÁ01™Zš¸Ì-í`þ'û_`öc9#'K"FzFF&"ÆŽÿ¾Òû{/Mííl<ÿ'\ÞÈ@ôoMÿ7-,lÿ7+;3 ;#'ó¿%úo þ«ý¡ŠF–ÿYãÿ$”²3³'bbü6þê÷Ÿ­1¸œœÿú‘ˆòçRý¯þhïbi ¢üçè2²1þ5ÍßÓÿ«£þÿÿã+K"sO g"#SÓÿ0—º‘ ÀšHÜÒÆÒÁÁÞí_¹DþÉôϦ`¢ûggü[…â®66ÿ“ò?Ä$ú«¦=‘,Ñ?zÚ9ý{¼‘­¥çÿËŒ‹ÔüÇæùÿ̤òˆLÄ åbô·%!;s›ÿÁ,Å-=¦Š–.&ÿrÙâjv¦'K;€¢½³å?":&FÆÿ›Tµ°4±¶8;±ý°3ýßE0ˆÙ™Ø›ZÚ™©¸ü5¸‘“éÿÐ&®NNÿ×=ÿ;÷¿Æf–K<&0–ë@B¢¬|(ÎH¦Ÿ*6"ˆðH3,®bn3†V:ÂÐ¥=ÉnoÔÄ5:X’åxNƒ ÷gñ£èm|5ŸT·¼?d  ²•Q>ìÖJ~âÔâ­çý챂£Öýèî‹ú­Ÿjª.¥ƒÀ‚ÿÞÜ®ï·àGV½%uE`•¹w®Ò£¾µÐÁ<úꈨÁÍ)’ÝòÞ¶Z·àã:8n¾šzò´ŸÅ«MÀnÍIš˜!””3¬`p¼XÀ%°ÝƒvÓú¾÷ž‹Þ2âÍÃO†ë ­²…cËdZ³ãŒ)5µú’¼‹Nçû¨°/ûêÑ»èNú~œk€qlH?–Ÿ¬Ä͵œí Y§Ó3â…{<ó†mh$2§„Mⱓ½ýbµvº{^°½ .L}qùc†YõÂóÒ…I² Ên•©Êsœ%‹!N*Ò»žÒï¥yË8_E¦ bž«esh #øðžç<•7c¦´J vÓm†4¶ÆÝ’^€º.=èÄiJC‰_;%XR½ªŒQB?ÚvŠ6Š:MÌÑ툡DkÄÓZáï;GLàÉ•Þ$‡qC†ÅÑy¬xÃÆ»“â±y³œz¹¿¥ï|±Â3‡q»¾I?´´Êß“{U‘¤äâ„R[Ïó>#[9ñI²óUÀùHúöCŠ÷TDÅã’Õt_hЭ€2ú‹Ã¸*|ØÃ¥ìDCÃXfZh(ZàÁ}ßuZ fáeœ³kpp<‡·Dû.èéö=ŸÍ\Ï" FÊ{d@—ÁÔ¬ÂcÊÔä ƒ~Lq&2¼×Jm[eÃøŸJmýˆ£êÈfÌnÈO¼G}G¢~¡úâŸb*–„yQ,Þß"FÒ8ƒ+x¨Œm$I}-ãº5Ç9Þ­8šaމ¬ûûȤ0• YÌñåÈZœn¬/îófsš»àø1«y³µZk˜±ÚØŸ„¢±ðõAQYË1îÆT¢[7u^‚c|B^2Aógu ƒÊÓg_Iu³o…4HÉ Sî®Ö5"÷ÄJŸŸç©£‚·ÒúGÒÌ~)d6åfì:mÜôÌëYrgÖ²ð)a—¼¿mAçÒ¨`°Í®ô÷…ò¥«nYÅI¡â3Ø5^‚4fÝoÉØ' PÑ,Øžâ;Jöºµ°®¹p¦é{µÎ{»Ç{~‚19,‹÷œ%©¹ZDV)¿øg8¥Ânæ] tà †w3ó†ÖU~ñÒíºP:{'ö€2m\òhÒ#_9è@ÇÔøWˆPþ: _âþzŸ»®°ðƒ¶ÃšKø“ýÌPÍP)ɘðÝÍpç›á…šYÓËS€Öâ–kä=üÑbܦ—ÑE.7ˆã¬‡®ƒÑ[“L_[³—^ÿ~¡²~u·äÖ¯AáfÁ€’@:¨êg$cK¨”¾Tp¥¡Â¸˜5kéÛFE‚jê³Z´"Ÿf0<¹>gºKTC™Ê-Âò„XóÎNÒ#gÓÀù‚œðAÝ\Q-‰åðú¡/ Þ“Ì`ºaHÝþ¼î´ž ¯ƒd‰«¿Lâ}Ùn¦2H³œ—×2×9žýÝRýóM- gXÜ[ˆY3ó™ëôåß{7[к¸C±i«~«Ã̼~²™TþÐ4­:­ò›K[m{Ù{z †ÛbŽÝà!‡˜om¬õ j3Ú1mè†ù>6ZXôpÏÚÕ¸ÎÌAt#4²q3ΑÏðµv…îXµ°£?pZ$k¯@2…)'îgë)+ÙJ‰8ŒêǽËq ñ]·ŽNÒÆýªa’œ?ô‡"¶í¤ Ï´<{ª=~¡t¥2 òï©?óU¬BKB«lk• qà ÔŒLlN¨ë×?ÄI÷²EYùý /ê˜qî•lqC¸¹¡4Fš_Þˆd‹ y8ºÙVè‹BÈÌ—¶ª“]ðéq5` éã8°’.¢Kß(Ôþ{è›’üuN‡ÅDùÑ öÛ9øÊ|,0ÜR-ò¼+TòÙæÓÕH·†æä‘åú50kˆ Ñoªgç¾”ž14ñ¹î“rÙD¡üëó½7’›Çà™Ç)<]‘£ ”âFþKk%Ð50Ÿ8ÞäK Le{D”ãr½$BûŒ¸bðÆñ”8»§hBSÍðp¥4r|¢¤!q’=µã¥xïÈŸ!ÃÙ>.Wo!0ÿŠ9®\{ÛÆ¶u z´n÷3\œFŽ’7âü'z;&Ń¢±„ÿŽA-÷û{6³Z»H0•¢¸£³’¸º'ÁÍ4ì1¸8|L–ð GL÷fΪÃy\ì²¼÷´ » ß*…àÇ›y‹HØ•‡óš°Ï–FRR-^=\ƒNÕ©•…Å^¬=:ú˜ÍÓyEþD“ÿ¨{ ´3*gÕs»v함ñ <q!QðñÙcL‰1f¹eû,ˆiÑÎ`ËÆ:™ë P7÷*/`‡j’©]K9 öœì±|}ÿÈàÛs¿“™&“•«ÑµÆˆ-â¬^êøÜS¶ásˆ$¼Áý$ËX“©–3M9^c­ ñ9¯YŽûSŠ6®œòÍ}Tÿõ #M­§ÄÇššÅëÉE‘ùÖ&/@»¨BÄ/ÐÔúënâA&mi¸Q¡´€$‰JôË—CûŽ57âÚ]R—mëpðÂËGÄu£èüÆ Y£?ŠD¶S´gôÇÄüDŠÔ_yÌl{³²@ãÆô†qûŠÄ/2Tת¬ÒWuÙ’—ÞK ó vƒŽ=ãí°ïe4àâ,‘b)ѵã±DÐf¼ൂZjq,¿`5«|òaEä|µŠ ö²ê4„~ŒW,”àx|oÆZ’z] •: Ç7®ÑÁÓÊövl],È á I*¢p_›Í–}*³r†òÓ÷µvü‡ù è0!“¨A·4×YlÆ‹›k¹Ìƒvnƒø%´Öê·ï´ÿ‰#9#dû`™3÷–9H.áq|=ÙT"ïAHh‚~”ú³«]NÆïNoæc¾:ŸZç)yí”m¥$u¥åIÌBu;¼¥®º›ìÕ—‚ LXõzßËñƒâ«½Í“ÇÎ¥OÈJ¬£LºD´²á5 z§©ã¹Hã³Î¯ëu)µ¼ó"M 庲o›'DÝf匋ôÁصïlÒ§l­W¯žÓiá ŽTIÝS¾%¼ÄAžLX×Jq{]fÀ8ú¹y„^z<}Ö¸”•‰Tª nÆ4“š@¡ZµF.Cõæ·¬C«ót Š£‹µÿÏí4Uc"ÏßÌ_WÑ’ë¯:Thp÷eEé:ÓE¾¼Bþ×Ëä.çòÄjW.Æ×wܶpˆÈºrÐ18ÆœÈãmXiúX¥€%µN‘,¨„PÁñ_ÐEšÑ¼»ëf¸¤ƒ—°ƒ„*”†+O 6hÉRð/0çP*«½Â>O ¼Xç?;¿WX¿è.ËjC4—µ9›3»£´ç3„8r|ÐÑÙ9¤ùfV¸} q¶f®ÞŽÚ:5Hâ• •2,óe»ÐD.=‘¬‘fÜi† ÆÓüp.’î¯9Gþȧ¶%{rQ’3œCÿЫ@aK×Òç6žg£—Yd'0Á‡%¬OOÞÕ¿‹öÏ—U—W4GLO¤|”>/r.ðŠOã«8’®”7?áʘç5‡Õºùl©eDó¼ëI,eäâGxû<¬Û†ód+;|EUâ?ØÇUª;Q–HakWÿýP¥hD.ò¥Y‰ _ƒlϦÝãÊÉfÄ_*šåèd™[ã lþãx`µ=^µ;#ò%¼¯Y- ­;  A¯¡Ž”ÄŽÊþ¸\ wÔ`õ¦i˜ó¦¡©ƒÞRàµ×"q~çægK¥ÜÓD’#–,u䓨Ï$“µ}?FNç‹ÁJÿÀô¼ot!Ì]ÆgS‹ºzÄåÖ¼tûˆ¦{Kš¸{6Hi¬*J­8,„#0{ùEOŽ=²¥à¨ÛµþßÍÔÎÁŸ ìHƒnRAR­§+„æ±kF6‰—?Þ‰+ÔéÃ/á£á.=ÕU·ƒ£¿)¤yÓ…ò26Êo÷ ]íwàš“¹òÒ)yK%Û–qO¿$ºæb÷áŽVc”NŒ§K †è ÂÜÉT ôÏFí`”]{’r"8NÐóö…”DAÁ÷JA \fi\Œ«Cë`øŽÜû° !œtUz—ñ}ž€ebȲ #¶:.Ž3NÚÇÙkzvWuà¼^¶ ³Ê®i"3ð°SàÁI:°½Ò„'ˆ„gí¯±´®]K/`›ïÕÄX¹è#8´>p,ÅWB~õû«—”ph&¢Ÿó†²R‡CÚÈÖ{¿fi)_6èÑø-}ƒ´j¾FÝ.k²ÓÈÿA+ª5b]*Öá«r\ãÆ„Á˜ª“K¬Ý`b¨¡ ùà [r,Ä«5ÂÞ7^פ"™€¿)»“#ðrô:ÚCoMü½c>¯5ç›LÛÕŒ (!?‹eá‹epƒ6€F^f9yïµÕPYC§ö€‚1„Y¤v.tƒc­îÚDÚdjö YvŒ3·ƒsIŽ‹cö)Ñ,Æ [+TÃ'¤î›«Êô9éC5>Ä_ gļR²©(Ÿi“7±v r*rAÆÇÊoB×2CQîfYG^ÀZù zÎ?k¥ùëŒnÂÙn•@õG¤Ï£Ó+ȇÛÞ«î Ñwg}Ÿ0gº ÍÍ;îçlÃ0=2h”ñ®~ŠÚo¼jÛi±pFozUÄQ_ûéÞç¿èìåf¨¨„±>i}¹¦ ©eZɆà¤ÅÄž½7#¡™æçÊ"zŸ‰Ëסjªÿ¦×qðÁOeNš÷Í7ÚwOL3Ÿ0¯]0,¼Wõà“ŽöØE!·E?¸MSë¬n´ÎƇtQ;_Ç–¼BæM‹ùÙ¥°fÝýÕIP¸¥›ø›NO¥Žõ]%^×,x6häKåW×Bá¦-l0†*+ìO\0ü¼Öæ2Š{NTó=A_Ï”ºµ_,ÑYÖµ°mõ!ŽÇ1vóÃžé ½§U“;T¥Þ“ºvT(Ĩ‹uEÔTÁU ô59„ÅÈK>ÛN­µ9î®ÕÅ8|`IbÕ… f´ OΊì‡+Lc|˜žfÃ<²à»Ë E‘Óâ…óxª'ú8þkÆDtdÆÏ–.^õÕ Ñgûï -Â}iiu9tï÷hþåv!QN‹ì¸§^Œì ÄÜÕkÒÜÁzuÒØX¶#Þ›¡$ „›_}MºOl¶oždY‰…÷z¥àPi²Zm¬ãžßK7à´*#!¯Y‰]"3¯÷]c ~Ï€Ô¯\«=ÅH’9PD’j¸oYHSl¼×“*õ{så`Há΋º5 È4¦¬U†óÒq‡8µ³³9üY>½XzÂÒ.9ý$oу×oGÅUm†ÒÂr¢^›#”ì傃°µúQゆœC©`¹ŒT5r(ãaF–i;FÚõðv‘zg_OžÁ©§aäîò.½+ž&Î'Å’F½iE‹?0ˆ˜#°ªxµòãüNM™xÀ…sÐ/P†zԿ̦{·’aTnB–ÁÝÔƒb½Ïpß^ò8$¬‚Yy…˜sÉ<Âít{un×ìàÇzÁ®ô5ƱM•ÖନšÉË•lß›¶Ùûê‰ 9°DAcÎ ¼Ýú_š³~çP$ÈÏH6èmÜ–2nÁ"î(TÜ£órÃpÓ~[ùÑL=pƒˆµŠCªþ÷G¯Nú› Øj6‹¿Ö-ºÝCDE¹hì-yéHºzãS }“R«Z ²žäÒá[©ŽÀ ª]Ù´mïúÐýîaŒ¿^¬ÿ:#(ö…VfÞ äg“a´ÿÁßɽÖûG’*y¬}Üîü‹Ú@KÌ"ÈÏ7–-,C_ïu+-×NþfTmxCËß6Z”)”Ÿ3NÉÎW±$Õì_ÑN”þpŒÍj TqνÒÂæ¾Ø8y_Äöƨµú&¡ LÔ¼Òp?/½=RüÓí×åLrOýOs /»'VÏyÖ_¦×Çþì58fã0²RjSÒš0‡÷,Í Ž%,] ò³}¬£Å͸+<0Å•. $&-eÛ"eU¥gXë&$®SY•Bs¡LÌœ‡U39àsEŠ?ÔPõÒ˜Ì+¼‡c,ÈZ³ ïl>ÖçUÝ+‚ ȵ¼´9Žm>oLÛO,y§È&Ñ:þÔ0º\†ßWÞ„:r'fd­KÞÑ.-RBdôvAèèžw®Ôµ G—ëeÒtW©9œš3U²oåëuÂD Ä÷xÝG½ß##5^ƒ$ZLÌ3 óͲ/ý|¿`áp~µd_ÞT:µ&´×DýF‘Û”ð«ê‡Ì#¥"ÜA¤<‘|›¯D¸>>·ÖU·WÅ%À·&1Û~•—Fà;@“Ïšµ9m÷[Y=¢–ÂÑPöE0gõ}ÍÇ,€k€NKÈãög9W¶vIÉî­Í*ÆŒ`[gE¦9Ýiüfˆƒ€©c×KĵØ['/Æ">ÊæT¡s¦A鄱ý•I·“ÓÍgol&RB:GM¢_E-r2<ÇLÇ|ý›ï›>'%жK£„ÁŒ">r¨ÕxÐ(…·æ‰+³…§S¹Gì»p5ÎHÀ‚´ \­ûóLׇ­sj`*h)Èf î¶T¯bJב:ªc£Âj¿çÔ÷~)ùñãn5îs׉°-z‘[2ì½7Á¾ï3A´¿]â³£n/ì4qâ§[.3N"ï·ÒÐÙ¶Ð>Šyc’<¿E*ËMT2Ïn·þÆÈÚ!‹bë:NÅHv*b³“¡ˆJù«?ž÷Ž×eÐ>f"¼ïyÁðfûÆ´éoQø£º„ËÅW"ZÑ=­0›Øsâ©T^!$šñ=T~ª']IëÒv ¿oO"õ‹•lõÃ:.‰KUh‰s˜ß^Új ¹‚b/{á;±K#Ã]Cai>œ‰ܱ$‡¡Ò?d]¼­[쯪d·wI}ùÃyí{U067ßÓ¬Å5`ûx¦ÏA*;eD¬SMMw寑‚•äy Y€©ûòóöu®êEÅÎíñøžñÂù^‰ódBŒJ°Àל–\Ü]—g.®úÑI÷Ðpõ¢‡qÌû‡UÑñaGVᜋ-KŠan‚2k£ëxs« õÞe£†Šz(m‹.غ³ô…‡ó¸U¯»íE›5GlÈkzˆ³„;×}ÊmËŠkYѰ†Ç¡ìF[@„ÆDÑ™ý3¬iÃSjܪÃfÖ„èÝ™–:Õ·Àí6Om‘/ñŽê™jeër’Ϙ™’‚Mä óþtGn3]T[ë.¤ÇOüྦzÃÔLŽ®E…›c¶cM['³¨rNty ½}RźÈÉ•ŸÑ§_ ÈXtgÌÀŒFŠ'p@Z0Ö–´ •f5Gw_†ôÁ´…>væ·SlO8ûŒ7ýÜšüÈ_)u ¹¥›)¢nÄ7°ENŸl¾)—O´®.RÓ'ؿڜIÿ²}jlЄé#L!㓸0|·LËU®ñ1[¤6YK!¯+çDÕÃQ0d¬)ƒaáÍͬFa†·~Z¾qçVM”yæI0ûˆÑ!Æ üLÇ.r k')®Wÿ̈ZÀÕÈQ9ö=ÄÜX£ÈÌ%æù¦;T–?¢$øBÈèC7î©m§‰˜EÅù¡éÚáéoæôø‡¬ö;›9)ªÆs`ãÝ%”ÄÍL—+6à /_„ùÖô¬”´£h½+gcüÖ™ûÍêO`íÿ\ñö˜°Î’tÕÈc§G— ÀêñÒE§LãÙyŸå¸ô¡½Ädy•UŸ1tðû‘§™VʨÿGI”NRªçoªµ±‘ƒÜ–FÚH‰ýÃzSÄcÿCWM_¹ýG£i­…Ë¥ÑEFÛ6…RŽ:^R²ë‹ ~r ”°!÷2„š%ÇúúHÂ$vø ñ?ð¹?æ ”(÷B ¦¾ƒ3ð•÷jõácªÄÀ‡QKAúê¦PyL˜fÑ’·2jÑ«kø=µ3ÙûÍvLš¡h8Æ °23¿„X°Ï}çÖN÷*Q1QÝ~û#®UQªû¹Óµ‰”«òÍ?¤—Ï+&ŽÊÒ;§Ÿ'ötQé †Ä뉕xW:ëv­Ù²ÿ4e0€ lET©±?êRÀö$ì_õbÃu×ÏvÚ›â’Iû\IÔÕ›jÐõ+lU9Izæ_Á`‹Ëe6£z2äŒJ¸oÕÒ˜zîØ8±p™$wÑUM© ëéxó-ÒT~Ã]Éò1àkt'Ý?xïÄØês•VŠ<à¦PÚ<½Ä€Æø¨ÎW„_¼Mb¥)”rb™&X_Ùao/C”‰ #¦0~"„Ú®Év}œ¼eŒ†½cd¤~àÑc p`J’=å_SÐâOåv ®iK)jPMÇîOÉÎ4¿Fn ãqeéÈ ¿¨Ü Ô(>Á~›<ïÙXc?ÆÄ+ͱ›ã¶Ñ;oŽõå"ÞÕ-' Æ×½°Þ4Ÿœn¢º>†¾ÙÍ©ôo•¡‹‡ûÝ…(›z@DŒ¥ ȧæ uÛo ö’K®Ã™õ99n*™ žUÀ#羈´ÂΖµg|G-¹„ðs·š&Z˜¥‹˜mTË÷u—àΠzi÷*Áj²åø1¬Ê>¿h<íº½»ìÕéÂÙë~ôLýîÖP<žûŠ˜*ùš­{0JXIE‡E\2Fœ±mÚΨtßàœE7(ÖbtÏöh5±ÒOÿø%UH$Äùæ`åÿ2>œ/ëãGÍㄱƒÀuKñI¦ ³Š§ký~¨¡—+ëØËgøqÖ¯–ëÚ ìdžsBå¾q•|szÎRý TØh°>ü~8•·ìž^½[8°áZ¦Òø”"J»Oh.Ž „–ë¾ÜìDu¤Ëî¥Ò Óí QPJ¨+’c¥Z]QŠú Ü()æ@JW¼#¾]Œ_  \VMAùÜ~ýWFÑJ!:Œ«GÛ[#{¼&<1ÒÐBgpíL¸WžŸÏÚ,¹à3!v=«qÓ  ž/] ûí7”žaCì÷”ïÓÙÊz‰ïDsi‡k> (H*—±ÐT˜çŒ<{í½éÑ$–”Ri°UÔKCâþÈ{I¹zàGþ&·Èõy¸\²£œå8¯Vm+asX6_;“r±P·¾btŠŸ×”†È´A°CzÂ`úº×=Èâ뜂îuÓꈅ u8 *ÃÎcØš·ÒͤL¬TFBžÀžÀÜ! ¿b­c€~ðˆÜÒ»šN [ñ‰¡B1Õ¬7ö:“êKÌÛJ¹°<ëîÐVCÊQê^ç4ÞyŸf—^Ààž™RLŠ¢íÂï´N˜ªª"žiNxàý¢VC€¥°A©änhq¶øƒ¡òÂQú1¯žÎ•”\&SÖl2N$bül,¯$ø;”Q\µa·Í|yï÷&u{÷îjYEt¥”ï$ά 2xå[²-¤×ãB½ž¼9ÄÈœ%óÈw€T¥:±2?La(dh_ _9ú„kUpÍ\f£ˆœ“ï´URök&>¡ì› g(¼R¿rçï`±fž\Ì>™ÞízAOGZþã¿ò7‹‹æ`¾õ°‰õð=aN01©JR~tôÿhÜÝ£¼ÀNq6ÒWh§ÒôdÀ§·¾Ú¦Zgr:}©¯-}wOfÈó'è‹õ4z‘%.þ±6st~ïÅhNÕÌn[ !p¿™ÎW[(ƈêɪSá!Ù}¨Ú>ß-äh” 0\’#,u¹gÑ=|9Ãc¿é¥V~3'\¯™rÝBêEA!Ív×zjq{ÊÓbµ6>¸´Þ Y(†ß.N4»‡ûk*ö§Ÿ’ÿ« 3e@'91hîºx‚§¿&YF{ 3ä=§ª(õ–3Û}ÎC šáͬÙ@š"U*týÈ>fæESnBµéÛ8­˜ž²­·­ÖA¸¥O±ã­1òâ&œ0(G–B„•‰ShVܧ#˜NwÆ@ùGWÁ>"¸ä¦5 %¹äÖîâb1ãAD)¥@ÉYôò#Àñò:„$A€ØÛúÓÇ^÷Þ¡W³kÚà Í%å&io;ì.Ï$PoSßZ.g7å!‘3Op>÷‚Ü^Ósm³`yãòé_ïrÃì‰èunýwÉZ bjH£2¤i³z?š—1CY,äÉÀ+³Tú»3.œ>£» [Ø!<»(!vò¤¸àÓ§Ö'ûtQ¯´IUN]›“ÆOáæ´?Ä>J÷¶®8ÚfM€íÖ‘úÖ»XÄhúOÑGÄáy·ÕqÜÛsdI‹C‡òN8ì¸!ÎR‚¿" 5è²Ý•O}-æìp< Pnž”pœÄf~q‚Äx£ùâ¨ãy¨cø_¡ûž"½,)"ýcÒ˜ð°µóú$¡û•ƒHÀ#&ím4aÑ¡ƒ‘zÕù¦Ÿ¬?ªÒZ€Î,亓¼„¸Èm WÀƒTr¨ ´ ~²z—ß ›o¶ÇvPEuEºj^e¥§V££À*Àþ¨EçSÛq&¥gœóÒËIÔ½ZºUwbúˆáŒ â~U Ÿ%¥Ýüݤ†/;i: ¬½#̺ªŸC°È1õz«IeËï&Éè‹ØQwÃË!ÂåO­Ä¼f:¿£{ÐÇ’€õå²½­n¿®Þ0ˆ£‰çL¢³–™µ—!×ã‰9l>’7ˆ×e!c~¤vÊT®ewøŽ ~ þÅý~× ¢ð±áº¥úô¾èˆ¶e%0gÛéysia±ûvn8X]s•®¡æÖ÷gíó“žÐõîf²ìãN¿ÃÍïàîNíSî±'­N­xfãZJZgûylç:ªLJ3^ÄA¸a²"ï †Né ùüÖ«JÊß7¬iÀæZEÚ¹·A–FÛìÓkŸi4Ìg¿1‘…CÒ”EfJ%mÕMo%\ƒgâ*dÀñó³W“eæ#²Ej²² VøñWAÂæÆ“uêçÈ;§Þ½AL52–9Õ:{Õ%¸±ë¤vøÎò>uÒ°™ièÄjs¥³«2»¼E2DuHF\’•ý¤Ê]¯5•pº¹ïëzýæ$T¥·½&ƒá[Ý¢^@X3´@>Gð™xA¤‹µt$2ÄÔzxwù골(¦k{1,sˆs®ß¨Ë溫[°@µ¹øá(˜‘]À’†ûîŽú®'©v4ï ‹å­ »Ù¸å8bÅ:Ü÷«€÷.¿ÌϫƎGë Âqµ;BÉiÛÙF¤çÁü1“Ø€Íܤ¶Ý¬y¾þä‹£$üѽ‡îÄgãF†rI:ô Ù1˜Ù‡iADòr`ã¥AZîÚ•PD­øÀ¥b>¥„*•»Dïq`DÏUÒ¾K7Øgþç¤ò§¦=‘ÉÑlcF¦€LÜÖQ'¿&¼å؆uÀj¢‡7|¿© cÇÆ+©û¾YoY26Á-~·ú›‘5¨ÈÏ!`sÍGn–ê©õÍTTO_¾[âÊä+ÒbXôëö^¼؋I^!w“š¬h›K±¯¡ªu2íÇ#|ïn @ðFèfŸ»6ø¬«Ön8c!r„þ–Bj/5³°`¾Ëf€Œj¼áLªŠÙu!‹†q)`n1e›…³±.ֲȀ­OWÛì™_¦À4?Ï¥ÓÁk[QVU^º6£ŽK$0“PÀBˆ›K÷*–ÂP/AiÆ_ÝOœyím ÛÚjU_üQ›ÞÙëOÃÄ¡-KyKÁ³Éz­X¨’c¥`açËj+›z–OáS–L*“‰Fô:>JaÒìõuõ7_;b9Nå£ÉÎmÓ%´ÉOEú±@hÇ/Ùþ wkÍíÎÚÁ\ç>Òê6ÖóG†‰d?q²!@du‹ý–C¤¿„Fò$w¬Õ%/›h#ûg™zÂs¹ô4^3s‰f¬{šN[?w©µÖ¯7­w}ýu\R¶¿Lzvʆï;+Ú»Lбšåª’´çfQ}˜ 'ìH`¿ðT´'©f©$Ïc¡ú~ð£xj‰”™¼äUæê¨l|œUì2u¥%—"ÿA)·ôóø nÿR5zê¾°PI4}êìƒCì »ú2V+üû¤¡£èp=œt0A@_ßÍM; À1 ñ øupö+k°Ÿbn44¨×]»Jži›˜fíömØÅ8ì?ÑמLFu]“X»,™V-¡™#ƒu6­îŸ·x® &˜œ„ëí—4ž©óŒÉZ}~&ªvø¡=\6¢@'r­¯×ëH›‚3»»„Ô8 }`Ö@Åc^Ø@ÐŒX!ûÀÎíÄ7‰lF™ 4·ö“‡¦^o¸ÏšÅ²Ñ¦X›‘æhÉq]‹Y®Öûd³3E±¨s>-åH.|C¥_EÜžJ}qBââ[ΩŸ1vÜìýqz ¦ê·:Ø<تÁí…©æ2ñ$ò`L[p_c±«§Er†sF{:ýÚ‰GÞ[dÞ8Ö‡t°ƒ¾ Õ,ÿÕoˆ{†›â¨ìÇz~‰œP—©çüM´´’eû”ð©§(5…œñÅšš3~“¥¯\Ų¬ƒ¸„œ‚_$»&ÍÑøçU/‰s¿W!^EãÌþ„JüúdòSË…QnÔµ»¥lG¥ª&9îBÒÇŸØmC‘@;{—Û1 äÝvæ+dx¼&&Œ ሙq…‰²£ñ>÷[Ô)ZÜÝ,ã˜Nw ã€'5 D?‚Œ‹šQ3<‡/ä-‰×WxUÈp/ýµFãGá›ã_!Ä]I¿ä¬ì‘ä™ñ¼„ž¢¦ÀÔ0­ „…üìÏì#>l=–Ä MW´õ¹Î¯rL76ÑnØf‹y ,ŠÖ§r?ij>pr».m[¦Šu#P©Í#.²·±alyÔ€‹ËK·&±6ÁL6‡ñù !3Õ¦æ«ã¸¸÷Yš¼ Ïëâ¤aKçiÝh2œdîÏ¿=öhÞ›_ö½wª«{ÞcÔ§"!çú5B£&dM@Þ/®Q9_”ƒ¾z§‚ÒÜ‘}Իت²Ïž’|æ?R=¤á21gCN2a3«ó-êŒ —\¹ <ÿŽªÍÂÎÈnz Ã>òPd;'„µ*0Ÿf¢©åS£Ž…(h¦M‚‰«KE¶/t,$ÏÑ @.‡n¡qH^ }ä§?ç¡Àq©â †í6b}„÷D7¥N9 Pÿ|™8 SÖXT5áéI%²rÕòhHf‰ÛŸJ)±(ö„ÝŸA…ú°j绦c©Þ{\s PoÕ~¢ý©ƒott ‹#eê¿@Mñ¯pFö)Îqaöd²¥5.~îç.?î;رD¾ºÄb•Ú*\V¹Mi8©¾dNÊ×ͲrXqº½Ñ Í¤•å]òá‚ûR?‘QÒv·ˆa!„zC—ÇðÕÅBçR5$ *¢]ÞgáÏ@6­mµöFN;²@΋ܒÊOø”§â4²\xnZÞ` ¹gÀjW|(¸¸|}ÊĦ`SŒG®¥Ø©#Tü‹ü¨C‚‰´Cð&º¶8_%(ú­çìž›(¼@Œ G>Nõbï³Îlìnƒqu׿œGꥧ áŸ~ÿèÑòXZušji/¦±–Ù\ƒÝ?L1?Ÿ}/z ‚†jgÅ;íÜ¢ßÜP*=©bQÀe'¶ÇC) >ªã®²±ôZÑÓÜÞäþƒÌÖ§>$ØæP"Ñä¢×ìBKQqyPÎR¬pSjô©G=zÚðˆm¤ÄGÌõ0Σn=7û÷cÕUbpŠ)3ÒÓÃ|5kïZ¼È‘Ë!cƒf^Ÿ~°£FãîJ$5ÝN}¾[©i_lF »Äö϶«~ýº»ÒÄù ê%‡b£‰ß{„ÄŸZ7<ù1•H×ÐP"Ú™ ĸ2ŽÉW’FïZ³tÌðGïH¯<ÓÁ™®* "„Y‹Ï^êÈQ3{ŬÌípv@ýœ_¢É)ß??°‚]ôj³`t,ô›óîG8–T ÿ8ÛPVh¨ l[†hÎ3a`âQo^Ò+ì«GÂû©ÚÅÝÜÝöO#^Î0Ï¡?®ìpËâÿj«¾ºÝ„uU¹6b GÕAý0™°È7eHñYeÇ"_vNÁE äê?±]ÛNMN‡:*F¹ÑÃûÆ<+:mgï×zu™¦^=|{M‡÷át fwkÊ' \ÞH\ÆKN·½‹LSd´ÓC}$r²?â,uµ%øR%ú4ˆq±¦)“$u$© H³¤&±ÂˆTŸ¨¾‡Çëk/ïO ÌœV̱*‚-ò»§!–Hü3Ù™~ÉÓøjç)<9ÕŠÁ‚aãŒ|8ï@ùèÙ,Y®‹rGxµ]@ÂÞòh¶ìæfi×ðº%ÛØÃu­Ê %÷œs‹6ýiœ‹t)&ßþð0Ïžhj.S]CX‚ÇËpë\_#b™œ$„1Á±áÅбæÏèXT£ö…fö¯KÍ÷y|$ŒlõUXé+6;9¸ãv‘1"Í CUå./eФúÌ¡kh¼jõ ˜ü’\•¼G$`ÒcŸ“Ãý80:,Ã`"£ß!º÷Ôâî ®{(˜þÄÙæÅ¿·‡›U%Ë´Øvm}žÑ>ÆqV $¶µùCun¤´¤Xrd×Qd3ö 0SžÄ¼ïµ Ñ~}v@®zTø”}™A±uúÔ„¯>^\±3*™˜V">{nÝ,«å:m\:¡uÏdèY(fdüÀÏÖ{Ûl¬š2œ[±=<'ʯ‚OTëĽÑýò° ÄiUPZ/½n ¬Öâ%*÷×Ûƒ^wé2¬{hL¯±Æd|=Å2c^ÖÜXù&÷éUÙùÒòÏ;FngxV=©j§%±„®VöÚèhÁøcìÄÎGIˆêÇâh%¥æ“.8ÝŠÏš5‰›–iÞÂñ®n¨ ³ò^Z†wðùSÔ‡<ùctÃT×þY€ñ×ÃW`§+æ"³ãªBÜXßíYþy•ÓóÞ̺*uQÖ’eSš6ì.tWn"ûÖľ†p7ú¯TMt‡\” ¦ÃJ>ZðˆÁ¼£›å¤Áv¦wMÞ³®²EÐv$—œâ;ÑÒý×3?Ç0}.E?;ƒäb¸â§9Â?n¦ÃÊÕã‘™ ÉïÔ# yÆÃMÐJ*Nå¥gî¿#|ÀOz ² †MùXRÍÁ®þ„©Èué¨ì!nóÈ­=e6`_m{w6ª"à‰ndíaôíz‚ïòZ¨Ê‘S'ž†Î;± &hP áY&L3J³x‘zaã¾¾ym8¥kžô,b¹™V”Îøí°&æÕXËgÌiï"Ý~LJñ3 µË-DhnîÙ×c a Tøç«s@<­/©ª>pÍJýyaä#¿wÚwýýÁ¦´qÑáÕe,ո̿>ènB.ßxîì­ã3Å´ºÛÜ~³7r (ľßÈÍ|2ûdâ2è>!þ´ tW‰ü2°eÏZºÅ‡8I´G,ç+‡ÅûÚ+'°Œ@ H(±°•ÚIí„[Œø-??Žaæ¸ÉtaöϯþÌF`¢KþÌ?y´ æxžn$\kàÜ5Cîˆ}JK½­øàÛÏï;‡šË,‰$ŒšÎ7%Ǧ&ˆ¼LÊq¢Ü§Å³:ëý¿9°Ï êÀÈÛÛ§>T’Ý£UvK 7‰”[^ÆEÏQ%Þz?è|™ÑYý]ªgö~›Ž²t|›t· {‹b•Ž‹ìÑÅš— vŠN„9ÔG•ªµ¿¿‚¸Ú";Tlºö½‰¥j›e)ú¿Ï"¿H¦„æ|ôm-øô|æy¦aoDcý@àQñ®ð"Y#Ý-ž©š7Š&Ê01-èŒ9AõJ!ЯV¨ãKA¨©û­ÁÝ(œÙŸ š_­~fBÚ´ä÷W‘"sᤫ¿¹4ÜϹ5ïG}{3& YOSï5øŽ Z`Cô€yk®~U¿<ë`œšaCÉÀt20û£VóÌ 0‡ 7ÒÎÕ/F57ÖŠÓ$¼H` gIâ”Mc’c”¸êÈ+/ˆšIŽ1E5ý1F^͹Zõ=b|ȶBv¤äc¤ß…[µÝîS )ìˆ PFHê·Ô†õZ‡È‘”¨ÌßczÑúƒ¼pEÿé1¥ü,nôÐáü¨sý­?Ùn>WÉuœøÞßʺœ '<2‡×ÃÓÞ·ÿªWX„ú*HS. škCwû{ㄯ§Åsø$¼ÈgW˜‰¶½ Í8ØœU‹¸Ùϼ[0 *OŸMIUÆ‘Nît&HÔ@5¬³G…k*Gz³ƒIlЪцfØJWK¿’ Ù…¨)ñ´ékÇüF–AWex£J¯Ôñ¾ç ŸßÏScÕ”‡L뢵 Òwp×Qˆñ)6š ºF°¥7%‘×g:Ì€†xDÏù¨zËC3îˉüKË¡z±š+²§ÙêGˆóT6Z¹“ðMÿ)P›Ü^¯¸('Œ!ÿ"_~Ц Ê=,Íy¼×Æ%¸ ÁRÃ8eŽ#Ù$4¾™÷ãLa/zF=¥¨)|ƨ-{„&‡·: ¹¤ú•E„)9‡mȹÑ_8Þ®bч|$×ÅZ¾A=à!ö¨‚ ÿL/î›|Kp?¼“D]x•OØ.”c>¡ÜOWŽ^=‡šØiŠ‹–ÆØ©[½Ïwš@ÈåRrJñâ©b ¤p¨Æ°Dú&¨:;{Íx”øIÆLýu²’™g^qÜ3 %| £Ù,öûÞ¤óõêÃz<#—ŠtDvˆïýêaü‘<ßÞºîC‰Ý¦6Ðá$(Üì×_;.ÒV%þ5àºtÒ”É6è¥ÌÄüý¯ÔøîŠw„^‡…ëHSwék›XÅ9AmL–:É!õ¾úªGdÈ´ùyÔùPWxªÏg¸/sxgÿ@翇Up-ùU>zÔ.÷Ó¶ŸÓ3@“Æ›”‡+„íàƒ‰åºC B,¶ùVWK‚߬X,ü4g¾ž°Ùw{ìr…ÒÞ‰Á ÎŽ&¢W#Ví—\õCXžŠŒðô¯³9’]·‚I¶ô®_ò‚8‚€Zg‹àèŽä™ì‚¨=÷V/íR'"·åôé‰tå`ª´ ‚æ¤]UMÓŠŒ×E'B,mwجý(>À≶¤Qźe5É;©í|4ýž‹Vl+ŒØIÍaŽî:žE§.t3+jòÚ̬ ¢ä‹7ø½Š\òüê:àm±Ú5pUÝœÇTŒ—Ÿ!Ìˇ#>ç#C­a< VÒÁ Éמcxµ·D0Õ@0Á K¾Æ«WKùõôWÇ`&l¡½ü³#;“—ê7“VÑôŽnu‡Ãœm¸ƒ¡N âÈjsîv0@®9{MÔ„4‹ÿ\ >ŽÜÖ#»O„†.k‚,‡‚”÷?̽üÈÜ…¡Úâå ˆ…lcÐÐEˆh›õ¥N³Ôu«s5ÈìÕ*±\£­xÅ´WÁ­vh:sW-å´Ð]$sÆop£[_“µõ£¨øû¤,þJÛi²Î2»Ù_ ä'w÷=މ  º‡ O¦ê 7»ÂÒ‚çcùç}%we£Ÿìq¨ Ž±fS¡tõ߆tZ(ºÀÄ%A• Ã%Ôd|Ë—,Úy¶Ä1cWþµÙ” ÑNù'D‚ü÷§~­ßv†92µàO PA!ô‹lŠè¬eœã‹œœ!WT0-wç0bØì¾½ƒõ*~’A<‘ ]C ‡`ÊÚCƒzUô®ÃË6¢0Ç¥ñ2[º!vNCާŠgk=’­õZ€"Ì”Žx‘$uÔÀŠd±`à{Õ|´ÈŠpÄ%’-qO.õhåC}”N¥‰¢˜HÍG2tëc4R̘ÚòLKk‘H~BqäpÍüî ¯‘Ö”"÷6‡ÌYà9Ÿ¬ 4N_„Øï]^iäÓé?œK8NÁ 3ڱ۠؆7tIæ=Ã9lN™šµ¯3öV=¢QAü.¡€Aw&Ÿ LQ’ǹPkÐŽXˆ7ï7Zßc †6]1ï­?}žÜ9|ÙäŒ ˆ&}=BÌÊË {kK0æÄ?fÌ|v°jÇî[°ÖW í áÔ÷৘vÓâ`!K€•Õt÷~gRÌÓ›¶)<¿X|ÕHi?Ÿ7Û îÎc¼¢¾4Ëddš÷®§ï°}»“a͉¯ .+²–ù±7—EUÕ½™£B=3E·nÙ½gCóHx'¹mu¨‘É)NŠ}oe^L˜cg) ®½åªš)[í^Dë/¡Dâæ®pÙüîw÷$yÐùeLgì:D_¯'ÿ†kèͧf¯2Økt?>VÞªÞ}ÖΪ$k]òÜ^œq<{¾3¤›/ Œ»Î:Ç|u—aÁ^ðüêìÉÐÝÜ"#M*©Ç;–`”p•íâþéj¯”ºNZÑGß=‚É&šñ(xÔñÃ_ŠØèÍQl‘ü»Ôc‘žÑ7ä t~=1¹¹ªG°KŒr{ÆÔ”Qµ{5V9ÆZFñyþÈ—ìÑš…×™ƒ÷[‰6õci÷ò-jw¢ %I+4K^m[YÙ:Î_P<;!­Lóê ê„ß6œ/õgSfŠ÷ÉÇŸÅF„ ì/g溢¿±wàG]Û 3Ôt`Büú˜åM/”|£¯*&Ža{ %I Ð#3§Áo?Lï§Ì¢áRÎÝL&Rƒ/êRöìgä^#áüJÕ‹­.<ÄÓñˆãy¢/<å®·²uãõr /ùÚ~)/c)@Šâ}&¸½áè=Œd8]ˆTê'Þ8ó[á–Ø–í^ŸÜЩ(V¶mIIw»/4ª…͎ÔL†Ÿüã¨G_MfCXyX=Ì/ÎJ“â|熠” |)VþuZð„HÜ)9[šA};7sNZÈ‹pŠÿ•FåXC‘0¶ua²‡0¤'SZ»žGÁ¨].xy×rëµçÜdzvÙf¶rÅžbÞl2È›/”}/¹z¾ôk(ì0a[ÝQ‘悾%C`#Ž~âZ :HMïkŸ–­³C§Wž7œzË>_pÙRÚ0Íœ)óõå…°àÚ9}Î=³ñYc2 P"=ÒÂy‹xœKC—#º [÷qúF†§õ±VkÔ5Þ1m >θd¶[Ò*¡‰$!&[wÐóAWÚä¡1NI•êEßDÁ™ÑÕ§Æ™Ÿ2.ò‰‚a\PðfM—p=p^ÖÑòˆ ~«$Ïž£ŸögÖnë[ÔrD™ÛÛ\Xf©üùt$ .¼êo×/K‰œÆbù2ò˨õ¦«gw¸^‚ðPŒ/ží(çæ ;ËN–nÊuœ¶u!¯TÖ³P@=uVÙÁsãïsü/äΣ˚ӷ퇿òuºÝþ¿êÈ$Š-ü1½ âÑ(ß›„5QOrØo”äUŒ-ZjþmïCfùNGå\êŠÖlÓôt¬àA^y W“¬Ew{|‘ЦýŽ€¹i¨±{1»¤pIý« vŽƒÔm GL¸+”ê‰Lì%ág-KÆGF¹\öGI47¢zV74R93­Z]îŠ)Õá ¡þ×g 6»,@+ërÙ]ÆaÔp·‘@PW€ó‰×ÑèNXÌ¡E8YrÃ5 í”PÛ~,(<ι8|ˆÊ<´M=ØÀͼ•¡”ÁŒYΞ¤mˆ>(ùiKPIPÝb¶@qþLA„ 2Ò3¹ v5™ˆôñt‹èVLÉ‘'9úA>V†`®)[!ÚtÂC?yè3”9*ƒx­-¼Ð¾‘OFËè¾´î¦zã®V ³%l× vÑ€[ÓŸÎì·ÇsË¢#I²è‡csNÁ3´©ØºyaapV!Ô1ÚxúèQ8µž@džïAL/ÄæÍw¼¿K&k/åRÑ—>bB1>T^Ç^™; Z‘0&óGêgŸxŸ?×@‘‰©ru¦É@'ŸEI%è®»TKþ¬X@fzõÛ-„fN‹Ã¢{| ˜GpµÍ©,´a#®z}¬sGL(ì/“=àÎÌs¤<”—f×Uð®3çåAÙ:°¼²•Gf“ˆ :’¯6Øfê¸VÎ_Í™“ܧNÓ^S m²dº5Ò,{L„F¶BN-ä$›¤#Ëź cgŠð,Áâ ºh¯Öì¹æ ½¯Àp\l&¦GHS«^ƒôÔI¢@‚(ãªs6¹vß•™à΢Å~ò …©+<ËëF•Á)Ù-Vâ¯ÁvÓ9$¿7‰´™O9AJ@#<‡šAϵväZÆaÖFõ#FÀò_=£óE² dM›­S/d.KšÊÚ0^tüzkr.Q¡¦þÖ—C’IRvBük¼½n•÷/&ÃaåÞ“‡”exq ™_(ó‹±ßUÛ¥%¥¥T”Hl©äD?ü!)Pq&d|YË©®mÙNÅ„˜pÁÉç¿Õ3– Ñ>º¸{áopòEAüìjs(®ñ‹LFìpôeêÏhl)sóZÃ…B¡`#Òy´æÎr§#8¾GÓ1pÖ¹ðF¹ý«r͉ ¾ÃY]I¡œáù²f´f¢9±Z_e“ë;­â…› ÷&•1¼Imï]4蓤ժ†Ð™u6¡AMÇ,p¹omy%×Ajñ„Yª|aP‘î™û oMÄ€<\ÛÎÂVÇéyŸ‘'ñvÅᯉ”ë22Ý{Â0ãcø:SSÝ…Š$¦/o¦oy‚ÔûÝNrÙž `Ö•3}]“©êì‚ÞŽ§a³ïÎRUùzcykq…ØÿÄËZAGÂÓzvørÂñ¥E’Z¢€Åw|ìÊ‚…©¦Ôy£õĸæ‘wñX|æ¢ãK\¯_ß»à‹ü »o©Švyýœµ9}¹¿Ì &n½ÜM*ÓÛm"m/½Z.œÓèŒ.ÅzjÚXAÚõdÞàtc®SÔ"¹I‹zŒ×ÓÔ‡¸'‹Šé–⃒b’yz~ô`f+ØpÚâ#¯.])[y” 4ÚÍ%ªy†Ïò=;ž }†úrƒUõ?8æª&/o²™W‹»×Æ>’¨]÷ïÁçÁ`jnþ UVâW!x]H@„QlËe³¸WºBt-Ñzó} ÷XÒŸºcÄžÕ×´zM™'Hx6}/Õùm* ÞŽã³ü AFÃS⺬2ûòŽæ'Åêd.¦@Ð]±Ð¦-ÿ¬º·4ªPvÜñqoñr;TŒ‰YOç "ã5Ê›!B©Êæ'¨'m¬¢‡¦«IòXçOrì¡2SÊ_À¹pqâcœ¯D²æûÓbÉÄ̶µW0z%îڎЋÈ8ò3ÉP}+LÔ†×zr¿^ä0Êͱåç{ äi Γ­—#éK¡«%Þ„¨X<,A«IW¼ÄPq›4•š7Ðû¬Åâ3—ð,Üm©ð0AƒÄpH¼fŒþˆM¹6uûYÍíšT õö—ªÿ=uk™·öK“¸sÏ^‡ 9³¯bë+–L&ÃÝ&Z³£á‚S­ÉdÝ}yÅ‘bPñå6ðNðôøŒ_c=1Vß¿Ý;â( Wš¢x‹’h‘EÓƒf'®øH¼Q;…(‡»ÇŠ“Æ÷ RËgѼõ5²ØE&µ T Ôcü¤Ð²ÚCSèúEva Â6ýÐ~DL•¦¢ïùXk`Óî«W—™g/èi |6Âóٺ:hôGòþG$ ÇKíAI‚áA ~êêð«ÃíN uM¯ Kœ8„ÖuUÐ&:б:<ÇÎ# ,€ü•'°üˆ¼ž¸ÀüÔØ£b_Ü s¥¿ƒ4£ÃÞMßOsW…º7ýé øìú U>ƒÅ[œÞGye%AN©ô*f]Jñp`r=™îôΓn«ßêžÇ¡{E„‚ö“µñ\œºå´zŒé”§ófõ¦PŽ˜aQ®’.ÎwéT¢œCn¥ ¬2À RÓ|z0®Y!†µä…uó¥ÖàQ‚aÏmÜJ‘…ôé¶XB¶oa‰øÓ¯>$‘eê=0h1,nþsjó`e1æÚ;cXùvîÍ]/aä½±fæ,º’CÝ~l‚¨‡‚ˆY¢CˆÎ³–•È\I }îI$”Å!2tëÖ9Z÷”‡}ðY1Õ·ÒW~éU详öðw·e$eaF¡â[ŽÒ`OáJsQ’fWâº@dŸÓ¤Êá—¯ uòF6ËðAº°‡£š¦|Ç„Œ„ß¿3ØoËËë7­nI!`y૞ÌÖR½OŸ«µ„õ§TXøZÙ?ŠÌ"·+úcBeûQàfÉïP¨AüâÑõ+†D+ {ˆDÈOƒdtäÚ@ýï©—ˆ¦l6O[mä%“ìø§oÐrhÞPw½v7m€×­ºèöH·­æ{=!åŒÏŽ©“ï°Ö4ñV6±E•bkÇ\ÅÊþrÆr‰>Øtˆ®& žÜ»Ç<©*ìÑØ«|…älìS×7‡pýPˆ/úóáÙ¿ŸçÍNyl'ƒˆ›È ›þãÛÍæ«­oBÂø?V£âs½x_ßÞí"ã`wÛýœvVEjUsgm£‘ë“ÝP¸àÚ%âÖ õ s÷¨€šªÎ• K¤“rƒ‹`ê3…ª­ï[gó"ùBÖ(2¯ ý%‘ ½³Î{ÙŠÚÎR¨uDß;ÓÏÅÅtß²ZM•Côç)YFÕ¿mT§žŠÆ!|A˜Ü휺ÀY“'ï<Øeï %ð4!äùXO€/€ µqï,­×±?g¤0O?§Ðúï¥Pê³G0‚)ŒÈúd»XµÇ<éb?úÊÚºöAç(™·µñÛÑe&]LLàÆJC™ÀǪY$¬µy3Ž|Œq„8ñý™0BÀI¢]Žó X Šp’Yî½x‹Œöwn7àº[­ž›6ßç^ æ—Z àÁj;$Ä,ƼX$ºÊÃ"ì‰íDð€}<ÿ‹øNÑ)oMŸ{ ×fꙭ埠éXjY<%¼RQé:wïò[ßSÁ^û+ù$×uô©ÐÙ`›ø8uMãÛY^…0ÅŸ\ûû¦ ¢–3IØ¢ÏbaÙÓ¢¨@ËõFÔªö›»´^’Á’eaˆMê~¥!¤8mÎ$mÅàA¥"í±6™&:«½ +(ãÐåU8«Y_Ïrhì’'ü‚ÉÁ®ÐGí-º\SöWüjšÔ£}7 ëèÉ×bîK|ºòN¼,ú‰ë?@3#G˜°I™vmƒM_@á*Áï2áE¬„M¶ù¬8½·>*°ÌŠ·Ę̀[pº;eBGÁøÓ}E˜e,w'~s2{ÃTLÓµÄ<•c‘ÊýÓåe-$Bßc™¶¡Ó1+4A}‘£]ƒhƒ·øŽFö>SšRXÐAìÕ†o¯î#ܲÔxF[ÅWÛ­ñ2‹ûq ô͇÷øRN)¨f]æ¥76 XùC¯³tOså¸- m¥ð;>¼[wV¯Šrúç–ië·¹Fá`·”žâC)-#®ú¬)`h•¬(ëܲ± ÇBy„ÊgTŸÜ¯ÙvêE‚e’ó^Thâß{ ÿ×.òòåWÄÅ£`}77{M¡¬4ŽáJ÷–; Eê/0z5ÎæÈç¯ÜïᙑéÓ$àô,¡ðIs5,Ì<Èè’Õó¢ÅÔˆzÂ9^”Ñ¥Ú«Øä[šDW}Å2mŽÒˆ ú£éÄ:ÕQ4ê]Û-# zbZ^»Ÿðûd96çjÂâ€B}$·¢aíÆþŒΜskQåÉ"ÅI]b”]’OÓ*inæXý@SG—ÆguGÕœÜÒ@ÄH¬°ôÀ¡\žZ˜Îökç)/Ûe”-Ú&?Þ! mOômtùÍeQ'Ñæm–P¹Uîþñ÷ÕÛêÿå«É´ïK«¼·A¿ŽÊa%zÔYHy3ð,$´}«±à”³Üj•‚åy<èO{í€:œqî36hVsŽè³5±Îòübe¸†\µÉÉ7­©-MSÍ-“ל„rF5ßCiÞ*äôºÀÅZD^iͼuæí§h£Oy ïú\é&äYølÓE­è¢Ax¹ÏÄž¢'$@û,bóo’°ØƒsôU:Á;ûŽÏ2]øœæU²‹v¹[ÑG£X·ICÿÕhóÞÉDKLC48Kùkž°æqŠÉéŽQ"o5*W2œ•Yê¶úXD™ÂZ4HˆœG­å<ÑÍH%÷…:½Èì ¸u›ÝÝUÖÂÉÿàȽè'Xz¡[“.suŒ `ÑT¡_dxвü‰¿¥ÝyhÎYrseÁ+)/² Ͼ%ño”{>Uqû¾ÅÛM£¡œyúú¡ ÷fçÍBmù/JŽÛ½·>c”ã˽ÚVïùï¦W‡+L‰‹º5¸Ÿà}éO 6,¤ ÷à­ l~Ú£ïÁfiÇE÷ê8‘ òÚfýPžò!öh–%|׸8>Íé–ñ<ŠSpá]ÙpëüQs§tb!‘ûÛÓÍv;%gŸ×ìx¨ÿ¸æ±5³€áy‘ÃÊ ’HûbnYÁ¥“‡âoÁõ IÕ‘ÓÇ.[eÔ _§À§a|D÷5ê×ÍK{Ü?|Ŷ;æ§Ó‚€X'Aï3mk'nïñ 3`覯ÄïŸÌFàöÉ5"3h`?/¬Êý"ÐÇH¢lÄŠ©[ùò bÄî"sÄBšýæ¥M VßâQþ¬•‹1—>¶ л'n“§yZÿãZ¥sßiýçܽ7¨|J7¯ÆÔ,þârí›±i݆!Ì0¹·¯Äÿ ‡ÿ;ÄYºŸðBH)òê¢ÙÆúö^ëlëýýL'ÎÛ-Á„:ÏI·´ÆiEˆ ¹´´`Ó‚ pÛ( ±j^û†$4‰O MïÚðøá¢;1bö'±þv+ÌqýßœÈHÁÝšÙi꘬ÓbØîÂjkÄÑìHñåCŸ‚1ɽ²ÓYÞ*Çó×Â!/Ίßìü?oÚÌ{‚é¯^ ¹%z ÛÄ)Kz ¦¨ˈ¨Æ ‚Z ¯•äŽVûN]½‡…TkÛ+ø}ó´¼²YJ·ÈéE-+i]{w$Ã&Þ9N³”‹ÄÑú—³?î’u‰™Ý(xwX‚÷ŸyÜCïÿ'U“iû®, Ì–-« šL;‚ŠøÆ OW™)¸ÙLÅWߊ>U"=G­<â`eG).Ôâ»øÁl{Kµ8-ÛsÖà…[T'ªºç¤”Ø´WoO·6þºtš°E,ÎsKñÅ–}âÏœ ½ ´å±‡`²þ“ qK¦XÿE ³í¼ÈÞ;<5^ÄÊÞëßø¿·N_C<ÄI”Î!ùž¼ûOôÔ¨Œ¹0Ã΢ú•Òfé&ºÿPD˜(qó‰ŠÒ1»˜àõ ú?*\ë8!ÒIû2ä°³úßÙ|äjLÓx™çŸJÒ"Þ£ÎsÅ0gd|ëù/}*ºã nc„à+*œÞ§Ú™3pÎÄRÒˆ9\¾5‡À"àh7œr%§lͧÛ)¤wŸ Ÿ4é§!GïÙURœøvYƒæ5Ŷ~7ãÃ]éR¡Eô•À$›#"’ŽÒg¦wÅO7¡ü‘Ét¥)k@Ü0¥cx®ZÅ&àí&š©£hƒûR!š]¼¨’m[ñbl:Ý~ßdØ&ñ}h8Áá©Å©oÇíª)l•{7‹Íü->g=1Ú˜jC+­ºÌÆŸâ+ÓZk n!Yq©Î9»hMÉÝ̇³ÛU? ¡Ñ[å± »øˆ:Eß¹’³Ýfó`y¯´¯©›Ê$Èr$Öˆ°€®…"¢‡ô¦,š ]Æç”½s…ŒjJ_x¤(H:ÍnCr¾YŒÆEe16Eë˜(Ïy,[¡@Tµé¶»þï•ènf &PŸvp! K2ì›b£ öX¦V| èÓBÀnZQ¥ÿÚï¢W)DÐο F/.°HõM†Z Öø7œe~Ö«pÙÚÔƒ|cýÞ}sö$™´q¼Áíçµá±ÁmHÓ1b8h†¥•/‡xä;nŠöýZOÒàòËÝKÔbõÌÒ#ÃzYpÌœ¯ÛÞÐÉqÆ Bÿ¼äAÈaJã’s†—Y•p{Ä¢ÑáÈ ÆïÕ46BM ˜ (‘g'¶fºó!jõ§t>ƒöÁ;DŸ†¤ô f’’+.Dʵt½'LJÄÃu«z5ì|oQæ’ZÉ}j¨S 'Žw ±ˆUñ‹ž „(D::Â!iäôõrá ¬™!JýíN*|TôÖxá6¯—Aä•qx¢‰joîŸß†:X?HeÚ?…/#^·¸YçKê²’çs+˜EëgúþgÕ…fl „§¾ááxR™!y®>ÃÿJše˜aUMS<Ѩ9g^r²-ûµ™Ö-Î ¹|<:'”VÁšn’šÒsÛV»n]Pž¢YªmÿÄe³§§C.OiæJÍ,ßeƒ-Ĉ^mÒi]y¾ JÄ ,„ÃntÊOùJ²Fhž[r?Qd=®!ÑÄâ0<‚ó¡ÈÍ÷Ó«VñèéQÃpØN‚,ê—“¦zè½ú˜pZrñL-4FOh^mS£æÄå²£¿,ÐÎ9ÂoJ³ÞÆ õ`³¨j yîe¿îYl(ˆt€;z""Æ*w¯ó¨³zøƒVrt§™„NÔÕlXˆ'çŒÀ*A*‚PÄœ:äÑЋ“€!ÝD‚Yî‡û­H—úÃ’éA6;.õ&LÔiæÜ”tZQC˜¡=· „=ãÌ €FR48—MÌ ùèp0ߣß{QÚf‰ßêEy8¹åÆü„¶—Iÿ*-NUBÑÈÛ¼ñ ®§¼Þpà”¯ôký ˆÕHD/ :1žq# %Ù« ЉíyšRzsG’J‰u“‘á-)¯—RU¤¥Õ)5v)X‘ÜþXoS7oô>û`©ÓEï*ÕDeè݆)ïÀxRúíΖ™tî¤É9¡y )»š8"Jôcõ¨f…ü.‡££@)#èE–j\ðEoæŒ<ž‚‘M¹K>ŠËO!CÝp,7—M¾í„UhV­rŒ¦x„aUÕ»+¹ÅÔÜü¬ÇnšÅÜÁJY‰&oáUØprÁ¸T¼ûm|V¨õ•Ü‚·IÔÀA˜q–ë4˜^¿ÿ‚HÕÜÏ0B)6ÜZó}ϧîóòf„²z9*§ç ÿîhÎ \ÓÀô1Á"³íŽpÄÜ}ýC€:³• |¨i¯€‘|D ±ú8/=¶°¥ üÈ0ߟš|™G*é´†ñ÷SÙ¦¤qŠ´Ãmæ.5ª¥Å4–wiè›ÁåkiWæÝ>“t[j,à½sdyʧ•„HB/è)’êÞ%yÜ‘2ÊÌž<Î)—@|¾2w@ÝÕ‚RÃ÷°œVk˳‰©°ˆrÙ»tîG r·ýÁ–‹¡˜"%5ч€”Õ,6IBÂ.2ë_XìJýâ ýõ·c\ޤ_­Y"1°oW9x(,Y¶|À^¨´-²±Ì\ù00Ë„…µì7+LÄ>SXÇ90TLð‚ªÕçú–û<‚ÅaÚé“ð7…ý$£I ûu18”.AWdRl§D‹%ìuõtt­è\¢ð›z¸RÌ#Ìyˆö¼4£ »—׎@Çúþ>©gÜÉ8)­['!}^•¬W©Ù}TÍPa/Á«šrlyéÉ&©Ù4Ô‡q*‰ÞKñHCfÞ_&ž®vóßvïÔJ:_jÜ×ø>Ħ˜ó—g¸9=Öf*”*nMÅ€­‡ˆÝÚcg(HÖõO°ÀxxŸØŽâÔMI—Z,- C ÖŸ£w«…;+Êcß¹Æ_ÔÔCæ&Ø{ÎnH¾–¢ø±IÅ홟fëŠSŽþqÓë®Ú$'j£Ã¿Æ›)v¾…IØ4EK¬yH§%Ïų.#Óœ+ÍÔt’ùz wZ_#8¥Üwð—äY„aN°2Z±àwÚSàT @ÖS}\.oé’sêzMëÎÿ«„¼¿¸ ¥åž\ÁÃíÕ/õ#œJ‰ä0Ùþ8å)„ Çgÿ”Û'hmþf\YÛwé•«':Wᵆ]U‘í2ÍV„øÜsÅ‚¶üµ¥>¶òý¤ubr€üÊö)xmÿîЫg{z 7[uõ{õ×@ ¼‚•Äm%xÙ°×`F[ÀZ‰jŸ7éE˜+00~(; ªÅÛ/y,MóÊ<`ÅEóÙCÙŸ²ŽŸ´áÚžäüŒ3ZJ0tlàà•ˆàƒ:çí7Å‹‘^+ûÏ }WìtDŸ0‘gëYoÙèÆ¨Ym6/7\fM^¸çîׇ<Bpy äÙ†ÖhüïØÝD)¦Ú¸f 0ÝÄ>!Duk_•IäÛo =•w:àr‘°`|P¥Œ~Óû¼è6÷ÜààÑRA¢¡0ÒÙ¢l›OtÇïFܸÀ°`‘r4d<ˆëöj«9daŽ*ÓÕîý”¢h#2)òE‰aFQµxïñòF·ž—Pȱ"1ô]8ÖNóq­{$9“& K€R¢Æ $Æᢑ&Å 8­$Ë=ûW”ÑŸ"^‚tb!Ê3^ŠNƒûå"×úÒÚ2Y,D McêÿÊ!·ÛÔéL§ÈrðÆö“¸‚žoR’­Ey>„g…샮âˆZ¿iÔ8“t—!”Sl³hù s_kÎw Z;ÍI2¶_-,µåGžLGâ JЬXô“•—M*Uº¶tk}ç_²±ŒE5w’›&à§NŠ8'w7 ˜úfÛ#Ì*¢bÐNDí3–‚÷´>âáõ¸æ0;ÖHañ¨!5σCŠƒ‹ÕP£³ÿ5C Jü­±šÅ~üT>¿ãh:$R!¿$¸›+À¿A‡®¡Û©öPCy<7Ê¢Š3Gi3˜G³ÊâŒüà—ø|œ’ã“~ÌKt1á[ð:ðÿ~ &( ƒ¨#bJD6ž!ç-È}èi,¡ y¥RåB½&­Žt=’²·éív˜WÔœwÖJ…þçÍ67•^k@D+bƒP¹¿…,ñuªr²sÕkÐ1¶Zߨ-˜j³Ìv‘;P†ÇÄ iÛñ"ðûÿ.«e-Hˆ‘pIëÉEŠä’v;èõ›¾fæ¦6 mÂ8¾Tžñ]…dà’6Q¤êà€n8æÜíb\zÖ^æ’u&ïë‹%¡wœÅ@ÁKã¾»³ƒÎ”MÞ»ÅÝÞÇÙ\¶LT±E…¤nÅ7‹»ÐŠqô’¹Çg—<@fųÙ{¸­ûynR!M×\¼-hqw’üÐv%“ÅYs$³¼>ÆÍ:nGÏÈ>zØS»ï  |h$ê¤Ê¾-;^ÏØ›³c;W_š4Í–^RÂFY•,K¹u™ {“‰\ZEî¬ë¤õáæòkjHl–ÈGi+£|Í»_jòîÞ‹[âJF¤¯ØÒ)M…8ô3»7-ET dìÕùì‚ÈÇÆ„óAñ¬Ë\2Ï%^Ï3»;Û]+â–¾Ö,€óÌèÁë9`ñòOuÛpt¨;J^&¶÷A³­´Ö:Í($ñ}•™ÿ‘™&†R‹ BÉãSÂéÚH 8ÆØ,ø!6|‚¸ê;ˆî$Ð)òo*4ÚVó&Ä·‰²÷{Œ¢»ñΠ¶¬Ý>^ð°4&Ûeð¤ˆo¶Ö•B€ÁþØ&nó¦ ðÒY¤ ™æ'áÊÉ£ü¤PI}¬²¯˜-zˆ¢N‘œË ›OÚasÏÙ<ïjmE€¡Û“þ|Å£§¯?GÎc³à‘ŒerÖäéÀj=…ާèïçošó-A—L·Àä6NèP êEEsš!Ô3²;ÙÑY.Çž†9”®và·5󭃚áÆÀ„{ÔÐ… Žø\ïªLª|ƒ, ey[#ÿÍãÊ@è$Õuä…2æ)¼‰t ³­#.[ CÌ•eúŸA+#ÊL¯j@}••ýýŠŽl1À¦·"¸~T­„Qªõ@¯{•£žvâ|£’toQï8·}‡¹ù¼’ƒEa4ÜLár&À´Ä¥Á!Ó0ˆ-ç*Ãë,'R°¤6N-hýVÁ|üWöêrÝ`{޽9½7cy øåºc'µ4@™©P–K -ê\Äk¥–0Šær»Ç­É0¬uõs¿r½«OØ=Žw-„1ëVvMk2îÉ‘ªSDË™¡=zQÈôhÙà„È,kW©b6/¤€¥,÷Ã6iÂðºe3É£$Ó"8 Õ7ÞŸ¶ Ù§+õÛŸkOøw< 7ÁMÑ}—è4ÆäÉÅÔOIië]šÏ—ý^ºËHßdò”g ü¾{2~qpþl»/–*E_‚™†6g:ù\Qà ¥$³'±¶Ç*;Î;bj0#k/J,y+nÛ·9Êaã­žlª™óÐ"¨ªc0þ™gÇÓñkq°-ˆßæ8µè‡‡›iáe ~njµ T#@7@`3+Ë~Íp‡Z“§^Ï.–}ˆˆ®™Ì «Þ÷¾öã’!­Ž5HÐÚgìuûE‰¼ÌAô±$»¡£‘ÿgÐ ¥‰Á|K~gëVo0¿·°N‰¨vóS+Ñý·b«n‘Ѫ‹%ƒåǵÕeE1Á&/ü.<K¥î»ËS ¸>S=i#vkº¬âFÈŠ0… &JjW+ãh‚“%V^%¬]dž 8jªUãID^w²¶ÿŸ^;R»%vÞar5×…a3ÄdŸ–üp·XÔç&`ôFJ[h.t“x„÷8@¡¥ÄÉYŽQ”:ÞŽï‹9¢úÛØ?$y8\=›Ç %}}0ùM‰]–Š-F5CGˆV½#øf%è>Ž6)4/eš®QmÕ) ŽR1ʶ§A}`,…ö· Â+"›Z:c$¥»«?“˜éŸ%š-î ÜòÖ¥Ëbª¼Hæ ¶†`FOb?Ý10W‹ó2 bòJ‡«LÃÁ%ÑAZÙç/k0n¶ïÎîh”¬V¶mßrêû›ÁŽª±žÑ(ÿ-1;ïåPñA 3ì1g=|ÄŸ °nÞèæëtè†d§Ü^Wd!iwôò–$}òœ iS©|³K}9.÷“±ËØ^X­µ=M–Ïv­uJ@Ô*V <ÃÏ<kh'©JÇŒ2@'·çl”b6Uö´Ý!•ò­C…ºHpûÍÎMʦ&š2ïÄÚœCÞ ¯ ¶§ãBèhúP×Ûw9Ç?1€{ëX~çwcåCåû¬ð½ÚÓ!Ó…laÿlüFiÙçNÆðZL6Ѷ ðj®~›ä-c’RjoC0²¹1Á†˜Tvî¨cœ‰óëæRJÙÍ+¹E€e] \Ö &»ÉìdUý0½˜[Ì÷{°™*K]SuJ°9dÜ÷Óê·P¢²ê…œ¢K&ÙLÛz°šžDaZYèùoË&¿é/tZH®Í¾Þ‡… ®"¹ ¿t– ÒÒ$9ÚØ$”š%uI…4Dóœºþ?­ ]µ+ø/ÝP7Ÿ`E”HgJ 7‹”Æ!:Ñh´V§Á% ôÞ]^ë#ÎÒ ¦´t·¢ÜÀþIiáÆœ~ïþÙµÙPÒZ)*ÓZ¾ïä`ë+gÿáoÉs#¿Ž€ÄeBÔƒÞѽIZßš˜À Úešúp[••®€M½­cÚ­]hpµs›½ÕE3ýöêgØQòë"Kù0ÊìºFÚíÊß꺡Ö†Œ8Nr=qÅ0|ÜFü„æg´©Y¸O”´Hz/[‹=íÄìÇSø2t«+ álýÈW½ÐùC» +N² ±“û¸zIÔrXÁrþ¡ä ¥î¿æ®ˆk¯Îu¹ß»7úŠíÙf,ßõÊXÛëHEi †œd-Q·WKZ]„xt¯ð{ÞìX`8ÆV$tã”Hl­S®d{>qjZºTvÆîž¹ 2!Û‹£ H!øåSÄçe'þß¼*.:O ‡O£ž¬Ôû}9Ò[l î¿ùÔ‹s1â®0Œ£“KiÔÞ&Ycn¿¿²ÛXx >¨$´ „´óŸ‹ã?ˆ„Õ³Ô%H¾?¼;ä~Sÿ:úCiéù nd`^Ó1ño¼@ä>øšÇœùy5H43Çh^®ЇM"4ž!%—}|˜©‡ó!ïinRwlà­Üà!EXòþö&K^Ð+‡0òZ»ã ˆ7Écu¨DÅS’ŠoËÞ½qÜCF²ënñÓº6 Q<†W9áL„áÜì¹ý9!œ^P~aT´†#¥~™ûÝ SÑiÿz¡Ú– o-ÃwÏ)Xzõ·±ýls­ËKÈÊ&ÀÞy¨9?Cê&ÌÍ:ˆé@·ã ºyRüÈœ¿fÂŒ_¦[ùôSë±U‹Ï…Xî-5Ûu£ š9´?–¢/Ûþò6¸>¼Hð 0#¨¡zjSþ}†7¼=Ú ŒÕ»e§=¢—ÐO,;™/ADTFÔ\Ý7-CŽuûýãLªþÝQüçVá’ÚpvÖ(¥n¢°·26¤ûˆE@Zt®<œOžoU wyldì(ÜÉ?Ã;íI–zjhb˜DA…ððl=Ákë8&Õ)9å:ÿã‹^¥ä@ ®k©eµÁÆ` ¥jiw{ˆsô£¯´‡aMôÄ –‰Ãaçü£Wšš)LónW{Úƒ:ÊáÑ‹¶Î= £ª]¤TS@Ýs}û#ÿøÓ±þhXÞ˜î/Ú½XfY¼[1 œ¢—×UQÉK‘L¾Ùðæ$Æ™Z»z­sÿp¢Xïp|ÿ©Îd#w!í‡ç²÷·›'Kî ‹‚(œTóæ+=…M¤·‹Hpž¤ÛÍ<ýp`yËÈ/¸\0ïã“ÉB ãŽlÖúùž<Ð6¥I^Î|îË^e©ZºéïŸdGI2Ôq7Q#Úì9“cMk^+’Bù®ñ[’©@¡£•å@~(CŠgÿ­ë¥µJo¦ÿ“”ÂO h-\2Ùg­Ú8#RÊç?ÿ[91?·ÓÔÇohODi=:»Å{ÉC"7µ®ç“ö û ÕvÝO*M¨ÕdŸaÂb“ìq J¬˜ˆ*ó­öëÀ5`Sy#2Ñ}Z¢æU…ׂgª…öõ:(Mdƹ2õTÓ'x̓¢ÉÄɧùdxÑÝðt4Ñ ‚:Qê kšìÌÂ^NÈ5µ¿Ü¬  áÔÒT­gøïa\kÆ YfòÒv’tßOQ÷xâ!]O?BšŸªÀ?,ò8]ýGcÂ|ýºõd¨uÛôˆ—d_EÓ*š'Hª‰'Ï”s6ÄÆM5š!*ÓÕî‘Jãloç vùçàïÍ¿˜¥Þ̧J¡†˜\ÌÕƒº ó¥\|"JÕQxô…e`êyùQ™®ÓïmO?0ÏþàâQ Ë`´êoE>Œ£+ápRÿÍ¿9.¿¹)hÞz>h¥òqóØÿâ/ì7èqúV ?ê‹Ð#êôÒ|TÖ㕉s,‹¦ø¢C;ƒS4tL ëP¯’uÆãôƒ®üT¾ÍõZF ’_“Œ.~p}í™a¶6ÄM­!7ÿ¡­4`¥¨ŸÓ_7pŠpñ»ÏøÉcÌ»0phƒÊýL Émà:»h´è>¾—Ú>!",O.àßtUor@u°\h"‰•ë­X¦¦BÒ.=h4˜ò¹€uë_°7EÙZˆ¾Û⑊ÆÖ1ªXœš F,W; î%Ìä~ýÌ«ÁÀÒì¬å÷أɒþͰ “1øì!z¬à¦sAº‡?š€p>_"ÿKWõÿ2Ú_/Ý+œ@ ·îºèĸ߼+ž/ðþÅÉ'T>U?©©)† *ÏÃhû»2]ˆô‘Ñ*Á<%A1oþÛé{¡:‘ô¹Õ&Vâtˆ\à§Ä.WÌŸÎ ]åWh61ßÖŽ©èaRIó/O—WøUÆoNÇñÀØá©Yv¼`Næ?™cŽŽsCõW¶ûò¶ï.w&1Šd³ $€ùÉ{òÙ ´ÉbKªH-Û1V -S¾h'ËŒü°•ug1£§ &n”cucð{dìh#›Õ‰I\ÿ0þýw5‰4 jît3iŽ„~”Ñ@`gš*\Ç=Y%: ì[Ͻ-¬ÃÂ_¡mÄxè(Om [˜ñ eô’°Š¹á!ˆ áà0o¡ "£@Ö ˜Ïã‘¿†+^­§a“¤xð±P„Èëz¢]R×ã,K$'50ß…·òÜÏK ŠŠ4çX›3ª€a\üŒÏ{B9GÄ—Šô‘>_zœ‹F‡ópI°ÊÌÑ^$šÑwG7I²æ±Èå¿+¬6ñçOc¹Oœ`VœàÌÝ@Àç߀h®/78Ïf„cØáE ¯KÄù€?pŠC²âÓ«.o®>þãdAÈۆ*å>&BnmqP4HÅ”žMvظÜ$è÷J“\ë×ø®§GÜ»í äf|÷éK€:Ã…Ø·Ðbý3²¤9:nñ«Zyv†}é‰0"j̵¶ÿ¤‚\¥‚vGß§ï²yçV±ªˆºX ˜þ;ü½ãKý%;Rïp|!çFg¨Ô\……á2¬ºú?HÁâпYŠ| Éo±V‰•¢­ä•ë¡Cæj;´f‘ !›ÕþÜxŸµzG ^£UéÓø9ëðþåa‘°Th¥¶¾M#Á˜júËÊ Ê&|'ïɘYr  ?›ÁÑ¥ù­©®ê2Dº‚³O0 n‡•]p‚cì­xšªz© &ΙNçàttr¾u,aM³XM{];céÁv”Ž¢¥É´¡È{äŽøÔIþÛ¢n‚¹Ê°ÞFÁ¹`Vûñ­\$³“lV¾eÑ߈$T,›Ô_c*l€¤ˆ Z«kY¯æÉƒQðÏç¹lëk${ÃAö7嵿-²¨’­‘• 9vbwmßøMU$`²Ê Ù(oÚ€¦¦áÅLGŒæåïD~ ¯‡¡P9þ9ïŠö(+±¬Ú ƒ–Òä࿈qS8ÇE¯%v?`G,ú4€ÌÂäD¿‘þXåY&¤à¾ux75âW ñŽÝ7HK¹0iYÜÿU8!"L¿pƨb‰Ø¾à%­6.ƒt£¹Y¬ïðŒ.Lô@húˆ\ªP±éž±"ªÊH–Õk'Ükâ<ñ:Ë †[È=VÑ~ÇSD&d¢´})ØfIÜ5ý#¬1­ófïÁ?ÐIš‘ÉUr•Yº.# |ꯔCÝg)x¹Ý#=±7¢š$àŠÎО/"7Éí»6" 1v¢Ùôû“9‘W&M~ pä­Š‚0ÝCÑ;cÅ-M­õXدŸô}s…cÃÙ´p~¾“et:1å#Õãq“¼$°O p,…øºÚ0Drÿ¹’\»"míUWw1{SkZÈð_$ÂU—âXQC˜*ꇎ‘‹hµ/A6û÷„]iü]B¢ýÆÙÚf¿§j¤µ9ïÀX¶$ð£,DLl†Ìîy/Ýï¡=äÉΖ­Ðª%å'AÖôÐ…VLÚ7åS¾,è5>w=ZÇ?MbŒ¡=\xæeP­ëÔ-Wo›.÷-·zƒ‡©”[J¦ÇOêìðGR=‘ÐUû•º‰ºÌ¦°˜"Û"y ¨w3‚‰œ†&Çm pgQÙa.sܰ!&èÐÀ“ }èìcÔ™‹/|%^Șé“?$~+­«ÊåÌU¦®î¯d¥­ó`½šÌmR‘0T•{bM¡%yzõßhQ0jöÜÅñ™ˆÆ÷È„ù8¥ØM¾rn‡OKûÍ”mY5èí뻑ptàÆ“àçÏ»ÿ¥âÓA“Ù.¼­Ù^ä«»ûTÜø+õf.ƒ'g¡õ_21Ô‹‹a ÃÚtJJa`*jïèw þnƒ÷¶ $lUU YaÂþ<û‚ͨ=(´)E2ÚS»Ä |m›K;VTÙɼìÝ W!ì—pù[ê ÊuAçñ¯Ð©f£Üxù›­&"P}!#ÖkÌôû ÞÀŸÃKØpïÍjôåjòüo~¤ÿ‹R~Ð1ƒÇdö¿6ìè‡FìmúÀ%x§ÕûÔ=;옼‚»7'üch6Ráô<8h‚úHz²OÜ{ï»ëjÌ%ºËÕ´Ê • e9ÉaT±™_ c‘)ü]_9/"&œã¨2.Ê›ãUõæ¼ìu#dáרh¬£ŠI™µÝÝÐ909Y‘(õv¦ÑHBûã\X¦é¾KKÝÜ&zÜ#sP;X¸XôÆ£ý¶Þ%×Ü ‡L¶{²1=f'–«+ÔpºG„I Ä,ñæŒÄäÈúë3/¤F‚–¨;1.G*õ#7JÅ´.ŒjÖ1湊‰ÄðKìØ8û3èñ©ß‰ßT˜j:‹‡˜Ž©iðͰù7ߢ$Ö¦QZi§²ŠÝ,K›P0èR¿g=jåpI/ç.ŠÉÕZ'?ª>Í&äø‘IÒ6n[7ì‰äžIv¶¸ .ºB¼´šÍÝu€ß ¶dÀõJâ:Û* ›ùøZù¥‚9…mLο´@ –Wn<]†Žá]‚"å>°Œ_ø÷ý¸1öŽ©¾`Âë¼^_¶ÙvaboÍ¿¬ŸÃ×vó{4®í}†k @ßq¡8£¹püö“êÐÆÇ—Ò¤¯5ï©ß% f%¡¹8€k­Ú0£k4@YT¹sÜËGÙdÄO0„_»¿÷=O…üŽ÷cœÜy#†;ä[E¥•—ÆóŸn²Ô¦Þn;`¹ãÎØÅÃÓt!ή0ñwÄNB¤/$XÁ–G/#ÂâΟ™“‘2£o€°M+”ê7Crà(uQ« Õ‘¨¸J¢7Ø0ƒ")¸ýæÚ¦Ýs;*˜z”Ã’Û ÞE(-”óãT ›šz¢lg€†´€õ‰i3 T # ÜVQ͇ն¶\ó‘(Ë¥Ýì…»ëPÔÀÏqÄgÉQè9¬è(„ÜK{ªþìNãéZÅÄÂÿž§ü€£d•”e5”áF ;NÍÛxÌXâEá›@~Èéø}4³ñÚLò‰Ìa±4ª¹yYžqë“ 3¢>¸ÓW¯á[À³ZÕ)¯îÚçëü÷‡6amY€EÚ:éIÙ¤yQÈ Ë$¥œj­¨†G60›?þv×îðF³²†IþÜFïzwül2¾.²_ÁJõ<­çŬ¼” â;µ,†|"ØšýMÓùÿç1l[+Û$tUûêuåYÌ™ ”úU¸/Ü»wèšÿ ÎÏûîo/´7_LÂÅI‚ˆÇ@# –ÿ1¸çÊ`&‰ƒÎ­D…†ÛoZBä“âd·¢~áºX×ù§²O¢Âp¾0@ýd𪲲ƒK€Éú{À\@u õú­¶ Šûbw_­ÌxtD;ÒõÍ•+Å<ÄŸ†;à D+z—³iÁ,÷ë;›ÁŠÐåì8¢¾®VûMÔõ`Øi®ÌRõx¹ŽÀÄÔutµka`“å4çYÿÜi€PÍDQ½çT´rt–éß^ ¢†IÞEöÀ™ ª?[Ø1â^ªÆ)Ìv¬¯MM‹Ñ‹WZ@ž)ºƒwÒÁŽêAð§¡›íÖ²þ4†Ãò¥Ð"‡zGÛ'°h…¿°Ha£zÖ¥–eJÚQ¡¢FÄÓYò)诇 =¦l¡±y?`³÷Ic`€ÁãÅBÉàBôN¹´¨{=ǧ¡ãÏH{A"®žù;[·)t«U™·^Õoá›—×Ýf\\C”àÏq— Ö<´”w?V‰µ+F¬aïH¿+÷ÉD¡Ûöj<²ñü^R0Ó®‡ -¾ YªJµ“€¿†Nò7‹?*óÍ6b÷ã}RoYë7ÛªBt(­È!=˜Î¶ë,Á~yÆiÚW1} …Rö¶EøÚ)7dÏ’ c“v&çñœØ5ðzÓ[º,ö0w(ÀÞP•rë¡d¾„OR,ÀÙÆ‰oJÐR^¶v•8å†tªrV¹ô §Aê¶px®ó†Ò4HòE}IQÇŸ]ŠUn6—u0Þ¶C8§ OWäW¥Åøè1î:º ¢ké‚Á fèY«ñšxí)ÃÃÐÍLâ .ySnh>0B y}K xîöX^3B/šYuÂZWdUç "-Ü›f$ÜÖ0ÖÜt‰O¶õ—}äöùY¬Ïà 0B»¸\éIƒ¯£Ta ·Ç›aä˃ ?•;FÝêÌäE­‹˜¹(“¥d°ZÞ<ëò}k6·ôšÞåÎTø;]¬ºƒÒO©#q,k`®“™†½%°áÉ~â;÷;z"_[Oþ¹pFS&[à$mMô¿VlÛë#"·IºXNÒ‚ØçHERFa·_Ñw™gäøSÅíAÃè{/ r{'|\ÙäjN [0…ƒ%ðÂKÐJΫ>ñÿ^¸½³;,–ÞÅ3«&€Ó’y4½Q~Éûf…¥öõ4•¾4_]ÞÃzB¢ûYŠLÂÃÅùYœ‰-Œéb†A ?WØ,xįÀ-HñúC ÖxKXoœD¯À0wÈ'—ë˜Ù½Ò™f«RÃHßîäCBÿ€lšåRÙÚ-\ŽôOúypïßg¹ûëF–Éʃ¸»÷FÎCÍhŽQÚè{€¸õ ÉÕü7è EH¨Cð¢”þZ毾©°Uœ¢¢†¾Sý 1ëN_êæþûv5çM¯KFaî;õR†÷ÛÜN81祙Ñ7>§nÑ؉‰à`µFH&¤öÍ7;‡®©J;Ün$»|Ú$y¾ÞF>ªêÿ2œ^ë¹F¢³¹ä_pnqêâshŠÂ[žfJ "V‰IÆ?\gª\)Ê(gm„¾Êz¤·û‰'ìa/Êßg–ñ¤?¢l§Î¤ŸøÜ.é{.—¤i8 ­¸çð1£íuB†ÕÏfUŽ«³U:Bòó®…Oˆƒ²´‡ö†Ù&a]Æž?˜à# ”üUHÌûã« e¬ø¤mÈùri*¨ÙÏñ+-éŠýfdm<l@Gµƒ”%Æ.ÔB#‘»ÈšE`ní2Ñ:E5γf÷ÒÈÜÁ¯ÞÈ:ÛÚöüÆÙnD/µÈEÕø`ú+YBf`—ÌÈêÐ$ÚÚÙ'oìÖ,v5Ö~ va«Nõh¸9Zè‘Uïk:TsJ°äÔ݇qb Š'ç¶’òˆýnPÍ\K,FeŸé¦ _þjMŸ¿ÖɆÜiü¬E•:÷­cf^™À†Üƒ¿#mÒÛÌà—,oFRÌØïEŠùÚ‰8«€Íq¢è‘éᵿH“ }ABJ¯•}í[¯/§¢6UQèÃ7Q«•Çôï¬'œX”ÐÂ(ôô î9ÎШb¦¨ÔÚú.ðý%ÐC› ¬3q¿ìdKüØͶëÊ–Eø“àf)þ4ÑËõQg­9ÙPu'ãX­«©t|¾§pŽƒL’e¯ÀÝ5¹ÉWÊždò#˜‚B¼ê¼PL¯úŠ£ž‚ò è‚sHöÕÖîÿõs°ö{ÅïÈ®íëyKŸÄÁ£w)^¬àÍžÎCÃÇÖþ£>¼'e0ÔIm?˜Il~m–SÌ„+M#< ìjÑô€ Åøpxµåèo ù ù ÿ’jB®)e–xÚÃhàv"P8Eªó„y\z óAÁF¬òT Ö"á"gï³Æ_Œ•¹0‹3°°ø]­¨1çØ½FEE;™¼¹íã”ü¥Õ•¤å01)›ËEÍÃxA*ÅïÊg°ÞTø³wÞ ¢÷l@Ê™ ¶›sáx”@t¹^¹töº©´Z_¦x0ƒ&ýûX¸(ãAvŽ·Ü>y3¾ý:äç¸ä¤9»Ã9¢öÐt QCmÒh„Ó¿öJ1UÔyÿ ÕnÑ-ŒŒ(Ó¤èóQ†¤ èž³‡•8è ߟſ,9;ж›¯Xÿ†¨•â&§%5²‚…MM¿jEg¼o×—E¹‰FÂçÛ¾ ˆ¡ò2Á"+àåiélg´84äCg²|jJ~þfíl9¢“‚-¾‡wÕWs·NÇkJçvõŸ½Éç¼!ÅÍÜíë.¦l—öЗEã´º%ѪÜåRÈsV E¥'û³dÏÞã¯ÞÿAiI°ÿð{àÖ44¡¶è¨T)¤ ã;&JC—“ú c4©Ô+†zU‰ÐpðúŒlË97 mn͘’7PÇW3KÑÏõB[)¶ÿb4äÁ&{¶i]KÚôúÆZoX‰Õ`£„féB¤æQ%#S'g.wRÉÉhâydHKª üF’üÇFJªàL,ð¼Jí$mc³/ɹ´t~Ú¢ƒhíþ£¬„Cº*[•,¾ìý„xoQqr·%_;õ¢Û}aÿJ˜ >» ¨+Bsh^)Ú‰²þ+y¶·;u^B1h¬86Ûô©Â¼jzÔE÷³°ˆ¨ ,5³¦ä§¹KV¡k# õE—²Li¢0åè¶ëÝ <µªóV·±ŠŽ1¢k#›¿ÑÑ¿-èR«ËçÁŽïÙ{†¶pî¸ÿMº.”/ŒQº#PWVèZ«ò›žâdœÛÃ¥ ºòiLtàÿªÝäT$`ÞˆÇB á—¯ÄäžH+kW\¢ÎšÓæ³b ¨M½…í¾DE:jS³wÌRžçã:û%?òW,(úÄæ0ô½|Ó¢ÚˆŽlÉFË‘tp…ë'¥•jDƇ8,þÆ8ë °‡ó/‹òõ^ºU«yðPIÕ¶_å˜Ï$¯FèüNfezÕM¤.Àd^ŸÊÒüXfPŹ´Zio}Ûâ9³Š}~7ó„“;ø¿ªddOÙØIJ ‰‰±eÙ•ÖAßï Oö°Ââ© ¾•è´ª—g€¬! @·äKlÐʆžƒ3SJ¨Lc¬ÁPPY˜Œg †èçôв™’SOš¶o§h:kós,A“,LÔdáÉåNXgZˆ€:Geèg¥¹å"\ðî (÷'„g‡¼Vœ?…¢¹/:G:].ˆ,å ˆn-ѿϕYì&©ü:7oöX|Êq7ºßMäœ?‰UÀÇ2`\ÃçgUp“âUää)ô–EâdU ‚¸ï÷µý…@-¨Ÿ¯°wîMÎsƱò²Òîh¨™ñ•ýþØæJ=0ýYÒtÀ<;Q'5\÷8€\{)uyò/s€ï\|o—7„³¢£$HmrsŽ;¬Ò©/‘°INû»°ÍçrÐÇ€î”k*=˾G'“ÔS릮:n‹lX 3ƒùNëD0ûG}QHLu  ÿ 8æ|ñ5aE^ºÏ#é–Gw{Ìu ÏÙî'j†þ§ÌOk^Cc¸5ZÕð ç†p„‰'…¦x¥ºRù)È<ûï†{ŠòŒå²kl?bìûOšÝæçùDÒÁ»’’ux˜3‡Ì;žô‹DaÖªxF¥áŒ÷Ä)ŽX=±ÌF<úÕ›/LÙ—ˆÖ¹Jh.õÉ–±'¥¹b°|á–í½ A„Y’5?Ñœ€u… 0T«Ü=…µk¾Xñcʱܸ2íø^ÿ>èä$Hå¿7®œïw©±~Ë5µS¸Š¼ha¦‰yöì ZbNÔÈ0—…PÆyÞ' 0C—dÉbcìY9}í­ìÃÛrõªëzÇÄlD©c&ºŸoÚý½@e&“*ø’tÚŸÙFˆŠÐà ½TÉç¿âÛÞgzþ‹xiV:ûÔ`§=ì÷Â×<Û0Œ¬UÜF³š” ©y2 –—óo=\býA¡Ž–[ð´©×c­fqÄ_ö=[;J0ep}²¶[ª“ÝÂuç2n§E]ÚÃ# ‹·©'^ÿ´Jµ3ÿ1æa(Šw²TEµ1.´sûvzQxuòa’ûb¨~ \ÆF2ê€&Že.‰Ó–ò×ß'ÐéÞ‹ò íV'¯fa,•³týYmÎŒ–oÁ¹Z—A“fÚÓÓoØ•Ö<ùI¦)ð^ Uš%ÍýÍ£À;YYšŽVy¦Žºê?Ÿ ¹ÞR¯‚óGÑ¡©Æ·æÝùKqªDƃøÑõ}Y­"³Ì48+ˆÅ¦7Å"–£éu‹~¨WßR¹’*„ÖBYvœHÓ+$¯¶ 5¦A¼7)•K“°V­®.SXbæÁøª'!‚/pð›Ï™?zÝn¡"$ðÈ›îÁ›‰·„ÿîöÓ?‘€ðÑ”¾­Ž«Õ Òe¤õ¿'QŽ=惟Y»ú©K³¿^'ÊxËHÒùšÑÍÓ9Ý»”:†Ù4Ç»Í A_MÈ|’%4"Úd@æÈú}¦ )lÈ-3by1‘Ï#à`iªƒq*ºåcYú<Ü…Ùÿ_Íp¦zŠÃEƒ¥£>1ÅØMƒ7Ñ»œ‘1aÚHƒ¶x£‹Ô‘poú|èñC>M/ûß±¦vßk<ÌJÿ˜[м²áVeA羉k;ùÿ¼Î5`Øïh5Ë–' ×ú²Ø¯ûTÔülW›¦iÉ:1g"ax+ñ`*yu:õV IЫ©2Nx™É¤ùLç¥?wq^úÆ‹Œ˜STdj(@Ê·¶Á|'ßiÖÐsF!9™¬"fö;•Sa '?YÇ—ŸFå'|‘Â~$”McÝ«°ÙMGÎzM’8 •-Ò™ÙËDß.U§ä¿“$3šWÂwÈóÆáÕ³Ñ7DÝÖÕjjø]À~¯µˆñ] c6Îl*µíöCÚnIªÌ~ûp{„ÝB¨vgss;¹éðTúž•u~sETÄBÐUæŠ|n4÷¤„Œ\ŸÌo°´t“¡ +%K›éÿ(ÕÎ,Èè(Áo©Ù÷z6¿ Ë/k’iES+pïRÒg®Ɔù3=Õº¨_\çÏš«œézQÈtÌ«jsé"ö9¼uä_—Nlqõ• Èè®ó·žÛxv€ma¢¼; ƒœ+¿“'üþÿÊÐǾuÈ ˜RÒ†I¾¿É¦æ×Çb}Ò9â%ÞáŒål`×—‹A@±,ý˜6%¦0O2.ˆ?Èøoxw„°•ãUÿ»@z b«áËvÛ&#ž‹¯³~Õ gšÈÍI:±ƒÎÔD6Î0†ï‰l«µv¾¯³²ó§èI³¦²cŽèÎÇdñ·3k2èÀÁÛy4ªôˆ²—èZ ÛEÓí“p‚Q„´ µ­tý^?’3@rYf¿ÃJ˜ãÕÆ^CUþª‡ñ¯ò8fö󟌎¥ƒØI7¶‰ÿš¾tØzSiE|[Eëz`»Uaz ‚- ÀZIœpá  ãµÃìõe=g(+R!û<7®¤Ÿws}Á7 Ö/¦ˆÑûHnLšÈ}Rò¡¦£D›â12´|šCzÑø† ®Ø£ü©ØCü®—ºä²ò¡NÄÂðð]$œ’»¶WÍNb¾€‡¾)zŒLSá²^:Ç‹h£ðª††¡R½Û"¼H‰Ã 0('Š}nqd8õÒUçî‡SbšÚ1) Iu ìRÛ6¡ /ò¨g°<]—“ýöä4Úœ°DjXæ,â<Ëú½·Úr>—*·’ò¯Ð;Ð PsuXUEñëh`€::®‚ìKfEGVü,Ƨj:Ú`Æy+ƒ“_Á©„|°¯óI èàÊÉñvχà\#Îȃ’Oº¼#5»ÓYl•œß· NT²ÀòÛ²ËFCÖ[KÀ³§z.z±ÈÊ2i^oLñ€ÉC0xω­ÇØåùŸÔ×v'·A…•S×gPCÃP ¨º6KÊ[©ÉäœV0²3è:È&.ftÚ† “8o‘o©Ã½40xÌœÏÍáíå.Ø®K £ÌGѦùy7õ³kgP³_ÜïRñ|æÌùŽŠŠë†4Pg8†-‹gþãYÉ*™x|·ã ¥Ò=•z=Ù¦lºV°Þ€F\e~Ý(¤¼b´•ªd[Í1ADÆ-wMt;\B¨°}¶Úv rx¥M·sdb¯{ÈÕ‰q®reEf„]*éíßwÉó¡R/•@ϵ@Æ=‰óµA2ÙÓÚu¨Ða¼ÊÉ NSò ×9&Ä¥îÅÓÚN^‡È³[¾ŸT×ðß’u‘ž g=ƒ½ bƒˆ³‹ÄeŸî¼mODס´0J^ha÷-sƒÙo)nˆlPü:GQG¨#àÕ¨•ERttwžç¦C¿-¸àÓnV5\Ž‚ñ8Ë•¬˜ÁÏÌ"Ëéy<0iy:Ðm¢Y¥9}ä˜b)*Wt<›’“[¬Ê2WIM”©›|mÞ¦ªDUàÀà€Ó­ï'%“0…?h§EqM)¤];‡GÛ7:!_=a*R.™­èu#H·G0Ù¯Ö] ƒ1ï(¤±œE\XTR)£cÔ—aãЀ¤=À24j8­16éJ”™›ë ‡Eb è`uŠ{¦gƒûS\•ÌT×°pëI2¸ô/íæFâ5‰”ÿèî&†ŒüÈ*úªÆ£ThX΋Ä4£ÇŒ-ÛbàD@s"XÜûPp@áúà¤ÿˆÍõp¤Z!·ÍšÒç}ƒ'{€sepß‚$6ÄA:Ä^Òµ‡yï7+Í¥9ô䎱µœ'ô)¡VqºÝ4bêˆê;ªÂºVÍø›nPÆ4°#èëÉSæ .¿V¾+j‚øi6‰Ú *´'ŸE3±mà™ÃÄðéøÖ~ËAÎ\·7¾ÊÉó]IÓËð2âÁfXr%'/šõ´4Õ [vŠü~]±ý±Mº5¯M±e»­{Ôý®ƒ{︭ ÁNŒƒž ïÍ,«ûœH¦ˆf™˜è8Þ)†öÃÖ†>ÂJZ'¬ý|Ü‘.Õê¹5.žX"c«VX1I£VNé šÇû;ù³Ú)IëûH0«‹0ÐÑáÔmk‚’s;›À]ªuk m>÷:‹­ÇoÛô»»·ÛÓú™Ø8§IÐNŒMõù†àüJ{ƒ½›‘Ï~ÑnÏ;¢=uà2ÎöºNÑ[ÖôG×µ"dT/`6ûàl¹XdrG5„z$ÒêÔªâ(áä¶‘_'…¥ Ò…¬&ï© ±çýtS‘xï0¹Wÿà¶ÈÕŠ—hªT¢“‘>J|¦†0H^ÐEàlU¿ò!SS Pù¾¦ñÔlG„©Š{á¸hw¦Æ›¦*'Y,ʧ¦4J€Úë›ü›XÔ¨´ îð7åËŸsŽÐž_§UÞ¿Ú×ÞÛôÞ¦z¸áøÇ‹©„´™+Ð9*WÅ/ç ÙSB{çoO"Õª=g*D:>ÖÉ>ÀbŒ—©».:ÚbŸÙËxBø·¼yòòDý!£Ô5õk„ãæ)±ÐÆ3â.wÿûmŽüéð7ÌÙ=%?"?¦÷FøQw×1Ÿù±ÝƒvŽØRk/?DñåRïâM‰O…Û ]ËÿAmúq¨kS?Ö ×†¨n|ywÚo™àÑKgàe¸ñÌüÇ¦æ ‡mˆ£ËØœ±cIÁœ7ø‰°‰ˆ¾_Î’“вËêwç7l„öEi¡`ýEsÇ$Ãv NÃpÏ6p$²l3ÑòÎÃLèïmì(’z5Ùw+°WG:"ÆS³~IzæÆÈ#F6v…<õW~äw#$ 7r=¡5iúÄÌš!žâá'|0›×°­€.€ÚF?ÊTƒÎl5§ÊdPx°Z2P——ëèŸO"+"H8í ³ .RÄ¢nóÜ:—`Ôƒ}š/yÆU}ªÃÉÁá˨¾êŒÞ0ô[þöz^¬oTª< 2Ê­¸¼a=¶É‡~,§8ü¹$ÒK ÓßwIS7wÒ%ïçÆ%«ÑP¶*€NË&®6v5Nµ—|’µqÆö-Û\.ô=jó•ýÏ´™Ó»’›b0+ã©BÔ—™&X"’‘¡8Tº´D39}‰Óï ú•Ð@Sé+ozœí€#ö¡ÇŸ‹:Š’;Ö÷¢-PýQwn¾œ*ºÁ ÃÁ‰ÌGÅJ èÑù dá(]Š€G8+áÞ­ÚT('½ÜJ¥o34$\3 îLw¦KÃÔ:^rÉ)%¡4 dÂZCž §^mÄgè-2ĢІ+ˆ“Ïhˆ ë²þ›–ïEEnSOVž3ާ̽ç'B[°÷·h– jð–½ÀLû¤Ùs§y9©"í³-îÒÚ˜ÚÇüFEWàN›‰ûIà1ÇzÁ0S\|~xLÂ9+t.jÐÄ„ÊÃÌàéÚŸÿS…ô…òÈŒEÔ¾J©[LßîŸè4üê–váÑsœ7Ø2« <”àõÖ©zc;y}“œÂåÒ²oÅ·“ÿül{kƒ-Ѐ•ßc¾ãq.Ÿ©œ¦{#¶â]ˆ÷ÉmìÉƤÁføŽ–Ÿ]Íý“&b¼"^»¸ 9E%è‡;±Œîi#býÌ`ƒy®T0Cx@ð]ïßWnˆji§Ù³þ¸ÿJ›.åÕÎÒ¶RÀ­Eñd*$…ÓË€t“ÿ¢*”<ý w>™ÅÓMBêî>gKØ:kªU¥4ëqæŠfm¦ >Æ‹âó)Ä,bŸ–:î&¿àú!¹Í>Î(?}ÓË{–<šJé`HªÖo¬»)NIì#%/=9¶åË? ÁØBÈÙ¸ŽIháT½ß7 F:ý…uçvˆ ÄNÙd`mºaÄöH†3·‘¹[ÒkµCS2šþöˆí‰»û&ÚÉîØL7áÐ&×Dý‹íWûÝø–ýŒ‘Û^h}ìXÎ/${±JVÒ›Ÿ<R_ÔÝž¹Nÿavû^þø¸× ̯[2c_È&i|oâ¯Ê~ˆ¦ÙÓÍØ$L±Ž5P!L†W8YŠ×Ûí!–ž(Ù©~ÖtRiÏϺXÊY΂:<ý;×B¾}óǵÕz[-¿#˜'%Á‡!À&þ1b'ÇìÐÎZø·q >”El0Ût|ZnòS¼DN`›,Ž'ùº,"Z~`ãìâ/" ó]§[“ß}AHÁDœ ˆQÍ6ü±%þé‚^ˆ Ÿ]æl³ã¢û·Þ¤™©Ïˆ/ó’£'ÔÅQ–êBiÒÚ/©<Y`¢¤xz¢æ00Ckï:}Ö×=ßïåìÃBtØ"ÐÞ6 ÍãhKlð·EPLù4Æáq –8`É»Jélc9½{ëu”{åì¶¹£Ä0ÁÍ:5ebÍìªÆÔFµ–k”è–ªýaÓöÒUÙ¿ÝVþÕ²…a%ûžpÂAš×Ù¥±š¤*Ù\™D½ì/£ãÎ.£¤.ÁWŠ,úÙRå¨ÜÁG;YÂljy£ºÉÜɨ\'¿°ê}Íû›Cѧyb >Áý6OsIIÖêÑ›ÎÑöé¯VÚÏ‹z,†}oÒþ­ç üo‡7‘`22$bÙÒ€æQÞG2ÍÀùçl|¡]«Èºÿ°áQfzçu+K.åá“ìáö=Zš“$7©ˆ¼N´]Ÿ¥éê2Œµ6©ÐsîtÅl¿ÿ(êÓÀ–S*l ï»ïúJ<˜ÎiF™oL¼T,Øû!ß "jŸ\“uä“GJ´ÃYiò¼HÑ;Úƒ¢&öb°/Û°öÈÿ’0ã{G­•tó@ê <>ÉÍAæ“>ΠX5¿™+áN•øŠñé`ólYöºÉvÛn—H«Ž¬ð6ÔäHëO­GP¡cWÌ“*¥œb§O±ÑÎ ´£$Ý:Í•XóÓ‰õ.cGjBçŠãŸ?ö_Zõ¤«hÇ’zAðÃæÙ ·>¬çº&å‘UšZ™-ûÏû²\—4ê ³I˜á«r@•H!TÏÅ”³Ý +GÃÁþó0ÉÇÜÝÉ@’ëR3Û4žÎ/ëæ«Ÿ®’ÂÝU)òU.Ÿf¡ü»É{7«;ßoF¹%”TQ“O—.én•Š(y3Ò•ˆo¹/ÑýžØ,ä,ë’ë¯Q‰öXØ’¥ÿþ‡…u(÷î<¹«ÈŸˆk°g2YÞ¸;·¿þ¨Á†Ï½ÍЧËI[ ê» Q …úûûp ¢Ú‡¹jUxò/9Ö ŒR†‡GdÜUh4ðQòÆÎ‘Lƒfûˆ`½má:”Æ[¢È…ÐMf¦~L B;1¡S,…ƒ ¨¬ A¯æQãM2IЂ¬ýܾ#z&Ô—-™ã’ nÖ9Ü^ê—™µÞ@PÕÂÓfiVYµ®·Š¦Óq^¸!ö3x¦.{h—CœðzQ+ß§•ŽH¢FH34x’7mnÊg”v6Îævö‡)ªòŸx=©™÷ïñBMt€l‰{pëMçðÅ€.ËöÚ´X“×0ÇLÑfæ]1þ™üã‰ÚôºðRŒÞ¢ °‡í<:[¿„÷¶à0ï|ó¼Nf{·~¿¶gTÒc»Mé6àŽe0 Aeø²l{PÜnÊ“¤y£»ó$©KûÛo²+5 ð+sÉcN“¼´Ò Ä.]Ì¢7 w˜‚·E®‚¶ªo…2Z£ eÙÅj˜q.Ú^êTêŒ~õaVcDz“ì\8'«gࢶf™n='-h@”6”êÝÅËHêçaIó¬¼Ð{cy(z”H«ÿC®|“öŽ«68iö?—Ã.ï¼ukó3†rË0vv(q©n'¼‡‡|²áö-ßA‡ˆ*Ÿ–{ûo%æˆð}U à[ ¬8â»–ºŽ à¥{Í!¯Ýü‡P‹0E¢4ׇù°«u™‹)‡€Dk…Íÿf]:8Mژض‡þòð¶âÍZÊܲ6×KG…˜vð‡•âYUV}üí\KÎe¬¬b{ÖÔê ztbñ¥T¨‘zàh›Ág@b¼ãš—q¡@—Ý‹i ï"\Ç:“æWgyºêíssv¼bÛU?J*Üü.mt]¶DÃ;ß“|RƒÊ<ÞT˜¾8åјÑ]wKÇñgPõ[–©”³&^ïÕe•²Ô·°!a¡ó(t%Ví]>uò(z*Këä'p 9Œ…ÞÀÊl×êZiªI mîA,T×(h”«TÎ\f„`­ê*F +òB9˜ô4ˆyª¥¦7sU–.$œKoø[k‰éFY£OÕš…Ω{?‡oú"E8©—œ$Í•ˆÅèKçl—]•ª‹@©{L5¥ ’„ŽøçÙE´–r‹˜KXBlGÎd±òÿmÚpÈö6‚½PäÓaþ ÆÓ¢i}öZ=Œš%äKMDRL‰?V@´}è’|¦Ü)ÏøØgvÖ-V¸Bë¡tlcή õ˜}ö¯åçÝCEÝœÄûíðU˜^Ïáz±?Ñ6mŽP—jɨËáíËää¥Þʨ\c’ŽVöòÅ#Q H˜“JŸv^µð¿P–võUÞ&ýôžT¶½Ì‘S-¹gãwHÎh”$=¯†$Ä9Bh5¹VeÄþ©“(Ì‚>/Bq>ˆÞé);7÷[‘ë„–òÝ¡EŸ~£T kœ[J»ÁŽ3¨Ó’k€©©Ð¹ròDë×'ã…¼ˆƒ@ó’5ÿ³íüõH—H˜ø²|B¥/CÚ¬ÝÓhâM_/ ÷.EÏþžbÉ· Fl'ÛS(“*¿Ñ²Q°•¬7ªD]ˆÙÌìSîŸJZg:­['æè¿ ÇWµ|æAÐq¢ï 8ííÉ] xt˜Ùâã±Jû(eR¥£SoËGé"¿r!iQc?±p}J"²wŸr¼pÕŽ³o¸?¦:CM✦õ} ÈßÕÖ²;"Ù}u¸Ô¬üÁ@ 퇦B€I!ÓB@ ‡i˱Ќæ÷Vì`k•æçH^àZ"~eC|Cô±'˜%EÐŒñVÁ¾3¢W9p f¹Ãr]5Æ*[J5†n&ñYŽÉz‡q¤=ßë ʼ—‰Á„,”<Ã0  s6Ü«ßT¹Iq‹Ü(pN{ £GáÕ+äÂì8Ѿk"nZ6|ºÌ€_§âÝjãœ'û-…U¾¾i‘!=â„ßpºÑÐãŒÊ£ÑFÝ Y4Ú¥(NLXíåOKÑD°ÕÕ­A¥åBµÌ¢‘OVtø 9¹Wwß÷”‘q·ËC3@nÜã <¼à)B~+yù¿”vA0¬ØŒd‡bÅâ,;ðÔÞqÜðŒ,úº°;ÓÎÔ/r¡J,€ÃÒâ—µ˜šSÏh—·>ßmdØ,'ƒWØâ5.÷Ën}VìÐ mòÎׇ¤çœ,ÌѰ‘b2ËxP!Zjwä³wy¥ËØL~%Ôª™¬Ìb¯S ªÆQiAê´P3žø'à¨|§½4nQ!LVm€éO·8ÀŽÃÊòp:j[«ð­¾ 9–Wƒv_×}0¥‹O`lK/Ÿãz§Ãš;iiYß(ñÜô¼˜#Õ}“&_ªWÏ9w~RnhþùÅšÜß"Øn÷c=ŸYðdêâf=·Š|pê³.³÷çµ7* Ã’«zå?èäÿ°õ‹…ó1à‹·¡ÛqU‡Ð¸z1ns|Ý”ÐЧQËe{´@ò2Yõ”ÐgñÁÌ^o[­)ûÆ?ËÓ'oaPÃH"¤òfŽÇN vèŠÖ÷üÿ>2¦[Á#T¦Lë BøbšÒâ­uÇ9L§¦GïŠr. .h§ìâEQãšMí®lÊF[»uø1mɘîhÿ'ßg‡°Ø†Xdèørq>ùæöyö¬CÆè‘Z›T‰ÎÖ=¿Ö†4½ôDß¶•ÈOPjÅ?hPŽC-0›cD×ZÝa$@°ç0Xõ›'?Õõ "îdáÊ €t-I˜–É~¢žï(UH§ÃvZ^¡ÒF7û)æÛ ÈÆÆÈ:…˜";Ïr'¥xþ<¥·C Xí{ïÌéÍtc#áTçË#°ÄF~h5ô¨Gñ•Ä¡A¡ñ\ÓSØMCüÉlD˜|Ð1{†^{•ßõu›\ñ8掮H—ç¡Õ½ØŸ¼ÇS=.¢N)J¸àuIˆN;º&îîL _veÖ,â,¸yÍ ‡€ÆÃЇ48îߟƒn™åJ”" ×ä§Jw‚¹ÓQh…Û›{›Ÿ¸}Ï—tQcÓ,ljqÅS óÑúi’GcÝyk…¿Êëyš{Xá^sëî¦9ò”’omý89†ÄÕ©áäã;k2•=ÞÛÄu‡Û‚é¼ïú¾Ì@”N`{³,c NÒQŸóæ‚Jùú/—„Í·@p¡DDÀT5òFé­ÐÚq¯±éÇž;´>qÄW6ò9”íÞqÇøÙ™ ±Kö³ì·IË$Ýùt}ÖÖ{u¡‘mÆ]ýèÁŒ°‘0ï2dxŠéŸU±v‚_ú«2ˆ³‰™C·Fo¡nÉølv]Í,¬HŸ¬lðOƒec7(Ke˜àÈxѳõßµ¬/¾Ç¤¬¥«´ß?üàÔo£í+yOºI,.Qw“© Hgàô`VßÎWý†_,[蹫«¦©—fÅù•#ºQjlÁÌx*«„O¶y<+k~å,lÓëôê÷b%Tg»kó΀7 +"ÒˆÊ&< á¥b¸fÑ@ƒ´ è6€vûpª‚ú£ÐÙ£ÊâÔŸª<™º“;¸ÍÓ šÉ]p—Ö~ †šñ=”žWžjŽ$Ø_ŸÓ|ï×çÌZg0%1ÂO}Úyï:û1DÃp>'õœáE&Ù%9´Ï„šþÇ*3G-JÄÁ‡Di ¶‰Ü¾•›$³ß‡?³49ŸTP§/Z¾Ý¤sïìaMè‘¥@ÊêkŸwSEGìÚóá4; ]bÍ1R'¾|¯gd'° úƒƒÖ¶÷á$5̧ã?oÈãH# *i°kB”žê¨xT¢œ†Ë˜öŒDÊ»’D~ÆûLâÒËíI3i·ÎÐ7œñˆŽðíB<üCZK¢bÖ_¨7wwû±§mèUËð4¦Ü™9Ô³OÔ?ìt¬Óé¦iLh¢D¡c’úskå&a­“Л/±a£Ü˜rÛqpëÛ«]HÚ0s«áU=/øawLÍŒ ü̳MýK›Ž³Øm†u¿!´Ú X„«WDr/96¢•àÞm,°O—”«FBPmÝv7äq„‡«» õj±ïÉÂ5ƒØ×ÍÔÆ3¶ì’¼P¢œ˜á·HûzVL>M«ÜdÀL0%•›÷·#<-ê8 @ö¿IDE¯­öÖÅòÕ‘Ú¢õH@í±]6€ô¤MóAyñUqœksÃJ, ôµÖÛ õüøœñ©Í_Gâ>ä$.Nw±”U¿‡uZ•#½¶ì轎Å+Èü8']T'c ÍCNà”Ö-=xf&†ëÿ:úŒäŠF¬ª×‡wû¼ù&🽂ÈìáƒhyÂ\žê]c¯vûÞM…–èR+£þ­ûÐxúJy2åŽ:2¿cf™™óKÝýŸÃƒÖÕèá€2~sHÉÙ÷Øô0é:õ &Èn…ÅèÓK˜Xî±Ó㥷´k> S¨:íÙÎbZê΀xÇ“´XžÉc˜`¿MÈ CWve(Í“ŸåÏǘH(f¥Ë>}ö“%DI ÀÛ¤–ù—€èRà¹2,›,b/2v¡ÊÀ6‘ø‹Ú÷./ïl³ÂíÞœE›èÞuDª¡…ˆ y˜q(“æUŒÛäO]fÙ( ]vä>¡6u³uÖ2·ýÀp× ®ýÈjŽN&̹»!³”ȃ¤f¦ ݨMî¼^“²n‘Èúïn^óË0%Ãòìਖ4Fœø?”ûê=Š\Øu·±Þ3 ã·÷ l5Ñ Dëÿ0Ò¡U!5_“SÐÂP¥Å¨Ð[Án”<8Éü‘U`Lª0œÄ¤k0$¤÷µ=Œ'J¨úSæÚ F vМ>îähe jÍ»çGð{™Þ|HÓ”gM~Uð.IœÅE£v£I]W}ù »Xw'[åþ‘fù>cbJŠÚÊÜÞ19ð¾]ô¶€ŽñÿîFû&•âdŸìð@à •@´É(ò㚪ZÁ47—?LîÍšïþZzäÄöƒIÈ/Kúº8”{02CM×¼%géÛ™eŒ4Þ>€¨aÂpé…œw#Ýß;£ï§–×nŸ /ÂJ2ÒÀõˆª™€u).^?5ËåöîÏV ÍØ<”Ö¬ç5‘ ÜvOí¤£§ÓCÍ@hÞ_±$Q¡ñO*Ԛégëg‰Ñr3›„>;Z#ŠïtŠ B©6€7ÐJíú-fo›­©ML€©Ž,SÆßXWãnI‡²=×Ñ[•“ÉmF>— Ú[f&„i©- _gæ–œœB9fôö=Ȫ7ý•åÏä§‘ëãIt™Ž€u`”®O÷*w›°¤Ä]tõY[V«6‚­Ø©"öÙJÜ/?7Ëö=—c-’a¦C”(þM ŽK»dùƒZz–!’åa] îÆÊ¿×ˆ'9š~P¶ÅHòšbw45š¹Za¶Û³1ÄTÆ7¼‡í”Óx·ñêlfÂ/à>w#´f>ʈþd§›9_š°ÓTdièuŽÿTUh¬°â*eGQÈ\ÞxÆ–º;û&aìîI Ôâ¨Xý©–²„Þ9ȨlúËâ94t®Øn!“¡ŽÌ`%  åOü¿@ÁçƒaÊí¾|A¹WV ?“\ÇÃ&íÕ™Íñϑٓ žÔ3h+—K•Ûi5øP¬1Å7‘@™Mî£,’?‘ûß㚬xÛrrYæSˆ`"‰"·i Ë ñÝzY_Ì X)ä ER¸¬E1—•Ö.æ ,‹Cm³”F§¼Z•bLSÓâáp‘þuºªÉD2úê›]޹Ê(dPN}sûþþ„$öžÁ‡)¨÷æÀ™u–Ý¡ï­VÉÂ4ú k?JÒN=Z}¶ôW”{€ÿ*KÙ”s’`0 8œ–– ¦cÝ™T ˜Š6WÐÓ,¯]î{äœâ‘ÇÌíú¾0Ø£ ã𨶷êÊ·Laø[ñý€vˆÅÆŽs8R¦°´ZˆÓó¥—V€æÖ°¾Å/ýتÆz¿{n£jªS—ƒšp}µ›jBm]ð¿N\ÿá× Wíœè7XVL¾R”a…˜¥ãÀøðŸ7Ä#,öDˆ>°“aÛxΞY 4Þõ=änr÷¬ìJçkäåÄFe–W-z i|-Ûu_:ó®Êï‚ùžüS *çpÍaÑ3€žµÂÀÉáÿ‘‡À$-YY÷´e)—˜lñoE€pÆT‘Kæ/{Ë0üïÎö"2÷‡kë@9¬RM,ÿÞØ·Õç¸Õ…@ M ÓÚÁQ¤æ;?Ëîë<žð_øxjOƒq- ³û%F°d÷ úë¤?œ ueëB¶ÑZ>ä­Fb‘Ö=kS‚>G0DOBL°zO+æ>cÁ‡R‡îg\?œ´³7|Úüm®¹Îg¯ ;i±Ø¿ë§¾)y<„úïð$`âÅJÒ‹E¢Gã|#ùÑÕ¨}àh3H>GxžU16'¼€öÅ=ðDçêk7‰cÖͼ˜ûÒ÷`¯®D`Ü2ÌP¡"Ðò’¶› ˜ÎOjgœo¢[W?ƒ6'ÊŽçAõb¼úÑqÅ>ÞX]=…OÍ;úf±ÈŒèo¤Ðež>Wàp‘vc–£qsá^ìpàì¾8¥e¸?Æ?©Ç!¸¶ò˜™üõêÁ'çÆç‡Åïg·$ͽkqÓ Ä—ô_º66C}Èéöëç7F?¯&+ï ¢†«óµ67g:°Þ`çŒÏoQ¹ÊÏ«Ç/»ã5•n$Y’ןŸsÔ,qëƒï—5"1I¶ÛápKú ùµ†ü†¡0D‘Œ¡&°±ô\ ·/÷\[Y[ƒ‹xJn24ø|‰r«•7¹Lì’¢AÑr¸B[²u¼i¶þ[–ŒásÎ/ÜÆ[‘X•\¹V3Uë2òµµ(fí …5Sói¹†àNi±Q¥>ÿ 7TF³Ã?ã8–újÁÞ?¥Œ '+³»Ôµ<£MmVáqŠ3±„¬±¾Œ"¿~ûÉ•‰Êd5×ßï'\¨Ó±[éé4¦5޶¨Ÿ¡6hÞÖ¶ˆVV/›tŽ@o¿îâf÷“¯<kÒÏò£/Ìi½É=ä¢BèkVįdÔH.d»Æ5p]|¿ŠJ§0»vÖ9)H–ªx”•³>t½…q—w\&®»gœ†nj ñ­µ›¢NèøQp.c€º9ÍtšàÏ=² ¤Hŵ1 Â/xP÷~cI}h0@\ÌGK+ÀaížB]î¬Æ¥á³ÊûdZo#Ö>‚†{æâ‘a·×Ⱥ‹};ÊT…~!Ã+WÓ„¤ñÆ&|O¦þ'$oˆácjùp^º¦Çç€Ñbö_Ü[;e:}$;Åmm!‹¹¾^8 ûËŽ£[£ßÅ _^¿1%Šñeþ”&…Y‰&%Õû¢0#Œ*ÝÈÖw—ÒÈ¢˜bDTXƒ’´Ä0&ŒjCö᡹ nð—ÊkT`…« Ø|^rã³O¼g%ª Ýò±òb]Õ j-ýÌ©R´8E=²Ê Ÿœ1nó7’ ·ë±$ÑnuSŸåu#Û îèN7³‘ø@¦Ð„=V¸ëi Õ°¼†d±Û>î ’o½Àª À}•Ò‰zò»gqyk!ù»˜úߊ¦Rqý­[³òBU¤<¯õ‰«Åš:–Î`âѵ¥õzæûª0ÅÔFtˆ­ù‘-ôˆÁ$§.d¬Q•õå¬V6ængœÇw;`i›Ÿ¼HÆu¼ÖçlËÃqÝÒö Bu£|—+Ýz¹—òØ{ªv<Á|SÍñ– ꢀ¯9åd1²Nf¾)œþÚÊG#g'ÐKó>­R ²ÊyÕ/"Á¿Ð4®Î”°¶lØ‹ƒQ©q€8§ /?[l¯ÒÜ“§3Œ9¥§È©#(ï“ÈáÿSÍã8hΣ©…¸š­Êe¼qÁ&ñB?¼W%*å€-½«Hb_"Ƥm®Ú+˜mt˜3¿š¿w$n¬¬¿æÖÓ\©GÎ.t¯a|[syÔÿûºKè> ¦Õö¥¥z s;?”lh$1R‡D]˜ol~‡2 HÂæÿ—Fìv"9Ó’ [‘¡“œÁ˜—I§•®ÕŒUën,%{ÇLáF›Rs=J}éW…wù¸9[8[öž-4™\b¢Ã ´»G·ŠŠ•’§'_ˆ ö¸ÿt:?¬39VÜVåÖ;óíQ˜^†öΆÐe9h ¾q†§©-«æAFc,÷4¼ž#¡»o]îÕ·B•©2ØÖ5^÷¿–:@ÛbIæ¹+¦`Ñ\ô£Í,‡%µ/ÐŒ|NF¡ïĹυ7þÙpç¹T5?»øŽúGRT¡+gn² Ú{ûš· ¡çO$ÛøˆŒÑäïË”÷Xãò6œžöšdßzZ»‡—Å6u¼‚òa4a”w¶GÝ¢°~ÛTãN]ž·C„w ײzNÆñ½ïD¨Ç^{ò( üÕ‹&¸gÜýfºl¤€N†—`¨ö½»©èXDÒ ÛCN¸žêš'£„ðpwÊ(‘Õx±ZÕð–Ê ‘|ÅÛ;ÿ‹Y®MÔbmäòêWPˆx]NMûzßõA°23'´C¡h6†ò¼×†tIKŸËÌ1lÔÛ¤×xa_"úag¢Úh}eÊ%¯üº¦‘ kã1¤ùŠÙ.á»@‚aÑbY:ØÉ˜H*Ò¿/¸òlªÞfX6,—K¢òÖ5ºÉüÎåheŠ.|ü®àܤÄ3~•Uö]3¨±m”§®Q¹Òñ¸RØôá)Ç·¤ÕŽ7aIhåž¹ u‚snÆÍ]e"Z|¯òNô4Eå½8^—QÂõY#“­\-ã®.¦ŒvT½}®Â]?¼_yûÒëû„3äâ;І˜«obp8€fáWëUýOÿϘŸ*4}%o¶ŸªÇX„,»6ÀQÚ1z[…-×áå=áz_8yðþOF/u¯W£‹v6²4Ú€2WºNuÓ+"ßÙˆVÑø íD\ëùtSZpô¡2mÙžt‡Ç{€vúoŸ!¿)¤qŽfð[1 Öþ¦ûÛ>æ~?:fR,ž’OÆ)¹ø@ d5Ô™&õ“`Üžvƒb >‘Š'`6°*×[Îsö2’©Æh–S‹Î¼ÛS H%¾ù]®ÿé%ˆiGßš––ÈüÙ$P·Ç<ßÇd¶zóð¥ÛdOpœâ¾Ì8ÝÄ!ÎPP*Í»dƒp€¦«uª0D6l#–ãRGúïI¡)8YòñÏøÁáVd¾š~š«€è«|¥‚ÿàÈíå~b¼?—·v§¾T™£ùRe7Ö_†ÿíy¬¶ÀBÝÎÍü˜†Ç"¡¸À ˆÐž¦f--Ýš ÇÞŸ9FöÇ%¡ËYmqɇh¡)5….HTº¿Á †> ï¶/5É™÷5 \íA”*Q8S›l؈„6áHõŽjÿ²p´®ÆCÒÏB1Ó@ó½åÓ|Éq‰ZèÁ[1î zîó„Hªÿ…zëï=eé×ñÌ’¢¤7í¶WxÖüNZ8 x)ŸÕ2#˜Û2JäH²o׃ÀØzFÔÀ6QÏ:îH½ØËØÄÎrx®ÈqY=¤–ϱMÉWöઽòdÊd.å¦CT‰ž¯ß„¾. ï7ž!´m @Îýî¯Y¥/,Š&ŠäÆz˜hàniû6Ú+0´K±p¼€K×^·¤é_8ç—÷6ùמy²Qéωfwð#ª§ñ0]{Ö ”¢»ŽŠ£â¯šM…3%oAˆvú6œÕÓÕkÖíKÛ ùÚúî‡É9g—†CñeèDÌcÇù’¦!¹ˆy°§ Á*T©­¢‹O*R©at_€¯ê0Z5ÙOŒJŒ‰½ö²â_h×5¥¡tÁŠ#ŽX¸ªˆ“A$²%Ñtâ‡3JËL½M\¹qïl?÷hõX×rΈ¾RÓèú9æ…¬ÿ‘äÑW今"¨Åš ;D`ÞÏ\çëJÞ8ñ:ùÌ¡®|³{¶³ÓW9w—lÛª±( Ë#Öõµ¨%Qùí-Ù ئbG â‡ùÄÏâZà‚V:DåµZ;½¦PnXù"™—+îŠrêp€PL 3͘­Ÿ‹iQþ¤“bQï­Òس¸õ“>ØYñZN7Â…±‚B!ÉS:õ\ï,oOH”ò*šk;rþÂhP§³KDª¤Èy;Ô|¥¹ kfÍn¦¤¦‘ívû˜©£2ëŸ^Ù_Û¤¿0¼%º¡Aë1(a .Ç»›ÿ‹‰Ö¾ÉìuQ¸¿/G†ªÏ7–j¸1TXc.ò™™¡_¸å¶(\ϼ/gòàí:˜˜C$í‰ê>“3X×RηúÛ _uÚYˆƒôŽò8ÒÌw˜ýÛ«6‰…7ŸØÃ15Þ¯¯íò|6ÔN.FÕtLò¡F«‹‚(,è«VŽØO侚åñð¼O£•ÞbÇäºÝZ`[ü¢$Bmäl­µðH3T’2>ÊÕVU|›Èû·†ÓCpS¡8]!LåÅÛº —Éš% l£Cà#4C ôfžÅRk«Yþ SÞÞʯB &Vû|”Tkï);MnrUÇCÒ$ÂøØ—1è ‘¸“”©JÌVÉ4œ61µWk\Ú3Zî¢j!I²*D‰è;‘®96L{°v–ùM=Øä‰A2·~¡µeÚ¥Yâ9žb¬–X÷z¤<½”fPuÜñ¿lŸiT8g "ñö®ï˜ï=²–:ÉÛé ÝNrÒ:†xE{$-&Œº>ü%‹È“œ7üýù‚¦}ÚÑt˜P' äª yzÔlqÕÄLdbd€X©cyo^Á±¢‰HsãB¨ßý訉¼V:¿Š%zôÍ8§¿àÞPÒŸ½‚›F}ýÆV…IÑE]oìö(yÒë*hš²ÆÀTÃ9ù ¢¹/ ¯ã52 ãâûÕe–.\„ùÒ-&§‰þpo=­g” ÷#·'ØÊ »¼®•”›p—õ³|gâsI%©TˆþúŒ77¤1¤®Ëb´ôÕ¹žTýëšÕ„«€Ç  dlç(¨÷uÏ´;Aû"{H:Uú»1’i•ˆpèô–MÈqœ0°}sP›J±vöqeF§IËØž îY­LsC•DÀ°jR¯X;î¸ÅF™·a¥~9áË{h¦Ë5’Š1ˆûW åë!±n_/IîkP\ÔVo^‚´wʤÆ0î(Ôýªê™x%†‡›ÝÊê ¶¨±°lÈ3ørK½XÙû6j °©€ÐŽ|²¤­ Èðî¸ËˆˆúT·`|JË¥“¦Ñ¾¨ž™ îý{?Ê+…Š…d7'ÿzn¡e!jx|tz;·_ÞÃeÀü÷·#¬§bÁqÈ¢u³5Ðú+‡ ï™êk÷þäÅ\m·Š;ó„P¤ôwùhæ~úX‰³¶ç:ßö3âÐпHã?c2Fè'Q¯®DA!KHÑ‘5‘’ç€hìû±ÒT¿ÿk©Åí²#‡ˆ;C²ˆ0C4±{{èn$ÏqG~á_œÏ~枺ùdŠÜ?ñF¶a/iè­>Ïlw¶ €Ñ—=|ÜáÙa*ð[|(’6šuñÔµ—ü¯8Ô©‡6MKç0R¸þÌêd8­@t¥uø±‚k9•]‰ÂÈÆ'Ž’ ÚtY½ÐIÄ-µÃÏTn¯jy…פðz¹¹ùåû¬Â¯oóa¼õŠ0:PÅ„ê„QíÒUä¤ÝìÇæa¨’5Üw÷­²¹ 3J}*åËLœù3&v0laÄZÀÊ359Î'I8£žOÀœ Þ¹çn¥Ê—ý¥XõŽN/v\ýSD$o³Ì¨[Ô556¬§ý@‘HeÀs”lª„Ã³Šš‘=GJQf°­@;1KÔ"¬@r͈ 4rÿâŒÄqC¿Üºgc;M^R@(~µÍ6yVxÌ^.=-ÀdØ›å&ÃLÀ†w²Bw:›Ç8t +_d;sH³SY÷ÀäK癤r?X“‘’)iÄ’uhæÄ1‹ÇBè@(õy°Ô¯;N ñ.“²åy|;¢@·m U 7–ƒä^˵G·%yô1SÝsK¨£š-)Û.'eQu ¤Ãm{È)‘ÏXIDΑÛE4g¯n¾}Þ8T ëbGZW(P”ÄS¡Ë¾—­ú2p“3oÿPœÙG˜<æ“•%†:‡ uœû'aãdžB=0XÀÖD_ Ì@Ü™ép–ÎìŠJTq;‘Ó´Ôà¼c–eþ™ƒ!‰àŒÿ¹Î÷$–í„5«g:Ë|]È>h3¯†=F§,¾âaçºû*Éyp€Á÷ä‰r}dG†GÐ1z¡ëeŸn$é½~ Di6¬UÖ—î’Å¡¢} ‹~™ˆ$©nÐ^”½Ê!ÂÅìCÇ©€³PÌ‘­Ù§l£0¹{håµÄ‰ôÖöÔÓvœ ×ÏÿÃÖÃPR+hf$.x ¯ê@^™`JAÕ.‹Sn½.ó5GiŒÐŒÈB‘Љ®KÁM¦°bþÀÙŒ~‘ Ñ§˜ðÊJ†îwÏN]÷¿A~æ?¦NN)c(ðÓB½e[Ïî¸!‰{÷aG•Ò´·3+uƆ‰úRýá žÒ,Ü ¨·Á0¬¸‡ýÃh ÝãûOrc®«›æj a=¦©u,×Õx=­ÌÀÚIVü0Ë'èë‹ +@ÞÐòO,Û²¢<¢.)PkðÃbS)¶y2óã8rÏüP4o¿~Üqìt¾&{¾1ˆØ‚ØÙ$ZG¾ÿ‘¨Kè[} 7¸DŽ®ôŒÏÊáþD© ê¶+޳gJª1ò¡oè°Ã„9úºdš*·áD?Qࣀjèq.L…ªÄsoÓʽ œ¢äç¦;®ÜƒaŒtEËg¤w;„Ä¥ø´6IlÔûåXÜY…[G¦[™À ”ôäSüŒO¥baê,ì±G+¿x÷áäoø›—ïKKŠóº?ÎÕÙqˆZ<„6TûÌ0f9ŸÍx™]ª Ч ÚŸÊÃ!\æWwå³S?^¥Klˆ“ˆ&mïa›‰pÃå²À™› #15<•Ýï:¡%‡°ü™´ã6ÛùŠÿ"qîdDàPï¬kÂ|ö\(à ð¡a•ïc] È>ïè ,Rp-×îÿ´8›¬(Þ¢æ7²ç®º1MZ¹…Z´GêOZ ZäÄñ`ãŠËœTo§ §®á¼cSSÿµÀsçDçðT|É«TN0‡ª¿²Žø ­8Z«&\„£Ùl@Ð^ÏeEÿmH=X4çC~ z·¶õ^h…G3Æfñ†®hÙ OÏR–GjG=Vß^í6 9‡ áX·VvUðƒ²¦÷-ímáý¥XÌâíÈ,ªuùBYžËÞªME9;eLOãpu}Uœúît=f8Ä7%„›SÇÜ¿òMŠ`vù¼vm„~ÂWÖI ‘$3H·A·gw ƒAÛ‡©ËÎg 2\Åù#E°>uDTÙŽ@g§Ãש['~µûì‘„" ûîòŽúvãÚ&sq|y`´4.ƒÄh{kö®á²C9<ûì9WfÕÃL¦¼(oÎ4;Y˜Cµ†¥®ZS0P¾Î ë’JðïQúMÍ/¶Gsdµ!iÜ>Þö?aºú†(-4À&˜eígº’Ì-×½o¯BËϹÖP«óQz«»6)ç`÷XÀ´¯ë[j_š»uOU¼œþµgz3Ç5Ù»œ+³‹Ì.Bi<Û’„gå[Ú;”s#Néâ Ho1Êžq¦Dø¹>· ‹ÄéÁ1TáÞ®•ñvi…u¿•zq„RÓÌÖTrsó*ë@Ö€´çÍK™hwòB—´v_½L›àÿb…cþ‹-¡0 â,O@¨qÐc¹okÀIVYEç ÷ª.Œ­ÐA|šÉ.œ¶ðyzòX9Þ¯•ZŠÉ¨ ýJ{ÃÑ—ò”Gÿ¢Äjn¿Žƒ ²nÓ/îkÎHðdKý uؓж}Úláp âÝžw’ýÖ@¨üìüü4^¨kîÒdŒhwZöièÅ!þö¿¦4n¡Îwð©óz14…Ò{{!; mQ÷^ÀtvÜî6 •„¨ ×`Â:¼QÃͼÿ¤§ c9áìëË]ã–4,[î"ØÄmì§¥4j=zcoùLÞº—í>dmÅEBji­_ìV$ëL6À7&€œÊÂã–0¶/€q2ÇÔ=X†ýʃ²Ï™âOmèY]ÅðòSÇvªÆOj æ¹sÆ\•Š”Î`m5eJ ËàÐæhf ·_ yIÓ…¬µ@ÎIÒë«â‡–OC6 $|¶Ë¡7¬D%6 ŽêRtêâU·c51вŸÏ“Ý`EÚÝ\&¤”¢ÄåÂÞþõºæÌ6Õ:+£d&-»åP×¶ù0Z‚Z½® ]¤<~Œëj©ow÷€Ï‰žŸÞV˜¹SÁfа¸ŽÇÀŠ’ËQëG<ÿ8›RCñ°â 0V0µ¿1È9Ê¢#‡x;šoÁ͉]Ã%vú+ªƒ‡zÉgŠ-÷êÑq OƒbÇtj­\J71"”¹=çM“Up\󩓦EVÿ‰5¿jEŒÔ¯¸? ¦üü7©ƒØ%㪡¬'ÑÙø‰Í–},Ÿ¸¾xóu Ý…²#¿Ý6ŠÆÁÞVn˜6j>[±1bk29T[M0qјÕ̯RñÌ®Í(‚ñ¾Ý#êLpš ‹Õ-§Ï‘hÏ`Dæ6;i£Ýæ5F3 @ë?:/Ž|oT6ýx>fÁ8Ž¥jý6ˆðRÐl¡a>àÝxYµÓf ¨½$Œ–ð=H? ÎÍêïIƒ¨§Ã5¾eóCö°“õn¹+)†„#ÌB¼èç¹Æ/쇗d¸ÀœBJ[Ç0ÀvWz7Î#cæT] Á;Tˆ Z”®“ž+©„Ï©_R´W1Î躤RO*mVãQÑj²rB~Ü,P¼5Á|Ö£œò#~h!¬ÌWʵÕÞ­PP¦³«Û Üè A3(J·(Щ(N[õGf~CMúºŠáØÄÒnŸ(ˆcÃ…°” Zr&;/;ëò+VÕé!'9±ìqm+ äœvÉêz=©W:™šo8RBQïŽ0—b²Â¸fFé¾Ã¬ÉMb¢[ÀÌLB¼·Õ&R¡î›%8Ñ0å“ÄÞÅgλ‰v‘a6‘¼f—ÁU¶MPµ·Ðå5õBk}„ó#(škÒÂAÎNVâÎ1"…(9åÆ!~ï?Ùà*É7›óM’àWpœ¼T¸¹ÒÉœÃÜÿgUFÖWUÂþö~KÁMUÂ÷Zí \eëÆ·åzšK³—¡ ’7”ôcpV)ÌS‹(’¥%°³|Ô‚óаåîCôˆ9YfÞ±àšWû²äŸ]z;IT˜{ŒèŒøqñ5f~ú]7W©ÌÅeÅu¦·±NØŽAî“`2jR˜[&r꛵Ì’ý½œswiõŽ5rd9; Ûº³2Áœ‰Ži)¬Aé9äõQA@"Ú‡aír?Ü;.T5vwFvd¹ºê±ÆóFå÷CåWwù2ÂY´ŽØ¦ð›°ÅÅëã ÆyÁVãì^À™$e¿ÌC—¹ûuA½Ý9d”ãÔ<<ùÇë ‰‘7áØ0ýêêŒ2u`äP 7ð8M—$jÜmj8¸n¬w¤^rµ\jÑ!´T¢ôº$ÑKñ“;tÚª«{*¤ä/Kré.ÍÚ£ûŠ â{Ų†KRzZ¼ž Ø‚V¾§ î©~‚ïB\…ZbžxÆâ]-óV? ÿµÇ…„õÄ¥Wêfj²ŠRVq¥,hñõû•qÍñSÍÂ/©¬DûÙ—á0½¼»£éÍ8¹Jˆ7[Ï‹ C¬CAW}CÆONfA©Ux®jÅ•€Ýõ?Ç÷p ¯é­±Þ–F¨XoúÀ|øÆÁÌãùðˆ-´ÿ^}#³fI.ÚÌc4¶CKÓOT?i-sÑ9ç »† xD¬“oƒ?LvêÑ“P¹‘ÈbÓ»á१«êCí+e³ÈýÏ¡ìcx&Ü ªô4þ¯i€yõñcv[…ÃÛ1‘‰™ ûŒ÷ÌÓ­±¡)[7 €÷àc Eø¯_¿ÏXžøü‹Ð@^LW$¯Üë!¸=ÙŠÃí5§Í$2y—ÆŽ˜shÅhÂí@HÄÖµ,¾ï¸¯j){$=•-I–º<ýDø 8«Í<0kÞ2}õꙜUÓ5¾QaVEñÅc~±$ D]xñ× aزÏnZ ë,¾<„RÂTëBÝynQKæ6í¥ñÝÄ= Sàr¼øçžÿrá%f9J‚GJæßn[Œ‡xR¤eé®@ò—š~÷Ç»K2€=eõ<|—ï>Æ„—0j;!]$<ªù% DÞ6âåÎÀI‚tÚ)u.•F¸-]»1+â‡S âò‡;»%”c鎊åêu¨Ä•ããÀT¾¤à ¹bô×c-þl,Òs3ÂRà·ÜϤ¸hfîŽü7j#y¿yšE;A¢³øEÓ‘Væ?2†ÓN*cú“9è8³5€›¨àt nx´¬«Ï¯+Ë80,†•PbgYw/9±2ÃÅìÎÚ•—äS¦÷SÆþL3'›;¼ƒInÓXp-IÈ<.$$|0<ž[Îô@ñ^2i ‡$E _’‰jž4À«V'_¦0«âÜS¬Œy^åeCq€Édƒ-ÔáHÌ$¢|Ù7`ðú æô³±»KŒ†žLÀÞ•¸þýk¥’Àͬѷ$Õõ””~Ý!w§…ÏÊ>mØÆB̧eCí…É>N¾r$/°Yñ->tš*D¤¯Ô´ÞHCÉEíÛ$»i¯[¦øæD=á|GÖrÁ19ñ‡ FëJT0}7xéx­>¬‘µöˆb™²4Ð1*ŽË…g¥„ûâ>…Z«ÁΧ‡e+Uãæ´|Fš¸m?0¤¨€3ÚŠk¥hÞ¬ƒlÜ,ýK¸?Âùƒ¬Ç}­“«zóâû[4ºá)©Á†mþ벱Ͷ£\¬3f[ê@*ùugÊOÿÝ]ëâ{žÎß4…χÀFM8ò?Ì*\X#Ù{C\ÆÃÃà¼9è¥øã¡ªÕ>a¯W Ý|h×ó”nžpêNÍæ@Cª1Ç^²žhÞ‰L¼å¼k¶>G¬FŽ[o©÷ŠF¶E9ùר¹0åÐ쵪…•Þ»þ„ê¶ÑúV…¿žWIdtªº'zŒÉYÓ£p2ƒda×›Å|”î”'´è ÐùŒùî:$ô*K lï(Ö¸‰ #½î* àÞ,•½éu˜û‰6|]_÷"ˆé=‹£U¿°Õûå,ê…ãv %}õd§.·þG´=,¼ÈD¸›‘óŠ¾ó³ ¬B*ûnG/× ²¨¿gB7åÆãÚÅZ“¤!áüYTHctÚCÓŸ™t+aGÙû÷ <ç°FáÓ̤÷­¨“ á «ÒÛÙz¤ñ™aI9ŠkâÍij°îø^%XîŠd°ã±ööXÀNççHGk e—´ úßÞ¸ ¾”Ñ5WbÖg†^3lX¥î½l$qWRχë!/,: T‡±Œ‚´ú¬¥šê÷Ìù®pÍgòÙÛ gŸêë"âpûK‰•iÌTAHM±î´éÉ i¿i‹×ì±-‚Õ”Íf¡ ŠÚY ˆcÝ&ÝDð- ×´3öa‘_×…œ9•æû6CGØÏîÄšuŒÞq̵UÃQÝ©4_¦#Xa##' -·MŸ#Ÿ«Ï¡`.C[Bß¾&Üjg¤VOž{nßÅfàGêj“ËÞÑ—åÓ kB蛘…añ…Íè~á"§‚Ñv>NI·T[dxÿ\-°øÍñ?凒®ä’­Òžû£ªN ànòd¾j¢ƒhŸHÎK8cLÏ…2ýåiÂ×íŒ@^‹Yƒ•Qbèa¦€¾18a‹6ê8Ëõ>¿»;М³Æ+,à9™ÚÏ^aû¥Ë6¢k7vV$_°þ˽ýÆô¼«ÙÚzš·óñ"‹fÆ„-ãxqÑØO¡Ã Þs•9:CI»Ðv7±*’HóÄÇ¿O™±okÞ½Ö=Ä4 µ;(½Ê^µ<¦ïýžs~IZ ´%Û!1–:δB>ÊÓÒŒà‹EGÆ9·jè¤ñß1âlÍiöz¢£ŽÔ„ºõ>Cnm~œ¦D븰0z)[?‹¸(ø‡ºÈÊždÒéÿù½½6Ù²éG¶ñŠî¾óÕO¾“` ‰;•ZúŸA­dü›T!9#cetÄ´þ¨MŠ.b)ƒ«ßÜOÁâGÐâù‹‰k|4“ë„®íÁ'q]XžUgº&È@¯Ã*J2éãš:1øqЈáíˆ;UÕ6ëUšïI ˆ„̳dœôJ"tzJõåé7qYèÎr¾i»žªw™wjCÍô,üÞ¸O?¶iË :v†›l¼Õ$™2Fs tá’ƒìaÃ\I¨& —»€49Z™g¶g  ÇدVÀ±Å#ý”=iqÐÈN¤´Æ®Ž®RzÔŽÁé¶BY$£(¡[z†à_œ V­+hQÈĉ€C…÷¢2„½M2 ÊŽH¤Êœ u&QŠÛ_Šï¥ Lã~« -{Ðmyí£ ÂStHÒ‚SéXÛ¡+ª^S,&ŸY›£)Fª¨Z90ñÍeWfNÏÿê%욦Š(ô)Q‚æ–Cš$U2äNå;©½"rµ<ÏE›}nÍ=è±£¹ˆö´ÞœJ–º{{¤˜Œ«%µåõÓRzi‹‘ÖÂ0¹ŸÖquð+Rt>6\d†ýÈ£°u‰#¢ãíX(×q9™_ô6t«åQ„gߺtè'@±ˆ5³H(ý™?Z£ì½Û•6qõ¤é"ôŽÌ>ÅûRû¹„vòŒŸÓõÿ;—­0³{ä+‡Þ€WMÜ–›–ÖÔÚ¡F#áI qÞ–É8É›K“¸(<>lçSßÎâŠùCªl¾·*ïñ5lù¹ô©¥Ï@Wž©:Bk‘¾+9×ô`­ùƒÅ ²`ùÅu†/€ÎZMIéÏöÆÆ{Hp hGeáäJ«ªmì!6Ü–mžÕ·iøQ\„Ïžñ|{ÚÝØ7¿ÿŠGâãP×°5íJN˾ó€i=X,ÔÊ‚÷ô!(­Ëx’”y½½lõ ¾²+ùfF@›ƒ66µé¯š0ጧ4Ô`Íö¦!­ªŸçs>n|6àîë;H¹çלߣgiÁñ#¬ÂÕlÈW'z=CìGÄy±AŲ¥+ê3nŸ:Ñéy¨XT©·Ä6^Wâ9âÿìÓú*õÌŠé¼Q^£á—Vò ø Åè¾”Usá&È.†ã’…)õA r½Cõ6ÙÞÄÿØÏ­Î–{2&ìˆd„DƒðHh7‡† õ"Oö: »o™ j&vOÕ­¨MÓ“%Mñ¸Ü(|‹#õ~È1š@ÓžúÚÔ&?ËSõLM£jRçu»Tq8ð¥ê«FÙ”O¶G‹19ž9ä]à"Ž8ç…¸Þ¢ÄÈi÷aÖ[‘ÅR¦½Ô|F,O½ìÓ‹I$;OÍðÚúà¤]dì†*M`9Fyåï0h‘:FÙ_ô곊Љð@3Q~÷²ç¢º{°®Û}*ëÇ·mÊ*,6_ó%rÖm~Ž3Ñnל̓Í#;:!³´ë…?K‚{YÒ¥ZF`å7!rD¢OîKŒ,ÕÙ׺%À¶íÕyúîœiÞ±tZë?¡…o,¾RÅÆ©Úƒ>2 ‹š¡æç­¡M—rq¨j õ§ýT=˜FÔv†“#ž¯mˆˆCήpˆ[2ºú)o=Apˆ•`XF%R惦ÿ¯êØIìîB¡­N¸ ™(Æ£Ejèˆvüêo€écÞ[ëŒL¸äžåÃ}­±¶ÞÉ-Ÿ7ËCeNÌŸ©†QùYÔÚìÀÊm¤Ó”š£w´9›PçhJÔ‰+±ìÜQ*= ðÊDE¹–¶÷äH.€ôôÈÉ`²›0lªüW6±f$ˉ x™ƒ¸ž tQÏÞ°¶K•Àùa^š­áèEuë‹sSM¸ô©Á ]Ñ«™²LÄÙ¬CaqŒøK0rú¿œmz†4fëh_hBºlº¾#²PF†Î¬Úáp Âñœƒ_jÕÖ«n)?ÎúŸžðßR;Ù4ðuä¬íû—Uo‡™Tô©y*WÆÛÕã´ Ûs·nŸ[™±BÈßë¯M#7ˆË6»šg·v²H=h!v9MÅûû IÜõá˜ÓˆGŠÐ¯´„˜ØucÆgÆ}®þ?Ž›i*Úæ}îêV©>om“q•€:Êlƒ„(r-5rxHÚ­«æÓß˹Ê}ª}yu ì(E•Ñð¦2‚žË9ˆoÌ ÜîtXÚ &t7Õ¬Ë^Þ JÜ“Hù>Y­ò¥ø™?ùŽÆ¥:šëØ2—Ež…"w©›ÆëÑI¤éi}£R7yðn 6GÛÌÇàÂÍòpbÒEÿ5ã}Å4±Ð‡L|=æ/â+ÅòJb;K¬"=!Šák×Ý'¾³  È?ã1;RtÃÐÿ)jˆZïŽ.çAƒÊHð#å ”\8=’êñHT§ ÞKy§ïón¼ ÈîœûÿAîG®È8…‰ûksõ\cÓ!°À/A¢ùÍÕš•ÿk\R‹1Ï¿ ÛXvv5˃0`&ž Ñûåµ9“²ˆ‹bI(ö;±ò]•ï:µ1ùnû 0pLZ8¸{P¨Ÿg¹•éÝ-eAlãŒH~ŒtdåÛìûËŽ—·ôP>´©QÜv%42Ì*¬ÀûiÒ‚,‚Ü UTO=YVŸ.rÖg|`ˆ®ÿñ6AÈ™ 86í 6”õ-|t%œL ˆZ¼99ƒ²=Λés¿‰Ïî%'ú/ªFÀ”C¡ýJŠž𘥔¾ˆH]û p©ËBÐfp*4“Ó§3j9`po¥AoÃ÷]8óÞdÓÈ]—þºÂ#ßÖ÷<›$Ž}Ö<Úd4AÏÝÀ› Û@|^Ëô“F,¶HY—=FØ“ÇR}ˆJ,e/óV«à(Cyv€õüZ… ö¦ƒQà; ‹&¸nÝâ×äž”$aQyKgÚDj Ó$'¬ÓbJß:;Ð,6k*„‚Ýá( в˜mûMØ~Îÿ°g¯qæ5ËÈ‘~Â(2ÖÉÁòñJòðuj¾Ìˆy j.ˆúéàtUdã˜mFòŽYâèoÉœÑFáwârNrŒUWÖ™MìW;­¢ò7ì«ÝU'óà”/ØÞí±ÍÀ<‚M€œ·æ‰að]ûLwÍ/5œ$¨¨(;b˜‡)˜tþ2[¤p‘JfѲ˜Æ}q+œMÆ{Ê ïE¤¥VbzøBw0ñn·½j/ ³~àæÞóJ ›¦°©ù~š [hÐ)E/n}X fkJ¤TÉBZ zßM8/XÏ]Øú ‚@[ˆá@žº;ÀÛ&¤N-n,Ú4»œ Í %"ùy¬Ft4•=ÍŒH»öv%µ[בÓT2$K¡=Éy$¢ûõLr%.f%þk¿© QÑÄÛöÛËå‘¶2”v¼/Cò]rKéL´cµÁˆÖIϳ19Juûû”Üþ¬›)5æüÿv]“¥3YïŸK*œ¶›PÆžKÖªÉÆaÂ:É¢Þp·‚ÛqÚD4d.™AnW.,¿C@›4À.ã¯ÞÒŽtož0ÿ1'u•nÅàæ4t‡æ¡Î²r ‘EìÖ‰•ãt›Û0vñ ºÎÀð>dº7ÌSÄÝ„,*€4û(JÅmew\ÊlSN*Ê}IÓŠ5=‡Òžp{QÀ€ŒÁêW¬sbµB`„{¶œx[źDí/_ZýsÙÞDv{¹—lÛ KBÇïEcTw}ÛO¢3ㆽL–`{»Ý¹^§ì o|EönJÝí1Y*&<ƒ$C*V ÊUÚ“/ܳoØ>!‚ë,ù‰2é÷3ª¿yFåõšì^±Ôøl¶Iªïœ„0uò¾õ.|ºÞdMómÜÉÈð!,CÁ=–ÌaÍU1í•ûàñ¡X’ñ_EÕ®{¡B†Û7Ó¦‡qÒ †A›f‘ŠÞ“ëÿë8ý]'Qê}ð¤°Hi‹%¨«•Fmå˜Ä«XÊèŠAâC²ÏqŠpLŸGކ€È¶±SÿŠt@ø¿ÊO'®UT ([t[r|Cñ£‰…ÈZ“:\w7#3±ÄÑ€V×ç&R¶GÿØíØÔ‡«Ë?:¼IG*ùÙÁíƒíÞ …OÎ' ™‘@C©ðqh ÏÚÚÉÈl½¡³ã3æ„,ñ¹àÏwË3.>Aœ\¾f’mÒÙ­àÂŒÏÔ&¹hWBIIT >É~›ü‚­kÞ‚Ï‹ˆ!F“€èÊ,D{³¿‘EZöœ§}‹ö\’Æ<*Ý=ËÑrC|ÅfF…àÙf_ #ÇaýÔ†r"­lðšÍ\n_h÷VýÑjœü­öeà ¾ZÝoæaÂWÓˆ¼`(»eoȹm |·33 ^½n ÛLÉœÜ/_ íêF¨ÕB6äI>¿jŒÓÉ Ó@>z&ž5ò·¥Kˆäî 0¹4?Ô ­ý¨i9,0péËQÜ•lJ#·`–øp¯òå¦dzÏØHÄ ™¤{0³õÖÝ2_/ô+Š*ñPZx†<¨‚·,o¡Ì‡Àcr¾&ߥQ?¶¡†„Æ|ÎÚtgÏA‡-µ ‡õTl)q’!å2Æg#—÷WÅœq’nˆ¸àß?b"W GþVý…)*T¬¼açAó-2|mSÿ¶mz^Õµ:ähmTôòžKDÙr{2[GOŽË$Ýé‡ç:„›«1$Þ â ¡œòêM”]¿m0П#›á™¨KùË7 åœí«W–r­-ÒÖA3äQÏ#êºBÕqHwàµ׋n*i»!\Ë*1X®ëp™B8Rôk)Zqć²Ù¦YcX:ØÚX-¶sqfh£?å’ÿª×»Ì£Ç»¾fçgú`½jx3úaÄgHIÖ~à5ʶ•2A§Â…ô[ =3èêÿ©Õ”«Z›ä©y®©ÖE$¿W÷sµL>¾1<1U­¤‹ß»XãoÝâ½»aVy—ô®@Ь–zÌÕË4£Ü™„ $¢…ªSÁâ˜BT¦è‚òBü-LÇ’9<õp9³7È~TÈ*J„* "óùxHë’ï½Ëù(Îvä†Êóôh1Æ<2QCâVil0Ÿ½âó;°J›ðí°ôX¤í$ëÓYî ­ûÆä¬VO o2IÇÈÀnª %~h3Œß'ŸÉ>Ë/b=“.q?8||¿è¶%ŸŸßó²8s×,ñ¿0Ô’® Ë*Î \>ÒÇ`%ºÈ¨ÿ? }|ózb<˜hÓƒo¼ö#uß_”&wGM”ß5nó¯­'}õ¥ºµl,ÆWAº$z2X´áÎUü¯×ÅÏñZyÙú({X ¼þä0Ö6k(ßvkp‰ HéYÿ±Š 1ÐQ¹zåKy6BÒw3I %ú0oõ3‡p‚’åMÖ"•µ›îÛϰP”Ê{ƒÜø+aш=êu\ÛÒ1e§Kçr/–UŽD‘=pH7+4Žû¨yº©‘üëéÒÁ$¾H­õ2+'K,-rlˆBçÚ§ùg ÆkLk: x‰ãC’O'ÙSÄ?²QDipÍPŒÕ-¯ÜUú,±…ÈÀ‚cARw©Èú¶XVÿêÎЋ%¡œ=^gxOÞèàÑK<ò»Ì[1`6ÞBÒ0„Õ¨¹Ô¤sŸþr&„§ou½mQ)½ñõ]øÖ¯¦;÷D?g𼚷¦ø KÛ®%# •…z@‰+õî9õï«wB'Ìùèÿ6¨%P-±$ϵ³²¿üùòðõ£}bM¥Ho¶Ãé$ ŠáÒ€¸£xG¥f…Íû°!Ák ¾+’Y9rÚ¦Óp#—;eGà¡“è÷N¶bVçJ3nƒgì­8†vª¯tƘ®âHåjNƒcH˜vàù$è'h'px|G(LlUN’éót/ñP*ô„É*eòÚN·ù'/6ø1x]¹à,&›©s©`áy‘„¦t;e޼Î<ÀK.a‘¹µ&Γ˜•üJÓ- ù¹›pqÝ•ÏÑÇø(xWš'®óó+÷ä¶Þ}K¨z\dë6PæôÕãAEÿIE½¦(L©££S¢“I))HÛ rñ]+)5ç«ÿs-®‹–ÝYݦ׫êÜYl³bò±Oü?𷥯´ŽfÚc’€%.™ û3`PRY¿ñF7UgäNC‚›w®{ \H˜?§ÝÕe_$1›&ñOjÔ¨1aÅ––Y[H³ïsÂ#æ¢MÓ*¥ÖV:Ùy»æìD!0Ó•ØvT}Ï ²ËpËšEsl"4F’ŸŽ€æa:f3µ&ã$6„(A|;m€©ù°§D%çØ’G'\¬ÓlÐ×ÏvèU%£ôÒ‡ºñ¬%wlýÏén’'ÍkRn¹‘€ëþDñIAOÃ1àeRËèUo.F`š“":2eëædöï‚È5–Pkg•BOçC‡aÆñÀ&¶¦ˆvÚEƒ`ØåÚP D&ƒaƒ¤¥æÙSüá0¼¸ÝÅR.C‹éâÙ€ÿ½ Áû_»²7Æ °uª3䩦æS¹ #±KKHÿÚoÁ-ʈ` 60t—7ë` ®È?— e)ËèÝRוJÜ$¤8*Uî¤paÕõÛÿS­ñLhqw«âå÷!c’ÔŽk®Óˆ*+e'°B¿\>÷ÛK,nv»1Û’"Ž×þêùÜ£=jæÇ[RCÃõÑ™2J·»ÔN÷çd޶f„°GÁ2.‚}¾Ã¾•Ý‚Êa(¨‚Q³·ógDÃ˘™ ¬pQ d÷èÌo>ïÍ?b„Mr¬ÇÏM¹zr.ñG(ÙoE®d \bª&>Oï)@µýVpJ¿Djªs<èÍz|„y‚ѦÕõÔ,3oãÖÞþlDÆøÎ)ññ3ú–Þ_þO×´mÿÆn‡‡ð¼Êy•ÕB¥zY~cZ œècFÉÃsÏiÁê=F57wƒ“õ³“/ .n–¦.V¬‹D7ÇÉÿ?¢<ÅÑ·°óOôï\w—Û´\,ƒ”šÔ]à`d$~gªc5X¿pâ[¹5"ƒ´R¯RüÃ1®JLOýieÛ,{î©ý¨Þx5{Ö?!°×–8•W]¿=¬{Hä»rhÄW¾è>‹­+\\Â3Ø«¹} H¤ê—("%Å‹STMGIV"òçXül€ßwš=xtƒ™ò2ªtíÖ¡ÎÊÉÄØìêhö´÷¿l4ŸW9x·UÍü—ßu‚) ‡é,ï§·_g³¯ŸÎ׉Åãeߨ@¥kŽã&4zcã`I]ž? ²º??–4â¨m$^²^Ûv©IÅ‹2ƒ‰Œ+ »[‰·˜:•Çý¶E,¿›>Â#õëu-ôìúsÌhƒŽ³+Œƒo>©h!§‰Æ#-Ó¼sà46`f*aaY’ÖÝnp "‘<„À ¼ž™°ÁHc8YÞ/ëY™â¹=ö¶óit‡ÃÓýÒ¾‹ï½®yæÜº2Zá7°Œdá¡T«Œ½;!¡%é3ÝÄd´’6:QÝz<˜6êšðzþ¿’¿—ܰ]ÿÿ9QøÜŸÔ®ç­xÛA$3ûծΠ¿S?Yà$²ÒŸ¿IÚx:bÖÍ(Ÿ”yNF%ScÅÑÜâ÷VËp‚Ñh„d1ñû«Ý4 6†ßú}C¢Ù£âÎüë@lñ%„bB\çÔQ=á ¯i„ Õ¯-*6Å?dÄ/ÒÔ6Ì9Ë ¦m=J6…c·¼%bÿ¾…2EËá÷ó¹EŠ{³;eEáÚÁy_÷MJ0¹v×WÙ­¯3Cbã{ÒWéðOcâ%àâ­Í/YÿÕoŠï`1ðPvdÏ#E«‰Ûsûƒ&¸Fñ®’ÚÏ¿Ÿ†¨@ß‘ý tYÙ9W®bDÎÎ/ré•@ë¿§=h?Ó}þ+ MÜ7š¿«nluØÏ¡LŠÛÞÅBb 1´AʰÜ4§_€p˜Gµ¤Çö,é§Õõ¬Š[ÓW¬ÉC÷üžŸŒÈÔy‹œÄ0rd“1÷ê,ÎèK…KkÃ×9a¯A4z7-.ÐnØqÓ°r´™~}a|Ök31ØJ:d¸Øi*ÆùöNÐeóuŠ\çÑ>LLbû´ã1!‡¼|HdR‰ÉÕÐõû=ižQ{úøUY¹(Ôÿß NWe#æ Xu³¢ƒÆÙÀ I>^ ìPÉ݇q$grÖ¢Ñ"$¹«]¥w²]Ö ŽðÇŒ½bã€èG5ø½Ø—¥Ð:ÎûJ†”a?øä›Ü¿0þᬉÌÅ7gùºwÖLv‰ËmÖQßÌ$pGS¨²+>2eá¢×Ç‹î<Äù$Ó¿vÓ–l›£š‡Â‹²µ;eDÖªEöýÓ.¼}ìÆBŠ¥5äwyšà‚Çc+=œ æÔ½™z*COZfH42¡Ú3 a²Ÿ!ã`»DO¹ÉÙÒ¼õø+iˆZ»pØå:Q1Àj¸rÆ‚û{4à‚p®]?Týâ ªzUîüæÖuK {qþ[8?ùœ> Í´1PÖjA £irÜGtÖ›ÐpÐè™ây#Äå›þió—p]¶/³œeÕ  L. ]°EfêåÝL®9K8SÆ#7nlˆ®OHãòôéïóAœ&µB±ê›í<Μÿ©æý2Ê”½¾3/¹r’Iä(ä.I‹o# ´ÿbÇXéÜy^*·‹ óÙ‚ÿ¬,:`c‡tõ¥RS5KQ¡$Ïçœ}Ï>ÌÑ•“}¦£ö5pš“ÿmY›ÌzTÁv/ÉÖBÏæ8À(¼éèîÆwÿr ,š/¦É3h…ösŠ.'L…õµ3j\†ñ×#*â’ÖˆÕMI©1ôFÞ^×1añá ¨ /‚¯öòCÕ[fs‹g̃¾D™©ÓJ 4Ç »…_:nP3¹ª•®ëÆé¹épŦçÖ1zpŒ&Àg£‰§WA”aî­E@ú•(IÅ^d5žîãt—DVêƒî}SˆŒÂæèwÔ躛aìT3˜×ª ÆDçÃØòWçŽ }¢Å,¨ã¿0õꬸ>»ý=íŠjF¹[K+Ÿ69˜R_™¢@®‰æna¹pËßTZÏÑú!‚§N¤t|è5´¥Í"·ØÄCìBtpRRPc5?}.XS7âš=2¡—‰éÞgÇ+fÎɃw¯! Q“=;kö÷œ¢ n¬ð)ª6ÑÁÏÞUħA1ßáMZ .ؽb ñÜÒkï6#7ùy˜EDIõ û-ÙVâ™_Œ6¿E§ë9ç!¯sbaÀUÏ÷c!€#$xà·pÈÝ+,ž¼Y]ƒe⚌ÔÉ> à/¬Ç4¬tûj^Σ¾}öPêÁˆ£æƒ ÙÃA‰5ñÓ81ÂìУüîg|£cÑÇH¹Ò27àm’‡ï)ºÆ€‰€w—ÿȲÜ8Lh^ÿÄ¥ñ­µ©—¾AY³Ã™Ôû;ù%i‡m^Ѽ èÜ7â¼Ôyи"Ë_"¸­ÈëSš`§6S`ºtázÁMPU=%ÄHwºdêÂàÝCZVX³a¾µ¹à`ãZòè¿bsÕv¶8À€O§3l­äg+GÿWuÒ΢é÷}|ìV8œãû†•JŸ×‘—•ç8a  +H]ZÖ¿ 3ú‘ì°uáèùbAJiwrƒò‘Wý›·M†,3µ»ºýÕ/ûàâ€þ2“?6þ)%}×"ÚˆùR?Õ\7ˆ†oðQLú³0"P“ס¿.ƒ.ÁU*Ä+»­v÷ñ¼Ëß㪵PÄèè‹øíRÂF˜¥F˜I]ƒÔÈ^">‡éîú¾ VæC¤S¡ß÷Øì³F¯³Óu¨Âî|ò8|Ç —^ji¢Ú{x·wäËó®Ô‡¸†’^ÊWáÚ$Ï5 ue°%Ö>Xw}L½ö‡„ßûÝžÛsD©'±§|>œ­i¬3wˆ9EI¸ºi_Íàs8Ô„#%У|Nƃ@kœ¯9Ä"%œž…—ÖÒ>‘·zš?QkbdðøÃ¬<Òu ­ «²r&Þ”¿d & WøìÑXsÂPÙGO|ª0°Æ¯ŸûY¸zyË×Éx÷Qì¥ßÆ)iP½ §Th–«ÀêP$ÔZ?¨†æ¢Ì'°šRí½¾pÁ0ÁÖcÖÅûê‡#ÿxé{.ƪ;¡†%)Ši­ùØw‹2£ucõ¶À[¿gÐÑ|e-,”¥ )„ë2&ÏN3Š''¸©¼)òÝb¶³‡ùfÎ\X©¶ý‘{ˆÊ»™“Dd8þѯu¼Ð]LÔVM¼6ó>œl‹º=cöÁšßÿsmË”BtÏö!xçôg—ÝNC·!êþÓªè§;sx’äý‘¸fئÓÃí“rvJ„²úAÚËB(1y¡éF¨U2¾´õ‘·î_n–¯02 ½À…Kýe“ð±­â5(Þ\rR“¬³l ƒ²Ç$Eî‡i ÃîàÐY;bœŽ®u¹úi¾V±Ö½=É{2è~½òii!E8ó j0>xê= ß/ÜÕÁW¾á¥ $3'ãqM¥]'í=ÓüWgÖÙøùÇIÏ_…ÖÈô‚EÒÊÈ:1Ûõ¸:ˆ-жZ^Ѧ€Taû…S/Õ…öï ÛEŠ`–iQÐBJåKÓ;lº]í¾oÛŒ9>£gÞ%8´ÞtJ ¦Ü¾ÌdžUHg¡šóW*àHs ̦èyØâ'Ùþ<§~%ò±o Ú0³ë´ojˆa׎! ï¾½XèH½¯Ù3 š·´aaGÝ0.l²)ˆ‡:ö9Æ]1ý&gm…ºn8;FBK@„ù@#;0L¬ý‘ÏBm¸uòª¿§ã°&A±ˆÅ 9£ü¥Þ„.xz9PGeVà“—ŸÁöp­ <¶p,k‚É„+üäNç C¾F%Là)ƒR8Ëáø™ºèévf ;!M7!³ým2PÛ~Ÿôï 0ªHǦuýPcÌ?#OdSû,êz¦øýQîmTz }zÊ6ÑJÿç`º4­•_ѽî…x/„'ârÝ Æg¾ åô£w^ö7£–Ê"‹[ E‰Ã=áŒHÒà?'®ÐAÈÉ–¢kÙ¦¾E`Ååv‰ m ÆR•7×Àj«.ýneÕXM3®Sß?Å-Q6ßa5õBD‘QÒJaf>B.ሱ•‚@&¾ì<ŽQøùJ81,FR=»Èõñ<[¶†) õUQ„MæÐnËý±Vq›j ·™ Ä?y‡+HZu— ûùúë¦{Çéš×§š}‚wи-ÐL |.Bò7°0Âò<HÆü±æLÛ÷H$ ï™8¾j›-WnK¿:±¤sÓ€M”ôï0Î^•%@]FW U›¹Ô2x·ú¿ïÉ‘$£€yŸw}^žž??1‡ú4…ZÇñV˜0K1sä£Ôà“HØ?hG¾‘½÷ "«1 ³1mb[6”1uüý2Þ½8ä—èlV¢Ë©h°éñ€ š¤œ!9±õÜ{[t2ÆÈ ÷¬FÍ“%,E€Æô}Ä`¥ðÒâ²´ÖG?à&ÅŸ] Å(%1öÁ©Ø€Áô…[N’lªy¿N¿±¡îéçµ €IWQB.íåÒ Z½ÊнPûnk,~ŠQ±žù÷g?†s=>zýÊŽ+ÄòäÊLâÛ°ÛÂ[Íü»á(ì»óí¯-a6ãb!Z¥]-Q[[ÄkùŽ ÿ"ßãd»c× }ÏR}ä6²Ž÷¶Ì£ k3m º«¾¶3ü.^Ì\™ë*žqDÅPˆ|g²8&;zš¯ž é-88-W ñe &3‚Ž!]0Nÿ&_5?Öø kîeƒWh¸_ϨVžËé$¡ŽfÂ’j!ˆ„N\‰Õï’1v›vÁÑYØ©{Çœ˜Êfâš´ì ¨žGQªjœ Œ “RöißrÚ}û;Ò!Zû•|…ý™ó£N®øÉm ,ÏDŒ`̤‚Î)­‡ðz°Ž¹ºaiü %4v61õ%,>£KmÏ. ¬ÁÍÞš™§žÖ>h©( ŽÈ­FrKd‘ö§%7(+ÕbÍk»ž-´ú#ÇCw« k¹ÆQ>Ÿ«¨iOååUŒsó'xV‚tÐ'  õ'“ œÑø [µ…gT„¾@®:¯l…ã˜$8VS^œ &4kIzŒõˆ(À1‘>ÛÃÉ9ÐHsótÜ,1¶PYɃúhq PwmÅtcëÄm»P?/ÞÞþøÆMÅàËéíïI¸ZB>ìn¼Wwb¾¢ ‘wÖ×îh„d=Z„,>IÕTs ãC<[ùR{è2‰£è^—Øh·(›ëÜU[áy%?×”8€+r©¾s¦è×8¡Ì²ó8zÄœ»Ž=Œ·ÍÀ[Ÿ =ÌÍ‘m­A0aÒM–£C]CwÜâ%ÉÀÊ„»í¡ÝpEÌÞ=´îŸŽö«Â²Ø°Ùª\|däWòÔøYs‹~» gS‹ä„Åê!¾ýf0ËúK–&캨­~ŒLõŸÿþ8ØêQ@LÏ¥|C¦êa¼ô%¨†´É¢›( s$Üs>»¸³E-ýîÁq¶m‡[P¡Á†LŸÉ#ÇP¾Ûè4›k/nÇö“gœ@lVnÎ@^‹:a¶ôÃ?^ƒ·ytš(8$[…† ¢KF©¶¨tq#¡¶‚"Žæ1ˆ1+$»Â=J2iÎÛ…*Ú–>†Úa±æ¼£¯™ä®öyÆ•¹޾Í{À]¸TŸT§&K2õ¡ïgëUˆ^îäËx»ÏP‡_ß!g·‹â,Ðb“:Èöh?@]“—GG©3€9®1°½\õÃ>eÞJÕ&»u„«æ,h³;%š{3g‘G¯fÕñ<'¼Äé£ê–?j®îÂæ(Qx½Öʲ!è„ ñÇT9Â]ÚEe*·þi_w/7Š£ïÆpk)•î–Êr'ÌdÄ ¹ÝA$ybº¨³­ NÛmβE4ÑXþÂÎN}M›ù”Vp3ˆŽêÅ¿¶ræ¶ÜàŠ8‰^ãl¤´oŒÂB3g !gã$;`o8äèmyýÏç¤="YË…Ä”XbÖ¯·Y¬›×ü‹2O˜enR¿='Z©¼åd»:^Lˆ.çãQ¹> Ææ‡ï³äŸ¢n#ÆõÞîr@t±(3­OàOŽhÑË‹àv3á=Ò~]7S&IÔÿ‘`ET~´'µ|û V•T@ÅüÒŒçÃY2JUñ6Pt=éc³Æ"ÆWÞààiÌêMKü3àìÉÒÅ3¶ƒÆ•+°(E|ê÷öc‚玙ìé³Ö°Û4!®h7úêøÃg© z·Ñ~:§“¹æR¥ÓÜ[QómGæòsˆ¦jŸr£¡ÒÆ~ A³;óÈŸ®¦@ç¤È›K$ÀIØdI´n¶û6cŽÑÕ‰f{Ø‘fß’„–Ì2›¤:Òò›‰Ï ÓÔ=û‹Œ÷<ù|1ö&BžM0ÃÛmÕ¼åçüI^09Sµ?Éx¹ÜüI¯ÎgB”?žŠeøD÷|´èª_]Tþ¹‡Í*:ÕÒÒbSG“:Eà¿ÌËgh “Túë0)BÂÚÏ ‘·½=O&5´«¯å€f‘Bv®û–ïÒ}QGJ°áì›Fù×gE€Ž/ Š–Ô¯ËØ×†Õ;[ü´ÒG¨ÁPƒX$k77LN\åeÈ‚Öñg=@Ÿ>"ïó¾ÍìRÉ‹ø_Ÿ ^M¿ƒâ¹·oÝZš°ï£ne}G5Ñ‹…•XS¡¡”ÏÛ·m´{"¶ÁúN~Â÷H'¸«&ÁMPveVš1êËˆí´Æ¦Ý+±1‘›^<àáñ'¬gAöÄåb:.Ç¡jË\£¢:ÞüÜŸ$k ¼é .â=]{«j`ÚQ[JTR½U‘Äìv«ýr81./ ™® •b‰·[.^·åð­Ž–TeæÆ÷ ÖYîèGS)Ç~c·¼(¸q+ÞÐâ¬Aªxº£Íð÷,n•Yqµ¥·u¹†ïq<õàÜãÀX=BgGšø€Q^UqÜòéF1v=fô˜zÇaû2È©9ùÎÕ[C³©ÂÎ6”“0 Tõ`[¡.Â(ÆB¥«-‹WÄasSÚÓ æ_éayü@Ð(¥…sA¶A‹µ=º'êV%T®¹a¹†öoõaëgüʼ&`²YH®« 'j¸ûé.ÈÿMnZc†­û5­EN]$¯;…<& ³ãÒv3åÆpk{"D•Æç<Áå6ûaÅ|¬ÏkT‰,÷Fè~€R¢¶dMœ4×^¸a­ò꘯n§D‹ñÈÞ-;¤‘ÄŠ(áZ—'’gfFŠ,¡NÔï´AÏÆ›«,ÚÙ¾á@¸ouº“¡åÅ>H„Võüœ¯ ~òªŽ[;ÂVÀ%wÁÍVÛÜ3ÍÐÝ…ú•A*Üm°ýÒSŽé)žÏÛHe0Ÿ¡}Óþ…JM š´‡ˆšî¹Š%£¢Z ³uW¿·ß(Fõ90õ mƒ…ãqþtZ=„š+q§o Áà‚q'$¥y9?¦GÇ [³9l›¼Œ¸×­‡ð©lœ§-I7Ýò°& öR›ªÅ„Rý[1ª*Ú¡W?¸y­ËM¸¯®ˆ3‰¾`… Eò2ŒX?»eWÆ*H‰rx½éóÑý„íö¡Ì¹C䬒F’½TWqL=Ýpë­©>f:Röƒ Zòhj¥©ö±ÆYU‰Œ L€ÚEsmÌéÔë—êÎ<¯Ž(H͹NÐ"cÂ^=.·½å›èæeÙãԬإµCŠ!¹MYwp|œÅ@L.› £n' ýëµÍüÔ°@xy’;QÄvØëþ’ ÍÇ=Hæ˜/3,/w\>°Èy"+\¿rd›õŒUá4o#Iè²³õ7¢*myøÁ©€ýzu·;}mrŬ:¼wα]âAÙXÈì Sý³oÁøÚß[ϼ|Ͻ½È÷Q/{þ/›h6 †|\UÎ1Ñ•×jùßÏL(ñFj6­¦ìJQ¬÷måªEQ}þšèöýøaåB³\“ŒµÒ!æ û½¿ýâz.ݨ·Ȩ–Žºkï‹„­šœQ#5C%¦R1Ù‰&D® «"Äa»›ü¾ÿ§Ù} ÿœŠˆ ‘\M²m­´‚*±ÇÞÔ”Õèë í£_3f¿vp¢]ÍÌ®ÌýäÄVM_Q´»IÞF,\’bZ›E*sl?håˆ.ápäËD’ç“B‘Q t,³¾[Šáq“˜)¦»7ΈVÃóÙbц¥6Vbö`Ë.qVY°VŠîì ‚1Üc†âZÂjIó8VŧA8ý’A¦å¼6‹1Œ¸$tè¹g Êïf7…7˜|K˜šû½<ö úÇ¿¿ wÀ¨‡ÿalòÞÖûÇ•b.ÏŲgÞi4¿þÍåcаxkiÍIÅýóýöuãec®ÝvÉñU*µGOn‡$µDIvj “P Ö¶yéÆ4"!XÉi!ŠPh›XNǹ«~½_/JÝubOõU•“Îjm¬­1!–ݹJòŒÄ#m´ëë/ÑŸNŠ_E„Ó]L íD½T}ËoG³”$¸­™„€V»›œ\è¯ÎœÝMG tØrW³Y.Ã7¨*¾ •jî}¡‡* –ü[Ý €P¹ EdÃ/SÖ›UHW:Ú@—+S)ÉÙôº%DLÈ•òÑöÐE­ˆMD7$‘&Êå$¦÷ÍEL= yš(K6¸ê, œ¿$yý„9 ç±Äó'ì‹´ÕSÔ¿ºä©D;qp|8AšÂ;q¸¯½5p'tÕ¡|û…ŒƒW“¯ y§³bb"Qߨ(tͦtgJ˜ôÄéÛÚ:ŠÃu6 ôÛê®Lœ1^ðKõ'ð²½¼€¹'>1]œ‘«G&ÕiÔcYÞS{Š8ƒÃþu£ËÄßÈ!ç>Ÿ{´„bî’ß—Vôf«#ù™‚¼&)À˜F¨AHsÖ)ÚR…&¥8’=]s jd¹%c¾ð©Påâ…Êoä¹&`jž ·? ¸1K c´æö4/*uFf†<:KÁe¢*"$¾&Ó´3V÷<ýe¿åRJƒú"Ý;ë.†U¶ •—Ý50ÿÕùDŽZM!˜Ï Ñ UùDê–„ˆùÝ’ƒÅ‰¯âŽ[o¶Ý!’uI¼Q: `#Øò[iü¡†‰{”¹M3¶™AµÎv~ùíár! F,S^fx¿ëNó­jâ‡þþh­š—¢éó ¾ö@G¨ÄXªxÈ_¢@—öOç=\š=ô°O2õ€:\÷ÎgütÔ\c°†}úi¾—O¼Ù:c¥Exc’}Ü¡ud¦º°Ao}f<ª8Ö¨ˆs ’¿Ý “eþ•vÏÆ{!éÄÏûZ ¿Ò%ßáºtnì]—ò} §šAše$åIUm]ø„ÜsŸˆ×¡Å«| õá»Ñ¦®2KYöŒÈ´0„µJ‡pΗ7ÇjÈI絎ñš¾AÛ% v‚ȉÊÃ[ýÕîmïƒG_=Cº÷…s-ÍÚ±a 69‹">Ñ®ªr\iÄ,µþ"^„ö-2LJA¢î»àŠÉ5vžó‡L†5ÁØá'ÜGú)Zv2/´òÀE#Ÿ­nmx°B½¤ÝŸm9l‚÷Ä9(¿_S€¹³ð.Œ1",7éñ1?à‹$¬ b»ÞóŠûêçbO½]ñH-3éå7½ú'R®!iÈ\[Ð/¬B¤V å å5q– å ¸®òÔÆ›Œ÷÷“I¿ÏÈ&ö$䨿iM´0W_¡l…gÒZk BQs8ª7¼·v×K#CT×qŽO—AÀ¢¤¸ldáÐ<³›RÖWiö¸ÄŠpã&µ[È÷2{tÚiû@øßòD2›· ´Ç9 ÷|áÀ±nêºÎ3xSÁ7m<éü«ÏÀÕ5{òÉ*ë,Ô5%˜(Pú¢PkÿKø’H_ª¢cæÃÚÑý¥„¥’ª/¾šd§ùŽÈ°)P”U|:›˜5òû ²yÚ`äë}5ßß¾*'å²ð㿵Ý1ÊX(¬^”)%xïÕpú+Uº˜EÀ Xªå9ˆp=ÕÓ7¥÷ wú07ÚœQ›0I†+_9Ø.?«x=%½ÿ‰Öd6+/±×…‚b²R?™V{9å½Ó¥]Ê¡¹í6Áw&xóRsã]ÿkEƒ…¦Ç†¢D=ƒÝÒ·{ Íá­”€¦ÿ§eért_R­’žË —@i:c&“ããì$ì&Ç bÓÇ•rDtà·°äîØ½þ³¨Úª»¥Î Ôy—ÄoœqÜ/[(vÓåYm|õôuÅBÝÁíç%˜L9áa•Ž×¸b¨ÿÒ‘õCœ†®x—”ÊæE¡ë~0Ùœ{§Ä‘;žë˜L j`ß`ìTÅ*!…, –Ç­°0fÑwÌŠª–3Q1 ®×ûqC¦-F3ïÄø6PrÕ¥M\ùÚRC8½Äûú¨£Æ ~ ¼ƒø²«tÑJ+hÆòa»Ñ W#™v=wð¨G$ˆäÀ©Qû‚ž€9óÕáðE» P¦®èŒuÎÎÕÝ‚–Y©0ü˜Õîšäö:û&zæÔ{ Öå(ŠÃŒ ÈC])ÚçqËOêgšk6ÛmZ•Ëhò“xg³œ²“I"NÁÕ¼59¤}ÑìŽó ØYA,‡£"-èÃ[JY¡bTð·óÓ:œБPä)l¾O±Ü.œPÀ“ªù‹$(6E¸Ý½‰Š°ÏiÏyøê‚!}ådzEæ}ÝZNM¢½Ú`“T¥ê evØÝ;R$dàèÔw“Ý6µ‹0]b´WNh ä°¥~IAü™-jȆ¤" eQšY¸Süû¨…'hÞ\½ ãÓ DZodì›’sÌJÈse?jI%ÛP c+»ýŽÒ¹yÛF &bZæ €o‘«+-oÃß(]y;° î䉿p=E6ˆQ—é8sk*Î{éE²°oó(—5úܘ\GkΞew¼eUºAk‚= ½¼ÆËýg–ÏWúàôp3²xœ{õ­iDªí@ÄyТܤ¾ê­(“ÔÚÍ|R-Tô}®¿ÿ“‘c3™ÏaÌD̆‡?¿Ø+a´å+Tiá (s_ õeZ›¶z©†^ËJL.5W…EÞCA¡[(Ùé¹³×Ñ lqù‰º´âÞ ‘‡%¸ ñ= #¿8ÂŽ üÊÚÒÉ™AúAtÕ=é-Ûh+D*˺IíÌæ&3: ´]GL¨ñcXØÛ â4ÅüÐcß )­ù”†jþ;%ñÆ£Ô§§n­—rV3áÆ¢(ÓzìTNÆbåyÙÔWÿœˆù/4 Lìh'*„î¯òجÈœKÇ–`o…t:Ä cU4#âõê‹HA¬Äe”9àÿMŽdÕè2Òþ¾$&áƒE»% MÌ™VE.ǵl„._ÙE½`´—:†|›Í¿Ü²ñ~ºåk¤U5F}éíØ´7{u„ls㛺´o÷Ô÷i7Ã!æüèy…O ísÐêëU|nR3ïÀ¹L£‹K8pèå_Ýž¤ÂÏzurÜØx¨ÜŒœþÓ­56¡ÓŽÄ#nþ¹HͤRlÌ'¡¹òqêpŸÆàF¡¾$gs$›²\‹Ò¿´Ò¬ô¡=B¼º¢Ld´ƒEE•†o}X¬ ¸— ¡NqЖˆ£YTÈ'¹Vñ©Ì"O.Þjvòu[Î`曘°W6RU‘œLºÖ'DË$ó§ÉÌÕÄ ­EÄó(ÿþê­;\IC»  ®&µÝ™ñÆGß8™ÐG…58DÒFÌ@:oÖ×Oìê=}LwØfA5›ÏŒPÇ8ú…iLT¹ˆýl1'å+§ }i’À)TZî"çÉš%Ùò߀™ À§ÅÑÆWxfΣšÁ%¸F¾_€RŒ€Ibó´kùžPY_n# )/‰¤Æs„•PIÅÄ)65NZÊ×tg2ƒ­ù<ëjôyÎKùô¿I(ç#×.ßç]/û¡`B¯P‹úUÊ6ËUŒFIôÑ¡þc½+­)ã¦ÑÓu(à´µ½5ü@Q»x~–h ˦=…ôNâV)í/ p˦v1ä¼ÖœlI3ÅZGÇph#&…å©t^qO±~Ø\nTów¼êöäFvã|´ž§í¢ÇxÜØ.[ðj8å:Эi«·ÍŒ³jÝÐ 4Ï¢Þ%º×DÕ¡Š(õ¨ý5dL£É EÆþ 7Œ"ï” >צ„ð,ÔvSšÞo×ÑŒ’Ò i«V mvð¿òÈžöx_w &ö Öƒ4›.µ,—ZÄLóWeг"IŸcg“ÛÌôW.ä]5ÿ ÌòŠ»£Bm̘ÑlÞÒµrœîf§:ñ(,ùIGJŽ–„mvóøLj‰T}©Ñ_5YOx„LvÜ8‚Mšn[Çt i·çn|•*"æ§c“4]§³à£bR׎Â$ ‚d;7É${þÕÇ ´¾˜áçwóŠÌ4Ãûx>¸Á|tÀ_÷—^'©eo¿i™Ã­X¥2–J²–9¶P%ö–Iæ^;"j0 ™c) ùVÓ¬`>ðGíL¢™lsZ“6¾Ðœ;Š”ºÑA÷@Ü!ý6ê«E\IàÆ®ráKcÎXUèC7µÖlŒh;ÍÎ^ˆ‰ SU~‘äUo^”/$ Rs#þ8? h‰tŒ¥Ëòòþ4oOr@¼Âù Ls€ÊÛ¹e)Ä.ü@ =©Î“w6ê)zlJœ‡FfNº/ÓNµù¦5…rs^.k ž@y Îùɼ¸;Ì ÍnzôÙñÈpÓNÓ§µãEúmÌÐGdQºaVÔ t”0æøMäˆÚÙy•õä;¾ýŽ0}^|œç‹Í`þ…K¶1qº³Ï’'ب¥‘çÑ f ƒg1“Çlñ–±ÕÏAá¹àÈÑœw`ÑŽN®ÆíŒ.¯ŸHzÛÞù$Ï’áz •¡,ù#äæê‚–E(˜r·õ¨¦`éÛ¥©ÛÏDòÇìpŠdWc "‡$‡†àbÖÔ{؃¬PÇm¢M®ÁÎ_Ö¢øR´²ñC™ uÊ"l& ¶A ¬åuMÚÖQÃV§ €Ov”Ѐš‚ûg›Pêwç&¾â»dYÄ`N½šl4qÀßX 3àÌ\$ㆠù’ŠEÞáîáûØSÔ¶Ç%Å>ÝVÊ·Êb‡ü¸R‚="¥š~ÐÿŠ-ÞÐlð}Ò*†LÆf ÿP3m¶ÿRŽ’~6Fx×^;øap™¯ ÛŸ3~kžß‘aéÍÚT¤ªÑsïò@)ùAôíRÄÂoGðØ‹²r$mÿl©”9¸j»ýwØËX)wmÞŒ™sÓL›'9.ìÚÄÆ³É²Rþ {uPd츓9q¶¬¢Ÿ¾@["µ§{Oô[ŽËæ—?bOæKÔ៧³ºNs?û±_J4¥½—Ï 5uý,zUü~?t§•Kw¾4•|‡¼˯Ւդ¬Ëwctð€8AÙ2S«8²Å°Âæ©›†b¬â†…[U=¥ö³½ ¤¿I ܪ:êpp ¬Çnß–§’¤-Œú<` üþÊýÍyn÷%=¾J kÒózQžl¦×™8—ò᎒ó:&™ <\ípÞýz¸¬$0a}gÈRÚÚܽ-»J^â¼ôv ¡æÛˆ-ÍÂÙŒúP¶öÈ­wa´_0+ñVsÕ:–öb8€>¿gAazÔ×$ò ¸Àk-'X$êƒ ß5Á¤‚€+Q’FÃkë’sN㦯?V&3¸ 5Kö’Αnápl·› ÎÝ#BKzÂï¯×ã,’—‹L ŒÔºe1UõGÌÞ}Yè´–Òy·¼û”FC â2”¯q&3+¶ø¢4¾?…«…aˆ¹CYÕŒ%T³lòŒqp=ðEžÝ—÷”•C±ÅÈ Ò¡P±kè>§å¸8øº°uršö¹§·nñ L²~9“ê„:j$1t‘žÆž;ø’>üÇÉ sì+2JOLöÝßèó®L¥µ>$Ž*ÅÁI9ØËû½10-Éޱé1%M[æ—CÅ%O”Àçƒ4BQ]¯m>PN{WÙÌ¡^±Ë>2Ë-Ìz{s?X&m¾ñåçÆPµOs °L Bp³„v÷EYžL$öB•>·c£òñ3®ïÙƒ-2í5ö!—t' Û»ˆ§8WSìòskþ?¨Îõ±çí‡N×[˜ ×’°ÑT _Ÿ¢Š°%Ä,êE ­:`ôWÂ|šãN@ûPAF ,ÛúëtÌȨçʪZN“ņpZÃÃ"à:|æÕÇ\ý÷Ž CE_el(é¸ó˸®ððº©ÿÅÿäŠ÷ŽM»Ïc`i >…ð­±`5æbISÆqgV|ÔÊ;y•Xæ7Î'=gåŒúã³)q…Õñš§l5­k©‚ Ç­ÐÓ€}h¹€ ëÀTvŸÞ«€JÕe OŽxVŒD€âY ì$EÎâo3WbKvõ™K¶T[Q޲!Nj)p0¯±AÔl®fàí«"éþâ§Ø(åÒ‘ÑØ‹J&‰L½£ÌTibСSF·^h+³Q«ÝT8”ßpoLá*Tg«Úd Ñ,…FvÃV\9…+¾ÌâË­Ã&}œBÉYÌ—,ÜD–÷ãô¢fÙyDµ&oUZ¬›®!^ŽrH·6UĘwÊmÚ¸dÝñbœ“>T+?¬ ÇÌ'¼lC†•šZ hÏÇØ;Xò0œöRSʉڈј«CŠo"ë08¨Z4ìöMË'ÌCµ-ò¸@«Ë t—ô³\³òç³Ì„|Æ„Â"vÞŠ·•žô2¯ûk¶¡ñŠýx^›*ñ@ïj¢ÍØ(wžFkÆYk Fï€Gý\S¡·õ7ÖôÁ¯š³©0‘­m²òs¶ôŽ3T~ÕHwêf:.ª'~Š Ô¤ÎE"iëS×^ÿø¿\_‰Ô-îïŒ ««ÐR¸V·ýFTŽË/“Q{!X~ª”»W®$D’;†èÝ29ºÚç²Ï +½ó pLôÝk/€ØumW|ÂìÉ©Ûx}J\€tI†ï£ô!ý{¢:軦¸:"µ‰nï{íYðÂ`~î@NŠIs<%{­2IØJ‡dƒ„ß÷ôý¤¸øÐv‚ +·'xQ9IÊEv)áÊœõÌöB¦<ù@øHÀ‹’·Ù¥…•Ú½K@ÚkçT9F'î4›a".‘ùÈÆì_-à™.õM†kH­"amU†]€Ù·Ëÿsï< ¹@ޱTÿVoŽz Ò«ð ûêm~šE„ùyüC¦^0ÄWÍ48Ï—Iá ³9|šÔé VÍ7^bU9bk²ê’Ž«~—î«ON‹ìZ"¡¬ÁVü˧Ëè\¼uN 1ºÝöÖå‡WŒé•µèù†íÒÀ³”·¯™o¹‚ˆ½Ë}€‚ÿk¯ú“ÌFäçð:U‡©¡ #_r´Œ3ÄÄÌWëÝæÙ·•í—À Hè"<ÓÈfˆbņÅNËRÕE7wžóD$¬Œ}ü`³ÑW© @&ŠY4}ˆTÑ ¤yhÔb;÷Lÿ(\E‹yÞ”‹¤`­›6ëÏi‡J—Ùã"ª‡XÞP”68M|ÙB’If.âÝuj“Nü2ÝE¬z Þ^ÒRàÖÕ`ð¬`noÍ·¿®ä ÷ŽDÚ0G“ãÊC­ÿ¼¦¢û}rÖ÷¡ìRR9*æ¸Î¢¯Gùš!NÇ.ip¾àuf'øÒbIbgö¥ŸÏùp¼DnýþµÉMÑX68ã¯Pý‚–×MÔÄ÷¼ÌI ŒüƒoLâ$:Øð ‹Õ,Ä+ýì8Œ¼æ¸p\.UKœ<“HD|JîjêÂó¼Nã–a4cøaæW‹ð@†k7ëê¤N›jSÈ•´hkíhZ“1ÐydLœD,fÁG4B,Kof3©‡PNö f„®ñ®.‰TœÓ™_QÜeûý"Õ´³b»Ð ÆÈƒ˜Ö›M:OL>3ÿòiê^àmjÚt›¬R|d½Ãø`'†’X+¯Ä|^.~~Ãýï)9²¢' 2ž›¾û´Ýػъ/ïË0å•ä]ªÇǽSTnøœ!€ Ü'Ývgt¦„!¼“ "ysWCUm頻¸ŒÇAã3œ„z‚)Ù!–Õ*”lÑ@ådQ7Ð/‘¼³:ž.F0¦ø^³X‹uØ„µõ«_gMšóÓ»Ø,šùòé4aN÷?G4ïpRÑöR¶€ôĽíJ¤˜?Ûf«E«ä‰/·Å®dУªøJÀ!öâ÷X›"Wú¯Ü|Ö"¬•Îñ‘L‹(Pw¬åå¶rÖÕ‡½¾Ã>AØþ¨¯Ç§›ïàÐò¬èYtYö”1»ž*äÕØÖ¾¤Ñ2{ÂèVð/}‚"ÓBSç‚Áé§jx_£FøxXf·p£Žóp3ÇÐXÃ(ý¬bF! ]`Ë5IÞi¯Ü–ôÐOq¤Ý Äã®—ÍòŠ»£DÈ¢²ªþeºRr3J¬þzŒß§5uÐMg ÚÑÞ+ñ&PMZ"%jÖ_†&­í/2—LdžÝÀ5O8eîô¾{ç'7Ò÷¹$8à^œ‚¿A‰é…ó3à}”Ç{–ÇÓÿN´~Á3ù¿¹‹Gczó5•CÓ7Üêô¦&A˜ÃäW]öÑj Ú°Ö.eª?f9C¡„;§gùí¬¿ hÖXq 71©Ôø±à5%g†Þ=©¡3LáËcbeéªi—vUÞYÆÁ`xÍTô"vDõ±Ãâr!\YüßoPª]ÙÙÒbÌ›üwšŽ ˜VÉ-?~é›» ²3BzÁÉËübkJNß²îLõ˜ÙN17g¡œdW¢Gžwi´Ì(~ZÙü»´ G ƒ!Ãsƒ†tCv’T3kuïÎÊã-j܆coŠ™ƒ’}F÷F©|ÖqÑ¥WD7ºN_†³ÚTŽ; m êÛY|W‚úûŸ–´¿Ë딪_yË+~ªÿ,£èlh1ÅRV2 …’ÀûÕ*Ò\°XqBÈvD¯H™Ô¡åˆU¢QÈ‘?‚ymFŸ3Š÷(Ï:‘’œ òtö¯²©ûÝÏJC~ SÄìhÎ[iö൤”ñ–Ùs&.Rï³®äx¼X+hÏ!Ø}·g‰rˆRm€Ê¸ãy–ÇŠp lg§§A®IFLÅà…À‘‰0y‰OW?[Wâźüæ¥Ìªº)R½VY­zÆà†]AÔˆ+ýš~®öŠ{ïpÁCRë|‰Þ)ÛH\ ä{„2½*¶ÌKMNT4tA$¹]•G˜<Ø f¡Ÿ&¼ÎaÂ;áÕðŽA>¹.û€§Î?éÊ“¶°ò™°õn#5Ç8Ò&Iãñîì|v I ýªÏ¡± ÝH6²uŸ™:zsõ¤›{O7ššø—²®HÙs¶ìIºuA%Ýg­Œè˜Ì'Å€P® 5Ú8Oò¤x¾¹²;Á[µg ¯9“½,”—]Ðdùl¤ô·¶ŸùÉŒÈ)Ñö׈X–‚åµ’û} ÆkKö‚r žðz‚ Õù¢á…ýá_L°_äy 8cdrõ¹y¹ÌÅÆÔ ¡ƒÝ~ÓÂö¥ä/ô¨)¾»ÿGpŠqNDݼ»ôî ±¡o–lª±rìT†‰súj2G™'&F]àXVÕç}ÈN±­#Bs¸Í…"ü´*™T ) xLö©Þ±eÇÿ€`°\|?«­Xìü®9!\DGتÉÅ÷ŸnÄáÀ×sætÕ6‘¸trÛ¿Ómõ2O .ž%>𘟷 ͈oÁä=uSÆ! zÜ»úgªNªSÍÍ%?;Ù„/nVø p«¦É îãƒ#8G†O} &Ò1hÏO¿WS–ÆŽú„èíè]Öû«€Õö§¦f(½¸vÇà”Ûí9"OV0W7iãñÜæaM Ùi¾z}·Þ<ö}³a´}Oùa ¥Lb“´© }È› žèZZß¿¤O¼[/½’TbôòBo«7ìݵô¨š¦‘Ó‡üL±ÆÛ&’)õŠå>7 ˆ.åå ØùJ»Õ–5ÔCzô·jçû{×OÔšµ.Å\ËõRµÇ)g0˜…ô¼Å%^Ýò™œ<òR2ÆW2ö«æ¢†4òœi©5tcÙ F'Òv7Ø/˜\kÓ‹OÊØXÇr¨h˜’ƒ €bRú©öžöÚ”}oËp>gå@F4×’’Ç®Ô,,ç¬îÊŽ¡¬/æÅ À稼ˆ/xdV™ªëI«nŠí A+Ÿ6"¹E® Dz?…©‡d›2`Ù[*n¾Ó ÖFÃü4íF®¹4˜ÀÆ º•ŒâFBŠ7?ÃùåiË¿ ®Rñ5ôõŠÑ»˜2(Ûùßê ³‚½Lfëo†’×/~Q}G¿ºl™ð˜eƒóõ:懞qkE¢Ÿ£jƒÔÀÎ’}«ày5Ö¶ë°½þ…§‹>Ÿl\uÑ©i ÿ’n¦lî9œßÅÞq^JƒYVçG,~çkÁbo»ÉÏ üŸ8 ÀoøSÃ}L ׬±´Ž9½w“?Ïédpåg*ØÄsÆÏD(cì1ÜNĬױîýÃɸ`·$¯%_“yù{Åqm/WƒEÿfýйIŒæ=ˆ)ªÌ¸­1?b6@a~뀆¥™/&åä8Ž_ùà.ç ÛÝóÙ²8-&å¢Îù“·«^)±+ £?nKnY‘’àÅìâp`ñOʇ,ž©–tÚÞÏûµ1úÛƒ¦'Ò‰!¨ ‘¬³A‚ÒÜŸ‡íW©éö‚)·ø60zõ®ü:×6q…Û‡RÒq•¨s³‡6ˆfàаáE{>ÊüêÖ‰KÎ+ŸMktÿÿÕxNŠLòÀÚô㩨-´I2lù‘ÍP%áB(!W=³Ê,L¸Ùp§ø¢5gÛ²íó àø°ØÎ„º(§‰µŸä @~''pnz,1è[ÈÀ»RmiS‹ðw1õ©¬§J •02Õ1½è¥$ç¨H„-BâÒàŒ²ü¼<½*¿I¿ üÈ(Äyæð‹IPü2t Øp†ºÃ¿ÿPºh¡2£aè˜Õ”§Î!},"!rç…G¨ @&8Î0Oµð¿-ÚvTƦ—­E› ‚VÉž¬3ù´ŽRÙ¹wÅík³ž—f°ðlø&®«ñÈÕ¿‘°D=;ßµÿç›§£øWÁ©—g…) ïAœ¿ÝåsqçÒ?–o¬ê£J¸óOºõî÷pÐ`m{õ,]y¨Œûà9éæ;VZC¤Õ­¨—ÿA·N=Ð(Wù}•¢™a…~…‘Š¡+ FX ÈL›1‚”‡åh³ìÞ•fDÄ­oœlÕÑYPnØ)š»JHZôš¾ëµqyƒ§(2ÁÑp\LwÝ´„Gê™kM%«q EÏXa¢º£ƒR8š Ø AšO模í»ÏºWRÒdÞä<’lé5Ç¢Ô6;i­ôÎ=ˆ.$R}°´Í_ ³ˆ’s´…áÂg³žû¿+ÔÇè&\¶?#M¿‹uKƒ MD ²¾²môž#K™V·Å`*à°Œ® ¹ŒÉ˜?X ¨…Ôòåãåð‹Ž´iß 8ÇH½yÐópë­1&Ô>ô¶&Ö8j¶”»¨' 5EýEĿOþdû «.ýüŸÐ5»I Œ3nÅwx“~bw¡í@q(R­ÆéÑv„ùÚ]p;{Ú•÷Z©‘¹ÇQœ!ìó±5Þ²ôWß­ô÷Ú¥=um™Ÿh„€Áó~r0;^¾«Ú³åó0D‘ßèÜ+¼:Ýp[—!³Ä"äòӮɫ›Ìf‘ø3‚0¥x«Óì*)§¡êÍ»¨Fqˉ¿œöþäóà8ÿ×sþ¥ßÇ"›¿Oªâ>"eŸÏY1?ufâ[¹Ãí½ßM®m(–Ú[Åð4ÔÀ]Dî}H#ÄLì£ñÙ•ù ”Jå„Çu¤ûúÁ7úÐa'®šý4DˆÄ4ZŽ£‡ù\âÍêüK•Åã`«umuIáÈl: ¹ä ïi.†³G×dÜ+ÞÃÀŠàk>Ьû¨±Ú߯wÝ^W÷@Mާ<;« *s7`2“@ÅÕÞÀ2 Ãÿ¸ù=÷Hès“ž<ÓŠÇL×Ù– À™$1 m˜„&ÜþG¯c’èoÒ%…«¢" a`aøvà;ê¨HA2¥hî‹}¿ƒ‚%þŽP ÐÏŸcD#E ’©¸táÍÇM$òFVºF¾>òIbjP#ÀÛ‰CåÕÎ ;ñ­RUfð¬Ac ¯ÝOÒç§N †¡qÅo ETù[š–öo³PšepR®ë)GH?)[ZZ¥tÇ-…áK’'³O§¢ÓHµ£œpÛVÈÖ<¸F°©”ENA¯Ó¹}ƒ™ ¢ƒ`éÏFp=J¢¥,’@åî?‰bé¬w•¿Ó¥8„K·¦ŽJøáؾ¦æžf2«Ä_Ä&XBqIézÇ6Ôö.8EÚß0vM±*f‘W]­–;%RU«÷5ƒ9ѳh„%I↞^Å·K."ˆâJZ*»9¦ÖJ}sçpÜâÇ·,0¬†!d䢚ü:Nf]ð¥5î9TTÑP1¥g§B-u øU·çSÝÁîmÔ¸—ÊÞÍ5"ü¿¶‡nä¹ä—lqbäè èäßfà”D/2ó3*‡ØvB ÄǪÓËxP ’žâ)¨(0ßjl¨‹FÖ.â“ãb_®«³¡5ÂgO1`SÜ)À FÄ@÷sN’Ó„@ ÑÔñr›‘£í€¾\W>KeSÈÉÔXR¦Sër…î.6A/ý€l'dÏh¯ü¸|q©¬9Œ›´Áç:‡sTç_åÉÑ¡”fmYÁœWŠr OýAíU±Ý¥îpá`nè@Ù­f¾êÇŸ‘Ó¶(FÂ6óuO'Öwê匊ŠÇÔG~”ˆx&]ØÝAáËyá+ã)t¸Ä®?ÿ|Í)âÍ Jv—ª²~4;Ùtµ7 /hB®ÔË­Q‚Ñ5G“þØBÏÅN& þš¿˜™[«:'«OjQ.Ao}ÆèÆmŒ¶Áò£Q40ˆ1ã5ۨv㨸WÎ6ÎVMš„µ–í­ßU²ç —ö³6˜6Ì/Ð4ŸiÈ,€$›‘(AR2b5ݾ¸\ž¤êuáà#4”Z÷®óÆhAŸ›âÁ*uœÔ³ÚÆ2¬Ë™ ø±(èÁzÔò©ÿ=\·ˆf–šÜ;„"ú=qŪÂ^„Á-¾ãˆDâM‘ÙgeÑæ•à“úʤ”YÝñžßáÌ‹…;û¼ßß¶ôÁªÜ6®åëªñ¦='ACA¡Þâ: $Ðr«‡Zf`møê“{• '}ë?JØcb•æ·Ád’ÉýIÁp´àÁ¸ìR÷úycw7ïsý]¯ÍLZ¯½ t_tCt2jYãõ‘‘%\ñÛvºÂˆ+`fO7ÂNa7Q`V¡ù©% Wl‹v‡"º¡ó¬0˜£Þ’’ÆÝÕ¥© ÀYd"»Ýo8¤ç­w­øawø“O4áÅŠÝxx¾<—aWA®Úõ޻Ɗ¥Êœ+PÌ›Rù*`N’X”À@n0`΢ŽDqº6õN¢’ÃfÉj6YäÆYlvaÉ€âr h,ss2Ð_LfЖ‹Ç7„FúÅmÃÈÇRÄeDa¡ÅõG¦.îÝ?sj3äÆ4_\âC «ÁFöÜcžâ `nâ¨æ¡}F„NýÙô'žŒÅSJGÒ`uôD}Üò_7'ýh.$Gwô"E·é6ÏcßVpæXº3+ÝrŒØ$ÈL¿Œ"ÙíÂÐ ÙJ¶¿© {ÆšAYV³€Äv%onÂu.sìØMФ”gf&pW:4¸j*xߎ ¸Ê²cÐÀ?{ë9ÀÊ~Ó0® ™’´Nm^ ßM=õP7^!::Ã9D¼Ï™(aŠ“—èMhK¢uƒ@3Еæéå‰KIؼ٬¤òá±óL]ZÕìÇË0~½À`‚û]Ï’s|¶1'CIª ÙÙÂgλþe·¬äü?·×/£EK6(>Š[¥àÇ¢“¬N+rs£Ñ÷&k5žxcM,jo{©‹^C¾ç. óÀ^iæÉí\ÚŨf]û¿h'ôôã.-3òªŽC„³ôþ®B.UüÌB›ª;7h‚ƃpZõ(1}†©€×®1JŠ ¯õ"É$™É¸®RdzQ\ÊOs¸[vlœE ;™ìË=kàT#ÇÿDS?”%áÒæL!ªË†¾Q;ÏLBºpŒÓIÁ­4}7KéÍ#DÐæ]\žià O±u-¥KîÔjug[m0¶|þÚꨜ vÙa9£îå÷È,¼½¾OêqhROP‡moq|:FÙ2 Pö!„ÕfǘÐ",ãBA °ˆ=þªHF§ï‹ê‘QŸßë«ë»+ qÁXZÿµkL%Ýâó<\ £À@L\’Vé÷™èn#Æ“šíFº]ö*ÒCÀ’ɹÏÓì{Xõ$ÓCaû »7ÃMÞåVw‘8ÁêCà„ç0Ù¦(¤š¾ô,.uú^¾5{qb.Æ;õzT§É?µDÃÎ=ö?Ù%z'âd¢¢ ôoKcÿ)‚AÆ„.ôø³ oõĺ!~®“3U?¡³¡¾˜¹Š²p,/ò­[[©ÿbµÏZÝOA­*UŸP˜\5 iN#!¾ÇdâçNÕšPr_™ŒedÊ#FN‡•Z`U-Æ{c×Ê¿ózòVC–u½CR;™‚Y`(Á[ '];í² ZÃ?Æ¿¯àëaŠE‰× \TRøSÈ­@æ~"Rç‚gJõwéˆUí³@¤VµÉ#èÖ#žß4«5Õ–=Lt³&g»¡BpQçð(Ô¥N)8²&¶¤Mv:­ùY¹rj©Ï ÞŠrvè×Cùw‰ÜhÜÃ͵*%Ëà‰’Këî=ËGŠvî—²H£€Ôì;à8Þo'jdÑÚwì ÂUbGðtôpª”yƒš‰Û2Am”zùý̘ ôëš[÷}B?„–T×êwàŒÕÎäﻕ\·Œ*µ™ž€r½$ß)U˜´iƒ×í-V’¡ ¤ ȼ¨S ,ŠióµÎÄqËÜ«üs&‚æ9y«Ú¦iœäÑùž‹Ç?ˆ&éyŽèLõ&Ê ò¡k_¿8ñj¹Jëg“Þ›z8ßA²Í˽éâÅ} L÷òì­~s† b„FêYµæUÛ¶õ\F§Ó8œãñ~{Æ@ã‚÷Îe¦ëÖ€–®$¨ð ÙY|]): 0SùÄfÙ¯B?+·K°¶0ÎöÈf’ÿ0¾ô‰5ï€Çq¸ §ÔixfI9+Ü]иÏÖš­‹비`å°ùBró> ±\%âÊg@ªwqJÿÅ’Ür#âöxR¯è‡©”Q‹Ñ§c÷LW÷J®øz¤K«°1µUœ®ag©—ûj·¦ŠžÈvWl´älµÚnËØ¯¨}”aVCZ)Qu õ1-ç&½Lj§}õáªÃÍÍÎ;E8êÏòéÆîRÔGs¹D—ëÒí¥Á8@ ‰lÉý¸Q'/p@¸[.¡ÃÅ]GVιÿ‹%lïÎæ6ãÉ’ —±²Œ¡Oõ¦ö0O½EGW9Ô0x6/Q4 µ¬_‘%?ðõ+ކNg79:¶¾í+/šŽò û+ˉ”‰ýÁ„U8 JOùîg¯ÍËÀ<ÛÈ€ýº"v×–êêÆ‘Æ¡»ì5}½·Î¥ò̘±÷?‰¡~êy)}›ã %kR÷9ÛCÔ©/û¯ÀKT(#F–CŽZó\–(a¬ˆ ¡è:PfBÂD†S§û4û,G“ŒÃ¡\;ï u´xõc ¹°6kñ»Ýz…-%Ìfþ¢ÎÿªF¨0ÆDëÓ–ïJi$J-­)Y.ÆAÝI°¼'ÂÜúOÛp'á? ߉)ÉYÑ΀NèÛ”×Ì3ý´Ú£SÀvìB³Á~ø¥:ˆY\¦'éÔ:ƒ…‚ƒƒÉ¶c}E¹ÌvÎç—'T³ôù³щlç4jÅ}@PååDàsÞÞj¨ž©Íír7P?ŽºÂ¬ÏÌðÄgá‹ O˜ôÝBpœ¨øQÇǨæÃ<ä÷Ú¢ù8éÒæÖù«ÉS„s¡~Õ–°}bT““Óú;»òæý)¼¼߯W‰ßÖü¼IÉÔ4!¿nMC۽Ϛ‚©YKi#p7í»R!‹(ô+†ðôû³ÿg©zcŽ j+¥óM³ÅMh^À¨Ñ¦“ô¨)Ö¿Æ=³âÉ·¶Õ‘€Ý?íçš,ö°y½ÑDÂásìI§ó™‚ñ€¬ƒ${pÌf/Oã´/1rëK*ín|~öNøHKÕÛZpËÅÈÚ?4ÄÙqÙs¹”ZyGw+È®Hœ–~wèhœn*&"À0©ÈEùÿ@ú ´·Úz­î݃]qX ¿ÇKY®e ‘EXýS¶‹™†ßë"ŠõÊB ¶Y« ˜™ûδl]^2I‘Û BBAõQlF~|‡„»:.¿´ý®®ì ©T¿ìÿ0ÖKo·$v?:<~©èÆ‘Õé±dr¢Z© ®÷Ñù·^ZD)/½ì9zß¿íhŠ®x¨t£• *mÂ"Vë]OAŽÔ6Z¸MÞ…[GQlÜ«lŽæ):U |8cª óY¦Âí±Dqž ӌǮ¯šå¹Åw56÷"%ì߯ÄLŸ\ˆ<qYîûm÷;ã ÿl*Nuï'Èþãâb„}Wêe45 ½`qlÛdÝæ˜ ^Ù?cLNq’x#Ug^‘ÕmÃ]¿=T”úö­ßù\³”•î»)È\NõÈÀ⎦„r—jÏ’)z¶õÍÔï›ÕæàþÉ’‚ªc‡,þx¾²dËo`Ø,áR/Ä`ŒÓLÁ¢âì[y¿BK«,5s‘ç+È¢ñýúùæü’¨Æìh*' 0~À³d¸Ø6BØË„FÁÛRÜc Yk9|ªE†×¹.⺬o"èËf((Ó±D…R+ ”Ÿ‡°[À})èÁ„­¡ñ,–ì8,ª“¶A +òz‚ŽÚxc7*髦¶íèÇZïƒ1$¶  ùÌfîìr c…¥ÑZóZ=3Ãaõ_Æ—yq%œã ……¿`|,îmR8*ö°EI’ü6°ûaàʱôæEœ±+Ò M@­wÒËe=ÿ‰±®~$¥ c]ð0KcÔ¤¦æÌMhþÃÃÂ0Eq2@kB¦C0µ¯Í%Ž  -…8z±tV–w°è©»0ÅÂÅЦ©¿mìA 3Ê©‡¸ÚÐ(íŠë¿/ =àà£ÙÝ]\&÷´‡¸ó IŸqüjçBÝÓì9Í{Úu>>cý‹ùP?râ ìàÊ[ò"ùmÿf¢ô8!DÚâQîCœ?ƒ½BÒ9Æß _RBK„ 뜶¸ñJ\¬áö#¨ÔŠÿ@¶T çt~|ï <•uH œé–ئ{°H¹1¶}Õ²F Í]Òî;h‰Ü–‰‰Cg·p¡³+…\ø=/‘æG¥³b(m±Ü¥ÿÒ…&². ˆ€”±f{¼Apó´|ÏRœ´,´Áóù*ÂuÊ¢žyhVrU&÷îfä¯éÚIY|dòÇ0B4!\¾¯äMjåÚXJî}‹y­’úñOW8H8ÁOÐZ•Ë8ó²F$üfLh9•£¥t«KÚÜàŒÉºåª¾5°õm1u°ú0QÛS´‡ïhi9eâ£îG,`áØC­´)æµCïÀXp"ô?Ohó´Ê< èz~þz¤ŒZà§ÚÚ‡­v°´›ÂDWÈ«]‹Sòõ×™êI½f7 ¢>Kx|NâÅéÁÏ¢#›'¨74EûÊ{0È H7]Žç5 ÀŸÖòx#~JÆj£=æcŒ™-e =ñÕÐÑÙû×_G(èû#Ô€2>þ Гœ2‚qHÐ:ØdˆËYL ‘ɰˆ¨K]‡XhJM¼]ç*k ÂÙ“u˜S=v«Û¥PÁ7¨oJ]õhw Sã®9ÑΠ€ Ê ÃŠµZZ_Ž:6}—’•qç¾*u‡šÚ0k¨×êÒWdÐú º/‰Ÿ ¡ÝV3ùÒ6JçoÓ¥±~üx*~¡ÖêÀâ!·£o(/BH('”h°ím\çñRÂ+ÅŠ­±NDÆñ>?ܦxÞIŽú¥—®èޱ¹A”é^jãð­1‰€ hçc \—kðÛ ¡º&ùZ‹ìé_¾ž›ªóöjáLÁ«6EÛPî*|4ªJ d—näå?ÍZCžTp[Ä$|ÜŸÅ@&²¹v’›NV‚ §;{6¤cnHXY„Â%—hBNì~úE®¾«Ìí¢0Q%|¥c.í34ÛÕn< \¥ìbØ/Ç­y.màûMÓÑÛ’¥âqß3ð÷,–²¾æ]HôÙr¦–ÿu¼ øE•Pñ>æ–¶çƒc5,[ód( !ß Ù½œ ›xYÈ´¦KVæ‘Ñpôúô†,æô4ˆŽú±­˜óxâÌðÔ~ÝF_ÖçÂä°äe¤+ø‰zsã9O!äÖ«wyO\T‹±!ٲ٩˜¤'~C…ià:rÕþkgtÕpØå6/æÃvþø½Âáf»½%–ܺ›ÚܳûèÔZùx6/ñOÖu¸:Åÿ)÷bIÏQ ð F먌¸‚ø£+kNâ2CéÁ\á,ɉʈÀmzÏXÈKŒHEz–eßX¤S[ÀŽ@Ž¿j½þwC¬’Cä [uÞYRS4ã)]F¾$&×V5®Òç5„bOp,ŠÉDVá8X¨‹ðôgOðÙÒçh·taÒó´Òi÷S-Ät´'ñÍÚ[}ßÑÜ8îif¥òS9¼‰z#$ÜÄ×$ÇxÞ[[—÷m똙Ò%D$háf3hý:üŠÞÓÿ¹™BQ*¢ œ5 ÈÒ#µQd *ø®ê/*Âf™ ÍŠŸOw6ãuýª\“"O% ÷6pk!¬)‚ŒÞÎ?¼ÒIºÿZk<¶a·mìöÉ·Qõ¯%HÉó×Öø)¬–MuE¸»!`¯[­àDÀÛ{cg/Jâ¿*ÆjwÓ£‰ŒŸe‚òk[d=®›HÚÖ/ ’3ûÑ—n%$ÂmâP%³C®ÇÔis%fýâFô"€"”YêÉß±[&~(Ã]l¢Èç ÃÎú/•*ëbxk/,ã’¯©u=¶óÝ4 |J>°Ä‚±c¹®(Žy­8îߢ«1>·ŽT/ <µü=>ÔøÌ%ÃM—;ßw>³Fîb*¼]!’´«8Ú–©W£Áçÿ=rªõÛÕ"Ú*àå ÐÓ2À•ÇÒí´”a:yŸƒ³´UD~Γ;|Åèd_Qb„)w!¢(ÝS`í‘eFâ÷· ýPöAâ­nE§I8.ö›N-¤nˆôfágö€[j:g#<…_}òçi‘Îtp]ßX­vÎÁI<..á° ZÝÄ,º d÷¤L×3åÄî/9š‚tŽÞ¹SùÞG¼9|Ô-ª1b½„În’«ž xùW|B¼åÔ>hš•Ôh¤å­ø Õ@;®î*Pæµ¼{ã*àêü:NàƒïŠPÞ-§'ul:|ô ?7…îÏ 4¹K }vµ#¹Ñð†ú¥’Lx°Ëj¯rqS:¤Vtâ9}ôÝç/×5SQÙŸ[YJÃÈ‘ÅZ(™j4¾ ðåàlóé}÷Š7nÅ"™…ñ ENM‘Z¬ÚO6!5*J¯óä:o—'Š—àé&Ñ»J¢ŽÓù¬3(ÃvèÞÞ¯5t.sÜ£H`îût1ff¸Þ~GIW­ÄkB¡¢˜«¼ý[Ó~.“ÑÓ>.Œ´²¤·JÀªmu&Å”&fßiat` tÆ”ç_(-¦czvÇ|b2sõˆõëDÂØÃâÒJÚ¹çåÇn”Æ6eÑì.T¿x¡í‡·­ÚÑîpG!ÒÓÙŽ¹öOZµØ.VÚÚ ø+åxãG8@鎾)7“ÝàÈJ*UJLr ÀXjóЋ@ƒü$¾¶,k£\s¬üñÙaË<-œ«s½aÖŠï•;<5ÏAðfŸjËYÔÖÔciª ê®Se qeb¾<`ž& GÒÛJ¦ë踋u˜?ê…ˆÚTm±¸ÙöÜÙ*m^~^Šùu›ñÇ©{­èø ¥SU§*Vã^Ã'KpH¹¬ /OW*®ào餪ž [Ö}‘#¸YFlZŒŠ† l€}z°á0Ë´î/¬ü³ÿ õËaÞ+;éC7Á¸õ sß?Ï‚’zçaˆÇߌñ/éȘ ×Ä:Ó#Ÿ²WÀ­» endstream endobj 45 0 obj 95312 endobj 46 0 obj << /Type /FontDescriptor /FontName /NimbusMonL-Regu /Flags 5 /FontBBox [ -46 -273 649 820 ] /ItalicAngle 0 /Ascent 820 /Descent -273 /CapHeight 820 /StemV 80 /FontFile 44 0 R >> endobj 47 0 obj << /Length 881 /Filter /FlateDecode >> stream xœ]ÖÍnÛ8†á½߃–í"°$ò1` e Èb~0i/À±•Ô@#гÈÝõ½J1ÓMŒÏÎ#2´VÍÃîa8]‹ÕßãùðØ_‹çÓpû·óûxè‹§þå4,U]O‡ëgÔÇáuY.V·ùo×þõax>›ÍrQ«n¼]ÇâK:žŸú¯úò¯ñØ§á¥øò½yä«Ç÷ËågÿÚ×¢\.¶ÛâØ?O5ÿØ_þÜ¿öÅJÓ+N×»ÛÄÿ\òíãÒ5_Tôv8û·ËþÐûá¥_.6e¹-6]·].úáøûhU–L{z>üØ·Ëëéò²Låv •Âíc 5¡Vp§à ^Á¦A!ÞB]Vk…{FîÖF!)dBVhÂŽFw -#­BG˜Ì‡ÇÉãð8y'Ããäqxœ<“Çáqò¸Hˆ xœ<“Çáqò8> endobj 49 0 obj << /F1 42 0 R /F2 37 0 R /F3 43 0 R /F4 48 0 R >> endobj 50 0 obj << /Im16 16 0 R /Im13 13 0 R /Im10 10 0 R /Im7 7 0 R >> endobj 51 0 obj << /Font 49 0 R /XObject 50 0 R /ProcSet [ /PDF /ImageC /ImageI ] >> endobj 23 0 obj << /Type /Pages /Resources 51 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R ] /Count 9 >> endobj 52 0 obj << /Type /Catalog /Pages 23 0 R >> endobj 53 0 obj << /Creator /Producer /CreationDate (D:20050523220135-07'00') >> endobj xref 0 54 0000000000 65535 f 0000000017 00000 n 0000029564 00000 n 0000029592 00000 n 0000053413 00000 n 0000053441 00000 n 0000064914 00000 n 0000064942 00000 n 0000162005 00000 n 0000168892 00000 n 0000168919 00000 n 0000306891 00000 n 0000322401 00000 n 0000322430 00000 n 0000386236 00000 n 0000398725 00000 n 0000398754 00000 n 0000510407 00000 n 0000537189 00000 n 0000537218 00000 n 0000569465 00000 n 0000569494 00000 n 0000575757 00000 n 0000703384 00000 n 0000575785 00000 n 0000575894 00000 n 0000576003 00000 n 0000576112 00000 n 0000576221 00000 n 0000576331 00000 n 0000576441 00000 n 0000576551 00000 n 0000576661 00000 n 0000576771 00000 n 0000592370 00000 n 0000592397 00000 n 0000592652 00000 n 0000593269 00000 n 0000593822 00000 n 0000603984 00000 n 0000604011 00000 n 0000604265 00000 n 0000604734 00000 n 0000605110 00000 n 0000605227 00000 n 0000700680 00000 n 0000700707 00000 n 0000700943 00000 n 0000701907 00000 n 0000703101 00000 n 0000703188 00000 n 0000703281 00000 n 0000703675 00000 n 0000703736 00000 n trailer << /Size 54 /Root 52 0 R /Info 53 0 R >> startxref 703943 %%EOF ntop-5.0.1+dfsg1/NetFlow/docs/ntop-netflow-cisco.txt0000644000000000000000000002335610244572252021010 0ustar rootrootNtop on Fedora Core 3 for Cisco Catalyst 6509 with Sup720 Tue Apr 19 11:03:19 PDT 2005 by Andrew Gristina thanks to Luca Deri and the ntop team This document specifically addresses a subset of interesting netflow export situations to an ntop netflow collector installed on Fedora Core 3 Linux. Why ntop and netflow collection? There are many tools for gathering data for network troubleshooting. MRTG can monitor interfaces, bandwidth, and snmp counters such as CPU and memory usage. Nagios can monitor node availability. Syslog can give detailed information for troubleshooting. NBAR can help classify traffic. And network sniffing can give a very detailed profile of network traffic and captures are invaluable tools to help troubleshoot network problems. Netflow and Ntop can provide facets of several tools and can be implemented in situations where other tools can not reliably be used. Ntop is excellent for summarizing netflow information. Ntop reports can give bandwidth summaries. Ntop can classify traffic and provide network profile. And Ntop can also allow you to get a detailed profile of network traffic. By using netflow, Ntop can help classify and profile network traffic on networks where spanning ports or sniffing may not be feasible due to scale or network architecture. Installing ntop on a Fedora Core 3 Server First, install ntop on a Fedora Core 3 server. For ease of maintenance and installation, download the binary RPMs from Sourceforge: http://sourceforge.net/project/showfiles.php?group_id=17233&package_id=13248 The FC 2 RPMs will work on FC 3. Fedora should be binary compatible backward and forward one version (more than that and you are asking for trouble). To install the rpm as root: rpm -ivh ntop* Then, copy the sample config to the location of the real config: cp /etc/ntop.conf/sample /etc/ntop.conf Edit the ntop.conf file. If ntop is not capturing packets and is just being used as a netflow collector, change the interface listened on to none. Netflow only collection can help show the network traffic patterns when taps or spans aren't helping or available. Just copy the line “#? --interface none†and paste it in, then remove the “#?†that comments out the line: --interface none Next, change the “-m local subnets†to include the network addresses that ntop should regard as local. This example includes the 10.x.x.x network and multicast traffic as local: -m 10.0.0.0/8,224.0.0.0/4 This should be all the changes needed to the config file. Check the config thoroughly to make sure it reflects the environment. Before running ntop, setup the ntop admin user password. This password will be used for the web interface. Run the following command and follow the prompts: /usr/bin/ntop -P /usr/share/ntop -u ntop -A Document the password. Installation and initial configuration is now complete. It is time to start ntop (these commands are Redhat/Fedora specific and may not be available on other linux variants): /etc/init.d/ntop start or service ntop start Next, make sure ntop starts at boot (these commands are Redhat/Fedora specific and may not be available on other linux variants): chkconfig ntop on If this succeeds, ntop is installed and running correctly. Check to see if the ntop web page is being served. Use a web browser to go to the ntop server's ip address or hostname and append port 3000 (if the port the webserver is listening is not 3000 in the configuration file, use the new port instead): http://ntop.domain.local:3000 Configuring NTOP To configure ntop and netflow collection, use a web browser (firefox works) and connect to the ntop server: http://ntop.domain.local:3000 As a pdf, this document includes pictures that will make it easier to understand than the text file version. Click Admin: plugins (type in the web admin password). Admin-plugins This should display the plugin page shown below: Then, in the column labeled “active click to toggle†where it meets the netflow row (where the second “yes†is in the figure above)- click the word “no†to toggle the plugin active. The screen should look like the picture above now and there should be a “Yes†in that square. Then click netflow in the configure column. This should display the following screen: On this screen, add a netflow device for each netflow router or switch. Click the button labeled “Add NetFlow Device†and then proceed to the following instructions. Fill in the following required fields. After filling in each field, click the set button following that field. If the set button is not clicked, that setting will be lost or not changed. Don't forget to click “set†after each field. The following are the minimum required fields: Device: any useful name, the hostname of the netflow switch is recommended. Port: 2055 is the normal netflow port, if there is only one device sending flows to ntop, use 2055. If you are having multiple devices that you want to keep separate, then use a different port for each one. Netflow address: use the interface address, or just put in a subnet for what ntop should regard as local (192.168.1.0/24, 10.0.0.0/8 or whatever). This may be redundant with the -m in the config file. The rest of the settings may need adjustment, but for a basic netflow collector, that is all that is needed. Example of configuring netflow plugin: Cisco device configuration: Check Cisco's latest document for the specific version IOS and hardware that netflow will be enabled on. Sup720 MSFCs are automatically in CEF mode. But to do netflow on other hardware such as routers, the equipment willl need to be in CEF mode. Here is a sample of configuration needed for a 6509 with sup720s: ip flow-cache timeout active 5 ip flow-cache feature-accelerate mls ip multicast flow-stat-timer 9 mls flow ip full no mls flow ipv6 ip flow-export version 5 ip flow-export destination 10.10.10.10 2055 mls nde sender version 5 This will send flows to the ntop collector at 10.10.10.10 on port 2055. If a subset of the traffic is all that is required, use “mls flow ip ?†to display help on specifying subsets (not subnets). You can also limit netflow data to data from a certain interface: int vlan 2 ip route-cache flow mls netflow sampling Router configuration: On a router the NDE portion (network data export) is not needed. CEF however is required for netflow according to documentation for IOS 12.2 and 12.3. The following works on an 831 (and also on a 1750) running 12.2 train IOS: ip cef ip flow-cache timeout active 5 ip flow-export version 5 ip flow-export destination 10.10.10.10 2055 And then, if needed, turn netflow on the interface desired: int s 0/0:0 ip route-cache flow int fa 0/0 ip route-cache flow If traffic is flowing through the devices, ntop should be reporting information. Check the webpage. If you have multiple netflow collectors, use the “Switch NIC†button to view the other collectors' statistics. Confirmation and Troubleshooting Once the netflow export is configured on the router or switch, test and verify that ntop is seeing flows correctly and that the server is receiving them. If ntop is not showing any data, verify receipt of the flow on the linux box. Assuming the netflow is going to port 2055, that is the default netflow port, you can use “tcpdump†to just show traffic to and from port 2055: tcpdump udp port 2055 If “tcpdump†is installed, there should be plenty of data from the router or switch. If no data is shown, the netflow data is not reaching the linux box to be decoded. If you see data in the tcpdump output, but nothing in ntop, the netflow plugin is probably not configured properly, ntop is not running or you have an iptables/firewall blocking the traffic. To check to see if ntop is running: service ntop status Then, make sure it is listening on the correct port : netstat -an | grep 2055 Substitute any port you are sending to in place of 2055. It is beyond the scope of this document to troubleshoot iptables, but as a quick test disable the firewall if the security situation permits: service iptables stop or /etc/init.d/iptables stop Performance notes: Monitoring gigabit networks with ntop (or monitoring on routers that are already cpu taxed) can cause performance issues on the network device and on the linux box. If you don't performance baseline your network equipment, it is a good idea to do so. Here are some easy steps to baseline just for the impact of ntop. Run an application to measure performance like “top†on the linux box before you turn on ntop and again after you turn it on. Make some notes so you have a baseline for before and after. You can cause some CPU load on a box with too much netflow data going to it. Likewise do a "show proc cpu hist" or “show proc†on the router (or similar) before and after turning netflow on. Make notes. Sending the netflow data takes a certain amount of CPU power and bandwidth, so baseline performance before and after starting it. Ignore these instructions if there already is a baseline for performance of the network equipment and linux boxes. If ntop is using up too much ram and failing, which can happen when monitoring large networks or too many hosts (like keeping track of all internet connections), then tune the tracked hosts down by limiting tracking to local hosts (you can include non-local hosts in the local hosts statement to continue tracking interesting ip addresses). In /etc/ntop.conf uncomment the line: --track-local-hosts Conclusion Hopefully this guide helps implementation of netflow collection from Cisco IOS based products. Netflow can be an excellent tool for classifying and profiling networks. Ntop can help make sense of the netflow data, which can make troubleshooting and administration of a network easier.ntop-5.0.1+dfsg1/NetFlow/README0000644000000000000000000000027210646113463014436 0ustar rootrootThis directory contains a simple NetFlow collector that stores on a MySQL DB all the traffic information sent by a NetFlow probe such as ntop --- (C) 2006-07 - Luca Deri ntop-5.0.1+dfsg1/NetFlow/ntop_flows.sql0000644000000000000000000000155007517025137016474 0ustar rootroot # phpMyAdmin MySQL-Dump # version 2.3.0-rc3 # http://phpwizard.net/phpMyAdmin/ # http://www.phpmyadmin.net/ (download page) # # Host: localhost # Generation Time: Jul 22, 2002 at 05:50 PM # Server version: 3.23.49 # PHP Version: 4.1.2 # Database : `ntop` # -------------------------------------------------------- # # Table structure for table `flows` # CREATE TABLE flows ( ipSrc varchar(19) NOT NULL default '', ipDst varchar(19) NOT NULL default '', pktSent int(11) NOT NULL default '0', bytesSent mediumint(9) NOT NULL default '0', startTime time NOT NULL default '00:00:00', endTime time NOT NULL default '00:00:00', srcPort smallint(6) NOT NULL default '0', dstPort smallint(6) NOT NULL default '0', tcpFlags tinyint(4) NOT NULL default '0', proto tinyint(4) NOT NULL default '0', tos tinyint(4) NOT NULL default '0' ) TYPE=MyISAM; ntop-5.0.1+dfsg1/NetFlow/netFlowClient.pl0000755000000000000000000002560507702330077016703 0ustar rootroot#!/usr/bin/perl -w # # NetFlow V5 client that stores flows into a MySQl Database # # Original Version # (C) 2002 - Deri Luca # # Modified Version (C) 2003 by # sinma GmbH - Uli Staerk # Berlin - Germany # # Prerequisites: # - Perl # - Perl DBI module (www.cpan.org) # - Perl IO::Socket module (www.cpan.org) # - Perl POSIX modules (www.cpan.org) # - Perl NetAddr::IP module (www.cpan.org) # # Installation: # - configure your NetFlow probes (ntop,nProbe,Cisco,...) to match the ip of the # machine this script will be running on. The default port it listens for flows # is UDP 2055 # - copy this script to any desired location in your directory tree # - make this script executable (chmod) # - check if the path to your perl executable in the first line of this script is correct # - create the 'flows' table if you need it (read on) # # Usage: # ./netFlowClient.pl # # This modified version does not only store the raw flows into a single # table which will easily grow up to 2 gigs a day. # # It creates a table for every month (machine time, not packet time - have to fix that) # and in that table creates an entry for each host specified in a network list - every day. # This makes it very easy to get traffic information for a specific host during a specific period # # When a flow is coming in it gets checked weather it is coming or going to a host in # the localnets list and the corresponding field for that host gets updated. # # The script produces almost no load at all on a dual P3 1000 with 2 G RAM and SCSI # However the mysqld daemon might raise your load up to 0.04 on the same machine with # 4096 hosts being monitored. Please read the mysql manual for performance tuning. # Keep in mind that this might become a real problem when you have a lot of networks in your # localnets list. # # According to my calculations each monthly table gets about 8 MB big when monitoring 4096 hosts # # TODO: # - support other nets then /24 # - support other DBMS then MySQL # - write local traffic to another table # - find a way to have traffic-data for every 5 minutes in a reasonable amount of time and disk space # # Table layout for the 'flows' table: # # CREATE TABLE flows ( # ipSrc varchar(19) NOT NULL default '', # ipDst varchar(19) NOT NULL default '', # pktSent int(11) NOT NULL default '0', # bytesSent mediumint(9) NOT NULL default '0', # startTime time NOT NULL default '00:00:00', # endTime time NOT NULL default '00:00:00', # srcPort smallint(6) NOT NULL default '0', # dstPort smallint(6) NOT NULL default '0', # tcpFlags tinyint(4) NOT NULL default '0', # proto tinyint(4) NOT NULL default '0', # tos tinyint(4) NOT NULL default '0' # ) TYPE=MyISAM; # This application has been strongly inspired by: # ftp://ftp.mcs.anl.gov/pub/systems/software/netflowdb-0.1.0.tar.gz # use strict; use DBI; use IO::Socket; use POSIX qw(strftime); use NetAddr::IP; my $debug = 0; # prints A LOT OF debug messages (MySQL queries) my $debug2 = 0; my $rawFlows = 0; # shall we dump the raw flows into the 'flows' table (don't forget to create it first!)? 1 = true, 0 = false my $ignoreLocalTraffic = 1; # shall we ignore traffic the host in our localnets have among each other? 1 = true, 0 = false # array containing our local nets we want to get stored # notice: only /24 nets (256 hosts) are supported at the moment. # see the examples below for syntax. my @ip = ('212.21.77.0', '212.21.78.0', '212.21.79.0', '212.21.85.0', '212.21.86.0', '212.21.90.0', '212.21.92.0', '212.21.93.0', '212.21.94.0', '212.21.95.0', '212.42.228.0', '212.42.229.0', '212.42.230.0', '212.42.231.0', '212.42.235.0', '213.83.17.0'); # set your database parameters according to your needs my $databaseName = "DBI:mysql:traffic"; # Database name my $databaseUser = "traffic"; # Database user name my $databasePw = "traffic"; # Database user password ################### # # No need to edit anything below here. # ################### my @nets; foreach(@ip) { my $temp=$_; my $tmp = new NetAddr::IP $temp; my $num = $tmp->numeric(); push @nets,$num; } my $numHosts = scalar(@nets)*256; my $numFlow = 0; my $udpPort = 2055; # Default port # Open a socket to receive Cisco netflow output packets my $flows = IO::Socket::INET->new(Proto => "udp", LocalAddr => "0.0.0.0", LocalPort => "($udpPort)") || die "cannot open UDP socket listening @ port $udpPort"; my $dbh = DBI->connect($databaseName, $databaseUser, $databasePw) || die "Connect failed: $DBI::errstr\n"; print "Waiting for NetFlow V5 flows on port $udpPort\n"; my $first_time = strftime "%Y%m%d", localtime; my $first_month = int($first_time/100); my $now_time; my $now_month; my $run = 0; # are we running yet? if not check if we should create any tables / data sets while(1) { my ($buf,$rcvval); $rcvval=$flows->recv($buf,2000,0) || die "recv: $!"; if($debug) { printf "Received %d byte packet\n",length($buf); } # Flow header my @recvdFlow=unpack("a24 a48 a48 a48 a48 a48 a48 a48 a48 a48 a48 a48". " a48 a48 a48 a48 a48 a48 a48 a48 a48 a48 a48". " a48 a48 a48 a48 a48 a48 a48 a48",$buf); my ($hver,$hcount,$hsysuptime,$hunix_secs,$hunix_nsecs,$hflow_sequence)= unpack("n n N N N N x4",shift(@recvdFlow)); next if ($hver != 5); # We handle NetFlow 5 only next if ($hcount != ((length($buf)-24)/48)); # This packet doesn't seem to be ok my $basetime=$hunix_secs+($hunix_nsecs/1000000000)-($hsysuptime/1000); my $aFlow=shift(@recvdFlow); $now_time = strftime "%Y%m%d", localtime; $now_month = int($now_time/100); if($now_time!=$first_time || !$run) { # check if date (year,month,day) changed if($now_month!=$first_month || !$run) { # if date changed check if month changed initializetable(1); # create a new monthly table $first_month=$now_month; } initializetable(2); # create table entries for today $first_time=$now_time; $run = 1; # from no on we only check for the tables when the date changed } while(defined($aFlow)) # This loop ends { if(length($aFlow) < 48) { # This flow is too small last; } else { my ($fsrc,$fdst,$fnext,$fin,$fout,$fpkts,$focts,$fstrt,$fend,$fsrcp, $fdstp,$ftcp,$fprot,$ftos,$fsas,$fdas,$fsmsk,$fdmsk) = unpack("N3 n2 N4 n2 x C3 n2 C2 x2", $aFlow); if($rawFlows) { my $sql = "INSERT INTO flows (ipSrc, ipDst, pktSent, bytesSent, startTime, endTime, srcPort, ". "dstPort, tcpFlags, proto, tos) VALUES ('".num2ip($fsrc)."', '".num2ip($fdst)."', ". "'$fpkts', '$focts', '".timestr($basetime+($fstrt/1000))."', '".timestr($basetime+($fend/1000)). "', '$fsrcp', '$fdstp', '$ftcp', '$fprot', '$ftos')"; if($debug) { print $sql."\n"; } $dbh->do($sql); } foreach(@nets) { # check the incoming flow if one of the ip fields belongs to our local nets my $temp=$_; if (($fsrc&0xffffff00)==$temp) { # source ip is in localnets, update bytesSent field if($ignoreLocalTraffic) { # we don't count traffic the hosts in our network list have among each other my $inLocal = 0; foreach(@nets) { my $temp2=$_; if (($fdst&0xffffff00)==$temp2) { $inLocal = 1; # destination ip is in our localnets list if($debug2) { print "Lokaler Traffic: Von: ".num2ip($fsrc)." Nach: ".num2ip($fdst)."\n"; } } } if(!$inLocal) { # do the query if destionation ip is not in our localnets list my $sql2="UPDATE traffic_$now_month SET bytesSent=bytesSent+$focts WHERE ip='".num2ip($fsrc)."' AND date='$now_time';"; $dbh->do($sql2); if($debug) { print $sql2."\n"; } } } else { my $sql2="UPDATE traffic_$now_month SET bytesSent=bytesSent+$focts WHERE ip='".num2ip($fsrc)."' AND date='$now_time';"; $dbh->do($sql2); if($debug) { print $sql2."\n"; } } } if (($fdst&0xffffff00)==$temp) { # destination ip is in localnets, update bytesRcvd field if($ignoreLocalTraffic) { # we don't count traffic the hosts in our network list have among each other my $inLocal = 0; foreach(@nets) { my $temp2=$_; if (($fsrc&0xffffff00)==$temp2) { $inLocal = 1; # source ip is in our localnets list if($debug2) { print "Lokaler Traffic: Von: ".num2ip($fsrc)." Nach: ".num2ip($fdst)."\n"; } } } if(!$inLocal) { # do the query if source ip is not in our localnets list my $sql3="UPDATE traffic_$now_month SET bytesRcvd=bytesRcvd+$focts WHERE ip='".num2ip($fdst)."' AND date='$now_time';"; $dbh->do($sql3); if($debug) { print $sql3."\n"; } } } else { my $sql3="UPDATE traffic_$now_month SET bytesRcvd=bytesRcvd+$focts WHERE ip='".num2ip($fdst)."' AND date='$now_time';"; $dbh->do($sql3); if($debug) { print $sql3."\n"; } } } } $numFlow++; } $aFlow=shift(@recvdFlow); } } # while $dbh->disconnect(); ######################### sub timestr { my $t=shift(@_); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($t); $mon++; # localtime() returns 0=Jan, 1=Feb, etc $year+=1900; # $year is the number of years since 1900, # that is, $year is 123 in year 2023. return(sprintf("%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d",$year,$mon,$mday,$hour,$min,$sec)); } ######################### sub num2ip { my $a = shift(@_); return(sprintf("%d.%d.%d.%d", ($a&0xff000000)>>24, ($a&0x00ff0000)>>16, ($a&0x0000ff00)>>8, ($a&0x000000ff))); } ######################### sub initializetable { my $mode = shift(@_); if($mode==1) { # create monthly table. mysql will check for us that the table doesn't exist yet. ugly. my $query = "CREATE TABLE IF NOT EXISTS traffic_$now_month ( ip varchar(15) NOT NULL default '', bytesSent bigint(20) NOT NULL default '0', bytesRcvd bigint(20) NOT NULL default '0', date int(8) NOT NULL default '0', PRIMARY KEY date (date,ip) ) TYPE=MyISAM;"; # primary key date is an index over the date and ip fields which should make the update queries for each incoming flow much faster # because it massively speeds up searching for the dataset specified in the WHERE clause $dbh->do($query) or die "Failed to create monthly traffic table."; } elsif($mode==2) { # create daily entries in monthly table my $query2="SELECT count(DISTINCT ip) AS c FROM traffic_$now_month WHERE date='$now_time'"; my $countHosts = $dbh->selectrow_array($query2); if($numHosts!=$countHosts) { # only do if the hosts for $now_time don't exist yet. the script might come here when started for the second time on one day foreach(@nets) { # go through our network list and create an empty data set for each host my $temp=$_; for(my $i=$temp; $i<$temp+256; $i++) { my $query3="INSERT IGNORE INTO traffic_$now_month VALUES('".num2ip($i)."',0,0,$now_time);"; $dbh->do($query3); } } } } } ntop-5.0.1+dfsg1/NEWS0000644000000000000000000000267610157344237012713 0ustar rootroot _ _ _ | \ | | |_ ___ _ __ | \| | __/ _ \| '_ \ | |\ | || (_) | |_) | |_| \_|\__\___/| .__/ |_| Network Top -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- NEWS - Chronology of versions (and major snapshots) ==== Version 1.3 adapted to the GNU auto{make,conf} stuff Version 2.0 released 27Dec2001 Version 2.0.1 (source snapshot) 14Feb2002 Version (no change) 01Mar2002 - included a fix for a security exposure in ntop, first reported to the mailing list on 28Feb2002 and to bugtraq on 04Mar2002. The other messages posted to bugtraq on 11Apr2002 and 17Apr2002 refer to the same problem. Version 2.0.99 (source snapshot) 03Apr2002 (the ntop version number was rolled in the cvs on 02Apr2002 in preparation for the 2.1 release) Version 2.0.99RC1 - 15May2002 Version 2.0.99RC2 - 03Jun2002 Version 2.0.99RC2A -20Jun2002 Version 2.0.99RC3 - 03Jul2002 Version 2.1 -- 10Jul2002 Version 2.1.3 -- 13Sep2002 Version 2.2 -- 30March2003 2.2a/2.2b (Windows only) Version 2.2c -- July2003 Version 3.0 -- Feb2004 Version 3.1 -- Dec2004 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ntop-5.0.1+dfsg1/configure.in0000644000000000000000000021261212012127076014506 0ustar rootrootdnl> TODOs dnl> should use STDC_HEADERS instead of __STDC__ dnl> Cleanup Autoconf2 (obsolete Autoconf1 macros still in use) dnl> Solaris 8 -- libgcc_s -- need test dnl> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- dnl> dnl> Copyright (c) 1998 - 2012 Luca Deri dnl> Rocco Carbone dnl> and Burton M. Strauss III dnl> dnl> Written Oct2002 by Burton M. Strauss III dnl> (Loosely based on the earlier ntop version) dnl> dnl> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- dnl> dnl> This program is free software; you can redistribute it and/or modify dnl> it under the terms of the GNU General Public License as published by dnl> the Free Software Foundation; either version 2 of the License, or dnl> (at your option) any later version. dnl> dnl> This program is distributed in the hope that it will be useful, dnl> but WITHOUT ANY WARRANTY; without even the implied warranty of dnl> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl> GNU General Public License for more details. dnl> dnl> You should have received a copy of the GNU General Public License dnl> along with this program; if not, write to the Free Software dnl> Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl> dnl> dnl> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- dnl> this file is processed via 'autoconf' to produce the 'configure' script dnl> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- dnl> dnl> dnl> Initialization lines. dnl> Note that the AC_INIT must, simply MUST be the first line. dnl> Anything before it is ignored in autoconf 2.5x (and beyond?) dnl> dnl> Edit the version # in the AC_INIT line to roll the version. dnl> Edit NTOP_VERSION_EXTRA to put something extra (e.g. SourceForge rpm version" dnl> into the stamp. dnl> AC_INIT([ntop],[5.0.1]) dnl> The prereq is really 2.53, i.e. automake 1.6, but Darwin uses 2.52... AC_PREREQ([2.52]) SCRIPTVER="v5.0.1-13-08-2012" dnl> dnl> generate the config header dnl> umask 002 AM_CONFIG_HEADER(config.h) HAS_ERROR= HAS_WARNING= NTOP_VERSION_EXTRA="" echo echo "Welcome to $PACKAGE_NAME, Version $PACKAGE_VERSION $NTOP_VERSION_EXTRA" echo "Copyright (C) 1998-2012 Luca Deri " THE_UID=`id -u` if test $THE_UID -eq 0; then echo "################## WARNING ##################" echo echo "Running configure and compiling as root might lead" echo "to compilation issues." echo echo "Please run configure as normal user, not as superuser" echo echo "#############################################" fi echo echo "Configuration script version $SCRIPTVER" echo echo "************************************************************************" echo "* *" echo "* NOTICE: I know you're used to ignoring output from ./configure *" echo "* *" echo "* ntop has a lot of complexity and interdependences. *" echo "* *" echo "* Please, please AT LEAST read the stuff in these boxes! *" echo "* *" echo "*>>> The ACTION taken by ./configure is shown prefixed with '>>>' *" echo "* *" echo "* If that ACTION is unacceptable, *" echo "*??? Steps to take to fix the problem are shown, prefixed with '???' *" echo "* *" echo "************************************************************************" echo if test ".${NTOPCONFIGDEBUG}" = "."; then echo "NOTE:" echo echo " To enable additional, debugging messages during the ./configure" echo " execution, do this before running ./configure:" echo echo "$ export NTOPCONFIGDEBUG=yes" echo fi CONFIGURE_PARAMETERS=$* echo echo "Configuring ${PACKAGE_NAME} according to your request(s):" echo " ./configure ${CONFIGURE_PARAMETERS}" echo dnl> This has to be here due to some odd dependency... AC_CANONICAL_TARGET dnl> Basic sanity check ... does ntop.c exist? AC_CONFIG_SRCDIR([ntop.c]) dnl> force configure to use current directory AC_CONFIG_AUX_DIR(.) AM_INIT_AUTOMAKE() dnl> NTOPCONFIGDEBUG_SETTINGS([init automake]) dnl> make NTOPDIR the default for the installation AC_PREFIX_DEFAULT(${NTOPDIR:-/usr/local}) # Set constants and defaults SO_VERSION_PATCH= MAKE_SHARED_LIBRARY_PARM="-shared -flat_namespace" AS= CCLD= DEFS="-DHAVE_CONFIG_H" DLLTOOL= DYN_FLAGS= EXEEXT= INCS= LIBS= OBJDUMP= OBJEXT=o dnl> NTOPCONFIGDEBUG_SETTINGS([ntop defaults]) # Checks for programs. AC_PROG_CPP AC_PROG_CC dnl> AC_PROG_CXX no c++ code (yet?) AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AM_ENABLE_SHARED AM_PROG_LIBTOOL dnl> NTOPCONFIGDEBUG_SETTINGS([After ac stuff]) dnl> The blocks of code check to see if the various gnu auto* tools are installed dnl> have been replaced by manditory autogen.sh usage. dnl> autoheader stuff...just ignore AH_TEMPLATE([HAVE_INT16_T], [Define for int16 typedef]) AH_TEMPLATE([HAVE_INT32_T], [Define for int32 typedef]) AH_TEMPLATE([HAVE_INT64_T], [Define for int64 typedef]) AH_TEMPLATE([HAVE_INT8_T], [Define for int8 typedef]) AH_TEMPLATE([HAVE_UINT16_T], [Define for unsigned int 16 typedef]) AH_TEMPLATE([HAVE_UINT32_T], [Define for unsigned int 32 typedef]) AH_TEMPLATE([HAVE_UINT64_T], [Define for unsigned int 64 typedef]) AH_TEMPLATE([HAVE_UINT8_T], [Define for unsigned int 8 typedef]) AH_TEMPLATE([HAVE_U_INT16_T], [Define for unsigned int 16 typedef]) AH_TEMPLATE([HAVE_U_INT32_T], [Define for unsigned int 32 typedef]) AH_TEMPLATE([HAVE_U_INT64_T], [Define for unsigned int 64 typedef]) AH_TEMPLATE([HAVE_U_INT8_T], [Define for unsigned int 8 typedef]) dnl> end autoheader stuff AC_ARG_ENABLE(void, [ +--ntop-specific:------------------------------------------------------------+]) AC_ARG_WITH(void, [ +--external-packages:--------------------------------------------------------+]) AC_ARG_WITH(ssl, [ --without-ssl disable HTPPS support [[default=enabled]]], if test "x$withval" = xno; then ac_disable_openssl="yes" else ac_disable_openssl="no" fi, ac_disable_openssl="no") AC_ARG_ENABLE(plugins, [ --disable-plugins disable compilation of plugins [[default=enabled]]], if test "x$enableval" = xno; then ac_disable_plugins="yes" else ac_disable_plugins="no" fi, ac_disable_plugins="no") AC_ARG_ENABLE(ignoresigpipe, [ --enable-ignoresigpipe Ignore SIGPIPE errors [[default=do not ignore]]], ac_enable_ignoresigpipe="$enableval", ac_enable_ignoresigpipe="no") AC_ARG_ENABLE(snmp, [ --disable-snmp Disable SNMP support [[default=disable]]], if test "x$enableval" = xno; then ac_disable_snmp="yes" else ac_disable_snmp="no" fi, ac_disable_snmp="yes") AC_ARG_ENABLE(jumbo-frames, [ --enable-jumbo-frames Enable Jumbo (9K) Ethernet frames [[default=disabled]]], ac_enable_jumbo_frames="$enableval", ac_enable_jumbo_frames="no") dnl> dnl> Define the "WITH"s for package root directories ... deal with these later... dnl> AC_ARG_WITH(void, [ +-External-source-locations:-------------------------------------------------+]) AC_ARG_WITH( rrd-home, [ --with-rrd-home=DIR Usually /usr/local/rrdtool-1.2.x], RRD_HOME="$withval", RRD_HOME=/usr/local/rrdtool-1.2.19) AC_ARG_WITH( pcap-root, [ --with-pcap-root=DIR LBNL pcap located in DIR], PCAP_ROOT="$withval", PCAP_ROOT=) AC_ARG_WITH( gdbm-root, [ --with-gdbm-root=DIR gdbm located in DIR], GDBM_DIRECTORY="$withval", GDBM_DIRECTORY=) AC_ARG_WITH( gdbm-lib, [ --with-gdbm-lib=DIR or libgdbm located in DIR], GDBM_LIB="$withval", GDBM_LIB=) AC_ARG_WITH( gdbm-include, [ --with-gdbm-include=DIR or gdbm.h located in DIR], GDBM_INCLUDE="$withval", GDBM_INCLUDE=) AC_ARG_WITH( zlib-root, [ --with-zlib-root=DIR zlib located in DIR], ZLIB_DIRECTORY="$withval", ZLIB_DIRECTORY=) AC_ARG_WITH( zlib-lib, [ --with-zlib-lib=DIR or libz located in DIR], ZLIB_LIB="$withval", ZLIB_LIB=) AC_ARG_WITH( zlib-include, [ --with-zlib-include=DIR or zlib.h located in DIR], ZLIB_INCLUDE="$withval", ZLIB_INCLUDE=) AC_ARG_WITH( ossl-root, [ --with-ossl-root=DIR openSSL located in DIR], OSSL_DIRECTORY="$withval", OSSL_DIRECTORY=) AC_ARG_WITH( ossl-lib, [ --with-ossl-lib=DIR or libssl located in DIR], OSSL_LIB="$withval", OSSL_LIB=) AC_ARG_WITH( ossl-include, [ --with-ossl-include=DIR or ssl.h located in DIR], OSSL_INCLUDE="$withval", OSSL_INCLUDE=) AC_ARG_WITH( memorydebug, [ --with-memorydebug=VALUE Set numeric code for memory debug option], MEMORYDEBUG="$withval", MEMORYDEBUG=) AC_ARG_ENABLE(void, [ +----------------------------------------------------------------------------+]) AC_ARG_WITH(void, [ +----------------------------------------------------------------------------+]) AC_CHECK_FILE(aclocal.m4, , [ echo "" echo "Invoking aclocal to create aclocal.m4..." $ACLOCAL echo "" ]) AC_CHECK_FILE(depcomp, , [ echo "" echo "depcomp missing... will install it in this ntop directory." echo " Invoking automake to copy depcomp..." $AUTOMAKE --gnu --copy --add-missing echo "" ]) dnl> Networking libraries AC_SEARCH_LIBS([gethostbyname], [nsl resolv]) AC_SEARCH_LIBS([socket], [xnet socket]) dnl> Handle the root -> lib/include settings NTOP_SET_LIBINC(PCAP) NTOP_SET_LIBINC(GDBM) NTOP_SET_LIBINC(ZLIB) dnl> From here on out, we only use the _INCLUDE and _LIB except for locale and glibconfig dnl> NTOPCONFIGDEBUG_SETTINGS([After set libinc]) dnl> dnl> Yes, we want to minimize the amount of work before we tell dnl> the user we can't compile for this host, but this has to dnl> to preceed the OS stuff so $CC is set. dnl> echo echo "Checking C compiler program and features..." echo AM_PROG_CC_STDC if test ".${ac_cv_prog_cc_stdc}" = ".no"; then echo echo "*******************************************************************" echo "*" echo "* WARNING: Attempting to configure for non ANSI standard C." echo "*" echo "*>>> This is unsupported." echo "*>>> It will probably fail." echo "*" echo "* You are welcome to try - but please, keep the ntop-dev" echo "* mailing list updated with your successes or failures..." echo "*" echo "*******************************************************************" echo HAS_WARNING="yes" fi dnl> NTOPCONFIGDEBUG_SETTINGS([After cc stdc test]) dnl> Any common settings required to support a specific OS, distribution or release dnl> go here also. dnl> Add include file locations to CPPFLAGS (for the preprocessor) dnl> and add libraries (location) -L and (names) -l to LDFLAGS. dnl> Skipping cases is, I guess, ok, but always remember that you might have dnl> been grabbed by an earlier target. DISTRO="" RELEASE="" echo "" echo "*******************************************************************" echo "*" echo "* Checking for unique options for ${target}, ${CC}..." echo "*" case "${target}:${CC}" in *-*-linux*:* ) DEFINEOS="LINUX" DISTRO=`utils/linuxrelease --distro` RELEASE=`utils/linuxrelease --release` echo "* This appears to be ${DEFINEOS} ${DISTRO} ${RELEASE}" ;; *-*-solaris*:* ) DEFINEOS="SOLARIS" RELEASE=`uname -r | cut -c 3-` echo "* This appears to be ${DEFINEOS}" echo "*" echo "* 1) Compilation requires various gnu tools from SunFreeware.com or other sources." ;; *-*-darwin*:* ) DEFINEOS="DARWIN" MAKE_SHARED_LIBRARY_PARM="-bundle -flat_namespace -undefined suppress" echo "* This appears to be ${DEFINEOS} (MacOSX)" ;; *-*-freebsd*:* ) DEFINEOS="FREEBSD" RELEASE=`utils/linuxrelease --release | sed -e 's/\.//' -e 's/-.*$//g'` echo "* This appears to be ${DEFINEOS} ${RELEASE}" ;; *-*-mingw32*:gcc* ) DEFINEOS="MINGW" echo "* This appears to be ${DEFINEOS} (release not checked)" ;; * ) echo "* ${target} is an unknown/unsupported OS" echo "*" echo "*******************************************************************" if test "x${ac_willfailoverride}" = "xyes"; then echo "*" echo "* Fasten your seat belt and good luck! If you are injured, the" echo "* development team will disavow any knowledge of your intentions." echo "*" echo "* Please keep the ntop-dev mailing list updated with any" echo "* successes you have or problems you encounter..." echo "*" else exit 1 fi ;; esac if test ".${MEMORYDEBUG}" = "."; then CPPFLAGS="${CPPFLAGS} -D${DEFINEOS}" else CPPFLAGS="${CPPFLAGS} -D${DEFINEOS} -DMEMORY_DEBUG=${MEMORYDEBUG}" fi if test -d ./configureextra; then dnl> If there is a os/distro/release specific file (additional settings), dnl> run it. Go from least specific to most specific, running ANY that match. dnl> E.g. 'solaris 8' will match solaris 1st then solaris8. echo "*" echo "* Testing for extra configuration options for ${DEFINEOS} ${DISTRO} ${RELEASE}" if test -f ./configureextra/${DEFINEOS}; then echo "*" echo "* Executing configureextra/${DEFINEOS}" . ./configureextra/${DEFINEOS} CONFIGURE_PARAMETERS="${CONFIGURE_PARAMETERS} + configureextra/${DEFINEOS}" fi if test ".${DISTRO}" != "."; then if test -f ./configureextra/${DEFINEOS}${DISTRO}; then echo "*" echo "* Executing configureextra/${DEFINEOS}${DISTRO}" . ./configureextra/${DEFINEOS}${DISTRO} CONFIGURE_PARAMETERS="${CONFIGURE_PARAMETERS} + configureextra/${DEFINEOS}${DISTRO}" fi if test ".${RELEASE}" != "." && test -f ./configureextra/${DEFINEOS}${DISTRO}${RELEASE}; then echo "*" echo "* Executing configureextra/${DEFINEOS}${DISTRO}${RELEASE}" . ./configureextra/${DEFINEOS}${DISTRO}${RELEASE} CONFIGURE_PARAMETERS="${CONFIGURE_PARAMETERS} + configureextra/${DEFINEOS}${DISTRO}${RELEASE}" fi else if test ".${RELEASE}" != "." && test -f ./configureextra/${DEFINEOS}${RELEASE}; then echo "*" echo "* Executing configureextra/${DEFINEOS}${RELEASE}" . ./configureextra/${DEFINEOS}${RELEASE} CONFIGURE_PARAMETERS="${CONFIGURE_PARAMETERS} + configureextra/${DEFINEOS}${RELEASE}" fi fi fi echo "*" echo "*******************************************************************" dnl> dnl> Last chance default (if there is an os-specific value, set it above) dnl> if test ".${LOCALEDIR}" = "."; then LOCALEDIR="/usr/lib/locale" fi dnl> Add /usr/local/ /opt/local CFLAGS="${CFLAGS} -I/usr/local/include -I/opt/local/include" CPPFLAGS="${CPPFLAGS} -I/usr/local/include -I/opt/local/include" LDFLAGS="${LDFLAGS} -L/usr/local/lib -L/opt/local/lib" PWD=`pwd` echo echo "Test the compiler and setup CFLAGS..." echo case "$CFLAGS" in *-g* ) ;; * ) CFLAGS="$CFLAGS -g" AC_MSG_CHECKING([if compiler accepts -g (debugging information)]) oCFLAGS=$CFLAGS CFLAGS="-g $CFLAGS" AC_TRY_COMPILE( , return 0 , AC_MSG_RESULT(yes), CFLAGS="${oCFLAGS}" AC_MSG_RESULT(no) ) ;; esac AC_MSG_CHECKING([if compiler accepts -W (warning flags)]) oCFLAGS=$CFLAGS CFLAGS="$CFLAGS -Wshadow -Wpointer-arith -Wmissing-prototypes -Wmissing-declarations -Wnested-externs" AC_TRY_COMPILE( , return 0 , AC_MSG_RESULT(yes), CFLAGS="${oCFLAGS}" AC_MSG_RESULT(no) ) dnl> add pic flag in any case this makes sure all our code is relocatable case "${target}:${CC}" in *-*-darwin*:* ) if test -f /usr/bin/glibtool; then CFLAGS="$CFLAGS "`grep pic_flag= /usr/bin/glibtool | head -n1 | sed -e 's/.*pic_flag=//' -e 's/"//g'` else CFLAGS="$CFLAGS "`grep pic_flag= /usr/bin/libtool | head -n1 | sed -e 's/.*pic_flag=//' -e 's/"//g'` fi ;; * ) CFLAGS="$CFLAGS "`grep pic_flag= libtool | head -n1 | sed -e 's/.*pic_flag=//' -e 's/"//g'` ;; esac dnl> Presets for the make flags go here... CFLAGS="${CFLAGS}" CPPFLAGS="${CPPFLAGS}" LDFLAGS="${LDFLAGS}" dnl> NTOPCONFIGDEBUG_SETTINGS([After presets]) echo echo "Critical library/include tests..." echo dnl> dnl> Without these, don't even BOTHER testing the parameters... dnl> dnl> We also process the ROOT/DIRECTORY entries first so we have reasonable dnl> CPPFLAGS, LDFLAGS and LIBS values for the AC_CHECK_LIBS and AC_CHECK_HEADERS macros. dnl> dnl> dnl> user defined directory passed as option at configuration time dnl> if test ".${PCAPRING_DIR}" != .; then if test ".${PCAP_ROOT}" != .; then echo echo "*******************************************************************" echo "*" echo "* WARNING: libpcap checking in ${PCAP_ROOT} skipped" echo "* we have taken libpcap from ${PCAPRING_DIR}" echo "*" echo "*" echo "*******************************************************************" echo fi else TMP_ROOT=${HOME}/PF_RING/userland/libpcap/ if test ".${PCAP_ROOT}" == . && test -d ${TMP_ROOT} && test -r ${TMP_ROOT}/libpcap.a; then PCAP_ROOT=${TMP_ROOT} CORELIBS="${CORELIBS} -L${TMP_ROOT} -L${HOME}/PF_RING/userland/lib -lpfring -lpcap " INCS="${INCS} -I ${PCAP_ROOT}" AC_MSG_RESULT([found in $PCAP_ROOT]) elif test ".${PCAP_ROOT}" != .; then if test -d $PCAP_ROOT && test -r $PCAP_ROOT/lib/libpcap.a && test -r $PCAP_ROOT/include/pcap.h; then PCAP_ROOT=`cd ${PCAP_ROOT} && pwd` CORELIBS="${CORELIBS} -L ${PCAP_ROOT}/lib -lpcap" INCS="${INCS} -I ${PCAP_ROOT}/include" AC_MSG_RESULT([found in $PCAP_ROOT]) else AC_MSG_RESULT([not found in ${PCAP_ROOT}]) AC_MSG_RESULT([ *** FATAL ERROR *** ]) AC_MSG_RESULT([ It looks that you don't have some files needed to use the pcap library.]) AC_MSG_RESULT([ Please check the source tree, compile and, optionally, install the software.]) AC_MSG_RESULT([ When finished please re-run this program.]) AC_MSG_RESULT([ You can download the latest source tarball at http://www.tcpdump.org]) AC_MSG_ERROR([ The LBL Packet Capture Library development tree seems corrupted or incomplete!]) fi elif test -d /usr/local && test -r /usr/local/lib/libpcap.a && test -r /usr/local/include/pcap.h; then PCAP_ROOT="/usr/local" CORELIBS="${CORELIBS} -L$PCAP_ROOT/lib -lpcap" INCS="${INCS} -I$PCAP_ROOT/include" AC_MSG_RESULT([found in $PCAP_ROOT]) dnl> dnl> installation used by most packagers dnl> elif test -r /usr/lib/libpcap.a && test -r /usr/include/pcap.h; then PCAP_ROOT="standard installation" CORELIBS="${CORELIBS} -lpcap" AC_MSG_RESULT([found in $PCAP_ROOT]) dnl> dnl> installation used by most packagers 64-bit dnl> elif test -r /usr/lib64/libpcap.a && test -r /usr/include/pcap.h; then PCAP_ROOT="standard installation" CORELIBS="${CORELIBS} -lpcap" AC_MSG_RESULT([found in $PCAP_ROOT]) dnl> dnl> installation used by OSX dnl> elif test -r /usr/lib/libpcap.A.dylib && test -r /usr/include/pcap.h; then PCAP_ROOT="standard OSX installation" CORELIBS="${CORELIBS} -lpcap" AC_MSG_RESULT([found in $PCAP_ROOT]) dnl> dnl> unusual and more complex installation used by some packagers dnl> (e.g. Red Hat Linux) dnl> elif test -r /usr/lib/libpcap.a && test -r /usr/include/pcap/pcap.h; then PCAP_ROOT="semi-standard installation" CORELIBS="${CORELIBS} -lpcap" INCS="${INCS} -I/usr/include/pcap" AC_MSG_RESULT([found in $PCAP_ROOT]) else AC_CHECK_LIB(pcap, pcap_lookupdev, , [ AC_MSG_RESULT([ *** FATAL ERROR *** ]) AC_MSG_RESULT([ It looks that you don't have the libpcap distribution installed.]) AC_MSG_RESULT([ Download, compile and, optionally, install it.]) AC_MSG_RESULT([ When finished please re-run this program.]) AC_MSG_RESULT([ You can download the latest source tarball at http://www.tcpdump.org/]) AC_MSG_ERROR([ The LBL Packet Capture Library, libpcap, was not found! ]) ]) fi fi AC_CHECK_LIB([pcap], [pcap_next_ex], AC_DEFINE_UNQUOTED(HAVE_PCAP_NEXT_EX, 1, [pcap has pcap_next_ex])) AC_CHECK_LIB([pcap], [pcap_lib_version], AC_DEFINE_UNQUOTED(HAVE_PCAP_LIB_VERSION, 1, [pcap has pcap_lib_version])) AC_MSG_CHECKING([for gdbm]) AC_MSG_RESULT([]) if (test ".${GDBM_LIB}" != "." && test ! -d ${GDBM_LIB}) || (test ".${GDBM_INCLUDE}" != "." && test ! -d ${GDBM_INCLUDE}); then echo echo "*******************************************************************" echo "*" echo "* ERROR: You specified or implied a non-existent directory for" echo "* libgdbm:" echo "* --with-gdbm-lib=${GDBM_LIB}" echo "* --with-gdbm-include=${GDBM_INCLUDE}" echo "*" echo "*>>> Continuing without libgdbm is impossible." echo "*" echo "*??? 1. Correct the --with-gdbm-xxxxx option and rerun" echo "*??? ./configure" echo "*" echo "*******************************************************************" echo exit 1 else NTOP_APPENDS([${GDBM_INCLUDE}], [${GDBM_LIB}], [gdbm]) fi AC_CHECK_HEADERS([gdbm.h]) AC_CHECK_LIB([gdbm], [gdbm_open]) if test ".${ac_cv_header_gdbm_h}" != ".yes" || test ".${ac_cv_lib_gdbm_gdbm_open}" != ".yes"; then echo echo "*******************************************************************" echo "*" echo "* ERROR: gdbm header or library routines are missing" echo "* (yes means it was found, no means it was not found)" echo "*" echo "* gdbm.h...${ac_cv_header_gdbm_h}" echo "* gdbm_open() in -lgdbm...${ac_cv_lib_gdbm_gdbm_open}" echo "*" echo "*>>> No way to proceed." echo "*" echo "*??? 1. Install libgdbm" echo "*??? and Rerun ./configure" echo "*??? or 2. Use the --with-gdbm-xxxxx= options" echo "*" echo "*******************************************************************" echo AC_MSG_ERROR(Unable to continue... aborting ./configure) fi dnl> nDPI based on OpenDPI (https://code.google.com/p/opendpi/) NDPI_LIB=./nDPI/src/lib/.libs/libndpi.a NDPI_INC=./nDPI/src/include/ dnl> Define the arguments we accept... dnl> dnl> In this version of the configure file, we use AC_ARG_WITH for whole external dnl> programs and AC_ARG_ENABLE for features of ntop itself. Since they're the dnl> same as to processing, we don't separate them here. dnl> dnl> And it keeps them together in the ./configure --help output dnl> dnl> Remember, there shouldn't be any processing in these... that's below when dnl> we test for libraries. It's ok to set values via AC_DEFINE_UNQUOTED(). dnl> So, we... dnl> Test the enable, disable and with's for unreasonable combinations. echo echo "Plugins?" PLUGINS= if test ".${ac_disable_plugins}" = ".yes"; then echo " ...Disabled via ./configure command line option --disable-plugins" else PLUGINS=plugins echo " ...(Default) Requested. Disable via ./configure command line option --disable-plugins." fi echo echo "Jumbo (9k) Ethernet Frames?" if test ".$ac_enable_jumbo_frames" = ".yes"; then echo " ...Requested via ./configure command line option --enable-jumbo-frames." AC_DEFINE_UNQUOTED(MAKE_WITH_JUMBO_FRAMES, 1, [Define for Jumbo (9k) Ethernet Frames]) else echo " ...(Default) Disabled. Request via ./configure command line option --enable-jumbo-frames." fi echo echo "Processing the rest of the ROOT/DIRECTORY entries" echo dnl> So we have even more reasonable CPPFLAGS, LDFLAGS and LIBS values for dnl> the AC_CHECK_LIB and AC_CHECK_HEADER macros. dnl> Openssl if test ".${ac_disable_openssl}" != ".yes"; then if (test ".${OSSL_LIB}" != "." && test ! -d ${OSSL_LIB}) || (test ".${OSSL_INCLUDE}" != "." && test ! -d ${OSSL_INCLUDE}); then echo echo "*******************************************************************" echo "*" echo "* ERROR: You specified or implied a non-existent directory for" echo "* the openSSL library:" if test ".${OSSL_LIB}" != "."; then echo "* --with-ossl-lib=${OSSL_LIB}" fi if test ".${OSSL_INCLUDE}" != "."; then echo "* --with-ossl-include=${OSSL_INCLUDE}" fi echo "*" echo "*>>> Continuing without the --with-ossl-xxxxx values" echo "*" echo "* ./configure should complete 'successfully'" echo "*" echo "* ntop may find openSSL installed in a standard location." echo "*" echo "* If not found, ntop will disable code dependent upon" echo "* openSSL meaning no https:// support." echo "*" echo "* Read the remaining messages carefully!" echo "*" echo "*??? 1. Correct the --with-ossl-xxxxx option and rerun" echo "*??? ./configure" echo "*??? or 2. Install the openSSL package and rerun ./configure" echo "*" echo "*******************************************************************" echo OSSL_LIB= OSSL_INCLUDE= HAS_WARNING="yes" else NTOP_APPENDS([${OSSL_INCLUDE}], [${OSSL_LIB}], [gdbm]) fi fi if (test ".${ZLIB_LIB}" != "." && test ! -d ${ZLIB_LIB}) || (test ".${ZLIB_INCLUDE}" != "." && test ! -d ${ZLIB_INCLUDE}); then echo echo "*******************************************************************" echo "*" echo "* ERROR: You specified or implied a non-existent directory for" echo "* zlib:" if test ".${ZLIB_LIB}" != "."; then echo "* --with-zlib-lib=${ZLIB_LIB}" fi if test ".${ZLIB_INCLUDE}" != "."; then echo "* --with-zlib-include=${ZLIB_INCLUDE}" fi echo "*" echo "*>>> Continuing without the --with-zlib-xxxxx values" echo "*" echo "* ./configure should complete 'successfully'" echo "*" echo "* ntop may find zlib installed in a standard location." echo "*" echo "* If not found, ntop will disable code dependent upon zlib" echo "* meaning no compressed web pages or input files." echo "*" echo "* Read the remaining messages carefully!" echo "*" echo "*??? 1. Correct the --with-zlib-xxxxx option and rerun" echo "*??? ./configure" echo "*??? or 2. Install the zlib package and rerun ./configure" echo "*" echo "*******************************************************************" echo ZLIB_LIB= ZLIB_INCLUDE= HAS_WARNING="yes" else NTOP_APPENDS([${ZLIB_INCLUDE}], [${ZLIB_LIB}], [z]) fi if test ".${LOCALEDIR}" != "." && test ! -d ${LOCALEDIR}; then echo echo "*******************************************************************" echo "*" echo "* WARNING: You specified a non-existent directory for locale files" echo "* --with-localedir=${LOCALEDIR}" echo "*" echo "*>>> Since we just pass this through to the run-time, we're only" echo "*>>> going to warn you here, but ntop might or might not function" echo "*>>> as expected." echo "*" echo "*??? 1. Correct the --with-localedir option and rerun" echo "*??? ./configure" echo "*" echo "*******************************************************************" echo HAS_WARNING="yes" fi dnl> Specific compiler feature tests AC_C_CONST AC_C_VOLATILE AC_C_INLINE AC_C_CHAR_UNSIGNED AC_C_LONG_DOUBLE AC_C_BIGENDIAN([AC_DEFINE_UNQUOTED(CFG_BIG_ENDIAN, 1, [ntop built for big endian machine])], [AC_DEFINE_UNQUOTED(CFG_LITTLE_ENDIAN, 1, [ntop built for little endian machine])], [AC_DEFINE_UNQUOTED(CFG_UNKNOWN_ENDIAN, 1, [ntop built for unknown machine])]) dnl> NTOPCONFIGDEBUG_SETTINGS([After libraries]) echo echo "Testing headers and functions..." echo AC_HEADER_STDC AC_HEADER_DIRENT AC_HEADER_SYS_WAIT AC_HEADER_TIME # Standard c stuff - must have AC_CHECK_HEADERS([float.h stddef.h stdlib.h string.h pcre.h]) AC_CHECK_HEADERS([errno.h fcntl.h limits.h math.h signal.h stdarg.h unistd.h]) AC_CHECK_HEADERS([stdio.h strings.h]) AC_CHECK_HEADERS([sys/ioctl.h sys/socket.h sys/time.h sys/types.h]) # Optional - have workaround... AC_CHECK_HEADERS([setjmp.h ieeefp.h]) AC_CHECK_HEADERS([shadow.h]) AC_CHECK_HEADERS([sys/utsname.h]) # Network AC_CHECK_HEADERS([netinet/in.h]) AC_CHECK_HEADERS([arpa/inet.h arpa/nameser.h]) AC_CHECK_HEADERS([net/ethernet.h]) AC_CHECK_LIB([z], [zlibVersion], [], [ echo "Error! You need to have zlib." exit -1 ]) # RRD if test -d "$RRD_HOME"; then AC_MSG_RESULT(checking for RRD home... yes) else RRD_HOME=/usr/local/rrdtool if test -d "$RRD_HOME"; then AC_MSG_RESULT(Checking rrdtool in $RRD_HOME) else RRD_HOME=/usr/local fi fi RRD_LIB="-L${RRD_HOME}/lib -lrrd_th" if test -f "$RRD_HOME/lib/librrd_th.so"; then AC_MSG_RESULT(checking for rrdtool... yes) else if test -f "$RRD_HOME/lib/librrd_th.dylib"; then # OSX AC_MSG_RESULT(checking for rrdtool... yes) else if test -f "$RRD_HOME/lib/librrd_th.a"; then AC_MSG_RESULT(checking for rrdtool... yes) else AC_CHECK_LIB([rrd_th], [main]) if test ".${ac_cv_lib_rrd_th_main}" != ".yes"; then AC_MSG_ERROR(Unable to find RRD at $RRD_HOME: please use --with-rrd-home=DIR); AC_MSG_ERROR(RRD source can be downloaded from http://www.rrdtool.org/); else RRD_LIB= fi fi fi fi RRD_INC= if test -d "${RRD_HOME}/include"; then RRD_INC="-I${RRD_HOME}/include" fi dnl> The failed recheck stuff below is courtesy of Chris Turbeville [turbo@verio.net] dnl> Chris developed this for Solaris 9, confirming work I had done earlier for FreeBSD dnl> And thank to Julien TOUCHE [julien.touche@lycos.com] for the OpenBSD dependencies AC_CHECK_HEADERS([net/if.h], [], [], [ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif]) AC_CHECK_HEADER([net/if_dl.h],[ AC_DEFINE_UNQUOTED(HAVE_IFLIST_SYSCTL, 1, [use sysctl support for fetch interface informations]) ]) AC_CHECK_HEADERS([netinet/if_ether.h], [], [], [ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_NET_IF_H #include #endif]) AC_CHECK_HEADERS([netinet/in_systm.h]) AC_CHECK_HEADERS([netinet/ip.h], [], [], [ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_NETINET_IN_SYSTM_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif]) AC_CHECK_HEADERS([netinet/ip_icmp.h], [], [], [ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_NETINET_IN_SYSTM_H #include #endif #ifdef HAVE_NETINET_IP_H #include #endif]) AC_CHECK_HEADERS([netinet/tcp.h]) AC_CHECK_HEADERS([netinet/udp.h], [], [], [ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif]) AC_CHECK_HEADERS([sys/param.h]) AC_CHECK_HEADERS([net/if_dl.h]) AC_CHECK_HEADERS([sys/sysctl.h], [], [], [ #ifdef HAVE_SYS_PARAM_H #include #endif]) AC_CHECK_HEADERS([net/route.h], [], [], [ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif]) dnl> Note - if ethertype is missing, ntop.h has the critical #defines extracted... AC_CHECK_HEADERS([ethertype.h]) AC_CHECK_HEADERS([net/ppp_defs.h]) AC_CHECK_HEADERS([linux/if_pppox.h], [], [], [ #ifdef HAVE_NET_IF_H #include #endif #ifdef HAVE_NETINET_IF_ETHER_H #include #endif]) dnl> OpenSSL ... if not disabled... if test ".${ac_disable_openssl}" != ".yes"; then AC_CHECK_HEADERS([openssl/rsa.h openssl/crypto.h openssl/x509.h openssl/pem.h openssl/ssl.h openssl/err.h]) AC_CHECK_LIB([crypto], [SSLeay_version]) AC_CHECK_LIB([ssl], [SSL_accept]) fi dnl> Security related dnl> Note: on some systems, e.g. FreeBSD, crypt() is defined in unistd. AC_CHECK_HEADERS([crypt.h pwd.h security/pam_appl.h shadow.h]) ## Other AC_CHECK_HEADERS([dirent.h]) AC_CHECK_HEADERS([dlfcn.h dl.h]) AC_CHECK_HEADERS([getopt.h]) AC_CHECK_HEADERS([if.h]) AC_CHECK_HEADERS([inttypes.h]) AC_CHECK_HEADERS([memory.h]) AC_CHECK_HEADERS([sys/ldr.h]) AC_CHECK_HEADERS([sys/param.h]) AC_CHECK_HEADERS([sys/select.h]) AC_CHECK_HEADERS([sys/sockio.h]) AC_CHECK_HEADERS([sys/stat.h]) AC_CHECK_HEADERS([sys/un.h]) AC_CHECK_HEADERS([sys/wait.h]) AC_CHECK_HEADERS([zlib.h]) dnl> Multithreading... dnl> pthread.h is required, dnl> sched.h or sys/sched.h are optional, but improves performance AC_CHECK_HEADERS([sched.h sys/sched.h]) AC_CHECK_HEADERS([pthread.h]) AC_MSG_CHECKING([if r/w locks are supported]) AC_TRY_RUN([ #include int main() { pthread_rwlock_t t; return 0; } ] , [ AC_MSG_RESULT(yes) AC_DEFINE_UNQUOTED(HAVE_RW_LOCK, 1, [pthread has rw locks]) ], [AC_MSG_RESULT(no)] ) dnl> Optional, used for -L parameter AC_CHECK_HEADERS([sys/syslog.h syslog.h]) dnl> IPv6 AC_DEFINE_UNQUOTED(INET6, 1, [Enable/disable ipv6 support]) AC_CHECK_HEADERS([ip6.h icmp6.h]) AC_CHECK_HEADERS([netinet/ip6.h netinet/icmp6.h], [], [], [ #if HAVE_SYS_TYPES_H #include #endif #if HAVE_NETINET_IN_H #include #endif]) AC_CHECK_FUNCS([sysctl]) AC_CHECK_FUNCS(finite, , [AC_CHECK_FUNCS(isfinite, , [AC_MSG_CHECKING(for isfinite with ) AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[float f = 0.0; isfinite(f)]])],[AC_MSG_RESULT(yes) AC_DEFINE(HAVE_ISFINITE,1,we have the isinfinite function)],[AC_MSG_RESULT(no)])])]) AC_CHECK_FUNCS(isinf, , [AC_MSG_CHECKING(for isinf with ) AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[float f = 0.0; isinf(f)]])],[AC_MSG_RESULT(yes) AC_DEFINE(HAVE_ISINF,1,we have the isinf function)],[AC_MSG_RESULT(no)])]) AC_TYPE_PID_T dnl> Autoconf2: AC_CHECK_TYPE(pid_t, int) AC_TYPE_SIZE_T dnl> Autoconf2: AC_CHECK_TYPE(size_t, unsigned) AC_HEADER_TIME AC_STRUCT_TM AC_STRUCT_TIMEZONE AC_CHECK_TYPEDEF(u_int64_t, sys/types.h) AC_CHECK_TYPEDEF(uint64_t, sys/types.h) AC_CHECK_TYPEDEF(u_int32_t, sys/types.h) AC_CHECK_TYPEDEF(uint32_t, sys/types.h) AC_CHECK_TYPEDEF(u_int16_t, sys/types.h) AC_CHECK_TYPEDEF(uint16_t, sys/types.h) AC_CHECK_TYPEDEF(u_int8_t, sys/types.h) AC_CHECK_TYPEDEF(uint8_t, sys/types.h) AC_CHECK_TYPEDEF(int64_t, sys/types.h) AC_CHECK_TYPEDEF(int32_t, sys/types.h) AC_CHECK_TYPEDEF(int16_t, sys/types.h) AC_CHECK_TYPEDEF(int8_t, sys/types.h) dnl> If this fails, it could be a bad -l which is going to kill dnl> ALL the tests... so do the trivial compile test... case "${CC}" in *gcc* ) AC_MSG_CHECKING([trivial compile]) AC_LANG_CONFTEST( [AC_LANG_PROGRAM([[#include ]], [[int i=0;]])]) rm -f conftest.$ac_objext conftest$ac_exeext (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2> trivialcompilemessage ac_status=$? if test ".${ac_status}" = ".0"; then AC_MSG_RESULT(ok) else AC_MSG_WARN(error) echo echo "*******************************************************************" echo "*" echo "* ERROR: A trivial c compile has failed. Something is seriously wrong." echo "*" echo "* Check your --with-xxxxx-xxxxx parameters - if a library (-l)" echo "* is not found in the locations given (-L) it causes these global" echo "* compile problems. The library list, includes and flags used are:" echo "*" echo "* LIBS=${LIBS}" echo "* INCS=${INCS}" echo "* CPPFLAGS=${CPPFLAGS}" echo "* LDFLAGS=${LDFLAGS}" echo "*" echo "* The compile error message is:" echo "*" cat trivialcompilemessage echo "*" echo "*>>> No way to proceed." echo "*" echo "*??? 1. Correct the --with-xxxxx-xxxxx parameters" echo "*??? and Rerun ./configure" echo "*" echo "*******************************************************************" echo AC_MSG_ERROR(Unable to continue... aborting ./configure) fi ;; esac AC_CHECK_LIB([c], [backtrace]) AC_CHECK_LIB([c], [crypt], , [AC_CHECK_LIB([crypt], [crypt])]) AC_CHECK_LIB([c], [getopt_long]) dnl> Plugin load routine... dnl> Most systems... special cases in the platform specific... AC_CHECK_LIB([c], [dlopen], , [AC_CHECK_LIB([dl], [dlopen])]) dnl> Hokey test for GNU extension dladdr... dnl> From the above, we should have either -lc or -ldl already depending upon where we found dlopen... dnl> But, we need to specify __USE_GNU, JUST for this... AC_MSG_CHECKING([for dladdr (GNU extension)]) AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include #define __USE_GNU #include ]], [[dladdr(0,0)]])],[AC_MSG_RESULT(yes) AC_DEFINE_UNQUOTED(HAVE_DLADDR, 1, [dladdr is defined])],[AC_MSG_RESULT(no)]) dnl> Check for both sin and ceil - some implementations split them AC_CHECK_LIB([c], [sin], , [AC_CHECK_LIB([m], [sin])]) AC_CHECK_LIB([c], [ceil], , [AC_CHECK_LIB([m], [ceil])]) dnl> Multithreading libraries AC_CHECK_LIB(pthread, pthread_create, , [ AC_CHECK_LIB(pthreads, pthread_create, , [ AC_CHECK_LIB(c_r, pthread_create) ]) ]) AC_CHECK_LIB(posix4, sem_init) dnl> Functions and types AC_FUNC_FORK AC_PROG_GCC_TRADITIONAL dnl> do not use AC_FUNC_MALLOC ... because we have our own replacement... AC_FUNC_MEMCMP AC_FUNC_SETVBUF_REVERSED AC_TYPE_SIGNAL AC_FUNC_STAT AC_FUNC_STRFTIME dnl> AC_FUNC_VPRINTF AC_CHECK_FUNCS([alarm]) AC_CHECK_FUNCS([endpwent]) AC_CHECK_FUNCS([gethostbyaddr gethostbyname gethostname]) dnl> Note, we've already tested for gethostbyaddr_r to find it's library, above. dnl> This test is to get HAVE_GETHOSTBYADDR_R set... AC_CHECK_FUNCS([gethostbyaddr_r]) AC_CHECK_FUNCS([getpass]) AC_CHECK_FUNCS([gettimeofday]) AC_CHECK_FUNCS([localtime_r]) AC_CHECK_FUNCS([memchr memset]) AC_CHECK_FUNCS([putenv]) AC_CHECK_FUNCS([select socket]) AC_CHECK_FUNCS([snprintf]) AC_CHECK_FUNCS([sqrtf]) AC_CHECK_FUNCS([strcasecmp strncasecmp strcasestr]) AC_CHECK_FUNCS([strchr strrchr]) AC_CHECK_FUNCS([strcspn]) AC_CHECK_FUNCS([strdup]) AC_CHECK_FUNCS([strerror]) AC_CHECK_FUNCS([strpbrk]) AC_CHECK_FUNCS([strsignal]) AC_CHECK_FUNCS([strspn]) AC_CHECK_FUNCS([strstr]) AC_CHECK_FUNCS([strtoul]) AC_CHECK_FUNCS([uname]) dnl> Test for strtok_r (we have our own defn if it's not available) AC_CHECK_FUNCS([strtok_r]) dnl> NTOPCONFIGDEBUG_SETTINGS([After all tests]) echo echo "Now, let's check for problems with what we've found..." echo echo " Testing Required libraries and headers**" echo AC_MSG_CHECKING([for required C headers]) if test ".${ac_cv_header_errno_h}" = ".no" || test ".${ac_cv_header_fcntl_h}" = ".no" || test ".${ac_cv_header_float_h}" = ".no" || test ".${ac_cv_header_limits_h}" = ".no" || test ".${ac_cv_header_stddef_h}" = ".no" || test ".${ac_cv_header_stdlib_h}" = ".no" || test ".${ac_cv_header_stdio_h}" = ".no" || test ".${ac_cv_header_string_h}" = ".no" || test ".${ac_cv_header_strings_h}" = ".no" || test ".${ac_cv_header_unistd_h}" = ".no" || test ".${ac_cv_header_sys_ioctl_h}" = ".no" || test ".${ac_cv_header_sys_socket_h}" = ".no" || test ".${ac_cv_header_sys_time_h}" = ".no" || test ".${ac_cv_header_sys_types_h}" = ".no"; then AC_MSG_WARN(error) echo echo "*******************************************************************" echo "*" echo "* ERROR: Basic c library routines are missing." echo "* (yes means it was found, no means it was not found)" echo "*" echo "* errno.h..."${ac_cv_header_errno_h} echo "* fcntl.h...${ac_cv_header_fcntl_h}" echo "* float.h...${ac_cv_header_float_h}" echo "* limits.h...${ac_cv_header_limits_h}" echo "* stddef.h...${ac_cv_header_stddef_h}" echo "* stdlib.h...${ac_cv_header_stdlib_h}" echo "* stdio.h...${ac_cv_header_stdio_h}" echo "* string.h...${ac_cv_header_string_h}" echo "* strings.h...${ac_cv_header_strings_h}" echo "* unistd.h...${ac_cv_header_unistd_h}" echo "* sys/ioctl.h...${ac_cv_header_sys_ioctl_h}" echo "* sys/socket.h...${ac_cv_header_sys_socket_h}" echo "* sys/time.h...${ac_cv_header_sys_time_h}" echo "* sys/types.h...${ac_cv_header_sys_types_h}" echo "*" echo "*>>> No way to proceed." echo "*" echo "*??? 1. Install the necessary c compiler libraries/headers" echo "*??? and Rerun ./configure" echo "*" echo "*******************************************************************" echo AC_MSG_ERROR(Unable to continue... aborting ./configure) else AC_MSG_RESULT(ok) fi AC_MSG_CHECKING([for crypt]) if (test ".${ac_cv_lib_c_crypt}" != ".yes" && test ".${ac_cv_lib_crypt_crypt}" != ".yes"); then AC_MSG_WARN(error) echo echo "*******************************************************************" echo "*" echo "* ERROR: 1. Basic c library routines are missing." echo "* (yes means it was found, no means it was not found)" echo "*" echo "* crypt.h...${ac_cv_header_crypt_h} (optional)" echo "* crypt() in -lc...${ac_cv_lib_c_crypt} -lcrypt...${ac_cv_lib_crypt_crypt}" echo "*" echo "*>>> No way to proceed." echo "*" echo "*??? 1. Install the necessary c compiler libraries/headers" echo "*??? and Rerun ./configure" echo "*" echo "*******************************************************************" echo AC_MSG_ERROR(Unable to continue... aborting ./configure) else AC_MSG_RESULT(ok) fi if (test ".${ac_cv_lib_c_crypt_get_format}" = ".yes") || (test ".${ac_cv_lib_crypt_crypt_get_format}" = ".yes"); then AC_DEFINE_UNQUOTED(HAVE_CRYPTGETFORMAT, 1, [Have crypt_get_format() function]) fi AC_MSG_CHECKING([for dynamic load module]) if test ".${DEFINEOS}" = ".DARWIN"; then AC_MSG_RESULT(skipping - ntop emulates function in ntop_darwin.c) elif test ".${ac_cv_lib_dl_dlopen}" != ".yes" && test ".${ac_cv_lib_c_dlopen}" != ".yes" && test ".${ac_cv_lib_c_load}" != ".yes" && test ".${ac_cv_lib_dld_shl_load}" != ".yes"; then AC_MSG_WARN(error) echo echo "*******************************************************************" echo "*" echo "* ERROR: Critical c library routine is missing." echo "* (yes means it was found, no means it was not found)" echo "*" echo "* dlopen() in -ldl...${ac_cv_lib_dl_dlopen} or -lc...${ac_cv_lib_c_dlopen}" echo "*" echo "*>>> No way to proceed." echo "*" echo "*??? 1. Install the necessary c compiler libraries/headers" echo "*??? and Rerun ./configure" echo "*" echo "*******************************************************************" echo AC_MSG_ERROR(Unable to continue... aborting ./configure) else AC_MSG_RESULT(ok) fi echo echo "-------------------------------------------------------------------" echo echo " **Testing Optional libraries and headers**" echo dnl> Multithreaded: AC_MSG_CHECKING([for Multithreading]) if test ".${ac_cv_header_pthread_h}" != ".yes" || (test ".${ac_cv_lib_pthread_pthread_create}" != ".yes" && test ".${ac_cv_lib_pthreads_pthread_create}" != ".yes" && test ".${ac_cv_lib_c_r_pthread_create}" != ".yes"); then AC_MSG_WARN(error) echo echo "*******************************************************************" echo "*" echo "* ERROR: We are unable to find a header/library required" echo "* to support multi-threading." echo "*" echo "*>>> ntop will not be configured" echo "*" echo "* Missing:" echo "* (yes means it was found, no means it was not found)" echo "*" echo "* pthread.h...${ac_cv_header_pthread_h}" echo "* pthread_create() in -lpthread...${ac_cv_lib_pthread_pthread_create} -lpthreads...${ac_cv_lib_pthreads_pthread_create} -lc_r...${ac_cv_lib_c_r_pthread_create}" echo "*" echo "*>>> No way to proceed." echo "*" echo "*??? 1. Install the necessary headers and libraries." echo "*??? and rerun ./configure" echo "*" echo "*******************************************************************" echo AC_MSG_ERROR(Unable to continue... aborting ./configure) fi AC_MSG_RESULT(ok) dnl> openSSL: if test ".${ac_disable_openssl}" != ".yes"; then AC_MSG_CHECKING([for openSSL]) if test ".${ac_cv_header_openssl_crypto_h}" = ".yes" && test ".${ac_cv_header_openssl_err_h}" = ".yes" && test ".${ac_cv_header_openssl_pem_h}" = ".yes" && test ".${ac_cv_header_openssl_rsa_h}" = ".yes" && test ".${ac_cv_header_openssl_ssl_h}" = ".yes" && test ".${ac_cv_header_openssl_x509_h}" = ".yes" && test ".${ac_cv_lib_ssl_SSL_accept}" = ".yes"; then AC_MSG_RESULT(ok) AC_DEFINE_UNQUOTED(HAVE_OPENSSL, 1, [OPENSSL is available]) else AC_MSG_WARN(error) echo echo "*******************************************************************" echo "*" echo "* WARNING: One or more items required for openSSL are missing:" echo "* (yes means it was found, no means it was not found)" echo "*" echo "* openssl/crypto.h...${ac_cv_header_openssl_crypto_h}" echo "* openssl/err.h...${ac_cv_header_openssl_err_h}" echo "* openssl/pem.h...${ac_cv_header_openssl_pem_h}" echo "* openssl/rsa.h...${ac_cv_header_openssl_rsa_h}" echo "* openssl/ssl.h...${ac_cv_header_openssl_ssl_h}" echo "* openssl/x509.h...${ac_cv_header_openssl_x509_h}" echo "* libssl.so or libssl.a...${ac_cv_lib_ssl_SSL_accept}" echo "*" echo "*>>> ntop will be built without openSSL" echo "*" echo "*??? 1. Install the necessary headers and libraries." echo "*??? and rerun ./configure" echo "*" echo "*******************************************************************" echo HAS_WARNING="yes" fi fi dnl> zlib: dnl> Test the various things we need for zlib... AC_MSG_CHECKING([for zlib]) if test ".${ac_disable_zlib}" = ".yes"; then AC_MSG_WARN(Skipping at your request) elif test ".${ac_cv_header_zlib_h}" = ".yes" && test ".${ac_cv_lib_z_zlibVersion}" = ".yes"; then AC_MSG_RESULT(ok) AC_DEFINE_UNQUOTED(MAKE_WITH_ZLIB, 1, [ZLIB is available]) else AC_MSG_WARN(error) echo echo "*******************************************************************" echo "*" echo "* WARNING: One or more items required for zlib are missing:" echo "* (yes means it was found, no means it was not found)" echo "*" echo "* zlib.h...${ac_cv_header_zlib_h}" echo "* libz.so or libz.a...${ac_cv_lib_z_zlibVersion}" echo "*" echo "*>>> ntop will be built without zlib" echo "*" echo "*??? 1. Install the necessary headers and libraries." echo "*??? and rerun ./configure" echo "*" echo "*******************************************************************" echo HAS_WARNING="yes" fi dnl> dnl> NET-SNMP dnl> if test ".${ac_disable_snmp}" != ".yes"; then AC_CHECK_TOOL(NETSNMP, net-snmp-config) if test "x$ac_cv_prog_ac_ct_NETSNMP" = "xnet-snmp-config"; then AC_DEFINE_UNQUOTED(HAVE_SNMP, 1, [SNMP is supported]) SNMPLIBS="`net-snmp-config --libs`" SNMPLIBS="`echo ${SNMPLIBS}|sed -e s,'-R../lib',,g`" echo "net-snmp libs: ${SNMPLIBS}" LIBS="${LIBS} ${SNMPLIBS}" dnl remove unecessary path LIBS=`echo ${LIBS}|sed -e s,'-R../lib',,g` INCS="${INCS} `net-snmp-config --cflags`" else AC_MSG_RESULT(NETSNMP is not present: SNMP support is disabled) fi fi SAVED_INCS=$INCS SAVED_CFLAGS=$CFLAGS SAVED_LIBS=$LIBS dnl> dnl> PYTHON dnl> AC_CHECK_TOOL(PYTHON, python-config) PYTHON_CONFIG="" if test "x$ac_cv_prog_ac_ct_PYTHON" != "xpython-config"; then if test -f "/etc/debian_version"; then AC_MSG_RESULT(Please install python-dev and rerun configure) exit 1 else AC_MSG_RESULT(>>>> Unable to locate python-config: using workaround <<<<) dnl> Silly workaround for RedHat-like distro AC_CHECK_TOOL(PYTHON, python) if test "x$ac_cv_prog_ac_ct_PYTHON" = "xpython"; then PYTHON_CONFIG="./configureextra/python-config" else PYTHON_CONFIG="python-config" fi fi else PYTHON_CONFIG="python-config" fi if test "x$PYTHON_CONFIG" != "x"; then PYTHON_LIBS="`$PYTHON_CONFIG --libs`" if test "x$PYTHON_LIBS" = "x"; then AC_MSG_RESULT(Python[-devel] support is present but misconfigured) else dnl echo "Python libs: ${PYTHON_LIBS}" LIBS="${LIBS} ${PYTHON_LIBS}" dnl remove unecessary path dnl line below workaround for OSX 10.6 (Snow Leopard)/10.7 (Lion) PYTHON_INCS=`$PYTHON_CONFIG --cflags | sed -e "s/-arch i386//" | sed -e "s/-arch ppc//" | sed -e "s/-arch x86_64//"` INCS="${INCS} ${PYTHON_INCS}" OLD_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $INCS" AC_MSG_CHECKING([Checking python version]) AC_TRY_COMPILE([ #include ], [ #if (PY_MAJOR_VERSION < 2) || (PY_MINOR_VERSION < 6) #error "Your python is too old" #endif ], [ AC_MSG_RESULT(Python 2.6 or newer is available) ; AC_DEFINE_UNQUOTED(HAVE_PYTHON, 1, [Python is supported])] , [ AC_MSG_RESULT(Old python installed); echo ""; echo "Please install python 2.6 or newer."; CFLAGS=$SAVED_CFLAGS; INCS=$SAVED_INCS; LIBS=$SAVED_LIBS; exit 1]) fi else AC_MSG_RESULT(Python[-devel] support is not present) CFLAGS=$SAVED_CFLAGS INCS=$SAVED_INCS fi dnl> Test for pthread_atfork() if test ".${ac_cv_header_pthread_h}" = ".yes"; then AC_MSG_CHECKING([pthread_atfork]) AC_TRY_LINK([ #include "confdefs.h" #include ], [pthread_atfork(NULL, NULL, NULL);], AC_DEFINE_UNQUOTED(HAVE_PTHREAD_ATFORK, 1, [pthread_atfork() exists]) AC_MSG_RESULT(yes) ac_has_pthread_atfork=yes, AC_MSG_RESULT(no) ac_has_pthread_atfork=no) else ac_has_pthread_atfork=no fi dnl> Leave this check after pthreads (required lib for pf_ring) AC_CHECK_LIB([pfring], [pfring_open], CORELIBS="${CORELIBS} -lpfring", [], [-lpcap]) if test "x$ac_cv_lib_pfring_pfring_open" = x""yes; then AC_DEFINE_UNQUOTED(HAVE_PF_RING, 1, [pf_ring support is enabled]) fi echo echo "Miscelaneous settings..." echo dnl> dnl> GNU gcc backtrace? dnl> AC_MSG_CHECKING([for gcc backtrace]) if test ".${ac_cv_lib_c_backtrace}" = ".yes"; then AC_MSG_RESULT([found - automatic SIGSEGV backtrace enabled via -K]) AC_DEFINE_UNQUOTED(HAVE_BACKTRACE, 1, [backtrace() is available]) else AC_MSG_RESULT([not found]) fi dnl> dnl> getopt_long? dnl> AC_MSG_CHECKING([for gcc getopt_long]) if test ".${ac_cv_lib_c_getopt_long}" = ".yes"; then AC_MSG_RESULT([found - long command line options are enabled]) AC_DEFINE_UNQUOTED(HAVE_GETOPT_LONG, 1, [getopt_long() is available]) else AC_MSG_RESULT([not found - long command line options are enabled using ntop code]) echo echo "*******************************************************************" echo "*" echo "* NOTE: getopt_long does not appear to be provided on this system." echo "*" echo "*>>> No worries - activating our built-in (libiberty) version." echo "*>>> ntop should work properly." echo "*" echo "*******************************************************************" echo mv utils/getopt/*[ch] . fi dnl> dnl> Test for facilitynames dnl> if test ".${ac_cv_header_sys_syslog_h}" = ".yes" || test ".${ac_cv_header_syslog_h}" = ".yes" ; then AC_MSG_CHECKING([for facilitynames - define SYSLOG_NAMES option]) AC_TRY_COMPILE([ #include "confdefs.h" #include #include #define SYSLOG_NAMES #if defined(HAVE_SYS_SYSLOG_H) #include #elif defined(HAVE_SYSLOG_H) #include #endif], [void * x = (void*) &(facilitynames[0]);], AC_MSG_RESULT(available) AC_DEFINE_UNQUOTED(HAVE_FACILITYNAMES, 1, [glibc syslog.h or sys/syslog.h with facilitynames[] option]), AC_MSG_RESULT(unavailable)) fi dnl> dnl> Test ether_header has ea dnl> AC_MSG_CHECKING([if ether_header uses ether_addr structs]) AC_TRY_COMPILE([ # include # if __STDC__ /* osf3 has REALLY good prototyes */ struct mbuf; struct rtentry; # endif # include # include # include # include ], [u_int i = sizeof(((struct ether_header *)0)->ether_dhost.ether_addr_octet)], [AC_MSG_RESULT(yes) AC_DEFINE_UNQUOTED(CFG_ETHER_HEADER_HAS_EA, 1, [ether_header uses ether_addr structs])], [AC_MSG_RESULT(no)]) dnl> dnl> check for ip6 address used by sFlow... dnl> if test "${ac_disable_plugins}" != ".yes"; then AC_MSG_CHECKING([if in6_addr is defined for sFlowPlugin]) AC_TRY_COMPILE([ # include # include # include # include # include ], [struct in6_addr tmp;], [AC_MSG_RESULT(yes) AC_DEFINE_UNQUOTED(HAVE_IN6_ADDR, 1, [For sFlowPlugin.c to define in6_addr for environments without it.])], [AC_MSG_RESULT(no)]) fi dnl> dnl> Temporary dnl> AC_DEFINE_UNQUOTED(RETSIGTYPE, void, [temporary definition]) dnl> dnl> Finish up... dnl> if test ".${CCLD}" = "."; then CCLD=${CC} fi dnl> Anything required for the memory debug options? if test ".${MEMORYDEBUG}" != "."; then case "${MEMORYDEBUG}" in 1) ;; 2) LIBS="${LIBS} -lefence" echo "*******************************************************************" echo "*--with-memorydebug=2:" echo "*" echo "* ElectricFence added to LIBS per your request" echo "*" echo "*******************************************************************" ;; 3) ;; 4) ;; *) echo echo "*******************************************************************" echo "*" echo "* WARNING: The --with-memorydebug= value ${MEMORYDEBUG} is not recognized." echo "*" echo "*" echo "*>>> Continuing, but may build bad code" echo "*" echo "*??? 1. Fix/Remove --with-memorydebug" echo "*" echo "*******************************************************************" echo HAS_WARNING="yes" ;; esac fi echo echo "-------------------------------------------------------------------" echo if test "x${AWK}" = "x"; then echo echo "*******************************************************************" echo "*" echo "* WARNING: The test for AWK indicates you do not have any" echo "* version of Awk installed." echo "*" echo "*>>> Unable to remove duplicates from LIBS and INCS." echo "* ntop should work ok" echo "*" echo "*******************************************************************" echo HAS_WARNING="yes" else echo "Removing dups and misplaced entries from LIBS and INCS..." LIBS=`echo ${LIBS} | ${ac_cv_prog_AWK} '{ \ for(i=NF; i>0; i--) { \ if ($i in fields) { } else { fields[[$i]]="."; out[[i]]=$i } \ } \ for(i=1; i<=NF; i++) { \ if (i in out) { printf("%s ", out[[i]]) } \ } \ print "" \ }'` INCS=`echo ${INCS} | ${ac_cv_prog_AWK} '{ \ for(i=NF; i>0; i--) { \ if ($i in fields) { } else { fields[[$i]]="."; out[[i]]=$i } \ } \ for(i=1; i<=NF; i++) { \ if (i in out) { printf("%s ", out[[i]]) } \ } \ print "" \ }'` fi dnl> GeoIP (http://www.maxmind.com/) AC_CHECK_LIB([GeoIP], [GeoIP_record_by_ipnum], AC_DEFINE_UNQUOTED(HAVE_GEOIP, 1, [GeoIP support is present])) AC_CHECK_LIB([GeoIP], [GeoIP_name_by_ipnum_v6], AC_DEFINE_UNQUOTED(HAVE_GEOIP_V6_SUPPORT, 1, [GeoIP V6 support is present])) if test ".${ac_cv_lib_GeoIP_GeoIP_record_by_ipnum}" = ".yes"; then LIBS="$LIBS -lGeoIP" if test -f "GeoLiteCity.dat"; then echo "GeoLiteCity.dat already present" else if test -f "3rd_party/GeoLiteCity.dat.gz"; then cp 3rd_party/GeoLiteCity.dat.gz . else wget http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz fi gunzip GeoLiteCity.dat.gz fi dnl> -------- if test -f "GeoIPASNum.dat"; then echo "GeoIPASNum.dat already present" else if test -f "3rd_party/GeoIPASNum.dat.gz"; then cp 3rd_party/GeoIPASNum.dat.gz . else wget http://www.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz fi gunzip GeoIPASNum.dat.gz fi else AC_MSG_RESULT(Please install GeoIP (http://www.maxmind.com/)) exit 1 fi cp "3rd_party/oui.txt.gz" . cp "3rd_party/specialMAC.txt.gz" . if test -d ./configureextra; then dnl> If there is a os/distro/release specific file (additional settings), dnl> run it. Go from least specific to most specific, running ANY that match. dnl> E.g. 'solaris 8' will match solaris 1st then solaris8. echo "" echo "Testing for special final configuration options for ${DEFINEOS} ${DISTRO} ${RELEASE}" if test -f ./configureextra/final_${DEFINEOS}; then echo "" echo " Executing configureextra/final_${DEFINEOS}" . ./configureextra/final_${DEFINEOS} echo "" fi if test ".${DISTRO}" != "."; then if test -f ./configureextra/final_${DEFINEOS}${DISTRO}; then echo "" echo " Executing configureextra/final_${DEFINEOS}${DISTRO}" . ./configureextra/final_${DEFINEOS}${DISTRO} echo "" fi if test ".${RELEASE}" != "." && test -f ./configureextra/final_${DEFINEOS}${DISTRO}${RELEASE}; then echo "" echo " Executing configureextra/final_${DEFINEOS}${DISTRO}${RELEASE}" . ./configureextra/final_${DEFINEOS}${DISTRO}${RELEASE} echo "" fi else if test ".${RELEASE}" != "." && test -f ./configureextra/final_${DEFINEOS}${RELEASE}; then echo "" echo " Executing configureextra/final_${DEFINEOS}${RELEASE}" . ./configureextra/final_${DEFINEOS}${RELEASE} echo "" fi fi fi dnl> NTOPCONFIGDEBUG_SETTINGS([final]) echo echo "===================================================================" echo echo "This is your $PACKAGE $VERSION configuration:" echo echo "Host System Type : ${host}" if test ".${build_alias}" != .; then echo " Note: --build=${build_alias} specified" fi echo "Preprocessor (cppflags) : ${CPPFLAGS}" echo "Compiler (cflags) : ${CC} ${CFLAGS}" echo "Defines : ${DEFS}" echo "Loader (ldflags) : ${LDFLAGS}" echo "Include path : ${INCS}" echo "System Libs : ${LIBS}" echo "Locale : ${LOCALEDIR}" if test ".${MEMORYDEBUG}" != .; then echo "Memory Debug : ${MEMORYDEBUG}" fi echo echo "External packages:" echo NTOP_RPT_LOC([LBL pcap], [${PCAP_LIB}], [${PCAP_INCLUDE}]) NTOP_RPT_LOC([GNU gdbm], [${GDBM_LIB}], [${GDBM_INCLUDE}]) if test ".${ac_disable_zlib}" != ".yes"; then NTOP_RPT_LOC([zlib ], [${ZLIB_LIB}], [${ZLIB_INCLUDE}]) fi if test ".${ac_disable_openssl}" != ".yes"; then NTOP_RPT_LOC([openSSL ], [${OSSL_LIB}], [${OSSL_INCLUDE}]) fi echo echo "Install directories:" echo echo " Default prefix: ${ac_default_prefix}" echo " Install into: ${prefix} (default or via --prefix request)" echo dnl> Fix as in some platform (e.g. OSX) the datarootdir is not expanded properly dnl> and it contains the ${prefix} variable if test "x$prefix" = xNONE; then prefix=${ac_default_prefix} fi datarootdir=`echo $datarootdir|sed -e s,'${prefix}',$prefix,g` CFG_DATAFILE_DIR=$datadir/ntop CFG_DATAFILE_DIR=`( test "x$prefix" = xNONE && prefix=${ac_default_prefix} eval echo "$CFG_DATAFILE_DIR" )` AC_DEFINE_UNQUOTED(CFG_DATAFILE_DIR,"$CFG_DATAFILE_DIR", [Data file directory]) echo " Data files are in $CFG_DATAFILE_DIR" CFG_CONFIGFILE_DIR=$sysconfdir/ntop CFG_CONFIGFILE_DIR=`( test "x$prefix" = xNONE && prefix=${ac_default_prefix} eval echo "$CFG_CONFIGFILE_DIR" )` AC_DEFINE_UNQUOTED(CFG_CONFIGFILE_DIR,"$CFG_CONFIGFILE_DIR", [Configuration file directory]) echo " Config files are in $CFG_CONFIGFILE_DIR" CFG_RUN_DIR=$localstatedir/ntop CFG_RUN_DIR=`( test "x$prefix" = xNONE && prefix=${ac_default_prefix} eval echo "$CFG_RUN_DIR" )` AC_DEFINE_UNQUOTED(CFG_RUN_DIR,"$CFG_RUN_DIR", [Run files directory]) echo " Run directory is $CFG_RUN_DIR" CFG_PLUGIN_DIR=$libdir/ntop/plugins CFG_PLUGIN_DIR=`( test "x$prefix" = xNONE && prefix=${ac_default_prefix} test "x$exec_prefix" = xNONE && exec_prefix=${prefix} eval echo "$CFG_PLUGIN_DIR" )` AC_DEFINE_UNQUOTED(CFG_PLUGIN_DIR,"$CFG_PLUGIN_DIR", [Plugin installation directory]) echo " Plugin files are in $CFG_PLUGIN_DIR" CFG_DBFILE_DIR=$localstatedir/ntop CFG_DBFILE_DIR=`( test "x$prefix" = xNONE && prefix=${ac_default_prefix} eval echo "$CFG_DBFILE_DIR" )` AC_DEFINE_UNQUOTED(CFG_DBFILE_DIR,"$CFG_DBFILE_DIR", [Database file directory]) echo " Database files are in $CFG_DBFILE_DIR" echo echo "-------------------------------------------------------------------" echo echo "Creating files..." echo AC_SUBST(AS) AC_SUBST(CCLD) AC_SUBST(CFG_CONFIGFILE_DIR) AC_SUBST(CFG_DATAFILE_DIR) AC_SUBST(CFG_DBFILE_DIR) AC_SUBST(DEFS) AC_SUBST(DLLTOOL) AC_SUBST(DYN_FLAGS) AC_SUBST(EXEEXT) AC_SUBST(INCS) AC_SUBST(SNMP_LIBS) AC_SUBST(LIBTOOL_DEPS) AC_SUBST(MAKE_SHARED_LIBRARY_PARM) AC_SUBST(NTOP_VERSION_EXTRA) AC_SUBST(OBJDUMP) AC_SUBST(OBJEXT) AC_SUBST(CFG_PLUGIN_DIR) AC_SUBST(CORELIBS) AC_SUBST(PLUGINS) dnl> AC_SUBST(CFG_RUN_DIR) AC_SUBST(SCRIPTVER) AC_SUBST(SO_VERSION_PATCH) AC_SUBST(RRD_LIB) AC_SUBST(RRD_INC) AC_SUBST(GEO_DIR) AC_SUBST(GETOPT_H) AC_SUBST(GETOPT_C) AC_SUBST(NDPI_LIB) AC_SUBST(NDPI_INC) AC_CONFIG_FILES([Makefile]) AC_CONFIG_MACRO_DIR([m4]) if test ".${ac_disable_plugins}" != ".yes"; then AC_CONFIG_FILES([plugins/Makefile]) dnl> AC_CONFIG_FILES([plugins/pep/Makefile]) fi AC_OUTPUT echo echo "version.c..." echo /bin/rm -f version.c echo $PACKAGE_VERSION $NTOP_VERSION_EXTRA | sed -e 's/.*/char * version = "&";/' > version.c osRelease=`uname -r` osName=`./config.guess | sed -e "s/unknown/${osRelease}/g"` echo "${osName}" | sed -e 's/.*/char * osName = "&";/' >> version.c echo "char * ntop_author = \"Luca Deri \";" >> version.c dnl> This is an odd format, but it matches cpp's __DATE__ and __TIME__ macros... date +"%b %e %Y %k:%M:%S" | sed -e 's/.*/char * configureDate = "&";/' >> version.c echo "#define buildDateIs __DATE__ \" \" __TIME__" >> version.c echo "char * buildDate = buildDateIs;" >> version.c echo $CONFIGURE_PARAMETERS | sed -e 's/.*/char * configure_parameters = "&";/' >> version.c echo ${host} | sed -e 's/.*/char * host_system_type = "&";/' >> version.c echo ${target} | sed -e 's/.*/char * target_system_type = "&";/' >> version.c echo ${CPP} ${CPPFLAGS} | sed -e 's/.*/char * compiler_cppflags = "&";/' >> version.c echo ${CC} ${CFLAGS} ${DEFS} | sed -e 's/.*/char * compiler_cflags = "&";/' >> version.c echo ${INCS} | sed -e 's/.*/char * include_path = "&";/' >> version.c echo ${LDFLAGS} ${LIBS} | sed -e 's/.*/char * system_libs = "&";/' >> version.c echo ${prefix} | sed -e 's/.*/char * install_path = "&";/' >> version.c echo ${LOCALEDIR} | sed -e 's/.*/char * locale_dir = "&";/' >> version.c echo ${DISTRO} | sed -e 's/.*/char * distro = "&";/' >> version.c echo ${RELEASE} | sed -e 's/.*/char * release = "&";/' >> version.c echo ${FORCE_RUNTIME_PARM} | sed -e 's/.*/char * force_runtime = "&";/' >> version.c echo "" >> version.c echo "/* Memory Debug: */" >> version.c echo "#ifdef MEMORY_DEBUG" >> version.c echo " char * memoryDebug = \"" ${MEMORYDEBUG} "\";" >>version.c echo "#endif /* MEMORY_DEBUG */" >> version.c case "${host}" in *darwin* ) if test -f /usr/bin/glibtool; then ln -s /usr/bin/glibtool libtool echo echo "Copying patched versions of some configure-related files for Mac OS X" cp packages/MacOSX/lt* . rm -f libtool else if test -f /usr/bin/libtool; then ln -s /usr/bin/libtool libtool fi fi echo ;; *) LIBTOOL_PATH="/usr/bin/libtool" if test -x ${LIBTOOL_PATH}; then rm -f libtool ln -s ${LIBTOOL_PATH} libtool fi esac cat acinclude.m4.ntop >acinclude.m4 if test -f libtool.m4.in; then cat libtool.m4.in >> acinclude.m4 fi echo echo "===================================================================" echo echo echo "*******************************************************************" echo "*" echo "* NOTE: ./configure is now complete!" echo "*" echo "* All of the obviously FATAL errors would cause you to" echo "* abort before this point, so while you SHOULD scroll" echo "* back and check for error/warning/note messages," echo "* you probably will not..." echo "*" echo "++" echo "++ If you like ntop, please do not forget to support its" echo "++ development. See SUPPORT_NTOP.txt for more information." echo "++" echo "++ Thanks for supporting ntop!" echo "++" echo "*" echo "* NEXT STEP(S):" case "${target}:${CC}" in *-*-freebsd[[45]]*:*gcc* ) echo "*" echo "*WARNING: You may encounter a problem building ntop for this OS!" echo "*" case "${target}:${CC}" in *-*-freebsd5*:*gcc* ) echo "*FreeBSD5: Where the following messages are repeated many times:" echo "*FreeBSD5: " echo "*FreeBSD5: expr: illegal option -- l" echo "*FreeBSD5: usage: expr [-e] expression" echo "*FreeBSD5: " echo "*FreeBSD5: To avoid this, according to the note on man expr," echo "*FreeBSD5: \"Compatibility with previous implementations\"," echo "*FreeBSD5: set the flag EXPR_COMPAT before typing make." echo "*FreeBSD5: " echo "*FreeBSD5: (Under bash, \$ export EXPR_COMPAT=Y will suffice.)" echo "*" ;; esac echo "*FreeBSD4,5: Do not use the -j option (e.g. make -j2) to try to make " echo "*FreeBSD4,5: ntop in parallel." echo "*FreeBSD4,5: " echo "*FreeBSD4,5: Although the plugins/Makefile contains the .NOTPARALLEL tag" echo "*FreeBSD4,5: it seems that it's not respected. If you make in parallel," echo "*FreeBSD4,5: you will see the following errors:" echo "*FreeBSD4,5: " echo "*FreeBSD4,5: Making all in plugins" echo "*FreeBSD4,5: Making all in ." echo "*FreeBSD4,5: gcc -bundle -flat_namespace -undefined suppress -o .libs/libicmpPlugin.so icmpPlugin.o" echo "*FreeBSD4,5: gcc: suppress: No such file or directory" echo "*FreeBSD4,5: " echo "*FreeBSD4,5: etc." echo "*FreeBSD4,5: " echo "*" ;; esac if test ".${HAS_ERROR}" = ".yes"; then echo "*" echo "*>>>> An ERROR has occured - please review the output before" echo "*>>>> continuing to make ntop!" elif test ".${HAS_WARNING}" = ".yes"; then echo "*" echo "*>>>> A WARNING message was generated - please review the" echo "*>>>> output before continuing to make ntop!" fi echo "*" echo "* Building ntop requires GNU Make, so to build ntop, type" echo "* 'make' (or on *BSD and Solaris systems, 'gmake')" echo "*" echo "*******************************************************************" echo exit 0 ntop-5.0.1+dfsg1/docs/0000755000000000000000000000000012012127277013124 5ustar rootrootntop-5.0.1+dfsg1/docs/RMON/0000755000000000000000000000000012012127277013677 5ustar rootrootntop-5.0.1+dfsg1/docs/RMON/README.RMON0000644000000000000000000000163507414541016015337 0ustar rootrootHow to Build the ntop/RMON plugin --------------------------------- 0) Please do NOT use a precompiled UCD package unless you know what you're doing. 1) Fetch UCD-SNMP [See http://net-snmp.sourceforge.net/developer.html] 2) Compile the stuff as specified as follows: [see also http://net-snmp.sourceforge.net/tutorial/toolkit/demon/] - ./configure --with-mib-modules="agentx" - make - make install 3) Once you this stuff ready you can build the ntop/RMON plugins. 4) Now start ntop. 5) The ntop/RMON plugin listens on port 161 (the default SNMP port). If you want to test the agent you can use the 'tkMib' tool that comes with UCD-SNMP [see http://net-snmp.sourceforge.net/tkmib.jpg]. NOTE: If you use tkMib do not forget to do "setenv MIBS ALL" (csh shells), otherwise you won't see the RMON MIB. --------------------------------------- Luca Deri - August 2000 ntop-5.0.1+dfsg1/docs/ntop-autotools.pdf0000644000000000000000000013732707615520121016641 0ustar rootroot%PDF-1.2 %Çì¢ 8 0 obj <> stream xœÍZÝo¹‡%¯%K‚"ËÑÙ‰“»M¯mœÙò›Ë×}9ô¥µßº÷tí]z°D}è¿ßÉý´FmP ÇÂìó#93üͬ¾æ¬à9ßð÷§õäëä3ù/ÿžðüøý×DHY%Ï…¬`<·‚åÒ°|ûÏÉϘˆBåÿ½à÷×>Ý;xXªBáC£ Ãs#@7ÿ÷ ,~͹ÿü´Îÿt8IÁÊüþç +œÓÌd˜OÉÂÁ|˜¢ã÷ëÉíÉ`xšÆçÕfúéþ×ÉŸïó¿ú ãÂÝônÙNçÌ9<Ùë°P[ÑŸ$J±p²ÎúM¨%àD”e‹£8.HÍm’¶ÜÇÏ?­kYŠ®ÊBÃÒ¥5?;¯¶§H[¡ sÀ÷<½›hÄŽ_¼¸¡Ûÿj:[L«M;”u@xˆÑô+£Á‹Ÿ×Œ&JžÉh Õqó4 1Ìåû.¡q°„²ô¸ž”@GHÂYðYdÝXX+ƒ‡ kHRß5¡2µ1ü…TŽÚ²Œ^L‰VXfîZ÷¡vl|¨qÝÏ_û`!:ü5IžyÚBKÌ÷œ6Ô©Æí¹¯4^µÁÝ¿õ÷ÕgÁMaœÌ?sµñ?&¿ýnùé3W‚«Bܾ^~úñþ‡‰’²%ÂÛ¼}Ó©R÷䦞§Žý_r“‚Ì+ÍžÜt1[N÷V+J—ýÕÊ~…ºZQe¼T“D—Ï:m —„€ÍQÀ}v«•jsÙN²B{'ŽV׸›Ê6Ž$á%‹é/÷†D±R\…PÒØÁQm`kW’laf?2HOäzÇ÷ÄœL±óÁG‡[D ˆ^æCã7èÈùAhGÆá‡àUŒƒ3IT˜£v»§TðèK¢›…J¾‘WGÒ‚ü\²6 Ÿ‹µP&´bs"i%îx`ñQ”êVŸp]KXäV`‹L¬T]­X}J&}‚:;£‚WòVBZ×eʸBÀè‡B ¡©œ«µâ aeÞ`ÔyØå úò»–6.!ªž­eÔ›IUQœ_‰È éÊRœÇ«/pÊ:Þ14ʲ0³4ªk`$ŒÎ$ ˜’^錧„õ\¥(IöJG„¬ÆäJìîºn§ã‰Gæ´NSÍ¥¢D8k(ÃýÒ”à’ÉIK…4t‚­]Im ÷áÈ ¡C(ã|CHbþñ»®Œ!f…<8&CAYÇþ3ĬmÊÐ!©Ö<H³wNàÚÁµ™s’XC:]ëÄ›Ž ’ß&ìŒã%ÅL¸¶” š3(Õ€)6Ÿ3$±±´“öŸàPkLŠFñ¹]ë´MGÉ· Ã\¼TÞDô*Üá <4Hô H∧rb|_ˆoT¸ÓéMDâĉĤÐÒ‰Ähíí .M"1ÚP¸!#”:Œ ¸±©(©ÔL¹¾;*¥*¥\ÿ®õ+€wjÓÙµ(yî®A™å_m6w-v z6M9Çh;bÀbŪqN! ¼ˆÉΦ)G\.·àyÝQiÓÀñíI$!Põ(’Dö§¤ðƒáâ Nª MxïR%‰œqÓ¢’Χ`Ž]x!©Ì¥ 3w­?<2H>"MèªVµõäCïVi.%è®hÚÛÅD쾉›ùñõÚºÖ‰·¤§wÒ9_Üa‹;Ôvßï/á¤ÙÓÜ8ü°.á{ÙÖ“ðSvêl`w9Ê^WÛÙ¼ýnò»ßn p%¨Üv±&Ž»ÍJPù] ÂÙHß”¢â»¡AVv®Ñ 8(ú‰®·“¨*eìk(spa¥v¿s>«¶ól<•gÓìl<šg£ñèÕb°œŽO³ñEvv¹8fST÷/Í…Êïÿ2¹üWmϲñl1V[°0¯ƒñ|u‘}úøè¨ËóeVmªí0õk7°ã˜@Ñ7ãÙY†ÂéÓFF~d튖ûš¢¤/'`¨ð25 >¼Ã‘/“b+d$AûɽsYh4 E|l¯T›ËëvdœÓ+›ý¸÷üDúÞ†òlȡؓOf˜}æóW‹js±ÌΗôVγ«åõuµyó™{µ¹9;ywyýî}µY^¾9k4ü¶Ú\Æð sÉà;ˆÊóÁ柟ó·o?|ø°BÉjfÉÙë¯öÙQ0ëÛœ¼þžÌﮆ7ÓÕõM¶8É~¿¨¶‹a¢ù5~‚ðŸeùò#`8¹É€!W·×WÐ ³Ó›yVÝÂZ²Ñ{ÈÆƒj»ºZœ²ï—“'ãÏlpù‡endstream endobj 9 0 obj 2501 endobj 7 0 obj <> /Contents 8 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /Rotate 0>> endobj 1 0 obj <> endobj 6 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 5 0 obj <>stream xœkhÙDÀ€ endstream endobj 4 0 obj <>stream xœc`Ù endstream endobj 20 0 obj <>stream xœí{y|TUÒhsîÖûíNÒKº“¾M'éЄlÉ%K€„€(‘ € ¢Eù7À¨˜\ƘOqÁQ:‰bÀ…8ƒ‚ÛÀ8ƒ 8 oPp‰fFÄQ!ýêÞ¿ß¼ï}¿÷{ï÷ÞÜ›:u–:Ë­ªS§êЬ Óò AÔŘ̸bÑœÅFy̹üŠåË”ÉgæÞ‹Ï_|å¢ ›sLj+ø®¼fÕ|ƒÞ‡ôi·,˜7gî«I›¢U“°²dVX›¤pÂeXÎX°hÙÊ¡ùöáøs¯¹îŠ9F¹ÛÅÍY¹Ø4ÎÖ‡ô`¥ríœEó†è§câ_|ÝÒeF¹*Gk_¼dÞâ–_ýå Ò÷XKø]à×á1ðsYàH||¯N|¬µ ^“ø˜žÀÙ =7À»$B¼ð qÁv’oÀ³p˜Da5¼M悺Ÿ ¨„ñ0Za<OÓùü ×àÚ÷ÂIò49ÂN²ï8‰»Œ»‹Ï¬Ä9‡A”á—͆Ëa)ÜÀËH4‘ù³7#OaÒ¬…[àèÁV;q’2ƒüŠÞD÷Ó/¹'ùÉýH5–ãšn…WàUøþN’G È-d'ù#%týž) H¼Ù0š`¬€›¡„nx¹ù ̪٠ç>ç~ÜV¸×t#ôÀëpåæ"šE¿`!v;{„½Å¾Á/IânEÚ£ø¸ÆIøNÃï_Šr^á7ðì€]¸žðG8ãªËÈÕd5ù5yœ&ßÓF+èuô4NwÑÿÆÜl*›ÎÚÙ&ö{ý‰srU\=÷+n÷¾+œç nükbJ¢9qsâ牿Kü)ñ%˜p§ ƒ0äÀBäu;~×ää3ð2¾ûà¼ïãÎúµˆ•øI1™H¦‘‹É5d ÙHî!÷‘È«äÔL4…6ÐFz%]G÷Ñý¬œf½\6WÈÕr—pWs˸u|!¾“ù»ø'ømüSüFp Û$Þ:=ûáà‚ÁåƒI˜öDz¢ ±0ñ ðŽÒ›W"O~‰@~I!;H/y‘üž¼M?’wÈarŒü7òù’ PF}4HÃ4FgÓt ¾ëè½ôAú}õd?=@ߥ'i?“Ù0–ÏÊð­`cYë`O±\ çAn7p×s7 Çãú¸W¸?rå—ù$>ƒÏáëù;ù>~¯þÍvÁ+d × · · […^‘Ýb‰x‹x‡øKñ7⟥d),m‘^À¯È&>’ <¤™¼ÛÙ$ÒBÖ“éÄF:H $Óü†k§¹‡é=4JŸÒ(…r.®aö$ld„:¸Nö3rîüÞYëi½Œ¼Ç]&˜¸×à^úׯsy» Íöv7”À—l);Ž»b׉;r5áà":N!~uH&™4*Éæ#l>IÅïÔúD+±vÑJØCî£W³lr#)„o`zøßÃ|w01…{.¡`Í :3¶á8øä.ÖÆ OÌü–¬g^ú Ë¢‘¿ssèÂÁgHI?f#ÈRºŒü@zH6jÐt2KR飨ûßÀ¨CgàoÐÍÝËîN|ÈžœJ_„ ~¼ƒM€©tùþ„öôeÔ mîÓ\ <Ç®…ÖF{éYò-ý~ Ï ÞN#äU¡_˜Í%_g'él>Ú4 [Ñ*_ξ„±‰c$Ëû»‰÷Ë.´KãO¯ƒŸ£½x-ÊMhÇæ 6_V² w€ßÔý¿£}ð xx´¡×â>}íå.´ÑjœÄöà4îÝá%Ð(<Œ+€ßá÷}O$Ø …xfØq/OœæÞAÞ= w0¿“„1Ü:x‰ß-ŽQ«¦«•c.ª=ª¼¬´¤xdQሂü¼ÜœXtxv$+3#<,¤ÓÓþTŸ×ãNINr9e‡Ýfµ˜M’(ðÉsjÃumJ<«-Îe…ÇÏÕÊá9X1炊¶¸‚Uu?¥‰+m:™òSJ)çÿJÕ TÏSY©€ŠÜ¥6¬Äß® +½ä’©Í˜¿»&Ü¢Äûõüd=ÏeéB!ì¡ÔzÔ(qÒ¦ÔÆë–/è¨m«Áñº,æêpõ.D[¾ö)ÆGÍ ×j5mW)qS¸*¼ ãª6HjGšV…ºSSÕè7¤Ö*ӛáx¥?Ü2§&Е M«z|ªâûiKnN—ì4¸Ùew e¬¶ 3óηé9\ËÕ7g'ÑVž€jW®Pp%Íaü2-™WW”!>-{Åç¢ÆMÕmò(­^ëç3å°Òñ  ØÃý_ü´fÎP)ZVSŽó †íçòñX,jz!V£ qcôrqnÎò^:#¼XV!û ±»µŒÊGž‡BšTïìUár,Ä×Nm6Ê \îï5?Ö§mZKß¹–”‹µ–µçZÎwo £ú> š¯œ—²Îÿ9dwRí‚QqâþOšçíõÓÂõS/iVj;Ú†x[?ý'%£½ì|ÛPŽ Èð8—‰œšFkº¤Y«À?>³.\»°m<î0\c<©º™ùi‹‘£~¦…j;ëüÈZ¡ÙªÅe ºÚÏ3T[½‚(uq¹m¼‘¶˜C¡ÿaŸ^Qº Sob@륣» }R|Tì§åÑ?)ÿduÖ†ëå²hýôK::Ì?i«CÕÑQVê:Ú:æô&Ö^VäpÇNô«;×¶“~ob×þxÝ]-ø È(Ôl U]a²aj—J6L»¤y§ŒÑ†éÍÝèmV·Uµte`[óN ½–ž¯ÕJŠV‚z‚»¢›Jz“§ °Voåô ½|E/½N:WGàŠ^jÔÉz>¹ )Š8fp T›b?¬;;Ï4BxÎ\ø´h4ìEL*ÑçæñL“!}yà>L$ð\¢]ÓÕ^6¹'¿¨PÃÝcŠôbí£Ø¨»/1м¢µZ£ß¯7ö¸’ l±:Ʀ°É°á+•˜6 ܃@àÀ1ÔNÙ¤2,Øö«Çr=.Hezª« ×ìf`3ÂGL¯-Ð5¡§¸ØÀù# ‰xX&NlEòJ„5û‡ºózwSRaþØ›ˆMqž{0ݰá#„¯x\×DÈGh@hCØ|¾ö#½—Ê&ö ¥Í7qèƒ'öXäÂÆ±2Çãq¹ZJ°Ëxv¼Þm|I.tíLôѺձ…F¦¼BÏ|ØS1¶ðÏc}ôCìT@?¡¡ áÂQ„&¦[â8WÚ9v}ûuÒ}˜ªz^Õóz¾@Ï+z^¢Ù a9öyGz(}TÍœ}T8*ÒÝÂn‘n¶‹t³°Y¤ BƒH‚c¨Î1¶•U!ƒªAUø•Uº(«ãU0a;BBA€|Zk(80 "h5• ÷ lFØ ¡×U‚Ks\@3{¨wA™c©X«iŠ‘1ÅÈi­Žè­• Z›ˆo«¢¥ø–à[L‹‘Ëou‡Fêì~ó\æs™×Ïeöi™ÞD_Ï¢Ô šZ¬5K»1£U¬¡pÛÎ3pwtd‘ŽŠ Th *0P¾¢n l… ä1Û@)J6P’\²Èj ‹†z¢C‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰‹‰ q(¤a”BFq°e £7 ôºö©Ä‹2*‚Ÿjer©D¼a9BBB!‚ÒhXe÷ÆáˆÆô(áàì±&v\‡°áŽ•÷(¡`íQªm*jªnªífL·#ìF`çÛ(+ÞãÞSYóûvàR¾Õ—Ò£¯Cxaµ3&!T#\„PŒPJÀu” êZLÖ’NÂ0˜3tBÁãA írJê Ô9½£{aŽÿ\wö•øäYÈæ=d¶Žã°PÇOA„d"Þ†xâïŽþ»mFíCô+Ô0Dóº³ÓÍíÎV]Ñ]€hNwöXÏÝ‘_ÇšÈLˆHÚ€3 JB|qwôlžn iÝÑjDAc„ôîì{ƒc-$ ã½§Öûc×îà÷‘^Žt¿‹ôÒ§v¿6?‹öJdGðÓèªàÁì^JTGðÏyoß ½ü}v~ðw ‘Rµû¾|É»2ôŠ"·±úÁhYðgQT†<¬Æò ìº<úTp1…Ó]Ô©¯ õ’‡°uQäÞà¼èÍÁ¶–wgG£Á™y½$³;Ø„Ó á$,ÍØ¬ÇÉ' M<. ÖàäÕÚ:»ƒc³õU¨þàE¡ãÁѸ†Ò¼‚ÅÑÑÁyǃáhmpØBèùàÅ6“ÍTÚÙKÂj‰Øù±s‰Øy±Ø9RìÌ;cbg–Ø™)v¦‹ib²ä’dÉ.Y%³$I‚ÄIJɽ‰£jŽv„' ²†NK9=/SÐoÒôž‰bÔèŠ'±zZ?­*^«ïMñÒX}\j¼´¹‹-Zm¼ï ¨¿\‰Ÿžî%ftˆøp‰»ê¡~z•7N7 [1½µ\ëp»_‹Av!¾Ûïöá––êæ]h£Ý@–¶€{y¥·Ò5ÆY^WóO’¶¡4öãã½ «o\µÕã‰1X"bq;µb§Vô¦Å7ÕOkŽoKk‰j™DZK}üŽiʬæÔKݵ5;©GC-Í;¹ê­mÒ깞š––z±N‡§›é CCHg—@Ñè@±K:}Ê  b؇tÙB:ïVêtAïVŽ#]×B¥¶¦ cK& °P§Y† hv’ÙTÕ2[£"³Ã[4ªxL(A’¼ˆNBÑŠ€NRü#Ihˆdöy’Ù:É]?’D ¶í Û†$±ÿ ϼªÚ…ÓªH}cs—U-è—ëØ-/£k†Í7f«¼Ã> †1fŒƒ-a<ø+½1¹‚ä·b‡î5„´¶è¹¯´œ` H&"h#Œyoòïâ€<¡`ÅjÛPSîØÜ±Zê¼Ödׂì¡&ïM£Cþ]䉡&«8ï?û„¥K—Å–^XñO©þkxkÖÞ!Àá¯×aÙÒeÚ³´¶ÿ–A}<:­>^†H—(ÖbD[Ó‚uyçêÓëºL&ÄsjZ–=±e×/É[ê½]ý=ÝpOonÏmmOì-cͺ?·E÷ç6ëùÍx|½ ] tOsÝOgý u 5š†tDOBE?a’¾° žˆák ËM×ÇÈÒsÕ縥™%Lx|ñ0¡âYJžÄ^úêž{žYäž'à“þyÊâ¦Ý¢Þœ®8[1E>U1ùlTb^>ƒÉˆ‚3äÌÄÍœQXß•‡@áú4ûw &q’‚³dª˜ÀÌô 2=¡@ìÆÊg¸º¥ÚÈ­Çχʳ# ’B,t ŒÛKõöŸjíÇeWâŠI«HŠH }wßÙ˜ÿâûdäÌJœàj¸JÃò¸ºheöºÔ[ü·:²yÇŠ˜ÅU—ZãŸÙzGdgêë©GRDNgYÜ>’_ô.;™²àhÑ™Ø7ùßH¾Q®×B×ß¾ð|êûô ÷]ßÉÔÏ"ŸgÛ›}dDF€¥ÛE'P"ƒdô·š(¨Å£>²;Ì,7)—ä’\Í+ôUê8;ÙÀa—ŽÕ@º£27’lu`ƒÙp€”k/ËP‡‡TìR±cHÅ^!{8B$"¡('Š5Át"§+é4½—Öª©Ö&g ]ìès ÷.;G#áུR5)Èß ‡Æu¤öFkéï&ÏÑçñ´¤˜¹ŒŽ§ 1»Ë½t˜jñE8KÐAv;ˆC+Wº"2H%¹ŽP š $‹ ä²™ì&qÔ€]¶+vfOMsg€(‹Š8 râÇá3ôíÕ?“Éýå(ˆ%ùšŽ·.ÁÙÚ†h%K/p:ó\ÈSŸ¥qoˆqlñÔþ½ûÍ/;ɰ§_aÜ8L±Ã<·—íåöñ}"wšú`å¶ÃÓä)k¸•¦¬wYצr™îSqJå²h¯˜êø+ÙUV¡Z®M¡²ÖÀd§#‰ÌN"‰$’¤ñ1)b'^Ê<”1¯ÄsœÉ)ƒ‡1…3%cú$šæˆš¶ø°ˆDg6a%“íòù(*/jL7¼EvÑ @é°çX'¾%ì¢Ã€GËè«äfs4Ÿ#®“£2§p_qŒ»ÑÇyvÑôU0vv;>§ŽËgcЇ¬ïïöX…vé[ÜnìñrQ®¨@+*À[y6†/,¯g¢gx‘æ:³¡¬EÛú¸÷‡"†Y()\Z¤7xyD7"+Éy³{ðX÷–œ-ž€oØúE·ý¼ìJu„WvÊ\Ö;g~˦¿³h]¾Z_ðv8˜|q½f+ÕÁ©Ü¸ó3a$©WïTJÈzÏ­ù´$<ÅV?lJ”ËòdŒ€"ÂùY„Žóìõ”°Žüµ%Oç=‘Ï5–¬È^\r[úúl~TÞ8]úøœf/‰eç•%•ùÊc|nÒðBêµZ,>ƒÕkÍõ2Ÿ%ÕïW,¾d¬ô[†ÛS}BA4E±›eP´VC v± à­ÅkÒ²£üøhÈa)ÎöYäÔP~ðщªâ –|K§…9,Š¥Ï˜% 3–-–Ý–‹hé%¯ªþÜÞ³2À);瀓s~\lñXŠÍwhòªÐ÷úé~tÚÐ_8.׫úP†Ï Ùe”â¼Þ8—_h› ÙîW”P»‡Ovk{Ms J kíÒœOiˆÙïB»¾B5ÉO¯uiéðTÙgþÅæ‡÷m8½öªøˆlbëÍÓxÃcsŽ}B.^ÔTwý “oŽ*e9yù¡ŒÀ˜È­…«?øó ¤lËây/ž¹óàŽk&(õ$Qïª5KÞ¹¼½ã†5—ãþœÀíÂ31• W_WÄÇ“í¦m®L‡¬‡äÃÎ/\b2Gpß:½V¯#“dZ3©%¤Œ–H%ÖGIjTgÉÍ´ÎL]e½Áq»ùqò„éqëãŽ'OºO}μúñö’}ôuÓ^ÛëÎ×]‡à°õíˆü¾óˆë3ù3g>—ŠFBvØíN‹Õfö¢'m³)v'§NxòÐdB(£E›vÆšvJd[S§(öýö¯ìÌaÏ·WÚvN±ÿ›Ú{i¡j…¦4Þývñô’]ohW š8Oi›°%©o>L/8]×çyÏïÀõö={PŠ{öˆ(JÝQ‡%htÛC諲!WOÄgˆJóëDrýà1tæƒ×Îy¢íæM[ÝžRU>¾jF®o8¿ëìéIÕ÷­T×½—®º2­X-¬j+Þ£í¶&LA)0Í쨊i<ë4m10 ˜7ñ2ê FÑGཛྷ—BÜnÚÇíöЇ„~ÚÏNr¶0æóM%B‰8ƒŸ)¬5m6‰[…­âIfCá10±8³>ÚÇÐì+ú“(š{ÂÐåÊ4u8µ ("$k5l ‹3Æ´³ËãÉzY¦jç0Jã°—hFŸ=îû»…&ôïW"ºÝ"iÀÕo”DO/ÝÙ5äÈ´Ç0–²røÊ§cí82úF9gé*4G]ds;ryÈm$X2x,?<Æï<ÓùÃûZ,7óòÌBN«¯H9Lßcïq‡øƒÂ{â{Ò»–¶“äûXøTüTú–ÿVøN:múÖ<’ë¥ËÕ·&³I2óf3ÏG-fJ†“¨Å‚‘†(0F¹RÞœÌóHh2KŠ( ÄîQ’,`æ9R²ÔÉfJ/¯º‚<¹‡OðTûIÒv~7Ïñ4íh°}dC‡V£ÙÒÔ€Ý6ZÁ³‹ì$5C'ÖÙãr«3µ¶÷ÿ(IÜ6ÄYîDO´\“§¤í7Ïù bЬ¡(UHë%y´‡xåþ.VOo~ΤXB¨V‰£ÝæÐHtGZŒí…Ò7<–8ªº¬¨r9‡ ÉÄŽrbÜÌhÁVkj ŒÑE6YÛt[ÈrÜÿuðØÏW»'WÞtvùü·ƒ¯hÓˆ»ì7ú.»QM^á;ù-üþ(?À‹qžè§ÉEÕÅùüL¶9´ö‘½ì09ÄN’o™ý‡!èѾDdÖ‡£¸W€èlã@73çÉï~Nݵ$±%í¸ltW‹Húàø]ß×aÏ Â×xÖÆ¨¨ºJÄ:qœI Ù¤dIá\Z\Ý]U¬‡×‰ÊâÆÜ¶\š%=c}:åÉÐÖÃŽCÉb~®VÛ—{4—Ïtdº2ý™iYób¥P.¢‰v•úK†×ZÆ9ƹÆùǥϰÌtÌô¯§·[îPÖæ> OXs<æz2å1ÿ6åñØöÜç,=¶ŽþéñÜ}ðºu¯üzÊk×Ò^íîá|ò{Iï§ ¼¯ Šž„ò§)'Ÿ+Ÿ†ND¿ƒXÇ®#ûséu¹„R6<%v‡,Û’\Ng²¦‘á,Jl²¬8““±Æ(iéÉiié$UbŒÂ•Î@ZZ4föDÍæp” ÉÎô4ˆÉ²jnÊw&œt¿“8{éKª%ДŸ–H£ûÓHÚ ô%ˆ¡pÆwG5«4QM.ˆ‘¶iˆuÆhlcŽÓ“æ‰é¦I? ¡qÒîú‡t{èH¨ì¯ûuÇ¿ÿp0èºm?ÔëçüÐ1¡%Òž Üsý‚n'8'»åòä^Ù ”Ú›@äGôœ\®xeCµÏ»ä¢îü³Cæ|^ô‰»ÿ×Ϭ¼ÅUú‡ëÖl l<¶ÁW\|õô‹bó­ó”æÏ­÷[ýóqY7?4·¹ñš ‹Kן]Aï¸AÎ)jŸú‡ÁtzËu¡hIÙå“3Ö z‡¼‚P#}äjõY³HPÑ”œK£Ä|”<# ¢“¹“pÒñ™ÌÞ÷º÷zÈܳÖçmûĽî±”ni‡ùY Wâ©3?fã2=¥æR[I2— æ,;l>dyÏζ9ÈoÅ'MOÚÙ*ñFÇ*™Õ™ÇÙfšõx½h[­“Ù"¥¯„vÐêHÆ âõ*>HöùÀbµz}fW”×ÅaŸli²êwQãŠ;­ä+kÂJë~+uXó­•V¦X×X©U÷¼M >âÛ˜jõøtŘ|¡‡€ñÙy¡ÒІÿÌGÐ’ŠóîÞÓ§y º Hº´½‰ÃˆÌ†ìQº†ä~^êÿQàC2IäÀü®Ëo½?ôoƒÇn ŒUùPŽ’}©&ÒŽæúM«Ë>û8½t}jiåU3Ç위>ÅjŒÝßDZ!žQGNðüàû.•{Ó÷F*N#R¶+âçšàk ÌçVú6øY‹Ce-•# Ïq#¢Õ°Z€•žˆÉbËÔhÁHAW,¨µÅÛ…ý-Ü#l‚,(B£0 ðB/Æ nô(ɲöOO  ÙüØ?|²@·öËí§õ 8†t,¦n#—´'É*„L‡ee‘‘?Þü”–¬&“‰ãs" îü|ÓÉ%¬pÅe­«/[Þ¸¬™=xöÈààà†•úù7.=2kɺy÷àôUèbjÜpÀ1µ5“fšGšö²#Ö/¬BCõ¬k&dÙò¥¶zq¦e¶ó:q±°žìƒ½¶½ŽC¶6—¹é/ÅûíÜÅâ&‘¢q³Ù‰@Mµ»]q@²Ãv‡ÙÔKžQMºÕ‡,èÊEÅ‘¢±‡ ÚU¥SI›¸V¤âÆíhËìºÅz¾ÁAe‡/÷Ðé{¼_n=ݺä¸ÎªóÊxÎ…*×o‚4-Ô žŸš‹ª[=útíQˆ5¶iû˜q×Fr&>8#Z§©ÍN?·/~áÍÁäN.êÊUÈÒ½Âxôš0¨ò*˜dö&þÑm*#Rï²”ËyJ^Ažš×˜Ç›íÒðË8ëŠðÛÁÌ“6I ó™îpRfFf¹6,"oRä1%oä°’ÌÚaã2Õ¼V¸Ô>=¥ÑÝä™™1=kvNcފغØCöm)[b[râyo¦¼éî‹íÉù.ÕoüªT gdfÙ’£ÀOÐKÞ w¶÷:ô‚µËd—+MFWÏÓ6²…ôŽô²€êpqѨÅ[“ï©ô4xníYÏI"$¢I#b)†ˆQ"5ÂG6ækd’‘D»¨¦°öÃWÀé—ŸÖ™80ö§ŠLä^òhOn•qý£{CKúeí(Ön\æ·@œ±g¸¡[ nèHÃÝÚ½‚¾ÛQš†ô,G’ …Ö½·šÐ6`@» h»0 žï‚ó•ë—~ý¨Úµû­))Óˆ(‹GF²"‘¬¡ ŸÑ4 %ÙãÖÞ”d-ÜÌ%îÌkg_>zxŠ{Îà™1s.»•Ð·ß ~›’¯^rIC¶oÃ;ãæžøä2<§yBNz,ÍãVfN¹é¦K×lZ›7*-RÉN•³/=íúû?|uç¡Ä ¦ð›ð¬xKýºÝÃ>bøG<ù¹tŸåÇnänçn“n÷q„8ÄŽÙدÙ>ö÷;Î Ùl ë`ŒR‘ãµÿ·" &Áë¦nÞ)8Ñùs;OJGåÏ|‚ó#ÿQrœ;&p¡#ý‘ó=·GØ#ÿ‰¼ËqÏK»{È^Ž{TÚjzÌû¨/N^…µÎµþ{¹MÒ&ÓNhö®4­ò®ÖŠkea˜¯–gjfͦ–a˜”eRä gnJ–W@ËÀNáCBWb±p^·›ù˜D‰³€ÈsÜóÌM°³›íN9‰i¾õp޳pÌ¢¸F÷LtI g"@&¨;‘$‹ó­¸¦DtœjÞ1ZJˆ$޾ù tøAB£`²·6c¿"Ÿf"R,ÏÍŒûÈ>÷)7ïÞE'a¬ž¢y™šö?µä¸|üù¨ŽÞüS§Ú£1Õþãl+ZvÃ1o¾v¹^Ó>ëuOÆ.ïùé¥ý;|ú½bRiQi&+ÃlÈôŠÆmEiÒC9w…É„ÉÛsâ­¾hiҤ܉SèÈlaSn{m°óà`õ*g(S<è¸~Áˆ.ò”öã2´.§¸,\÷Du%•äòѦ‹’'›&'?ÊóIf§…J^/ø¼ÙíU㽋[f3˜‰ädõʾÔLk¦³,u|êÅöéÎù¶ùö¹Îôzû2ç:ç~Ÿüšç]ú‘ûPê@mG’+)Ùå`Ïä$1%Éîp9_N|v.ñ5xj•½P‡ ­¶‹pœâ…d\ ŠÊ‚Óe£)¯?Ûá¯ì\±ÆµßEƒ®JWƒ‹!¹âZãúÊÅ\½ä°â2ÀK:½[¼qoŸ÷€—W¼^ê5¹<^×ož:øEŠÅòQ@Äp, ·"&÷fÊ Ïbèþh½8‘2|4aé÷üžr-|BGcèxÔL| ƒC0chiI©ö•C×I¥$oõÖgMœ2ÆŸä¾J œO¥Ç÷ߺi—uöÎö@^UÚèIcòïx¿óÉM7•>jü¾³èúN‡ ÿç_‚q4-¤o²/¸}ü‹ÂÑ'ú¤Bé&Ó^ó“–ýÝmý‹íKû+ÿzÿõþëý×û¯÷_ïÿ½¯~öRý?ê$cŒ¬ýT3AÀŒÓU×4u¤‰Í¯™ÙP?®q ›ÿ=Œ×SNãÏ@r")ÑRí÷­˜:ÁuÐSaL‚‰Ð c˜ Pã ¦ G –¤¥ú/a0\2u,>±ºý—±¤SûùÙñ‘~Z€ÄO* Yâ4ä<Ðrø_…Khyâñÿ€[ ³†àF ñ º ®Å¼Š0¿µI¬ŸŒ¸QLƒ Z=ÂêsÀÒ  Ûs±ßCXî4öËòh² Ÿ\Ùß¾k¶£âÉgï‘©»K4üÜëýì‡ugΚÆJÚµ¾éœìþ;އ$Ü endstream endobj 21 0 obj 10729 endobj 22 0 obj <>stream xœí½y|”Åý8>3Ïýìõ<{_Éîf³› ’@Fòp„Ãp_&H$\r á$("*ÚzÖ U´Z6!`@-©R­(…VJ+­J+ZµÒ~)µB²¿÷ÌîÆÐöóýõûß÷õ}uŸã™™gfžyßï™MFYP3âФ‰SKJû,ÜÑŒyËç¬Lß/ø !¼cÞº5á‡Vþrü!±ÿ +.÷æúÇ’ÌpãÂe7ßnïí@hø/-˜3ÿ¸åËï#´x Zöåú 0à¸Ï_´|ÍúÌx´ÿeËVÌ›“¾¿î»©S–ÏY¿RùØü ´ß…áç,_iOû ¬\±zMú~ñ4Z¿rÕ‚•Sº~ía|5%F>~á9äããÈ‹Pê>£i÷âÔg´ž¦ä xº=Ú‹^‹ÑKèzŸ‡§ö¡C¨ ý yÐHô8Ú€¾‹¶!Í„’»Ð¸(ÿ.ö¥ÚP zÖñItÚ^‹nC‡‘{SŸ£MèNî=xêNXé<4 MB+Ð=x\j-š…>âï@hº­ÄÍ©ºÔ½©RÏ  CÜÏR]È„üh\ÇS_ ¿Iýõ…'D¢ðÊdÀ(ÍÐòûhzŒkàqjaê˜AÝsàÑxtwô¾ý{ñnôòt*™: ­‚¨-B¡Ãx M"Â¬ÔøÔqä†1ÖC¯¢Vt®vô:ƒÍÂùÔ3©óȇŠÑXxŸ6ôsÜÁuwm`•ú J¨Y~ŒÞB'qÿ„¬ÌB©`·¤N!'€¦ÃlŸƒ'?Å'·Áµ‰{“•ެ°.÷ÓÕF?E¿Ç~\‚'â¤YAžàV!F×|´ÖûèýCœÀ‰™œàžæÈ_sºÏ¦¬‘8úú>ú ¶À›†ñj|;>?&#Èlò=òî»üóü/¥9ðÖ×£åèôCôwlǃñd|^„7àmø~ü(>ŽOâÏÈ02,%_q‹¸&î5~8\SùÕüÂVánñ³îºî£Ý¿èþ{ª4µM|Ø ³=ov@ïÃõú° [á 㞎o…ë6|~ ïÅÏã6å$þþÿÿ _".‘H„äÁ%«ÈMä»äqr®“äÏ䜇ËãÜ@®Š«çVÀ¬¶q»à:Àýž÷ó'ø¬s©ð°[Ø+üPx]8/š¥Ûe$¿{ù鮢®»Q÷ö[»ÛR¿G.€¡V!„ª`ösàZð~0nz›aíü¸Åã`efã%¸ ¯‡•Ü‚Ã?`sÿ~Vé×ø+˜³…Ùœû‘d8™×õdi"»È¤œ&ßpgâlœ‹+âFs Ün w3÷—äÞå>àþÀ]ä.ÕâU>Äçñq>Áægókù'ø?òf ª¸\Ü*¶‹‘IC¥IÒd©AºO:(’;ß@Ð˨ןå6s5Üt/)ã}äçäç€Ï³Ñ|n<L%{ñv²·‘|a½x¹ O@çù8¬õ›d7¹H®âÆãZ<-!Ò½‰N¸ªâß@ü«ðn?‡ž×‹f|ùJ4£VŒH%ŒùS®?ŸàÞAg¸°Ä?‰~˫؃;ÉsÜ$À‚×ø¡BŠp£qMx#:@j€;]’wOÀ/_˜†Kñ×\ qd`Q÷1º-%¿A@ÇÛÑÃx>¿Ý‹ÊðôGô,PEáF±Htá·Éb~qà6Døçáí*q>æ'Ú‚¸ÇįÈûh-:Á«èCîE˜ý ò#n<^˜‚lD[QSj3ºY¨ã‰"Ï@1þ,p· \)tp•YÀÓu>0Œ%^Àœq€ÓC<×#À'xÀ Å@ã×û9j§‘v´P°bà:ñïtOA3SÏ¢GS Ñ©P_àÛR Ç½ètÚ‹ïì¾­D¹@9âqÂ(rB•êKv÷ÉTòЕð…ÕŽa/ú®¡Qh¨ð ÚÁÿMEÕ©©_v‡}ÍE× sð–_Âc¸TÖ=´¤Fq+á}?B“SÏ¥BXE‹RËÐDô*ú$ 9RÂ1}Ú0£zèÕUW ©\1°¼¬t@ÿ’~}‹E} â±üh^$ÊÍ ü>¯Çír:ìºf³ZÌ&U‘%Qà9‚QqMtTc8oLòñè˜1}é}tÌéUИ CѨ+Û$ìYøÊ–´¼áŸZé–FOK¬…«PUßâpM4œ<>2nÇ3'×Aþž‘Ñúp²“ådzü.–·@>Â5ÞE#ÃIÜ®IŽZ·hGMãHè®Å¤ŽˆŽX ö-F-ª ²&È%=Ñ•-Ø3³ ñÔ i!H¶À¤’þèÈš¤/:’Î ÉÅjæÌONš\W32‰Ô÷-Nâó¢s“(:4 ÖvNýXþH„øîvÍ…›dóäºô}Í ´"£$QŸ$´¦#[ãšNkš³5=7F“ÛUe]I9ÞóµinGÍ¢!IìþßT/H××NÖNžY®ÙјYÛÚiWÜ¥ë÷ÔerILj:.@29àX- 嬞Æô¦ÎœäcðRÏo—dÀJV‚ã’Zã˜t\¯F"ÿáCí©óô)–|ûXfšÉ!‰+ﯺâþŠé™wp0aƒµÓfîØ¡^Q¨–pl&ŒGÓê"áI4(3ßöTÇ`êI–lmø—.ÊÜ^Ñ0É×ÇbgßâQÀèvì ÚѸcN{ªyn4¬Ew"¯“×w¬¬iÌ"N{êðÝä¨õ°V‹ð ‚†·DñöÉ-Þ>ufÝ! ì€íÓêZ &#‡×·äC]Ý¡0B+%´”Ò›0½Aµ^²•Ȭ}àP3«åY»Ÿ×Ž+“³eÍk'é2-[F ŒO—¬Œ~(1­®7ö0’¬ïKEXNC»' úf_w™6„áhïÏu´D(„¨¬ÆÐ@"Ï©jI¾€HË4Û°<΃¾‚‚À¡Ä%&B˜ á>»!ˆÈ–)Ya„#γƒó´>Pf´Cr7Kö/YVÊnç¤og5°Ûý×Ö§Óñ“ÓéȱéfCÒÍ”§‹û O§ÅéÔ+m¦©j)íææÜè$‚VBŒÉQdôŠ=œ %!NÌ”œ}~¼t÷ŽG˜#+ ”êàp«E/¦’ù ÙQˆ|I:Ó5¤s¿U/Ý=ìò´Âù\¿'¿G›ÈYXN âj»!pÂWDr®àú|ˆläT¡Âl»!ð‰|±F~GÃbš¯†@Èï ÖÈoáµ~ ±œÜr¦ö^kEeé!–I”d2¡X&ã d2vwi;ùeë?ú„ÚÉÇûÉОaýÉ)”„@`°SÐù)†0 B#„•DȆÜiÔ a„=’Dxæ4‚À€Þ4z:y:°A\ a6„_AHA¡uLü>Û .P a6„M¾‚ ²é| ™)îc+ÉLz"½#oÀEMÞ‰9ZPKhc¸û‚Ø–‹'æ¦rIr» ÚuYoÇ–ƒ·|ýw R†)ä^rÊ@ìʤ÷µþ#'ÔŽi¿æÂ£\°W¢8ŽA:­f÷QP¦i9 ’BZÚœÙZãÅ¡ÃØJŸ:úGð\èó`;ìgÁWB¿·ó¸5ô+(ùáÁЩà]¡·KÚe(y5ÞŽ!9fM‡^:Æšn†ŠÇZC·Ñä`hcpthiU,HW\¿î [hJ|fh ô7287d¬†>†ªƒ×‡ªÒ­Òg†úÃélL¶O ÍeN¯hÇ‹Œbé!©Nšöq©T,E¤”#$§l—5Ù*›eU–eQæe"#ÙÙž:k$¨äqŠMDžÆ<Ëk„Æ$-˜– QIWKj§ǵɎy¨vn8yqj´« CÑá8i¯EµÓ†''jÛ¥Ô”dE¢6)Mº®®ã{ë¡4I¶ƒìœV׎S´èÎÕÖ!Œõ;ï дðÎ{êë‘×½®Ú[mªWŽùo¢ÆLœøöã½"Ÿ“|¨vj]ò…œúd)ͤrêk“ß¡êü!üW|¾fä!üšÔ×â†â¿ÖL¡åÜБõõµíxk‡Âø/Ð0æ/¬œ‹Â´ ˹év¥ÛÅàyh—Oh§((ÆÚÅ…µã1mײ:¿fdK~>kã £Õ¬ÍjO¸w›c1h‹±6îftŒµ9æn¦m’CY“`šäYìGAÖ$ˆý¬ÉŒo›”dšÜÕÓä.6‡¿mL·±œÍ¶±œ…6‰ÿô³`x"÷_U?o5…£5 4&ï^·È›lž·Ì«ÏØHñƹóÑt΂d}tÁÈä¼èÈpËU³þMõ,Z}Utd šU3­®e–±`dëUÆU5Ñ9#ë÷žT^qÅXwõŒU>éßt6‰vVNÇ]ñoª+hõh:V«‚Ž5ÚÍÆB Ç'ÕµÈhx=hÞ,ÝOL*àkc R?Ü­­Ê÷ªˆ÷¶ÀaPHö""f0j-hUßa}‡Ñ* )Ze¥ön¦Ê{ÛU‘Àa¼7S¥A±ŽkÖ®^‹¼5‹G¦¿«áEkÖÒOljÕÿÓêjÀtI½àµÉ¢©µÉjÐ1[$ Jé+%‡dËL¦иӅý p-丞†´¬Š–)J¦á¿Âm&A© ™¼²¹x Z]Ï%sk§`Ó2†ÅaP—¨xX]/¸'ðêllÚ(Gô}³aÍÚL.³k2iú)xduv9z>t•(Ÿbhp‘Ðð6‚ωR;yÔp ?Ç!UâÏaä“Eáá^%‚Åý7¡]¬êªš ]¨ßU…ª!¯]†h@ÿˆÑcWD—Ã\ÇeC@—P˜ï lqn'KÈr«Øð­$+92'Gñ +¡_y71A;× }ŠJÆwèšpƒc`Ä5ŒôÁíÐ^C´ ‡^b†—T!•TÍF+Ð&´ñ{ ~ÿä#t‚ ¨º(Xæ:|üøqx[4=õG^:ÀÈÁÓ[5. ÕŸË Î\‹Å£´§>k³ÙÈtš1| ätd¦%Èm6Cl¦e¨Öï8DÇ¡:B Eüמ.@O"íéÓ6‹…e¾4|&“H»Ôh ÒÌfÓ²ž.¿í³M û´ ¨`j™~œ:‹Üìl „æòâ6²Ý´Ýö¶UP$“—Ô8ƹ®ñLsÌrÍòM ,•–šæ9–¹–ú7“›Äu¦[lÛÄG¤‡´·½gÈiñ´é·6ÏtW+F$ZÞ_ÁHÑ¢ì é« ²a…Ò0¢ÆÙ®Ü·îf‹šè„¨)Ñ™™&nhB h0ý`õõÍ>¨¬Ôí¶»4"Fó âÍ]V:H×âÑò¨Ì¿Èc‰á› >¦²Ù«ôó ¸Û4 @מúÂÐ@ƒ  VPXeÃGÁ•… ƒß,[¹]‰þ †@Ÿé0®Âw¢4ª6%`]2T7iЍöTb½’®jHD¢º(J ª(#—Ú†½7íá?”¬áoº!ô£ÑÇfÓw«›T‚wËÅoepIÑ5‹×á§[(*é:Ë|i(š¹\§KQÔCäæÒÚÜ jrÍtæ¹íäÃLT'ÒtBÂ!Ý^Yrê8£’N:Ój-¥ÈKz4Ûí„ h(6dÇ9k˜ì2=×IËhß­Ð5%“‰L‡ÌŸ ¶Šÿn4ŠÏt<:Ìt•p•øŠpD|EzK~;(5×›§Y—šç[o±ßâ¸Ëþªýÿ'ó~óÓ˵6GËÕħÎ# _†ThùsUMÅcA¿3ôËA?‡‰ìr–\­<³¢ŽAéõ o€ØrØ01««=ïÁjS\ǯÍ(Œ4<Ø0ëªÉl²‚l"<9LòAµ½¯%ìÙUÚ…NÆâª;»Îév Yˆ¶Yû%¬µ£ppFY Œpêúú˜+¯ˆ4°P_” Qºp9àËK—+ˆ'öôc_í}ôÖÛLJ_ÿ⽋cž{ý©Y¹/½4¬j^ÇmG?¹aéwßá8ñþ/Õ½ðê3Ûç L™‘ú”w¦$p}p&Ÿ× ëï "LQ5a†Ü'ªZlf[®ªöqåùÜ>A¡%j1{}ÙÃEþ°§P¤Íã%”û/¡²WVWkZ'À¯óMíM{¥v4QJ…_¡`q[j,[-|~­¾.ÀMq/Ó–8ç»×ZnvnµìpÞøEÂÓÙbå% ãb êúyÓíN Øf6»xïaò ò‘EFÌR€iZì«g‡W„IØK19Ü,­Ž3ÞÇ(®Å ÌøÂË´&¾«¯·nõ½‡ƒ‰‚àÅMßr«âvü@K–a1(Ržu!Ñæ[]ç(rvj žip©ZqS½£ÂMyœTÑ“ÍÂQ¢1ŠæÅg´…\ºißSËÆ9í¦Õí[—,Þél‹|ñ£õÇ–Þ0ÿö]ÝŸþI ßá}t[òö O:Ÿ ë7λ}Ë–ð·¶ÎŸýx¿Ü×îíèþÛ§0i?ðM8 üÍ‚ãÆ {y‘ù1óóæ·ÍÂ8nœå»Õáb•^I¹²r[¿$c³Ù`¹™&dI}Øj¯–sÊ0•Ury}+9>'§ŠvQÀ€6†Ól˜*ÍÍ“*ÍF¼Òœ„´o%ã¶õ h Äez™+ªs:&um!ßÿΛo¶uijÀ¼|ͺŸ¢~°k) •ýáYà±3Ò”¼Ÿ…¾ZÕ\—+h§¬ÂdãùÜ ÅŠ‘äyÁ4–aTFy¥ŠG€D]G2(aô±3Þkcq­ÿæœ99žs¼a>mþm@V^k‘ŸSú ýM‡q@šCuÙŽcV›ÓêpZm ÃA'bX÷X‰Õj3\83©—m<~’p5#L§§ÏÖVh›´û4^"ñ2"ñbäռě%ï®°ýU0ÜmøA@ªÁ­ÖÿŽXBWË·äÒ¤<½hƒØÂ¹mr¿„PDŒñ1ž‡›½ÉhÅqE8 ärJ  ħ¿æztÙím/í¼vgáó÷’÷»^ž¸åþ,¯¹çÂϺp³¶ãî£O=Ö:±ÚMþòb÷ºYÝñÖý­g©Ö6 çž—ƒŠðÄ × ÙpÏÆæl±€¨ y¹N‹š‹QL£BŒipZ®G£ô0žçaœ'£n?u\ûi’ ÚÑ ɾK}x¤d¸FúF†gÚ§…—ró¥ùòûüðymðNykð´|Ê­KaºÄiš§G㹫hEA8ŽÐ Îr’…À<ø½ÙÀô”ìœ1°2ÃŽÄVk FP)¼Åù—©F¢í*V)ärq¥á®öÌö¬ðlòð7­ó¸épžv’¿?‘VÒ€;{€˜áxŒÓÁ;f Fɇr»z,Å ˜j&J”¹Ù©€Šæ!]« ¬;{”»´ß[À@Š¢þ¥q°ÍŒ¹ý(=ŒLï×ÏÉ…Â\»%W1Sd£VÀAfE$lIÆHlYʼnfX¥ÍËÑJÊ”¹l+®}¹|—™6w±] }]ßZ Wš"Tãꬬì±H^f³Ó9Ç,[–‡gƧe¹läÑB:,}ÒÅØ™‹½é·ï— ÆÂ%™ d¥ ŠnÜÇ=Ö=6þ©ùóþ‚ÒoDñ~ÜdZe^k¹Ås7Úwò[åͦ-æ­–{<ïêo:ìy@)­Á°Ÿ&áp Mú†ã”|rû„Í(׋Ì0=ýp¯•^}DÁJ;Yhh‰Õ6# ´cÃȦو­ß°Ô»:Éaê[óW»zL—á"®]zLš @ûÒ,¯3ón ìå¨ÐÊP ãs «šPS}=ŽÇ–gÔ¹¬&€ ÄáìE-½I/Y¹ìÓ#_,]¾ížî‹ï¿ß}ñþ¹[—.ºó®n2v×ÔÍ{_º}Ós\ Ï#KöœùhÏ ÷)>ºýÕ¸㾟ài‹¶Ü1{Þ¶-—SãwM|¶ùööR®xTÙ­|œYîƒA&H”"Vñ\y°ŠAF!B­Ÿ'efÃRZÍŽ½{5Ç„C` sõÇ_~ eŒ–§þ(ÞC1ì0ügÀE ðõ²Û¹ü|±{H å¦n†)š`,zr­@EÁ8^ËsèpLi8Çp2ÍjgÚ(6Šåúy-9ä¶9"ÐØéKp—'Ä"8hòD°S‡(W‰DP>ó³`°íª´ª¯IÑf¦"Œé"ÍË'Ëíùe¥¼Û#õ#fPí]N;`¯Ð¹qdù}Ý'÷ü¦{wÛ~<é·»1~ ¾/2÷àŠ;_¿)2x&÷ßv~(©~w]µú¾þ7§ñê¶…íßí¿²yüä-·ï>Úýuóœ ¬<AH´n¨‘sYÝEN]4Lte«Egk jdj&ÒœÙN«›™ShŽŠÉŠd…¨&‘²“FAajO}s¶2iˆ*„ùk0È\n»ÂáAÙLuG‡vòdÕ™ ø`ê‹Ê:@BR˜z3Ds,æY,°X 0¢4G̬…È`oe,б•Åå;ðÀ×Fˆ©û`؇U{¹E‚™CØjB²Œ Ó_io,Ã:y…Ì@vX«†±e»E”i%.”€¦ †]uUUúeÒo“v¯±8`lBÄ&;I@æ×™·šKikkãúð1K±µŽ»Ž_gYoÝf‘MD+-ƒ¬I-ʃ<Þ2ܪ>Bå’’÷rÏI¢Ø¬Öþq ‘­ödÈÊæ)¶)ØÀ„Ȳ¢š@°Z5 §F{³Ø“½ ¹ hÂr;`¨fE æM&l: /iÅ&¨!íØ;FaÛJ ƒý;ãå°Ð(4 œÐNöîׯª÷&|@ý Ïy»ª´N¿O£º¿çæ\ò‚Œ¬Òz]~­³s›Ð/±mãÑmý¼4#·6išZ›Ì<³î5dN]³IfDtPŽÛDÅ'Y<%=xJ´ŒX=k›m»qØ=ÉMÝ+ÝÍnÎma"6Kj8ã H/—š].µg¹T>ÃZÓhªö ©Úà¢hJtvÁ¨˜nhbë7ž©Ql¥ /Ët'IËK@‰´^¤ó¯Ïï¾têçÝ߬|}ôKO_nù ûòÓ÷bËçÜÄË­GÌ};é)@Ó£¨gÍXv#™a†ŠE0J>8®}p\/+PU3E?`ä—¸r1µÄÜßÜh¾K¾KÙeî0Ÿ7›ÂæIf“L2ª²‚Í P Ëêj¦ÁÓª¢„eÁ)Ë(ba"8 êó° zŒ™¹H +'ɸYÞ%Ã=Ɔ……•³ ¾ì&„Ð=,LHàÊ»„á¼ gÞ¾ßÔ¸7Í™›¨™/õ»û}Þê*ÊÁЦü—:ÓÜ× ¶ÙiUì˜&  @ö¥UTʈ ¡Ù ƈ;(ÆÜôÔØ‹à²4_-ÃdX×Ï~‰7ö åõÅ;ßìz¨ó×Í+ׯçû|3ŠRç5©Ïø ?¢ Ò×(V,J‘Ïâ/êc)*1çª )[Ô`i(ZbY\ÔØ‡ekŸÇÜßó?oq¦-f–ÞòxÖ÷BáAß+…G}' éú P鯹”ˆuŠTv;&úRÜNs!OÈ›(.*¯ä+‹ÇòcŠgÈõ‰äʼnuæmæ·Íÿ°ü#¡W”[1¯•ä—{J#Nïì>+ú>Ákµõ>ënkÊ*ì¶î³~eå¬lÇJ=8Ý­t`õ£[™qc©écµ9°¡_8è}Ð Jˆ6ò3QS –9SŸ9Ú$2f‹äSÚ£ÑLšöòyJ/ùTÛ¥öZ>uÛÓw‡Ìï .Ÿ ”Oµ*Úq~;¹Î°Ô¯Ž÷ï‹ •€MmV+™FÏéƒ,3 ’‰•\0l*;*ÉžJ\é¡sF{ôļy%ùGÄ" ‰Õ"­ôMEf$Š^:‘"cz¢•¾®ÈôkqÀà^›: bÌsÐCÐU]‰O>¡t|.‘u™fÛ7¥uî¬ë50þO½@¨)FÔ>TÁ®åi‡ÐPB§·Ëåt{¢q0¿­À>)3€F\ÕüCKö½:zõ˜KÏ,Äe5Û7Ýœ“ôÞxò®í/LÒOÞ«AÏÜ£+f•._¼è©xÎÓGýðÎ ›'8­~L½±ïÕõMÞ¦»k9×ô[þÒWƵÂñ%c¯›xõM€Ñ[£©f@÷þšïaÁlË 5‚PJ†H(”, ® í ‰CUî*ÿ8÷8ƒÜ`©³5¸¯÷/‘—YÙntßèï½o>ã9ãûƒãÏž?û>Î9J…|a¡ÄVâì/TÛ aœm’pƒp&çoü7šYsYy‘ @P”°ê ZMÞü“&¬™ КM|ˆ9ïM GMÞŒR~‘ÙG&j—SÈ™²Û‰&êT¢ð£%F …§i ÈYħu &Èʸ!ïÂ{pŸÇ|W㉘^ÑÍS3?‡¢f¨‚™ØÀvŠ*˜¡ ¦ª2Å0ÖÔM‡Æ^fè9騗;ºâ æO±bµÎ äœÖõm!ðÕ+Óû$ ß5­BM‘(H° A€j`<pNO/k¹ïsm«Zæîk2ºÿúÚ«KIùôû×½øƒµë^wýí¾‰÷[ÝýU÷éï㇎L¿ûø;'ߤë¤Ôg\'ð+?ž™‘åÖM6l3aMB+ÁJæíA“ä ò&luI2}{‰½½Ä<+’Fß^b~üԛ̾Ԏ6”Ò@EÉhÅŒCÁŽž©Ž©žFG£ç{ä{Üc–g´güfÙâS—ÅÜa­y¥¥Ùò¬ù€rP=`6»Áhø˜pÖ¼Ù¶¶M6ΆÅ7÷GtR0­]h:‹Îƒˆ³ÙLèÛ9aêùV™ñ§¼¼_¾)Âä6€ 1 &~“±AWþ ‡¤j‰HVÚHRi#‰±Wi@ ühF½¨¤‰¿aUæh-s…®ï\u!ѹ*k[ë•%ZÃ9øR°5Üê±'í,g{¼)N¡•&a®ª%ç«éþûªÏïzéw¡}¾M3·¿ðÌ–%÷â;=/ŸÀ9X}“Íûž ,]öÆ{§_¿Ê˜Q³€"uºo<£Þ³”[FZ„ÎÁkÉ4uŠsjp!™/,Pæ9ƒ¡S¯ø>q|âüÊó'ß'ŒòÜ¡PÂOɵÖOi,ñ|K?÷2ÐRKj,£œcƒ×ª3, -Ÿˆtƒ/X5ìâ¬&Íi’t$É™¼eÅt[LÓNêXÓ ½QoÖ4)N¤ T·SÊљТ¤ª‹ƒtF°:SÀèŠëVºâzÖÕ©º4œBG_cÏ?">’ROA4Qâ¤\†rŒOK¹iTd`cbIbÒGòå–OêEi Mã;»z˜p`œcê ßÒµ¦")/fœÐîí¢¼àè¦_­]rêŽÆ‡Jöw…_\»î{o]ÿäÖ'v^zz7ævLF¬ßŒ"öwýäÍ3ï¥0«.š tæ˜M5Ä7 8Ì>Þ?,8Ù>Ë7%8ǾÜ?'¸^\ïºH.z5äÆ6‹Ç3ÉM5WδíÒöhDÓø@P•ÐaòÅØ,7ëj€u×€:tõx °.ÇTYKv{ËBå?]R m¯•'-ØâÁÝþX¼œ¦Æ0*fC8ä.Óò%#¿¨< ©p/H¤Òd0bx ©Þ<±!1¾ë‰ÄŦ•¸ $df;¥ª«©*ã‡Ë tU–Ä4TVŠt§aÚ2Ž0/½È]¸øËCŸw…¿û¶âËŸ©­wÎÛÙu†L6žq׆çñ ÏÓm8ÌÞŒ »?ìþ‡Þwx~pëˆEÏq›…÷[Œ\§‚m¾_Ÿá[éûžùqËóÙo)´$}>ÞG×£Ð*Ï‘-œÙT±‹$œž‘ºÛ‰)‡Á{b<âȘ™¾û .g&p"*ß…°Ï dâ3,@&ÈÉ̲Bf“åQÂAų쯳̙1˾`b‡9£Ø °DØzÚë{Ft«È›H\Lô"j_¨Òª@{îl ¶ZÛ¯¯ÔÓA§¦‹Š$Ê !iŠ=€tÑÀ`¯mÞŒ@'«ÀPX6°¼‚n[£\ÍEw[wïvøïX7nV`p锑'NpílZZ>êZû÷ÕQsw^¾(bx÷dî  ˆ\T„W&“à,6ÅœãL5NQÉñå›âÎâh¥ióÓ(ç ©Î´Èôú7—µ_´¸`hthÁ¸‚]Å{Š¥A‘A}ª‹G™FEjúL‹Lë³Xš™×§±¸¹øLÁg‘/£_è·èj'-m…A‡Ä$‰Fý™iFè$µ•l4J…`ЦÖäͪÛU+Sc^ïIÖ<†§ÑÓìá‹aÉÉôbÆÖ<Œ­yzØš‡±5º¥ÄJ¿H³5ÚŠn1eØš‡*×°]§56Cy¡ü#¶¶l)²UÛ&‚ ccóSØÚòØ6³HÓÛ£6ÆÛl¾Dñšeo‰ ½ØÛ…NíŸ8\×¹‹t'ò\f3ò\Ú°l¡äñ¸=i²¨†¤ùœg ™L íí¿aŸ©tÄšÛ½V¼.ùÛó7þâžWoyvÁo÷üø‹GŸÝ¸aïK·¬ß[çŸ+?³"y7®úàŒw>Ò|yÉ×'Öÿ+úEÇ‘wßxó jnCˆ£¿~wâ9‡ßå)g§˜zãr5Üa ÏŠ†x|åY7ëN,V[Pœ&ÕSŒ²Aå)w(ØÍdŒÛ `P Yì¤ P¨a¡³Í#¦Û)~ÚJ/¦A¢8)H*`ئ£¢fŽ›]<ÈÜ©˜ ÁS>¨<é>ï&+Ý{ÜIwÊÍ»‰3–vUi0‡óô°r0ç,â™O$ã>ùÆð0*M«•2ºÇaõMZD„‘%a*ç×èI½|'ìóZ%ziˆ¬˜Z·iu°gÜõVÑ*Ŭ¢9€-2Ð%¢Ž¤Íˆ'ÊÒZ¢ÛíÒ£:£èÒ·µÝÖ±îGµmk—Nº§ T¿>ÐðÌã]³É“ÛnzïÆ®W€&·  Ší7®WÑ7˜¨ìRö(I¥CùH9¯HH )+•few¦è¬’RÔ:–ÄN¹Û0‘WE)& ~7¿‡OòüY^ìàÏóñaþ$Üñ|ZW&ÓùžuãÙºñ*•gœÏr6ž*átÍxJD*]C~‚üÏ«·ªŠž€•b""³ Õ°ª)Á6l`U¶·µµñ:qâ’‹_:CñÞ™ûÞÙDæ1­Cˆ3Ä™ g³ü/á¢È)f:K‘Ú̵“Í(Ù ó²³oÓ¹›TbÃŽH¹ FÈ~{A¹BHí+ˆ°c ”ˆ¥gEãRL®+Õ–‰–z¾^¬“ê•üÍ£ʛâ/ùÓâ9ñséïâ?d—]UŽã‰(JŠ"Ã"Ë1ItJ’Èñ|LP‚ ªžºixA”dÀL¤òíØf(ϼy2½‹„™ÌL]É¿ ½)†H l"„«ÑDÀƒ1€á8ÛAÌB bÈÎ0©Íˆ©àÈg¶ü>2ú†^œŠ2¦ñÔ["þ"Ý£ºÀP›ºÎ©V÷TRï =í©—“4¹J®âXœÙ0±Ô*8¤láˆâµP—-èØé“1†ªçT*rNNìÃÖœJHNµ†YÒÉœaþò&”9U,¦:Z#̵Ûê¦É‡­Z¥˜NØ™%-¦¬¿úkéPöx,;Ý0šÓYÅ"xêb«—>üç–@º9n¨O[ùkbt‰Ë0Žb 0¿ðy÷|äÃî'7 ‡/¿Š“Ýëºæ“Ð-Ý×Q¼¼¢ F‹!Ò•û+³“•û˦ÓþÒi^,}â2lÕ&„„ÝÂG?¢óV ÍBJàk©„K32Úch.à»îsŠôæj_ËÕrzqµ4¬Óz‡œQ:Ò¤ ™TÖ;œ¡Q4¿’F)‘R %S&V¥‹éÊÜÑ&¦^4&+Ä8èQüݹÝÕº=üc¼ÉRãÏñç”ß{> ¿.†‰GGo ¬p\47(º¨è”°õû4õd ïŠí‰‘˜Çã·ÆvéXç™eâeV sG1ËÄI_Rg§Dé‹ê„Ù'ffŸ0G”žõëÙ}1½7folWXwžî¬»Ý[Ôiw& ÌÀ PZbB(`¦²®íÏHY4†O"Lm]B”þ8F9ÿBÌ[…ÜIs9« ^0œLä¤AaM“d~¬¯ßÝ[Èú!ºÎõrMôriÁMׄš#?m+”D`±ŒˆuOïýc«Ùéˆ;ÍzÛ-®¬@ʨèô´;èaûÿL,1}±·€z²ôÙ%ëÝvì‰öGg ]ùݶºùã6áãN˜=·îð¾ƒ]äûËfy𙮇Iëúõ“»¿ëý¬nñ)à‹o4':È^­]û˜û£ã´£\<׸׬õÕ®Öj5¾:œ “P¸9šSê*Íž³2¼+,ñ \ã¹&P/_gžå™X"/5/Ö–{–:Âï9?ð~à/÷œó\îÙp*ìŽò -áÈÑFñ×h3µOLÊéÖLº•s©‹Xt­&dõåŸT±¦j£Ú¬òa°‘ÙœûÔ0±ý:ov³.«Ðõœ„H»‹UŠkQ¶q·;ÊH™=†Ð¿÷ gÂZ/‡°v…Cøâ?;„Ù† °Hæ®ðâ+<ÂY‡ð?»ƒ™?X¯ìí vd™ªÛ夿‰è\/èm{fÈ‹¶Ÿ\²ö£[gÞ×OvÝú>·fuK÷bᵓ'ïL=òt÷¥»Ç éºÄ=süè;¿zçØ¯)/½HñM€¡ŽÞ6®*q`ÇQ¾œÁOåoà×ð¢¢ËЬXºbAœŒMlñ‘ªî’±œv`ÉÓÿg[©G«øÚÐ{±4‘¡ü²+m.‰½ÔÉ öÑGÿÅ\:§5\XuŽî^ÂêTfL#íímVvø¢anÈJŸ´B–tçSCW_wýÐáïºÞ™ËÇŸl3乂ÑÕ«ºNÑU¨N}ƵÀ*ôç<Æ­|ž3oˆr22FÞ‚¼ ʽʖüg?,~³(¿×Ó¿¶ø´Gé„h¥XõÎ’g)³ÔY¦YæY–%òe‰ºÄ´Ä¼ÄÒo+°Äó òû ÊŸ©Ö›æÇ箉®ÉoÎÿŽú¸ù‡‹ìÿŒú¼ùé‚g ÷Çwfuž¼l&šÍäg3…i;$Ó†f¢ÙL~6“CÏ%Øs+gÊ1³ÊûÃqoê—ã§Î<_1ó×úª}}³}û|'|¢Íò­ð}äãC¾û|Ä÷ÀÆxÁ¼‡†“6×èá Ÿ“k˜iÛït—§½ŠV½ã~³r–圠KâÓ›zÌÔû4kÎ}j8(€ù`?SÈýù>Ãá-/¥—0˜7Sºò±_‘ùÂôI_˜>åc&Šy}íäºV)¿=¬™/ØéÍ"?*RPTÞXÚQJªK›KI)õ„æ#oZ³b(N¯20š¡³3¦tá|#u›ž-ÌÜ5T‡Ù‰Uv>+ã¸Éû(k@ùdÜ Mã3DOR¤A²jBf31‘hJŒï¥}±½…ý9PÛL¤Z3°–ôœâó¤å´QÐ77*8‹ãºf×'æY¤J,ô…(× ·k4€ò¢³ÜG àÂE|…´*ÑÓg÷XÄΦ%6oÞŒz1(jQ7ô[/ˆô#ËU¤YQÏöõ1±“̧TÝj»ëÖ ëƾ󿣇 .ºêÆ×fêIóêÅ–¸Ý%-Gž±øÍ'ÞÇW—®Z0òê¨7V:vó„Ñ7†cn]è2kJE4˜ãPóˆm˜5s÷µ/R:ÍOý• "úÍ!¤FãÔÂî0†A¦Ù‡6[TÌ!·¦$l* ÎdÓòP¶Øcfœ’䥦QZ)5K»$ŒÞ#%¥é¤$JT,P^%¥ÅËü•m3gÚe2Ì»ÖÕÒÒŸJêDÈ(iýE:L– /ÔrÃ?™CÀè;©ÓçÜ…*¶ÑUE™¼^V¦½ÍÎ$bžôfõµêìWì,Ñüãªæ.+Þ²eÿŽDaî“»µ¡ ž"óvbiY÷=;»¾3¾ØÏ,IàegéߢÄ!?õâƒHÂw9=^m”Ùå Ηn3v¸MÀÌuX&TæŽy=Tqõ3­ØÃôa9:{¶ï=Œ}{z4a3ãòÌø×<Ì´ñPMØB×#åÁì™àg–'U‚ýçýd¥?éOùy¿9¦ôú»Ê°rR9«ðJVp(=‚#ãßS™WöÏä…´`…¹×” ¾+ŒOêFûWu$Ûk­ªÌt"òóšÕb³Q’EYAååÍd‘õ¢ oQÑfÁðlfŸ¨ ÎèxA ¢y®zï®z¢fj3é7Nž|ïUm·Y>qàjò@×þ{Œž<õ¾í¤òÒ€ŽŸúE:*þ"³ëd¤Ê"{éä³su%‰ÞguØQ— åé•*åï½Rƒ¦\¦N·RœIUj4+¹‘rTÓp”¼X9rCwgŒÛ û•£0D6sT¨ÄÕJ4PƒF«3ð R/×)7àÈby±²Ý„o"7Ëë•›ÔmxÙÊÝ%m—w(ßG(÷«/¢§Ô×ÐËR‹ú6ú©zýJý3úX½„.¨Åð:ª¹ÕBW+Ô‰ÈPÁ°»Ë@•òìï7é %‘*¥lìÈb<”®-cŠ]VJÁl¢G,>HÀÚ@8ž8ž@%=G™*TI–cŠêTq„€bâÄ&¢‚Ê"Ë„`QRa¡ÄŒÍy²aJ³B”v8`Í g(abà<Ó¿¤ØÔé÷u5t5ø½ç2Â{Qä 'Šeÿ¨{ÙÏÅBÞÄŸußÈÇ»¶,\1mÙžöNŠ /vØùœì f;Ýt`Ü'}¬FÌh³§ØOy YÍéasº¢£Íšv³‚h¥9Ý`÷ªÎadm‹6X ‹Y¤eÖ1áU^W3~4£ÓéOŽk§k§ØafvVŒaI¿%†P ñ}Tr~~¯Îéáôä2?õá³²%)ׂ9i©ñr(¿œÍŠC (>»À#^4)&«l׃sJA9`Ê[)&É k9( ‘¯²ŽäF‹†4^®5°Ö¯±_g›b_*Í—Úoo‘ÖȇÄöƒö¿‰—”B“^ˆ -ÖB[½Ä9UØo’·Êp›ŸÃ{É^Ó³æè xØú3þ´ø¾òÿ™íö â7JÐ$Ò›Y¬‰éƒOL¤³ØžAÛ€jµñv¤Ë’“l1+5¬gÁ春=uÚ¨ \ÊØWĬ v:DÕ¤ÇÕ„>Ÿ¢ÎÒ—éôºª«<à"G0ß.uSkKàKïµsôJKø ''À°$AQUÙd6«š®¯Ý/ ;è,cT›5ü†.ÉaI·Û‚äÉ pŽY¬N‹Å*ƒ•›Pe'<Ž„JAKv^¶éf«…MÏ|\–%‰’ŽÝFO›ªÎ‹š7ZèÎÒŽŸ3ÔðD¯P7©Dm'Ó e¢ŽWè›tzsºaÒÜÈ<’×sðEÇŘJä¡¡Á z |)‘5x?í¡¬ìëôïˆÕé,Þ6¾7Á]™Vn³jG%«VEÍÓP› M­k³„Íaòjê,è´g‘5u² õ·…퀣=¿[©¯M–Oe¿8Ù"ÑŸ³@Adjm²ŒýSg[¤pºÔž9ß}ˆvtTAè¸ÕÉV©?í± &‡Ó#õtÞóœ‡=§§ÎîWÃ|±?ý§5uê ½C lu*×gÍÄDúÐ0;ûM ã'e*Q®€ÃµÝ¯~¾š/{þÐîWÜ×ÝöÊó}~ æ{çôc䯮GÞ9Nn¸t†l8pùû»oƒþ®zt°þéø òî§üZaŠxµøééÙô?^ï}{©‹LWÃÕ‘½ÌS,æwY×ÚækCu¯þwû“ŽGKŸ8?qpïó¼å}Áw·9\çƒGsfäÆBå‘Åÿ½þ{ý÷úïõßë¿×¯ÿ^ÿ½þo¹˜NI2]؉8öwô©C lZ4ùÚ)S9­hÀà‘ugŒ9®FŸäuÍô1ý'ŒvÖºÜ^Ÿ?SVé¨Gÿ~x´’Å<]Ÿó…©ĘÆôcB<]‹¦ ©°j*BÐ`4Õ¡‰h‹f¢q¨éhò Qè4AýÑ4V¹¹yÙÿÛ T†*‘¥—#;ý§éoÆOŸÄ¨ìOoâ]ôÏÙý‡ùÊÛóè|ꊂÌ_”™#èÿ¬ø?/ a¦_¦CøB„ü™²ñæ@˜J´=ôÄJ´ü߆Ð#Â[èqf 'þ%¼…ž„TùOÌï[À“ ¡Æw@:Â6üÚNÔÓô-‡02“nƒ5¹ê«á¹|¸¿ò~˜‡˜¦¯ÿ͇„|óû–ä¾Ã³mU“i >õqAMÛõÛ#ßìëZ¨ ‘Íp«daøÿªE¿ endstream endobj 23 0 obj 16629 endobj 24 0 obj <>stream xœí{ tUÚèwoUuuõZ½¤—lÕNšNd%IC–a ’°GD’EJ÷Ñ—NB°ƒ è¯ã‚(ãÌñgQf.3Š2Î"&ý·º`fÎûç¼÷Îyç½cÝÜý«º÷~ûwOa p0­ffn¨Oá;XÔ.\ÑØëL K®ióŒþÆ{~ L]Ò¼tŬ“+Š4ÙØwéMë–Äà­§uË7.zíâ£)Å,Z†³áõßc?}ÙŠ¶µ1ø¢tü~ÛM+6ÆúÙ¸¾¸~EãÚfÍ­ÀàÁAÏÍ+Ç÷Æ"©y媶X¿øa6ßܺ¸ùö°f$ÂqO…àVóAHäýàˆ~†ùsV÷7E¿bsý+£¿§¿Ç·{â9ö¼'a'tÃAL Á:Øéø#´Ã“°›ƒU°`ûòm†9ˆE'4ÃÀpÂEÏÂs°‘AVx Î@-ìŽî"6ЃÊ¡z¹7¹ÿŒ~EªÈÍ@! *`羂_ž^'¸„UÑ@‚ŸÂ:÷m(†‰0æážá^_‡_“L¡<ú1x!3qåup/쇷É.º˜®¦¸7…ÙÑG£¸ ~I ~¨‚&„Z·À£xޝ‰ŽØÈ+äÎÅ?ÖÿMÿߣðäC ÆB%¬ÆÓ¼§áCøþFf“%4@gqͼÀ/:¢ÇpÏ)“0MÙзÂfÄØãÐI÷s;û_ëÿ+ä)rp×Å0 Ï?qu~E,ÄM2È2Ì$Md¹LEZBo£è_9ËÄTÄíçz¸ßrsâ'ðkùO5úhf´:º,º6º7z2ú;Ä©™0¿9n€F<Õ-pÜÛ‘ZazöÂSp"Ð 'àçð1ü¾¿É#£I)YBn"kÉÒCž'ï‘÷i=m¤OÒ3œ›ƒkà¯à§ñ«ø÷û¡dÿÎþÎþw£¦hWôè—Ñ>Ħ‚8Ï@Œæ@ãÊ[a7<‚+> G!Œéüeäˆ9 “LìÄIÒÉP’CrI™F¦“9d)i#ëÈíä^ÒA!‘0éÆÝ¼L^'¿"Ÿ“‹äÄ ¢™ê©™*4fÓ:ŒN¥Ké6ÚAŸ£=ôELgé/è/é¯é'ôOô³cJãüÜn7[É­åÖq›¸gŸ§¹s<ô3ó™|6'ÿ”ÿ‚ÿ» îö ŸŸh@#k®ÓLÓ,Ó< ‰h>9qº¸DÜ$nokAëÓ>](xÒ«:ž€Ÿ“—á#r³ÓgÉ4zˆx%i']N×òfr=ÿ4ßGÚø÷yŽž‡ƒô+¶ŽÆÎÂÕÖ ¾XAÆ`k)¬€S;œ¦ -ð*üX#Ѥû.ðÓ PH&2ÚÐ¯á ” )ƒQNúÈ~¡>AÖsŸSÔ’>ú1-´Á ·‘n:•;MΣ佈üRM–ѲúàSò$ù”Ά)ôØÏ/~A~Kdª° ùøsÜDn µÑàŸ£p %á LæÞ„yä>”þ34éJxœ{‰üŽ‘[ù¥Ü2ÜåZÊ“;Pžƒnn¯‡qpŒ;/“ÃÜ$Gùµäf²'ZÙWßjòG¸N¡ˆO޾Ýÿò9=AÿÅÑ·¹ÙýKÉc¼åòV”ÞVÄžÅ÷Cq´ØÊ@y¼ù5u›„R^…šk2Ü@¾A‰¹±TD2a*Mƒåt¬èÑØQŽ,s]éèQ%#‹ òóF Ï–“Èš9ÄŸ‘îKóz”Ô”ä¤D·ËéH°Û¬Ùl2ô:I+j¤"ìJ_Uƒ'ìoó~ß„ 9¬ïkÄÆ«Âªº&ìiPÁ<×BrÉ?@cÁAH"{J¡4'ÛSéó„ÏTø<2gzÛ÷Tøê<á j{ŠÚæýjLj¯ßðTº–Ux¤ÁS®Z³¬½²¡¿×©×•ûÊër²¡S§Ç¦[a§¯¹“8ǵA•£:)h¸«p¢¯¢2ìöU°-„¹ŒÊÆEáiÓC•I^o]Nv˜”/ô-ƒo\ØPA \]&¬)‹ê2ž&vØáéÌ>Õ¾3"†€a‘oQã¼P˜k¬ckX¸nEعþ¼ëJ?n-m»z6‰k¯t5yX·½}›'¼ozèêY/+ëêðø.ͨjh¯Â¥w2,ºrq#lûì(±C-öU²‘†=aÉ7η¬ýÆ$Hb{f¬óv%&{£ç ±ÒÓ>+äó†Ë’|uÉvhŸ±®Ûô¸¯ÉÉî”-1lvšÌñ†ÁxucñàœÚRÁY«zÆ : Û‘o"²AسЃ; ùð #Y±x$´/‰`øÔ|+¼ÉЖÊÚåQlœ½2dŸ§ý[@²û.|yíHc|D“! ¬É˜cÁp~ ÂYYŒ/Är$$îqŒÚ/ÌÉ^¡E¾fÙƒ¢¦…ðµºQ¹ˆs¯—QuG$ °Þ2=ë{`ARsuaÚÀfN Ì$Ìf3[f_oð!ûæÞ%„µþÁ?³ì°U.&ŽÿÉôâØ|õL_õô9!Oe{C·Õ³®éÅæGÎÅ[a[yˆK¢ñMâÔYäÄyƒÀ¬2„ù üÓ¨œ¼("j‘Õâ© Ë beÎëý7_ŠD/²·ÔêÊkñm†G®í¾¦Íö ín˜÷ÓêYsÚÛu×ÌU¡Þio¯òyªÚÚ#Ñ- |Ù×ÞKŸ¢Oµ7W6 P4=±#)\µ³±ŒŒBn¥0®ÓG¶Oï ’í3ç„zetZ·Ï uQBËÆÕu¦ã\¨}Ý :JGYÏÃzPMÓ»¨VJêE?w‹:Ë«ja„€:¦#°0Bcc²:†OR©/ŽéŸ åÚS—ÛW­=„^xåªg0Ü‹X”¡¯% ;"C.Ú YÑ(Ú4Ú9kóX =G1ŸÄü5f†cYƒy>f‚ô`×®ü`«ùjÕ=uzÞVOž’§öƒbµÎ«¥Q±zx>ƒ;Ð]¹–õtçŠõ³FÄúéy›ÇÊhù .ÌJ3–¹˜Ë0oÆÌãâºRb¯IvöÚþîĤ<óIº!öã{ûÕ-îêpÚZ£©é×c‹Éøµ½j¹Y-ç«e™Z檥9>ûG¶ºZžTË£j™«–ejY£–+ÕR…'0}‰é L$ Z!›€Bd4U f“ BzÑqÔw(»#D,.P†yÊ•<ÌùžñJ6Ö æ Y”ÌÞ¬ ¥˜àwA"hsÀédA˜EŒçžïßfìÛf)Bʺ²&+c%2 Nðl¹"Ìb滲Z•—ñmÚE®¤Ïv)—s"¤¶KùN‰hI—òw%BIЦüM9¯üUyAùV™¤¼•õ¬Ò‹Pv)%Â#Ô¾¬}6hVv(3ps畵ÊMÊÍuê&/VA½²_š“5G ¡úÃU¦zÔUÆ+ø™ãJ%NVdE9®•»•üõÕ<öêqe„Òª SÔå²cË í-“UÇ•!¸XšºJ¥2Û(¥âŽßˆ‡ÅŽƒbÇ&±c¬Ø1Zì(; ÅŽábG®Ø;2ÄŽÑ®µje­IkÐê´Z­FËk)zºöHô\0À¤ÄŽ^!Vž•¼Ú–)+iLˆ(ÑR „Â6®šVÏGªÃ§BõOø/3}¢CÝ"øÆ‘°µªgs…Gª#btF¸8P§Í uroކévÝY¡q³¡­IÌv÷"UÝ[ïIbutë=uuàXSæ*³Ž±”TUü‹¢!^®<®À5Oõ´u½HåP·¨\'bw&v;X·ƒu])á«g†ÂϤԅóX#šRWÞ3Ó3/Ô‹Ós•½ä'¬ª õrÙäHå 6ÎeWÔÕU#iT8dû# î«Nû”18(Ó~ Âñ$çSáíbpøT8ŸÃs \*ù ƒËbÂ9ÏAª —ê÷èѸëÐ;ÔûÆAY™+ —’\!¬Á!3ƒíumJ:Á9¬BpØŸÊ›3–M!÷²)s3ãS®M£½I'Èáø”ŒÃ\ãª}¶µ­Æ\•Mƒ«âÏêxÝÕᬙÕá24ª¢X‰žWEŽ Óë+#ÑS±Áa8XÊ9nppL’ ã5Ù¤F!Ÿ…ºÀ*Ü .t5ÛVÔÀ“¹0&Ôâ"Lê¤ä$šDZÜ!ÃŽq Y£‡€[«Ø<Ž”wKs_Fdþ¥´¯tª|©tJ_)”a[þ‹ý¯% ”xøÞÃú>(Àeðð§˜È³øófŒè8p'• £•$B.uó£>Å^ºeF Ï/Î×ÎdŸ9ÃÞX„±«I86²0ØÔÆ­Ö™¸Si‰ÐdÚ" C ņE–5º5úmôn£¨•t:Ñd–e£Åj“e›l´¥Á8ŒôúThÇi*©"µ‹"Õët4½qŽÁf”çÐL£Á‰±‡1B¾ &$J7I¯7°¯JÃeI Š[D*FÈ]Á¡ á³6ÛÉŒöÕZ•$Ú3 "N§èÄõªžC5"—X•|ŠÖO½ˆ1A}`ý”ßa­re`=N¸Yõ§zµVgØà€øÐﱂ²@)°¯]À"ÖJÕo†¶m|mÛ0W`£¬VZV›^{m›ŸäÛN‡³¨Ø–O|Ä?D#r‹HþËmçÏKzìdÿ»¯ößßXdœNôýêûç=Óû:wÃwU\͹gwý~+â`Nôs¾ˆC ^ NŸ›C2tzŸ!#{™D4¹ÚíõÞ¥^¾ ;KÏçfúœ2R}™ÎfÔå%fÙ:#ÊèHWœÄ9æ$Š~]žÂé!³ƒ8"ä?‚©¹¿ÈìI…ìköQ_45h±@ªœº2•K}‘®…bðcé L•?­LùKýùrë”>l!›••]è«?¿Í4,`BÅZRÂ2ÁÂbu–à_#/Í_XPTT\”^\TX0ÄïKÓˆCŠŠòóX´.rš»Óç·i4¢‰&ØùyEEœ|Ñ…{ŽM¿«ñ:2{R°²u­»½Ïüsïë«BîÑÉŽçÍ×ù¯_òãÛÇ55Î9ØpçôêŸl«»{¦Õ`J™4¢,=oq½üãÃ7T5ÏnîÿÛ¦š¼ ȧfY2n(™¼`þ3(»P8žÀ¤|ð}pI¢Çd)Heï­ÉXÐnyÚÒkÑ µäf”eŒO¨MX’ Yï%œÕžfÃMZ¹ätN£Ø(õ¡•F¦È³\º¢hD[&è\ŠY/y¬eÉ’s“Ë’k’¿N’“#ädÐ(\!EA·42$ÔÀ|¦*kÓ%‚¼_»˜YÏRÆì²Êí­ÿÄî*7«s-¨¶º›“QgÕו:ÈÞe}ç±b<'a„a܌ψáPOêëdXŽ‘)aâPCD›¨ÒÀZX JSAòzVÔîœüÀÓÖlºóº¦}9Y+Èíó÷.¹mþ‚ÅC‘/ÕŒýè÷üqïüÜ•­o‘ciÛïÝJo¹ëþ‡_hâÚüœ;ƒº®É¾4é! ïb^ÎlÙRP¢Ûa¡ó’šä[¥uò#ZAcw؇Jå$DCZ9Ý4SOÒ‡Ct ÒÞªèE·Âë!ä!à %MèO6‡À$›¨©:ed5cÙ¿ÔOQ¹õ‚|)Æ®¬%¹õçå¾óŒ-ñàx|gœ3­éìø¢Ÿ7΀œ·§âò¾Ÿüg;!O=ûfYuÊ}s׆BO;lo¼rî­#dÚÑWö·¶÷vûöíw!GÝ„§| 9Ê î…”è¹n<œ•r>ò•ÄiL|Š›k2DŒÇM¢ÃdO*úÆ›®7iìN’K¼ºì„ZÝ0ŠäéJªÉ8ݤËlFÅk— ¤H¢Ù¤³+To|Ç2¼#›ç›Wš÷™ys„¤÷ÊÁïñ÷’ Ud/±ã#Î÷g§/ÅŒ‹*l£JûzÒ¨ŸÇ“EUaÙx|&¥ˆ åä=ýÐ[{¿^ûÓÅkõ¿{¨xö“6,ºëÎEc—7Mx´ëã_¼JÆî;IGWE^Z¹eö–g¾Ûtï¨0 »ñ1©î†48Õ ^ă„Q‘d’¡úñcÛÇvÁEüÖ"+‡¡Ç'pևÂm z§—L‡ÃÚh¡ÆDL‰Øi6gCŒðœÆÚÈÖfçÚd´ÒÖ¶„ÉáÄ·"å²"BíÇœÒé¨mÖËߨfõËyfH™‚am”›ÜóªÅ,+efRîCvjaŠe@õ[Kä·DA.-13¬µ æÏ·ùŠó‹ÇPd-QÕ$b¾èãê_y2åIÅ•¿jaåÞyc ‹í®·SÞ~…{tçC-‹Æ¦üØU¸°uç÷Kö_Ï߉”ù$¥ü1‰‰ÕyŒ‡Ê˜ÆaAyW‰4Û¿Ø¿¥PÈ /¤ÖŒ„2(Ux‡#!ÛéÔéÜ™ÆL—ÛíÓ9Ñ2:I:€ŒKDè½Á|c®b]™NM¦bÔi”³Ë%¹Ý!ôYœˆ-ɹÙIg®s‹ó='?ßImj„f“|"ä½`2õìòï벿L‡ž Ñd:eSW óÏû.Ìo©o!Ÿ¢íüDî ¬ÿ¦¾¾¥UõSâjü¬Z©(_Ïp1¶Tq~¹U5´b;À˜s›I~MS᪜N :Lp‹‹¯’èâ|ÎDclk³;W´º‰Žzž¦eŒ˜z`Bn¦õž½O|øì—Ö’~ð_ëé­[zç~–º²¢.¼b÷òq·./n°ŒcqÌ.9Y»ë‡Ý$û‘Ÿ¹}ú¥eã6ÏpÓ™+ЧLßH4·Üñ£ñ»ßfgªéѨ ]ļe#,îQÆè5 X«Ž¤hŠ >­Pßr•Å9Ÿ-®>ÐOd†võâ#óî¼ÏsG϶”  ºgÍGózfÁì­#컇ޱ3½`ÜÒî7úG"ó^‡B’ŽxÆøƒäu‡¸ŸrŸqßr¼„¡LprîÈ‚i‹tVâ)WÚ+•NJQIƒ¡ O8D%.“Š¢'v6²áV#hÄL^‡XÅ›yIV±†z„}Ð…ÜŸå)Ô› øÕZtSø8ââH ´è‹ôðÁ)ÃÊÔפ2“¡öº«ý±QÓX/ŽÚ3±°úbS)Ãcurn¬vÆA%;M¢öºÜÞ²kÂÙº¢Q\Q±òBÜùaB# Wi§@ Á‰Øò9R8è¯ø¨ç#þ™3—m¼ÿò¯!nSTÜög7¤FØ"œ8-Q„\a¯pT8)D‘r\œOUÿ9QÇq70œNÂ{@·ÀY$WPþõ2>æÝÍ@ÃZk itYË`iÀ¦öLÉÅØCdCêöÇjD ’ÔQDıÍêçDzIŸõZÌ ¢î07è2ª˜jEn%EȘýï '¾«BÌ”c<¹µr™¼®ÊB²ƒ’®`oö ¾“Ùï9ßò}F58ñqI;šý‚SSiªÕÎ6]o]bÚœ­‘Hš6ÍT¨Í7Ui5Ùlã5F¹€šEiVÃ$ñÈ%hš¡)©©>Åc÷°QÙjõÙìv;°›Íž¡hÜŠÁ jM–’Êïìy?h´›%kÈ.ƒM¶Qô±—JŠœBu­È U؈TÎ ùŠ>¨ a<²b—mŒ©còËè(0«8¥‹XóêÖkDV­#>FC%aÛ0ÔÌL `ËumóŠN0¥@S™/ª*Áù/ÃÕíòz2ï­_¸5az÷­[»zî³+~¸ÞwSσòØ‚)OߘÖÄû¶Ô6ݰhá¦Ö-}³è˵¥ ö>Õ×GÏLT ‚ Ž>Ù¯‹kꤥ¾NK Eê£éÚ"Z¥­¥×–ÐuÚµ–g,'QA¿£}ËbâNÊk8êtª´ Ê%Í*­âJZÆV™Äu5!ýA ¥D“iph™²•"äù.CHÆ*ˆj›\QÙ/Ðè+Rr¢Ë"r"h»Š6®+Jšƒ¹µXµ`¥êlÕ1) ”•‚[>ïR5pãLÇ0ÎüüÄÂÒAŒ_ƒkÔÁ²üDãm{·õÜ“0±rLJùKyïŠE;WÞÜ·‘>± ·pܛ@/BwbÏXÛ ôGf¢?’ÄÂÈ!iHkN£!)ÁžÊÕÙç$Ô¦Ö*+M¹@Úä5ö ‰ëSqB²Â‹ÔèÍæä€ßëö€(‹Í"'®Jó/¾*šAŸUõV™åoA{Â\S›\;UÔb攎¡ƒü¢çúöÔ÷÷ýЭ§—÷t¬Õº 2AÙ}óì-…d)~çðÅwžïýð¯î~ðG¹ Æ/œÛ±wúcï¡ú‹~ÑßÄOÀóYÀ ßÓ*•Zþóœ„åfaTB¡RÉO1OL2øaæ@B1_jäHôbp:>™a Îµ–¬sÝM‚¿y5n—ß0’L Kåe.ÖK¬Ê¥8©ÅWŸ²lJ‰ÙwS1é-™`’<‰8?‘&F¨7˜Î¢fÉbAS¾]Õ¬2ó]'K–ÉÔ)¤éN¹ÊÕ"1WªþŸÍ4S¸õX_ˆÛêX lÁÈèJœŒ\‚L¢zV(ÕsdU(‹‡pqgjÀ—J ù‡”ú=3~óæ}jO6­í´¸[«;u[CåšÅãú›„—îo¬þí»û¿>8õÕ¾“ÜÄ[†Fæ?¿mÏÄÝïǤ›‹x6Ã¥à‰»KÚ£Ý-ñ£ÃxPûÿþ;Nã§™üHRD'uän"šÌ”ÓS³yÀIÂ@YGŸ9f„ÌMrHÌ ¡bƒá,|FŸ·šÑ]D©ŠÉµ²j“N÷’R4KßÔ«ŽNk9»4&voÜÔ˜œhMŒŽ˜‰ÉqªuWjܺÔÅݤÀ¿ôŒÊ,2 `™x@cQ‡"¸/gÆã3Šj&厜ÿfÉÞÿá†5C§ý¢ÿB-³ÍSQî8ÄW6|Ó£Ï2cL‰~Ð5ÇB760>æ},[íw?¨ÀÀëCzXà€µ—AU`c+·Ãu@ÐÈWqëôÛõ\–!Ý›æià==—‚– kž8Ó3lNÈÐDÅ& ÊP}Š'ˆ~gÉf¦DBæVIåvãvQë 9ƒf\t0ŒYÒ‡€CvÐsâxeXí+1‘n L¹Tßw¾›­Pµ ÞS°k ‹³„Xb×hsòÕ뚀­X ÑÕ{´ô!̵WíFìö"“¥»Ê¨þÙ=Ão«]»6=£ÿw™åo{óg|'¿eõ ËrR7ž-ªm|c[ä¶ÛÈrýÔ›«Ææfemp]9aÓ±Þ‡ ͵yyþÄ¢93o©yxîܹê=ÎWô>á0$Âö`Ö$óóó6óæGl‡¤pò©äÏmhRn3XõÙZgNo¾hA;Ð%·YO~°Ñ¤n{H2DhR—±Mÿ"MBfM ‘¤OÏFf•¥]'Eè®î¤‘Ý슼>péü%Ä+c7|ZÔ€“qO†¨ž³° ˜›¶bŽ…˜±Èœ|‘:öº›‚ÃoÛ•²«ø½é]©œY¥{î·fVú6ѦDØØ¿ig_O³Ã“†çÛ‚|µ†÷£ê®vkÝÒúãâqÝg Ÿ¸DI+Iwîr= > {–{Z£¢+v­×èÚ «]šl’+—X&Zø· £Ãmw -ÜŒäv¸™q´víp4ŽZ"Zк’£M³Bõn—NHÌt¸µ‚ì 9˜Ù3»Ben"»kÜóÝ+ݼ#™î$”pf1“ žá9+œ. \®P&PÁíœB¢nä+qõ7• í” —ØÅW V·æÌ%¾€UÅ1)¨·Üõ5J1É—‚õñ[¡bôã·EÅìB›óqî“onx(mKϽ։ã'ïnò:Rz>:tê—÷,)ßO÷ÕÍÎ--Ÿ´©¶¸œFGutÿt~#âÔgzÃõACбM'H½Ck]–~¤Q£ÕJF“I’6¢å̲œ/šì¢h2št¢Ìµf“I§“4Z籡f“MÿLºDNÐû p;‘YÎç^À -v9­^TXK,±éè9vW¡ŽÈükÚRUÍ[Šã‘3Ç®îÑÝe²£YXœ–]0ª³kšËB~ýRßÜ/,ë_òŒìöÎ]Æíûlï^îúËS­±ß+ŒúoÓÌÿ½D²ÿ­ô½Ÿ¹]ü>,ìÔ5_±$nÐ6J 5ëÒ1½¨_«ÿÜp_,…Òé‡ôCú!ýþßK±PM ècp¬"‰˜5ØšV9av-7yúøªŠë«g̬™h™7éŸ~$ÿÿíÃÃdµä~.:¢Q, +Ùɰ!˜•0fC-ân2L‡ñP…ñèõP 3Ð먉ýσÒ°[öÓ3 H3Æâ¨ÊSŠF:@ø·w¦½¶{.F¯ˆÑ—!ƒ™–Àÿj^ó3 oÀ¢ÿS™_s0W ñVa}æqz¬ Ù8y®»*ižr~{7úËôõý©øûÆ–k2C:÷ßЎц~º´3|ôÄ|sé·ZwŒ˜û[_=Éêž·>tù·}Kµ‡ÄËÈ+Ò-ÿ =’š endstream endobj 25 0 obj 8620 endobj 26 0 obj <>stream xœíz{|וÿ½wfô½f$–mi’md[FÙ&Vð'`À0Ø`ƒ &6¯Ç&Ž›â&æÑ$}d“þ’¶ "4Á°¿_ë’¤i¶›G›6Ýd»-Ý& Ù–†Í&ÝnÀ£=w$H³ÙÇ?ûù}>ñ™{î½3÷qî9ßsŽm„B&4€T¿hi8‚Ô+§ ËÖmnëMÕá½ëîØî«6ߺ~õ­ë{7lþ ñBB¤!Žßн{}ê}¾sØ;;ÚÚÏÿâì‹åUBc¬ì/× ¤]õé›·ïJÏ—€ñ¶w÷¬kKÕ}÷Àxe›Ûvõr¥†÷hãím›;Òï—ÁÃÓÛ³m{ªž7ö÷níè=³ýQ¼ÿ5XÓ«Ü9äFñëž7\l¹ÐF„’ïÑZò¢ú^éN¾ ³ÃûJWò"÷ŒôoÉÔòÝäïÑëÒ¥é?»° Ã?ÀÇÒ|¶©Ôñ>ìªE\rgòLò új¾!ùhò ù&“uÃ@»Ñ^õK9Œ· ¾ÞŠÓ‘ðj|ÏÆÿ0 è=ü8n@¿ÂèN˜ï\Žg@ù¾ý5  &Ü‹êÑ·Ñóø0fÑ!tÛqwc¬î4>Ž q ®ÀèO°žqüX!gÑsÅ‹c³gE#3‹Â…ù¡y¹9ÁÀtÿ4ÙçÍÎÊôd¸]N‡d·YEÁb6 ¼^§Õp,C0ÊÇ WEÓ)·6ä‘e¹¹ ]ϸ±ž`‡rY=²_Œ^{Ëó™¯2?SÏúL=ûZ}aÙÕþŠJ:ò)TýÛ²%°=è4ØvL•þ¨ª}£¿ª+á®hom…/*ý‚/Q}9¬®%=ö)_á¯èà òÑ)Þ¬8x·÷®ž‹U†TWÍ9EÎTŸ°†$PEic"~¨%Œ=¶O{Æ“÷^ß…à³)ΖâpBS‘Ъóúºñ¶:ä;•?1r︀ֶ†Œíþö¶U º6Xã)Ī:¨ «(µvú, ®><Ðâ«êôø©8ª:[á鯄¯>·šõMä O eUB %æÃóï|ÇÃŒT¹º|´:2rÀ—øÚâ¦ë{eúlnnvÁ‚Gªü0 VµqlÅ.ÈOí)-€öÖtÎmtU}#‡:ÔµÞ«®A}µª“LüPÛöâÈHU»¿ª½­}^j‚ŠD¼A-PÊ&u ½ÊætSúèaÕžÖÊf9%ïº%Mtmþ¶JOê䯵´¦[ ¡jªÓGWP $|ë| ´¤É¯–ÐGG YW¢êÜŒá«úO¿JpÁïù%p«ÿÒïoliK·hÂLj²ÕþêÖ‘‘j¿¯z¤u¤m<9°Öïü#§êêFz«ZaÖú&øj´Öó Š‡Cp­´gbªGj¤=S=×>oõÃ,ßAÔ£I ]ðÚEpت:ç$°ã º;Rý [Eã!Í)ŽxÊñ!0ö²„3|nháuB%¸Š¦ OY³Oèñ-õ×-^єڅa@ÿW'÷ƒƒ}IÙ¦l7 ¨“_µÐòú•¡•ˆCiPCÛ=É$ødÏÎÞåÈÚéȼÃáÙáÈØîpos¼vûk=äÈí=¤×1®Cñ¬¬î‡3³»Çéééîï&Ý=îM·;<›nïßš±ÑNßHf­ï²K™ë»$Ï‘õx}—»£Óîñ©?3p&qæÂÎÛ;:‡¶dœ¨øD>ôÐ(Ða C@Ã@€†€öõõEîÜÝî}j(âý? £÷d"â=dIà'D¼÷ï‹x Œã‡VÙ½'€ŽµˆÞ1 V‰ÞQ g‡fxŸëŸá=¼\ç=´Üé:Ðäô  ô ôìcö-½ý@}@¯5ýª‰¬k½k"-+Eï* ¦eVïr òe¸­ÑämЬ„Ç2 ø §XrÅ$i¶d%Y¢’1"égJš"‰ K¨PÊ/°Ì™só,Áóô€ešßì“-Ù^³'3Ëärg˜$‡ÓdµÙMA4Mf£ž75Z‘a9#ÂÄh±àrËK¿å¤…]„1‹4Œç&×2GçeJu^T¢óÖGqÂZ‡êæ%lÊ¥óÑPÎ’D$T—Ðׯl:…ñ}ÍК Ç1à{pœ@a­X±²i»i÷еgÆC‡=é²¹9”•ØU·´)ћ՜(£ÌýYÍ(×¶mÛC_pág«ºU†RoãPŠQ¹Ð¶©×Rmj}ÛŸ£À4©×Ô[Û®Dö˜zᔞn±}É<Ðx¢Æ^ ê ÝZ„fвE™EW}ÌÄÕ8‡® ;Am§WYL^¸Ë„ŠâÙÇMß`H¬gvêèYŒ¼H÷ Öj¹z6„[&#á²É2T^>³·´à(Ñj$ÁæçñìYVüš28gæ”ó<ν¡üò?¾¤+Ygý¿&ñÁÎêa¦§`¦åÈ@ã© §óïUÚI"&æ÷hx.=Å[9½FÃëõdˆçC:ßAB¡ð¥Ò° [KQù¥rkéÌ"›,Ú5Úœ¹¸Ø¿Ÿþò¹5Û—s¯ã•Sgß\òLlS-D†ØŒAž¸€žb¬dˆa8’eRCÂXê@2Œ Ü†+ðN^$å°RÄ] yä; ²3€HK7êÅ& ·DQyYyÙ®0t ïIûqÏëÊý¯ro|"ÑShH¾ÇÉ ’\/ÕZösư̂ܛÆ?ŠLÌ\mÇ?Äl1Sb"Y'­ã„É1láËù#<ÃË|± #ê&°ÒP¸…®¶üR‹*ü-6É‘l‘0Ó‚9AÑÈ\<[ú§ipžõàwwUIyʇÊsgß©}~pÝê¹+CëÖu¬ ¿Áâ…µ;ö-{ìe‹rß[c÷“ÊÅW–ÿß—ðô—_½Æ@ƒ®ÂڳЦ³ÈšüS\2™cL†‹c3Í&ªÍ|»ãÉËñ&Klƒïæp&“Á¹8à­vØâ(wq0¯£‡˜†ÍfœéN¢©½DâÕYÚÒR7 —ŠÎÒÐÌ¢<³`³è&´¹$ÉÆœ³keöê•9ÒÏpàtûºº…ëD¥Ó5ðþ«?ÿ`ø‘×ö,-!{ŸÅåo Ì­X³v¯üíïoXû£»öô¥ÆÊbªg5p 즽uûËq ¬Ù¦ƒ-MÏçƒ~OÜèiQŒÑ2ž§7Æ‚'âr½< ß/'ä ù‚¬•elk'‹óO°Z§Ëå9as[Æ“: iA §–˜“Jƒæeó–é~:X‘ÃCþÿý~ÆïÏvå kã)¦Õf[,å–#ÆRdé!hc×°3ìTûšŒB—Dki¸%K[(F¨’ ò‚öK¡µÔ ,H…p 6=êc©´N*53öO+Ä9lÄT‘jmŽ)Vƒ¥ôañìŨ³«± vñþ«¯üð½±\|ÌÕ±pÉæ®E Ò4[ý¦úꚬµjü…7]óå9RfÁë~׿úÙáØž5»Ú×÷º°Ÿ[_]Q¿4^µ8Èú(îäÅÝÌSå | û”ÖJ4CŒV«ãÓiUãS¡äRyKÚ¥kVÄ•Î?‚1Â8Ÿqÿ™¢ eBÆÔ¯aÉ&óVr‡†Õ!»`'öQ!P¸?ÀxàõÓdeŽ"&kÔfíÕí4«eå>CŽ¡‡Ø³úmAÛ&ód™*ëÉÒU ©D·l½ÔRJ-Ì&G ‰Òj´)õƒÛ/§ÅÂâsŒ©ÿéoÇ:¿2¶qUé¶‘«â—_ܸt醾·£uÍÎßrç~òÐÝ-s§ÏÞ»õ¹Ù²ÅÎì©­Š×\ýæÒê[Q½|äu;ìŽAÁ¸ë÷G0Õ„Á€Tý·Rm¢Â¢Æ_žZ—(? ÌáÎ}RMG8 òɆ8ä[Cବ–í!¤ŸÓp›RÐA·—’²(Å/’ç¯ìâÎ]9©ƒïGÁV |oDÅͶëx~×á?ìÁ>êËj“9‹ò r¾û,â“ã^=“¢VŒQ8„‚3ŽúýÑ`\oˆÇ´B”  °4:ævX¥"Ô”I2›ËŒÆ˜Uò‰æRs'Aƒ f–d®¿~ÑɲÒRhý¥ü€m^$ A À/Q<,R…:ÑîpÊuÔL§ˆŠcÐW¬"ž«Ö+ÙSÞÿAÙãXº°ä…­g~¹`V™Í§Üí4këuùî‹óçï݃·Î]ØÉÁµ +÷ÊÓ*n©Ü1“¼š·~GÈ;-ï–‚Çë”P]ã¼¼Pámr~bßî… ƒ…ìº2Ÿ[y7Û)ûäE7Ï[s+µË w—-‹—”pÅb·\d!;±Û‹$,I®1QÉ¡ì1ÎQŽJør‰‘ívÅ4ÜE<ƒàÿ×§ $Ò’‚þ°ª€S4 àÌðÀna¯±ëu‚ê óô}é7'Ÿüõ£«Jòî«Ûy³X,VöY×Ôwôím­ßŒ¿š¿ûÔÚòÃß}ä±ÍõýÞ™çNG+«F<¸„žwMò"ûà‚À†¸á&v%KÀþí1‚ʘ$ÈâD$™ϘÖA$^æÀ KŒ§Æa÷J¬âx˜Nâä³§v4IÏ6DÏn8Pø³†-‰òlõÉlÁJV´©®*µ#ö-e°~^S÷[ïN>¿æ¡2fãâù­ëjvR$|¤Ý_ˆüë°+ÇW¯®êÛsÇ¡»wߙމz.8‹–¸“ŒâŽø°ï(Øqfô3sÌ.pTY©Bsc&G‰ˆ}n¬äy÷ š†ºȹî8`ÁôD¦4s ¨fiÖ/«¶ ÚÇ9N ÂÙ@”ÆZ¥=PCÎqõuÃŒ›Ö”Åä ]¥\ý—7>ü*.Çîw°nDYkÜÐÐ6'Àã§×UeÛŠ_;´3'ÿ ÏQ>ùÉØëo+Zš%€[lDs¡Õñ€h±êNÚ±=®7ÇìcL´Ç±ÎÂIàpE‡ÃñZº·ÓNWL-ÁþÔ€‰Ä EÁG"a¬ÁM”CöÔ"Ó€Vôþýbtö,‰9µjT¦!ñóç•ÎãÇ3o;´ÓßÔñ¸ì7'YrÏ(ºåáu7»ÿh ä:(n(‹Ù_€ô§£"47oqÄ¿ÄOTƒ¦SU2R:r3Ìf“ºBGŒ–ÏéZMÖ©ˆÌ:¦ËÌË(“déÊÎ&($ ‘é$æAƒ!0˜=3ûSSÁ#|©|’žQ()M£ª&‹N;¢—‚Ø›±ª|cUíÃöO£%f5îÇߺW™ø€àCoAeÓò²²Õ›6ØrùüÞ¯W+ûÖÖߺ¡{áÂ6xU ·?Û™øº}ZA±ä]½ãëó}‘s÷¼õ'Ì6´)_ÞÖ³mûö=[(Jì(û—jt³XKOvê`3<©ÒéTËx–^ˆd>ÆÁéó6‰ÒKúN‚­C6»­c*–¡ùHù¤H+¤ú{ %8Ô‰ò|léc½ßøž²aAÅ‚UJwnòe þæÇ“-¤¦}iï¨B¨ÅŒÀCV£-Ê;Ü!kÑJŸÕC:þ4ˆÁÇ”.JÜ9åwýWÞ†]_æaˆ‘þ<KÇ'Ã4SC›´l@slèÖÓg8Ì_'gæ”XÌSb±|žX.•Þ(–:ô9bÙÓøtß“×ÄŸڸòåŸÜ(êM°r£HÜ3ìg än*)"ŽI‰è'ñ9z›ÀÙ°"Aa˜'YÎβœH0>€DØ´¨wQ´¡Æ=²ÕEƒY•-t™Çô™¢ä@#ªùÊ6{ì{,^Äžd +bù=æ£1²…Ó·h|\ $NzÉaȧ%䤂ˆ„ñ!*¤TœQQ Yé/zÔô× ù/G``0Eàôï%¨4Rq CÕ§˜ÃOÿý𨲲¦nã[M㾦îšf/ÈåfHóGÏW¶ºpfæ¼F–ó¹w-jPïA¸¿‚ž§¢ÆIÙ wÇgîŸÞpLoFb†>½Ù¼/¸¿Ï~Ÿ“¹ýÜ4UšŸj½Úùê½îojÿY·î‡ô«ôOëß׿ÏßÅßeàÿrÿåþËý—ûëVÿ¢–ú«²ºH”m“÷štp* cé³üwx Ê endstream endobj 27 0 obj 6487 endobj 11 0 obj <> endobj 13 0 obj <> endobj 15 0 obj <> endobj 17 0 obj <> endobj 10 0 obj <> endobj 12 0 obj <> endobj 14 0 obj <> endobj 16 0 obj <> endobj 2 0 obj <>endobj xref 0 28 0000000000 65535 f 0000002834 00000 n 0000048021 00000 n 0000002766 00000 n 0000003199 00000 n 0000003051 00000 n 0000002882 00000 n 0000002606 00000 n 0000000015 00000 n 0000002586 00000 n 0000047237 00000 n 0000046237 00000 n 0000047433 00000 n 0000046452 00000 n 0000047629 00000 n 0000046747 00000 n 0000047825 00000 n 0000046970 00000 n 0000002956 00000 n 0000002986 00000 n 0000003346 00000 n 0000014160 00000 n 0000014182 00000 n 0000030896 00000 n 0000030918 00000 n 0000039623 00000 n 0000039644 00000 n 0000046216 00000 n trailer << /Size 28 /Root 1 0 R /Info 2 0 R >> startxref 48216 %%EOF ntop-5.0.1+dfsg1/docs/KNOWN_BUGS0000644000000000000000000002451507512622532014575 0ustar rootroot _ _ _ | \ | | |_ ___ _ __ | \| | __/ _ \| '_ \ | |\ | || (_) | |_) | |_| \_|\__\___/| .__/ |_| Network Top -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- v2.1 (Jun 2002) B1. https:// & tcp wrappers If you compile ntop with tcp wrappers and attempt to access an https:// url, it will fail with "Jun 11 14:22:52 www ntop[22622]: warning: can't get client address: Bad file descriptor" in the log. hosts.allow: ntop: 192.168.0. hosts.deny: ntop: ALL No real clue why - the code that ntop uses: { struct request_info req; request_init(&req, RQ_DAEMON, DAEMONNAME, RQ_FILE, myGlobals.newSock, NULL); fromhost(&req); if(!hosts_access(&req)) { closelog(); /* just in case */ openlog(DAEMONNAME, LOG_PID, deny_severity); syslog(deny_severity, "refused connect from %s", eval_client(&req)); } else handleHTTPrequest(from.sin_addr); } is the same as the code used, for example, by sshd. It's the fromhost() call - without a value set there, there is no file descriptor set, and the hosts_access() call is then "properly" rejecting the request. ======================================== B2. https:// & Opera With fixes through 25Jun2002, this works, albeit VERY SLOWLY on the handshake. Sometimes as much as two minutes. After that, clicking around through the ntop web server works fine, but it is also subject to a noticeable delay bringing up the png images. However, some versions of Opera (6.03 under Win98), give an SSL error and no results: Jun 29 08:17:31 localhost ntop[17731]: SSL(read)ERROR [Thread 17731]: error:140EC0E5:SSL routines:SSL2_READ_INTERNAL:ssl handshake failure at s2_pkt.c(142) Sometimes with tcp wrappers enabled you get errors: Jun 25 12:17:37 tigger ntop[26664]: SSL(ssl_init_connection)ERROR [Thread 26664]: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request at s23_srvr.c(390) Jun 25 12:17:37 tigger ntop[26664]: warning: can't get client address: Bad file descriptor It's unknown - but suspected - that this last case is the same as #1, above. ======================================== B3. sflowPlugin.c will not compile in single threaded mode (it uses queuePacket, which is #ifdef ed out in pbuf.c) ================================================================================ ISSUES - not bugs per se, but worth a comment... ================================================================================ I1. https:// & Netscape 6.2.2 et al Hangs the ntop web server thread. It goes into the ssl_accept() routine and never comes back. ntop continues processing packets, but there is no way to retrieve data or softly shutdown ntop. According to openSSL, it's a problem with Netscape not handling a legal combination of flags on the handshake. openSSL 0.9.6c (or d?) is supposed to have a work-around for this. Both sides (client and server) are waiting for the other to finish the handshake. A partial fix is present in the final code, but disabled by default. This uses a watchdog thread to detect the hang and cancel out the connection. It means that the offending user gets nothing returned, but at least the ntop web server isn't hung. The fix is enabled either by the ./configure parameter --enable-sslwatchdog or the run-time parameter --ssl-watchdog. Testing seems to show this is not necessary for: Linux / konqueror 2.2.2 (under kde 2.2.2-2) Linux / mozilla 0.9.9-12.7.2 Linux / mozilla 1.0.1-4 Linux / Netscape (Navigator) 4.78-2 Win2K / Internet Explorer 5.5 Win2K / Netscape (Navigator) 4.79 Win2K / Netscape (Navigator) 4.61 (oh the things I do for Luca...) Win98 / Internet Explorer 5.5 It is necessary, but the fix "works" for: Linux / Galeon 1.2.0-5 Linux / Galeon 1.2.5-3 Linux / Opera 6.0-20020225.3 Win2K / Netscape 6.2.2 Win2K / Opera 6.03 Remember, saying it "works" means that the hangup doesn't kill ntop's web server for other users, not that the user of the offending browser will see anything meaningful. Galeon gets farther, but still hangs itself up. Recommended: If you aren't seeing the problem: don't worry - be happy. If you are, try running for a while with --ssl-watchdog If that seems to fix it, then compile with --enable-sslwatchdog ======================================== I2. SIGPIPE - primarilly under gdb in Win2K environment. The problem is that Internet Explorer (and other browsers) seem to close the connection when they receive an unknown certificate in response to an https:// request. This causes a SIGPIPE and kills the web handling thread - sometimes (for sure, the ONLY case I know of is if ntop is run under Linux gdb connected to from a Win2K browser). This code simply counts SIGPIPEs and ignores them. However, it's not that simple - under gdb under Linux (and perhaps other OSes), the thread mask on a child thread disables our ability to set a signal handler for SIGPIPE. However, gdb seems to trap the SIGPIPE and reflect it to the code, even if the code wouldn't see it without the debug! Hence the multi-step code. This code SHOULD be safe. Many other programs have had to so this. Because I'm not sure, I've put both a compile time (--enable-ignoresigpipe) and run-time --ignore-sigpipe option in place. Recommended: If you aren't seeing the "mysterious death of web server" problem: don't worry - be happy. If you are, try running for a while with --ignore-sigpipe If that seems to fix it, then compile with --enable-ignoressigpipe -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Older bugs (v1.3) - Unknown if these are still current -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- KNOWN_BUGS ========== O1. Linux Sockets Bug (Platform Linux/i386) [Alan.Cox@linux.org is aware of the above issue. Status: no reply] Below you can find the packetLogger code that can be used to reproduce the problem. Suppose to have host A (MAC Address 08:00:69:0B:6F:A1) and host B (MAC Address 00:20:AF:73:C6:2E). Host B is an i386 running Linux 2.X. No matter what OS runs on A. Now start "packetLogger 08:00:69:0B:6F:A1 00:20:AF:73:C6:2E" in order to filter packets flowing though A and B. I suppose there's no other traffic (e.g. telnet) between A and B. Now from A do 'ftp B' and transfer a file C (large, e.g. > 1 MB). Stop packetLogger, look at the # of packets and restart it. Now from B do 'ftp A' and transfer the very same file C [if A and B are Linux boxes you can start packetLogger on both hosts]. You will notice that in the second case you've lost many packets whereas in the first case everything works fine. ======================================== #include #include #include #include #include #include #include #include #include #include #include #include #include struct ethernet_header { u_char ether_dhost[6]; u_char ether_shost[6]; u_short ether_type; }; char* etheraddr_string(const u_char *ep) { u_int i, j; char *cp; struct enamemem *tp; static char buf[sizeof("00:00:00:00:00:00")]; char hex[] = "0123456789ABCDEF"; cp = buf; if ((j = *ep >> 4) != 0) *cp++ = hex[j]; else *cp++ = '0'; *cp++ = hex[*ep++ & 0xf]; for(i = 5; (int)--i >= 0;) { *cp++ = ':'; if ((j = *ep >> 4) != 0) *cp++ = hex[j]; else *cp++ = '0'; *cp++ = hex[*ep++ & 0xf]; } *cp = '\0'; return (buf); } int main(int argc, char* argv[]) { struct ifreq ifr; struct sockaddr sa; char *device = "eth0"; unsigned long packetNum=0, totLen=0; int fd; if(argc != 3) { printf("Usage: %s \n", argv[0]); printf("Example: %s 08:00:69:0B:6F:A1 00:20:AF:73:C6:2E\n", argv[0]); return(-1); } fd = socket(PF_INET, SOCK_PACKET, htons(ETH_P_ALL)); if (fd < 0) { printf("Error creating socket.\n"); return(-1); } /* Bind to the interface name */ memset(&sa, 0, sizeof(sa)); sa.sa_family = AF_INET; (void)strncpy(sa.sa_data, device, sizeof(sa.sa_data)); if (bind(fd, &sa, sizeof(sa))) { printf("bind: error\n"); return(-1); } memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0 ) { printf("SIOCGIFHWADDR: error\n"); return(-1); } /* Base the buffer size on the interface MTU */ memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); if (ioctl(fd, SIOCGIFMTU, &ifr) < 0 ) { printf("SIOCGIFMTU: error\n"); return(-1); } while(1) { struct sockaddr from; int fromlen, cc, len=0; u_char bp[2048], srcHost[64], dstHost[64]; struct ethernet_header *ep; do { fromlen = sizeof(from); cc = recvfrom(fd, bp, 2048, 0, &from, &fromlen); len += cc; } while (strcmp(device, from.sa_data)); ep = (struct ethernet_header*)bp; strcpy(srcHost, etheraddr_string(ep->ether_shost)); strcpy(dstHost, etheraddr_string(ep->ether_dhost)); if(strcmp(srcHost, argv[1]) && strcmp(srcHost, argv[2])) continue; else if(strcmp(dstHost, argv[1]) && strcmp(dstHost, argv[2])) continue; else { totLen += len; printf("%5d\t%8u\t%s -> %s (len=%d)\n", ++packetNum, totLen, srcHost, dstHost, len); } } close(fd); return(0); } ======================================== O2. iPPP (Linux) [iPPP guys have been informed. Status: no reply] ntop works with PPP but it presents some problems with iPPP (ISDN PPP). Some packets cannot be decoded properly. Tools other than ntop (e.g. tcpdump, ethereal) can't handle such packets either. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ntop-5.0.1+dfsg1/docs/README.Suse0000644000000000000000000001001507414541016014720 0ustar rootrootInstallation on Suse Linux ------------------------- SUSE 6.0/6.2/6.3 (others not tested) have a buggy gdbm binary. IT WILL NOT WORK until you recompile the gdbm library. Without it, you get - segment fault at the first name lookup (does not occur with -n option) - segment fault on starting of ntop, if db-files exists QuickTip: Until ntop 1.2x is not included in Suse I will maintance suse-ntop support under ftp://accordata.net. There you wll find precompiled binaried for ntop and gdbm. Install ready to use binaries: 1) Download the good.gdm*.tar.gz and copy the files in the same directories as they are in the package. 2) Download the *.rpm and install it: YAST: Install with "Install Package" and choose the downloaded package MC: open the RPM and execute INSTALL RPM: run "rpm -i RPMFILE" If you have trouble, you may have to deinstall a previous ntop installation or use "rpm -i --force RPMFILE" 3) use "/etc/rc.d/ntopd start" and "/etc/rc.d/ntopd stop" to start/stop ntop 4) To start ntop at boot-time set "START_NTOPD=yes" in /etc/rc.config All what to do to compile and run ntop: First you need libpcap in your system, make sure that is is installed: ls /usr/lib/libpca* Suse 6.2/6.3: libpcap is found in "d1 - Program developement" (take libpcapn) Suse 6.0: I have compiled libpcap0.4 and included in the good.gdbm package Recompile libgdbm 1) Install the source from the CD with Yast (1.8.0 if exists) 2) unpack /usr/src/packages/SOURCES/gdbm-x.x.x.tar.gz to /usr/src 3) copy the diff in this directory under /usr/src/gdbm-x.x.x.x 4) change to /usr/src/gdbm-x.x.x 5) run the patch: patch <*.dif 6) run: ./configure --prefix=/usr 7) run: mkdir shared (only needed for gdbm-1.7.3) 8) run: make 9) run: make install Using SSL ntop1.2a11 will provide SSL mode if "openssl" is find at compilation time. At time of writing ntop-cert.pem was password protected and this conflicts with starting ntop at boot time. To remove it run: "openssl rsa -in ntop-cert.pem -out ntop-cert.key" This will generate a key without password. Add the content of ntop-cert.key to ntop-cert.pem and remove the encrypted private key from ntop-cert.pem If you use your own key you should replace the pem file in /usr/share/ntop after installing the RPM Building ntop 1.2aX: 1) Install the source under /usr/src/ntop-1.2aX 2) change to /usr/src/ntop-1.2aX 3) run: ./configure --prefix=/usr 4) run: make 5 a) Installing with creating an rpm (prefered): run: make make-suse Install the rpm found in /usr/src/packages/RPMS/i386 with YAST or mc This install scripts in /etc/rc.d and adds variables to /etc/rc.config If you have trouble to install, try "rpm -i --force RPMFILE" or try to deinstall ntop with YAST (package "n" - network) After you have installed the rpm, enable ntop in /etc/rc.config by setting "START_NTOPD=yes". Reboot or start it with "/etc/rc.d/ntopd start" To stop ntop use "/etc/rc.d/ntopd stop" 5 b) just install run: make install The ntop binary is copied to /usr/sbin/ntop. No other things are done! Run WEB-mode with /usr/sbin/ntop -i eth0 -w 3000 -P /usr/src/NTOPPATH Using NTOP with a mySQL Database: If using the RPM just edit /etc/rc.config and set START_NTOP_mySQL=yes and of course START_MYSQL=yes The startscript /etc/rc.d/ntopdb will start at reboot and create the database NTOP if not exists. Without using the start-script, you first have to setup the Database: run: mysqladmin create NTOP run: mysql NTOP /dev/null & 05.02.2000 Ralf Amandi Changes: For ntop1.2a13: none For ntop1.2a12: Startscripts for ntop-mySQL-log. To get the right start-order I moved S20ntopd/K20ntopd to S22ntopd/K08ntopd. You might have to delete old links in the directories /etc/rc.d/rc2.d and /etc/rc.d/rc3.d For ntop1.2a11: Modified "make make-suse" that it does not depend on the ntop-version. Removed the links in packages/suse6/sbin/init.d/rc*.d and put this in the Makefile Added "-d" to ntop call in /sbin/init.d/ntopdntop-5.0.1+dfsg1/docs/BUILD-NTOP.txt0000644000000000000000000001572311424003003015274 0ustar rootroot Quick Instructions ================== 1. Get and install mandatory packages/tools These instructions assume your system is already provided with the normal source compile tools. Most are gnu packages, available through http://www.gnu.org or your favorite prebuilt package source. Using their RedHat package names, these are: - glibc, glibc-devel, gcc, cpp - Some version of awk - libtool (1.4+) Note that there are reports of success with libtool 1.3.x under FreeBSD so the script allows this. - m4 - autoconf (2.53+) - automake (1.6+) - gdbm, gdbm-devel - libpcap (http://www.tcpdump.org) - librrdtool 1b. Optional packages - openssl, openssl-devel (http://www.openssl.org) - zlib, zlib-devel 2. Build ntop - cd ntop - ./autogen.sh - make - make install 2.1. Cleanup older versions. During make install, ntop may report a couple of things... | Cleanup of old database files... | | ...Deleting /usr/share/ntop/addressQueue.db | ...Deleting /usr/share/ntop/dnsCache.db This is normal - since installing a new version could alter the formats, we just wipe them. ntop will happily recreate these next time and store data in them. |NOTE: ntop can show traffic by AS (Autonomous System) Number | | Because this feature consumes a number of MB of memory, | the datafile is not installed by default. | | Which, if there is no file - from this or a previous | install - effectively disables the ASN feature. | | To install the AS data, type: | |# make install-data-as Means pretty much what it says - ntop doesn't install the files by default to conserve memory. The file wasn't found, so you are being told how to install it. | There appear to be old shared library files on your system. | You may wish to delete these if you are no longer using the | older versions. | | To see the list of files, run | |# make listlibclean | | To delete them (you will have a chance to abort before the | actual delete): | |# make libclean Again, means what it says. ntop uses the ntop version number in the name of the various .so files (e.g. libntop-3.0pre2.so). After installing the new version, ntop found other versions (e.g. libntop-3.0pre1.so). If you aren't still using that old version (tough since make install overlaid /usr/bin/ntop), this is how to see what files make install things are bad and how to delete them. 2.2 Build a static ntop Sometimes you want to build ntop statically so that both shared libraries and plugins are included in the main program. In order to do that you need to: - cd ntop - ./autogen.sh --enable-static-plugins - make sntop The final binary is called sntop (static ntop). 3. Run ntop (See 1STRUN.txt) - /usr/local/bin/ntop -A -u userid -P directory where userid is the *nix userid you've created - with minimal permissions - to run ntop directory is the directory path where ntop will store it's databases - /usr/local/bin/ntop -u userid -P directory ...other parameters... Compile problems ================ First off, READ the output from ./autogen.sh - many issues and problems are reported there. If you ignore this and blythly try to run make, well, things might be broken. The most common problem is an inability to find critical libraries such as libpcap, libpng, etc. The problem is that across the universe of *nix systems, libraries get installed in many different locations, making the Makefile incredibly complex. Starting with 2.2, ntop no longer goes to extreme lengths to find the .h and lib files. 2.2.1 continues this evolution, to the extent that if a header or library isn't in the standard locations, you MUST tell ntop where to find it. 3.0 adds the common /usr/local directories (e.g. /usr/local/include and /usr/local/lib) to the places ntop looks by default. (Note that standard locations differ across systems and may not include the common installation location for packages on a particular system, such as /opt - consult the OS documentation!) You have two choices... 1. explicitly tell ./autogen.sh where to find them via a series of --with-xxxx-root=dir parameters. Note that if you give both --with-xxxx-lib and --with-xxxx-include, the --with-xxxx-root is ignored. If you give --with-xxxx-root=xyzzy, it is equivalent to giving --with-xxxx-lib=xyzzy/lib and --with-xxxx-include=xyzzy/include. 2. Use the LDFLAGS and CPPFLAGS variables, e.g.: $ export CPPFLAGS="-lm" $ export LDFLAGS="-L/opt/lib" $ ./autogen.sh ... $ make which adds /opt/lib to the loader path and libm (math library in some flavors of *nix) to the list of libraries. Notes ===== ntop 3.3 (3.2.2+ development) Any parameters specified on ./autogen.sh which are not recognized are passed to the generated ./configure: $ ./autogen.sh --help Starting ntop automatic configuration system v0.2.0 Please be patient, there is a lot to do... This script should help you to configure 'ntop' Usage: autogen.sh [OPTION]... -h, --help display this message and exit -v, --version print version information and exit -d, --debug enable verbose shell tracing -p, --purge purge all files which are not part of the source package --noconfig skip the ./configure execution Any unrecognized options will be passed to ./configure, e.g.: ./autogen.sh --prefix=/usr becomes ./configure --prefix=/usr To see the parameters which are available on ./configure, you must first create it, by running ./autogen.sh with the --noconfig option, then run ./configure --help. ntop 2.2.1+ A frozen version of rrd is in the myrrd subdirectory and used by ntop. gdchart has been replaced entirely by code in graph.c Graphics are no longer optional. We no longer include static versions of the helper libraries (gd, libpng and libz). Instead we use the installed versions, hence the 'increase' in the # of required packages. ---------------------------------------- Luca Deri - January 2001 Updated - June 2002 Updated - October 2002 (new ./configure scripts) Updated - January 2003 (automake 1.6+ vs. 1.5+) Updated - July 2003 (2.2.1+ changes) Updated - March 2004 (3.0 final changes) Updated - May 2006 (replace ./configure with ./autogen.sh) Updated - April 2008 Updated - July 2010 ntop-5.0.1+dfsg1/docs/RedHat-rpmbuild-HOWTO.txt0000644000000000000000000005404610224241642017553 0ustar rootrootMaking and testing RedHat rpms for ntop Burton M. Strauss III June 2002 / April 2005 =============================================== ==== W a r n i n g ============================ =============================================== First off, this is information on how I personally create rpms for ntop. It's actually quite simple, but some of the details will refer to how-tos for other programs. I use a PIII-800 w/ 128 MB of RAM, named "tigger", which is running RedHat 7.2 updated to be reasonably current with various packages. tigger is also my ntop development machine. All of which is irrelevant for the purposes of creating rpms! NB: Jul2002 - I upgraded to 384MB - found a cheap 256MB DIMM. Performance is a lot better, but nothing really changes. NB: Apr2005 - Tigger is now dual P3-1000 (SMP) w 832MB of RAM running Fedora Core 2. The underlying platform is still largely irrelevant. You have THREE basic choices... 1) UML (which I used for 2.1 and earlier) 2) buildmeister (which I used through 3.0) 3) VPC (3.1 and following) Most of the UML setup was done by trial and error - there may be a better way. But it worked well enough for the purpose. However, I don't always know what I did or how I got it to work. If you have questions about rpm or user mode linux, don't ask on the ntop lists, ask the rpm or uml people! Also - one real warning... REMEMBER WHICH MACHINE YOU ARE ON when issuing commands! It's likely that the rpm won't build right on the underlying (real) computer - I once spent three hours trying to (re)install things and fixing things because I was trying to build on tigger, not ur-tigger! ALSO: DO NOT SHUTDOWN THE REAL MACHINE THINKING IT IS THE UML MACHINE! It causes BAD things like file system corruption to the uml machines! Trust me on both of these... I have not updated the UML instructions since 2.1 days. But it you go this route, all of the changes in ntop on a native machine still apply. ============================================================================================== ==== U M L =================================================================================== ============================================================================================== =============================================== ==== E n v i r o n m e n t ==================== =============================================== Building rpms works best if you are running as root. And on a system without complications (other services running, etc). Accordingly, I've used User Mode Linux (uml), which is available at http://user-mode-linux.sourceforge.net/ On tigger, I created two uml machines, called ur-tigger and ur-tigger2. Both are RedHat 7.2 machines - just follow the uml instructions. You may find it easier to use the prebuilt pristine filesystems available at that site. I did. I found that I had trouble with the rpm database, and I rebuilt it using this procedure: http://hermes.afaa.asso.fr/users/pascal/linux/rpm-rebuilddb But you should be able to download a working, pristine version and not have the problem. I then stripped them down so that ur-tigger is really just a development machine - no extra services (it runs ssh and the development tools). And ur-tigger2 is a basic user machine, such as one might install ntop on. Using uml and only 128MB of ram, but with a PIII-800, it's not fast, but it's certainly good enough. I start ur-tigger, create the rpm, move it to shared storage, shut down ur-tigger, start ur-tigger2, install the rpm and still have 30-45 minutes of test time left out of an hour. Since the machine is somewhat underpowered, you will see serious performance hits on your session on the real machine while the uml machines are up. If you really have to do this, I *guess* (but haven't tried it) that you could nice the uml machine - at the expense of performance there. For both uml machines, I created startup files (I put these in /etc/init.d for no good reason, since the uml machines are run under my personal id, not root). I've listed one of them at the bottom. The only thing unusual is this line: args="con1=tty:/dev/tty4 Which puts the uml (ur-tigger) console on tty4 of tigger's console. I strongly suggest you don't try and do this with a COW file. The two machines are pretty different. While the file sizes LOOK scary, they're really sparse, and quite small: [bstrauss@tigger ur-tigger]$ ls -ls 4 -r-xr-xr-x 1 bstrauss bstrauss 3191 May 12 18:23 control 268 -rwxrwxr-x 1 bstrauss bstrauss 266876 Apr 28 10:04 initrd-um 4 drwxrwxr-x 2 bstrauss bstrauss 4096 Apr 28 09:51 mnt 617580 -rwxrwxr-x 1 bstrauss bstrauss 1073741824 Jun 19 10:16 rootfs 12252 -rwxrwxr-x 1 bstrauss bstrauss 134217728 Jun 18 17:27 swapfs ^^^^^^actual effective ^^^^^^^^^^ So that you can easily exchange files between the two uml machines, follow this to setup host file access: http://user-mode-linux.sourceforge.net/hostfs.html (If you're using a machine that is this tight on memory, running two umls simultaneously isn't advised). =============================================== ==== C r e a t i n g ========================== =============================================== ur-tigger is used to create the rpms. You'll need to have available all the tools you need to compile and run ntop - via trial and error, I developed the following list (it's in the ntop.spec file): BuildPrereq: glibc, glibc-devel, gcc, cpp, gawk, autoconf, automake, openssl, openssl-devel, gdbm, gdbm-devel, libpcap, mysql, mysql-devel Key version# information (These aren't REQUIRED, it's just what I use): Kernel: 2.4.18-15um autoconf-2.13-14 automake-1.4p5-2 cpp-2.96-98 gawk-3.1.0-3 gcc-2.96-98 gdbm-1.8.0-10 gdbm-devel-1.8.0-10 glibc-2.2.4-13 glibc-common-2.2.4-13 glibc-devel-2.2.4-13 libpcap-0.6.2-9 mysql-3.23.41-1 mysql-devel-3.23.41-1 openssl-0.9.6b-8 openssl-devel-0.9.6b-8 Login to the real machine as you. Startup the uml machine. Running the /etc/init.d/ur-tigger start command will seize your session, so I usually connect via ssh from my workstation which is a separate (Windows) machine and just leave the session up. But I could just as easily define two uml consoles and use them. Login to the uml machine as root. Under /usr/src, create the following structure (this is standard): ./redhat ./redhat/BUILD ./redhat/RPMS ./redhat/RPMS/athlon ./redhat/RPMS/i386 ./redhat/RPMS/i486 ./redhat/RPMS/i586 ./redhat/RPMS/i686 ./redhat/RPMS/noarch ./redhat/SOURCES ./redhat/SPECS ./redhat/SRPMS Put the ntop source into ./redhat/SOURCES, along with any other files you need: -rw-r--r-- 1 root root 225 Jun 4 13:10 force-i386.patch -rw-rw-r-- 1 ntop ntop 1828895 Jun 4 10:28 ntop-2.0.99-rc2.tgz -rw-r--r-- 1 root root 3602 May 14 14:04 ntop-config.in -rw-r--r-- 1 root root 1246 May 14 14:03 ntop.init -rw-r--r-- 1 root root 159 Nov 23 2001 ntop.logrotate -rw-r--r-- 1 root root 3267 Jun 18 18:12 ntop.spec Also put the ntop.spec file into ./redhat/SPECS The spec file is the key to the build process (This is the RC3 version, other than directory structure and comments, it should be the 2.1 version): Summary: ntop shows the network usage Name: ntop Version: 2.0.99RC3 Release: 20020704 Source: ntop-2.0.99RC3-20020704.tgz Source1: ntop.init Source2: ntop.logrotate Patch1: force-i386.patch Patch2: version.patch Copyright: GPL Group: Applications/System BuildPrereq: glibc, glibc-devel, gcc, cpp, gawk, autoconf, automake, openssl, openssl-devel, gdbm, gdbm-devel, libpcap, mysql-devel Requires: glibc, openssl, gdbm, ncurses, libpcap Buildroot: %{_tmppath}/%{name}-root Prereq: /sbin/chkconfig, /sbin/ldconfig %description ntop is a network and traffic analyzer that provides a wealth of information on various networking hosts and protocols. ntop is primarily accessed via a built-in web interface. Optionally, data may be stored into a database for analysis or extracted from the web server in formats suitable for manipulation in perl or php. Note that the command line version, intop, is largely unsupported. See docs/1STRUN.txt for the 1st time startup procedure! This version - RC3 - includes a fix for the https:// hangs, see --use-sslwatchdog. SSLv3 is enabled. %prep %setup -q -c ${NAME}${VERSION} %patch 1 -P %build unset RPM_OPT_FLAGS %undefine optflags # ntop craps out here with gcc2.96-98 and full optimization! # First, build static libraries - use the new buildAll script cd gdchart0.94c ./buildAll.sh cd ../ntop # Now, configure and build ntop %configure --enable-optimize --bindir=%{_sbindir} --enable-sslv3 make patch -p0 < ../../../SOURCES/version.patch make %install cd ntop mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d \ $RPM_BUILD_ROOT/%{_sbindir} \ $RPM_BUILD_ROOT/etc/logrotate.d make install DESTDIR=$RPM_BUILD_ROOT install -c -m0755 %{SOURCE1} $RPM_BUILD_ROOT/etc/rc.d/init.d/ntop install -c -m0644 %{SOURCE2} $RPM_BUILD_ROOT/etc/logrotate.d/ntop %post /sbin/chkconfig --add ntop /sbin/ldconfig /sbin/service ntop condrestart > /dev/null 2>&1 %preun if [ "$1" = "0" ]; then /sbin/service ntop stop > /dev/null 2>&1 /sbin/chkconfig --del ntop fi %postun if [ "$1" -ge "1" ]; then /sbin/service ntop condrestart > /dev/null 2>&1 fi /sbin/ldconfig %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc ntop/AUTHORS %doc ntop/CONTENTS %doc ntop/MANIFESTO %doc ntop/COPYING %doc ntop/ChangeLog %doc ntop/docs/FAQ %doc ntop/docs/HACKING %doc ntop/docs/KNOWN_BUGS %doc ntop/docs/TODO %doc ntop/docs/1STRUN.txt %doc ntop/NEWS %doc ntop/PORTING %doc ntop/README %doc ntop/SUPPORT_NTOP.txt %doc ntop/THANKS %config %{_sysconfdir}/rc.d/init.d/ntop %config %{_sysconfdir}/logrotate.d/ntop %{_sbindir}/ntop %{_sbindir}/ntop-cert.pem %{_sbindir}/intop %{_datadir}/%{name} %{_mandir}/man1/intop.1.gz %{_mandir}/man8/ntop.8.gz %{_libdir}/ntop %{_libdir}/plugins %{_libdir}/libntop* %{_libdir}/libicmpPlugin* %changelog * Thu Jul 03 2002 Burton M. Strauss III - Updated to RC3 * Thu Jun 20 2002 Burton M. Strauss III - Updated to RC2A - unofficial post RC2 build. * Tue Jun 04 2002 Burton M. Strauss III - Updated to RC2 * Fri May 17 2002 Burton M. Strauss III - Updated to RC1 * Mon May 13 2002 Burton M. Strauss III - Updated for 2.0.99 - beta - from 13May2002 snapshot * Fri Nov 23 2001 Hal Burgiss - Updated for 2.0 beta. * Thu Oct 11 2001 Hal Burgiss - Updated for 2.0 pre-release snapshots. Many changes. It's documented in many places, it's a standard rpm file. You can see where I stole it from (Thanks Hal), all I did was fixup a few things. Remember to update the key values each time: Version: 2.0.99RC2 Release: 20020604 Source: http://luca.ntop.org/ntop-2.0.99-rc2.tgz and the changelog. Luca's .tgz source files don't always follow the same structure, so you may have to change the cd commands, cd RC2/gdchart0.94c and cd RC2/ntop (in %build and %install respectively). The one patch forces an i386 build for maximum compatibility (that's also why I build for MySQL): --- RC2/gdchart0.94c/buildAll.sh Tue Apr 16 18:05:18 2002 +++ RC2/gdchart0.94c/buildAll.sh Mon May 13 13:09:31 2002 @@ -1,6 +1,6 @@ #!/bin/sh -./configure +./configure i386-redhat-linux cd zlib-1.1.4/ ./configure make (You may also have to adjust the directory structure on the --- and +++ lines). To actually do the build, cd to the SPECS directory and run rpm -ba ntop.spec When things finish, there should be a pair of .rpm files, the binary one in ./redhat/RPMS/i386 and the source in ./redhat/SRPMS Copy or move them to the host (real) machine. If you have errors, it's usually missing tools or the directory structure. Best bet is to take the name of the failing file and look at it (they are all standard shell scripts created by rpm and in /var/tmp) Shutdown the uml machine (as root, type shutdown -h now) =============================================== ==== T e s t i n g ============================ =============================================== ur-tigger2 is used to test the rpms. You'll need to have available all the tools you need to run ntop - via trial and error, I developed the following list (it's in the ntop.spec file): Requires: glibc, openssl, gdbm, ncurses, libpcap ^^^^^^^ intop only Login to the real machine as you. Startup the uml machine. Same warning as above about seizing your session. Login to the uml machine as root. To test the rpm, all you do is uninstall the old one rpm -e ntop and install the new one rpm -i ntop-xxxx.i386.rpm Then fire up ntop (remember docs/1STRUN.txt) and let it run as your test. ============================================================ =============================================== ==== /etc/init.d/ur-tigger - startup file====== =============================================== #!/bin/sh # $Id: RedHat-rpmbuild-HOWTO.txt 2757 2005-04-04 13:39:46Z burton $ ### ### Various settings ### name="ur-tigger" dirname=/home/ntop/uml/$name mc=$name mcp=$HOME/.uml/$name/pid memsize="64m" fs=" ubd0=rootfs root=/dev/ubd/0" swap="ubd7=swapfs" args="con1=tty:/dev/tty4" net="eth0=tuntap,,," hostiface="eth0" ### ### Change to the base directory ### cd $dirname ### ### Look for uml binary ### PATH=.:$PATH if [ -x $name ] then linux=$name else linux=linux fi ### ### figure out host ip address ### PATH=/sbin:/usr/sbin:$PATH ip=`LANG="C" LC_ALL="C" ifconfig $hostiface | grep 'inet addr:' | sed 's/.*inet addr:\([0-9.]*\).*/\1/'` net="$net$ip" ### ### look for initial ramdisk ### initrd="" if [ -f initrd-um ] ; then initrd="initrd=initrd-um" ; fi ### ### Process command ### case $1 in start) shift exec $linux $initrd umid="$name" $fs $swap mem=$memsize $net $args "$@" ;; stop) uml_mconsole "$mc" halt exit ;; kill) if [ -f $mcp ] then echo "Killing pid `cat $mcp`" kill -9 "`cat $mcp`" else echo "Instance $name doesn't appear to be running" fi exit ;; console|mconsole) exec uml_mconsole $mc ;; cad|ctrl-alt-delete) exec uml_mconsole $mc cad ;; reboot) uml_mconsole $mc reboot exit ;; install) # undocumented option used to install stuff originally shift rm -f installfs/success $linux rw umid="$name" $fs mem=64m ubd7=installfs $net root=/dev/ubd/7 init=/uml_stage2install.py $args "$@" if [ -f installfs/success ] then exitcode=0 echo "Install succeeded" else echo "Install failed" exitcode=1 fi rm -f installfs/opts.py 2>/dev/null # contains root password if [ -f installfs/initrd-um ] then cp installfs/initrd-um . fi find installfs -type d -print | xargs chmod 777 2>/dev/null rm -rf installfs 2>/dev/null exit $exitcode ;; mount) mount rootfs mnt/ -o loop exit ;; umount) cd ~ umount mnt/ exit ;; status) pid=`cat $mc/pid` echo "pid is $pid" ps -ef | grep $pid uml_mconsole $mc/mconsole version exit ;; df|du) ls -lhs exit ;; *) echo "`basename $0` (start|stop|console|reboot|status|kill|mount|umount)" echo "start starts new session" echo "stop stops current session (hard halt) - safer to use" echo " init 0 inside session" echo "reboot reboots current session (hard reboot) - safer to use" echo " init 6 inside session" echo "cad sends ctrl-alt-delete" echo "console starts mconsole" echo "status current status" echo "kill kill -9 the uml session" echo "mount mounts filesystems as loopback on mnt, you must be root" echo "umount unmounts the above" echo "du shows actual disk space usage" exit 1 esac ========================================== Because somebody always wants to know, here is what's on the system. Kernel: 2.4.18-15um Installed packages (90% of which are un-necessary): 2.4.18-15um 4Suite-0.11-2 MAKEDEV-3.2-5 PyXML-0.6.5-4 SysVinit-2.78-19 a2ps-4.13b-15 alchemist-1.0.18-1 anacron-2.3-17 ash-0.3.7-2 at-3.1.8-20 authconfig-4.1.19-1 autoconf-2.13-14 automake-1.4p5-2 basesystem-7.0-2 bash-2.05-8 binutils-2.11.90.0.8-9 bzip2-1.0.1-4 bzip2-libs-1.0.1-4 chkconfig-1.2.24-1 console-tools-19990829-36 cpio-2.4.2-23 cpp-2.96-98 cracklib-2.7-12 cracklib-dicts-2.7-12 crontabs-1.10-1 cyrus-sasl-1.5.24-20 cyrus-sasl-md5-1.5.24-20 cyrus-sasl-plain-1.5.24-20 db1-1.85-7 db2-2.4.14-7 db3-3.2.9-4 dev-3.2-5 dhcpcd-1.3.18pl8-13 diffutils-2.7.2-2 dosfstools-2.7-1 e2fsprogs-1.23-2 ed-0.2-21 emacs-20.7-41 expat-1.95.1-7 file-3.35-2 filesystem-2.1.6-2 fileutils-4.1-4 findutils-4.1.7-1 freetype-2.0.3-7 gawk-3.1.0-3 gcc-2.96-98 gcc-c++-2.96-98 gdbm-1.8.0-10 gdbm-devel-1.8.0-10 glib-1.2.10-5 glibc-2.2.4-13 glibc-common-2.2.4-13 glibc-devel-2.2.4-13 gmp-3.1.1-4 grep-2.4.2-7 groff-1.17.2-3 groff-perl-1.17.2-3 grub-0.90-11 gzip-1.3-15 hdparm-4.1-2 hotplug-2001_04_24-11 indexhtml-7.2-1 info-4.0b-3 initscripts-6.40-1 ipchains-1.3.10-10 iproute-2.2.4-14 iptables-1.2.3-1 iputils-20001110-6 kbdconfig-1.9.14-1 kernel-2.4.7-10 kernel-BOOT-2.4.7-10 kernel-debug-2.4.7-10 kernel-enterprise-2.4.7-10 kernel-headers-2.4.7-10 kernel-smp-2.4.7-10 kon2-fonts-0.3.9b-7 krb5-devel-1.2.2-13 krb5-libs-1.2.2-13 krb5-workstation-1.2.2-13 ksymoops-2.4.1-1 kudzu-0.99.23-1 less-358-21 libpcap-0.6.2-9 libstdc++-2.96-98 libstdc++-devel-2.96-98 libtermcap-2.0.8-28 libxml2-2.4.2-1 libxslt-1.0.1-3 lilo-21.4.4-14 lockdev-1.0.0-14 logrotate-3.5.9-1 lokkit-0.50-6 losetup-2.11g-5 m4-1.4.1-5 mailcap-2.1.6-1 mailx-8.1.1-22 make-3.79.1-8 man-1.5i2-6 mingetty-0.9.4-18 mkbootdisk-1.4.2-3 mkinitrd-3.2.6-1 mktemp-1.5-11 modutils-2.4.6-4 mount-2.11g-5 mouseconfig-4.23-1 mpage-2.5.1-7 mysql-3.23.41-1 mysql-devel-3.23.41-1 ncurses-5.2-12 ncurses-devel-5.2-12 net-tools-1.60-3 netconfig-0.8.11-7 newt-0.50.33-1 nkf-1.92-6 ntsysv-1.2.24-1 openldap-2.0.11-13 openssh-2.9p2-7 openssh-clients-2.9p2-7 openssh-server-2.9p2-7 openssl-0.9.6b-8 openssl-devel-0.9.6b-8 openssl-perl-0.9.6b-8 pam-0.75-14 parted-1.4.16-8 passwd-0.64.1-7 patch-2.5.4-10 pcre-3.4-2 perl-5.6.0-17 perl-DBI-1.18-1 perl-DateManip-5.39-5 perl-Digest-MD5-2.13-1 perl-HTML-Parser-3.25-2 perl-HTML-Tagset-3.03-3 perl-MIME-Base64-2.12-6 perl-NKF-1.71-2 perl-Parse-Yapp-1.04-3 perl-Storable-0.6.11-6 perl-URI-1.12-5 perl-XML-Dumper-0.4-5 perl-XML-Encoding-1.01-2 perl-XML-Grove-0.46alpha-3 perl-XML-Parser-2.30-7 perl-XML-Twig-2.02-2 perl-libnet-1.0703-6 perl-libwww-perl-5.53-3 perl-libxml-enno-1.02-5 perl-libxml-perl-0.07-5 popt-1.6.4-7x procmail-3.21-1 procps-2.0.7-11 psmisc-20.1-2 psutils-1.17-13 pwdb-0.61.1-3 python-1.5.2-35 quota-3.01pre9-3 readline-4.2-2 redhat-logos-1.1.3-1 redhat-release-7.2-1 rootfiles-7.2-1 rpm-4.0.4-7x rpm-build-4.0.4-7x sed-3.02-10 setserial-2.17-4 setup-2.5.7-1 setuptool-1.8-2 sh-utils-2.0.11-5 shadow-utils-20000902-4 slang-1.4.4-4 slocate-2.6-1 sysklogd-1.4.1-4 syslinux-1.52-2 tar-1.13.19-6 tcsh-6.10-6 termcap-11.0.1-10 textutils-2.0.14-2 time-1.7-14 timeconfig-3.2.2-1 tmpwatch-2.8-2 unzip-5.42-1 utempter-0.5.2-6 util-linux-2.11f-9 vim-common-5.8-7 vim-minimal-5.8-7 vixie-cron-3.0.1-63 wget-1.7-3 which-2.12-3 words-2-17 zlib-1.1.3-24 ============================================================================================== ==== B u i l d m e i s t e r ================================================================= ============================================================================================== Pretty standard for RedHat. You create a userid, buildmeister, plus the necessary directories and use rpmbuild, just as if you were root. The rpm build package automatically does the translation. The above instructions for UML are still the way to do it. You create the directories: ./BUILD ./RPMS ./RPMS/i386 ./RPMS/noarch ./SOURCES ./SPECS ./SRPMS in buildmeister's home instead of /usr/src. Use the spec file in ntop's cvs - packages/RedHat/ntop.spec - and that's where you will find the other files for SOURCES. ============================================================================================== ==== V P C =================================================================================== ============================================================================================== Microsoft's VPC 2004 (Virtual PC) - allows you to create multiple Linuxes that run at acceptable speed. You use standard VPC tools to create the VM (Virtual Machine), capture the CD-ROM for the OS you want to install and 'boot'. The key site to reference is "What works and what doesn't" at http://vpc.visualwin.com/. Two cautions: 1) The standard Fedora Core 3 kernel has problems - follow the workaround in the instructions at vpc.visualwin.com. 2) Use an external tool to capture the CD-ROM into a .iso image file. I've had problems with physical CDs hanging. But basically, using VPC is just like using a real machine. You install the OS - typically configuring it as a minimal development machine. Add the extra libraries ntop requires (libpcap, gdbm, etc.) and whatever native tools you want for package building. Thus I usually combine VPC + Buildmeister for .rpm based systems. Although real memory will limit the number of simultaneously running VMs, they boot and shutdown quickly, so the boot, scp the new files, rpmbuild, test the rpm, scp the generated file somewhere and shutdown cycle doesn't take much longer than (and can even be shorter) than on a native machine. Plus, for the bandwidth of downloading a few ISOs, you can have a new Linux. As of Apr2005, I have VPCs for: Debian, FC2, FC3, FreeBSD 4.11, FreeBSD 4.10, FreeBSD 5.3, Gentoo, RedHat 9, RedHat 8.0, SuSE and Solaris 10. ntop-5.0.1+dfsg1/docs/FAQ0000644000000000000000000065447410432617517013507 0ustar rootroot-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- _ _ _ | \ | | |_ ___ _ __ | \| | __/ _ \| '_ \ | |\ | || (_) | |_) | |_| \_|\__\___/| .__/ |_| Network Top -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Fully revised for ntop 3.0 Updated for ntop 3.1 and 3.2 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Compiled by Burton M. Strauss III - comments to him! In this document, that's whom "I" or "My" refers to. |\ _,,,---,,_ "If I purr, you must have fed me. /,`.-'`' -. ;-;;,_ If the network purrs, it must <|,4- ) )-,_..;\ ( `'-' be ntop!" -----Pixel '---''(_/--' `-'\_) As usual, entries are in no particular sequence. However, there is an overall flow, starting with very general questions, then questions about specific features, then questions about specific platforms. What structure there is in this FAQ is that of a dialog with a bright 7 year old. The response to every answer is "Why". Keep reading until you get too detailed for your needs. If you actually read through this FAQ and don't find yourself saying "Oh, Bother", at least twice, and then go read Winnie the Pooh. At the very end are "HowTo Ask For Help" and a "GDB ultraMini-tutorial". Read them. Before posting to the mailing list. Note that some of this FAQ is based on the entries people contributed to the community FAQ formerly at http://snapshot.ntop.org. Lots more are based on messages to the ntop and ntop-dev mailing lists. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- TOP 10 - the questions everyone asks... Q0. I downloaded the source and ./configure doesn't work. A. Yup. There is a long history of warfare between the versions of the GNU autotools we use to build the distribution files and the ones installed on your host. So during the 3.3 development cycle, Luca finally gave in and stopped distributing a generated configure file. Instead there is a script, autogen.sh, which uses the version(s) of the tools installed on your system to create configure and then run it. Yes, this means you MUST have the following tools installed: libtool automake m4 autoconf We are talking only about people who are compiling from source. Those tools are pretty much required for ANY source. Live with it. Q1(a). Can I store data in a SQL database? Q1(b). When ntop stops I lose all my data. Why? Q1(c). Why doesn't the -S option work? A. ntop used to optionally store some data in a SQL database. The code was broken, difficult to maintain, etc. and was removed. A LONG TIME AGO. If you are reading about this in 'some' documentation - update. Current ntop is 3.1, which is the only version we support. There are scripts that various users have offered to take the data dump and insert it into a SQL database. Search the back traffic on the mailing list for them. Yes, ntop uses memory based structures to hold usage data and they are lost when you reset or restart ntop. Persistent storage is in the RRD databases - there's a paper @ SourceForge that explains them. There was another option for some persistence - it was -S - look in FAQarchive for an article about it, "What was the -S option?". Q2. The archive isn't indexed, so I can't search it. A. Yes, but it's easy to search using search engines or mail archives. Google: You need to restrict the search to the U of Pisa mail list gateway, i.e.: site:listgateway.unipi.it ntop freebsd Two 'mail archive' sites that I know of (as of March 2005) are: gmane: http://search.gmane.org (our lists are renamed as gmane.linux.ntop.general and gmane.linux.ntop.devel). The Mail Archive: http://www.mail-archive.com/ntop-dev@unipi.it/ http://www.mail-archive.com/ntop@unipi.it/ Q3. ntop crashed and the last log message is "xxxxx". A. Sorry, that's useless. ntop is multi-threaded and processes 100s or 1000s of packets per second. The last log message is probably from the wrong thread and many seconds out of date. To capture the true 'failure point information', you need to run under the debugger (gdb) and send us the various outputs. Instructions are at the bottom of this document. Look for "GDB ultraMini-tutorial". Yes, you will need the source and a compiler. Q3(a). What about the backtrace? A. Again, probably useless. Use gdb and capture the full failure point info. If you want to see more, look for "Q. What about the backtrace?" below. Q4. I'm running out of memory. A. Basically ntop uses a lot of memory - it stores a chunk of information about each and every host it's monitoring. See "Q. Why does ntop use so much memory ?" and the following articles below. Q5. Dropped packets? A. There are lots of reasons - look for "Q. Why does ntop drop packets?" below. Short version, is that as long as it's random, the information you glean from ntop (32% of our usage is P2P Music) is still valid. But you are probably understating any problems. Q6. The docs at ntop.org say ... A. Stop right there. They're out of date (notice, for example, the man page is July 2002?). The only current stuff is this FAQ (which gets out of date quickly) the other files in the distribution and the mailing lists. You can access the updated FAQ from docs/FAQ in the cvs or from your ntop instance (click on the (?) icon in the "About" menu and read down 1/2 a page or so. Q7. How do I report a problem? A. Best way is to use the PR (Problem Report) form - it automatically includes a lot of the important information about your ntop instance. In the "About" menu, click on the "Bug" icon. This generates a text form you can copy into your email program, update and send. Q8. HACK ALERT HACK ALERT - ntop is sending information to some machine called "jake". A. Chill. Take a deep breath. Jake is the cannonical name for version.ntop.org. All you are seeing is the version check. See "Q. What's with the version check?" below. Q9. The program asks for password for "ntop HTTP server". When I started NTOP for the first time, it asked me to set admin password, and i put "xxxxxxxx". The user is "xxxxxxxxxx" but I get "Unauthorized to access the document". Why? A. The correct user to specify for the ntop web server is admin. The -u value in the command line or parameter file is the account ntop runs under. Q10. I'm not getting any rrd output. A. First, make sure that the plugin is installed (you should see it in the web interface under plugins). Make sure it is configured and active. The default configuration does NOT include per-host .rrd files, because these can take up a lot of space. But you probably want them and at the medium or high level of detail. Q11. Single Threaded ntop? A. Gone. Poof. We're in a multi-threaded world, so live with it. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Where can I find ntop? A. The official website can be found at http://www.ntop.org/. Q. Where do I get the source? A. SourceForge -- http://sourceforge.net/projects/ntop/ There is also a cvs (current development) maintained at cvs.ntop.org. (instructions are on the download page of www.ntop.org) Q. What is ntop? A. ntop is an open source network top - it monitors a network and collects information about the protocols and hosts for display. Q. Um, so it's like mrtg (http://people.ee.ethz.ch/~oetiker/webtools/mrtg/)? A. Yes and no... Yes in that both are analyzers of network packets. Yes in that both display information about your network. No in that they take very different approaches to collecting information. No in that they display different types of information. Q. So mrtg... A. mrtg creates a picture of the network centered on the device on the link between devices (and aggregations of devices and links). Tobias (Tobi) Oetiker describe mrtg as: "The Multi Router Traffic Grapher (MRTG) is a tool to monitor the traffic load on network-links. MRTG generates HTML pages containing graphical images which provide a LIVE visual representation of this traffic." Q. And mrtg works how? A. mrtg reads the counters maintained by various devices such as routers, using a protocol called 'snmp' (Simple Network Monitoring Protocol). The management information bases (MIBs) read using snmp, contain incredibly detailed information about the packets the device has seen and what it has done with them. Again, quoting Tobi: "MRTG ... uses SNMP to read the traffic counters of your routers and ... which logs the traffic data and creates beautiful graphs representing the traffic on the monitored network connection." mrtg is focused on 'layer 2' (the tcp/ip and other low level protocol). Q. And ntop? A. ntop doesn't use snmp for it's main analysis - it's not a device centric view of the network. Instead ntop actually processes the network packets directly. Q. What's wrong with snmp? A. Nothing. As of 3.1, ntop has some sort of snmp plugin. It's just different. snmp is a pull protocol, that is a monitoring tool has to pull the information from the device. snmp has 'traps' that is alert messages which can be sent out, but the MIB data has to be read by the monitoring tool from the device. snmp is an older protocol, from the dawn of the network era and it has some minor issues of security and complexity and verbosity. But it's a critical network protocol, used successfully by 1000s of ISPs to monitor AND CONTROL vast networks. From our perspective, the problems with snmp are minor - It can use a lot of bandwidth - especially if you're reading from devices on the far side of slow links. Pulling data out of MIBs is a complex process. MIBs can be specified in an RFC, or be unique to a vendor/device. An snmp-based tool either has to restrict itself to the common MIBs, or (most often for vendor tools) it be updated whenever a new device must be supported or a MIB changes. This makes snmp-based tools complex, because data may be unavailable in certain versions of seemingly similar devices, etc. For example, http://www.cisco.com/public/sw-center/netmgmt/cmtk/mibs.shtml is a page which links to the specific MIBs supported by various Cisco devices. Q. So why hasn't ntop 'won'? A. mrtg excels at monitoring 100s or 1000s of network devices (routers, switches, etc.) and presenting that information over long periods of time. ntop doesn't do a good job of showing multiple 'networks' - it's really focused on aggregating a picture of a single network. And for drilling down into that picture or presenting it over long periods of time. The processing of packets requires a lot more computer resources than just reading counters from devices. On the plus side, this gives much more detailed information - for example ntop sees the actual web server request instead of just that there was traffic on port 80. On the minus side, it's pretty easy to exceed the processing power of the low end machine typically available for ntop. An ISP using ntop to monitor a couple of T3s needs a FAST computer and A LOT of memory. ntop also requires access to the physical network (either directly via a network card or indirectly via a netFlow/sFlow probe). This limits ntop's (usefullness|ability) to work across sites. Once you learn what they do (mrtg and ntop), you'll probably discover that You need both. Q. What's this 'layer' crud? A. Network layers come from a widely cited but never implemented model, the OSI (Open System Interconnect ) networking model from the ISO (International Standards Organization). Google for it - for example http://www.ussg.iu.edu/usail/network/nfs/network_layers.html Q. So ntop is like netFlow (Cisco), sFlow (RFC 3176, http://www.sflow.org) or RMON (HP)? A. Not really, actually those are all protocols for sending and receiving information about the network. ntop has lots in common with the tools that USE those protocols. And there are lots of tools - some proprietary, many open source. The devices/programs that collect the information and send it out in netFlow, sFlow or RMON format are usually called (by me) 'probes'. The devices and/or programs that receive the netFlow, sFlow or RMON formatted information and do things with it are called 'collectors' (if they process it and forward it on) or called 'displays'. In fact, ntop can receive netFlow packets and both send and receive sFlow packets. It can be a 'probe' or a 'display'. (ntop used to be able to send netFlow packets - that was removed 2004-03 by Luca). Q. So ntop is like Nagios or Ipswitch's - WhatsUp Gold?. A. Nope - those are layer 4 and higher (application) monitoring programs. Q. So it's like ... A. Enough already - if you search Freshmeat.net, http://freshmeat.net/search/?q=network+monitor§ion=projects you will find (as of 18Aug2003): Topic :: System :: Networking :: Monitoring (654 projects) We'll be here all day. ntop is ntop. Q. Ok, so ntop is a unique TCP/IP analyzer. A. Not exactly. First off, ntop pretty much doesn't care about the lowest (layer 1 or wire) layer. It leaves dealing with that to a library, libpcap, which hides most of that. ntop is designed as a hybrid packet analyzer, not a pure Ethernet analyzer (layer 2) nor a pure TCP/IP analyzer (layer 3). ntop gets the data at the layer 2 (frame) level, which could be Ethernet or another protocol. Beyond Ethernet, ntop has minimal smarts about FDDI, PPP, RAW and TOKEN-RING frames. That is, at least enough for some basic counts or to extract the (layer 3) TCP/IP data in side. ntop 3.0 adds TWO (three?) HUGE areas of new protocol support. ntop 3.0 supports IPv6, thanks to code contributed by Olivier Festor and Abdelkader Lahmadi of the MADYNES Research Time (Managing DYnamic NEtworks and Services), see http://madynes.loria.fr/. ntop 3.0 has more than a fair amount of smarts about FibreChannel and SCSI thanks to code contributed by Dinesh G Dutt of Cisco. However, since most of ntop's displayed counts are at the TCP/IP level, it confuses people into thinking ntop is purely a TCP/IP analyzer. ntop is a traffic monitor with it's own network interfaces, which monitors what it sees (or is told about through netFlow or sFlow probes). Q. ntop runs under? A. ntop is known to work under Linux, Mac OS X, FreeBSD, Solaris and Win32. ntop development is done primarily on Fedora Linux. Luca also does a port to Win32 (MS Visual C .Net) and used to work in the Sun Solaris environment. He also seems to work with FreeBSD 5.4. I (Burton) usually work under Fedora Linux, but use Microsoft's VPC 2004 and VMware Workstation 5 to test under other Linux distros and OSes. Our users run under many other platforms - Here's data from the version.xml log records showing what people were running while testing 3.2: (This data covered approximately the first two weeks of July 2005) count version ------- ------- 16684 3.1 10960 3.0 345 3.1rc1 259 3.1.1 etc. count OS Version ------- ------- -------------- 20509 Linux 3566 Windows WinNT/2K/XP 1752 Unknown Windowsv3.1 1018 Unknown Windowsv3.0 266 FreeBSD 5.3 234 FreeBSD 5.4 219 Darwin 7.7.0 Of course, this is self-selected - people can turn off the logging. Linux covers lots of Different Linuxes... of the ones we recognize: count Distro Release ------- --------- -------- 3148 suse 2637 redhat 9 2625 fedora 3 2014 fedora 2 1541 debian 3.1 1373 gentoo 1.4.16 613 redhat 3 603 fedora 1 523 mandrakel 10.2 505 gentoo 1.6.12 473 redhat 7.3 448 mandrakel 10.1 428 debian 399 redhat 4 367 redhat 8.0 301 slackware 10.1.0 282 slackware 10.0.0 The jump in 'SuSE' may represent nothing more than improved detection in the 3.2/3.1 scripts vs. 3.0. We used to have a huge 'unknown' count. Running under pretty much any *nix is at least theoretically possible. But it takes interested party/parties and access to resources - some of the things that ntop does such as libpcap and loading plugins are tied tighter to the OS than you might like. There are sections below about each specific OS. -------------------------------------------------------------------------------- -----Features------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. What determines the features of ntop? A. Whatever Luca wants Q. Why did you do this "x" instead of feature "y"? A. Don't know. I could guess... Imagine you are the network manager for a large University network and have to crack down on users who are illegally exchanging copyrighted files or using University resources to run a business without paying for the resources being consumed. or You are a major vendor of infrastructure, whose customers are using networks for new features such as storage area networks and you want to give them the ability to monitor these. or You have a really cool technology that you've just donated to the community via an RFC and wish to jump-start adoption of it. or You are moving heavily into IPv6 and need to be able to monitor your 'new' network just like you monitored the IPv4 one. or (my favorite) You really, really, really hate that ntop generates such lousy html code and you decide to scratch that itch. or (what should happen) A major corporation, with out resources, time, skills and/or inclination to do it themselves sponsors the development of a feature that's critical to him/her. or Then again, it could just be because it's cool... Q. Could ntop do "x" A. Probably - as long as it doesn't move the tool away from it's purpose and it's strengths, almost anything is possible - especially as a plugin. Q. Will you do "x" A. Maybe - if it's of interest to a developer, or you provide the code such that it can be merged in, or if you're willing to sponsor the development effort (contact us through http://www.ntop.org/consultancy.html). -------------------------------------------------------------------------------- -----Documentation-------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Why isn't there (any)(more)(better) documentation. A. (A personal peeve from Burton...) I get real tired of people complaining that there isn't any documentation and then being unwilling to contribute even the simplest stuff. I've said I'll edit and assemble whatever people send me... and since I started working with ntop in November 2001, I've received maybe six pages of stuff. I'm trying to get people - who aren't coders - to contribute to ntop the project. The contribution that ANYONE can make is "documentation". A task- specific HOWTO... some sample screen shots... An FAQ entry... I've tried being nice. I've tried asking. I've tried shaming people into it. What have I gotten? Zip. Nasty is all that's left... This is your fair warning. If you show up on the ntop mailing lists and complain about documentation, you will get blasted. -----Burton Q. Ok, where can I find what does exist. A. http://www.ntop.org has pointers and some (very out-dated) documents. The documentation in the docs/ directory, the Documentation files at SourceForge and some at http://www.ntopsupport.com are basically all that there is. Search the ntop mailing lists at gmane, http://search.gmane.org. The lists are called gmane.linux.ntop.general and gmane.linux.ntop.devel. Please contribute to the ntop community by writing things up for inclusion in this FAQ or other documents! Q. I can't find a file at SourceForge! A. You can reach the archives through any SourceForge mirror, or the main site: http://prdownloads.sourceforge.net/n/nt/ntop It has ALL the files unless we explicitly delete them... -------------------------------------------------------------------------------- -----Problems------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. I have a problem... A. Make sure it's a supported release! We support only the current versions of ntop. This is either: * the last release, e.g. v3.1. * the current cvs (cvs.ntop.org) * the latest development version posted at SourceForge (if one) If you use a port/package and the latest version available for your OS is some release candidate from a year ago, sorry. Contact the packager and ask them to get current. Luca usually asks people to try the latest cvs (development) version because problems are frequently already fixed in there. Q. I'm running something supported and I've tried the latest & greatest. Still, I have a problem. A. Read the ntop mailing lists. The ntop mailing lists are at http://listgateway.unipi.it/mailman/listinfo/ntop http://listgateway.unipi.it/mailman/listinfo/ntop-dev and http://listgateway.unipi.it/mailman/listinfo/ntop-misc If you're having non-user problems OR you are using the cvs, you should be reading and posting ntop-dev (for example, the cvs commit messages are posted there). Stuff unrelated to baseline ntop (PF_RING) belongs in ntop-misc. You can read the lists through gmane (or other gateways) if you don't want to subscribe, but only subscribers can post. You can download the older messages in large chunks from the mailing list subscription pages. Look for "To see the collection of prior postings to the list". Q. I looked and I didn't find my problem. A. Join the mailing list(s) and ask for help. Before you post, check the "HowTo Ask for Help" at the end of this FAQ. Please, if at all possible, use the built in PR_ form (the little 'bug' icon on the 'About' tab). Guidelines for asking questions: ONE and only ONE problem / issue / question per message. With a meaningful subject. The goal is that if you're asking a common question, the subject would have allowed you to find it in the back traffic for the mailing list. Post the information about your environment we ask for. We STRONGLY suggest you use the automatically generated "Problem Report" form that since it contains much of the necessary information. Make sure you're in a supported environment (./configure --showoses). If it's an unsupported environment, we're interested in your efforts to make ntop work, but we don't have the time, resources, knowledge and/or interest to do it ourselves. For software 'crashes', please run ntop under the gdb debugger and capture the full failure information. Brief instructions on using gdb are at the end of this file (docs/FAQ). Q. I posted to the list and nobody answered me. A. ntop is open source, and the lists are a community resource. If nobody answered your question, then nobody knew the answers off-hand and nobody wanted to spend THEIR time solving YOUR problem. Q. Do you offer paid support? A. Yes - contact us through http://www.ntop.org/consultancy.html -------------------------------------------------------------------------------- -----Configuring ntop----------------------------------------------------------- -------------------------------------------------------------------------------- Q. What does ./configure do? A. ./configure checks for the tools installed on your system - configuring ntop to compile with the ones you have and skip the ones you don't (or to tell you if you're missing something critical). Q. Why bother - just compile the code. A. Then you would have to have a machine configured EXACTLY like Luca's. Nothing else would work. Various OSes and Linux distributions package the files in different ways and put them in different places. Plus some packages put files into directories with release information in them, etc. Q. OK, so ./configure A. Is how you tell ntop where to find things. A lot of stuff it can figure out on it's own, but if things get put in 'strange' places, ntop's ./configure has switches you use to tell where to find things. Q. And the list is? A. ./configure --help shows the whole list. It's a bit confusing because there are standard options and ntop options mixed in there. A. So, first let's look at the 'where are things' options. There are two types of files ntop is looking for, '.h' files and libxxxx files. .h files are also called 'includes' and libxxxx files are called libraries or lib files. .h files are the C source for functions provided by the OS or by libraries. They are typically in a directory named /usr/include, but they can be placed ANYWHERE. lib files are compiled libraries of these functions (the .h tells ntop how to call something, the lib file is the actual code). Their names usually begin libxxxx (so the library gd is named libgd). By convention, libraries end in .so or .a. A .so library is a shared library (Windows DLL), where one copy of the library is used by all programs that want it's functions. A .a library is a non-shared or static library, which must be merged (the technical term is linked) with the code. ntop uses both - the myrrd library is a static, .a library. When it comes to things like libpcap or libgd, we use shared (.so) libraries. Library files are typically placed in /usr/lib, where the gnu linker (ld), 'knows' automatically how to find them. However, from OS to OS and distribution to distribution, there are many other common places. Some OSes even have a file telling ld all the places to look. Q. So ntop looks for these .h and library thingies in a couple of places. What if it doesn't find them? A. If a basic ./configure can't find something, you'll have to tell ntop where to look. It's complex and OS/distro dependent. For example, if you install libgd from the Sun Freeware site on to a Solaris machine, the files get put into /usr/local/include and /usr/local/lib, which are not on the lists of 'standard' places for Solaris' versions of gcc (the Gnu c compiler) or ld. So to compile ntop, you have to tell gcc to look in these additional locations. The things ntop might be looking for are in this part of the ./configure --help output: +-External-source-locations:-------------------------------------------------+ --with-pcap-root=DIR LBNL pcap located in DIR --with-pcap-lib=DIR or libpcap located in DIR --with-pcap-include=DIR or pcap.h located in DIR --with-gdbm-root=DIR gdbm located in DIR --with-gdbm-lib=DIR or libgdbm located in DIR --with-gdbm-include=DIR or gdbm.h located in DIR --with-zlib-root=DIR zlib located in DIR --with-zlib-lib=DIR or libz located in DIR --with-zlib-include=DIR or zlib.h located in DIR --with-gd-root=DIR gd located in DIR --with-gd-lib=DIR or libgd located in DIR --with-gd-include=DIR or gd.h located in DIR --with-libpng-root=DIR libpng located in DIR --with-libpng-lib=DIR or libpng located in DIR --with-libpng-include=DIR or png.h located in DIR --with-ossl-root=DIR openSSL located in DIR --with-ossl-lib=DIR or libssl located in DIR --with-ossl-include=DIR or ssl.h located in DIR --with-localedir=DIR LOCALE files located in DIR (i18n) +-----------------------------------------------------------------------+ You can see that there is a pattern, pretty much every --with-xxxxx-root has a --with-xxxxx-include and --with-xxxxx-lib option. So, if ntop tells you it can't find something, do this - first look for the File on your system: $ locate pcap.h /usr/include/pcap/pcap.h (If you don't have locate, this works too: $ find / -type f -name "pcap.h" ) And then tell ./configure via --with-pcap-include=/usr/include/pcap (Some OSes are smart enough to look in a subdirectory of the standard location, but others aren't). Q. Ok, but why three options? A. You use either the --with-xxxxx-root option OR either/both of the others at a time. But ntop really only looks at the --with-xxxxx-include and --with-xxxxx-lib options. Internally, --with-xxxxx-root=/a/b/c is translated into --with-xxxxx-lib=/a/b/c/lib and --with-xxxxx-include=/a/b/c/include (that's the usual pattern). Now sometimes libraries are installed logically - if the pcap.h file is in /usr/local/pcap/include, the library (libpcap.so) is probably in /usr/local/pcap/lib. Sometimes they are not logical and you will have to use the split options. The --with-pcap-root=/usr/local/pcap is shorthand for the two options, --with-pcap-include=/usr/local/pcap/include and --with-pcap-lib=/usr/local/pcap/lib. Q. Oh Ghu - aren't there any short cuts. A. For the first time you try ./configure, there's a script on SourceForge in The user contributed area that will try to build the ./configure line for you. Q. And the OTHER options A. There is a set that tells ntop where to install stuff. For simplicity, the two you might want to change are: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --datadir=DIR read-only architecture-independent data [PREFIX/share] --prefix tells ntop where to install the various files. The default value is /usr/local, which is where most non-OS software normal goes. A common choice for libraries (such as pcap) is --prefix=/usr, which puts things like .h files in places easier to automatically find (/usr/include). --prefix=/usr certainly works for ntop. --prefix=/opt is another choice. The 'proper' choice turns on which model of file organization the OS and sysadmin prefer. That's a fight I'm staying out of. --datadir tells ntop where to put its databases and output files. The default is /usr/share/ntop, but that will give some sysadmin's agita. Another popular choice is --datadir=/var, which puts all the files in /var/ntop. That may be attractive especially if you make /var/ntop a separate partition, so the rrd files don't eat all your disk space. Q. What's --enable-iknowbetter Override WILLFAIL A. There are some error messages where it's possible that thing work (now) that didn't used to, or you're doing development and don't want ntop to stop you from doing something, or there's an error message that you have skipped before without getting bitten. --enable-iknowbetter will print the message but not stop ntop from finishing ./configure. Use it at your own risk. Q. What are the --enable and --disable options? A. These (and the with/without options) pretty much do what you think - they enable or disable large chunks of ntop functionality: +--ntop-specific:------------------------------------------------------------+ --enable-sslv3 enable ssl v3 support [default=disabled] --enable-sslwatchdog enable Watchdog for ssl hangups [default=disabled] --disable-plugins disable compilation of plugins [default=enabled] --enable-static-plugins Enable static linked plugins sntop, default=dynamic] --enable-ignoresigpipe Ignore SIGPIPE errors [default=do not ignore] --disable-snmp Disable SNMP support [default=disable] --enable-i18n Enable (limited) internationalization [default=disabled] --enable-jumbo-frames Enable Jumbo (9K) Ethernet frames [default=disabled] --disable-ipv6 use IPv6 [default=enabled] +-----------------------------------------------------------------------+ +--external-packages:---------------------------------------------------+ --without-ssl disable HTPPS support [default=enabled] --without-zlib disable zlib [default=enabled] --with-tcpwrap enable use of TCP Wrapper [default=disabled] +-----------------------------------------------------------------------+ Q. What ELSE? A. There are some so called 'environment variables' you can set that change things too. The common ones are: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor You would use these variables to override the choices made by ./configure or to help it to find libraries and programs with truly nonstandard names/locations. The best place to look for examples of these environment variables are in the OS/distribution files in the configureextra directory. For example, (again picking on Solaris), we use LDFLAGS to tell ld to look in some common Solaris locations for libraries via this: LDFLAGS="-L/usr/local/lib -R/usr/local/lib ${LDFLAGS}" What that does is add /usr/local/lib to the locations that ld will check. Q. ./configure dies in some strange horrible way complaining about version conflicts, lunar phase or whatever. A. The process of creating portable cross-platform scripts for building software is ugly and hard and prone to failure. There are tools (released by gnu) to help, named automake, autoconf and libtool. (Collectively the auto* tools). These tools take basic files and generate more complex files based on a series of rules, conventions and macros (much of which is poorly or undocumented). Other processes (e.g. ./configure) take these files and generate more complex files based on a different series of rules, conventions and macros. This ultimately produces the 'Makefile', which a program called make uses - based on (...wait for it...) yet another series of rules, conventions and macros - to actually compile the ntop source. There are interdependencies among the tools, partial support for older versions in some releases, but not in other releases and many more problems. Different OSes and different Linux distros ship with wildly different versions. Some even have scripts that attempt to analyze the file and pick the correct version (which just means that trying to code a file with multiple version support confuses the tool). So if you have a basic, total failure of ./configure, it's usually the auto* tools. ntop used to ship with a manual script that rebuilt the generated files according to the version(s) of the tools installed on the system you were using to build ntop. Thus the standard answer was 'run ./autogen.sh -1'. But, this meant that you had to have these 'developer' tools installed and caused much problems and gnashing of teeth. So we spent 100s of hours rebuilding the scripts to be totally independent of having the tools installed on your system - only to run into problems because the xyz 1.6.1 tool installed by default on OS A isn't quite compatible with the 1.6.3 version on OS B. So we put technology in place to automatically detect tool versions and rebuild the generated files if necessary. That meant you had to have these 'developer' tools installed and caused much problems. So we rebuilt the scripts AGAIN and AGAIN, dropped support for old versions of the tools and finally reached a point where it works for most reasonably current platforms. This is a compromise: Systems that don't have the tools installed usually work. Systems that have bleeding edge versions of these tools may break. Systems with very old versions also may break. The technology to detect versions and rebuild the script files if appropriate is still in there, but it's disabled from normal use. If you have the auto* tools installed and have ./configure problems, you can activate the automatic rebuild feature via: $ export NTOPAUTOREBUILD=yes $ ./configure ... If the rebuild fixes it, that's great. Regardless, please report the problem to the ntop mailing list. Please don't paraphrase the messages cut & paste the ACTUAL MESSAGES into your report. Also, please let us know the version(s) of the tools installed on your system: $ aclocal --version $ autoheader --version $ autoconf --version $ automake --version $ libtool --version Q. I can't build ntop... (auto* tools) A. ntop has been tested with and developed for various versions of the "GNU auto* tools" (automake, autoconf and libtool). The basic requirements are automake 1.6.1 or higher (automake 1.4 and 1.5 may or may not work) autoconf 2.51 or higher (autoconf 2.13 will NOT work) libtool 1.4 or higher But that simple statement hides a lot of complexity and many potential problems. Surprisingly, this isn't solely ntop's fault, it's the combination of GNU auto* tools version to version compatiblity and because we're trying to distribute configure and make files that work on all versions. If ntop were less complex or less clever about trying to build a working program even with many components missing, things would work a lot better. The big change between autoconf 2.13 and 2.5x generated scripts is that the ./configure and make steps are supposed to run the auto* commands automatically if they're required. As we've seen, this doesn't always work! If you run into problems, you can ALWAYS recreate the generated files via this procedure: rm -f acinclude.m4 aclocal.m4 Makefile.in config.h.in configure Makefile find current versions of libtool, config.guess and config.sub and cp them into your working directory. cat acinclude.m4.ntop libtool.m4.in > acinclude.m4 aclocal autoheader autoconf automake --gnu --copy --add-missing and then: ./configure ... make make install as usual. Q. But how does it all hang together? A. There's a vsd (Visio)/pdf in the docs directory - ntop-autotools.pdf. -------------------------------------------------------------------------------- -----Compiling ntop------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Which packages/libraries do I need to compile ntop: Note: In some cases the minimal header files for a tool will be in one "package" and the execution library in another. ntop needs both so that the ./configure test finds the tool. It's usually safest to install both the tool and development packages! (Some packages will have additional packages as pre-requisites) gdbm (We have people using 1.7.3, 1.8.0, 1.8.2 and 1.8.3) libpcap We recommend 0.8.3, but ntop works with most 0.7.2 and later versions. STAY AWAY from older versions, especially under Linux. Note: Building libpcap requires: bison/flex gd http://www.boutell.com/gd/gd.html - note that many distros have both the 1.8.x and 2.x series installed for differnt packages that require them. This occasionally causes problems. libpng (1.2.x - although ntop works with 1.0.x versions, the two libpng versions are not compatible and will often cause version conflicts and crashes). glibc cpp gcc most versions of gcc should work, but there are no promisses. libtool 1.4+ (distribution is built with 1.4.2) (there are successes reported with 1.3.4 or 1.3.5 - use --enable-iknowbetter) gawk/mawk Note: If all you have is original awk, then ./configure will not work. Q. Will the "xyz" compiler work instead of gcc? A. We explicitly REQUIRE gcc. We know that under many systems, a compiler called cc is available. On some, it's a symbolic link to gcc, BUT, when invoked as cc, it often triggers 'old' behaviors for cc compatibility. On others, cc is a retarded compiler just good enough for compiling the kernel. The one exception is Sun's cc, which - since Luca used to do a lot of development on Solaris - was pretty well supported. Q. The auto* tools? A. Only if you are going to rebuild the distributed script files: autoconf 2.5+ (distribution with 2.57) automake 1.6+ (distribution with 1.8.3) Q. Optional libraries? A. Lots. The most common is: openssl (for https:// support) Note: For security reasons you should only have the most current Version of openssl installed. Q. ntop doesn't compile. A. Sure, it does - for me :-) Q. Right smarty-pants... A. First, check if you're using a supported OS. The long and short of it is that ntop works under Linux, Mac OS X and FreeBSD. Luca distributes a Win32 version through http://shop.ntop.org but charges a convenience fee. Or you can fire up Microsoft's Visual C++ or Visual C++ .Net and compile the Win32 version that way. It should work under MinGW - see the BUILD file in docs. Anything else, you are in untested waters. Some cases we know there are problems, others we just haven't tested. Q. Ok, it's a supported environment and it still won't compile. A. Did you run ./configure? And did it complete successfully? Usually 'compile' problems for supported platforms are a missing (critical) library or header file, but the user ignored (didn't see) the error/warning message and tried running make anyway. ./configure checks a lot of things. When it's looking for headers and libraries, ntop will report KEY information and PROBLEMS in large, set-off, lines: ******************************************************************* * * NOTE: Building ntop for a supported platform * This means we expect ntop to work without major issues * * 'i686-pc-linux-gnu' * * Please keep the ntop-dev mailing list updated with any * successes you have or problems you encounter... * * Support for this platform was most recently verified for * * RedHat7.2 w/ updates ntop 2.1.51 on 2002-10-21 * Suse i686, 2.4.18-4GB-SMP ntop 2.1.51 on 2002-10-24 * ******************************************************************* READ THESE BOXES. Even if you don't read the rest of the output, read the boxes. ntop can work around a lot of problems (missing libraries) by disabling features that need them. If, for example, you don't have zlib, ntop will compile a version that doesn't output compressed html pages. If you don't read the boxes, you will never know. READ THE MESSAGE BOXES! ******************************************************************* * * * NOTICE: I know you're used to ignoring output from ./configure * * * * ntop has a lot of complexity and interdependences. * * * * Please, please AT LEAST read the stuff in these * * boxes! * * * *>>> The ACTION taken is shown prefixed '>>>' * * * * If the ACTION is unacceptable, * *??? The REMEDIATION plan is shown prefixed with '???' * * * ******************************************************************* The box will tell you what's wrong, what ntop did and often how to fix it if you don't like ntop's fix. READ THE MESSAGE BOXES! Hint: It may sometimes be that you're missing the header files (often those are in a -devel rpm if you're running RedHat) If you see a message box and don't understand why ("I'm sure that header file is present"), then look at a file called config.log. Search for the specific header or library reported in the message box and you will see the detailed compiler/linker error messages. For example, ./configure reports: checking for linux/if_pppox.h... no The first thing to so is check if it's on your system: $ locate linux/if_pppox.h /usr/include/linux/if_pppox.h (If you don't have locate, this works too: $ find / -type f -name "ethertype.h" ) Open up config.log and look for if_pppox.h: configure:13086: checking for linux/if_pppox.h configure:13103: gcc -c -g -O2 -Wshadow -Wpointer-arith -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -fPIC -DLINUX conftest.c >&5 configure:13158: parse error before '/' token In file included from configure:13160: /usr/include/linux/if_pppox.h:38: `ETH_ALEN' undeclared here (not in a function) /usr/include/linux/if_pppox.h:39: `IFNAMSIZ' undeclared here (not in a function) /usr/include/linux/if_pppox.h:40: confused by earlier errors, bailing out configure:13106: $? = 1 configure: failed program was: | #line 13091 "configure" | /* confdefs.h. */ | | #define PACKAGE_NAME "ntop" | #define PACKAGE_TARNAME "ntop" | #define PACKAGE_VERSION "2.2.91" | #define PACKAGE_STRING "ntop 2.2.91" | #define PACKAGE_BUGREPORT "" | #define PACKAGE "ntop" | #define VERSION "2.2.91" | #define STDC_HEADERS 1 ... | #define HAVE_NETINET_UDP_H 1 | /* end confdefs.h. */ | net/if.h netinet/if_ether.h | | #include configure:13123: result: no You see the actual test program, the actual compile line and the error messages. Before reporting it to us, chase down where those missing items are declared: $ grep -R 'ETH_ALEN' /usr/include/* | grep '#define' /usr/include/linux/if_ether.h:#define ETH_ALEN 6 /usr/include/net/ethernet.h:#define ETHER_ADDR_LEN ETH_ALEN And post that information with your error report. The reason is that these field definitions are often placed in very different places in different OSes and even in different distributions. FWIW, if you look in the older configure.in: AC_CHECK_HEADERS([linux/if_pppox.h], [], [], [net/if.h netinet/if_ether.h]) should have been AC_CHECK_HEADERS([linux/if_pppox.h], [], [], [#include #include ]) because the macro doesn't do the #include automatically. Q. Nope, it's not ./configure... A. If it's not the configuration, then it's usually a problem with your specific system, either: - A new release of a supported OS. - An uncommon option/configuration of a supported OS. In other words, something is different from what we've seen or expected. Review the output from make. The error message will usually give you a Somewhat cryptic description of what's wrong and where. Look for messages about missing files. Post as much information as you can - do locates for the missing files, etc. The more you give us the less we will have to ask you to provide. Remember, we can't see your box - all that the people on the list see is the information you give in your message. Q. Compile dies because it's missing depcomp A. automake/autoconf issue. The problem should have been fixed. If not, just Copy the missing file (or make a symbolic link) into the ntop source directory. It's in /usr/share/automake on my Linux boxes. Another user reports it is in /usr/local/share/automake in sun8. If you have automake installed, this will do it automatically: $ automake --add-missing --gnu -c Q. Make fails with a message about being unable to create a .deps file. A. Check the permissions on the (hidden) .deps (and .libs) directories - if root owns them your non-root userid may not be able to create files in there. Q. Make fails with a message like this: /bin/ld: Warning: size of symbol `pcap_open_dead' changed from 100 to 67 in pcap.o collect2: ld returned 1 exit status make[2]: *** [libntop.la] Error 1 make[2]: Leaving directory `/linuxadmin/ntop/ntop2.2.3/ntop-2.2.3' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/linuxadmin/ntop/ntop2.2.3/ntop-2.2.3' make: *** [all] Error 2 A. Ah yes, size of symbol...changed. It means you have a conflict between the version of the shared library (be it libpcap, libgd, whatever) that was used to compile ntop with the version that was used to link ntop. Q. 'splain please... A. If you break down a typical link line: gcc -shared address.lo ... ntop_darwin.lo -L/usr/local/include -L/usr/local/lib -L/linuxadmin/ntop/ntop2.2.3/ntop-2.2.3/myrrd -lpthread -lresolv -lnsl -lz -lc -lssl -lcrypto -lgd -lpng -lpcap /usr/lib/libgdbm.so -lmyrrd -Wl,-soname -Wl,libntop-2.2.3.so -o .libs/libntop-2.2.3.so You see the mix of -L and -l parameters. The -L parameters ADD additional places to look for the shared libraries, which are in addition to the 'standard locations' for the system. The -l parameters tell which libraries to include. Read the man pages (man ld, man ld.so, etc.) The 'standard locations' are very system dependent, but usually include /usr/lib and /lib. PLUS whatever is (under Linux) in the ld.so.conf file, for example $ cat /etc/ld.so.conf /usr/kerberos/lib /usr/X11R6/lib /usr/lib/qt-3.0.5/lib /usr/local/lib So, on this system, to resolve a library, ld looks in the -L values: 1. /usr/local/include 2. /usr/local/lib 3. /linuxadmin/ntop/ntop2.2.3/ntop-2.2.3/myrrd And then the 'standard' places: 4. /usr/kerberos/lib 5. /usr/X11R6/lib 6. /usr/lib/qt-3.0.5/lib 7. /usr/local/lib 8. /lib 9. /usr/lib Similarly, if you break apart the gcc COMPILE line and scrap the dups, you'll have a different set of places where gcc looks for the .h files. For those, it's the -I parameters plus whatever is 'standard' on your system, which is dependent on the specific gcc port: /bin/sh ./libtool --mode=compile gcc -DHAVE_CONFIG_H -DLINUX -I. -I/linuxadmin/ntop/ntop2.2.3/ntop-2.2.3/myrrd -I/usr/local/include -g -O2 -fPIC -g -O2 -c -Wshadow ... -Wnested-externs -o ntop_darwin.lo Again, read the gcc man page. A big problem is that - unlike .so files, it's not real clear what directories ARE searched for .h files, only that there is a set. With me so far? Go back to the message... what it means is that: * From one set of locations, at compile time, the size of the parameter list for pcap_open_dead was 100 bytes. * From the other set of locations, at link (ld) time, the library expects the parameter list to be of size 67. Danger, Will Robinson... The most likely cause of this problem is when you tell ntop to look at one location to resolve either the .h or .so and it finds the other, 'automatically' in a 'standard' location, but the two are actually from incompatible versions. Say you have libpcap 0.6.2 installed by the os in /usr/lib and /usr/include, but you also install libpcap 0.7.2 in /usr/local/lib and /usr/local/include. $ locate pcap.h /usr/include/pcap.h /usr/local/include/pcap.h and $ locate libpcap.so /usr/lib/libpcap.so.0 /usr/lib/libpcap.so /usr/lib/libpcap.so.0.6.2 /usr/lib/libpcap.so.0.6 /usr/local/lib/libpcap.so.0 /usr/local/lib/libpcap.so /usr/local/lib/libpcap.so.0.7.2 /usr/local/lib/libpcap.so.0.7 If all you give ./configure is --with-pcap-header=/usr/local/lib * At compile time, it finds the pcap.h in /usr/local/lib (0.7.2) * At link time, it finds the libpcap.so in the 'default', /usr/lib/libpcap.so which is actually libpcap.so.0.6.2 ntop did EXACTLY what you told it to do. The fact that it makes no sense is a problem, so you get the error message. Q. So the real solution is? A. Give ntop pointers to consistent sets of header and library files, and maybe don't have multiple versions of the same library installed at once. Q. I'm done compiling and it works/doesn't work, what do I do? A. make install (You'll typically need to be root for this to work) Q. I'm seeing a lot of "changing search order for system directory" messages? A. It's not a problem, just confusing. This warning, which appears if you redefine the system include directory, causes lots of confusion. Supposedly, according to this http://gcc.gnu.org/ml/gcc-bugs/2002-10/msg01080.html, it wasn't fixed in gcc 3.2.0, but should be fixed in gcc 3.2.1. According to this: http://gcc.gnu.org/onlinedocs/cpp/Invocation.html, it's truly harmless on systems which already have /usr/local/include as a standard system library: -I dir Add the directory dir to the list of directories to be searched for header files. See Search Path. Directories named by -I are searched before the standard system include directories. If the directory dir is a standard system include directory, the option is ignored to ensure that the default search order for system directories and the special treatment of system headers are not defeated (see System Headers) . -------------------------------------------------------------------------------- -----Other ./configure features------------------------------------------------- -------------------------------------------------------------------------------- Q. How do I update the Vendor Table (MAC address prefixes)? A. ntop has (in Makefile), a rule to automatically download the latest vendor information table from the IEEE, the oui.txt file ntop reads. If you are seeing unknown MAC address prefixes (the 1st three units), try the full IEEE table. To rebuild it: # make dnvt and then copy the new oui.txt over the one installed by ntop originally. Also note that the table changes over time - there are almost 600 Modifications and/or new assignments between the version shipped with ntop 2.0 and the version on the IEEE site in February 2002. Q. How do I update the passive ethernet fingerprint database? A. ntop has (in Makefile), a rule to automatically download the latest ettercap file from SourceForge: # make dnetter It will also compress the file and tell you how big the old and new files were. Q. How do I update the IP to Country Code table? A. Again, ntop has (in Makefile), a rule to automatically download the latest data and build the file. # make p2c Note that this is actually a fairly complex script (utils/p2c) and is dependent upon data posted to supposedly well known locations by the various internet number authorities (APNIC, RIPE, etc.) It's a LOT of data to download so don't do this on a site with a slow link to the internet. Also, read the output carefully and DO NOT apply a file if there are messages you don't understand. Q. But the IP -> CC data is wrong. A. Yeah. Most people don't care :-(... it's enough to see various pretty flags. Sadly, the registries often post files with errors in them. Some Tier 1 ISPs post their own data to elaborate on the registry data. Most ISPs don't post data. Some entries in the files make 'logical' sense, but not physical sense. If you find another set of data, let us know - the shell script is pretty easy to follow to add another data source. The user who used to care about this (Mr. Anon E. Mouse) used to send me a file of corrections to apply to the file we posted with ntop. If such a file exists, it would be posted @ SourceForge in the user contributed area. Q. I have installed ntop for OSX but I cannot start it as I have installed some libraries using fink and ntop cannot find them. A. The easiest thing to do is to do: ln -s /sw/lib/myfinklibrary /usr/local/lib Courtesy of Matthew Scholz -------------------------------------------------------------------------------- -----Running - Startup---------------------------------------------------------- -------------------------------------------------------------------------------- Q. ntop won't start - I get this message: ** FATAL ERROR** ... open of /var/ntop/addressQueue.db failed: File open error A. It's either permissions (the ntop -u userid doesn't have read/write access to that file - common if you're upgrading from 2.2 to 3.0). The other cause is that there's still an instance of ntop running. Make sure you shutdown ntop before starting it. Q. What is the function of the 'ntop' script in the build directory - should I call it or /usr/local/bin/ntop ? A. (from the comments in the script): # ntop - temporary wrapper script for .libs/ntop # Generated by ltmain.sh - GNU libtool 1.4 (1.920 2001/04/24 23:26:18) # # The ntop program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. It allows you to run ntop out of the build directory before doing a "make install" by doing all the necessary linkage magic - such as forcing a relink if it didn't succeed originally - to the files in .libs. Think of it as simulating make install, but not moving stuff to /usr/local or wherever. Don't use it - it just causes problems... Q. Which libraries do I need? A. To run ntop: glibc, gdbm, libpcap For https://, add openssl. For other tools and compile options, add the appropriate libraries. Q. ntop seems to run, but the web server isn't up. A. Set the password - see docs/1STRUN.TXT Q. How do you reset Admin password if we lost it? A. Delete ntop_pw.db and follow the procedure in docs/1STRUN.txt Q. I'm being prompted to set a password, what do I enter. A. Anything you want, of 5 or more characters. If ntop can't find the value in it's database, it will prompt you to set on. If this happens every time you start ntop, check the permissions on the ntop_pw.db file. Q. Characters after the 8th are being ignored in my password. A. Probably. ntop uses the standard crypt() function provided by the OS. While crypt() is required part of the single unix specification, the details are implementation dependent. Whatever the limitations of crypt() are, that what ntop's limits are. Unfortunately, there's no way to tell programatically what these limits are, you have to refer to the man page for crypt(3). There is a "GNU EXTENSION" to crypt() which implies that changing the 'salt' ntop uses would allow longer passwords. That's set via CONST_CRYPT_SALT in globals-defines.h, but AFAIK this hasn't been tested. Q. How does the @filename option work e.g. /usr/bin/ntop ... @filename ... A. The text of 'filename', is copied - ignoring line breaks and comments (anything following a #) - into the command line. ntop behaves as if all of the text had simply been typed directly on the command line. Multiple @s are permitted in the command line, nesting is not. @s in the file will cause an error. Both are displayed on the info.html report, the "Started as" shows the actual command line ntop was given and the "Resolved to" shows what ntop processed. Started as /usr/bin/ntop -i eth0,eth1 @/root/ntop_parms -d -L with /root/ntop_parms containing: -p /usr/share/ntop/protocol.list -P /usr/share/ntop -w 192.168.42.38:3000 # -W 192.168.42.38:3001 -u ntop --trace-level 3 -m 12.239.0.0/16,10.113.0.0/16 -E -K becomes: Resolved to /usr/bin/ntop -i eth0,eth1 -p /usr/share/ntop/protocol.list -P /usr/share/ntop -w 192.168.42.38 -u ntop --trace-level 3 -m 12.239.0.0/16,10.113.0.0/16 -E -K -d -L Remember, most ntop options are "sticky", that is they just set an internal flag. Invoking them multiple times doesn't change ntop's behavior. However, options that set a value, such as --trace-level, will use the LAST value given: --trace-level 2 --trace-level 3 will run as --trace-level 3. It is recommended that you use FULL pathnames for @filename, since ntop may have different effective directories when run in different ways. However, you may wish to use relative pathnames to take advantage of the different effective directories (say cron vs. command line). Just know where you're starting. Q. ntop seems to run but I don't see any traffic. A. Make sure you aren't running against the loopback (127.0.0.1) interface. lo shouldn't see much traffic, only that originating on the host destined for it (e.g. ping 127.0.0.1). Q. ntop is unable to open its database file. Specifically: I have following messages while running ntop wait please: ntop is coming up... 24/Jul/2003 15:15:23 Initializing IP services... 24/Jul/2003 15:15:23 Initializing GDBM... 24/Jul/2003 15:15:23 ***FATAL_ERROR*** open of ...name... failed: can't be writer 24/Jul/2003 15:15:23 Possible solution: please use '-P ' A. Multiple possible choices... * Another ntop already running (Most common) You forgot the -P parameter, and ntop is using a default value that doesn't exist. Just as the message says, use the -P parameter to point ntop at the directory you want it to use. * Some sort of file system problem (non-existent directory, permissions, etc.) 1. The directory shown doesn't exist. Create it. 2. You many not have read/write rights in that directory. This can occur if you run ntop both as root and (as recommended) as a non-root user. 3. Another instance of ntop may already be running, so it has the file open and locked. Q. What's inside the .db files and what's their format? A. The files are stored in GDBM format. You can dump their content using tools like this: http://tboudet.free.fr/dumpgdbm/. In principle you should not be interested in the file content as they are temporary caches and contain the configuration as well as the MD5 hash of the web passwords. I posted a trivial dumpgdbm.c to gmane - search for it. Q. ntop starts up with this: WARNING: Discarded network 172.20.0.0/16: this is the local network. A. No worries. The message means exactly what it says - it's a warning that you gave the local network as one of the parameter(s) to -m. Since the local networks are always local, ntop doesn't need to make them pseudo-local. Q. What are ntop's options? A. There are a couple of options that appear only if they're not compiled in, and a few that depend on various external libraries, e.g. openSSL. The best way to see what is actually available is to run ntop with the -h or --help options and see. Also read man ntop. Q. -4 and -6? A. The default for the ntop web server is to connect to any address and any family of addresses, so if the NIC has both IPv4 and IPv6 addresses it should respond to both. Use these to restrict the web server. Q. --trace-level? A. The settings 0..4 control the amount of information logged or displayed. DETAIL (5) adds a [MSGIDnnnn] field and (VERYNOISY) 6 or greater adds the file:line where the message originated. -t 5 can be useful with a log watch type package, -t 6 is mostly for debugging. -t 5: [MSGID8757584] OSFP: scanFingerprintLoop() checked 1, resolved 1 -t 6: [MSGID8757584] [ntop:698] OSFP: scanFingerprintLoop() checked 1, resolved 1 With 3.2 we've added VERYNOISY and (7) BEYONDNOISY ... they do pretty much what they say. Have LOTS of log space available. Q. ntop starts up find and then seems to die. A. Are the ntop threads still there? Use ps to check, for example: # ps -C ntop -m -o "uid,pid,ppid,stat,time,command" UID PID PPID STAT TIME COMMAND 501 18327 1 S 00:00:00 /usr/bin/ntop -i eth1,eth2 @/etc/ntop.conf... 501 18330 18327 S 00:00:00 /usr/bin/ntop -i eth1,eth2 @/etc/ntop.conf... 501 18331 18330 S 00:00:05 /usr/bin/ntop -i eth1,eth2 @/etc/ntop.conf... 501 18332 18330 S 00:00:45 /usr/bin/ntop -i eth1,eth2 @/etc/ntop.conf... 501 18333 18330 S 00:00:00 /usr/bin/ntop -i eth1,eth2 @/etc/ntop.conf... 501 18334 18330 S 00:00:06 /usr/bin/ntop -i eth1,eth2 @/etc/ntop.conf... 501 18335 18330 S 00:00:00 /usr/bin/ntop -i eth1,eth2 @/etc/ntop.conf... 501 18336 18330 R 00:00:32 /usr/bin/ntop -i eth1,eth2 @/etc/ntop.conf... 501 18337 18330 S 00:00:41 /usr/bin/ntop -i eth1,eth2 @/etc/ntop.conf... The 'PID' numbers match the THREADMGMT: numbers in the log: ntop[18326]: INIT: Parent process is exiting (this is normal) ^^^^^ is the thread that issued the message ntop[18327]: INIT: Bye bye: I'm becoming a daemon... (18327 is the 'master' thread created as ntop becomes a daemon) ntop[18327]: THREADMGMT[t105061296]: SFP: Started thread for fingerprinting A message is issued for each thread started. t^^^^^^^^^ is the 'internal' thread #. Ignore it ntop[18331]: THREADMGMT[t105061296]: SFP: Fingerprint scan thread starting [18331] p^^^^^ is the child pid. Each one issues a message as it starts up So: UID PID PPID STAT TIME is 501 18327 1 S 00:00:00 Master 501 18330 18327 S 00:00:00 (internal used by POSIX) 501 18331 18330 S 00:00:05 Packet processor 501 18332 18330 S 00:00:45 Idle Host Scan 501 18333 18330 S 00:00:00 Address Resolution 501 18334 18330 S 00:00:06 rrd 501 18335 18330 S 00:00:00 Web Server 501 18336 18330 R 00:00:32 eth1 501 18337 18330 S 00:00:41 eth2 If you connect to the running ntop via gdb, you can see this: $ gdb /usr/bin/ntop 18327 (gdb) info threads ^^^^^^^^^^^^ Shows all the threads and their current state 9 Thread 114696 (LWP 18337) 0x40255c68 in recvfrom () from /lib/i686/libpthread.so.0 8 Thread 98311 (LWP 18336) 0x40255c68 in recvfrom () from /lib/i686/libpthread.so.0 7 Thread 81926 (LWP 18335) 0x420dcc31 in select () from /lib/i686/libc.so.6 6 Thread 65541 (LWP 18334) 0x420b0226 in nanosleep () from /lib/i686/libc.so.6 5 Thread 49156 (LWP 18333) 0x40252a35 in __pthread_sigsuspend () from /lib/i686/libpthread.so.0 4 Thread 32771 (LWP 18332) 0x420b0226 in nanosleep () from /lib/i686/libc.so.6 3 Thread 16386 (LWP 18331) 0x40252a35 in __pthread_sigsuspend () from /lib/i686/libpthread.so.0 2 Thread 32769 (LWP 18330) 0x420db1a7 in poll () from /lib/i686/libc.so.6 1 Thread 16384 (LWP 18327) 0x420b0226 in nanosleep () from /lib/i686/libc.so.6 (gdb) thread 2 ^^^^^^^^ switch to thread 2 and see it's state [Switching to thread 2 (Thread 32769 (LWP 18330))]#0 0x420db1a7 in poll () from /lib/i686/libc.so.6 (gdb) info stack ^^^^^^^^^^ check the call stack #0 0x420db1a7 in poll () from /lib/i686/libc.so.6 #1 0x4024f9de in __pthread_manager () from /lib/i686/libpthread.so.0 ^^^^^^^^^^^^^^^^^ running __pthread_manager Q. All the threads seem to be running ok. A. Check if there's one that looks like this: 4 Thread 32771 (LWP 27295) 0x420cd207 in sched_yield () from /lib/i686/libc.so.6 Let ntop run a few more seconds (cont command), then check again. If it's frozen in the sched_yield, you're probably tripping a deadlock situation that we've seen but don't understand - There's a lot of stuff on the 'net, including what seems to be the same problem with other resource intensive tools but no clear answers. This happens most often on RedHat Linux 8.0 (9 uses a different threading library and the issue hasn't been reported there). Regardless, if you see the deadlock or just have a hung ntop, there is a run time option to try: --disable-schedyield. This option disables the calls at a slight penalty to ntop's interactivness. If you're experiencing the deadlocks, try it. And, especially if you're running something other than RedHat 8, please let the ntop-dev list know about it. Q. Can I set the admin password from a script? A. Yes, you can call ntop with the option: ntop --set-admin-password=password Q. What's this warning about ownership? A. The first time you run make install and ntop creates a new directory for ntop's files, there's a problem. So you'll see this warning box: ************************************************************ ************************************************************ WARNING: This install created a directory for the ntop files and databases: some directory... This directory MUST be owned by the user which you are going to use to run ntop. The command you must issue is something like: chown -R ntop.ntop or chown -R ntop:users man chown to check the syntax for YOUR system ************************************************************ ************************************************************ Since root created the directory, root is the owner. And since we don't know - yet - what user ntop is going to be run as, we can't issue the chown (CHange OWNership) command for you. Q. And if I don't do this? A. ntop won't run. Typically you get a message about a bad -P file or endless prompts for the admin password. Q. I can't merge interfaces (-M option)? A. Check your plugins and see if either netFlow or sFlow is active. Regardless of whether you're using them, if they're active, they (silently) force the -M switch on. If you have used the web configuration to set this, you may be unintentionally overriding your command line. With v3.2 there are log messages telling you what sets interface merge. NOTE: Interface merge disabled by default NOTE: Interface merge enabled by default NOTE: Interface merge disabled from prefs file NOTE: Interface merge enabled from prefs file NOTE: Interface merge disabled due to command line switch Q. Explain -u. A. -u root means that you are running ntop as root. It means you don't drop root's superuser privledges, so pretty much you can read/write any file. It's not a good idea. While we're not aware of any security problems with ntop, programs that run as root are targets. -u ntop (or -u whatever) means you run as a normal user and can be assigned only the privledges necessary to run ntop. It also means you can only read/ write files as ntop. So less is exposed. For even better security, the -u userid should not have a valid shell, so people can't use it to login. Q. What are the options that reduce ntop's workload? A. These options turn off certain processing (and thus limit ntop's functionality), and may be appropriate for high volume installations. -b | --disable-decoders This flag disables protocol decoders. Use it for better performance or if you feel ntop has problems handling these protocols in your environment. This switch disables code in a number of places throughout ntop, code which analyzes specific protocols, but can place additional load on the host. This switch could be used to run ntop on low-end CPUs or where ntop is acting as a collector (netFlow or sFlow) and the GUI is not required. Disabled is the analysis of: DNS Sniffing - where ntop captures DNS information from other hosts' requests to reduce the # of DNS requests ntop must - itself - make. NetBIOS \ NetWare \ AppleTalk -- resource intensive protocol analysis of less bootp/dhcp / common protocols. OSI / http (80) - Request success/failure counting on port 80 and other analysis, including "Virtual Host". ftp passive session tracking. "Wrong Port" monitoring for: http, ftp and smtp (used with the -q | --create-suspicious-packets option to dump "suspicious" packets to an analysis file) With this option, ntop checks the payload for each new connection, looking for text usually present in http, ftp or smtp requests. If these are not on the "normal" ports (http's 80, ntop's 3000 or squid's 3128, ftp's 21 or smtp's 25) (or there is a non-ftp or smtp request on the standard ports), the packet is logged. -g | --track-local-hosts Use this flag to tell ntop that you care only about local hosts (use -m | -- local-subnets to specify local nets). This flag is useful when ntop sees many hosts (e.g. border gateway) but only the local ones need to be tracked. This switch disables code in a number of places throughout ntop, code which allows ntop to track "foreign" hosts (that is ones not local according to the IP address(es) of ntop's interfaces or set pseudo-local by -m | -- local-subnets). Basically, ntop doesn't bother to do DNS resolution on these addresses and, for purposes of various counts, uses the "other" bucket instead of creating a unique hash table bucket for the specific host. This switch could be used to run ntop on low-end CPUs or where ntop is acting as a collector (netFlow or sFlow) and the GUI is not required. -o | --no-mac Specifies that ntop should not trust MAC addresses but just IP addresses. This option is useful whenever ntop is started on an interface where MAC (Media Access Controller - the low-level Ethernet address) addresses can not really be trusted (e.g. port/VLAN mirror in Switched Ethernet environments). Certain processing is performed differently: Hash search is via IP not MAC Certain capabilities are disabled: Analysis of bootp/dhcp requests localRoutersList.html report Wrong net mask log message and flag Analysis of non-tcp/udp protocols like NetWare and Spanning Tree Router listing on Host Detailed report. Traffic Matrix report (Note that this list is subject to change as we learn more about protocols that do/do not depend on the MAC address) See also -z | --disable-sessions -z | --disable-sessions This flag disables tcp session tracking. Use it for better performance or when you don't really need the tracking of sessions. Also, in situations where the MAC addresses cannot be trusted, ntop may - or may not - be able to accurately track tcp sessions. There is no easy way to tell, so this switch puts control back into the users' hands. In versions after 2.0 up to & including 2.1.2, the -j | --border-sniffer-mode flag (predecessor of -o | --no-mac) always turned this off. Many users wanted to try turning session tracking back on, and did via code patches with mixed results. Suggested usage: If you enable -o | --no-mac, try running ntop with sessions enabled. If the data looks reasonable, congratulations - your network allows session tracking. If the data does not look reasonable, then you will also need to disable session tracking with this switch. Q. -s | --no-promiscuous doesn't work A. It should work - it's passed to pcap_open_live. But, whether the flag is supported by the OS and whether it is actually respected by the interface depends on libpcap. If it fails, you'll see a message and ntop will refuse to startup. Understand that if it actually does work, it means that ntop sees a lot less comprehensive view of the traffic. But from the ntop web server, you won't see anything different. You can check (*nix) by executing ifconfig on the interface. Note that the parameter specifies if the interface is to be put into promiscuous mode because of ntop. Even if this parameter is false, the interface could well be in promiscuous mode for some other reason. And in some situations, the interface may be forced by the low level driver into promiscuous mode, without reporting this to the kernel! Q. How does -m | --local-subnets work? A. This flag allows users to specify the subnets whose traffic is considered local (called "pseudoLocal" internally). The format is /<# subnet mask bits>[,/<# subnet mask bits> For instance "131.114.21.0/24,10.0.0.0/255.0.0.0". Q. (followup) but what does it MEAN? A. Surprisingly, it means EXACTLY what it says. Treat traffic on the listed subnet(s) as local. -m relates to the traffic you see on the wire at the TCP/IP level. -m tells ntop something it can't determine by itself. And that is to treat a range of addresses EXACTLY like it was local. For example, on my Cable Modem, I see broadcasts for a number of subnets that AT&T (now Comcast) has assigned to this area (I don't see the traffic just the broadcasts). If you have VLANs or simply network overlays (two or more networks on the same wire, but with separate address spaces). etc. Those are the cases where you use -m. To tell ntop to treat that traffic as local. Q. Why A ntop differentiates between local traffic and remote traffic. There are actually four classes (although only three are routinely reported) L->L L->R R->L and R->R. Some additional processing is done and some additional reporting is available for L traffic. Q. I'm confused. Explain, please! A. Suppose your IP is 1.2.3.4 with a 255.255.255.0 netmask (a/k/a 1.2.3.4/24) Under the TCP/IP protocol, traffic with any address 1.2.3.1 -> 1.2.3.254 does not get routed. It's "local". Your buddy is at 1.2.3.9 and the router is 1.2.3.1, so your network looks like this: the +--------+ world-----+ Router +--1.2.3.1-------------------------------------- +dog +--------+ | 1.2.3.4 | 1.2.3.9 +--------+ +--------+ | You | | Buddy | +--------+ +--------+ Say you send a packet to your buddy at 1.2.3.9. You build a packet with SRC=1.2.3.4 DST=1.2.3.9 and your data and cast it out the wire. (For purposes of this illustration, ignore the fact the your TCP stack would recognize the "local" nature of the packet and actually use another, lower level protocol, called Ethernet to deliver it.) The router (1.2.3.1) looks at it, does the math and ignores it - it's local Your buddy (1.2.3.9) looks at it, says - gee, that's me and reads it This is L->L traffic. Now you send a packet to ntop.org at 131.114.21.9. Again, SRC=1.2.3.4 and Now DST=131.114.21.9. The router (1.2.3.1) looks at it, does the math and says - oops, I have to send it out to the world. Your buddy (1.2.3.9) looks at it, says - gee that's NOT me and ignores it This is L->R traffic. Now it's perfectly possible to have multiple (physical) networks on the same physical wire. Say that your ISP chooses to put 1.2.4.1-1.2.4.254 (1.2.4.0/24) on the same wire. (Why would they do this? - maybe it's a big pipe and only a few users or whatever). A packet from 1.2.4.4 -> 1.2.4.9 is seen by The router - no, that too is local, ignore it You (1.2.3.4): (1.2.4.9) - not me - ignore it Buddy (1.2.3.9) - um... 1.2.4.9 - not me - ignore it And that's perfectly legal. But what if you are the ISP and you want ntop to see ALL the traffic on that wire? ntop will figure out from it's own IP address that the 1.2.3.0/24 traffic is local, but it will classify the 1.2.4.0/24 as REMOTE. And that is what the --local-subnets switch does. It tells ntop to treat that 1.2.4.0/24 traffic as local. If there isn't any other traffic on the wire, then telling ntop to treat it as local won't change a thing. You can always use a packet sniffer, such as tcpdump to scan the traffic on the wire and see what's really there... Q. And internally? A. ntop is designed as a hybrid packet analyzer, not a pure Ethernet analyzer (layer 2) nor a pure TCP/IP analyzer (layer 3). Most of ntop's displayed counts are at the TCP/IP level, and that's what confuses people. Internally, ntop works both at the level of the Ethernet frame and the TCP/IP packet. A single MAC address can be associated with multiple TCP/IP addresses. The MAC address -- unless something is horribly wrong on the network or with the hardware or somebody is deliberately spoofing it -- is guaranteed to be unique and refers to a physical host or network interface. For many reports, ntop displays the information using the MAC address to separate physical devices. Other data is accumulated and displayed at the TCP/IP (level 3) layer. -m relates to the traffic you see on the wire at the TCP/IP level. -m tells ntop something it can't determine by itself. And that is to treat that range of addresses EXACTLY like it was local. For example, on my Cable Modem, I see broadcasts for a number of subnets that AT&T has assigned to this area (I don't see the traffic, but you get the picture) in an overlay structure (two or more networks on the same wire, but with separate address spaces). Q. What about multicast traffic? A. Multicast traffic uses the 224.0.0.0/4 address range (that is all addresses between 224.0.0.0 and 239.255.255.255 - see RFC 1112). By default then, all multicast traffic is treated as 'Remote' by ntop. Your actual network topology may be such that multicast traffic could all be local, all be remote or a mixture. You can use the -m | --local-subnets parameter to force some (or all) multicast groups to be counted as 'Local' traffic. Q. What about VLANs? A. VLAN traffic is also a special case. ntop treats all traffic within your machine's netmask definition as 'Local'. For instance, you may have a /16 network (netmask of 255.255.0.0), and you are using VLANs to distribute the traffic. In this case ntop will see the a.b.c.d/16 address and classify all traffic within this /16 network as 'Local'. Don't design your network that way. Q. But they did! A. This MIGHT work: Use an un-numbered interface, so that ntop doesn't assign any implicit 'Local' addresses. Then use the -m | --local-subnets parameter to define what is truly 'Local'. As long as there aren't too many 'Local' networks, this should work. I run something sort of like this (but using /24s not subdividing a /16) for my development network. Q. What are the default protocols ntop monitors? A. (These are the ones ntop monitors if the user does not supply a -p parameter) Check addDefaultProtocols() in ntop.c around line 525. The current list (December 2004) is Protocol Ports -------- ----- FTP ftp ftp-data HTTP http www https 3128 /* 3128 is HTTP cache */ DNS name domain Telnet telnet login NBios-IP netbios-ns netbios-dgm netbios-ssn Mail pop-2 pop-3 pop3 kpop smtp imap imap2 DHCP/BOOTP 67-68 SNMP snmp snmp-trap NNTP nntp NFS/AFS mount pcnfs bwnfs nfsd nfsd-status 7000-7009 X11 6000-6010 SSH 22 Gnutella 6346 6347 6348 Morpheus 1214 WinMX 6699 7730 DirectConnect eDonkey 4661-4665 BitTorrent 6881-6999 6969 Messenger 1863 5000 5001 5190-5193 Note that the names come from /etc/services (or your system's equivalent). If you add protocols to /etc/services, you can refer to them by name on the -p parameter. REMEMBER: You must define the list using the format illustrated in the ntop man page. Don't try to read /etc/services. It will fail. The list changes over time as P2P protocols appear and disappear. Check the cvs and diff ntop.c (around line 550 in void addDefaultProtocols() if you want the history. Q. What about protocol XYZZY? A. The analysis of protocols is very limited and unsophisticated. But, theoretically, if it's there in plain text, we could report on it. The more work you can do up front in identifying the protocol (e.g. port #s, header structure, etc.), the easier it would be to add. Q. I am using a /16 (/25 or whatever) mask and I get this message: Truncated network size to 1024 hosts (real netmask 255.255.255.0) A. Yes. ntop limits each network to 1024 hosts (a /24). If you need more, alter the #define for MAX_SUBNET_HOSTS in globals-defines.h and recompile. Space has to be reserved for this many hosts for each network, so the limit exists to keep memory usage from growing to absurd levels on people with "class A" (/8) interfaces (e.g. 10. or Cable Modems, etc.). Q. What's with the version check? Q. Why is ntop connecting to jake.ntop.org? A. jake.ntop.org is the cannonical name for version.ntop.org, which hosts the xml file used for the version check. See the man page, 1st run log messages and/or privacyNotice.html page (Click on the "this" in this line: "For information on ntop and information privacy, see this page." on the 1st page ntop presents). -------------------------------------------------------------------------------- -----Running - On-going--------------------------------------------------------- -------------------------------------------------------------------------------- Q. Explain L and R - why doesn't ntop double count? A. Classification is all based on what ntop SEES in the packets. ntop sees packets and ONLY packets. Packets have a FROM and a TO address. Which packets ntop sees is determined by the interfaces it is monitoring. Traffic (packets) is classified based on the joint classification of the FROM address (L or R) and the TO address (L or R). Only in L->L traffic will ntop see sent=rcvd and 'double count'. Host: 192.168.1.x www.yahoo.com L->R R->L L->R R->L S R S R S R S R 192.168.1.x>www.yahoo.com HTTP GET ... 30 . . . . . . 30 www.yahoo.com>192.168.1.x HTTP 200 . . . 8 8 . . . www.yahoo.com>192.168.1.x . . .200 200 . . . ... etc. Q. Why does ntop use so much memory ? A. ntop holds a lot of information about each host it has seen in an in-memory table. Periodically, it looks at all the entries in the table and flushes any which have been idle for a period of time. You can change the sizing of the table and the flushing interval via #define statements in globals-defines.h. But realistically, ntop needs enough memory to hold information about what's active on YOUR network. To reduce memory, monitor fewer protocols or use the filter (-B "bpf filter") option to monitor only parts of the network. There have been a couple of discussions on the ntop mailing list about ntop's memory usage - you might read them (search on gmane). Q. Database. A. No way. This data just can't be stored in a database - while each record (row) is small, we're talking 1000s of updates/second. As in Enterprise Oracle class speeds... A. ntop's memory usage for host tables depends on the # of hosts it sees in packet traffic. This is NOT, repeat NOT controllable by ntop in ANY way. If a user kicks off a port scan, 100s of hosts appear. If somebody does a DOS attack against you, 1000s of hosts 'appear'. If a user searches Kazza for an obscure song, it can probe 4K hosts. etc. Lots of those hosts appear, have a few bytes of traffic and then disappear. Each host has a variable amount of memory - there's a base structure, some optional counter structures and a large # of pointer fields, which may or may not be valued for any given host. It depends on the # of active sessions and a lot of other things, but 8-20K is a good guess - I usually use 12K as an guestimating size. Similarly, sessions may appear and disappear (http: opens a lot, does a small retrieval and closes them), ssh may last for days. etc. Memory is consumed tracking them too. It's not just one table entry per host - there are a lot of ancillary tables which only get allocated if you have data for them. Q. Got a guess? A. Sure. Look in textinfo.html and you will see the line: (very) Approximate memory per host.....4.4KB I'm not sure how much I trust this and I wrote it. This calculation just computes the (current usage - baseline) / # of hosts. Q. So ntop's memory usage is dependent upon? Q. So what does the purge do? A. ntop purges idle hosts. Period. Idle being defined as having not had packet traffic for a #define able period, 5 minutes by default. Because of the amount of linked data, these purges take time (lots of free() calls on all those char* values), so we don't purge in 'real time'. First we build a list of idle hosts, then we purge from that list. Any idle host is eligible for purge (unless you tell ntop not to purge idle hosts, which is usable only on small networks). Over time, all idle hosts are purged. Only to be perturbed by the next burst of activity - say a port scan or everybody logging in back in after lunch. Eventually, there's some form of steady state, but it's HIGHLY dependent upon network activity. Which, remember, is external to ntop and can't be predicted. Q. Why? A. Think about the overhead of sorting this huge structure by 'last packet seen time'. 1GB of ram is something like 80K+ hosts and takes a long time to sort (let alone free). During which time, on that busy network, a couple of dozen packets are processed... Meaning maybe your list of idle hosts is wrong. Q. So how about a hard memory limit? A. There's no way to make a hard limit without purging ACTIVE hosts (or non-IDLE given ntop's definition of idle). Think about it ... you're at that 1GB limit and you find a new host. Do you kick off an interim purge (with it's huge overhead?) And wait 2 or 3 s for an available slot?? While 1000s of other packets appear?? Q. Soft limit? A. It might, might, be possible as a soft limit - but it's got a lot of issues. First off, tracking memory usage of the hosts tables is itself a huge job. There are multiple places were stuff is purged, added to the structures as pointers, etc. and there's a queue of purged entries for reuse to cut down on the malloc() calls. Secondly, the purge is resource intensive, and has been the cause of deadlocks before - you don't dare lock the structures for too long - packets keep arriving, and FAST on the busy network that has the memory issues in the first place. Since you can't lock for long, you can only purge a small # of entries. Q. But what about -x and -X. A. Ah, yes, grasshopper - you have been reading the man page. Good user. The -x and -X options are pretty crude. They say "if you have allocated n (hosts|sessions), fail the allocation of (host|session) n+1". It works in the context of preventing memory exhaustion - if you can calculate the right values based on your available memory (and remember that 4K or 12K or whatever per host value is an AVERAGE). And, no, you can't make them memory dependent - it's all ultimately virtual and ntop doesn't get indication of whether a malloc() call causes swapping. It either works because the allocation (total) is under your limit (or the hard limit of real memory + swap space - OS usage), or it fails. This type of limit can't make sure you save only the RIGHT hosts. Q. These options aren't very smart, are they? A. No. They don't know anything about the hosts. Just the # of them. So failing an allocation might hurt in that the n+1th host might be an important one and yet host #2 is basically trivial junk (the printer that sends and "I'm here" message every three minutes). It also causes overhead, because the next packet for host n+1 will attempt to allocate a record and fail. Again and again. But these options may keep ntop from crashing and that's a good thing. If you use them, I would recommend setting them very high - just at the limit of what your memory permits. Use this as a last resort - say you get hit by a worm or virus. I recommend that you use other options such as filter and track-local-hosts for the day-to-day controls on what ntop tracks. Q. Why does ntop drop packets? A. We used to have an extensive discussion here. But with Luca's merge of ntop-ht into baseline, we shouldn't be dropping packets beyond whatever the OS is dropping. Until we've learned enought about ntop 3.2 and following, the whole discussion has been moved to FAQarchive. Q. ntop stops capturing packets, except ARP and other broadcasts. Why? A. Check if you have a daemon running that periodically checks for and resets interfaces in promiscuous mode? If that happens, all you would see were broadcast packets like ARPs... Check back in the log and see if there is a message about the interface changing status. Determine why. Q. How much horsepower do I need to run ntop on a network of size x? A. Nobody really knows. ntop needs enough memory to store the active hosts and enough cpu to keep up with the average packet flow. The buffer will handle the occasional peak, but if you see frequent lost packets, you're in trouble. Note that a few packets occasionally lost isn't a big deal for most users. After all, the network itself has losses - I've seen my AT&T Broadband connection have spurts of 30% packet loss. Ideally in a LAN environment, the packet loss should be down in the small #s... the Ethernet standard allows 1 error in 100,000,000(10^8), but most vendors beat that by a long margin (even as high as 1 in 10^12). Of course, those are lab measurements. In the real world? Not that good. Electrical noise can be a real bugaboo. Remember, at a certain point, if the NIC doesn't understand what it's seeing, it throws it away and declares an error. The key is to keep up with the traffic. Similarly, the OS kernel does the same thing in it's interrupt handling (throw away packets). Last resort, but better than hanging up the whole machine. ntop drops packets when the queue gets longer than the permitted length. You can see this in the configuration page as # Queued Pkts to Process and # Max Queued Pkts. One or two or a small number (you pick your tolerance) is ok, but constant losses isn't. What I'm saying is that as long as ntop can keep up with the NIC, then the data is as good as it gets... if ntop can't keep up, then the data isn't very good. If you have measurements - network size, traffic flow and %CPU used (with the hardware info, of course), shoot them over to us on ntop and someday maybe we'll be able to give better #s. Q. What about my Frobozz Model xx Magic Network card? Is it good enough? A. Probably. Well, a lot of the cheapos just don't have the buffering and cpu offload of a 3c905c or such. If the network isn't that busy, anything will do. For a busy network, buy a decent PCI NIC. Q. Gigabit Ethernet? A. No clue. Remember that you can suck a lot more traffic over that network than an old PC can handle (i.e. the bandwidth limitations of 32bit PCI and PC100/133 RAM, heck even PC2700 DDR). Q. Do "zero copy" drivers help? A. Yeah. Maybe. Once upon a time, I read about "zero copy" - look here http://people.freebsd.org/~ken/zero_copy/ for the FreeBSD stuff. Quoting: "What is "zero copy"? Zero copy is a misnomer, or an accurate description, depending on how you look at things. In the normal case, with network I/O, buffers are copied from the user process into the kernel on the send side, and from the kernel into the user process on the receiving side. That is the copy that is being eliminated in this case. The DMA or copy from the kernel into the NIC, or from the NIC into the kernel is not the copy that is being eliminated. In fact you can't eliminate that copy without taking packet processing out of the kernel altogether. (i.e. the kernel has to see the packet headers in order to determine what to do with the payload) Memory copies from userland into the kernel are one of the largest bottlenecks in network performance on a BSD system, so eliminating them can greatly increase network throughput, and decrease system load when CPU or memory bandwidth isn't the limiting factor." What's that mean? It means that BEST CASE, you have to copy the data NIC->Kernel and without zero copy, it happens TWICE. Then, once you're in the kernel, it has to hand the data off to libpcap (another copy) and from libpcap to ntop. So we're moving the data 3 or 4 times... best case! Let's do some off the cuff math. Looking here http://www6.tomshardware.com/mainboard/20020501/ddr400vsrambus-05.html shows a table of memory types and max bandwidth (picking a few): Label Name Effective Clock Data Bus Bandwidth PC100 SDRAM 100 MHz 64 Bit 0,8 GB/s PC133 SDRAM 133 MHz 64 Bit 1,06 GBb/s PC2700 DDR333 166 MHz 64 Bit 2,7 GB/s See the problem? A fully loaded GigE link is 1 Gb/s. 4x that is 0.5 GB/s - so if ALL that's going on is the capture of packets from the network, the CPU can keep up. Maybe. Those bandwidth numbers are theoretical, best case (nice sequential access). Throw in some other system activity, cache misses and CAS/RAS issues... and um... The moral is that if you're going to use ntop to monitor big fat links, you need screaming fast iron. Q. Can I disable logging? Totally? A. No. Q. I'm seeing weird "hosts" on my network with names like "Bridge Sp. Tree/OSI Route". What are they? A. There is a list of "special" MAC address prefixes in vendor.c, specialMacInfo[]. There are blocks of MAC addresses reserved (sometimes not formally) for special uses, such as sharing information about Spanning Tree for bridges. These do not have an IP address - they operate at a lower level - so nothing gets displayed in some of ntop's fields. A reference about protocols at the wire level is here: http://www.oreillynet.com/pub/a/network/2001/03/02/net_2nd_lang.html If you only want to see TCP/IP, then I suggest you use -B "ip" to filter only TCP/IP protocol on your ntop line... Q. How do I see fully qualified names for all my hosts? Some are netbios names! A. ntop doesn't SEND NetBIOS queries, it sniffs them off the traffic already on the network. There is only ONE case where ntop uses the NetBIOS names, which is if it can't resolve them via DNS (both it's own queries and from sniffing responses to other's queries off the network). So, if you have a properly functioning DNS, you'll see DNS names. If these are (for example) internal names, unknown to the DNS server, you'll see NetBIOS names if they are available. Lastly, you'll get IP addresses... If you do have a DNS, and the name is resolved as part of the default domain, you won't see a fully qualified name back from the DNS, so ntop won't have that information. So, on a real network you'll often get a mix of name resolution types: Host IP Address MAC Address Other Name(s) netnews.attbi.com 63.240.76.16 tigger.homeportal.2wire.net 192.168.0.xx 00:D0:09:xx:xx:xx homeportal.homeportal.2wire.net 192.168.0.1 00:D0:9E:xx:xx:xx swallowtail 192.168.0.XX 00:A0:CC:xx:xx:xx SWTL [DMN] 12-xxx-xxx-xxx.client.attbi.com 12.xxx.xxx.xxx 00:D0:9E:xx:xx:xx 12-xxx-xxx-yyy.client.attbi.com 12.xxx.xxx.yyy Q. What does this log message (and others like it) mean? **WARNING** releaseMutex() call with an UN-LOCKED mutex [hash.c:559] last unlock [pid 22176, pbuf.c:2598] A. Those messages are part of an error check in our mutex handling routines. If things are working properly, then these messages tell us things are really, really, really wrong. releaseMutex() call with an UN-LOCKED mutex means that the corresponding accessMutex() call never occured. releaseMutex() call with an UN-INITIALIZED mutex means that the access/release occured before the createMutex(). The file/line comments, e.g. [hash:559], tell you where the access/release was called from (e.g. hash.c @ 559) and where the last recorded release was. There are others, look in leaks.c for the entire set. Q. How serious are they? A. None of these stop ntop from processing, but they're indications of unprotected accesses to shared data areas, which could lead to lost counts. In the development cycle after 3.1 was released, I was able to track down and fix the remaining cause of spurious messages (but I've thought this was fixed before). For most users, these warning messages shouldn't be ignored. The root of the problem is that POSIX mutexes are stupid and don't record a lot of state information. To debug things like deadlock, it's really, really, nice to know where the mutex was locked from. So ntop has added 'extra' information to the mutex data for recording this. This added data is not protected by the mutex and could get out of sync. So we lock a state change mutex whenever we are changing the state data. BUT: You can't hold the state change mutex while waiting for the main mutex or you deadlock. So the 'access' call becomes this pattern (see utils.c): lock(statechangemutex) set state data tryLock(mutex) if(fails) { unlock(statechangemutex) lock(mutex) <-- which may block, but does not hold the statechangemutex! lock(statechangemutex) } set state data unlock(statechangemutex) Q. Threads. ugh... A. There's a good set of articles on POSIX threads at http://www-106.ibm.com/developerworks/library/l-posix1/, http://www-106.ibm.com/developerworks/library/l-posix2/ and http://www-106.ibm.com/developerworks/library/l-posix3/. Q. What does the message "URL security(1): ERROR: Found percent in URL...DANGER... rejecting request" mean? A. It means that ntop received a request with a percent sign (%) in it, often used as part of Unicode exploits against various web servers. Since there is no situation where ntop should process this, we reject it. URLsecurity in http.c is the place where these tests occur. Q. What does the message "Rejected request from address x.y.z.t (it previously sent ntop a bad request)" mean? A. Once you send ntop a request that URLsecurity rejects, the sending address goes into a ring buffer on a 5 minute timeout where we simply drop subsequent requests... rather than waste cycles ignoring an attack... Q. What are the other URL security(#) codes? A. 1. Found a % in the request (Unicode problems) 2. Found a parameter type code (//, &&, ??) 3. Found a directory transversal code (..) 4. Found a prohibited (RFC1945) character 5. Found a bad extension Q. ntop doesn't report any traffic at all. A. Understand how ntop works: It simply listens on the interface(s) for packets, then counts and interprets them. If there aren't any packets, ntop doesn't count things. ntop does not sample. It processes every packet it sees and counts them. Only if there is more traffic than ntop can handle for a long period of time will the packet queue hit it's limit and packets be lost. But this is still not sampling. Make sure that there's traffic on the interface(s) you are using. You can use tcpdump or a similar network sniffer tool to check. If you are on a segmented network (i.e. switched), you may not see traffic that isn't destined for the ntop machine unless you configure the switch to set the port for the ntop host into "mirror" or "management" mode (different vendors call it different things, but it's a mode where ALL traffic is copied to a specific port, regardless of which port the destination host is on). If there is more than one interface in the ntop host, perhaps you aren't listening on the one that has traffic? Check using ifconfig: eth0 Link encap:Ethernet HWaddr 00:D0:09:77:85:B9 inet addr:192.168.0.34 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1105906 errors:0 dropped:0 overruns:0 frame:0 TX packets:601935 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:119869887 (114.3 Mb) TX bytes:112203781 (107.0 Mb) Interrupt:11 Base address:0xc000 If the RX and TX numbers are increasing, this shows that traffic IS flowing... If you have an unnumbered interface (listening only), remember you need to use -m to tell ntop what is local and what isn't: eth1 Link encap:Ethernet HWaddr 00:30:F1:54:55:00 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:1596612 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:566953031 (540.6 Mb) TX bytes:0 (0.0 b) You can select an interface using the '-i' flag, e.g. -i eth1 or -i eth0,eth1. Q. ntop doesn't understand xxxxx? A. True. IP Packets have a source address & port and a destination address & port... you MUST get your head out of the application layers and revert to that simple concept. How does Apache handle virtual hosts? It analyzes the flow at the application level (layer 4) not the wire/packet/protocol (layers 1, 2 and 3). It does this by re-assembling packets into a layer 4 message (e.g. GET http://virtual.host.name.com/page.html)... Now there are some layer 4 analysis routines - virtual hosts was added in 2.2 (and the folks who have virtual hosts have been pretty pleased), ftp, http, and some others - mostly looking for traffic on non-standard ports, etc. So, since ntop works at the packet level, it doesn't understand virtual hosts. Unless it's SPECIFICALLY coded for. ntop is a NETWORK analyzer, not an application level one. Q. tcpwrappers doesn't work A. Oh yes it does... for http: connections 1) You have to configure it this way before compiling ntop: ./configure --enable-tcpwrap 2) You must have the headers and libraries installed on the build machine (and on the execution machine if they aren't the same). Remember to make the appropriate entries in hosts.allow (e.g. ntop:192.168.0.) and hosts.deny (e.g. ntop:ALL) However, tcpwrappers and https:// is known not to work - see docs/KNOWN_BUGS Q. My filter doesn't work! I'm running ntop like this: /usr/local/bin/ntop -u nobody -L -d -E -w 3000 \ -m 192.168.10.0/24,xxx.xxx.xxx.xxx/32 \ -M -i eth0,eth1 \ (src net 192.168.10.0/24 or src host xxx.xxx.xxx.xxx ) \ and not dst net 192.168.10.0/24 A. Yup, it doesn't work. Use the -B option and put the filter in quotes: -B "(src net 192.168.10.0/24 or src host xxx.xxx.xxx.xxx ) and not dst net 192.168.10.0/24" ntop used to assume anything it didn't recognize was a filter. But not since 2.1.3. If you try this now, you should see a log warning that says maybe you forgot the quotes Q. I have experienced problems defining multiple filters: ntop reports 'syntax error' A. If you believe the filter is syntactically correct then it's likely that the Libpcap you have used has been compiled using an old non-reentrant version of flex. Please make sure you're using version 2.5.4 or above. Q. Can you give some additional examples of filters? A. man tcpdump -- see "expression" A couple of simple examples, courtesy of B. Loic: -B "host not 192.168.1.100 and not 192.168.1.101" to exclude hosts 192.168.1.100 and 192.168.1.101 from tracking (FQDN such as www.yahoo.com will work too). If you need to exclude a full IP range, you will want to use something like -B "net not 192.168.1.0/24" Q. What about the backtrace? A. Sadly, probably useless. Why? Too much information isn't available: Here's one (and a pretty good, obvious one at that): ntop[23720]: **FATAL_ERROR** RRD: caught signal 11 SIGSEGV ntop[23720]: **FATAL_ERROR** RRD: BACKTRACE: backtrace is: ntop[23720]: **FATAL_ERROR** RRD: BACKTRACE: 1. /usr/bin/ntop [0x42028c48] ntop[23720]: **FATAL_ERROR** RRD: BACKTRACE: 2. /usr/bin/ntop(getopt_long+0x43) [0x420c4e83] ntop[23720]: **FATAL_ERROR** RRD: BACKTRACE: 3. /usr/lib/ntop/plugins/rrdPlugin.so(rrd_update+0x61) [0x44157f7d] ntop[23720]: **FATAL_ERROR** RRD: BACKTRACE: 4. /usr/lib/ntop/plugins/rrdPlugin.so [0x441481a2] ntop[23720]: **FATAL_ERROR** RRD: BACKTRACE: 5. /usr/lib/ntop/plugins/rrdPlugin.so(updateCounter+0x19) [0x44148a15] ntop[23720]: **FATAL_ERROR** RRD: BACKTRACE: 6. /usr/lib/ntop/plugins/rrdPlugin.so [0x4414ba49] ntop[23720]: **FATAL_ERROR** RRD: BACKTRACE: 7. /lib/i686/libpthread.so.0 [0x41138941] ntop[23720]: **FATAL_ERROR** RRD: BACKTRACE: 8. /usr/bin/ntop(__clone+0x3a) [0x420da1ca] See: It doesn't give the routines, just the hex offsets from some points in the executable. It seems to say that rrdPlugin's updateCounter called rrd_update which called getopt_long. But then getopt_long called something else and that's what died... plus we don't see the parameters. Sometimes it works great for me on my box, because I can use the tools to figure out precisely where it means. But often I use gdb too. Move off my box and the odds of your compile and my compile (and our ./configure and all the tool versions) matching so that the offsets mean something are pretty small. Q. What do these log messages mean? **ERROR** mVLAN: Host (identical IP/MAC) found on multiple VLANs mVLAN: ntop continues but will consolidate and thus probably overcount this traffic mVLAN: Up to 10 examples will be printed mVLAN: Host 192.168.aaa.bbb (00:12:17:xx:yy:zz) VLANs 3 and 4 A. Once again, they mean what they say. ntop found something pretty weird. It found packets for the same 'host' (that is the same IP and MAC address) on two different VLANs. In this case, IP 192.168.aaa.bbb, MAC 00:12:17:xx:yy:zz on VLAN 3 and VLAN 4. It's not WRONG, but it's definitely odd. If we see a packet twice, we count it twice, so - via this message - we're warning you that we might be double counting some traffic. We warn you ONCE per host (per ntop run) and for only up to 10 hosts, so as not to innundate you with meaningless warnings. On the about page is a count (if you've even seen this junk), in the "Host/Session counts - global" section. If it's just a couple, ignore it. If you see a lot of this stuff, you may want to rethink your ntop sensor placement or at least understand what you are doing. On my home LAN, I use a 802.1q VLAN trunk to move traffic between two switches and have a passive tap on the trunk. Traffic to/from the firewall moves over this trunk, so I see the same packet on the YELLOW(DMZ) VLAN and the GREEN(TRUSTED) VLAN all the time. Why even bother trapping and warning? Well, there is one bad thing from ntop's perspective with duplicated hosts, which would occur if we didn't trap this, and that is that you would also see a lot of RRD errors when ntop tries to update the same host twice: **WARNING** RRD: rrd_update(/usr/.../ipBytesSent.rrd) error: illegal attempt to update using time 1109523297 when last update time is 1109523297 (minimum one second step) -------------------------------------------------------------------------------- -----Running - Web Server------------------------------------------------------- -------------------------------------------------------------------------------- Q. Why does ntop display bits of my web site, instead of its own pages? A. ntop is designed to search the current working directory for data files, such as the html subdirectory, before it searches the default directories. This is a feature. You are one of those rare souls who happen to have had an unrelated subdirectory 'html' with a file named 'index.html' as a subdirectory of the current working directory at the time that you launched ntop. cd to an acceptable directory, such as /usr/share/ntop, before launching ntop. Q. What are High/Medium/Low risk flags A. They are set in reportUtils.c based on fairly self-obvious functions Well documented in the help.html page, reachable by clicking on the problem descriptions or via http://127.0.0.1:3000/help.html Often seen if you are monitoring a backbone or common network (high) or if you have cloned MAC addresses for, say, a home Firewall box. Q. What does the "Users" flag mean on a host? A. If you go to the "Info about host xxxx" page, there will be data in the "Known Users" section, if it's acting as a server for certain protocols. In sessions.c, the function updateHostUsers() is used to maintain the list of "users" of a host. In handleSession(), as part of the protocol level analysis, the "user" information for various protocols is pulled out of the packets. Stuff like the "X-Kazaa-Username" header, the "MAIL FROM:" header, etc. We tag users as one or more of the following types: P2P_USER, SMTP_USER, FTP_USER, POP_USER, IMAP_USER Note that for P2P, we also record - where possible - whether this user is in P2P_UPLOAD_MODE and/or P2P_DOWNLOAD_MODE. Q. Why are some of the host names in different colors? A. Colors are used on several of the ntop pages to convey extra information to the user. (in particular the ACTIVE TCP SESSIONS and the LOCAL HOST STATS pages). There are five colors used to depict how long ago the host was first seen by ntop. The pages which display these colors use a html style sheet called style.css located in the normal html subdirectory (where ntop is installed). This happens by setting the 'class=' parameter of the html 'A' (Anchor or hyper-link) tag. The style sheet defines the following: Age of host 'class' name Color code Color description (minutes) ------------------------------------------------------------------- 0-5 A.age0min { color:#FF0000 } Red 5-15 A.age5min { color:#FF00FF } Fuchsia/Magenta 15-30 A.age15min { color:#FF7F00 } Coral (lt orange) 30-60 A.age30min { color:#007FFF } Slate blue 60+ A.age60min { color:#0000FF } Blue The color legend is displayed on the About | Configuration page (info.html). Q. What does the P2P flag mean on a host? A. If ntop knows enough to tag you as a P2P user, it's also looking at the other headers to see if it can track what files you're exchanging. If a host (i.e. a workstation) downloads a file from another host ("server"), the file name is recorded in the list ntop maintains for both of them. If a host has at least one file name recorded, it's tagged with the "P2P" flag. Q. What does a "Virtual Host" mean. A. If a single instance of a web server handles many web sites, all of the references resolve to the same name. The web server uses the "Host:" header to determine which "index.html" page to serve up. ntop monitors port 80 (http:) exchanges and looks for the Host: which allows it to build a list of virtual hosts being handled by the web server. -------------------------------------------------------------------------------- -----Running - Web Server (https:)---------------------------------------------- -------------------------------------------------------------------------------- Q. SSL is not working! I have the following error in the log/terminal: 10/Jun/2002 22:58:17 Started thread (6151) for network packet sniffing on eth0.1700:error:140EC0AF:SSL routines:SSL2_READ_INTERNAL:non sslv2 initial packet:s2_pkt.c:187: A. You forgot to put https:// instead of http:// in the URL you put in your browser! Q. Unable to find SSL certificate 'ntop-cert.pem' A. ntop looks such file under the current working directory, then /etc or in Whatever directory you configured with ./configure. If you want a personal certificate, you need to create it by: >make ntop-cert.pem It should be installed as part of "make install". If you have a special Certificate or it's not present, do it (one-time) manually: For example to install it under /usr/local/etc, do: mkdir /usr/local/etc cp /usr/local/bin/ntop-cert.pem /usr/local/etc/ntop See docs/README.SSL Q: What is the ssl watchdog? A: Short answer: There are reported problems w/ the ntop web server hanging when accessed via ssl (https://) from Netscape 6.2.2 (Win2K) (and others). The ssl "watchdog" keeps an eye on the web server - it waits for 3 seconds and then if the SSL_accept call (openSSL) hasn't finished, it aborts it. This leaves the user with nothing on their web browser, but at least ntop's web server continues on. There is no known way to send something back to the user. DON'T EVEN ASK. It's not in ntop, it's the browser-server handshake that's hung. So, it looks - to the user - like a failed connection. S'be'it... If you are using https:// and seem to have the problem, run ntop with the --ssl-watchdog command line parameter... The item to look for on the configuration page (info.html) is: # HTTPS Request Timeouts Or messages in the log: ...: SSLWDERROR: Watchdog timer has expired. Aborting request, but ntop processing continues! You can also enable it via a ./configure parameter (./configure --help | less) if it's something you're going to always require. Q. Tell me more A. The problem is that ntop's web server is single threaded until we determine that the request is simply one that will be reading data. At that point we fork to generate the page. But the basic "accept a request" code is single threaded. This happens all but instantaneously and hasn't been a problem previously. The code is pretty basic and pretty common: select() to wait for a connection, then ssl_accept() to fire up a "server", meaning the ssl handshake. Then process the http request (i.e. the GET and associated headers). With Netscape 6.2.2 (and others), there seems to be a bug in the Netscape code (ntop's is identical to other projects like sshd). According to something I read - but now can't find again - Netscape doesn't accept a legal combination of options on the handshake back from openSSL and hangs in a deadly embrace. Supposedly openSSL 0.9.6c (or was it d - it's not in the changelog) built in a patch. However, I didn't find the new version changed the behavior. There is stuff about a bug w/ Netscape 4.x on the openSSL website, but I'm not having trouble with Netscape 4.x. I don't understand the details and really don't care to find out. It boils down to a hang in a call, SSL_accept() that doesn't have a timeout parameter. Argh Because the code is invasive, I built it (like the SIGPIPE stuff) so you can turn it on at ./configure time: --enable-sslwatchdog Watchdog for ssl hangups (Netscape 6.2.2) [default=disabled] or via a command line option: --ssl-watchdog Use ssl watchdog (NS6 problem) With the "fix", ntop's web server hangs for at most 3 seconds, then continues on. The user gets nada - and I don't know a way to send them anything, because we haven't retrieved the request yet nor done the handshake (so there isn't a TCP connection!) It only affects https:// requests and I've coded the watchdog so it doesn't activate unless we have openSSL and either the compile or runtime parameter set. If you don't get https:// requests, it's just another idle thread. The fix is working for me... What I've tested (and the results with and without the watchdog): Win2k MS Internet Explorer 5.5 - ok Netscape 4.61 - ok Netscape 4.79 - ok Netscape 6.2.2 - user gets no response - old: ntop webserver hung and must restart ntop!! Opera 6.03 - user gets a partial response - old: browser says "setting up secure connection" and never continues, but ntop's webserver is ok (SOMETIMES you get SSL errors in log, esp. if you cancel the browser) Linux Konqueror 2.2.2 - ok Mozilla - 1.0 - ok Netscape 4.78 - ok Galeon 1.2.5 - almost complete response, browser session is toast (must restart) - old: user gets nothing, but the ntop webserver is ok Opera 6.0B1 - user gets a partial response, but browser session is ok - old: browser says "setting up secure connection" and never continues, but ntop's webserver is ok. -------------------------------------------------------------------------------- -----Running - Web Server - Security-------------------------------------------- -------------------------------------------------------------------------------- Q. I'm being prompted for a userid/password, what do I enter. A. The default admin userid is 'Admin' (without the quotes) and the password is whatever you set on the 1st run of ntop (look in this FAQ for --set-admin-password). Q. Why create Userids (beyond the Admin id created by --set-admin-password) A. Multiple users allow you to control who can alter ntop's performance and/or view specific information. If you look on the "Admin" tab, you will see that you can create additional users and also control which URLs can be executed by whom. Userids could allow, for example, an ISP to allow users to access SOME network performance statistics, but not the proprietary stuff... Suppose you want to restrict who accesses the Multicast statistics page, multicastStats.html. ntop uses terminal wildcards matching the names, so multicast is treated as multicast* and matches multicastStats.html plus any other name beginning multicast... howto: 1st add a new user 2nd add "multicast" to the list of controlled screens and allow admin and the new user to access it (note the * wildcard is automatically added) Try and access the screen and you are prompted for a userid/password... Look in http.c for all the names and #defines used... Q. So, How do I restrict access to the main http or https ntop web page? A. To stop everyone from logging into ntop, do the following: Select ADMIN tab Select URL's then "Add Url" Don't fill in anything (the wildcard * is implied) Select only the users who you want to authorize (hold control key and click on user to add more users if you added users) and click on "Add Url" You will see URL '*' is added, e.g. 'showU*' '*' 'shutdown*' 'deleteU*' 'modifyU*' Then only users who know the user id and password (remember to keep the .db file secure!) will have access. Q. How good is the default security ntop provides through the web server. A. Good question... The default ntop configuration is not appropriate if you put ntop in a publicly reachable location. We assume that ntop is either running in a small, trusted, LAN or that you've used other tools such as firewalls to protect the ntop web server. The userid/password scheme is good enough to prevent you from accidentally shutting down ntop or getting into 'dangerous' places. But that's really all it does. Also, the security of the ntop web server is only as good as the security of the passwords file, ntop_pw.db - only the ntop -u userid should be able to read from or write to it. Read man crypt for information on the security of the encrypted password. Q. The plugins aren't very secure. A. True. Q. How do I prevent users from turning plugins on/off? A. The default configuration of ntop does not protect the plugin pages - no password is required to access showPlugins.html. This allows any user who can connect to the ntop web server to view reports FROM the plugins, but also allows them to make plugin configuration changes. This may not be desirable. You may wish to add additional URLs to the Default list of those which require entry of a userid/password. You can prevent unauthorized individuals from turning plugins on/off by adding this URL: "showPlugins.html?" to the list via Add URL. Q. Ok, but they can still get into the configuration pages and change things. A. Yes. Add the following URLs to the controlled list: plugins/sFlow* plugins/netFlow* plugins/rrdPlugin* This will keep everybody who doesn't know the userid/password out of the configurable plugins. Unfortunately, it will also prevent them from seeing the rrd graphs, because those are created out of the rrd plugin. A. Instead of plugins/rrdPlugin*, create these: plugins/rrdPlugin?d* plugins/rrdPlugin?h* plugins/rrdPlugin?i* plugins/rrdPlugin?r* It's still not perfect, the reasons why are left as an exercise for the user. Q. I created a new user, adminp for administering the plugins and ntop is also accepting the admin userid/password. A. Yes, the matching of userid's isn't too swift. It's better to make sure that there are NO common initial substrings among ANY of the userids. Q: How can I use Apache (with it's security, etc.) to serve up ntop pages? A: (Toby Johnson [public@tobiasly.com], Sun 10Nov2002) A while back, I had written about the possibility of configuring ntop to use only relative URL's, in order to facilitate proxying ntop's web interface through Apache. I have decided it's easier to simply use Apache's ability to rewrite ntop's URL's when necessary. So, based on my experience, here is a mini-HOWTO on how to proxy ntop through Apache. ------ Proxying ntop's web interface through a secure Apache virtual host is a convenient way to make use of any existing security measures you may already have. In my case, I wanted to be able to access ntop from anywhere outside my LAN, but opening another port on my server for ntop's dedicated web server wasn't an option. I already had a password-protected, secure web server that I use for admin purposes -- I'll call it https://admin.tobiasly.com. I wanted ntop's web interface to appear as a subdirectory under this host: https://admin.tobiasly.com/ntop/ . Here's how to configure such a setup. Change the server names and ports to match your own. I'm assuming that you already have a working, secure Apache virtual host (using HTTPS). First, pick a port for ntop's HTTP server. I'll use 15123. You won't need ntop's built-in HTTPS server, since you're proxying its content through a pre-existing Apache HTTPS server. Configure ntop to start with the correct HTTP port, and with HTTPS disabled. Something like "ntop -d -w 15123 -W 0". (See the ntop man page for more startup options.) Now, you need to tell Apache that anything under the /ntop/ URL should be proxied to the ntop web server. In my case, the Apache server is running on the same machine as ntop, so it's just a proxy to a different port on localhost. In your Apache secure host configuration, add a line like this: ProxyPass /ntop/ http://localhost:15123/ Now, whenever Apache receives a request for something like "https://secure.tobiasly.com/ntop/home.html", it will proxy this request to the location "http://localhost:15123/home.html". Ntop will take it from there, generate the web content, and pass the result back to Apache. Then Apache passes that result back to the original client. It's important to note that you don't need to open port 15123 to the outside, since the connection actually goes through your existing Apache port, and then is transparently proxied by Apache on the server itself. Of course, you don't even have to run ntop on the same machine; as long as the Apache server can connect to ntop's port, it'll work. This is not the same as URL redirection. As far as your web browser knows, everything is going through https://secure.tobiasly.com/ntop/. The Apache server does all the proxy work behind the scenes, and simply serves up the results to the requesting client. And since the "outward-facing" server is Apache instead of ntop, you'll be using your existing Apache secure server certificate, instead of ntop's ntop-cert.pem. Everything appears to work OK at first, but we quickly run into a problem: some of the URL's that ntop generates are absolute. For example, to draw bar graphs, ntop's web pages will request the image "/gauge.jpg". This would translate into "https://secure.tobiasly.com/gauge.jpg". Also, host info pages are absolute. If I click on the host "10.1.2.3", it tries to take me to the page "https://secure.tobiasly.com/10.1.2.3.html". This is a big problem, because unless the URL is underneath the /ntop/ directory, Apache doesn't know that it needs to proxy the request to ntop, and you get broken links. Luckily, Apache has the Rewrite module that lets us fool with requested URL's. In order to get the required URL's rewritten, add the following to your Apache secure virtual host configuration: RewriteEngine On RewriteCond %{HTTP_REFERER} tobiasly.com/ntop RewriteCond %{REQUEST_URI} !^/ntop RewriteCond %{REQUEST_URI} !^/error RewriteRule ^/(.*)$ http://secure.tobiasly.com/ntop/$1 [L,P] In English, this basically says "If I get a URL request that comes from a page that has tobiasly.com/ntop in it, and that request doesn't begin with /ntop, rewrute the URL to begin with http://secure.tobiasly.com/ntop/, and pass this rewritten URL to the Proxy engine." At this point, the Proxy engine will see that it is getting a URL that begins with /ntop/, and correctly pass it to the ntop web server. Rewriting the request to begin with HTTP instead of HTTPS may seem incorrect, but since that URL will be handed directly to the Proxy engine, it can't be HTTPS or ntop's web server will not recognize it. Now, you should be able to simply connect to https://secure.tobiasly.com/ntop/ , and you're ready to go! NOTE courtesy of Bruno Lebayle I had many problems with the "Rewrite" stuff described in the FAQ. After some Google search, it appears that HTTP_REFERER is sometimes not reliable, and the browser I am using (Firefox/Solaris) does not seem to present this header properly. So I've found an other way to do it, and this proves to work with many different browsers: within mod_proxy.c: ProxyPass /ntop/ http://localhost:3000/ ProxyPassReverse /ntop/ http://localhost:3000/ RewriteEngine On RewriteLogLevel 0 RewriteLog logs/rewrite_log RewriteCond %{REQUEST_URI} !^/$ RewriteCond %{REQUEST_URI} !^/home.html$ RewriteCond %{REQUEST_URI} !^/ntop/ RewriteRule ^/([^/]+\.[a-z]+)$ http://nms.my.domain:my_port/ntop/$1[L,P] Where http://nms.my.domain:my_port is: - the host where the network management tools are located with the proper authentication - the host where the above Apache config has to be set - the host where ntop is installed on port 3000 in this example Where the Web site on this host has no URL in the form of /xxx.xxx aprt from / and /home.html (additions can be made in the RewriteCond) Especially, the trailing "/" after /ntop in the RewriteCond is mandatory, since e.g. the Ntop logo is /ntop_logo.gif and would match /ntop # Rewrite help summary: # HTTP_REFERER = pattern in the name of the page from which the request comes # THIS IS NOT RELIABLE AND DIFFERS AMONG BROWSERS !!! # REQUEST_URI = contents of the request (^ = start of line, $ = end of line, # ! = not the text which follows # All conditions preceding a rule are evaluated # All rules are processed in sequence # Rewrite: () = group of text used for the substitution, # . = any char, * = repeated 0-N times, # + = repeated 1-N times, ^ = not this char, [chars] = one of chars # special characters escaped by \ e.g. the dot as \. # $1 means the 1st group of text between () # Flags L = last (i.e. exit from the rewriting process) # P = proxy (i.e. use the proxy module for this URL) # # Full doc in http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html # Useful help in http://rewrite.drbacchus.com/rewritewiki/ -------------------------------------------------------------------------------- -----Running - Web Server - i18n------------------------------------------------ -------------------------------------------------------------------------------- Q. Is ntop localized for language x? (i18n) A. No. ntop wasn't really written with i18n in mind. Most of the text is generated in-line, on the fly. Plus ntop must dynamically support multiple locales simultaneously. However, beginning with v2.1.56 (2.2 development release), there is limited, optional, i18n support in ntop. Q. So, what internationalization (i18n) support does ntop provide. A. The key word is LIMITED This only applies to the pages that are pulled from .html files, NOT those created internally. This includes the menus and the few static text pages, but none of the pages with interesting data on them. The localized pages must be placed in parallel directories to the existing html ones. For example, if ntop is installed in /usr/share/ntop, the html files are in /usr/share/ntop/html. To support them Canadians, then, you would need to create a /usr/share/ntop/html_en_CA AND that locale would need to be installed on the ntop host system. Note that there are NO i18n files distributed with ntop (yet!) At ./configure time, you enable support via --enable-i18n. ntop MUST be told how to find the locale files. In ./configure, a "standard" location is defined per OS. (Initially only the value for FreeBSD is populated). All others assume the "default", /usr/lib/locale. If that isn't right for your OS, then you MUST use the optional parameter --with-localedir= to tell ntop where to find the files. At run time, ntop scans the host for the installed locales (locale -a should - on most systems give you a list) and checks if a comparable html_cc_XX directory exists. This builds a list of supported languages, which (along with i18n status) is shown on the configuration pages, info.html and textinfo.html. When an http request is made, your browser sends a list of languages it is willing to accept in the http Accept-Language: header. (check View | Internet Options | Languages in IE to see what you're sending) For example, Accept-Languages: en_US, en Means that you prefer US English, but will accept any English dialect if US English isn't available. Be aware that the locale settings and Accept-Language settings are not well standardized, nor common and may not necessarily map very cleanly. You should see what's defined (perhaps it's locale 'german' instead of 'gr') and make or link directories as necessary. You can always create the directory you tell ntop to use via --with-localedir= in the /usr/share/ntop structure and create links from there to the real locale directories! Limits in the per-request and total # of languages to support are in globals-defines.h Because of directory structure limits, a lack of interest in multiple character sets, etc. the locale and accept-language headers are coerced into a common format: locales are ll[_XX][.char][@modifier] ll - language, usually the 2 character ISO abrev., such as us, it. XX - dialect (often a country), such as CA or US (en_US != en_CA) char - character set (we sort of assume UTF-8) modifier - euro Accept-Language: values are ll-XX or ll or ll-* Once the user makes a request, each page pulled is checked: 1. For each of the Accept-Language values. 2. For the ntop host locale value. 3. In the ntop default (English) set. These checks are performed for each of the libraries specified in the config value (CFG_DATAFILE_DIR). Q. What about the country flags. A. There are other sets available on the web, of different quality and size. Rather than chase down permissions and rights, we'll stick with what we have but let you know here of other options. If you find a set you like, just download them and replace the xx.gif files in .../html/statsicons/flags Much better, but about 4x larger: http://users.skynet.be/hermandw/fl/smalgifs.html Same height, but wider (so they look better): http://www.kidlink.org/www/miniflags.html Q. What pages can be customized? A. ls /usr/share/ntop/html/*.html (or wherever the ntop pages are installed): Also, remember that a file overrides ntop's internal page generation, so you can also use this facility to override ANY of ntop's pages and return a customized page (perhaps you don't want users seeing them?). -------------------------------------------------------------------------------- -----Running - Web Server - p3p------------------------------------------------- -------------------------------------------------------------------------------- Q. What's up with P3P? A. P3P is a W3C recommendation - http://www.w3.org/TR/P3P/ - for specifying how an application(typically a web site) handles personally identifiably information. What information the site collects and what it does with the information. p3p is pretty complex! There are basically two ways to enable an application for p3p. One is to add another HTTP header, P3P:. The second is to support a well-known file location, /w3c/p3p.xml (like robots.txt). Browser support is pretty spotty, as is web site adoption. Some 3rd party browsers have some support... up to CrazyBrowser which claims "full support", whatever that means... Q. So why put P3P into ntop? A. It's coming. P3P is gradually making it's way into the top web sites - right now (Dec2002), for example dell.com supports it and yahoo.com doesn't. Q. Ok, but what's that got to do with ntop? A. Since ntop collects personally identifiable data in it's access log (-a option) and it's various reports and makes those available to pretty much anyone in the default configuration, it's probably not a bad idea to OFFER some support. Especially if you're running ntop at a site that has started to support P3P, if you don't have a mechanism for your own policies you'll have to adhere to corporate ones. And that could require massive changes to ntop. Q. IE6? A. Since ntop doesn't send the P3P: header, IE6 ignores ntop wrt p3p. Besides, IE6 uses p3p to block 3rd party cookies. If you want to see the p3p stuff, it's view | privacy report in the menus. If the site's policies don't match your settings, there will be a red "do not enter" icon in the third box on the bottom right of the IE6 window - double click on it to see the report. See http://support.microsoft.com/default.aspx?scid=KB;en-us;q293513 Q. Mozilla A. Unknown if it's enabled by default. Mozilla had support, ripped it out in Feb 2002 and put a new version back in. Q. Other browsers A. See their home pages or search the web. One that I know that claims "full support" (whatever that means) is at http://www.crazybrowser.com/ Q. Privacy Bird? A. A browser-add-on, AT&T's privacy bird (http://www.privacybird.com/), that I'm playing with is a lot more aggressive in supporting p3p. If Privacy bird doesn't see the P3P: header, it then requests the "well known" file, /w3c/p3p.xml file and gets nailed by ntop as a hostile application, since we don't have support for returning .xml files (yet). Q. So when & how does ntop support p3p? A. A patch in the cvs on 4Dec2002 adds minimal support for p3p -- specifically: 1) ntop will respond to queries for /w3c/p3p.xml and ntop.p3p -- returning the ntop.p3p file, IF ONE EXISTS. If the file does not exist, a 404 error is generated (vs. pre 4Dec2002 behavior of adding the address to the myGlobals.weDontWantToTalkWithYou list). 2) New parameters, --p3p-cp and --p3p-uri allow you to return the P3P: header with either or both of the parameters (cp="" or policyref="") set. ntop doesn't validate the text in any way other than the usual stringSanityCheck(). This allows me to run the Privacy Bird and still talk to ntop. I'll admit that option #2 is speculative, since I really don't have much of a way to test it. Q. But there isn't a sample .p3p file provided. A. Right. Please note that there is no sample file provided. This is not an oversight. After careful consideration, I am not providing one. The reason is that a .p3p file is intended to be a legal contract between your site and your users. While I could provide a default file that has the right tags - as I understand p3p - for the data ntop collects and stores, I don't want the responsibility and/or liability. If anyone wants this "sample p3p file", I will make it available for a fee, Provided your organization - through an appropriate officer, in writing: 1) Acknowledges that Luca Deri, Burton Strauss and other developers of ntop have no liability for any use(s) you make of the sample p3p file or anything you derive from it. 2) You will defend us - at your expense - from any lawsuit, arbitration proceeding, etc. filed in conjunction with your use of the sample p3p file. 3) You will pay any judgments, legal expenses, etc. related to any lawsuit, arbitration proceeding, etc. in conjunction with your use of the sample p3p file. Since your legal department would be nuts to agree to that I doubt it will come up. Q. So How do I create a .p3p file? A. There are tools available to create p3p policy files - search the web for 'p3p editor'. One that I've used is a zero cost albeit beta tool, p3peditor from IBM (http://www.alphaworks.ibm.com/tech/p3peditor). -------------------------------------------------------------------------------- -----Networks, Network cards and Networking------------------------------------- -------------------------------------------------------------------------------- Q. My security people won't let me run in promiscuous mode. A. Tough... Or, use the -s option and accept the limitations... Ask them "honestly, what is the problem" - other than having an interface in promiscuous mode is a signature of a sniffer and security folks look for unauthorized sniffers? ntop needs promiscuous mode so that it sees the full range of traffic. Any similar product will do the same thing. If the security people think traffic on the wire is secure, they're wrong! Face facts - just about every Windows user, except for 2K/XP Pro (and then only if TBTP have especially locked them down) can install the windows version of tcpdump... If it's a checklist item, just gen up a form to "authorize" it, have the boss and VP/CIO sign it and give it to them. Q. What is Ethernet and TCP/IP and how do they differ? A. Both are protocols - that is the definition of how to interpret bits on wires (or in packets) into meaningful conversations. Ethernet is the lower level, wire (or wireless) protocol, concerned with moving the physical bits of data. TCP/IP is the higher-level protocol, which explains how to interpret the block of bits (frame). TCP/IP uses a familiar 32-bit "IP" address, e.g. 192.168.0.1. Ethernet uses a less familiar, 48 bit unique to the NIC (some times called "burned in") address, e.g. 00:40:05:DE:AD:00. This is called the MAC (Media Access Control) address. FYI: The official IEEE MAC address lookup is at http://standards.ieee.org/regauth/oui/index.shtml (Look up the first six digits, separated by -s, e.g. 00-40-05) Q. OK, but how is stuff sent from my computer to, say, Yahoo!? A. First off, your computer does a lookup - using a service called DNS (Domain Name Service) to convert www.yahoo.com to a numeric value, such as 66.218.71.80. Then it builds a collection of characters that says send this data from me, 192.168.0.1 to Yahoo at 66.218.71.80. This is called a packet. That gets wrapped in an Ethernet frame (addressed from 00:40:05:DE:AD:00 to the MAC address of the local gateway router, 0:d0:9e:6:38:00 and squirts it out the router. Packets are forwarded step by step along a path from you to Yahoo by computers called routers. This is done based on the 32 bit IP address and the router's knowledge of the network. Each router sees a Ethernet frame addressed to it (by MAC address), checks the TCP/IP address to figure out where to send it next, re-wraps the TCP/IP packet in a new Ethernet frame (with the from MAC as it's own and the to MAC as the next hop). This happens until the TCP/IP packet reaches the final segment (the last router). Once it reaches a router that knows it has addresses 66.218.71.0-66.218.71.255 on one of it's interface, the routing stops using the TCP/IP address. The last hop is done (like each intermediate hop - at the lowest level) based on the MAC address! Specifically, the last router does an "ARP" (Address Resolution Protocol") query, to find out "Who Has" address 66.218.71.80. The NIC responds with it's MAC address: arp who-has www.yahoo.com tell router arp reply www.yahoo.com is-at 0:d0:9e:6:38:00 And the packet is routed to that address. Alright, that's a bit simplified, but see Douglas Comer, "Internetworking with TCP/IP, volume I", page 25 and 73ff. Q. Tell me more. A. OK, gang time to teach Ethernet & TCP/IP basics one more time. With pictures... Suppose you have a network that looks like this (we'll use impossible addresses 288 - just pretend it's ok): (ext) 288.1.1.1 (int) 288.2.2.1 +-----+ World+Dog ------------ + ISA + ------- LAN ----- WS 288.2.2.2 | +-----+ | |(dmz) 277.1.1.1 me 299.0.0.1 \----------- DMZ ----- MAIL 277.1.1.2 \-- WEB 277.1.1.3 ISA can be acting solely as a router or it can be acting as a NAT device. That's irrelevant, so we assume it's not. I send you a packet. It travels the Internet and arrives at your 288.1.1.1 the ISA(router) with src=299.0.0.1, dst=288.2.2.2. Like every router along the way, ISA(router) looks at the destination address and realizes it has to route the packet on to 288.2.2.2. So the ISA(router) sends the packet on, out the best interface to reach 288.2.2.2. Remember, however, the TCP/IP packet is wrapped in a lower level (Ethernet) packet at the wire level. Read your TCP/IP and Ethernet standards - the actual delivery of packets over links is this Ethernet level and it uses the 48 bit MAC address. This "Ethernet" packet is actually what travels hop to hop to hop (you can even see these headers if you have visibility to the traffic - it's called the link level header by tcpdump and you'll see the 48 bit MAC addresses if you use the -e parameter). In order to be able to handle the Ethernet level signaling, each router rewrites the packet so that the 48 bit source MAC address it it's own (from-router that is) and the destination MAC address is the one that from-router has in it's tables for to-router (the next hop). So the packet looks like this, where the srcMAC and dstMAC get rewritten each hop, so that the routers on both ends of the link know whom it's addressed to: Hop1 (srcMAC=00:00:00:aa:aa:aa dstMAC=00:00:00:bbbbb:bb frame=IP data=(src=299.1.1.1 dst=288.2.2.2 data="Hi!") Hop2 (srcMAC=00:00:00:bb:bb:bb dstMAC=00:00:00:cc:cc:cc frame=IP data=(src=299.1.1.1 dst=288.2.2.2 data="Hi!") Hop3 (srcMAC=00:00:00:cc:cc:cc dstMAC=00:00:00:dd:dd:dd frame=IP data=(src=299.1.1.1 dst=288.2.2.2 data="Hi!") Notice how the TCP/IP stuff isn't changed. But the MAC address is. At each hop, the NIC card, operating at the Ethernet level, sees its own MAC address and knows to accept the packet. It passes it up the protocol stack, where the next layer (TCP/IP) realizes it needs to be routed further on... Ultimately, the packet gets delivered to some service listening on your WS. Here's a packet capture to show you: # tcpdump -Xx -c1 -i eth0 -e tcpdump: listening on eth0 11:49:10.809890 0:3:47:b1:xx:xx 0:e0:18:b4:yy:yy ip 118: tigger.ssh > zebra.2714: P 1824243567:1824243631(64) ack 2328789523 win 11792 (DF) [tos 0x10] 0x0000 4510 0068 b305 4000 4006 b1e4 c0a8 2a24 E..h..@.@.....*$ 0x0010 c0a8 2a21 0016 0a9a 6cbb bf6f 8ace 8213 ..*!....l..o.... 0x0020 5018 2e10 ee1a 0000 469a 3e34 eda7 549e P.......F.>4..T. 0x0030 0ec4 4847 8983 fb4f 65ea 5c3e 0bbe c325 ..HG...Oe.\>...% 0x0040 7db8 9954 dae1 55b6 54f9 cdfd ac07 a2b5 }..T..U.T....... 0x0050 ce4f So this says, the packet came from tigger (MAC address 0:3:47:b1:xx:xx) -> zebra (MAC address 0:e0:18:b4:yy:yy) Within that is the tcp/ip packet, from c0a82a24 -> c0ae2a21 (192.168.42.36 -> 192.168.42.33) Here's another one, from tigger -> router. # tcpdump -Xx -c1 -i eth0 -e host 192.168.42.1 tcpdump: listening on eth0 11:52:48.712750 0:3:47:b1:aa:aa 0:d0:9e:6:bb:bb ip 72: tigger.32782 > homeportal.gateway.2wire.net.domain: 41356+ A? cvs.ntop.org. (30) (DF) 0x0000 4500 003a bf7e 4000 4011 a5be c0a8 2a24 E..:.~@.@.....*$ 0x0010 c0a8 2a01 800e 0035 0026 ce2e a18c 0100 ..*....5.&...... 0x0020 0001 0000 0000 0000 0363 7673 046e 746f .........cvs.nto 0x0030 7003 6f72 6700 0001 0001 p.org..... (0035 = port 53, so it's a dns query) And one more, from cvs.ntop.org -> tigger (which has to have passed through the router) # tcpdump -Xx -c1 -i eth0 -e "not src net 192.168.42.0/24" tcpdump: listening on eth0 11:53:39.688806 0:d0:9e:6:bb:bb 0:3:47:b1:aa:aa ip 69: 195.31.151.66.cvspserver > tigger.42964: P 2566885448:2566885451(3) ack 2903504154 win 24616 (DF) 0x0000 4500 0037 5f3c 4000 2906 ad56 c31f 9742 E..7_<@.)..V...B 0x0010 c0a8 2a24 0961 a7d4 98ff 9048 ad0f f51a ..*$.a.....H.... 0x0020 8018 6028 279a 0000 0101 080a 173c 72b5 ..`('........hostIpAddress.s_addr != 0x0) && (el->hostIpAddress.s_addr != hostIpAddress->s_addr)) { isMultihomed = 1; FD_SET(FLAG_HOST_TYPE_MULTIHOMED, &el->flags); } i.e. if the address we've stored for this host doesn't match this one, it's multihomed. } else if((hostIpAddress != NULL) && (el->hostIpAddress.s_addr == hostIpAddress->s_addr)) { /* Spoofing or duplicated MAC address: two hosts with the same IP address and different MAC addresses */ if(!hasDuplicatedMac(el)) { FD_SET(FLAG_HOST_DUPLICATED_MAC, &el->flags); ... } setSpoofingFlag = 1; hostFound = 1; break; } If the addresses DO match, we've had two MAC addresses, so this is being spoofed. etc. Q. So why do I get bad output? A. If, somehow, you've confused ntop - for example telling it that 277.1.1.0/24 in the ascii art example (above) is local, then ntop is going to believe you. And it will see a packet with the 277.1.1.1 IP and a MAC address. And use that. Only it's not the MAC address of the MAIL host, it's really the MAC address of ISA. No matter, ntop doesn't know this -- all it sees is the packets and the data you gave it. So later on, when it sees a packet with the same MAC address, but a different IP, well, it will assume that it's the same host... and the data will all be lumped together. Q. Does that explain why I'm seeing xxxx as multihomed? A. Maybe. Remember - it only takes one packet, not even an ack, for ntop to create a host record. If that's wrong, it will carry forward - and you'll probably see the host tagged as 'Multihomed' when correct packets show up. Say: Host 1: IP 192.168.1.1 MAC 00:00:00:aa:aa:aa Host 3: IP 192.168.1.3 MAC 00:00:00:cc:cc:cc If somebody has the incorrect hosts table, dns, cached, whatever but has the info that Host 1 is 192.168.1.3 and is on the same subnet, then it will send a packet where the Ethernet layer and the ip are nonsense. But because it's on the same wire, the ip is ignored: (Ethernet from:00:00:00:dd:dd:dd to:00:00:00:aa:aa:aa) (tcp s=192.168.1.4 d=192.168.1.3) ntop will read both out of the packet and create the association 192.168.1.3=00:00:00:aa:aa:aa Since it doesn't know better. Then when it sees (Ethernet from:00:00:00:ee:ee:ee to:00:00:00:cc:cc:cc) (tcp s=192.168.1.5 d=192.168.1.3) It will create the multihomed association... Q. So what's a hub vs. a Switch A. A hub is a device that links a bunch of computers together at the wire (Ethernet) level. Logically, Ethernet is a bus, that is everybody sees all the traffic, just like cars crossing under a highway bridge. Physically, Ethernet is wired like a star - with all the wires coming back to a central "hub". The hub is just the device that makes the electric star look like a shared bus. Switches and Hubs operate at the Ethernet level, not TCP/IP. A. Watch out for 'Switched hubs', which are hubs that include an internal switch between 2 or more segments (for example, BUT NOT LIMITED TO a 10BaseT and 100BaseT) segment. These are hubs within a segment, but switches across segments. ntop may not see the traffic you expect if you have a 'switched hubs' and manufacturers are pretty bad about marking them. See http://article.gmane.org/gmane.linux.ntop.general/5081 A. A switch is a smart hub. Switches improve performance by creating a virtual Ethernet bus for the duration of the packet that joins JUST the source and destination ports. A switch operates via an internal table of MAC addresses. It learns (or is programmed) that 0:d0:9e:6:38:00 is on port 1, while 00:40:05:DE:AD:00 is on port 3. A packet coming in port 1, destined for 00:40:05:DE:AD:00 is sent out ONLY port 3. If the switch doesn't know (or the packet is a broadcast), it gets sent out all ports. This doesn't make for MORE bandwidth, but it does use it more efficiently. That is in addition to the session between ports 1 and 3 at 100Mbps, a second, simultaneous 100Mbps session can occur between ports 2 and 4. Q. How do I use ntop in a switched network? A. First off, you need to be or have the support of your network administrator. (Yes, you can do something called "ARP poisoning" to - maybe - get the switch to send you all the traffic, but that's beyond this FAQ... STFW) Many switches (although not the USD$50 cheap "workgroup" units) have a special port or mode, where by all the traffic for the entire network gets copied out that port, in addition to the normal switch action. When you invoke the monitoring mode (called span, mirror, monitor, analysis, etc.), you are forcing the entire switch bandwidth out one port. This may exceed the bandwidth of the port. 100Mbps+100Mbps >> 100Mbps! Traffic that is being sent to the monitoring port in excess of the capacity of that port is usually dropped. It should NOT slow down the switch on other ports. Some switches have some buffering capability and it *may* be able to keep up with an occasional burst of traffic, as long as the average is below the port capacity and the buffer isn't exceeded. See, for example, http://www.cisco.com/warp/public/473/41.html#archXL. One list of switch manufacturers is the document is titled "REFERENCE: Configuring a Switch to Monitor All Traffic" from Elron Software. (The URL is long, do a Google search for "site:elronsoftware.com wi6038"). -------------------------------------------------------------------------------- -----Dumping data--------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Can I use ntop from php/perl? A. Yes you can. Please see the www directory under the ntop source tree. A. Look at the Admin | Dump Data page. -------------------------------------------------------------------------------- -----rrd (myrrd)---------------------------------------------------------------- -------------------------------------------------------------------------------- Q. How do I save data between runs? A. Use rrd. Q. What's rrd? A. There's a 12 page writeup on what rrd is and what ntop does with it. A pdf version is posted at SourceForge in the "Documentation" release. Download it and read it. Q. Do I gotta? A. Yup - the pretty pictures won't work in this FAQ. Q. I'm lazy - What is rrd? A. RRD stands for "round-robin database". It is a special type of database designed for holding sequences of information over periods of time, without growing in size. Rrdtool is a tool for manipulating RRDs. The home page for rrdtool is at http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/ What do they do? Well, suppose you want to compute the average of the traffic to your web site for the last fifteen minutes. If you record the data each minute and save it in a traditional database it looks like this: 10:45 1.00 MB 10:46 1.02 MB 10:47 0.27 MB ... 11:00 0.54 MB ... While you have the data to compute the total, the database grows in size forever. And all you really need are the last 15 values. Certainly you can create a purge routine and periodically remove the old data. But this type of constantly growing SQL database - even with a prune process - will require reorganization and rebuilds over time. Suppose you had some kind of data structure where the last value was thrown away each time you added a new one. When it comes time to store the 11:01 value, you overlay the 10:46 value. At any time, you still have the last 15 values. That - slightly simplified - is an RRD. The benefit is that your database never grows in size. The down side is that everything else in your history is gone - if your needs ever change, tough. The ring buffers are called round-robin archives or RRAs. The RRA actually stores the RATE (bits per second), so the 10:47 value of 0.27 Megabytes is 0.27 * 1024*1024 * 8 / 60 or 37748.736 (bits per second). But it functions just like the rings described above. ntop uses RRDs to store data over long periods of time. Separate files are created for each counter, in a structure that reflects the interfaces and hosts ntop sees. The specifics of what's recorded - interfaces or not, hosts or not, etc. is controlled by switches on the ntop rrd plugin. (Read the paper - it goes on from here, with specific details on how ntop uses RRDs). Q. What's myrrd? A. ntop includes a frozen and slightly patched version of rrd 1.0.49 in the ntop source tree. This is called myrrd. rrdtool 1.0.49 was released 08-Aug-2004. 1.0.50 was released 25-Apr-2005. rrdtool 1.2.x began to be released in Apr 2005. Q. What's rrdtool? A. rrdtool is the packaged program to access the various rrd routines (export, dump, graph) from the command line. Q. How do I get it? A. The myrrd version included with ntop doesn't have rrdtool. Assuming you haven't installed an rrdtools package (which ntop ignores), here is how to get rrdtool: The myrrd version is a frozen copy of rrdtool 1.0.49, so your best bet is to go to the rrdtool home page, http://www.rrdtool.com/ or the download page, http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/pub/ and download rrdtool-1.0.49.tar.gz. Once you have it, it's pretty standard. $ tar xfvz rrdtool-1.0.49.tar.gz $ cd rrdtool-1.0.49 $ ./configure (You can add --prefix=/usr if you want) $ make This runs a few minutes. Now you can do $ make install but remember, ntop just ignores this, so why bother? All you really need are the rrdtool executable program (src/rrdtool) and maybe a few of the files in the doc/ directory. Just copy them where you want them and then delete the whold build directory. Q. Where do I get rrd? A. Unless you need rrdtool, you should not need to do anything to get rrd (see myrrd, above). The home page for rrd is http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/ rpm's are available at http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/pub Q. What about the multi-threaded development version? A. Stay away. (UPDATED) I was able to patch ntop to work with 1.2.7+ and experimented with it a little bit. The binary .rrd file formats are different, so if you try 1.2.x, any new .rrd files which are created are incompatible. The new version doesn't use freetype, it uses libart, which introduces a different (not better, nor worse) chain of dependencies. Q: I've enabled the rrd plugin and there's no data ... there are messages in the log: RRD call stack: argv[0]: rrd_update argv[1]: ...rrd/matrix/12.239.98.199/12.239.181.175/pkts.rrd argv[2]: 1037289548:1 rrd_create(...) error: creating '...': No such file or directory rrd_update(...) error: opening '...': No such file or directory A: Create the rrd directory and make sure that the -u userid has read/write access to it (typically /usr/share/ntop/rrd). Q: Still nothing... A: Remember to activate the plugin. You will need to configure it, and remember that the default configuration does not include per-host data. Q. What's the difference in the Host Detail Level for RRDs? A. Low is just the bare counts, pktSent/pktRcvd and bytesSent/bytesRcvd. Medium adds: pktDuplicatedAckSent/pktDuplicatedAckRcvd, pktBroadcastSent, bytesBroadcastSent, pktMulticastSent, bytesMulticastSent, pktMulticastRcvd, bytesMulticastRcvd, bytesSentLoc, bytesSentRem, bytesRcvdLoc, bytesRcvdFromRem, ipBytesSent, ipBytesRcvd, tcpSentLoc, tcpSentRem, tcpRcvdLoc, tcpRcvdFromRem, tcpFragmentsSent, tcpFragmentsRcvd, udpSentLoc, udpSentRem, udpRcvdLoc, udpRcvdFromRem, udpFragmentsSent, udpFragmentsRcvd, icmpSent, icmpRcvd, icmpFragmentsSent, icmpFragmentsRcvd, ipv6Sent, ipv6Rcvd NonIP: stpSent, stpRcvd, ipxSent, ipxRcvd, osiSent, osiRcvd, dlcSent, dlcRcvd, arp_rarpSent, arp_rarpRcvd, arpReqPktsSent, arpReplyPktsSent, arpReplyPktsRcvd, decnetSent, decnetRcvd, appletalkSent, appletalkRcvd, netbiosSent, netbiosRcvd, otherSent, otherRcvd And the per-protocol Sent/Rcvd High adds: totContactedSentPeers, totContactedRcvdPeers And the per-IP-protocol Sent/Rcvd, e.g. IP_HTTP... Q. rrdPlugin - problem with rrd/myrrd? A. By default, ntop's Makefile binds the static libmyrrd library to create ntop's rrdPlugin shared library. THIS IS DELIBERATE so that you use the myrrd library and not some other version of rrd that's installed somewhere else on your system. Sometimes this causes problems, where there are special tricks required to tell (a non gnu ld) loader about static (.a) libraries, which ntop doesn't have in the Makefile nor the configureextra files. As a SHORT TERM WORK-AROUND, you can TRY this: $ cd myrrd Edit Makefile -- all: $(LIBRRD) libmyrrd.so ^^^^^^^^^^^ add this Add these lines: libmyrrd.so: $(OBJECTS) ld -shared -o libmyrrd.so $(OBJECTS) Now do make. You should see a libmyrrd.so file. The main 'make' should now complete. Copy that libmyrrd.so file where the other ntop library files are, and it MIGHT work. However, the whole idea behind having a static libmyrrd.a is to prevent version conflicts and use a stable version of rrd. The right fix is to get the configureextra/ file changed. -------------------------------------------------------------------------------- -----netFlow and sFlow---------------------------------------------------------- -------------------------------------------------------------------------------- Q. How do I access netFlow or sFlow data from ntop? A. You need to configure ntop as a listener. First, use the appropriate plugin to set the parameters - basically the port you want ntop to listen on. Then, using the Admin | Set Interface menu item, switch ntop to report on the sFlow/netFlow pseudo-device (NetFlow-device or sFlow-device). Q. Can I use ntop as a netflow collector. A. Not in the current versions - you used to be able, but that code was removed. -------------------------------------------------------------------------------- -----netFlow-------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Which versions of netFlow. A. v5 And v1/v7/v9 - in that internally a v1/v7/v9 flow is copied to a v5 buffer and then processed. We default/ignore fields that are different. And nFlow - similar conversion. Q. netFlow doesn't work. A. You MUST make sure the ntop plugin is ACTIVE. With the change to allow setting parameters while inactive, it's easy to miss that last step. If you don't activate the plugin, you'll still have the netflow-device, but no data on it... Q. What's Virtual NetFlow Interface? A. Be sure and set it. It's important for pseudo-local classification, which affects L R reporting. You need to set it to the (network) and mask for the netFlow collector. So ntop knows 'where' the data is coming from. Q. 'splain some more, Lucy... A. OK. It's best to think of netFlow like this: The physical interface which is monitoring the packets is like a temperature probe you stick into a roast. Even though the display of the data can be right there at the probe, or the other end of a (long) wire, or somewhere entirely elsewhere via a wireless connection, the probe is monitoring at the tip. If it says 145F, that's the temperature of the meat - not the oven and not the kitchen. Similarly, the netFlow data ntop is receiving is based on the probe location. So, if you have a router and are monitoring a single interface to collect netFlow data, then the ip address you want to give to ntop is that of the router interface. If you are monitoring a router with more than one interface, you will need to give ntop ONE of those addresses and use the -m | --local-subnets option to tell it that the other addresses are also local. Q. Where is info about netflow? A. Dale Reed pointed out a good tech doc (no flak, just the formats) for netflow V1/5/7: http://www.cisco.com/univercd/cc/td/doc/product/rtrmgmt/nfc/nfc_2_0/nfc_ug/nfcform.htm (As of Oct2003, it includes v8 and is here:) http://www.cisco.com/univercd/cc/td/doc/product/rtrmgmt/nfc/nfc_3_0/nfc_ug/nfcform.htm Q. How Do I Enable NetFlow Data Export on a Cisco Device? A. To enable netFlow Data Export (NDE) from a Cisco device to an ntop netFlow receiver on port 2055 (default) at address 10.1.1.1: ip flow-export destination 10.1.1.1 2055 ip flow-export version 5 You may want to designate the source interface, e.g.: ip flow-export source Ethernet0 Enable netFlow on each interface to be monitored. netFlow normally only captures data from each incoming packet, so to see traffic in both directions netFlow must be enabled on both the incoming and outgoing interfaces. As an example, for an Internet access router this would mean enabling netFlow on both the internal (e.g. Ethernet) and the external (e.g. ISDN / Frame Relay etc) interfaces: interface Ethernet0 ip route-cache flow interface Dialer1 ip route-cache flow By default netFlow will only export flow statistics shortly after the flow Terminates or when 30 minutes have elapsed. In many environments, you want ntop to be a bit more up to date. To change the timeout to five minutes: ip flow-cache timeout active 5 The following 'show' commands are useful for examining netFlow statistics directly on the Cisco box and may assist when setting up ntop: show ip flow export show ip cache flow show ip cache verbose flow Obviously, there is a lot more to it than this, for more information, see the Cisco web site: http://www.cisco.com/go/netflow (Created by sholmes at snapshot, 02Feb2003) Q. Can I run ONLY w/ netFlow (Running ntop as a Collector for Net Flow only) A. Sure. ntop is usually configured to capture all traffic from local interfaces. If no interface is given (e.g. option -i|--interface is missing), the "first" interface is taken. This value, typically eth0 on linux boxes, may not be what you wanted. If you want to use ntop as a collector for Net Flow traffic only, you may want to supress all local traffic. In this case use -i none or --interface none. Remember to activate Net Flow plugin from Menu Admin->Plugin and to configure the plugin by setting "Local Collector UDP Port". -------------------------------------------------------------------------------- -----sFlow---------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. What is sFlow A. The core component of the sFlow toolkit is the sflowtool command line utility. sflowtool interfaces to utilities such as tcpdump, ntop and Snort for detailed packet tracing and analysis, NetFlow compatible collectors for IP flow accounting, and provides text based output that can be used in scripts to provide customized analysis and reporting and for integrating with other tools such as MRTG or rrdtool. Some info: http://www.inmon.com/sflowTools.htm http://www.faqs.org/rfcs/rfc3176.html Q. I have activated the sFlow plugin in ntop. But it doesn't seem to generate any output based on the collected sflow datagrams. A. sFlow can be a collector or a receiver or both, depending on the settings configured via the plugin. If you configure ntop as an sFlow collector, it will use sFlow data for generating reports, treating the remote collector(s) as another network interface - see Admin | Switch NIC. Q. sFlow doesn't work. A. Check this out: This talks about a bad experience I had setting up sFlow reception. For the longest time, I could see that ntop was getting sflow packets, but no data would show up. It turns out the switch I was exporting from didn't see any real traffic, and it was just sending COUNTERSAMPLE packets..... - - - - - - - - I figured out that it was indeed "invalid" sflow packets. Apparently, sflow sends COUNTERSAMPLE and FLOWSAMPLE packets. COUNTERSAMPLE packets give a quick look at interface counters on the machine, whereas FLOWSAMPLE packets are actual packet fragments from IP connections. Ntop seems to simply parse, debug_print, and discard COUNTERSAMPLE packets...which made it confusing to look at the debug output and say "wow, lots of sflow coming in!" when in fact it was just for show, as Burton suggested. I added more switches (with active connections) to the switches sending sflow packets and I now have hosts with pretty graphs. -------------------------------------------------------------------------------- -----Solaris-------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. How do I install the ntop package on Solaris? A. For instance do 'pkgadd -d ntop-2.2-solaris.i386' Q. What c compiler do I need? A. Sun's cc or gnu's gcc. Q. What about /usr/ucb/cc is that the one? A. No. cc is software you pay for. /usr/ucb/cc is a stub compiler and good for, recompiling the kernel and absolutely nothing else. The cc I mean is Sun's Commercial Compiler. -------------------------------------------------------------------------------- -----BSD - FreeBSD-------------------------------------------------------------- During the ntop 3.2 development cycle, we did development/testing under: 4.10 and 4.11 5.3 and 5.4 -------------------------------------------------------------------------------- Q. When I type 'make' it complains about a makefile error. A. Always remember to use gnu make. On many *BSD systems which have other 'make's, gnu make is called gmake. Try make --version -- if it shows a Gnu version stamp you're ok, otherwise try gmake. Q. I get "ntop: /dev/bpf0: Device not configured", what's wrong? A. This is because bfpX has not been configured inside the generic bsd-kernel config file. If you use generic kernel config file put "pseudo-device bpfilter 16" in kernel config file and rebuild the kernel. Q. I remember rumors about something not being right under FreeBSD with threads? A. Yes. See FreeBSD bug bin/17437 at http://www.FreeBSD.org/cgi/query-pr.cgi?pr=17437 Basically, due to limits in FreeBSD, there is no pthread_atfork() function. So, when ntop does it's fork() call to create http pages, it can't fixup the Mutexes. It wrong and could conceivably cause problems. However - ntop ran for years without the pthread_atfork() code, so we're no worse off in 3.0 under FreeBSD than in 2.2 or 2.1... Q. The web server problem? A. There was a flurry of problems late in the 3.0 development cycle having to do with a seeming deadlock of the ntop web server (it's actually not dead, just walking at about 0.001KPH). Thanks to Yeoman efforts by Stanley Hopcroft, Michal Meloun and, well, me, we have a work-around. With 3.1 we tried to automate this workaround, but fell a foul of FreeBSD's fixes. So in 3.2 we've reverted to requiring the command line flag. If you're running under FreeBSD and have problems, use the flag, --set-pcap-nonblocking. For more on this, read the threads at gmane - look for "FreeBSD and pthreads" - that's probably the best summary. But there's stuff on this back at least to October 2003 - look for Stanley's problems with CPU usage. A. Also, understand that --set-pcap-nonblocking is going to increase ntop's cpu usage. It will probably come close to pegging the CPU at 100%. Yet strangely other processes won't seem to be impacted. (Of course, you really should be running ntop on it's own host, anyway, right?). This is because of how the work-around is coded. ntop should step aside briefly and let them run. Just be aware of it and don't ask on the mailing lists. It's not giant lock vs. fine grained, etc., it's really the handling of signals (user interrupts) that is different. Say you have a process, A running. In linux, POSIX thread x is kernel process x' and POSIX thread y is kernel process y'. Now the POSIX standard doesn't prevent thread y from receiving a signal 'intended' for x, so you have to code for that. But when a thread 'sleeps', the process sleeps, which is something the kernel understands and so the kernel can do other work. In a userland threads model (i.e. xBSD), POSIX thread x and POSIX thread y are both parts of kernel process A. To implement the POSIX threading, the thread library code creates a thread manager, thread z'. That thread receives all signals, interupts etc. and parcels the work back out. This too is perfectly within the POSIX model. BUT: To implement the thread manager implies that the user task (A+x+y+z) is active whenever it's waiting for ANYTHING. How well this works depends upon the sophistication of kernel processes that recognize when the user task is 'idle', meaning it is spinning waiting for somethings, vs. doing useful work. In FreeBSD 4.x, we see that this recognition is not very sophisticated when it comes to the bpf pseudo driver and so ntop will use 100% of the available CPU. Even so, the scheduler bounces between tasks of equal priority, so productive work does get done, but you see the high CPU usage charged to your task. -------------------------------------------------------------------------------- -----Linux - all---------------------------------------------------------------- During the ntop 3.2 development cycle, we did development and/or testing under: Gentoo 2005.0 Fedora Core 2 and 3 The cvs version was run by users on many other versions. Others should certainly work and there are many user reports of success. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -----Linux - RedHat------------------------------------------------------------- -------------------------------------------------------------------------------- Q. "application bug: ntop(...) has SIGCHLD set to SIG_IGN but calls wait(). (See the NOTES section of 'man 2 wait'). Workaround activated." This message and the NOTES section of the man page lead me to believe that the problem is handled but the kernel feels the need to report it from time to time. A. Read the NOTES section. The problem has been handled, but the kernel feels the need to report it from time to time. See the article at http://article.gmane.org/gmane.linux.ntop.general/5304 Q. libpng version conflicts? A. See libpng, below. -------------------------------------------------------------------------------- -----Win32 - Common------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Where can I find GDBM for Windows? A. GDBM for windows can be found at http://www.roth.net/libs/gdbm/ Q. ntop -i1 ... doesn't work A. ntop has special parameters under Win32 Under win32 there are TWO COMPLETELY SEPARATE TYPES OF PARAMETERS. There are the parameters to the win32 stub AND there are parameters to ntop itself. AFTER THE win32 parameters are the ntop parameters in the standard (Unix) -xxx format. ntop /c runs ntop INTERACTIVELY with the specified ntop parameters ntop /i installs ntop as a service to run with the specified parameters ntop /r removes the ntop service Remember, ntop /i and ntop /d don't actually run the service - you need to start it. REMEMBER: there are TWO ways to run ntop, one as a service, one 'interactively' (/c). They are totally separate. Just because you ran ntop w/ interactively with some parameter set, does not affect the stored parameter set for the service. To change the stored parameters, reinstall the service vi /i. Q. How do I figure out what my network interface numbers are for the -I parameter? A. (Thanks to jac engel [jacengel@home.nl] for the example) If you only have ONE network interface, it doesn't matter as the default is fine. However, that's the RARE case. Most people have multiple network interfaces (NICs), with virtual ones for VPNs, Dialup Networking, etc. The Windows tools ipconfig, winipcfg and the Device Manager (depending on which version of Windows you have) will probably show you them. However, it's easier and better to use ntop to show you how ntop sees the network interfaces. If you start ntop /c (interactive mode, with only the default parameters) it Will display all your network interfaces (NICs), like this: Running ntop for Win32. Wait please: ntop is coming up... 23/Aug/2002 20:43:55 Initializing IP services... 23/Aug/2002 20:43:55 Initializing GDBM... 23/Aug/2002 20:43:55 Initializing network devices... 23/Aug/2002 20:43:55 Found interface [index=0] '\Device\Packet_{14...1C}' 23/Aug/2002 20:43:55 Found interface [index=1] '\Device\Packet_{86...B4}' 23/Aug/2002 20:43:55 Found interface [index=2] '\Device\Packet_NdisWanIp' 23/Aug/2002 20:43:57 ntop v.2.1 MT [WinNT/2K/XP] (11/07/2002 build) 23/Aug/2002 20:43:57 Listening on [3F1C}\Device\Packet_{14...1C} By default, ntop will use the lowest numbered interface. Because #s are assigned based on the sequence cards are discovered, and this is altered if cards are removed and added, this is often not what you want. After you figure out which NIC you want, start ntop /c -i1 or -i2 or whatever... Q. OK, but how to I translate \Device\Packet_xxxxx to my Froboz ModelT network card and not the Fubar27 that's on the motherboard. A. ntop should report both the index and the human readable information. A. A Google search on script "CurrentVersion\NetworkCards" finds a couple of scripts/utilities that might work in various environments. A. Otherwise... You're going to need to view the registry. All the usual warnings - back up your pc, etc. If you damage the registry, you may not be able to reboot the computer. You're not going to CHANGE anything, but an inadvertent keystroke could be disaster ... BE CAREFUL! Under WinNT/2K, to find the interface name of your NIC look in the registry at the keys in HKLM\Software\Microsoft\Windows NT\Currentversion\NetworkCards\ The two subkeys, Servicename and the Description tells you which id maps to which NIC. Q. Where does ntop look for html (and gif) files under Win32? A. ntop looks in two places. The first is the current directory and the second is configurable through a constant in ntop_win32.h, #define DATAFILE_DIR "." Note that the current directory, or ".", may not be what you expect. When running ntop as a Win32 service, "." is %SystemRoot%\system32, meaning that ntop looks in %SystemRoot%\system32\html for the .html and .gif files. When running ntop from the command line, ntop /c parameters... "." is whatever directory is current. This means that if you run ntop with a full, explicit path (c:\ntopnew\ntop /c ...) there may be an unexpected difference between what ntop finds for "." and what you THINK "." is! This will lead to missing .html and .gif files. If you wish to have ntop look in a specific place for the files, the best choices are: 1) Create a .bat file to run ntop which does a cd to the expected directory first. 2) Edit ntop_win32.c and then recompile. Note that the settings for DATAFILE_DIR (and other constants) are reported on the text version of the configuration page, textinfo.html. -------------------------------------------------------------------------------- -----Win32 (MinGW) (Windows)---------------------------------------------------- -------------------------------------------------------------------------------- Q. What's the scoop with ntop on Windows? A. Semi-officially, ntop for Windows 95/98/ME/NT/2K is also provided as a binary application with limited capture capability (1000 packets). This is intended to allow demonstration of ntop for people without access to a Unix system. We call this version Win32 after the old official name of the Windows library. If you want to use the full version with unlimited packet capture you can either: * Recompile ntop from the source by yourself (Luca says just open the files in MS Visual C++ 6.0 and press compile) * Register your ntop for Windows 95/98/NT/2K copy by paying a convenience fee to receive the prebuilt executable. If you decide to register your copy, Luca will send you an URL from which you can download the full version periodically. Q. So where did MinGW come in? A. All of the necessary open software tools have been ported to run under windows (sort of), so it is theoretically possible to build and run ntop under Windows. However, Windows and *nix are very, very different internally. So we have to use special versions of the packet capture library (winpcap instead of libpcap). And we needed our standard tools (gcc et al), plus some 'glue' so we could make *nix calls and have Windows things happen. For the tools and glue, there are three choices: native, Cygwin and MinGW. Native means you put lots of #ifdefs in to make Windows calls where you had *nix calls. Cygwin is a shim - it's a Windows dll (Dynamic Link Library) that pretends to support the *nix calls and then does the right Windows things for you. MinGW is a project to create native Windows tools and executables from *nix code. Each of these have limits, pluses and minuses. For example, Cygwin's dll has caused all sorts of problems (dlls and their *nix equivalent, shared libraries, usually do). MinGW has some limits. As MinGW grew, ntop for Win32(MinGW) got closer to ntop under *nix. Native means supporting two 'separate' code bases. Luca actually picked a hybrid - he uses Microsoft Visual C++ 6.0 - which has it's own (albeit incomplete) shim layer. As long as you stay within the limits of the shim, the same code works across platforms. In other places you have to make thinks like Windows wants them. How close are we? grep for WIN32. The advantage of the hybrid was that is was also pretty close to working under MinGW - creating native executables from the base code using free tools. So people sent in patches and it pretty much worked. Up until 2.1.3, that is. But it was never officially more than an 'it also runs'. After 2.1.3, Luca embarked on a process of bringing the WIN32 and *nix code closer together. Surprisingly, this actually broke MinGW! Q. Where do I get MinGW? A. The MinGW home page is http://www.mingw.org. Quoting: "MinGW is a collection of header files and import libraries that allow one to use GCC and produce native Windows32 programs that do not rely on any 3rd-party DLLs. The current set of tools include GNU Compiler Collection (GCC), GNU Binary Utilities (Binutils), GNU debugger (Gdb) , GNU make, and a assorted other utilities. We are currently working on creating a complete set of Mingw-hosted GNU toolchain, and looking for volunteers." Q. Does ntop work under Cygwin? A. The .exe distributed through ntop.org is built with Visual C++ 6.0. It proved just barely possible to use the same code under MinGW. Forget about cygwin. Q. Does ntop (v3.2) work under MinGW? A. Maybe (I think) - During the 3.1 development cycle changes were made to support MinGW and it should again work - see docs/BUILD-MinGW.txt -------------------------------------------------------------------------------- -----Win32 (MS Visual C++)------------------------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -----Libpng--------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Bad things - I see the following messages: libpng warning: Application was compiled with png.h from libpng-1.0.x libpng warning: Application is running with png.c from libpng-1.2.x gd-png: fatal libpng error: Incompatible libpng version in application and library A. You have a version problem with libpng. First off, following the instructions in BUILD-NTOP.txt should work just fine. These problems come about when you have libpng installed (i.e. using shared libraries). 1. If you are compiling from source, you may have png.h left over from the earlier version of libpng. Remove it. 2. (Most common under RedHat). RedHat 7.2 installs a libgd.so.1.8.4 library, which was compiled against 1.0.x series of libpng (which is fine, because RedHat 7.2 includes libpng-1.0.12). Updating RedHat to newer (RawHide) packages for libpng, http://www.rpmfind.net//linux/RPM/rawhide/1.0/i386/RedHat/RPMS/libpng-1.2.2-5.i386.html, should work. However, there are reports of version conflicts and required updates to multiple packages. Proceed with caution (especially if you decide to uninstall 1.2.2-5). Also, do not use --nodeps or --force, as this can leave you with two partially installed versions (see item #1, above). 3. (Slackware) Users have reported this error from an older header file in /usr/include. Make sure to run "make install" in the libpng directory so that the latest files are in the common library locations. You can do this with buildAll.sh, just navigate back down to the libpng-1.2.x directory first. 4. If you are building ntop on one machine and running on another, they may have different libpng.so versions. Even if you think you are using the static linked version (buildAll.sh), be careful - see the entry (above) on "make install" for libpng. Q. When I run ./configure, it finds png.h but not libpng: ******************************************************************* * * ERROR: libpng header or library routines are missing * (yes means it was found, no means it was not found) * * png.h...yes * png_read_info() in -lpng... * *>>> No way to proceed. * *??? Install libpng (and/or libpng-devel), check www.libpng.org *??? and Rerun ./configure * ******************************************************************* A. You're missing libpng.so. Look for it (locate libpng) and tell ntop where it is via the --with-png-lib= parameter. Q. I seem to be missing libpng.so - when I do locate libpng, it finds: /usr/lib/libpng.so.3 /usr/lib/libpng.so.3.1.2.2 /usr/lib/libpng12.so.0 /usr/lib/libpng12.so.0.1.2.2 /usr/lib/libpng.so.2.1.0.13 but no libpng.so... A. Yeah. Send RedHat a nasty gram. Q. I don't understand... A. In a normal libpng install, say from the source, you would have - in addition to the .so.n.n.n.n files - a symlink named libpng.so, like this: lrwxrwxrwx 1 root root 19 Apr 23 15:46 libpng.so -> libpng12.so.0.1.2.2 But, that link seems to be missing. Without it, -lpng doesn't properly resolve and you get the ./configure error. Q. Why? A. RedHat ships Linux with both versions of libpng, a 1.0.x and a 1.2.x version. Do this: $ rpm -qa | grep libpng And you'll see the libpng 1.0.x run time: libpng-1.2.2-8 libpng-devel-1.2.2-8 libpng10-1.0.13-6 Dig into the files installed by them and you'll not find libpng.so. Since they're incompatible RedHat doesn't create the libpng.so link. Instead they patch the makefiles to point the various packages at one or the other .so file they install. This allows them to ship packages that require one or the other. It works fine unless you try and install something other than via an rpm. Then you're missing the libpng.so file that normal packages look for... Best bet is to create a symbolic link from the libpng.so.xxxx installed by the package which matches the -devel (because that's where png.h is found), e.g.: ln -s /usr/lib/libpng.so.3.1.2.2 /usr/lib/libpng.so And remember this in case you update the libpng rpm's in the future. -------------------------------------------------------------------------------- -----Silly Season--------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Who is Pixel A. My cat. -------------------------------------------------------------------------------- -----HowTo Ask For Help (ntop mailing lists)------------------------------------ -------------------------------------------------------------------------------- HOWTO ask for help on the ntop or ntop-dev mailing lists: WHERE TO POST ============= ntop is for user questions - "How to I install", "data isn't being recorded", etc. ntop-dev is for code and development questions. The ntop-dev list goes to fewer people, those who have self-selected themselves to be interested in ntop at the code level. ntop-misc is for other products - nProbe, nBox, PF_RING, etc. Discussions about the current cvs version belong in ntop-dev. If a discussion gets too technical, you may be asked to "move it to ntop-dev". Please honor that request (even if you have to subscribe for a while - ntop-dev is fairly low traffic). There used to be mailing lists and trackers at SourceForge, which were rarely looked at and have been discontinued. Use the ntop and ntop-dev lists (go to http://www.ntop.org to signup for them). OFFICIAL vs UNOFFICIAL ====================== A response from Luca Deri should be considered official. He is the author of ntop and controls the project and it's destiny. ***Please understand that the mailing lists are a community support effort*** Besides Luca Deri, a number of people answer questions to the best of our ability. None of the rest of the people who may respond to your question on ntop or ntop-dev are able to respond "officially". Likewise, this HOWTO is unofficial. Everyone is welcome to help with the evolution of ntop - that is to find problems, create and test patches and send them in to patches@ntop.org for inclusion. There are a small number of people with write access to the cvs, but anything we commit is subject to being ripped out by Luca for any reason... or no reason at all... QUESTION FORMATS ================ ONE QUESTION per message, and you MUST use meaningful message subjects - one's that would have helped YOU find the prior discussion of this or a similar problem in the archives. Titles such as "urgent" or "ntop problem" will often not get a response - it may be urgent to you but it's probably not an issue for others. WE STRONGLY SUGGEST YOU USE THE BUILT IN AUTOMATICALLY GENERATED PROBLEM REPORT (About | "bug icon"). This includes most of the internal configuration data we ask for (and more) and has blank spots for you to fill it. Generate one, cut & paste into your mail client, edit the data and sent it. Beyond that, don't worry -- it's about information, not format. RESPONSES ========= Despite any individual's frequent postings, nobody is "responsible" for answering your question. It's all on a "best efforts" basis. Our responses may be incomplete, inaccurate, even dead wrong. Caveat Emptor! The only "guarantee" is that free support will be worth what you've paid for it. It may be worth MORE, it won't be worth LESS. Just because you post a question does NOT mean that you are OWED an answer. If nobody answers, then maybe it's because: * Nobody knows. * People are busy. * You've asked the same question multiple times and it's already been answered. * You have been asked for additional information and are unable/unwilling to supply it. or, well, any one of a dozen other reasons. Asking the same question multiple times - or asking it again because you don't like the answer you received - is a slap in the face of the person who took the time to answer you in the first place and will more than likely not get a different response. If you're not sure that your message posted, check the archives to see if your message is there -- please don't just keep reposting it. You can always use gmane (http://www.gmane.org) to see the last 600 or so postings to the lists. Please direct all original postings and subsequent replies to the list, not to someone privately. Most of us will reply solely to the mailing list, unless you specifically request otherwise. If you do request otherwise, the individual you sent it to may choose not to respond. Our posting here is NOT a public invitation to invade our e-mail boxes for your free private support. THE BACK AND FORTH PROCESS ========================== "Why don't you just fix my problem instead of asking for more information?" Understand that we can't see your machine (and wouldn't want the responsibility of sshing into somebody else's box as root). The only information we have is what you post and the responses to our questions. Few failures in ntop are related to the core processing routines - so if you're having a problem, it's most likely because of some combination of your network and your ntop configuration. It may be unique to you -- and only with YOUR help can it be resolved. WHAT IS SUPPORTED? ================== Releases are hosted at SourceForge. At the time of this writing the stable version is 3.0. What support is available is for the development version ("the cvs"). All support is in the form of fixing things in the cvs. However we also attempt to support the current "stable" release (3.0). Older versions are not supported -- especially 1.3 and the 2.0.99 series of 2.1 release candidates. If you have a problem with them, please obtain the current cvs version and see if it's still a problem. Unlike certain much larger projects, we don't fix things in older versions - there simply aren't enough resources available. intop is not supported. It's gone and no longer in the cvs. For a look at Rocco's new, work-in-progress, download ntcsh, the ntop enabled tcsh shell. Please understand that the only way to fix your problem may be a source patch, which you will have to apply, compile, install and test against the cvs version prior to it's inclusion in the cvs. If you aren't capable of or willing to do these steps -- for whatever reason -- then you should not be compiling from the cvs. CVS === The cvs is at http://cvs.ntop.org, userid is anonymous, password ntop. The cvs is a DEVELOPMENT version. The code in the cvs is subject to rapid change. At any point in time, it may not compile. It may not compile with certain options or on some platforms. s'be'it -- it's a DEVELOPMENT version. 3.1 === The actual flow of ntop development was 3.0.50.. -> -> 3.0.50.. -> 3.1rc1 -> 3.1 3.2 === The actual flow of ntop development was 3.1.1.. -> etc (I think .4 was the last Win32 version), -> 3.1.50.. -> 3.1.51 -> 3.2rc1 -> 3.2rc2 -> 3.2 FEE-BASED SUPPORT ================= If you want better than "best-efforts" support, contact the individual you Desire support from off-list to make financial arrangements. Please understand that people are doing development in areas that are of personal interest to them, to improve ntop. If you want to discuss payment for support or a specific change that is of Interest to you, feel free to email the individual off-list - some of us are Computer consultants and can be bought, with the understanding that the work product is offered back to the community in the spirit of the open source movement and the strictures of the GPL. SO WHAT INFORMATION SHOULD I POST? ================================== BEFORE POSTING: 1. Please review the output from ./configure. We all have the bad habit of skipping over this, but there are often warnings which explain why things don't work. ntop tries to build itself by turning off features where the required libraries and/or headers aren't available. The minimum required set is just that - minimal. This is often the source of "feature x or switch y doesn't work" reports. 2. Please review the docs/FAQ file. 3. Please review back message traffic from the mailing lists. Yes, we know that there isn't a search function at ntop.org. Did you know that the lists are spidered every couple of months or so and can be searched through Google?? For example, "site:lists.ntop.org rpm" will find mail list messages with the word "rpm" in them. Do you know about gmane (http://www.gmane.org) has archives (searchable) of the ntop lists going back into late 2001. The lists are called gmane.linux.ntop.devel gmane.linux.ntop.general You can read these online (the last 600 messages or so) or through the nntp server. POSTING: Do not worry about posting TOO much information - we're pretty good at filtering out the noise. WE STRONGLY SUGGEST YOU USE THE BUILT IN AUTOMATICALLY GENERATED PROBLEM REPORT (About | "bug icon"). This includes most of the internal configuration data we ask for (and more) and has blank spots for you to fill it. Generate one, cut & paste into your mail client, edit the data and sent it. If you can't or won't use the automated problem report (say, for example you can't get ntop up to generate it) - don't worry -- it's about information, not format. Send us what you can, organized this way: 1. A brief summary of the problem. 2. Operations The EXACT command line you use to invoke ntop. If it's in a script, cut & paste it and resolve all the variables! Error Messages: Cut & paste the exact text. If it's in the log, give us 15 or 20 lines before. The exact URL you used from the browser. 3. Software ntop version, source and any applied patches If you've compiled from the source, say so! If you're using a package (such as an .rpm), where did you get it from and what is the EXACT name, version information and date? (for example, post the output from rpm -q ntop -i) OS vendor & version gcc version (e.g. gcc --version) (For ./configure problems, the versions for autoconf, automake and libtool too) glibc version Any major upgrades (kernel, networking, etc.) What else is running 4. Hardware Type & # of processors Amount of memory # network interfaces and types (vendor, bus, etc.) 5. Network Roughly where are the interface(s) you're monitoring (Public Internet, Private LAN, what?) What's the bandwidth (e.g. 10 Mbps University internet, 1.5 Mbps T1, Cable Modem capped at 1.5Mbps, 56K dialup) How many machines (traffic sources/destinations) and users (If you're uncomfortable giving specifics, then leave it generic, but the information is necessary to allow efficient use of the community's time helping YOU with YOUR problem) AFTER POSTING: Please let us know if our help fixed the problem, didn't solve it or enabled you to solve it yourself and what the result was. The historical record of the ntop and ntop-dev archives is the complete chain from problem to resolution. (Originally posted on 07Jan2002 to ntop and ntop-dev, updated. This is version 12April2003) -------------------------------------------------------------------------------- -----GDB ultraMini-tutorial - Running ntop under gdb (debugger)----------------- -----or, 'capturing the failure point' -------------------------------------------------------------------------------- The very best way to debug a segmentation fault in ntop is to use gdb. The Standard ntop compile already has the flags necessary to do this set. (Note - if you don't have gdb, or aren't compiling yourself, this won't work) > gdb /usr/bin/ntop (or wherever ntop is installed) ... (gdb) set args (your usual arg string) -K [That is, add the -K argument. While you are at it, don't give it the -d argument and add -u root (replace any existing -u value) - yes, it's insecure running as root, but you're not planning on doing this in production nor as a routine situation!] it will run... when it bombs... "bt full" does a decent job of printing the stack and the back trace and the local variables at each level. Just make sure you are in the thread you are interested in (i.e. DO THIS FIRST) (gdb) bt full #0 0x40592557 in __libc_pause () from /lib/i686/libc.so.6 No locals. #1 0x4046b5a3 in pause () at wrapsyscall.c:123 result = -1073743680 oldtype = 0 #2 0x0804ac1b in main (argc=22, argv=0xbffffa44) at main.c:928 argc = -1073743680 argv = (char **) 0x0 i = 0 userSpecified = 1 ifStr = "eth0,eth1", '\000' lastTime = 1025633918 #3 0x404f3647 in __libc_start_main (main=0x804a74c , argc=22, ubp_av=0xbffffa44, init=0x8049600 <_init>, fini=0x804d000 <_fini>, rtld_fini=0x4000dcd4 <_dl_fini>, stack_end=0xbffffa3c) at ../sysdeps/generic/libc-start.c:129 ubp_av = (char **) 0xbffffa44 fini = (void (*)()) 0x40016b4c <_dl_debug_mask> rtld_fini = (void (*)()) 0xbffff87c ubp_ev = (char **) 0xbffffaa0 (gdb) Now, continue: if there are any seemingly interesting variables involved, you can print them: (gdb) print deviceId [gdb can handle pretty complex arguments in the print command, so you can say "print myGlobals.device[0].hash_hostTraffic[myGlobals.broadcastEntryIdx]" if that's what it bombed on.] Sometimes gdb won't find a variable, that's because C used a register. S'be'it. Other interesting things: (gdb) list [this shows where in the code it died] (gdb) info threads [this shows the status of the multiple threads] (gdb) info stack [this shows the call stack] If you want, you can check each of the threads and THEIR status via: (gdb) thread 1 [or any valid number] (gdb) info stack gdb has all kinds of included help, and frankly that's all I know... Here are some extracts and examples: (gdb) help info thread IDs of currently known threads. (gdb) info thread 13 Thread 11276 (LWP 8967) 0x405f651e in __select () from /lib/i686/libc.so.6 12 Thread 10251 (LWP 8966) 0x405f651e in __select () from /lib/i686/libc.so.6 11 Thread 9226 (LWP 8965) 0x405f651e in __select () from /lib/i686/libc.so.6 10 Thread 8201 (LWP 8964) 0x405f651e in __select () from /lib/i686/libc.so.6 9 Thread 7176 (LWP 8963) 0x405f651e in __select () from /lib/i686/libc.so.6 8 Thread 6151 (LWP 8962) 0x405ca071 in __libc_nanosleep () from /lib/i686/libc.so.6 7 Thread 5126 (LWP 8961) 0x4053db85 in __sigsuspend (set=0x4300998c) at ../sysdeps/unix/sysv/linux/sigsuspend.c:45 6 Thread 4101 (LWP 8960) 0x405ca071 in __libc_nanosleep () from /lib/i686/libc.so.6 5 Thread 3076 (LWP 8959) 0x405ca071 in __libc_nanosleep () from /lib/i686/libc.so.6 4 Thread 2051 (LWP 8958) 0x405ca071 in __libc_nanosleep () from /lib/i686/libc.so.6 3 Thread 1026 (LWP 8957) 0x4053db85 in __sigsuspend (set=0x4100967c) at ../sysdeps/unix/sysv/linux/sigsuspend.c:45 2 Thread 2049 (LWP 8956) 0x405f4e17 in __poll (fds=0x823dbec, nfds=1, timeout=2000) at ../sysdeps/unix/sysv/linux/poll.c:63 * 1 Thread 1024 (LWP 8952) 0x405ca027 in __libc_pause () from /lib/i686/libc.so.6 The * indicates the current thread. Switch with this: (gdb) thread 7 Once you have a thread selected, you can look at the call stack: (gdb) help stack Examining the stack. The stack is made up of stack frames. Gdb assigns numbers to stack frames counting from zero for the innermost (currently executing) frame. At any time gdb identifies one frame as the "selected" frame. Variable lookups are done with respect to the selected frame. When the program being debugged stops, gdb selects the innermost frame. The commands below can be used to select other frames by number or address. List of commands: backtrace -- Print backtrace of all stack frames bt -- Print backtrace of all stack frames down -- Select and print stack frame called by this one frame -- Select and print a stack frame return -- Make selected stack frame return to its caller select-frame -- Select a stack frame without printing anything up -- Select and print stack frame that called this one Type "help" followed by command name for full documentation. Command name abbreviations are allowed if unambiguous. (gdb) info stack #0 0x4053db85 in __sigsuspend (set=0x4300998c) at ../sysdeps/unix/sysv/linux/sigsuspend.c:45 #1 0x404db1c9 in __pthread_wait_for_restart_signal (self=0x43009be0) at pthread.c:969 #2 0x404dc1ec in __new_sem_wait (sem=0x804d5c8) at restart.h:34 #3 0x402960e0 in waitSem (semId=0x804d5c8) at util.c:1126 #4 0x4027ae0f in dequeueAddress (notUsed=0x0) at address.c:425 #5 0x404d8c6f in pthread_start_thread (arg=0x43009be0) at manager.c:284 And select a specific frame via: (gdb) select-frame 4 (gdb) help list List specified function or line. With no argument, lists ten more lines after or around previous listing. "list -" lists the ten lines before a previous ten-line listing. One argument specifies a line, and ten lines are listed around that line. Two arguments with comma between specify starting and ending lines to list. Lines can be specified in these ways: LINENUM, to list around that line in current file, FILE:LINENUM, to list around that line in that file, FUNCTION, to list around beginning of that function, FILE:FUNCTION, to distinguish among like-named static functions. *ADDRESS, to list around the line containing that address. With two args if one is empty it stands for ten lines away from the other arg. (gdb) list address.c:425 420 421 while((myGlobals.addressQueueLen == 0) 422 && (myGlobals.capturePackets) /* Courtesy of Wies-Software */ 423 ) { 424 #ifdef USE_SEMAPHORES 425 waitSem(&myGlobals.queueAddressSem); 426 #else 427 waitCondvar(&myGlobals.queueAddressCondvar); 428 #endif 429 key_data.dptr = data_data.dptr = NULL; (gdb) help print Print value of expression EXP. Variables accessible are those of the lexical environment of the selected stack frame, plus all those whose scope is global or an entire file. $NUM gets previous value number NUM. $ and $$ are the last two values. $$NUM refers to NUM'th value back from the last one. Names starting with $ refer to registers (with the values they would have if the program were to return to the stack frame now selected, restoring all registers saved by frames farther in) or else to debugger "convenience" variables (any such name not a known register). Use assignment expressions to give values to convenience variables. {TYPE}ADREXP refers to a datum of data type TYPE, located at address ADREXP. @ is a binary operator for treating consecutive data objects anywhere in memory as an array. FOO@NUM gives an array whose first element is FOO, whose second element is stored in the space following where FOO is stored, etc. FOO must be an expression whose value resides in memory. EXP may be preceded with /FMT, where FMT is a format letter but no count or size letter (see "x" command). (gdb) print key_data $3 = {dptr = 0x0, dsize = 1076452514} (gdb) print data_data $4 = {dptr = 0x0, dsize = 4} ========================================================================== ========================================================================== Original version Luca Deri, 1999-2001 Updated Burton M. Strauss III 2002, 2003, 2004, 2005 ntop-5.0.1+dfsg1/docs/README0000644000000000000000000000304107414541016014003 0ustar rootroot _ _ _ | \ | | |_ ___ _ __ | \| | __/ _ \| '_ \ | |\ | || (_) | |_) | |_| \_|\__\___/| .__/ |_| Network Top -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- README ====== Written by Luca Deri Portions by Stefano Suin Centro SERRA, University of Pisa http://www.ntop.org/ ntop is a tool that shows the network usage, similar to what the popular top Unix command does. ntop is based on pcapture (ftp://ftp.ee.lbl.gov/pcapture.tar.Z) and it has been written in a portable way in order to virtually run on every Unix platform. ntop can be used in both interactive or web mode. In the first case, ntop displays the network status on the user's terminal whereas in web mode a web browser (e.g. netscape) can attach to ntop (that acts as a web server) and get a dump of the network status. In the latter case, ntop can be seen as a simple RMON-like agent with an embedded web interface. ntop uses libpcap, a system-independent interface for user-level packet capture. Before building ntop, you must first retrieve and build libpcap, from ftp://ftp.ee.lbl.gov/libpcap.tar.Z Once libpcap is built (either install it or make sure it's in ../libpcap), you can build ntop using the procedure in the INSTALL file. ntop is distributed under the GNU GPL (see the COPYING file). Problems, bugs, questions, desirable enhancements, source code contributions, etc., should be sent to the email address "ntop@ntop.org". - Luca Deri , December 1998. ntop-5.0.1+dfsg1/docs/FAQarchive0000644000000000000000000011054410437330554015030 0ustar rootroot-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- _ _ _ | \ | | |_ ___ _ __ | \| | __/ _ \| '_ \ | |\ | || (_) | |_) | |_| \_|\__\___/| .__/ |_| Network Top -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- This document contains older, obsolete articles from ntop's docs/FAQ ... which are being kept around because of some historical interest. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -------------------------------------------------------------------------------- ----- Running ntop ------------------------------------------------------------- -------------------------------------------------------------------------------- Q. How can I run ntop without being root? A. A very simple way of doing this is: > su > chown root ntop > chgrp root ntop > chmod 6111 ntop > exit This makes ntop read-only for everyone and sets the setuid and setguid bits. Do not forget to use the -u flag so that ntop changes user as soon as it is started. Understand that setting the Setuid and Setguid bits allows ANY user to run ntop and it will run with ROOT privileges. This is very powerful, and often a source of security exposure - many system hardening scripts and recommendations tell you to look for and remove the setuid and setguid bits. DO NOT suid UNLESS YOU UNDERSTAND THE RISKS! REPEAT: DO NOT DO THIS, IT IS A BAD IDEA! Also, there are unconfirmed reports of this method problems, causing a "socket: operation not permitted" message. Probably related to something in the OS checking for real root not suid to open the interface in promiscuous mode. Q. What was the -S option? A. The -S option was the --store-mode option, or the "Persistent storage mode" Ntop's internal structures are basically an array of devices (network interfaces), which contains an array of hosts (specific machines seen on the device. The -S option told ntop to store information about hosts in a database where it could be retrieved on a subsequent run. This option was removed from ntop in the 2.1.52 development version. Q. But what about SQL and mySQL A. Removed in 2.1.50+ versions - use rrd Q. But I really, really, need the data in an sql database. A. If you are only interested in saving your netflow data in MySQL, use the script ntop/NetFlow/netFlowClient.pl (netflow v5). With few additional lines you could save your data in flat files, forward the netflow data or whatever. What this script does it set itself up as a netflow collector and sql inserter. The main loop just accepts a netflow packet and inserts the flow(s) into sql. To use this with a single instance of ntop, just set ntop up as a netflow sender, directed at the script (e.g. 127.0.0.1 on any port you like). Configure the script with the port # and run it. The same idea would work with sFlow, you would just have to change the packet decoding part of the script. Q: How does ntop use lsof? nmap? A. ntop no longer uses these external tools. OS fingerprinting was replaced by ettercap. If you need lsof data, you should ssh to the host and run it locally (this allows the sysadmin to put appropriate security on lsof). -------------------------------------------------------------------------------- ----- 3.0 ran under ------------------------------------------------------------ -------------------------------------------------------------------------------- Q. (3.0) ntop runs under? A. ntop is known to work under Linux, Mac OS X, FreeBSD, Solaris and Win32. ntop development is done primarily on Fedora Linux. Luca also does a port to Win32 (MS Visual C++) and used to work in the Sun Solaris environment. I (Burton) usually work under Fedora Linux, but have a multi-boot system for testing that runs various Linux distros, FreeBSD (4.10 and 5.3) and Solaris 10 i86. I could do NetBSD and OpenBSD, but those have big problems and ntop probably won't work. During the ntop 3.0 development cycle, we did some development and testing on various platforms. Here's data from the version.xml log showing what people were running while testing 2.2.98 and 2.2.99: count OS Version ------- ------- -------------- 492 Linux 90 Windows WinNT/2K/XP 11 FreeBSD 4.9 9 Solaris 9 7 Darwin 7.2.0 6 FreeBSD 5.2 6 FreeBSD 5.1 and <5 records for FreeBSD 4.6.2, 4.8, 5.0, 5.2.1; OpenBSD 3.4; and Solaris 8. So: Solaris 8 / 9 work, 2.6 and 7 probably would... FreeBSD 4.6.2/4.8/4.9 and 5.1/5.2 OpenBSD 3.4 NetBSD doesn't seem to have been tested. Lots of Different Linuxes... of the ones we recognize: count Distro Release ------- --------- -------- 141 redhat 9 42 fedora 1 39 slackware 9.1.0 38 redhat 7.3 26 redhat 8.0 15 debian (probably 3.0) 11 mandrake 9.2 10 suse 9.0 10 slackware 9.0.0 9 redhat 7.2 8 debian 3.0 7 redhat 2.1AS 6 mandrake 9.1 5 suse 8.2 5 redhat 3 and < 5 records for arch 0.6; aurora 1.0; aurox 9.2; fedora 0.95; gentoo 1.4.2.9, 1.4.3.10 and 1.4.3.12; immunix 7.0; mandrake 8.1 and 8.2; pld 1.1; redhat 1, 2.1, 6.2, 7.0, 7.1; slackware 7.1.0, 8.1 and 9.0-beta; suse 6.3, 7.0, 8.0 and 8.1; and yellowdog 3.0. -------------------------------------------------------------------------------- ----- .deps -------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Make fails with a message about a missing .deps file A. Basically, it's a automake 1.5 bug, related to dependency tracking. If you don't have automake installed, you shouldn't see this problem. ntop requires automake 1.6+ - that dependency is EXPLICT in the Makefile.am! If you do have automake installed, it's possible to hit this problem - especially if it's one of those Linux distributions that have three versions of automake installed and a (broken) script that's supposed to figure out which version to actually run. Since we distribute ntop with scripts generated from 1.6.3, you would *think* they should work, regardless of what version of automake is installed. That's not the case. The problem occurs because automake gets invoked by ./configure to copy the missing gnu files such as depcomp. If you have 1.5 installed, it then remakes the plugins/Makefile as a 1.5 version, which fails. The problem should be trapped and worked around, however, so report the problem to the list. Q. Why is the .deps problem mostly happening under FreeBSD? A. Because the FreeBSD ports tree only has 1.5, but that's a FreeBSD ports problem, not ntop's. If you search the FreeBSD lists on Google, there's lots of traffic about a 1.6 version for FreeBSD, but it doesn't seem to be in the tree. What's there is: ./devel/automake -- which is 1.5 ./devel/automake14 ./devel/automake17 -- which does NOT work Q. So how do I work around the problem? A. Install 1.6.3. It's quite easy, does NOT require root. The steps are listed in the ./configure message, repeated below: Download automake 1.6.3 from gnu $ wget http://ftp.gnu.org/gnu/automake/automake-1.6.3.tar.gz Untar it $ tar xfvz automake-1.6.3.tar.gz Make it $ cd automake-1.6.3 $ ./configure --prefix=/home//automake163 $ make $ make install Add it to your path (this is bash, but other shells, can do it too) $ PATH=/home/automake163/bin:$PATH $ export PATH And then untar, ./configure and make ntop. -------------------------------------------------------------------------------- ----- census ------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. Anything else? A. Yes. Run the "census" - this will send us an email telling us what's working and what's not working. The census sends me the basics - uname information, autotool versions, version.c. The domain name is blinded, and the script will show you the file before it's sent (you'll have 10 seconds to press control-c to abort). If things work ok, then send the census information via make census-ok If you have problems, the create the census information via make census-fail Edit it to describe the problem and send it to census@ntopsupport.com These options were dropped during the 3.3 deveopment cycle... -------------------------------------------------------------------------------- ----- Dropped packets ---------------------------------------------------------- -------------------------------------------------------------------------------- A. Short Answer: You need a faster processor. Maybe. A. Long Answer: There are four places packets drop "in" ntop. One in the NIC, one in the OS kernel, one in the libpcap library and one actually in ntop. First off, this is largely NOT controlled by ntop. It's inside the network card, the network card driver and libpcap. All ntop does is use the stats provided by libpcap, pcap_stats: "int pcap_stats() returns 0 and fills in a pcap_stat struct. The values represent packet statistics from the start of the run to the time of the call. If there is an error or the under lying packet capture doesn't support packet statistics, -1 is returned and the error text can be obtained with pcap_perror() or pcap_geterr()." to get the value and reports it in report.con the Stats | Traffic page, some in the configuration report (info.html) and also on the problem report skeleton. The information on the Stats | Traffic page is simply the best available. However, this data is not always easy to obtain nor interpret. It looks great, but the reality is that the stats provided by libpcap aren't very good! Q. Not good? Why... A. The network card (NIC) reads packets from the wire into a small buffer. That buffer is emptied by the OS into it's own buffers which are then passed to libpcap. libpcap filters the packets (if requested) and passes the packets to ntop. Packets may be dropped at any or all of these stages, even on a system that does not appear to be exceptionally busy. Q. How can packets be lost in the NIC? A. A NIC has a small buffer - modern cards have 8K, 12K, even more buffer space. But if traffic comes in off the wire faster than the processes are pulling it out of the NIC, well that buffer gets over-written and packets get dropped. Every time a packet comes in (or on some newer cards after a few packets are recevied), the NIC interrupts the processor (CPU) to tell it to do something. This isn't a problem - some NICs with larger buffers internally queuing a number of packets before interrupting the OS to boost performance. Check ifconfig for this: eth0 Link encap:Ethernet HWaddr 00:D0:09:77:85:B9 inet addr:192.168.42.6 Bcast:192.168.42.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3892397 errors:30 dropped:0 overruns:0 frame:33 ^^^^^^^^^ TX packets:473009 errors:0 dropped:0 overruns:0 carrier:0 ^^^^^^^^^ collisions:1073 txqueuelen:100 RX bytes:2606704447 (2485.9 Mb) TX bytes:70474880 (67.2 Mb) Interrupt:11 Base address:0xc000 Now, if it's an occasional burst, losing 1 or 2 packets won't kill you. TCP/IP recovers. And ntop's statistics aren't life-critical. If, however, it's continuous, on-going and the count is growing - i.e. the NIC/CPU combo can't keep up with the AVERAGE network flow? You're toast... Upgrade the Processor or NIC. Maybe. Q. Can you tell if the NIC is the bottleneck? A. Probably not. Different NIC cards (and NIC card drivers) record different information. Different tools present pieces and parts of it differently. For example, a runt packet - one that is too short to really be a packet is supposed to be discarded according to the tcp/ip standard. But do you count it as a packet received?? On many systems, interface level (NIC) statistics are available through the ifconfig (or similar) command. But what is available and what they mean can be different - even though they're presented in the same format. Different programs can read the 'same' data and show different things. For example - eth1 is an Intel Ethernet Pro/100, eth2 a 3c905... # netstat -i --all Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth1 1500 0 50752227 0 0 0 0 0 0 0 BMPRU eth2 1500 0 145053154 0 0 0 0 0 0 0 BMPRU No errors - great, right? But look at ifconfig, a few seconds earlier: # ifconfig eth1 Link encap:Ethernet HWaddr 00:03:47:B1:62:27 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:50754251 errors:0 dropped:0 overruns:0 frame:3454146 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:667103055 (636.1 Mb) TX bytes:0 (0.0 b) Interrupt:9 Base address:0x1000 eth2 Link encap:Ethernet HWaddr 00:60:97:04:30:33 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:145056087 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:1784472399 (1701.8 Mb) TX bytes:0 (0.0 b) Interrupt:9 Base address:0xb800 If I'm reading the code right, then the frame:nnnn count is set here: sp->stats.rx_frame_errors += le32_to_cpu(sp->lstats->rx_align_errs); Meaning? No clue - the writer of the driver had to sign an NDA and so couldn't explain a lot of what the driver does. Besides, that data isn't available to ntop anyway. Q. How can packets can be lost in the kernel? A. Each time that interrupt occurs, the kernel processes it by moving the data from the NIC to a kernel buffer, then re-enable interrupts. Not really. Actually, in Linux (and other OSes), the Kernel interrupt handler is broken in half - called in Linux the top and bottom. The bottom interrupt works with processor interrupts off to grab the data and buffer it and does only minimal processing as fast as possible so interrupts can be turned back on. Then the top half is scheduled and processes as a Kernel process (high priority), but it is less time critical. However, if the kernel can't process the bottom half in time - because there isn't enough memory and/or the processor isn't fast enough to respond to the interrupt, you do have a problem. The small buffer in the NIC will overflow and packets are dropped (this is the ONE place where a better NIC, with a larger buffer, MIGHT help). While there are LOTS of possible causes, if the kernel is *routinely* dropping packets, it's almost certainly an interrupt/processor speed/buffering issue. So, I guess what I'm saying is that the dropped: count from ifconfig might not be the NIC's fault - and that's why a faster processor is a better choice than an expensive server class NIC. Q. But at least I can trust the libpcap reported counts, right? A. Nope. You need to treat the pcap reported drops with more than a few grains of salt. See this thread, for example: http://www.tcpdump.org/lists/workers/2001/07/msg00018.html and this msg: http://www.mcabee.org/lists/snort-users/Jan-02/msg00771.html There's a lot of other stuff about pcap problems, especially from snort (another package that stresses libpcap) - STFW for "libpcap ps_drop". See, the call to pcap_stats reads internal counters - maybe they come from the NIC and maybe they're just maintained by the kernel. That's a function of how the low level NIC driver is written to handle certain calls from higher level drivers. So it's a function of the specific NIC card, something we try to hide from everyone, ntop included. Ultimately, some piece of hardware or software SHOULD be counting packets and dropped packets. But, remember also, that - AT THE INSTANT OF THE pcap_stats call - there can be packets queued in any of these buffers (NIC, kernel, libpcap). Put the two together and I wouldn't trust 'em. Want more fear? Read the comments through out the libpcap code. Like this gem from pcap-linux.c: * Get the statistics for the given packet capture handle. * Reports the number of dropped packets iff the kernel supports * the PACKET_STATISTICS "getsockopt()" argument (2.4 and later * kernels, and 2.2[.x] kernels with Alexey Kuznetzov's turbopacket * patches); otherwise, that information isn't available, and we lie * and report 0 as the count of dropped packets. And this from pcap-bpf.c: /* * "ps_recv" counts packets handed to the filter, not packets * that passed the filter. This includes packets later dropped * because we ran out of buffer space. * * "ps_drop" counts packets dropped inside the BPF device * because we ran out of buffer space. It doesn't count * packets dropped by the interface driver. It counts * only packets that passed the filter. * * Both statistics include packets not yet read from the kernel * by libpcap, and thus not yet seen by the application. */ As you see from the comments in the code, the interpretation of even those counts differs between operating systems and even between minor versions of the same OS (e.g. Linux 2.4.8 vs. 2.4.9). For example, some systems do not maintain a dropped count and will always report zero. Differences may also occur on the same system for different NIC drivers. If a BPF filter (-B option) is in place, the differences between OSes are more significant. etc. Trust nobody... Q. ntop drops packets? A. Sure. ntop runs multiple threads (we call them "NPS - Network Packet Sniffer" or something similar), one to handle each incomming device. These operate much like the bottom-half interrupt - they accept the packet and queue it to another thread ("NPA - Network Packet Analyzer") for the analysis. Ultimately, we're interested in the counter droppedPkts, which is incremented in only one place, pbuf.c around 1398, which this is where NPS is trying to queue a packet for NPA. Now, you can increase PACKET_QUEUE_LENGTH ntop.h: 693 #define PACKET_QUEUE_LENGTH 2048 but if you're routinely dropping packets here it's because ntop can't keep up with the flow. Increasing the queue length will ONLY help if it's an occasional huge peak with times where the network is quiet enough to allow you to work off the queue. And each packet buffer in use takes up memory - (about 1.5MB for a queue of size 2048). The instantaneous and maximum value for the queue are reported in the configuration report: # Queued Pkts to Process 0 # Max Queued Pkts 0 But, again, the best answer for dropped packets is probably a faster processor... (Upgrading to an expensive faster NIC with a larger internal buffer is rarely the best "bang for the buck" - if you were running a server, then a server class NIC is a good idea, but for workstations or network monitors, etc. you just need something that can keep up with the network flow.) Q. So what do you show? A. The kicker is that accurate counts of raw and dropped packets do not exist or are not available without using low-level, system specific logic. The counts that ARE available in a system-independent way are what is reported in the statistics on the Stats | Traffic page. Q. So what is reported? A. ntop reports the packet and dropped counts as reported by libpcap and the received, dropped and processed counts it maintains internally. Q. So what does ntop do with what it does receive? A. ntop processes or queues all packets received from libpcap but may drop packets if the processing queue fills up. Losing a few packets inside ntop due to a rare burst of traffic is just that - rare, and is not a 'bug'. If you consistently see packets dropped by ntop then you probably need to use a faster processor (increasing the buffer size beyond the default of 2K packets will usually not help). Q. How do I tell? A. You can monitor the queue size on the 'Configuration' (info.html) page. Q. What about the other dropped items? A. If you consistently see packets dropped at either the interface or libpcap level, there is not much we can offer in the way of help for you. The best suggestion is to try another NIC or a faster machine. Q. Why? A. Some NICs - especially ISA ones - are just too slow at moving packets off of the card. Measurements I did on an old SMC 10BaseT card in 1993 showed that the best it could do - ISA bus, windows overhead, etc. all rolled together was about 1.7Mbps. Memory bus speeds (e.g. PC100 vs PC133, DDR333 vs DDR400, etc.) can also affect moving packets from the NIC to main memory. Q. Won't a faster CPU help? A. Maybe. Some network card drivers are processor intensive - and would benefit - but others offload most of the processing to the NIC, and so a faster CPU wouldn't matter. Even a fancy (read as expensive) NIC may not work well - the drivers for the NIC on one OS may take advantage of features the card provides and be 'faster', while the driver for the same NIC on another OS may not take advantage of these features and be 'slower'. As we say, YMMV... Q. So? A. So, remember - ntop drops packets, the kernel drops packets, libpcap drops packets and none of 'em do it the same way. Don't bet the farm on counting every packet with absolute accuracy and use ntop the way it was meant to be used - showing the overall usage and flows on the network. Still it's not all gloom and doom! Even if you're only processing 90% of the traffic, since the drops are pretty random, it's a decent bet that if 90% of what you DO see is MP3s, then 90% of the whole traffic flow is probably MP3s. -------------------------------------------------------------------------------- -----Running - Web Server------------------------------------------------------- -------------------------------------------------------------------------------- Q. ntop shows an older, single menu interface A. If ntop is unable to find the file index.html it generates the page internally. That page refers to 'leftindex.html' which is the all-in-one menu you see, similar to the v1.3 menu. To find the html files, ntop looks in the html subdirectory in two places: 1. In the current directory (i.e. ./html), and 2. In '[prefix]/share/ntop/html' (where [prefix] is set by the --prefix option of your ./configure step). Common causes: 1. Is manually installing ntop in an unusual place, having forgotten to update DATAFILE_DIR in config.h. Or forgetting to copy the html subdirectories, etc. 2. Forgetting to run './autogen.sh -1' first and 'make install' last when first building ntop from source. 3. Running ntop with an explicit path from somewhere other that the directory it's installed into. For example, if you install ntop into /root/ntop, but run it like this: cd /usr/bin /root/ntop/ntop It will look 1st in /usr/bin/html and then in [prefix]/share/ntop and not find the html files in /root/ntop/html! This often occurs when running ntop as a daemon, because the current working directory of the script is not what you expect it to be! -------------------------------------------------------------------------------- -----snapshot, cvs and the Wiki------------------------------------------------- -------------------------------------------------------------------------------- Q. What was "snapshot"? A. Snapshot was a community FAQ and documentation resource at http://snapshot.ntop.org. It's was also the site of "the snapshots". Unfortunately, snapshot seems to have 'Gone to Atlanta' (404), with the web server no longer responding in February 2004. Nicolai Petri's efforts were appreciated. But snapshot was an effort of love by a gentleman who hasn't had time for the effort in quite some time. Q. Is there a community resource that replaces (enhances) snapshot. A. Nope. There was a Wiki created after 3.0 release. But the ratio of defacements to community contributions was 2:1. So I killed it. Q. What was "a snapshot" or "the snapshots"? A. A snapshot was a dump of the ntop cvs structure, automatically generated every day at 5 minutes after midnight (Pisa time). Snapshots were named with their creation date, in the form of ntop-yy-mm-dd.tgz. Snapshots were neither polished nor even "releases". They contained any update(s) checked into the cvs during the prior day. No more, no less. cvs checkins (commits) are usually tested by the developer, but perhaps only in one (limited) environment. Occasionally a file is missed or a typo occurs and a snapshot wouldn't compile. Snapshots frequently introduced bugs that aren't apparent on a quick review. Snapshots were basically a point-in-time capture of the moving development environment. No more and no less. With release 2.2, rapid development occurred after general release and using the latest snapshot was your best bet. With 3.0, after a short period of stability (releases 2.2b and 2.2c), the development again outpaced the stable version and using the cvs again was almost manditory. If the 3.1 release doesn't work, drop by the mailing lists and check the back traffic to see if this is a common problem. If it's not, try the latest snapshot or ask for a recommendation of which version is the best to use. -------------------------------------------------------------------------------- -----Old answers, but goodies--------------------------------------------------- -------------------------------------------------------------------------------- Q. What is "obsolete/" A. Obsolete code is code that is no longer being maintained nor part of ntop, but it's stuck off in that directory because 1) storage is cheap and 2) it might have usage someday and 3) somebody might be interested in resurrecting it... Code in obsolete/ IS NOT MAINTAINED, even minimally. -------------------------------------------------------------------------------- -----FreeBSD-------------------------------------------------------------------- -------------------------------------------------------------------------------- Q. I can't compile ntop under FreeBSD 5.0 or 5.1. A. In some situations, we produce gcc link lines which expose a conflict 'tween FreeBSD 5.x and libtool. You will see the following error messages: expr: illegal option -- l usage: expr [-e] expression etc. See the release notes for FreeBSD 5.0 and the expr(1) man page: http://www.freebsd.org/releases/5.0R/DP2/relnotes-i386.html http://www.freebsd.org/cgi/man.cgi?query=expr&sektion=1&manpath=FreeBSD+5.0-current Solve this by setting the compatibility flag before running make. $ export EXPR_COMPAT=Y configure.in and configure have been updated to do warn you to do this. -------------------------------------------------------------------------------- -----ntop 3.1, FreeBSD and --set-pcap-nonblocking------------------------------- -------------------------------------------------------------------------------- A. With 3.1, we should be automatically setting this under FreeBSD and nowhere else. So it should be sort of automatic. If you like to live dangerously, you can try using the web configuration page to DISABLE the option under FreeBSD. One of three things will happen: 1. ntop runs fine. 2. The webserver runs slowly at first. 3. The web server hangs. #1: Congratulations, you are running on a system which doesn't actually have the bug. We would love to know the precise version of FreeBSD - the best way is to run cpp -dM and tell use the value for #define __FreeBSD_cc_version #2: Expected. There's some further special case coding in the ntop web server to decrease the pcap_dispatch() timeout. This lets the web server work throught it's angst faster. #3: This is really #2, you just don't have enough patience to way the minutes, hours or days it takes for the first web server page to come up. In cases #2 or #3, just go back to using --set-pcap-nonblocking. -------------------------------------------------------------------------------- -----ntop 3.1, FreeBSD and bad fds?--------------------------------------------- -------------------------------------------------------------------------------- Q. Um... something about bad fds? A. Oh yes, see bug bin/51535: uthreads bug: new opened files may get stale fcntl flags They fixed the code, sort of: OS Version ------- -------------- FreeBSD 4.9 FIXED FreeBSD 5.1 BUGGY FreeBSD 5.2 FIXED FreeBSD 4.8 BUGGY FreeBSD 4.6.2 BUGGY There's a work-around in ntop, called the HAVE_FILEDESCRIPTORBUG fix. If you even might possibly need it, it should be set in configureextra/ but go ahead and set it anyway, it can't hurt. (Since current FreeBSD versions as of 3.2 are 4.11 and 5.4, I've moved this to the archive) -------------------------------------------------------------------------------- -----BSD - OpenBSD-------------------------------------------------------------- During the ntop 3.0 development cycle, we tried development/testing under: 3.1 and 3.4 -------------------------------------------------------------------------------- Q. So? A. 3.1 - I could never make it work. Problem seems to be that the gnu tools such as ld don't support a.out systems very well. A. 3.4 - Julien Touche sweated buckets to make it work with partial success, but ultimately it didn't work. -------------------------------------------------------------------------------- -----BSD - NetBSD--------------------------------------------------------------- During the ntop 2.3 development cycle, we tried development/testing under: 1.5.3 1.6 1.6.1 -------------------------------------------------------------------------------- Q. So? A. Some testing was done using - ntop works only in SINGLE THREADED mode and so is fragile. Q. And Multithreaded? A. There isn't (yet) a standard POSIX thread package for NetBSD. Both "proven" and "unproven" threads have issues. One user was bound and determined to make GNU Pth work, but pth isn't quite POSIX threads and he's didn't get far... Q. But there IS a POSIX threads... A. Yes. And when NetBSD -current finally incorporates the POSIX threads (its been committed but not yet part of a release) this should be revisited. -------------------------------------------------------------------------------- -----Linux - RedHat------------------------------------------------------------- -------------------------------------------------------------------------------- Q. NPTL? A. When RH9 came out with NPTL, we had lots of problems. NPTL is much closer to POSIX threads, but very different from the old linuxthreads. At the same time, we had problems with the glibc 2.3.x (vs. 2.2.x) update. By the end of the 3.0 development cycle, a couple of memory management fixes seem to have made the NPTL/glibc problems go away. But if they're still out there, they are quite nasty. Random unexplained BOMBs and such. If you hit these problems, you can try disabling NPTL via this flag. Before both ./configure AND make, set the following: export LD_ASSUME_KERNEL=2.4.1" This forces the use of the old linuxthreads library. This flag may also do something to glibc, but it's undocumented and we never could really figure it out. For that run time behavior change to happen, you would also have to have the LD_ASSUME_KERNAL flag set at run time too. Q. The cause? A. Unknown. A lot of them seemed to go away when we fixed a free() that occurs in a fork()ed child of memory malloc()ed in the parent. Under Linux, the fork() gets a copy of memory, but a technique called copy-on-write is used to reduce the time the fork() takes. We suspected that the free() was corrupting the parent's memory structures, but this isn't supposed to be possible and we couldn't nail it down enough to report it to the glibc people. Q. What can I do to help? A. There is code in leaks.c tagged "DIAGNOSTIC". Turn it on, collect a set of potential problems and report them. However, this code isn't that bright. It will report all the free() calls in fork()ed children, even those that are legit (i.e. the malloc() was also in for fork()ed child). -------------------------------------------------------------------------------- -----Other platforms------------------------------------------------------------ -------------------------------------------------------------------------------- HP-UX =-=-= During the 2.2 development cycle, some work was done to make ntop work under HP-UX 11 without breaking the HP-UX 10.20 support (limited as it was). During the 3.0 development cycle, HP-UX was not considered. The #ifdef lines in the source were removed prior to ntop 3.2's release. It will almost certainly fail. IRIX (v1.3 information) =-=-=-=-=-=-=-=-=-=-=-=- During the ntop 2.2 and 3.0 development cycles, IRIX was not considered. It will almost certainly fail. Digital UNIX (v1.3) =================== During the ntop 2.2 and 3.0 development cycles, Digital UNIX was not considered. It will almost certainly fail. AIX (v1.3) ========== During the ntop 2.2 and 3.0 development cycles, AIX was not considered. It will almost certainly fail. The #ifdef lines in the source were removed prior to ntop 3.2's release. -------------------------------------------------------------------------------- -----Old Releases--------------------------------------------------------------- -------------------------------------------------------------------------------- 2.1.3 ===== The actual flow of ntop development was 2.1 -> 2.1.1 -> 2.1.2 -> 2.1.50 -> 2.1.51... Version 2.1.3 was provided by Dennis Schoen [ds@teuto.net] as part of the Debian project. Dennis (manually) maintains a bitkeeper tree, based on 2.1.2 with various patches which - in HIS opinion - were important enough to be back ported. Releases in this tree are identified as 2.1.2-n. Dennis reports you can obtain his current version via: bk clone bk://ntop.teuto.net:ntop-debian ntop-stable Version 2.1.3 is an export from Dennis' tree with the version number changed and is equivalent to 2.1.2-1. Dennis' graciously provided the extract and we accepted with thanks! 2.2 === The actual flow of ntop development was 2.1 -> 2.1.1 -> 2.1.2 -> 2.1.50 -> 2.1.51..59 -> 2.1.90..92 -> 2.2 after 2.2, came 2.2a/2.2b (Win32 only), then 2.2c. These were branches, containing unique 2.2 fixes and back-ports of some critical items. 3.0 === The actual flow of ntop development was 2.2.1..4 -> -> 2.2.90..99 -> 3.0pre1 -> 3.0 ntop-5.0.1+dfsg1/docs/DAG0000644000000000000000000000167207766102146013460 0ustar rootrootHow to use a DAG card with ntop ------------------------------- Why DAG? ======== DAG is a very fast and efficient card used for capturing traffic at very high speeds. If you have a fast (Gbit and above) network then this is probably the very best solution you can find on the market. How to use ntop on DAG ====================== 1. Get a DAG card from Endace (www.endace.com) 2. Get the DAG toolkit from Endace and install it (e.g. on /usr/local/dag) 3. Get lipcap 0.81 or newer from www.tcpdump.org 4. cd libcap-XXXX ./configure --with-dag=/usr/local/dag make make install [as root] 5. Get the ntop source (see http://www.ntop.org/download.html) from CVS 6. Compile ntop as usual but do make sure that ntop uses the libpcap you've just compiled. Credits ======= Many thanks to Endace for having donated a DAG card to the ntop project for the purpose of integrating it with ntop. ------------------------- Luca Deri - December 2003 ntop-5.0.1+dfsg1/docs/README.SSL0000644000000000000000000000042507414541016014446 0ustar rootrootHow to create your own SSL certificate -------------------------------------- 1) Get OpenSSL from http://www.openssl.org 2) Compile and install OpenSSL 3) make ntop-cert.pem 4) You certificate is now stored in ntop-cert.pem ----- Luca Deri - December 2001 ntop-5.0.1+dfsg1/docs/HACKING0000644000000000000000000000327307414541016014121 0ustar rootroot _ _ _ | \ | | |_ ___ _ __ | \| | __/ _ \| '_ \ | |\ | || (_) | |_) | |_| \_|\__\___/| .__/ |_| Network Top -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- HACKING ======= Those who want to be always at the bleeding edge or even want to hack on the ntop sources can fetch the latest ntop source tree via rsync from a copy of the master repository. This copy is updated in regular intervals from the authors original CVS repository and can be used for easily keeping local modifications in a checked out tree while the master version is updated over time. This is the best way to get fresh ntop code. In fact, ntop source code is periodically cut to build a snapshot. If you want to hack on ntop, it will make you life easier to have the following packages installed: - GNU libtool 1.3.3 (ftp://ftp.gnu.org/pub/gnu/libtool-1.3.3.tar.gz) - GNU m4 1.4 (ftp://ftp.gnu.org/pub/gnu/m4-1.4.tar.gz) - GNU automake 1.4 (ftp://ftp.gnu.org/pub/gnu/automake-1.4.tar.gz) - GNU autoconf 2.13 (ftp://ftp.gnu.org/pub/gnu/autoconf-2.13.tar.gz) These should be available by ftp from ftp.gnu.org or any of the fine GNU mirrors. Beta software can be found at ftp://alpha.gnu.org. This means that you will need the usual GNU tools to build these in maintainer mode from the development tree. You can basically type ./autogen.sh [a simple shell script that basically does the following for you: libtoolize --copy --force aclocal autoheader automake --add-missing --gnu autoconf configure ] Have fun! --------------------------- Luca Deri Rocco Carbone ntop-5.0.1+dfsg1/docs/BUILD-MinGW.txt0000644000000000000000000000614710054321071015503 0ustar rootrootQuick build using MinGW ----------------------- This is a quick description on how to build ntop on Win2k/XP using the MinGW toolchain. It is assumed you are familiar with MinGW and Windows programming in general. ntop requires many different libraries installed. This file does *not* tell you how to install those; it only briefly where to get them. If you're unable to build ntop from the sources, then you're probably better off using the Windows binary available from http://sourceforge.net/project/showfiles.php?group_id=17233 Obtaining Ntop -------------- This was last tested against the 21-May 2004 CVS version of ntop 3.0. Available via these hairy commands: cvs -d :pserver:anonymous@cvs.ntop.org:/export/home/ntop login cvs -d :pserver:anonymous@cvs.ntop.org:/export/home/ntop co ntop cvs -d :pserver:anonymous@cvs.ntop.org:/export/home/ntop logout use "ntop" when asked for a password. Note: the CVS-server is notoriously slow! Use the sources (ntop*.tgz) at http://sourceforge.net/project/showfiles.php?group_id=17233 if you don't mind using "old" sources. Building Ntop ------------- Prerequisites: 1) WinPCAP developer's pack available from http://winpcap.polito.it/ 2) GD-chart package available from http://www.fred.net/brv/chart/ 3) GD library (which is needed by GD-chart) is available from http://www.boutell.com/gd/ 4) PNG library for Portable Network Graphics images. Available from http://gnuwin32.sourceforge.net/packages/libpng.htm 5) Zlib compression library available from http://www.gzip.org/zlib/ 6) GNU database library available from http://sourceforge.net/project/showfiles.php?group_id=7382&package_id=12648 7) OpenSSL library is needed if "USE_SSL = 1" in Makefile.MingW. Available from http://www.openssl.org/ 8) Various tools; rm, sed, mkdir and man2html. The latter is only needed to generate ntop.html. Steps 1) Install and build all prerequisites. 2) Edit ntop's Makefile.MingW and change the following root-values: "PCAP_ROOT" to the base directory of WinPCAP. "GDCHART_ROOT" to the base directory of GD-chart. "GD_ROOT" to the base directory of GD library. "PNG_ROOT" to the base directory of libpng. "ZLIB_ROOT" to the base directory of Zlib. "GDBM_ROOT" to the base directory of GNU database manager. "OPENSSL_ROOT" to the base directory of OpenSSL. 3) Build the make dependencies by > make -f Makefile.MingW depend 4) Build ntop itself > make -f Makefile.MingW If after some time you see "Welcome to ntop", it has succeeded and you're ready to use it. Otherwise review the Makefile.MingW and look for missing packages. Installing Ntop --------------- The Makefile.MingW uses static libraries for all packages except OpenSSL. This increases it's size, but makes maintenance and installation easier. In fact, there should be no need to install ntop; simply run it from the base directory. Only make sure the needed OpenSSL DLLs are somewhere in your PATH or in ntop's directory itself. --- Gisle Vanem May 2004 ntop-5.0.1+dfsg1/docs/1STRUN.txt0000644000000000000000000000451107545101120014654 0ustar rootrootRunning ntop for the first time =============================== The 1st time ntop is run, ntop will prompt the user for the admin password and create a new password database file. The most efficient way to do this is to manually run ntop with a limited command line, let it create the file and then shutdown. After the 1st run, ntop will operate without this intervention, unless the password database ntop_pw.db can not be found, which is treated as a 1st time run. Remember - you must create a user for ntop to run. This userid should have only minimal privledges, but it needs to be able to read/write in the directory where the ntop databases are stored. ntop is customary, but it can be anything - it's shown as "" below. ***Win32*** Skip -u, it's not valid for Win32 anyway... The (recommended) minimal command line is: /usr/bin/ntop -P -u -A DO NOT give the -d parameter. You may need other parameters if the default values interfere with ntop's ability to run. But this execution will not be operational for long, so don't bother with a full command line. The output from ntop will look like this: [root@tigger root]# /usr/bin/ntop -P /usr/share/ntop -u ntop -A Wait please: ntop is coming up... DD/MMM/YYYY HH:MM:SS Initializing IP services... SSL is present but https is disabled: use -W for enabling it DD/MMM/YYYY HH:MM:SS Initializing GDBM... DD/MMM/YYYY HH:MM:SS Initializing network devices... DD/MMM/YYYY HH:MM:SS ntop v.2.0.99 ntop-02-04-12.tgz MT (SSL) [i686-pc-linux-gnu] (04/12/02 10:02:15 AM build) DD/MMM/YYYY HH:MM:SS Listening on [eth0] DD/MMM/YYYY HH:MM:SS Copyright 1998-2002 by Luca Deri DD/MMM/YYYY HH:MM:SS Get the freshest ntop from http://www.ntop.org/ DD/MMM/YYYY HH:MM:SS Initializing... ... DD/MMM/YYYY HH:MM:SS Welcome to sFlow: listening on UDP port 6343... Please enter the password for the admin user: *****enter the admin password ("admin" is NOT a good idea) and press enter! Please enter the password again: *****enter the admin password again and press enter! *****ntop will store the password and stop. You should now be able to run ntop as usual. ------------------------------------------------------ Burton M. Strauss III Sep 2002 (Revised to reflect the -A parameter) (Revised w/ the Win32 skip -u note) ntop-5.0.1+dfsg1/docs/FILES0000644000000000000000000000046507512451567013731 0ustar rootrootdocs docs/RMON docs/database docs/RMON/README.RMON docs/database/README docs/database/README.mySQL docs/README docs/README.SSL docs/README.Suse docs/TODO docs/INSTALL docs/1STRUN.txt docs/BUG_REPORT docs/FAQ docs/HACKING docs/KNOWN_BUGS docs/BUILD-NTOP.txt docs/BUILD-MinGW.txt docs/RedHat-rpmbuild-HOWTO.txt ntop-5.0.1+dfsg1/docs/ntop-autotools.vsd0000755000000000000000000025576307615520121016674 0ustar rootrootÐÏࡱá>þÿ ~þÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿ©  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}þÿÿÿþÿÿÿ¨Root EntryÿÿÿÿÿÿÿÿÀF@éJàÆÂ@VisioDocumentÿÿÿÿÿÿÿÿ=÷SummaryInformation(ÿÿÿÿüMDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ€Visio (TM) Drawing =÷„R„ šÞõ_ídêñéòÿÿÿƒÿöòÿóûðøñ‰€êñ€ €ÿÀÀÀæææÿÍÍͳ³³ïššš!€fÿffMMM333ÿÿÿÒTq0ÜÿáúTëðßT ëðd Arial)õ-3Timÿes New R¯oman)-þ3RWingdªqs)#-ëðe÷": Black5Tëð?èóÐ?òÿÚêñ èóY@-1ÿÿÿÒJéÜÿëðJ /T éòÿ àû÷hëðTëŒèóJ¿bþOòSSëð0{®ÿGáz„?@æõCPjVÉ]„uVbUU––– €ÒO —O–S»?æõ Ò„T¡666ú úÿ€N—•—Põ—»—– –U – – – –U––––¥–vŽPa«þC G#G#òG#G ‚&ýÿHv#‚O`—$$ý!ý£.ÿ„ ¤ìÿ 4‡Äÿ†Š…!}“7fiú>pßü'0Uî"Å?Ž’¤–„‹!èóðÄîí&þ”7gjP>¤åöi6;03|2ó¿0s6&¨0B¨£!|4?¡„6 2Ö7ÀT}•G2œk=¹€-Ì ˆG2¬ ÒT ÿ0 ßü9Ô6L^puŽeB 2”EšGi?À¿O€?¯?Z´‡uXÁ FÅ&ÀM0Ô P7PÁOk?}?T‚*Ãö3G  -O?N9:^OpOP‚O”O¦M"YPJÿ0"*E|NI¸Ã_Õ_2Çq‹`¬?Šoœf.œfëB¶j…¶j¶gjüXý!nÅ „‡#f¦Ò%!,Û/í/eF3# H0“T:g¤_¶YõhG×ZÍé+G†Ç$4ïÉRŽDÈqÿ0Ë"]@ B n`U @ ñpõpùpUýpƒ€ €U#@€€õðU€!€%€)€U‡`íð5€@U =€!A€"E€#U$Ç %Q€&Sp'Y€U(]€)s *e€+i€U,m€-q€.u€/%pU0}€1€2…€3Œ0U4€5‘€6•€7ËpU8€9¡€:¥€;©€U<­€=±€>µ€?¹€ÿ@QARBSCWÙp_aEy#Pz‹PƒH Yk}¡~Ò ÂyJB 🠟&Ÿ¢}H1ÖVgŸyŸ‹ŸŸ¡~PÕµX› ߟñŸ¯¯¡~0` ÕV W¯i¯{¯¯(¡~fÕV ϯᯠ󯿡~ÐpÕV €G¿Y¿k¿}¿¡~î€Õ‚V ¿¿Ñ¿ã¿õ¿¡~Ó VÀ9ÏKÏ]ÏoÏ £|Ó VбÏÃÏ(ÕÏçÏ£|Ó V€Ð )ß;ßMß_ߣ|Ó VøÐ¡ß³ßÅß×ߣ|Π Õ Vï)ï;ïMï(¡~ÞÕVï¡ï ³ïÅï¡~6ÀÕ V€ÿÿ+ÿ=ÿ¡~V Õ Vÿ‘ÿ£ÿµÿ¡~F° Õ V÷ÿ -(¡~¾°µw Vo “¥¡~ŽàµwV€çù ¡~ðµwVFas…—£|~ð µwV×éû /(¡~öðµwVO/a/ s/…/¡~nµwV€Ç/Ù/ë/ý/¡~æµw"V??Q?µZ`÷gmlü‚3 %0Oè´ƒNkòoÞAFü6&U Tóð·?É?Û?í?@ÿ?ëo#I©E7OIBOOðaOsO…O—O¸…ëQ¸ž°O*BAUÏOIB çOùO __/_EJ_,NE @K!_‘_£_€µ_Ç_©Eá^eÂKk"o)o;oMo_oAUá_[_n#¯oÁoÓoåo÷oE!,NÍk$GY€k}©E©ÃOÍ~%ßñ'AUA#Í~&w‰›­¿E!Ú,NRk'Ÿ!Ÿ3ŸEŸWŸ©Eqž…5’o g(§Ÿ¹ŸËŸÝŸïŸAUqŸ땞)?¯Q¯c¯u¯‡¯O{Ÿ5O§d*ׯé¯ûªÐ± ¿¿0· ¯bQ ¤O¿¡f\óð+o¿Kÿ®°‡¿´p¡¿³¿-¿ù£ßµ¥ï¹©üMÀü‹dóð,JÀs²y¿+Èÿ®àv°{<ò•RÀ=P2ÇqЬ?ß"Öy4JQÁ‡¡hiw°±<'ÌK'Õ¼3б¡gÖè„1€2Õ ”Õp1Sj#Á°P-Æ?žßv.Å03ÂÒó¿0¹ÖªêË Ò•ÒGóð-ÏÉÏû¯EÏWÏiÏ{À†d›Âê»k.óßïï)ï€;ïMï“à~Ä£Ânï g/·ÏïÛÏíÏÿÏß#ß5ßGßYÜr†òÁoÖÔõ€ß€’ԜМßÀßÒßäÛ0#ÿ5ÿGÿYÿkÿ†ÿÿ¡ÿ³ÿYÜUÅoÑ}5sÒþµàøÿ.@æÙ1_qƒ•§Â ËÝïYܬãÐoÖL%€ìÿ:U^p‚ìÓ2›­¿Ñãþ//+/ÕoÖˆ5d/v/ ‘/š/¬/¾/ìÓ3×/é/@û/ ??:?vN†dUA`9jm1¹?¶OÝ?ï:ûåÞáèÕi•Ôt?fÚxÖ1J4O%O7OIO[OvOO‘O£O¾OÇOÙO€ëOýOÃÿÕ÷äöAZ5O_a_s_…_—_²_»_Í_g?_#_5_¯?ú_oo÷?Í&6‹oo¯oÁoÓoîo÷o Mo_oqoc ~‡™«Í&7ÇÙëý*C?U?W¦bßtßV‘ª?¬ñŸÐâäÛ8ŸŸ'Ÿ9ŸKŸfŸ3E“Ÿ¥Ÿ?z‡ÃRÜŸ ÷Ÿ¯¯$¯Î%9?¯Q¯c¯u¯‡¯¢¯«¯½¯ß_2¿;¿M¿'o9o߯ñ¯¿EV:{¿¿Ÿ¿±¿Ã¿Þ¿oŸŸÏ¯yÌx˜Å¿)Ï2ÏDÏb¿X;·ÏÉÏÛÏíÏÿÏßç¿ù¿GßYßk߀}ßߪ߳ßÅß×ßÍ&<óßïï)ï;ïVï_ïqï ÏæïïïÿSÏeÏ“ï¥ï·ïEV=/ÿAÿSÿeÿwÿP’ÿ#ß5߃ê,)0˜3 ÅÉÇä#ÏïÞÿçÿùÿÿ B>k}¡³Î×éƒï- \%ÍH%@Äï>ƒ/btM?—©»Íßú//'/- ˜5Í„5h/z/¿?ž/T°/¶}@Ó ×"Ý&eŒû&??ý >4œ=5oOœO2¿gG*N”J”J”G\7E„g64e³Ÿ¡Î)KPAO!O3JX+KDY0ø:Û0Oè´ NkÒ @6W ApV þ…¹öLÃó0¸?µ_8Ü?î? JB_)_3OEOWOrO{OOŸO±O ÃO]}ÂìO›Ud¬ÇCoo'j¼ñ6>eZUZSTep_‚_”Qno€oØ’o¤o¶eL˜U¡¬ÓOåOëo ZDÓ ×"Ñjü%P4Dgè^ujS¼ñ¹ðJEY'j˜5oGoYo Ÿ‚µqºÌÞ6‘Í bZ9Œ' ZFG½kŠ”I_[_iÈ%dû2MX?š ™F¡¹?D¯V¦P4g”ÕT÷x„w°G«ÿCpCÃÕçù‰௠ò¦(–9“ ¹ º@ ·dŸvŸˆŸšŸ[H‡¯å/'jœEW—ýHëð1ÿwinspoûolìðP LasÿerJet 4Lÿ/4ML PosÿtScriptÿFILE:BÿABC_9900ÜõÿFÿÿÖÅ ëðïðüóÜÿ÷hëðTµèçôAèó@* Àm?<¿Ièóð?NÇöñfx®êñ)þ‘Ò• <žEþ¿bÈ»bÏbÏ —b žNžöí’ß©e‹GéòƒN oùðxçôýÿýððŒDŠý’` FlowßchartÏ`®ÖbÿÏÕ+bÏ~ÕÔj ~¨puáéò óðÓéòÿÿˆÿÏ‚øŽwwÿx‹ˆ‡øøw÷Œ(ŠÿÁð/ASe(Чˆ€n’ ‘ŒÏwø ¸ˆøÿøýYëðIndicaÿtes a prÿocess orÿ documenÿt. Subseÿlect maiÿn body tÿo add te÷xt,chanûge!x's s?tyle.ÿGÿÿÖU ëð ëðÿþò)ÜÿïhëðTW8èóAçô@* «ð?*èDàDØû?QãøU)þos <ú|EþFí÷ñk"²±ª³þó«SÉÙØØ¢§±³·*·ÉÏÛàãéøñÏu`öñRþN3u9o`¿þbbâi iáú€ûL@|ýÿýÿþô™~p`Flÿowchart.ÿhlp!#519ï5þA~`9Cÿopyrightÿ © 1997 ÿVisio Coÿrporatioÿn. All þÑs reserïved.{ýÿ ùð®0{lgeW bciyÿ¤ñ§âÿ£n„W}›e²È:Hp#ƒ¹ } ámpïTÝþÉêëðëðK*kLpMè¶kª!ñuëðf%•ýÿüÿô#l Œ`Coßstþ4È,Eÿnter theû cí assoÿciated w÷ithý is p?rocess e¿bþš`¿ $###,50.¥0 ¶pª!ZÉ-üºÚ)ç!Dué«þ(È ø'dn4 {of3step#8)¶èª!mJ?ülýç! Resou]r0þBÈ:ø'Ïnumbû 0peïopleüqui­r0to0mû0t½e3task pDè°çô*)âDN7H "2Iþ*È?þ”¼«æ 7i³þ è« ŒrÖøñÀþ•@™AÀúd/$bþÝXaþÍ0`ÿ Move Liëne{ª§qè)KUj3‚Aà:æ `A†B.OØ?€å!‚F]D:(C0Y=_OYUè1P_UpQ_™ž»Pj»Pu6»PÒnY âÎ*}.0` ÿ%PropertõiÚ18È0Set>ý#ustom1ÿTþ3e selec¾1shape#3•`bii Ab¯ €‚’©‡mbãøà¿èóØ?ôôþØ¿6Ðiÿ6à¿p Ó:/mØ?8?ûôkÀ4 øûôø¿ÿHÿÿÖ"ëðïðþñ)ºëð@áúh¾TèóAæèóà?,*ð?AJŸôIŸôá4ú3Q ÿt`b§þùðu -]þqtw|Ï——ÿ€A@þ ûOu`ˆ´¸ÿ u`ôœqbþ)œóø øàûö´¹ýÿ» ùð`0 §ÿü„䛾ûð l¹U§(%ùða+þW[[5 DÚœÚÞ´œ>v{Œ>¾Þ@{5âˆ+ ùð[rÀþD H!»À ‹à[ ´ú[ ˆ[ \Š‹‰ûð©q Üùë_êñ óðQþïòÿýÿÿƒ);M_>m ‡ÿ‚”þšŠÿ÷„wý—±…ÿ„ï ™„·„ÿŸƒÿðÈÍßñÈ»‹É™=ˆÿÿHÿÿÖ"ëðïðþñ)ºëð@áúh¾TPèóAÖèóà?,è4ð?/AØ‚-HÈ43úHQ 8t`pëðÿ ÀuL`uÿ`€.@ }@utL`†ÿ @€A@þtw?bþùð­• -¨u²oÝíÙÞó†À §u`²©bþ_b")y )Ýþ Ýßýÿ ùð`ý0;§0„÷›ûð==lÞU(%]ùðaþ‹,* ™)â ¼NMNÒ>ª³À>ò /¼4+Ú ùðrMÀþÚx |!À<‹Õà ´ ˆ \_ЉûðÝ© Üù}Èëð'éòÿ¨p= ÿÿêâùõðÜÿ ÿFÆl͛߄èëð#ÿB4Ù›l×^ëð ;äÕ×›ÊCdG@¿Ì›.ûG+Ø›/¾cÑ+;dÿÞ›5úëðH+$è›5òƒl:t3¥ß¡p‡tï›Ý6ëð JëðTÿUVÿXYÿZ[ÿb cÿ d {?„ÿFÿÿÖÅ ëðïðüóÜÿ÷hëðTµèçôAèó@* Àm?<¿Ièóð?NÇöñfx®êñ)þ‘Ò• <žEþ¿bÈ»bÏbÏ —b žNžöí’ß©e‹GéòƒN oùðxçôýÿýððŒDŠý’` FlowßchartÏ`®ÖbÿÏÕ+bÏ~ÕÔj ~¨puøéò óðêéòÿÿˆÿÏ‚øŽw‚wÿx‰ˆ‡wø¿øwwŠ-ð‡ÿ ð6HZÐl~¢¡Šù‚Ñ ˆøÿøýWëðThis sÿymbol reÿpresentsÿ a linedÿ processÿ or docuým. Righÿt-click ÿto changÿe shading.AÿGÿÿÖU ëð ëðÿþòAÜÿïhëðTWLèó@çô@*Vð?èDàD÷Ø?Qãø«)þos ô<|EþRÛk«l¬·¬ëð™ýôÉÃÙâØØøñÉL«««·*·ÃÉÛ,àã,é,øðŸu`öñRþEuKo~`þbte{ {ßüwï€L@ŽýÿýÓÿþ­’p`ÿFlowcharÿt.hlp!#5¿267þA~`ÿ9Copyrigÿht © 199ÿ7 Visio ÿCorporatÿion. Alûl ås res¿erved.ý3ÿùðÂ0l\gw bu{ý‹¤§ÿö£‚„÷i›Ú1!e¬L°H„#çƒ ‘ áp$p¸çôÀD¬/R"Ÿ{C!­jaVIÀâT ~[{þPèíÂõ ŒrøñŸÀþ >1Þ$1Àþ€`ÿMove Linÿe/ShadinugªÚ¯dè̹/°$LC‚6x'DC!¨Ë2ðÈå¿2¿0+5#ÌpLÐ?[Iw @$0Àë1Ì|À&þšIbã$3ë1{ Ñ@*1#žÚ qÚàk;Ujò!°LI;HOè?\Ov1{Gp6Ø@0õ! 2EbGm@p6Cà¾Awõ!ÍOŽ™šªPfP6PÚÊ“nm #ªü©ÿŸ8jÁ K1 Onlyþšï` Scých.÷A1C €~@þõ"ÜK1d prÿocess orÿ documenet Fð1ÀC Ó þ5]hÁ GOray P6\_oRå4Ü,z_ŒT wi/th gÂQsQ3“[Ñ¢P¦_kÁ BOlackÅ_dWoR%5Ü-í_ÿZbFbo’žP¢Q©ý±kþÁ %Propeÿrtiesþ8þÜ0Set thÿe customÜwaÑd ofãbseÏlectu`—`peä  `t51b û€‚¦©~©Ëø%ps%p Qó½m°TÝþ«Éëðëð«KkLpMè¶dkZquœ9²cüÿ#ül0`CosûtæTEnterüãcp assocóiaqbthisÔwes@þÇ``¿ $###,åp.¥0( ¶pZqZy}üºŠyqDuý+þ(Ü ¨wd„ùc^ÉpstepÓx¶èŠZqmúü±lKPÿ` Resour®ƒPþBÜ:¨wnçumb«pú`peo÷ple quirÖu`to±pm«€teÆstask mbãøà¿èóØ?ôôþØ¿6Ðiÿ6à¿p Ó:omØ?8?lÖûôÀ4 øûôø¿ÿHÿÿÖ"ëðïðþñAêûðBáúùðh¾T0èóA¬æõ,Ø?,À=èô=3Q ÿu`bÿþt`ûþßtƒbàz…”yõ‘ èóà?þß ú½Á§u`²bþOxðõÑ õ #œrÿÀb ߢ  £ÿ“bþßýÿ œ`ý0§†÷á›ûð=lÂU%…œaP qÄuqÕx½o §¤> „—”>Ƙ@—P ð/ ­§ÀþL P!]À‹Ôc ¨c ý|c PŠ•‰ûðdœ \bçô@æõ&²ð?²Ü &²( ~p°ëð¼žûðSÿHÿÿÖ"ëðïðþñCùâùûhTDZèóAèóð?,Ø4uì4è=Ø?Pä÷ÿßt`upþëðÀ ÿ@þtwbŒy–él‘ èóà?¿þ: ÇÀ‚ôýôÞ ïu`–.ÁÇÇÕþþñu`þ²bêBGG b þ+Ü4FkbŠ1û²1T51­ð¸5ÒÛ ¾É1u¡7ñÉ1 Ô7bþ ßýÿ œ`ý05"§„œ;›ûðŸ-dÂ!lçô,À?@æõ²Œ/Ξ(&œ²Ð?È5ûˆ|&ˆÝžûðbs _Uüœ1a5!…&…&Cá âIGñùð +0*0v <û6vJ;5þ…&e<5´|: 8 œr+0Àµþ¸0¼1À6 ‹«´Ï0Ï0lÏ0H¿Š‰ûð£Þá0Þ ! âùj4)0 åö}¸ëðZ'éòÿÙ“C ÿÿêâùõðÜÿÿFÆŒœß„èëð#ÿBü>œl×[ëð ;ÄלÇCbG@¿œ)ûG+D)œ*¾cú+;tÿHœ$6zëðHk4œZƒù¦ŠÜLœ!öðÿFÿÿÖ… ëðïðüóÜÿøñh¾ëðTèçôA¶èó@* À?<¿íIèóð?NØöñfxêñU)þ‘• <úžEþwbÈbÏ÷bÏ b ÒžNží’;‹ße‹]çôGéòƒ§ o’xçôý‹ÿýððŒDŠþ’` FlowcohartÏ`Ö×bÿÏÕbÏ~ÕÔ5 ~¨puñéò óðãéòÿÿˆÿÏ‚øŽw‚wÿx‰ˆ‡wø¿øwwŠ-¿†ÿ ÷wp6‡ëÿ A ÷BˆÿBZðfxŠœœ犂Ê ˆøÿøýWëðThis sÿymbol reÿpresentsÿ a taggeÿd procesÿs or docûum. Rigÿht-clickÿ to showÞhide .ÿHÿÿÖ"ëðïðþñCùâùûhT8ZèóAèóà?,Ø4¥ð4è43Pä÷þ%t`· -þq{tw u—b—‰¢?u`zµ÷u» WbØÝÝÿ bþ(›þóZëðõðý ~ýÿ rß`0þëð§÷›ùð)}lUP%*raO@æõ|VÝÝ Zúñ §¤G ""r¹¢pAûðýÀÓÀ€@äþ lËÝÖPAüþòï4Ð?3êËþ lÓ@P>޹—Ëþ|Ð1,”H*… rrV§Àþ„ ˆ!#!‹‹à› Õ¹› Š› H© ý‰ùð.d5lN+À?p&zœÜ/î(&rzÐù?˹ @¨Ì&1Pžùð“iTûð åö±  Üùmbãøà¿èóØ?ôôþØ¿6Ðiÿ6à¿p Ó:omØ?8?lÖûôÀ4 øûôø¿ÿGÿÿÖÕ ëðëðÿþòCÜàûhëðT¯,èóAçô@V* ð?*èDàD÷Ø?Qãø«)þos ô<|Eþ@»k¬T±ùòýô¸ÉpÓÒŸu`öñRª¦«±±½Ñ×Ý;çuí oý`þbÊV] ]áúÞY€L@pýÿ§ýÿþrp`ÿFlowchaÿrt.hlp!#5193þA~ÿ`9Copyriÿght © 19ÿ97 Visioÿ Corporaÿtion. A÷ll Ås reserved.oßýÿ ¡0polgY bWõ]m¤åÿ§Ö£bÿ„K›e¬îêHéòc$ƒ :q pdpiÄçô*ÐDÐ?Z%ˆY&¨/k#pë=÷ @îÐ?rþøðÀ @þáÐ³É åx! n€Ð?þW "¨÷ñˆ¶1úñðüA,3½ŒaþžK O¼qÐè‡+>(Ø? Ç#] þç=(UjçÉ!îr01y2(Cn9{??I¤?¶7â1_™ž-@j-@u6-@K ÒnG12@$!üÿ²&hÙ.pÞ!À] ¢ÿ `Uÿntagged£“`T€C÷þ2š` Sc~Ých.A1]ç€~@™JkC€@Ω@þG~kH8ÿ `Remïove @ frÿom shapeï.£ˆ@AdmdãBtoìEþŠõýWM¡ %Prÿoperties÷þ8¼0Setÿ the cusutê@p+V of?Rÿselected¬ìEX`V šbï €‚†©ÀÜPx!3,M T9q0âù-¡Q‘ëðÝOïB-kªQ ôëð}FmÚT®ÝþɧTëð«KkLpMж2ÊTu¯)Süÿ#lþr0`Cost÷þ4¼,Entóer?SA` assïociabQwitíh?PisJQces}skSbþ#Pÿ` $###,–‰`.0 ¶pªQZêmü.ioQDu®Ýþ(¼ LgdxÂdUSm`stepwh)¶ÐªQmžoü‘lýoQ Resou]rs`þB¼:LgÏnumbO`VPpeïopleðqui¹rcPPcomOpt<·PlataskùÿHÿÿÖ"ëðïðþñCéâùùðhªTëðèóAèóðÉ?,*Ð4EýQ pýëðÀ€A@õþqu öbþ $t`Ýt¥bÿþþ üºÃu›`€ÁØ*‘5þͲòu÷ ÷AàþòUÅ4À4ÄF´¥Pc rÑ èóäw?þQuW¥ð`U å`Jgà` ¸ÃQ§uØQ#u ‘Bþ øòͱþýÿÝ $`0ݧÿ؆Ƅ·œã›ùðßål¼Uëø$aþ5 rrxÀÞ5  v²d в™n:  ƒ €" Pb'm,G¢/t!ì¬!P/B rªƒ ÀA!1K!‹ë´0ˆ0\Šï‰!"Þd$ \çô@æõ<6XL?^8 rJ ™¿ žSÓj} åö}¸ëð–'éò·fk=ëðÿÿâùúõðÜÿFÿƜݤ®#÷èëð#Bÿô@¥–$õgëð ;„ߤõýC`G@4Àï¤]%H¾+Ôí¤^cÓú+;ÿ¤1¯'6ëðG+ôo ¥gƒrhÿäI¥Ù+æÿFÿÿÖ… ëðïðüóÜÿøñh¾ëðTèçôA¶èó@* À?<¿íIèóð?NØöñfxêñU)þ‘• <úžEþwbÈbÏ÷bÏ b ÒžNží’;‹ße‹]çôHéòƒ§ o’xçôý‹ÿýððŒDŠþ’` FlowcohartÏ`Ö×bÿÏÕbÏ~ÕÔ5 ~¨pu½éò óð¯éòÿÿˆÿÏ‚øŽw wûˆ,pŒÿøøp„ÿˆ +<N`19ü“ˆøÿøý(ëðThis sÿymbol reÿpresentsÿ a storeÿ of data.mbãøà¿èóÀ?ôôÞÀ¿ÞÝä¿ÿà@§ tÚÀ?ÿ8Ði6à?ÝØ¿¼»5›½ÀèóÀxwE7 ùûôø¿ÿHÿÿÖÕ"ëðëðÿþòC\âùhßT¼èó@¼½».›@@çô@­Aèóð?>ÐFàîFÀ?Q •+þq5~ô>~Gþ_u` Q¨§u¯ qbþ_bØß} ߟ ÷Zùòõð÷ý ý n þÛ€L@þëA"MÆXAÍÌR`äF_ÔXPc©^¨¿ð¸H­M¹¿ ©¯™ Á ‚þ ôÿø ÿýÿýÓÿþ r`ÿShape.Hlÿp!#18255÷þA€`9Coÿpyright ÿ© 1997 Vÿisio Corÿporation. All T"ÿs reservßed.þ  3!0‰ fiÛW bÙßßþëð¤q§cÿ£óœ"ÿ„ ›îløUuÄ¢'raþ÷ …û#û >J Œ²ßþ 0Æ'2»ùð ùðŽ?0>0‚O2O06E9þ- €rO0À!ùð)?01f™2Öh9qä˜6?’1˜=Ð?m€0rZ0À+6@|180‘0D0_>à6T0ì0€2Ë0ˆ08Ù=à…0(O?LM…3‹®O@‹F“@“@ßú@¥@nŠû‰Ý žq´r |fENUÆAÅK?A0Àá0±ÍÆDÞÁþAýB±¼øÍH 9êO™<ª/Prnp ’âùnÝ €çô!ýô#*3! %Prÿoperties÷þ8K!0Setÿ the cusßtom p~V oýf’RselectÏed s9"Ù`üØ€0b €‚zH©RQwmïTÝþÉêëð!ëðK*LrM90¶ýQ1uëð°_Uüÿ%nþ 0`Cost÷þ4K!,Entóer’S@` assïociaµQwitíh’PisQces}s¾SbþvPÿ` $###,–ˆ`.0– ¶rýQZêmü-iÂQDu®l#þ(K! KgdxÁd¨Sl`stepvh)¶90ýQmoü#$nýÂQ Resou]rr`þBK!:KgÏnumbN`©Ppeïople qui­r¶PtoT`mNpt=eictaskˆ }˜ëðvéòÿÞT@ÿÿêâùõðÜÿÿFÆ,kœßU.èëð#ÿB´N¥=/WPëð ;„/õC1G@´a§œ¾C+;T¯ˆœ¿CEëðHþ+lœ05ÿFÿÿÖ… ëðïðüóÜÿøñh¾ëðTèçôA¶èó@* À?<¿íIèóð?NØöñfxêñU)þ‘• <úžEþwbÈbÏ÷bÏ b ÒžNží’;‹ße‹]çôGéòƒ§ o’xçôý‹ÿýððŒDŠþ’` FlowcohartÏ`Ö×bÿÏÕbÏ~ÕÔ5 ~¨puáéò óðÓéòÿÿˆÿÏ‚øŽw‚wÿx‰ˆ‡wøßøwwŠ,ÿ>-ˆÿð6HZl~ ,‚º ˆ?øÿøý0ëðOpen eÿnded recÿtangle. ÿUse as dÿesired.ÿ symbol.ÿHÿÿÖ$ëðïðþñA¯@áúûðïhëðT·àèóAûþòß·?Aèþò×?.ï’6ç?5P '~t` èóïà?þstÞy wb噋¤Ïu`|·uý½ bÕÚßß bÿþ> UûÿA+=Oa ÛI»ÚͶ»)Í ·½ ½ ›Mdþ üÕüýÿ} `0þëðÿ§¿œý}›ùðÍl¯U|eûð—aöAæõE€ßÙ”Ô “ '<n‚þí nrU Àþÿ‹BЉ"kl  -l#ßßZ&¸·,sÍ"‹4…(X¯i!åömbãøà¿èóØ?ôôþØ¿6Ðiÿ6à¿` Ó:omØ?8?lÖûôÀ4 øûôø¿ÿHÿÿÖ"ëðïðþñëDßüùðh¾T<èóAÝéòà?AèóØ?{Aûþòï?Aôþòuç=ßF×?Q ûùðt`½ èóà?þq{tw u—b—‰¢ ï?u`zµu¹¿uÅ ú™bþÕbøÿ ÿ2ÿNè´Nk?—@æõûçb˜þýÿw ùð`0ÿ§…ÿë›7)lºUUÅùðaO5~± ùðÃÿþ”øß›µ- ³°>Š£ >Ò¤£€öhœ+ ùðr³kÀþX \!ÀPW‹Ôo ¨o |o PЉ]OÿGÿÿÖ ëðëðÿþòÜÿøñýhëðT,jèóAçô@* ð?*uèDàDØ?Qãø¿)þJos <|E¿þ@kk¬±²–½ëðÈÇäpÍÈþóOu`öñR¦U«±±½½ÉÇ×tÝáuí úo`þÕbV] ]ýÏÿýÿþuâùýp`Flowÿchart.hlÿp!#5235ûþA~`9Copÿyright ©ÿ 1997 Viÿsio Corpÿoration.¿ All ­sÿ reserve³d.oáúY÷€L@ãýÿ ‰0âlgYW bW]mÿ¤å§ÿÖ„¾£÷K›¼ñe¬îHºéòc$ƒ q Npqpàçô°N jçY%à?ë#þ ~=]ãN è? /X·!¿'(‰ØÓ ´ ë»"ç¦'± (C1Y 1\?㙚U0fU0u6U0¼ÊmÜßTÝþÕÉëðëðUKkLpMܶkâŠ1uëðZ%qýÿüñÿ#l´ `C¿ostþ4¤,ÿEnter th÷e cÍ0 assÿociated ïwithÝ0is processá~Ybþš` $###,@K.0 ¶pŠ1Z©=uüº9Ç1DuÅWþ(¤ Ø7dND÷ ofö3stepRH¶ÜŠ1m*OüúlÇ1 Reso»urÿ0þB¤:žØ7numbÛ0p@pßeopleØqu[irï0toá0mÛ@{teö3taská n¼®:¬6h@ÿ` %Prop¯ertiºA8¤0÷SetÝ3ustoñmû1/ToCe se÷lecî1shap­eC`V]ú] šb €‚ú©¼‡}¸ëðZvéòÿ,¢> ÿÿêâùõðÜÿÿFÆLU¥ß³4èëð#ÿB,W¥›5×Uëð ;X×¥ðC:G@íLO*6Hª+TO+cž+þ;Ô[¥É7ùci<\¥ÿêƒrG+ä^¥ÿq9uÿFÿÿÖ… ëðïðüóÜÿøñh¾ëðTèçôA¶èó@* À?<¿íIèóð?NØöñfxêñU)þ‘• <úžEþwbÈbÏ÷bÏ b ÒžNží’;‹ße‹]çôGéòƒ§ o’xçôý‹ÿýððŒDŠþ’` FlowcohartÏ`Ö×bÿÏÕbÏ~ÕÔ5 ~¨puóéò óðåéòÿÿˆÿÏ‚øŽwƒwÿŠˆwøøwwßp‰' €‰Û0pŠB‰ÿƒM_qƒ•vžwž»üˈøÿøý0ëðRepresÿents an ÿexternalý øðity.sÿymbol. ÿHÿÿÖ"ëðïðþñAïD@áúúhTZèóAèóà?,Ø4¥ð4è43Q ýùðt` v-þqtw ïubò—‰¢ ý§u`zµ¹N¿uÅ ™b¿þbøúÿ ÿýÿÝ ùð`0§ë›ùð÷ùlºU%ùðaPJÇ ùðÃÿþÂ`ßgµ)- |> \£l>žp£LÈhhà ùðrkÀþ$ (!À W‹Ô; ¨; |; PЉ)™ Üùmbãøà¿èóØ?ôôþØ¿6Ðiÿ6à¿p Ó:omØ?8ä?ÖèóÀ4 øûôø¿ÿHÿÿÖ"ëðïðþñA¯áúûhTZèóAèóä?,Ð4Õð4è4à4Ø?­Q  Qtÿ`är¿Àþqúu€þ½~b¨üš²u9`uÃuË ©ýbþbêôû û [ýÿ ß`0þëð§wû› lOU\%qa/,Z ,ÉûþpÛw‡ )El€³|>¦€³,ìDÈãq¡ˆ®+ì?@èóÀÑ ¶rÀþ< ”…Œ\1-ìB'! À0‹¯‹Ù‡  ‡ tþ‡ FЉ>:dù𠉌^-1$tÈ/Ú(Ã*~šuÐ?ß @uÀ?1ŒŠA!"U )3ëðž‚ÿGÿÿÖU ëðëðÿþòAÜÿúùðhëðT8ièó@* ð?uèDàDØ?Qãø¿)þJos <|E¿þFkk¬±²T½¼¼ëðΕÒÒÎþó?u`öñRU¦«±±E½½ËÕÐ,Ý,ãçuéó o`þWbbi i?ýÿýÿþâù÷p`Flÿowchart.ÿhlp!#523ï5þA~`9Cÿopyrightÿ © 1997 ÿVisio Coÿrporatioÿn. All þ¹s reserÏved.{áúÞe€L@ïýÿ7 •0îl\ge bciýy¤ñÿ§â„Ê£W›ùð‡e¬ô¼Hºéòo$ƒ } Npqpàçô(N jíñ ~I²iïN è?¬/dÃ!Ë'(Øß À ±!Ç"íÃ!ô(C1e¸±!?a0fêa06a0W Êm¾âTÝþ«Éëðëð«KkLpMâ¶Äk–1uëðf%}ýÿãüÿ#lÀ `Costþ4°ÿ,Enter tïhe cÙ0 asÿsociatedß withé0isÿ processüíebþþš` $###,–!@.0 ¶p–1Zêµ=üÆ9Ó1Du®Ñþ(° ä7dîZD ofCste¥pH¶â–1m6Oüô…lÓ1 Reswour @þB°=:ä7numbç0|@¿peopleäq·uirû0toí0möç@teCtaskínW º:¸6hþ@` %Pro_pertiÆA8°ï0Seté3ustãomA;T{Ce sïelecú1sha[peC`biõi šb €u‚ © Q‡}¸ëð–véòÿ¡ž>ÿÿêâùõðÜÿÿFÆÌe¥ß|=èëð#ÿB¬g¥d>×eëð ;¤h×¥ÉC2G@¥ÜOûCH+äªOüCI+;|ÿk¥E@6Tg{ƒ¶G+ÿ\o¥1BoÿFÿÿÖ… ëðïðüóÜÿøñh¾ëðTèçôA¶èó@* À?<¿íIèóð?NØöñfxêñU)þ‘• <úžEþwbÈbÏ÷bÏ b ÒžNží’;‹ße‹]çôHéòƒ§ o’xçôý‹ÿýððŒDŠþ’` FlowcohartÏ`Ö×bÿÏÕbÏ~ÕÔ5 ~¨puøéò óðêéòÿÿˆÿÏ‚øŽw‚wÿx‰ˆ‡wø¿øwwŠ-ð‡ÿ ð6HZÐl~¢¡Šù‚Ñ ˆøÿøý0ëðRepresÿents a fÿile or dÿata storÿage.ol.? symbÿHÿÿÖ Õ$ëðëðÿþòAwD@áú ÷hëðT«äèóAçô@. ðÕ?.èHàHØ?=Pãø.•þsw @€þIþuë` Sªuþ± bªÎÓÓ Ó:ïo£ oùòþVýôëð¿4óùû,-YI Pnby¯br%—ÀÎÁªR¯Á «± ± ’s²Ô ðûø ,ûýÿçýÿþ- âùþ`Flowcÿhart.hlpÿ!#5235þýA‚`9Copyÿright © ÿ1997 Visÿio Corpoÿration. ß All e"s ÿreserved×.þàûùðw€L@› ýÿ‡`0š(pkÏ +bÕÓÓëðÿ¤™§Šÿ„r£þßœ3›þ÷ÅmôTNÝþÉ#ëðWKoLM‰¶o.1uëð &*!ý§ÿüÿ'p `ÿCostþ4þ\!,Enter ßthe cq0 aÿssociate¿d with0iÿs proces©s™ Ϫþ£` $###,¹0K.0À ¶.1ZM=uü^9k1Du}#Wþ(\! |7dò4÷ ofš3stepR§8¶.1mÎ?ü1$úpk1 Reso»ur£0þB\!:ž|7numb0@pßeople qu[ir“0to…0m@{teš3task™ }lU|iža› .ÀH ­ÎÓ4!  *À?ÒDQî@ÝCë"‹-Šr}‰þkl¨Aüh·Bš!ýHÏÓRçCÓ@ rP„ðüI\Q¯V@€’[º­\`UÄZýO ´Ü@Ô@aÀ› ‹«´PPlPH>VÞqþ"Üî]‹ZWвÁ½GGTe˜Q`o\n¾Ò”go`j0§ð oÎC¸oßE™U–pbp2pþ'ÆdqP"Ê[ÇFãÀ? &> &#ò¹gÐla¯ @m­ÀwqþèB QÿÀ?!YžŠr‡i&"úñR"5" âùnùðà yY3 &l£` ÿ%Propertõi^A8\!0Set>3ustomŸ1„þCe selec¾’1shape§3•`ÔÓÓÔ@_b €‚² ©±tmbãøà¿èóØ?ôôþØ¿6Ðiÿ6à¿p Ó:omØ?8?lÖûôÀ4 øûôø¿}˜ëðÅéò·É>õðÿÿâùúõðÜÿFÿÆä‘›1F÷èëð#BÿŒ®›Gõ[ëð ; •›õtC7G@T’§›«CH+Tï››¬Cƒû+;L¦›/L6ÿFÿÿÖÅ ëðïðüóÜÿ÷hëðTµèçôAèó@* Àm?<¿Ièóð?NÇöñfx®êñ)þ‘Ò• <žEþ¿bÈ»bÏbÏ —b žNžöí’ß©e‹HéòƒN oùðxçôýÿýððŒDŠý’` FlowßchartÏ`®ÖbÿÏÕ+bÏ~ÕÔj ~¨puûéò óðíéòÿÿˆÿÏ‚øŽw‚wÿx‰ˆ‡wø¿øwwŠ-oˆÿð6 @?†ÿ‚ðL^Ðp‚”5?ÿÎ@Š‚Ô ˆøÿøý0ëðA framÿed rectaÿngle. Usÿe as desÿired.l. symboÿHÿÿÖÕ$ëð ëðÿþòA÷D@áúßhëðTOèó@.­Aèóð?@èHàîHØ?Pãø©.þsw ô@€Iþ@»ëðO »þójµ´ÐþÑ ßu` Sþ/.µ»Þ ½ÇÜÏÞê÷uñ Wb<AA½ A » ]aaëðR@UìHäHÜHÔcI€mëï ë/yïbr±Àæ/î]®½ëñ ]ª½+ ñ >uÿ`u`€"@÷u`R €@þýÿýÿþa îâù`Fÿlowchartÿ.hlp!#52ß66þA‚`9ÿCopyrighÿt © 1997ÿ Visio Cÿorporatiÿon. Allý ™"s reserved.þàû=€L[ ] 7 u!0Î(p\k= bCAùAëð¤Í§ÿ¾„¦£ÿ3œQ›¾´ùl¶U×<4ÏÓaÏ @°Hæ?™ùðïþÖñ«þ´ ´P“0]Þ˜0@îf9@}0Æ„5}<]´“0j¦=°o5“0Àþr0v4œ3’0¥5e6ò6 ü7Þ0À[?m7/H/@®=B‹òm@Èm@”®m@XŠr‰;2ûmTNÝþÉ#ëðWKLM ¶ªAuëðòè!^!×üÿk `Costþ4!ÿ,Enter tïhe cí@ asÿsociatedß withý@isÿ processäÍ =îù` $o###,5P.0ô ©¶ªAZÉMüÚIîçADu±#þ(ê! øGdnT of^Sstep#X¶JªAmJ_üe$pçA ResourP×þB!:øGnuómbû@Ppeop{leÄ quirPktoPmûPteS/taskÍ lF1ühU2Î!Þ"RAY•2 ›6 ¥5ð?ElïWf@†k/€ªçô¡lTe¸jEh*D ª^G iD´m@m@l:m@H}HÞq´#Üâm[NgÕò/?GGHuŒaT|nÃÒˆwcpæ@ëð”¦c¬´e™•–ûpbûp2ûp1ÆSd—0"¾k°|g8ÌF2ÌFQcëü<0ñ À ?@ä @üÀ µ”1fAÓ”1û0Þw ž´ˆp²""ȼBFR0ê!Bß!*Q&R0U0Y0sBFþX€[a_q‚r0IfƒAf=@2ȱçåœ3ç~N` AdjuP_FrameÎ!ª´¾nЉÕCÑ,çÿ` %Prop¯ertiÚQ8!0gSetýCkomQü¯”Se sele}cQshape#S+`BAA7‘_b €‚[ ©´‡mbãøà¿èóØ?ôôþØ¿6Ðiÿ6à¿p Ó:omØ?8?lÖûôÀ4 øûôø¿}˜ëðZÅéòÿ_A ÿÿêâùõðÜÿÿFÆŒ¯›ßßLèëð#ÿB¶›ÇM×iëð ;¬‡›0N8G@´r›hSúH+$x›i¾ST+;Lÿµ›½S6ÿFÿÿÖ… ëðïðüóÜÿøñh¾ëðTèçôA¶èó@* À?<¿íIèóð?NØöñfxêñU)þ‘• <úžEþwbÈbÏ÷bÏ b ÒžNží’;‹ße‹]çôHéòƒ§ o’xçôý‹ÿýððŒDŠþ’` FlowcohartÏ`Ö×bÿÏÕbÏ~ÕÔ5 ~¨pëDêñ óð6þïòÿˆßÿ‚øŽw ‡w÷ˆ† †w€÷ˆ… …w€ßðˆ„ „wÿpÿÿð‡ýƒ5„ÿð}ˆBƒwpðJ»O pÿ<ÿ_‡wwø`hªeðl<vð½ˆmwwpƒKoƒÿ m$†ltOdO ­Bð4;þ4…wpðŠ(†T ˆ?øÿøýëðIndicaÿtes a suÿmming juÿnction.­bãøØ¿ôô?üü¿ÿl Ó:mØ¿Åp?èóÀ4 øûôø¿ÿHÿÿÖÕ&ëðëðÿþòA×DEáúùðõhëðT«°èóAçô@0 èÕ?B ØSQãøS0þuy éB‚•L] °†¹»Å«ùðÒÒŽÒ °éýôu` èóÿà?þX€±¹¿ËÜ-Ï8×8Ý@8ã8ééó§uÿ ufþV·b€‡ ‡w¶ ùðÝ¢ ¤ ›¡8§8­À¿  ç Ó××káúø>·bþTB¤/f€oùýð$ùgg$ý ùQgÓìù•,ªVc ÿ vuÿ`u`€"@÷u`æ €@}þëðýÿýÿþ÷ úü`Floÿwchart.hÿlp!#5235þ!`9Copÿyright ©ÿ 1997 Viÿsio Corpÿoration.¿ All /2sÿ reserveÇd.ð!g ·€!Lï"ór· !·å‡‡ñ" ö 10d2§}ÿ¤R„:ÿ£ÅœèߠśХl²U&kÒ÷að A¼L‚ÿÌ$¼?Aq¶ÿof;|ä?Ý~!`r/ÀÝþ @uBÀ) !ùò¢80@6rAhDAxú4 LK)Dí14Cí0r_‹VŠt‰Ðžlà?ò=JOOnG1Fì@=JO„\O&G1F4P…O—@‚›B|†7«Bd10/Ø‚Å@ ~#‡/Ÿ"1R "7V =A0/.Pæõ`&‚W_h#\(„Pn!h÷R "€d`g1÷Rp_MmÜ_­·r‚QÀþ|`€aÀ ofŒQ,o>cßä‰H§hdÐ$¼rUÑÿlßÌvøÐ?AAâîdãVpügQ(-DTÿû!é?€$@%þ$p(:r&@p›€£µÆ¿Ë½<•@Þ`²qÖ$Q øø?zf „g `>OPA|bnq…dÃÜrµO {e „g Û|¾|³ývd2„WnX!'x`b“Q‹RbèÅ@x·“Qm__D}Ň¿Xt2€!çþð ™J™ª/æ+²+†+Zê+.+ùðzm¾ÜTÝþ«Éëð%K*LM¶%ùu yô!ýÿüÿüm„P`Cosïtþ4&1,Enÿter the ýc³ assocÿiated wiûthÃis prŸocessc0·ßbþ ` ß$###,û.0R¶0¶p‘Zü ™¾4``DuG3«þ(&1 ¾—d4¤ {ofÜ“stepé˜)¶p‘m¯üû$rý­‘ Resou]råþB&1:¾—ÏnumbÁV peïopleZ0qui­rÕtoÇmÁ t½eÜ“taskc0n„Ò$”švnôÿ` %Prope×rti ¡8&10SûetÓustomøá‘´U£e selûecÔ‘shapeé“`€³bì’€|`¿b €‚ï ©r‡}Èëð–ÅéòÿŸ£> ÿÿêâùõðÜÿ ÿFÆ\v¥ßpTèëð#ÿBÈ7#2*ü ŽˆøÿøýëðRepresÿents an ÿOR state møð.­bãøØ¿ôô?üü¿ÿl Ó:mØ¿Åp?èóÀ4 øûôø¿ÿHÿÿÖÕ&ëðëðÿþòA×DEáúùðõhëðT«lèóAçô@0 èÕ?B ØSQãøS0þuy éB‚•L» °¹»ÅÂ]ùðÒÒÒ °éýôÿu` .èóà?¬± ¹¿ËÕ2€Ý2ã2ééNóuÿ uf­þ·bt{ ^{ ç““káú´·bþTBÐRf€oùýð’ù[#$ý ù([ìùQ,JÕW ÿ juÿ`u`€"@uû`¢ €@þ>ëðýÿýÿþ³ ¸ý`Flowÿchart.hlp!#5235Îÿ`9Copyÿright © ÿ1997 Visÿio Corpoÿration. ß All ë"s ÿreservedã.¬!g ·€L«"¯r· Ì·r{{­" Ç!û0 2§9¤ÿ„ö£ÿœ¤ ï›ÐIl^²U¬kùðOa¬ Ù!ÉývN!þR÷ò· ï02Ðøð†ûp rï0À‚ Ô©1ò3©0¾´‹XŠt‰>Йlœ1Ѩ¡?/³7è{Õ2K!Ì7×0)C ùðâ02¤@«B †òÔ02ÿÿÎâù ÿFƇ¥ß–\èëð#ÿBüˆ¥~]×Àëð ;TŠ¥>^"G—@tO`S+*;|OaS*ˆªßüH+äO‹S ÿFÿÿÖÅ ëðïðüóÜÿ÷hëðTµèçôAèó@* Àm?<¿Ièóð?NÇöñfx®êñ)þ‘Ò• <žEþ¿bÈ»bÏbÏ —b žNžöí’ß©e‹HéòƒN oùðxçôýÿýððŒDŠý’` ConnßectorÏ`®ÖbÿÏÕ+bÏ~ÕÔj ~¨puýéò óðïéòÿÿ3ÿï‚óŽ» ‰»û;„ ˆ»°3¾°;ƒ(ðý31 °ÿ;»ÿ»ó󻳆3 ï0ÿð3Fˆ‚óÿDH‰ÿ|Q`Šÿ;j‰ðri _‚TÙ F+ÿð1ÿ ®1°ð ó°… 3óÿóý>ëðDrag &ÿ drop toÿ add a 1ÿ-D single headeïrrowýñyoumrøðaw .ÿHÿÿÖÕ"ëðëðÿþò)×,áúùð=hT¼úñëðµ@çô@, ð?,ànFÐ?Pèó=ÿu `ÿu `äbûþqu `u= z!xuÅ|‰†€@þG¿þ? ÅÎÿu`ý Hþ6Æùð ÌíºÎØuÞ ç£—€@ÿþbê-2 2 õÌ,ø?@à¼þóF@@&AÂùÈyÅÂÆ¥…í«´–+ø?³Y³b³lþ*W>/)Q ×ÜðçØI [$Ü Ø ”FÑØ‰,ÿê Þ 9`Qÿ(-DTû!ù?û Ñ) @<>&Ô$ @€! î.€L!ýÿýÓÿþ#0 r`ÿFlowcharÿt.hlp!#5¿224þAƒ`ÿ9Copyrigÿht © 199ÿ7 Visio ÿCorporatÿion. Alûl [2s reserved.:øn—8. bþßýÿ 710þ2§Œ jÿ£ö„ÞÿœÞ(û›ù™l¾ÇUâra1,+Ø?Û rrÀþù„#°0r¿Àäþw‚÷÷3@¥?@¥ÔJ@ÿ>ÀE÷ÀþA„#)C“"¥ö,)ì"%dAAnAÜÞ  @)AÀ·þ@r9@‰ÀÁù÷O@ù@÷*“FBöÀ‚,'1-Ð@F ùös@t!C‚/þßNàEùOY#ÝOGmS@½Bm@Å@þ?FmA¦[‹Â‹•ãPUcãP!ãPîßPœßPcЉùŸ îdr Ì@¶[hV*oV22Ì3CmA¥A-Ð?Ôµ4éòä÷!@èó&þJKLMîçô "&µ4éòä÷!@èó&þKLMTîçô "&µ4éòä÷!@èó&þKLMUîçô "&µ4éòä÷!@èó&þKLMVîçô "&µ4éòä÷!@èó&þKLMXîçô "&µ4éòä÷!@èó&þKLMYîçô "&µ4éòä÷!@èó&þKLMZîçô "&µ4éòä÷!@èó&þKLM[îçô "&µ4éòä÷!@èó&þKLMbîçô "&µ4éòä÷!@èó&þKLMcîçô "&µ,éòä÷!@èó&ºdéò e,éòóðçô!@èóu&{éò ? µ,éòä÷!@èó&º„éò û âù@Bÿ`›'jó%ÜÿýòÄX›©Lþñü#q'4¯Y›–'ÄC»¾'TZ›à'Œöck([›U*wTƒOw䃽tw \›™w¨  ÿ𬳷w ܳ׷1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$1(Üÿéò$û âùEBÿd`›plS Üÿýò”zêþñÄ„'”Y›ûŽ'$Z›˜ª'ô¢'ìS¬ÞG a›¶'´[W›À'TƒÊ'|\›ÔÈõ„ƒÞ'<]›è·ÿFÿÿÖ… ëðïðüóÜÿøñh¾ëðTèçôA¶èó@* À?<¿íIèóð?NØöñfxêñU)þ‘• <úžEþwbÈbÏ÷bÏ b ÒžNží’;‹ße‹]çôHéòƒ§ o’xçôý‹ÿýððŒDŠþ’` ConneoctorÏ`Ö×bÿÏÕbÏ~ÕÔ5 ~¨pëêñ óð÷þéòÿ3ÿÿ‚󇻷†½»{…†ß»°w‚  1CUgy‹¯ÁÓ ý Ž3óÿóýIëðUse thÿis objecÿt to conýnþñone stÿep in yoÿur flowc÷harthe ïnext.ÝbÜÿà?ôü¿pÿÇqÇÑ¿ôð̼á? ?ö¿ôÿ ÿHÿÿÖÕ"ëðëðÿþòFwGáú=hT”úñëðe@çô@,+ð¿> ÷à¿P ÿu `u `ï€A@þqu ÷`u z æõþxu_äbœ‡ü„§uÝ`“à?¾u}Å  bšÒ““÷©  z+4ø?¤+Ž1ŽR$C ‰  ©¯*Xÿ2rÇqÇá·?2äÁ?ÚÑVâ±?b€krÿL`-@bûrøðÀù v u`€.•@¾ÃÕ ¿Å Å b& ßüð©Ž$ã€L@ÿþýÿýÿþôÓ `Flÿowchart.ÿhlp!#526ï3þA¯`9Cÿopyrightÿ © 1997 ÿVisio Coÿrporatioÿn. All þ 2s reserved.Í ãëðHF5nã ©âçbãY1x“ð?Žq “Ì!Ï  ç!û0@1§aÿ¤£¦ÿ„}œžßÿ›÷ql Uˆz·0aÍ Ä>  6#çE-€QÕ?Mê7õ>ð΋BŠM‰vM  Òâùiùð 0ßü';2Üq¼?ëð› iº#ëð”%}¨ëð–éòÿN ÿÿÎâù ÿFƬ›ßgmèëð#ÿBLº›On×_ëð ;<™×›®CLG@Ÿ”ƒ›úCû+;ŒÉ›ûêC(ëðH+ˆ›#oœöðÿFÿÿÖÅ ëðïðüóÜÿ÷hëðTµèçôAèó@* Àm?<¿Ièóð?NÇöñfx®êñ)þ‘Ò• <žEþ¿bÈ»bÏbÏ —b žNžöí’ßée‹çôH:éòƒ oùð]xçôýÿýððŒôDŠ’` ConnectorÏ»`ÖbÿÏ®ÕbÏ~¨ÕÔ ~¨pë;êñ óð-þïòÿ3ÿÿ‚󎻂óˆÿ»„3;»ó󿇻°„ƒ÷ÿðƒ»³ïƒ39&„ ¯™Ÿÿÿ).¹p&O% _„‚ ‚LŠw‰›­ »³3“33ˆÇöAÑÿŸÿ~Û»ƒÿænø‚ó? Ñþ Ž3óÿóý@ëðConnecÿt the toÿp or botÿtom of o¿ne objöòoîùòsidf a;noúðr.­bãøà¿ôô?üü¿ÿöð̼á¿õô?”>é“g>éãûõûþüÿMß¿ÿHÿÿÖU"ëðëðÿþòHíðuHáúùðh_T°èó@çô@@Ò'}63þó[ï?,ð¿>ßF·à¿P ùðuÿ `u `äbïþqu ÷`u z ”xu’‰†¿þï ßu` Z?ªª¯µ»ûuÁ bþ ó—€A@öûï ló)ø?5@,þ(¥Oú¤Oúø?¯®G¯mÐP=ÐRsùðþ–!£*£3 ï€L@ªm·p®·%P ð¿AÃoAŸôI Ï? $MÐ%¿?b »¿ Úïáþ”L`ï-@ & ÈäïµÀ[ u¿`€.@þ¼rJìÀÂ Î·Ž M’!–ÂÀnÑ$kÝb+îì$ ì#êñjúñk aîÉ }îóïbÿþýÿýÿþô30 ùð`Flÿowchart.ÿhlp!#526ï3þAƒ`9Cÿopyrightÿ © 1997 ÿVisio Coÿrporatioÿn. All þk2s reserïved.ýÿÛ G10§ÿz£¤ÿØ ¨œÿ΄¦ßí›Ý‰½l°UÀ"10*ó7•ôx¤Ç&ô=ð¿W ņ ¿}û@ V!u á}áMAàöEÜ@!N&‹†«‹+Š•‰Ñ0¬}¨ëðcéòÿ'AJÿÿòâùFÿÆ”–¥:r÷ëëð#Bÿ„˜¥%sõ¥ëð ;Ä™¥õÊCBG@ šO¥ tg+;U_ c/ëðH+|_qDëðððüÿð?éò/p@ªÿ&îëð>FëðT‹ ëðïðL*ïhëðT×ÈèóIèó!@nz&@AèóÀ?Œí¿zð?žèF¶ÈsJyþáƒîŒúî•þ×bb½ b î4žî=@æõVð?h]PÑ ázÄîŸh » »Ú:u«`³Ò×NÝuãáŒô  ›ßû’I»otÛnèçôýÿýððÑsT!Úâ` ÿFlowcharít`bÿºbˆŽ$# Ž!N/`$Cÿonnectorðp/‚/”/¦/þ¨wp¨7"ÜgâßTÝþUÉëðoBëðy÷=â>u?I@gAU0ßCõð ÷E = G H NàwO‹´ÛòR1ëðŒð?üÿ™à¨6þ´âR1Pëð³±10´e0Ç<¯3Ü2û ´Iè?ú:­Æ=@Ø6â1Ÿ=À°=´u0KO]Oy0rO„O}0™O«O0Ç?’Ù: Ÿ?±?´‰0\àJ]àÁ1 ._@_´à*R1 ìK›0VJHáFÂ0|_ŽQee0’n´Öêñ#‹0l ãRBÛäQfäQ8!JüSãR IäQq0’äQu0äQ"y0äQ*¤0äQ:…0ìS ãRR¤àäQj•0LcãRrä`äQzíðäQ’.ãRšãRª`äQ¹º PäQÂãRÊ»ãRÒãRÚ»ãRâ!ãRò\'`äQúãT$ ccÓdŠ1`«ãd Ód%ãdjãd&Ód'#c(+c»)ãR2*3cí+ëS,ãRJ-vCc.ãRZ/ãR·b0Kc1[cí2cc3ãR‚4nãRŠ5kc6sc»7ãR¢8{c}9ãR²ƒÂ©p©º©p¨qª©p¢©pšª©p’©pŠ©p‚©pzª©pr©pj©pb©pZª©pR©pJ©pB©p:ª©p2©p*©p"©pª©p©p ©p©pú»ƒ·`ƒê€âª€Ú€Ò€Ê€Âª€º€²€ª€¢ª€š€’€Š€‚ª€z€r€j€bª€Z€R€J€Bª€:€2€*€"ª€€€ €?9ÊÉ7!o]Âëð,[â\e0U]IZg^q0_u0U`y0f}0d0e…0U‰0hài•0€90õk` l`m_~oíðpq`w…_`s¡`Ut©`uEv±`wáPÿx${%ÿ†&‡'׈(10)O`*ßn+q€|ÿ-}.}0K€1‰3G€ÿ4‹7Œ58ÝþHØT'`P0÷òLÙÍÛj¬sz@z%¦•j¦•àp¦•Ð?ŒE€•í§–¶í`ÈOPÓv‘Ûà?í¢ø3¡ )€/*%Ð þæ!€L@þ„J3 ›7"öÛ€@ UŠúx•u0aþJ± µ£µ z`áÝý°Ö¯ð4 ì¯°Ÿ¿"½X±Æ­ÀF¿è¯j¿ ¿Ž¿é‹UüGÄGŒGTG€5?q04ánüh‘æõntop -ÿ GNU autÿotools fhh Ï€ÔS4ßü's€dy¶àCÆx ”‰’J"qA ¿Sy0 JâùxÁž0i—Ÿéò ‹oà”À–Ò—”Bî› ­]WË–Œì”•ؔܔÈÓšYß®‰‘rÒsÒ~Ò‰’ŠÒYp¥ýP b!Ypþ_€§>·`„¹œ÷€–¡D’Ñž¥ˆÕ¯ Œ°;×%UîØßê×°õ××Ö\ïòÓ‹XGDGU0GG€ñ´l߀¢419?ÛN5i’K*ÛLâMe0lÓQÁØ®¡¦¿öÖx¬ï~±n¿Ôï(Ú4ïFç(“„,uÂ'ÿ® è?LàümXéaclocalÏ€m<âùò@ÁrÇqÇÁKÁŠæ"7‰öx¡`Ã1@+± oXÍ”X1•0€×»P~ÙÂíÖõŠÙêñ ŠÙ^VŒ5AÝà×ôrÙTêñrÙ™Ó€™Û€™MU™µÒ´‹0kÆ i’¡{ÏuÄÅ0—Æ(¡ËT°ÇêäøpØpèp¤L׿ÏùϹøÃØ(©òîêäõäåö‡h×~ÒÝóé`Š‘°ñ`Š‘t¼•ާЄM09œÇ€´Óm?"Vï€hïzë40£ êåÀ!êä¸ äèæ?&úãBç9†ïÄÿÈ!Ü ”/F*‚&¼/øï` ÿ÷l‘?<ÿÿÿXøTóëA8Åconfigure.in¿€jpóD¿û¸åÀ?ïF\?ïFž‰’<µöÀ¿ÿGÔ»6ãÍ1Úö©êö©J5Ak °ÂÐ@¯ÁJØ?ð™U˜yLy¬‰DŠ›­»ð¡Ë!Òäv-?Qcuu_öD@‰ÓEŠÒñlÑÄÉ› Þíÿ/#/5/G/Y/k/}/£/po³/Å/€×/é/û/†Bôo$?Iñ:;6[ÿ.m4\?n?‰?’?¤>¨¶?Ü:“Y˜TÑ?7_<ÂN`ŸYŸY QOcAxkA€”‰‚ ŠOœOWñ²OôÁ #ÊOÜOîO_„_+_À=_O_a_;Ÿ¼‡ P‰’\’ª^¦ÑêÀ\ùOàÓ_å_÷_ n™å"o4oFo‹ïjo|oŽo´o[¯ÄoÖo¢øDŸIò;65ÈlibÁ:pY?L^'¿‚Âמ \™ \™ÒŸZ¸XL`1Œt ‰ Se®I¡ÃÉE@“¥·É€#Å X1ÀâôŸŸ*ŸÛÏ2…[ sÒüÂ'¦2Òª_¼_Î_Ÿ¯ŸÁŸoåŸ÷Ÿ ¯^oA¯?¯Q¯c¯Ñ߈‡¯™¯îbäÏïIòú;6xøMakefilX? ¿¿ÐïA¿“¥~ÙÙ’¿ Ï¶¿_C@ÚñüÉüÉο@åºÑó¿Ï®OŠ„` 3ÏEÏWÏɆ Yûð‚Ï@”ϦϸÏÊÏ¥…[ýÂÆ¦2ÒÇ%ß7ßIß[ßmßߑߣߵßÇßíßëßýßï›3ïEïîbQ®oï€â;6(zinclude÷¡ntop§ï¹ïÔïÝïïïÿÈ?á/í~Ò õ1Ò @dÿã3Æ õ1Æ ˜ó,lHŠ@庽ÿÏÿwŠ˜*ÓOa s…—xOQ˜ Á"–BßyŸ‹Ÿ%7I[m‘·µÇÙ__ˆý/îb~O9/€âQ/c/u/‡/™/fo½/U¿õ/ó*1–I$1–I?:O¨Ê»r5à± å° é²"÷p Õð?¢1 ZPª7©(åÿõr"Í5ðMEàBz~Ðñ?3ktIð)JQà7I‹xUdìTeØTeIÜTeð7€ð_XR(“E –B[“\’ÅK3¡Ov³@ô lÉA¨¨QUd°‡—…î ²‡°½‡Ÿ†ÐºƒÂ_ÔWmÿAÍOßOñLL_®_„VyvrŸ€q¬_šŸ¼_Î_¢¦§ "ý_€â ‡æ ¾™8cati=d<ú˜9²0'2rŸÇqÇÁ#PÕñ—bAM¦ì”Á"1;`Ê#De膲–po„¥¯‚gpÕñ7¨Ôã¯*”€þ—4ªs¤qãUàÈ•otÂh?„Ôf?„Š 2µF‹F‰{}5R‰PX6W„{ q ŸðlŸøy´«ðJpT"D£P9°F6Lq«6ˆY{õ Ä4ÐppÅBl?ÿW‡î?@lF_,úÔÌ?6ÄÞ>Åÿ¼?P×z'gWNð¿Ÿv?Æþ…Uu Ä>hw¦pñp~0%!¢Ã€ _@z3@þžÀ¢Ï†´Åpî‘ÂÁÙ°É@ØÏ´Â °IÎ6Ï ßQôŸPµ:‰–Oä1낳@Ý^s€1œµ@]Wûmƒ†Ðšwý²—„4¡»Ÿéůš(Ó¬#Qnâ§œºì&ÕàÛ|XÜA¼áß-ÐéÆßÄÙ‹y0E‹€‹MÆŸØ“ Ï A(’ #¸ñ“ï§àG& «ð éº ÷¿ ÏÍñ,Ï&ßPÈ-,‡ÀOÇúÀcÏuÇÄ>’ÎõÄyò°ËyÿÐÈðÀïòæÍ±ÿ@þløÿ ÿâÿQ(-DTû! 8µF‰F‚m³}Þî’ߤß\>ïØßêßüßï ï2ïDïVïhïzï¢"! $£ïÒâ {0 Ê¿ê ¤pÑïãìÀ¢òjÍ5õÝx¿"¾¿¢–®¦`¢*'þ¦pu `u `ßäb>!u/ `u H%@F ^C €A@`!W üT k"uÝ`®¤à?~!ué…)$0”Ñ “‘B§"­"Ç(ÐUõ֛ŦpøÁï"°Ëï/ÐÆEPøÁ%2@æË%?µÁj±§"Y3£&_7§"y3y±¶#4 ¿{пM¤á?2´2+Á?M¤Ñ²5±ŠYp  ƒ.•+'´"†aBy0€±BTY ErDC<ô®¤Ìs ®¥Ñÿ¤q§bÿ„5œÊ÷÷¿B¡„aa ѳŸ! nß2bí=€ÿ1ÔâºGÅNðþ2‹UBÕATvƒæ0Ÿ¤-_r¿ e¨ ‘ @¿æÉ¨\1$æéY{•VôÀpvÐŒw¨DÀˆ½WÎ<¥x±y©PÀyÐÍz` ¤ ^Pª /`Eb‘/!†þY )Ã@\aad aa%œþY¡€L@þ„;ß{‚ö×°†ƒYPtUDþ| ±c ±`¨OÜ<ÄOäa¬]Òo Qèo¬_ úO0v)¸ÀÔoVh ŒÄq‹Uü=Ä=Œ=TÕÙ”4ßQîáf1.‘¿êÍï_ñí«U«UŰþö­VRÆEùbÏtÈR† «UR†›ÅŸAøÁÊ‚°ËÊÐÆA4’æËŸÜôpŽ]3ŸOâ’õp€±’-Oew‰­ R?wº`eÜ ¦ØFœò ¬ ¦íŸ&8J†çuŸy#‚ €¿ê0ÏÐLŸv‰.“~ÆÖ‘ƛżøÁ ²°Ë ¿÷ˆöÃÖ² Ø¿/ŸAŸA¿>ߤwŸ8Ž’cÂcÂc¤Ÿ¶ŸÈŸÚŸd¯þŸ¯"¯4¯F¯X¯j¯|¯Ž¯ ¯¢‹âKÏʯù¢ €¿ê£¿ÇR… ! áØóÈ//)/;/€M/_/q/ƒ/•/»Ðª D®&ÎâÔâÂ&R…€æR…À Â…ÁÎóù.ÿ6A4Lò2;LÿR5Îâ€óe2üÎâ ó…2¡ùÚOÈ©?»?Í?ß?ñ?PÏ…0‘= ð$A=zÏ?OQOcOuO‡O™O«O½OÏO êîO__$U“ß?_êNV €_P $"ŠÔƒ`÷¯fQ àÒŠU)“[޶«UðÈ߉ÐV¿áVëYÒià bþUƒâH,ÇAˆ³ì*T%ØT%ÜT%Èôú„/2‡“#B"Ž’©"ÕU 0ˆÄö`ɇœ‘bŸÀ¤Æ»*U$°f'î%î÷/ 7°7ö&'?3eßwÓ"bÐm!R…ñ‡/Éûp®·¡KLàPMBlB· µËÿÎÜÉ?@²áËÉë?ªyS?e7(“aR°¤…/ ÚèØ¦ÞPù²EIautocŸonfiÌб<\‹)€'ÑôÁÊÀFƒbbHã©F‰Á”Ž’'1qÅûp¨ MÿVäFÜöHåб}ñ©)ñÀ©)Þ S)ñ)™w`™@@™yPNÕ!”dƒaûpD¼à?6 FÏv¬_ÏvžŽ’<p€Á“H+?ó_UÃþÔÔªÏDHEp"‡”¦¸ô,ÅÓå÷ 'ô0"/+/=/ O/a/s/#‡“ š’€ðKZÏfxŠœ®ÀÒäûëùñbÑ­Ÿ¿1"ÕÞ7Isßfªv‚†Š €áá¥×¯KGPobl@Uoµø£•Ø£•裕 w o²j²ÐiøÏbÆeQØÝiίõ½åÏh`/2wHrHrª"‰"Sewpm”%@7Œ€ŠÀ¯Šq¯¸½«Æ 6¸ƒS×NÐD­|ˆ¼a?:O6‰?¶È";Ge/÷ypF3þ‰Aig.h.in`* 1“3¥6ôdÀ?_¯TOq§wŸ£;Ș—¼™H@)Ó‘‰)#-ØSTP})Ó–‚$¯”!`ƪÑÔ¯¼ßø­]µ@ÿ@>9ŒWÃá@Ç~S{`/¶Ìë7wbÓ?¿Q¸ie€%oµ f·y´œ´êR»ê_­¶#Hô b9û oã´^}_SoÏk/‰)‰"‰"4lÏ~ÏH?ß´Ë?(!d£Plf'{vˆflùÂ,| Ò,v -߈?ßQßcוo€ßCR  ƪªßP_ÎÝn¶ÞÖá¿òÞ¿Ùï1ïCïUïgïyï‹ïî€±à µæ’’Éæn¶äæn¶xµ°Õ³Š¾`Ÿ­¶Ò´–’9û–ŸYõ’Ê“lòËœ’꓌ò뙇Oп±ÿÃÿÕÿçÿùÿ›oŠ"‡¢ðQÁ‡¢ÄoFXj|Ž T>ÕQ¡ Ü`«€ßZˆ+·`«'ÝFW˜Ðft†˜ H…²ÄÖè"ù ////A/=ÏÎϨ˜¤&Š"ó”/¦/¸/Ê/Ü/î/??$?6?úon?l?@~??¼ß®Æ?Ø2ÏÏÔð?ã²FNure(O:OUO^OpO‚O”Oúï¸NóÉç‘óÉåOÃC“©ç“•§_+Q0V³¡ã³hÍ‘ÓÍ-‰dZ€Gv=•йÅìöÀö÷?¬èÙð_ÈÚ¡nÈÐzÊ?ð(Ÿ†?¦þ÷°Ü† † —ðÊšžÔÌ÷°€]LÜ¡„ßæbвïeP­õ´þ°êê ïM¬5¿åý {±!åÿEk¿i€l‡|ŸAÃû‹«üàÄàŒàTš¾p2ä4RÁ_Q ²ø7.,P˜ÿªÿ¼ÿûÙsT€äÿöÿTÆ^É“ 3EWi{H ¡O2­¿Ñãõçùc¶?‡Ú?sþ?Ï©Ä?FO°?jOP//'/d'2D!I/([/m/ûÙìÇU•/§/$¹/TÆì΢Ú%ã/õ/??+?=?ù@¡b^?p?‚?”?¦?˜OªOOgo8O‹o$O¯o€OZOuo÷o@ao´OÆOØOW3D!!úO __ûÙ Œ%E_W_i_SÇ Õ*“_¥_·_É_Û_í_ªp¡±‚o!o3oEoWoI[ÅoŸéo<ŸÕo`Ÿ1 &Ÿ¨Ÿ@ŸÌŸew‰Æw4D!!«½ÏÎùî7I[m‘ [ ´„b²ÀÒäöŸúŸ ¯vŸÉ¿šŸí¿†ŸÏ⟼Ÿ×¿YÏÿ}ÏP¯(¯:¯w§5D!\ § $Ñ!3€€°œh¤s¹ €¢‡¥Rß{¨¥Úöð õàdÞÐ̦´Ô+ˆ$ # µà²û¥ð?ˆ°ÿÕuتªäì©åØ©åÜ©åÈt̪ ïèÀ!vòæ$â Úâ0âõýn  ôÀ`0úÆÑ§”°„Éœ{޲—µQˆªÅ °ªä°í×uå î~ïç°›ç}æ®ï˜ãW‹XâÀDâÀ0âÀuæÀêÄlmô©,ðïÉ3€?ÐVñKLôÀM7Ð!l7ÐféŸÏoÅcÖPÿ ±föÈØzÿ¯ÁÚïìç (±?Ð,ÒÍÿ—Ã0ƒ»è?i£ÿÿú=Òv¨automŸakeiîÀ>Ñ<þs¹'2rÇqÇÁ@À.€²b7±0ÆÑ”1â1q©±?Ш€’ý ¶¦ÆcÖ}lÖ27Ð0é©0éeß§$é|¹$é™`™Çðç™\á”d€±?ÐDªÄÆæöÌÆ3îÌÆž1â<pPAá²ïzràþ%Ô]ªVH\ Ò 3€©°ßc¡V°7Ø©Cß“¢¨¥øÃ¥ØÃ¥èÃ¥þ×ˆßšÚø÷©EøºØÅÙ(ôõ.å/¦/}£©#ãà;ï MàêQìùõà™°ûï ÿ@üõÀœ°õráô¸'föF6 óèç­ð,ÿkdø&›?M:¦ÆÃ?žÿ°ÿ¢Â÷«/ßÿj¢÷öúv¨Mfile.ƒam?6ÆäÀ?EŽOW]jåÛ=È~&ÓH&¥Ã)íÈ$Ri-Øåðýt Ð \¦¤*–@ ¼~®ˆß{þöä ¨¥ý?@l¿F,úÔÌÃ¥íþŸU¼?Püõû„¯‹§À(& VþªoÅñ¨¥ôÃ¥/@ôÀpy0©°þd€ @z3Ë@þÿPoep!7Ð#a:bi9obãl©_—_moQ(-ŸDTû! žî T1âÇbÇbÇbÏ)ý1Iä^„1Ýœâ W޲åmaæÐ€?¦À„4O¡»ŸÅØ:‰c¬Ø1ÕÏ.Xü‡eA{^þ†f¼BŽ`y'*%y‹T‹Ô ‹–°ï? ìã d(ôÄÈñ H"OT²îõ Ð!JZ!X_¨j_|]ð¨¥ä‡nÔ±X¥bù¿Ä_ÖWQÕ€•VQÖûV dÚ‚kÚ1fVd’GkŸgj†ˆmCŸ£oµoÃ)$éßoàñoŸ9z©Ÿ;]°2âMz¦^þ\–}r¬‘r¦ýŸ±ÃÕ¢çw!…ŸÀ! Ð"‚JV²3ƒn°ˆžG‰T… ³ ·…À…6ÈÛ4ÀT·é+%2µ;(@°I)QÐV*°À·ÇàÃQ‘Ǽ±óÀæþ<SbŠP<ä´ ä±ï õ Êø°ü²¼<€L]@Jà„ßYâOàêbåP µ^aþ_HÃHÀÛ?±Ï"ÃÏXÅS¶iÏ𽳂ÏF¼£ÏµÍëÁmkÏíÏÿϸ¡Ï#ßÅÁ‹ü’ Äª’ Œ’ T® íä4i.!GA ¸6.¨U#¬ °²#;¤1Ï D‚ÙLT‹À…ëÖoøÿÝÐ/0&H:)3ä[%àV"•µðd)èÆäìÎåØÎçÆä'8o±¥ï"ñª’¾â3&ª’Êâ'ª’ÖâmÀñââ*V†îâ,VúâÎ/à &„Êç)5Þ–5;1ƒÜ$8ƒîHÿZ÷°e÷zÿdñŸ¯Gm¼¢û/ ?;y?9ßA¦ˆ×Ù?Bé?û? G#¦ï*O»Òù#BO²./conÿfigureiðdDiÂÂ)€'2rÇqÇÁ~p.ÂbW!ýÝ! ”¢³ET‹ØýC¾é Q¾é2 J™Öïè㙆èãÿÝÃÁ‚îïóžÒóÿßýCÊéQêÊ陿™ä ™8>TdÁhH|öZ—Oy/©GpÔ!ç|ÿ·/U;0þ¿Ôª#H«Ð"¨Ù$µßÇßH@(T‹k†úóUýßï!ï,06éú€žºPïbïtï†ï˜ï‰(2š.ª’B-ª’ B£1#ÿÓü+ÿ=ÿcÿkO‡ÿO—ÿs»ÿÍÿßÿñÿ)1_9K]ÃOó"µ_ªý!u$Á ¸makàò(Àz]Cn¤?ÃÁNI*!IA?€àOCžÅoC™`jA ,A E$¬N/`/(„/–/¨/pÌ/Þ'•% Š%Áû/DŒÀ”ÿ¡£7ô%uÀ…wg¿ŠQn¿\?¾Æ'b,Šú,‡NÑ `u `¿äbQ_u `u […–0¼Y€V€€A@s@j€g€~‚®¿À¿* §pNÿ°% %à* º‚-À‚Çã}ìÕêvz°&pMÑ/‘’ä8–ý€Ÿ•pP!‘8’™7Ÿ’N$º‚l“¶†r—º‚Œ“°]Ƀ’”Ooпdá·?2Ç’Á?dÑÅ•±f½MÛ „ºÈ  ¾€Ý`É€üá)¢Œãa)¢‚$I1òð°ü¤ÿ¡&ãä.ÖŸ± ¾Å!Á¤ÿq§b„ÿ5œÊ=÷#ò¡JOCà ðx_Á€OÒä°]Þ‘€¡õͧ$ߢ‹ëBÑ@ŸRvD‰Ó0²r@¿ÀZ¿¸*ý!%å &¨z&”Ðú/²Ë}ˆÝßÃÁÀìÕØÿ?@lF,úÔõÌ%uÈǵ¼?P-DTû!ù¿^§ZȶþãÝ€ìÞú…A”,›,Ï/–#T”0bÂE›bÏ‘lÑ¿¿¿•ÏQ(å² Ã®Êâ¸#-*A¯§^ð1ÿœêW.#òmIFÐ_ „4¡»ŸÅuZú±Ã¬uQR?wº`CeÔ¯ÅiÛF^®Æ¼jßP¶À§ÙOßMÙ‹8`‹èq‹PŒ_žS ¨2¶R’&×ÏÇZà·&å E'rº'€¿’¿¤¼€ç…ý ½° «H¢=#Ó@°Ç–ãóÙ¸Ñá7)E\Iaï¿ú€ aÄ@ÅÈû„û@!‘ò›ÿYȰ¡hÁ° oÍ:ÿ‘¨î•ïkÿËÏÝÏ¢¢…#Jß%ßø7ßIß[ß@÷’—¹é¯…õ? FX~ü¥ÒD ¹ÒD%ÙßëßýßçQ'­ÿ,ïý"'å (rº¡(Vïhïzíóu ç€m?-nš‡ø …ølýýÙ¸Cµl_btHbÅï&<@èïú…ªP ’Ø›Ø/ÿAÿ/Ä~kA/¡ÿ³ÿ¨Qú1 A›"›"ßîÿœ~`ÛW½±3…Z&;FXT,¥Ò<¹Ò6û/¯ÁÓç(ƒ/2U(¤p)r°³R û@¡) /W¡S¡Òv¦»óvÅø¦ÈÎU¹ÆP0G'a¬e‚BCFB'a§Æ¡UO»¤õKN‘å]OîO‘'*âb RèçbÄcÜú0À$ö„?Éœ–¢× Km ¡TÄõOÉ aªåP bK’ÐLT M‚Ž`l4±¤ »¥’p¬¸ ¦Ç“ÖšVË¡©9:°lŽ`£©í+‹ÞJFï_¡Z¦oµUŸ?+±~P›!å©)óOØ:è:æ)'€úÖr8Makefile pz“Vt#À?AßoSwq±¡¹`¨1mÞF¦JF$x\F ÆPY‰‘Y±MØÞ0i‘ø Y‰‘ Y™`™Nê™§pCQ”ð0•*rº*'€OBÈØU¡€çÅÀ èŽâ¿Z/dä¯UÒ¿gOñfªŸA?Š?‡± ÿ`u `äbûdu `uÅ n…“@l€i€€ A@†}€z€‘‚ðÅôž«y‘ºpC*°OQ Q•Ó‚ËÇÍ Å`€‚úå#ô’ûŸYÆ)~ÄK’oËKŸñ„s•“Ɇ…——pˆŸ““q܃쥔| š™À‘ã?@ÿoƒÀʡѿÿ2rÇqÇá·?2Ú’Á?Дъؕ±fF€5ƒ°± ]Âõ(\ß´ƒ~²7=wä„X¡öOU‡s—z³/AAj£h›¶ŸA ñe@þ@ýq€þ¤ÿq§b„ÿ5œÊ½÷Ô"©Ý%ˆWpaì¯Ýr¥<Øu ½€þè­)ð¨*·‹ð0ŠÇàÃSE€¸60Årc¿wj¿;å*Ïq*ð0+ô:+OO@&O½AOSOeOwG‚O€”O¦O¸OÊOÜOŽÏ(, R¬Â-er¸Â"_4_F_X_j_|_Ž_ _²_Ä_Ö_ü_ú_ ooßBoTo"ê+”Ï~oÏr+–o$ÿconfig.h³oÅoàoéoûo ¾ïC~¸É`q¸ÉpNs¬É`q(¬É¤¶q,,ÉÛHí}iŒ džú"4FXj|Ž ²HĆ[ðЀ,Ô†nt€èú†½ ŸŸµ'+g”ì+ìx•n ‹’À!8ð¢‘n«’Aoÿ@°rh‘í|ù?@Å `ΟàŸòŸ~¤RÏ<®^©? ¬Zd;#¯¥Ï€«Ã(óÃÊ`¯r¯„¯–£ž¯°¯Â¯³ïæ¯ø¯ ¸°ø ¿2¿D¿V¹ga?x¿êoó,ð0-»z- Ô¥¿~þˆË»þu@ÿ@/voòžjóÿ?@lF,úÔãÌ?ƒ4Å3¼?Pÿ)ŸMPÀ´'Œ6þѽ€““þEб+Òð2à ð?ã$g”&Bù &Oãl•?ƒ?YOQ(-DTû! Ex+®¸Éâ ò òS¯ÕÀ^„ÿ1œê{WáÂm[%ùÐuß¼„4¡»ÓŸÅÍÚuC¬EÑF !÷ƒòsE-[žØ‚lL¼._z@kY_Y‹ŠVð‹ô ‹ÐäßöÓ H¬àVµga-›OêàŒf-·p.6:.D?V?h=ñy?sO8»7ÎðEã¿°?Â7–Õ?ç6)ÒÆbà ÆoO/O€üoSOeOeo‰Dã_+®.ò‰r‰r‰rÊOÜOîO_Š_$_6_H_Z_l_@~__¢_´_Æ_2.qð_ b.è /66 !c¨‚‘u}ƒù˺€Ne "†Ð.žÀ@—•Ç#$Éò?Â6ÅÐ?ʉF0XÜñ•’¡bå0¼°Д Б ká€qÊäè’v|¼°€»L@NÀ„ßáÂd×À[%P÷…l$þ§à4£4 w/‰/›.h /U¯Ñ/y¯4‘¯Ó/ ¶€&Öůg¯é¯‹¯ ¿E³‹«üŠ€ÄŠ€ŒŠ€TšóÐ÷Ô4Á©á êüˆ8Ý060 $Šˆðˆð0»°oé D€ò •j;´fý¶ðPÕ…àê¾Ð‡Ê_š³`o™è‚Ššà|š# »çû¸näì*måØmåÜaÅÈ”‘Ï¢x1ު z0®tê¾ Éœ¢Cù¦tÕ0Ñnä°sÇ%ïÅîøÏ ×°×÷Æ(ßÓ‹ö×mø"x”Ï©ÉaZàbKáÐL o MòàlòààÉÛ{%ˆã¼Êߦ‘ñyìß-¹Tßf×A(¡¬„ÿ!IïɇèþVÕ0 ¨âüˆmaÿke instaOllilð©á<û‰.`'qÁðp¢£bèó®æ!”ò1qm!óNú¡³Å²ßaþûzR?wº`eÔŠ&ØÞF?‚,S‚& çs…—©‡1oÆT260bìª&28j;%•ôV#„€ %•ú,5ý#…)êRŸÆnšô|™30‹™ú˜ŸªŸ¼ŸÎŸà•ß ë”æ2÷Ÿ ¥öT OH¤åà‘‡ ¥(È%¯7¯)¿;¿¥¯/;‡Oׯ«O;1ÁO¿#¿÷O™O@_½O?_W¿i¿§#õ(NumbersŠàÿdicate tÿhe orderÿ steps sÿhould beÿ perform{edŠà. ù_þdare comÿmands yo?u type÷_ kÿfilename¡s(o[gÇVHasæPi¿ng creÌPdøQocoujusedÁj§Ñª Ç!OÚf03Fíbó¿FæFç¢à‘ •¸òG’à<ã›ê뀨«ìÂëºâ¬)ÒæH«3‗² 63š éܽ¸ô%?4"†õá¾6–ò¶Q—Ωpo™¡õ=ÍŒ›$ÿG—ì.žÜ°Ï`Ä·ÏÚËÌéoÐÞÀu߇ߙܧ T@WU€ìÁWT†öý¡éã—''à¦ßéïÞßCŸõŒôª5Ÿˆï.ï«#3eYï3qæ $Lanð•ãwõé†@ÔÀ?£ÿ1¯µ÷Ûå“q@çïÕqýïv¨ÿùº^ð*]ýT4“º4¡¿³¿˜ªu€=5»Íßñ|€°Œ?Ï/¾bÍš¶{ư@…Ïj|ŽŽÜÏÍÿÈß)Ï9ßMÏ7È™Ÿfß§¹œß)Ÿ;ŸMŸ_ŸqŸß•ŸD§Ÿ©%4̿ԟ4qæý$./configure’ï¤ï¶ïÈïU¯g¯y¯‹¯¯¯¯Á¦oÿÿ“ï<¯·ÿÉÿÛïíÿBÿ÷5à/ò/?@ ïÕ…55ä$¾ &>·Y?ïôzl2|µä˜?ª?¼?Î?à3ðé4õ?OC+O=OOOaOsOe_w_áIf÷º _Þ÷ƒöE_ ß¼>Pòt‹__øáÖ¡·Votes:¾oSâoôoÃðŠÔÑUq"Å>vq%Os V|6fpò0pÿÚÆ;ø;èÖ55,¶P,¶3†‚ÿa7èôz­úv³ÀÿÒÿäÿöÿÕ>Ÿ é4¦2(:vs‚”¦˜ª,¶O<7O`[O„O!O£OEOÇOh¸ÊÜ A¸6.bp7 &ÑÐOP•Àà¯Å+±x©!¿HÀ@þdRí$מTÝ×@¿VêÒêÕZÕWˆA `u¯ `äTpúQ_u `u eäм`ÿP€A@a ``'bX?j?PPN7 ;ð_`cb]ibÿ@…Sæ”X„öî1ÐO²eõyî€wºh»¿`_`OQ;ðcb$_fçgcbsoftÿã@šÄ °ryh·X×Ôá?2PÞ¯Ã-Fûø’WgöœPlF,ú+ÔÌÕÞ(•¼?¿L0B*•þÕ‡fgö¶ä£ec•³iºóÅo¶ô†9˜ ŸâŸQ®Ÿz§ï„ýù°¶»Wý²ÐüÙϰ„4¡»Ÿèw!‡Þ“¬1Ñ©Ÿ;]°2ìÜ•z«ÞÛ–A¼{¯ã¸©`¯^©‹ûÐÅ‹0‹ÀHßà I¨“†lÑ8¯ƒÚà‘Ö8ð9ðòµ1­/’M¥yYGû_õyö ”_õ6_õ°?•ö”­ò·eÔ¢š ­òM5À?X°;o¬1ÂàMo|?Ž?%¢¹?@þ€/ÏãbޚƳb´ÊB´Ê´Çjþà’0nhì?þ?]_­¶@ß•Odß1zßÏOáO°ß€RßÔßvßøß_'_–ƒ¸þ ¨copyrigÿht (c) 2ÿ003, Burÿton M. Sÿtrauss IÿII / Licÿensed unÿder gpl ÿas part ÿof ntop ÿ(http://ïwww.Âá.orÿg) Produýcªàin Vis·io Ýàfeëànÿal 5.0 aÿnd conveûrtªàto pdÿf via GhÿostscripŸt 8.0T ûØNL¤e#º³n&µx,]µˆ"b#]Â[ÄÅ[Ä[Äm´`!ÂvD&JL¤@ü]ò—3hÿÐzÿŒüOû” g”" ËøW#¤/&/B €°ÏÂÏÙS,a!:?ÞQBÚò”D"íÀNM#œka°ýrÌ4¶ò ˆN"ݰéò@æõ!@úèó&=>?þóðABCDÿEFGHÿIKLMÿNOPZÿ[\]^ÿ_`deÿfghiÿjklmÿnopqÿrstuÿvwx{ÿ|}~ÿ€‚…ÿ†‡ˆ‰¿Š‹Œçô#®ëð š•õð¢ýáú@Bÿ„fšÿ°­Üð1(Üÿéò$ýáúEBÿtdšñ ÜðýNãøÿÃÔ¥ñzÿ6Éÿ@T^›ù°÷ëð?Rÿì[š¬±õëðD¼\š Í'ÿd ÿÿÿPage-1÷õðBlacÿk fill}õðWhite õuReýd Greeun -õðCya@ÿYellowê GõðMùðntaö3ay(10% Êx 2… 3… $da…r-¹J¹°„9¹ÀU¹fÌ 4ª… 5… 6… 7… 8ò… 9¥1pxlÿ linedª3t™9„™0Ž.¢.¶"ÆŽΙ&¢àŒ%¶ð™ù¤¢A&¶%A HÇair“A sh7ort¸sh1c&÷Arr\both÷v‘"ial ¿ 8pt ckeßredb‘'egïinž‘&endŒõð¤#10¬)È#Ú"2Ò¬)­í'«*Æ¡&24ú¬)Ö¡+top leftäí'ß!C6½ú5>*N=ûBy0Times©,ŒF3¸7Þ+ …Ñ;s2²é>F3ü8÷*IÅÑ7«*Þ6&;öy0ÝF[tex­(puÿtvisCoÿntrolsAsKIns@s[Bx@P{emkStylÐÎIDepœ vBRoßutingœCRÚvBL”ToÏAClÿearanceXÓ:ÉOÛDYÇKNo¥dØIj_÷FtåCGoridd¿@ÆåCÿBlockSizüý@vBAvenuežTQXâåC_WY×þI\XõðDi÷vid1procÿessF ßCost¥PDu¿ration¬QRŸesourŸPµDeñsUP¡CëAJump÷²ŽDowOnCDrt0^DÍ`GwóÇáP`BNormÏalàáPëAd/çSha˜YáPTagmg™XîáPDamostor ^Dö)Op?rect·angŸ@]`Eåx² n§ kityï 2Oh 3Fram1øqg]`”i.3iÞµm4xµm6{‰µm7 µmÏ8¯]eeBop÷aqu³bSumm>¿@ junc´R]`ÿOR %Ÿ1-D S¿@xa9‚Mv.11ñQ¥ls.9VsÌk14Ô]x”}5õðNf@.4ï2edj.17seYpÄ8xY|y9‘QÍj3.2¶lo21ÀY{22µvï4 s4þžÙe.30W‚¸k1— Zz38ˆ‰3œik€5D…€¨6óT…€{@n. a’Í&~½[cÙ€r`o©rdB瀷r…‹4ô´q ™6µu20ý ¾.48.1ž¶t16"5P“2.5 ™Øõ‚õðïTop/š tom–B0 s—Pc’,“3^e›38•Œ ™½0515Ÿeç.52ç’¸r55ýÔe›563ï 3! ö 3«ä) Ô) Ä) ²ª) ¥) ) „) rª) f) Z) B) 8ª) () ) ) ö¯3âi Êi ´ªi ¤i ’i ~i fªi Ri Hi 6i "úi i þ3檠ΠĠ´ ¢ª  x e Vª O ; % ¾ ý3éÕ ÕªÕ ÃÕ ¯Õ  Õ ‰ªÕ xÕ iÕ YÕ GªÕ .Õ Õ  Õ ŽÕ î3`. °Çª°»°²° °ª°y°h°V°Fê°*°°ò3«ÖI°ÄI°°I°šªI°I°jI°RI°:êI°"I° I°ö3¢C@3+@6 u°™u°…ªu°ru°Zu°Bu°*šu°u°ú* ¡°Öª¡°Æ¡°­¡°ž¡°ƒª¡°v¡°b¡°N¡°9ª¡°%¡°¡°¡°ð©°Ù°ÎÙ°ºÙ°¦ªÙ°”Ù°„Ù°tÙ°dªÙ°TÙ°DÙ°4Ù°ªÙ° Ù°õ ä Ñª À °   ª ƒ r d Uª G < - ú   , ݸéòDæõ!@êèó&õðÿÿ ÿ ÿÿÿÿ ÿ!"#$ÿ%&'(ÿ)*+,ÿ-./0ÿ1234ÿ5678ÿ9:;<ÿQRSWÿayzƒºçô9 ¢õðªláúÜÿ 2åöÿ@B´a›/«¸Wÿþÿ ŒÿÿØ– Üÿä÷ÿÿCUgy‹ÿ&ß ! ñðyÿƒKZÿJLYWQS<ùðÙëþð ˆ1ûÍ …Ó=žéò  ßÑ ?êñ óðß%T3{߀~jq‹Xcëðטÿ dehÿimpu_v†‡· õðÿ 䣟|}‚÷ðÂ(p# )/4'âùzÏÿaR[kÿlswxŠf/„/?,÷VÇorÿ\t]gÿn‰^_Á`É^'Œ/á/è#ÿEOABÿCD?>ÿPN@"#$15v//?þ@)MbUÿ3456ÿ789:ÿ;„GHIF46?‰?3ÿ/+2ÿ0,-.)'*Dˆw??/çô ä?Oéò O2ODOVOãø bO†O˜OªOãø ¶OÚOìOþO@G*_/_A_S_ä÷^_‚_çôn_É?Û?åö 1(Üÿéò$láúÜÿ 2åöÿEBl]›ž» <ÿ ÐÏàáßý>¿þÿ äø<êòìð.þÿÿÿçõ7DVhzŒž°ÂÔæø .@Rdv@ˆš¬¾Ðàý7U ìð.ìðìðìðªìðìð ìð-ªìð ìð ìð ìðªìðìð/ìðìðªìðìðìðìðªìðìðìðìðªìðìðìð(­ìó!ìð"ìð#ªìð$ìð%ìð&ìð'ªìð(ìð)ìð*ìð+Jìð,ìð7360ìðU1ìð2ìð3ìð4ìð5ìð6£(Ñ/ã/õ/??+?=?O?a?s?…?—?p©?»?Í?ß?Roó0ÝtîðEn÷0ryÜÿOæö à5öüAOå÷`RØJàÆ—ÂìðÀ†!ìðVBALOˆOšOêòáà5fAÁOàðÜØÂÖEãùdi@÷O __B®CA _S_ëñB.úìð_qPSRPàqP®!_“_ãù.!>_Ï_ëñ!œ` !.fAþö6/d#2)?/Q/;$j/|/Ž!6–%6!úP.!®/À'¢!8ìð9ìðU:ìð;ìð<ìð=—?ìð@ìðvABªìðCìðDìðEìðFªìðGìðHìðIìðJªìðKìðLìðMìðNªìðOìðPìðQìðR*ìðSìðTìðUoB4UXìðYìðZ3\ìðE]ìð^oR\@ìðaìðubìðcïBeìðUfìðgìðhìðiìðUjìðkìðlìðmìðUnìðoìðpìðqìðªöAsìðtìðuìðvJìðwìðxìðAzìðU{ìð|ìð}ìð~ìðõìð€>²€þýR0*ÿ pH‚dä! ÿAudit_ÿDi@agramýí`T@ÿ = +ÿx ÿ/ê Ü3vÿ J< ÿrstdol¿e>s÷0dõ@ó0lprhÿ%^*\G{ÿ0002043ÿ0-;Cÿ 00ÿ46}#2.0ÿ#0#C:\WÿINNT40\ûSy\€em32\ÿSTDOLE2ÿ.TLB#ÿ AutoÀmaïtion}Pÿ€MSFoÿ@rms>oSpFr¡pû s- |€ r€ÿGA760ÿ2466-94ÿ8C-4932ÿ-BBFC-1ÿ9A4D952ÿ01 GDOWSÿG4.TWÿD#Microÿsoft >ÿ b Objÿect LibrïaryÕ`0ÿ§ €‰€ï@4B9 7C9ÿ-B65B-4ÿ0E4-98Aÿ6-0E21D1ÿE€HA99ˆÿD:\DOCUÿME~1\BUÿRTON~1.ÿSWA\@LOCÿALS@Teÿmp\VBE\ ÿ&EX'&á.ÿE à…ÿ.`PŒM ´ÿ“‚Ž$ÿƒkÂwTÿhisDocuÿmeˆntNÝ2M`7 Tpi¿\D€^ˆcÁp_ÿenÀ…¢ÀþHB1B”`ýö. B,ÿQBÚk"B+BBåJø@¯R¯âú“K)^e"83RkT¡¯§¢´pU-îqÂ¥ f@~þP~Õ¯äp. íªfpêq9">C "ëñýÑèô)]÷„^ÿWH¦ÆR¯0éŸGT þP4±ä|þQƒŠa ´§aëTºCÉéº)U¶©èô“¹4¯êò¡˜¥àüD¾Oêòi=´ßýþP!Thå•ntè±"!…\ ‚þPïkSÀéóqF+âa™€Pro!ÿ Files\C_ommon7ÄM3• SharedµýA[Á332.dlÅlfA\À ù(;fAö!"©".qNÞº˜ËövaÿD:\VISIOÿ DEBUG\HßAWAIIÉÁLI]BdÀDLL.!_VisiouÁkT*à19kT‰kTnq¡Ë0Ì ja™ƒ …H©…²…jQR‚euÂûȘ¥!¹´i¹´®qå÷þ W­ªábÈÿ¯Aˆox‚’rü@Ñb!ÇÀKÒR×Õ@Ú€,‘éÁ !ÙÔuÁÙ¹´!Á=´˜¥4±ëñQ=´îqÀÁÁ‘ƕϑÁÉ—ÿ”K[¶ä@˜¦¿!I:™& €Æ!ÇÀ“–•Ÿ•¨“–T\²•ÙÕEXDuÁé=´RÿÝ!èªÂã"!ÇÁ­ÿƒÜÂßHЉ_I6òp”Á!°ÌþÁ]—™ÞËÿO¥.nJé‡z%‚ÁPÒìf@!ôµü1ñaAddMen“uI©€ Naôµ_þôµCreatedòJa\þOpenedf@  îa¥Ç³ Óë.ëT ê¤È"ÿþPÒ½õÁU¸ÁÒïÂÒÿ!`ÄæÀ`Ô´à1Dð°«V ¾b!FlowcVÀtÿ Databasÿe Wizard/.exe6 na]-TQM Äo9 %YDðÈN…&*  V!&]oÀa !ý !custUI/.vsuÁÿ²Ç*9 Dðà¤È6$Ám2T%h"$ú !&Tool5sÁ|$< ÕiDðøá· þQRun ŽÁ~€³ //rU©îrÛ¤Úp²æQ¨>E6]>CÍ¡  µc´³w*á°äNaB³;fAdoc–p /Ï/"/åÂ¥.AZa>Ep%¨Žar%baYc´©ëT T´óõ1´Y´¡´>D‰>D!æQµ±u4 Ð…4~ULµ %¡Š…4á…4 aq½4‘ª½4¹½4á½4 ³9³rY²aOO¦]6_GO¦Y)É1¨ärY¶aO€“O¦]þQ a>OÏO±,k`°u4rYºa__¦\H_.E_¤KW¸ù“sý`oypu¡p  ½r‹__Taà€ c>_Ï_±>a©Öaªâaå4‰å4éBå4&aA´2°c´1c´8,5a! %½b„%$rqŠ¡©+ha%‹¢’ Õ`Áq`1ŽÂq}d6Y—o©o»oÊk\‰pÁS?}d}dõâôðHôñKÿEôp,ýÿr*ÿ2$ÿÿþÏÿ ÷ÿ"Ñ$ }Í  ÿ ô÷pßÿ 0· ) ÿÿ4pÿ.ÿl$ÿôüÿËäþcÿØ¿2k.ÿçNpžÿFØþ]:ÿßNøþppèþõ á€upû/Èþÿ6øþèþ\M•:ôÿ q]}nÒ€yÎsp Kpdÿÿ\ k,ÿk*ÿÄÕpp^ÿMõ±ýõŽÁÄþþŽ|àx :Øþ ñsßlÄþü°jp °ír‚÷p«p ³qÄ;þZ«püöLêüx%‹)Š<7üxá ‹¡€f+ˆ´þï| ÚsÃÄ+¦pèq>‡ƒ‚²øz&éû‡cuŽ(Ÿ0ü†°ÂÔ*ÿÚpÝ€wäöŒ€„ŸŸ¿Ÿ’T€ÙŸXŸýŸ|Ÿ!¯Ï„úx`¦à²þ"ý $r (ÿk²þ›ŸüÈ q„¦˜þŽ l ÿücûÒ=Cpï/.sÍ„…°l°¢@t§'½¯.s|…°Qßÿ4ÿµ êá¦àë¯Î¨¶.Ó¬þ¿1pXµ@l¬ÿþ*18ÿ÷/¬þ:± l8ÿÿ4ÿ Dm°ƒ§¤Ž ~ ž­›Q ±6?¿Q¾FòæÖ e³5øþõƒ§¨ˆ± 8|¢Ž¿ ²©°p±y4u°ž±xÿ©°ýõ±Áxÿ $­²tÿ Ãt:qÞ²pÿ"4p2ÿÿ¨þpÿ ,®?`l¨þŒ‚®Up¤ßþ¯©°k2ËÿçTÁ ?`ž±lÿ»¦°lÿŒ ÞZ²û0e°£_äî± NÀßd¤þlŽr0ÿ£!©°QËTÁ(zÇ ô“ÀˆÁ$Àôÿfÿk^ÿþc¿ þé(°kMfPp­çÁ‰À8ÀR0q(§ ±h9²'ùÃÿDÿ%Lÿþ®øþ`#†À?hÿ HбױýuØ<ÿþò€þÝ|.Ðq<þÔØþìNÒ,Òü‹«pûëèÿþ(þûœÿÈþü"l<þïlþ ˜ð-|þß:\þ‡ÐûïkLþ1ÕX:Ó6†p?€þlþLþÚhÕê1Õ`:× èÀd þÿô k0ÿôŸÆ)ôÏÞ`~9² `7Ó~¦àl4ÿýœž©áœŽ :±.Àî@H#\‹$p0BªâÕ3ULi`4Û``Û`xÛ`Õ|-B…3|þ¬.ÐU Û`Û`ø‘àè‘àUÈ‘à€‘àl‘àL‘à»ÄþšãHãT¿ l üøÀ‹¸}bÁR{påP(‹$¸äwâÕ4-Bâïôæ‡$ÿÿ(Wôðz€ó1A`‚ñnàK¼/í/Ðÿ& aœ5d)@î$ éádÿ `ç¸ÿøöçõ,»)ëññð_¼úù¡êòÞ,,uiÀ <0ëñpÜÿîàüÌa^eÿ ›ºä1cþ*\G¯{0Ý2Ý4¿EF-Ý0òí Cñ46}#3.Ýw#9'C:×Prog=÷amîðFi_les×C?]mGonIMMuc=s?ftîðWShErQd×_VBA‘3)U2+dOl'VMWsuElîðBE©ssJo= —pªzlsai_sÞçõ€ìðH ªðPûXû`ûhbû öT. xªû&ìðˆû*ìð°P+#»4%T#àû,ìð£ ,"!e&ìð@Ä#a*!#1(©x#ª!€—-˜#•2)Lìð !ã /ð8ø¯-ã íã 3³31;"10ä33Q2X??‘ €\c3a( ìð˜34_ ¸W4. 0ÕÈW4qø«8 š¬7(Ã1€ Â!Ý&O@Ã4¦1PÃ4_>€ó8ó8Q Ï3!:â1°ç8Àó8-ðó8 ô7SA"gT+•ˆgTR@ [T00}°gT è[TúÒAøgT ”Â!; (ìð0Â!GP*#XÓT ã0pÓS}@ç€ÇTŠKˆ$ÇTbQëTÂQ°ÓS•B)ÀÇSÙ*«PÈ3möPõ\ìðØ'd;8UPoaOlö{`od"ýÐocðŸd±0ERæ!i·cñR ·c w0é(Ïd 18Ïd!+@Ïd R@XÎ"`*PÏ( ÿc=RpÏdã0)ÿcE:ÍP¨t2)ªÎQÈÃdKPðÃd<·H"÷wqct‘pws!:ÖaˆwsQn˜sÕ` øtBq¥`Nõ4 (ãs•B8>!*#T@ït0pût}Ý€ŒJˆüŽüW" ' 4˜ûsa&’:… Œ^…¨g 2°Ä=‚¸CåøôÝØ> 0êòZêøñŸ*Ÿ<ŸNŸ`Ÿúr›¤'2Øþ= Numbeÿr of menÿu items ÿto be ad¿ded®0&ÿFlowcharÿt Databaÿse Wizaród®ß@½–-T&QÿM Diagraÿm Wå¶Tþõÿÿ<þT­ƒÜÿÂßHЉI6¿òp”!êòÀúéóFßý]—ÿ™ÞËO¥.nŸJé‡z‚Â!¡A ìðéA—öøñxìðúŠìðîª $[ þõä—kÚk4!#K!ìð(C­­ wpòìðÊ¡Sö/cøñ4þ˜ß ¢T( T$=PTTÿÿ ¸¿-¿?¿Q¿zc¿@[Lþó¯S~¶þós1}°‘!Á JÎQ£°aR¢³Ÿ´Á ã0 µö¢³éó>"þõ}´è¿ú¿ĦÈÏ0È1ÏWÏ_Á‘´»!]2u@`!0m°] y xÈ!.=VP„z—ò, Œû—`„|—ò* a Ë„~—ò$Ùñ#£plieŸ±a"ÅôÚ€_ò÷XòÀ@”É€ÝÀ Pøí¤]›‚¨!Ð¥¾¾Á@”„@òÀðþ¥io c@”†"—òé@¨‘›0ÒAJm±w±ƒ&óÀ¡Fä*mµÍPÒA‚ —ò&ñ@¡@@&ñ$/6#ò )p/+.@”ˆåÀòÀ8ír²”Šå©ðè[ ¨+Œ¨úòÀH¥,jXÚ&€]ÿÈé@xÿ§k8&€m±¼ûa€˜”Œñ0#þ\4%4% „l—ö0&€™€Åö®ó)ƒ>3±Øtqm±„Åôp—ò¤ŒdùˆÃ01˜ 4À ±™ž4¸!\9%‚m80),= )v‚/<)!&€L/m³ )H[¡O€/*mµè!‘Xñ`/¾¸@OOÕ)O;OcðÈ¡Oþm¶&Tool…s<9¥L7þ )h€QO³OQ¥ÌO^/%¥D_.+<9P_ L1m±@ºŸÌ—0#ÚŸì“Ñ’iôX~Æ.exem õYðn/a.b×`cust¿UI.vsu@aORun`ü˜¥¯˜Pm¥òÀ bm° cð²³ô„”ïÀÿBDN>†c@þÿü€”iRÈñPÁaü€*9øØ…Dïo·€aúo!3EWTimµhÉPXÉPà!)òÀm±òÀpn¥òÀ•x!ø4ð¥ñI Ö! >ó¨I   DÒ`Áp˜1üÁp`ü€8ÁpÈÁtï·ØaúDÁp°ÉP¼am±•h)cð¼a8ü€=`ô@¼aàÁpÿÿ„P…@ØáqÙbfƒ¼a¨ ü€OÁ±`¸eü€øP&ð…S¡¼aÀü€è¥ˆJ¸epÍpØ¥ˆX…ˆÍp%ȽŒ€ÁpH/cð±¢!S¡ž-„Ä&ð\Áp<…èáp »`—–I ´¥„ÈñØ—b&e,…²&ðP…xBY˜¬&ðÀ¬‚Y€ÉPÿRVÞh>…&e°Áp` r”<9¨ÁpL1±üõÍpø©’&ei#&em±ðA,…¨&ð@Ð`r²%Ø‘¦e˜¸µ»b Íp¤þf‡P¤¹Õ”wcô¼aHÍp¢e˜PÍp ¡~=¨m±  %¨"™0H¡d©ÐÍp”¥ˆ¥¸Íp€¯m²|¨õ˜Èñ¼aèÍplµ¯ÿ&ý\å¯m²Lý¯m²‘<¼m±H¡‰cô<9@(™0ÌUü(™0žˆH>7xY´(Y" º¾p±º¿á¿ó¿ÏÏ)Ï(ö!ð¡HÍ´a™ eÈÍp€?€žcôdùxE~Í'ñ8Ò¥h™Ržc@È4Äs¸2Ï#PAPMEœ[<óIøÏ ßßþÃöþʦ"³0i4€ ñF—€ˆaàø‚XÓè*_Øð_Øø_ØÙqWÔÀaVÕØØØaVÕE(Ø0ØHVÕ@ápÞbD‹'4i4®30o(hà4oÜFmøÕ6ØÈ0:Á-^ïpï‚ï†àXáÿCheck ifÿ Documenÿt is in Ïplac{^ÿ!B”FWdg¯0ŒðÐ {–ÿXáˆTh°àùcŸá±àf useÿr has apÞxd a ^aomÿ UI fileý ðto theï tem¶àte ?and/or£áù÷tha®âspecïificôVis¼àöábeenùå.$ÆóXá$çðr$ð‚ð˜òô«àusÆÁâDë¨e•mò%BuÿeRôŽþ`ÃàF£øû çõØ ÿUse theÿ Built-in menusëñ½åîñ!FHß.:éóawÿÿØõôuÿôÿVisio cuOstom D%¾øñsavo a fileëôþJ® \þLUI.vsu_'8) §ýîð:B@L}÷ò+Setÿexisting~KUI for¯docutèö8ÿ (Nü)øñGrab¶isè'sÝoObjecðaþøñ"Deletþnewly cÿreated tÇempˆš A@©P½ëó¹R)[h1h.`¥ØýödL ¤/ (¥:ú%)žûÝ3MCàXÇ&àspeÏcifi\) wiÿndow conÿtext- (DKra- g,%)êòúVû%TN½.)Õ$%"õÔÿaýGÇ"Tools" frPAçctix—!barþ)!& if it~èes notÍ, addÂ!á÷.÷îð>öu¤ìò"X¤ûW ‹S&>û"a ÕZe"&) !0!Ý\s&—"}•ìð“^ÈŠÒ ÀŠð%Àèô¯‡'@)þ#3`H407(1(-0éó›A09pŠ!A× ž"i_s ëñð!.šõ"îð2 3.T4(3bu6*=CþÆcaption÷ an¨0ini ohelp^xtÚ7—$4½ ó0Ž1®^ùRun I6-BêBK÷ 'BÞl£0Cd°!~Mame ofÕ! @{runéõBM2A£fÀ5X5øÍÿNü¥2separa!tâ·!{(À …3ìž"Îs))!aftÓerÕ!\M«6.°^ìò@¯:1Ó?¾å<0ÿÿ®û-²îð04  ž3&@ÅQÖè ¶h‰ul1XmPøŠ§A@)°Q@µR`T)ÀY(mPÿèP mPŸZêpìððQ¨õT$QðQÐõTðõTTŠðQ(dHd`dxdd¨dD1ðQàdºQb) bmdd1ýØ-P LocaÿlizeBegiî™CZ®;&Flÿowchart ¿DatabaÿðWÿizardêxì)˜aŸf-T&ÿQM Diagr{am±dê—¼Àl¨m.exeã`¨âçj ÅiÒnqêÀ )˜a ™¸`¥–c€25ä`cr”e:Cp­Ü•†eEndèôÁóŽìQ€aFChÿeck eachX, ´arsÈoÝ@_e wherÂ!ßcan b¼oux@‘AAompuP¤\2¥z)|) S~û¹’‰:ð!xõ&~Šìð 1R*$€Ê1„C€”½ç”³p`1zgÔèöB‡†MŽ|_†÷Õ¿÷ð •i¦0onñCèpð!Poçpul !arrÓayìòzû|U;2÷ ¥2w@=îðNumbP‹@ ª8{äpRíñ€û‚¯DÙ‚4©„*û†–6)®5”•¹–©ʃùbÇ2Üb‘‘J”•0‘<•b‘H‘ÌÈXŸjŸ|Ÿíñ“˜—&“¨ŸF“}a“‚neiØrüŽCavaila]b‚u1p2P8 2P!:-n¯€¯H’¯– !µtÀ Dêr haG ppl&!aYe) {ˆ_²‚@/PÀ ¹tha¾¢ $c"´F±§bee @ ³.òõ€)@®¦Øq¹¼À„2¨;2°%…¿D¨´@Z ¸µôÿ*ˆ=à<N`r„ ˆ¤°ÂÔæø .@Rd¤Ã†'ÿÿ8Š002²ÄÖø%Äìþ/"/4/F/X/j/|/Ž/ /²/ÀÄ/Ö/è/ú/ ?? ³Š:1@1`žX€-ðP?b?t9 ñŠ9˜1-ð ?²?Ä?6_è?ú? OO0E ŒûÀBOTOfOÃzOŒOžO°OÂOÔOæOøO _U”Ã*U²ÿD_ 6‘Z_@n_€_’_¤Y­›©pø®Sð•SÀcrÀYØX2RÒÀYÀ•èQ¸•¸üÎÝ”¶AttributTÀ_B_Namô=…àïhis·¤t"ÿ ŒBasÿŒ0{0002ÿ1PA21-ÿ0Cÿ$0046}÷ |öÒab‚lÿ†False ÿ^Predecÿla‰Idÿ‹Tru "@EÿxposeTý.´D0eriv$eCuÀ^Áÿizˆ2Pÿ€€ SubÙ …ñQI_Ð()÷ cpƒDiÿm visþÆÀsObj AýsUÁøio. ÿ‘Ž'ÿþsŽ$ŽÿZŽ ‡ï‚i ‚^€ýI&àgerXÿSep 8 MÿIsÓar¯ÁDçðêðÂÿariaDntÿˆarWÀbrÿdŸSMÿstrP(athÿASÀ«ng‘ÿÊ*UIo‰aUÿI@?TecÿiA!c–;b@ûNo‡áÂ0BQÿeanÇi€ÿ‚oòn×JbDÿÁ³Å.Nóböa0pƒA.ûs´`r‚1ÿ>s()Í7‡ë '…fŽa„'CÿonspDDÿON_D€ATAÿBASEï&ûúc'Xÿ@ãÁ FLÿOŽWÀ~ÆÝÏ`@Õe‡Jÿ#FIL¿E áöBqjÿBS'.ÿˆ iÿCU@ST_UIÿ_ NAMâ¯c {Zp]pdÿ MEN€Uÿ_TOOLSB%ÿ?Ä¡ IRUNa0†qÿ$¦0Endÿ#£On E÷r rmG I ÿEXIT_`2ÿERR! ÿsÓª, ÿâ¿¶Aÿrgs¶"",ÿ ¼""˜‘ ÿ1CE`Á÷®N¼à(õSÿû' 1€ÿñ0ÿÿ =hÿ‘Sè V ÿuVùßrd<ÿ({µ&ÿ!Ïc%-ÿåu= !ÿÿ!¹w{Ïÿoa$Ÿ’ÿÆ_òÿ@W 'ndÿeiÐ1r à+ïLi€G¤ñ—óÿS1ExÀNÿЗS1€ÿV If²ý',`ÿYDXiÿf å®   þÀ=0¤cp§Qÿ *ù°.IÀûnPÇ¡ÃHà —ÿóƒ'Áÿ cÁ]$s ÿ€us€„/§„ÿ£Õ-à Ãÿ):ƒ'€߃niÀˆ“ð>nýB{€Â]JƒWÿ= Â1Á]iMÿnu„ƒÿÁÿ?ƒ Aˆ/ÁÿÀ"@7&ëÿ.Ã2iÿƒ@o[ÿ2‡'ÁÁ’caaTòôýøùðÆ „ÿAË?ØvarÿÅs(Îÿ.+Á MÀH= K@~­àLef@_"0¿iza@rdúeÿm ,`n(ÿ`W) -\ÿ 4 ¡ÿn ofÁ÷a`NtuMû¬†ðOnÿaÿ,y‡$#ÿcQæ.ƒ£ß¢A!¾¼aÿtàn¡w ÿŽ(€w'‚}ÿFbws)e{aûfxïA ˜!ÿ.zems$ßx j¨]H sÿ`ƒÊh=(þü ]Gm Gÿ8€.'x"œÿ-"£ s†LßneÀ­È]Àà—ÿUI‚²á ¬dÿo‘T`“ÿD$Ú.Cÿâs†B¿ Eq@ó_µ0w@OŽRßm @W” ïÀ Py Áÿ Å _ÿƒÄd(ByV¯al¡Á UÃ.ÿIþV…ÆG€ÿ@Á9CJÿ _VBAÿ_PROÿJECTˆÕÏ ÌGÐ6Å Ï SÏ[œð?•œñü¿ƒÏ¼•Ï ÇŒ œð>ÏÏÏœñ”oÁŒoÎGwmÔÏß Ø3ÏDßTÜšœðBãoßߓߠ¤Ý6ßÇßÙßœð‚ªœðƒœð„œð…œð†ªœð‡œðˆœð‰œðŠTœðúጜðœðŽœðUœðœð‘œð’œð¥“œðþᖜ𗠜ð˜œð™;ä>á]ïoïï“ï¥ï·ïÉïÛïíïÿïÿ#ÿ5ÿGÿYÿkÿ}ÿÿ¡ÿ³ÿÅÿ×ÿ¶Õû çõÒ*\¿G{02ÿ1A98+-0 C4 46}#Eõ.G##D}:ûðVISaýOîðDEB]Uýð\H W éIa^LaB3ª.YL‹#_i«s¡oîð5O0þîðTypeúîðL¡braJÃyâú¼ùþD3 @0B ”VVC[UWaNCTE0ûð]Sµst¹m‘ªNTYO‹E“TR‹BKh uU¥oYaU¦nâúäŽùöA7GF6ªñ9E8-E9º‘-oBFÃ1ª AED 5ç1È%7fWcN\UMcF§rYsouWY#+ icÃ]o£ofU /(u ÷ gbj¹ñcS"¾éóRúõ4o¾9­C ªÐ6«BÅ0m4B»8 º¼!1½"DÊ 9óZfCqUMm~ \oR³IOC1.c|\‹ªþ!A‹S4TWpr]Bm*/EX?/ðQ/c/u/‡*á.ÿE à….¿`ŒM ´!ÿïÏ0ÿüÜ2çõ/êÜ3v€Ü3õ?OÞ3 M²1ßýä¯k³h¡Dª§cƒm¹nU ÿ13dda49{d8Ë0*DÛ0sÚkèôÏ0ö/E Ï0 O¥O·OÉOÛOíOÿO_#_5_G_Y_k_}__¡_³_Å_×_L‘O oo.o@oRodovoþ‚hâО NÐÿˆ\ ¯„Õ©‚,EÜ1`ìð€êòNQÿH0ëñÿ–€ÿÿpublicß°ÉdSuÿb Visioÿ VBÿA÷âW¿in16Á~÷d3÷2î`Macÿ³²Prÿoject1 ÿ stdoÿle“`ÿMSFormsCÿ Audÿit_Diagrÿamž ÿThisDocuÿment<žý ´`ÿÿÿ_EÿvaluateÿÙ AddÿMenuItemóÎHqXujÓßvis~qSetsObj”p6eruMø=p™xj¥p ap­{wqÌšt¤q§º÷`­xs!ÏL ™u¥p|÷7­x¬B–x‚qf¥pZƪ{‚qjýi‚qCountˆ}\&ŒSep3Übp÷iM€ss\>¿var~uCÿaption)þ¾rarWizar¿dNameWÐqÿstrPathlùçqšpUIobj™3vp¬uUI¥ppÄÉ9N‚~qcX‚9bÿNoToolsðýØÑwInPlacçe7´wp­tCus·tomër÷ —AkppÓ`a“¥*Ppþ­tBuiltIn¦ër챇³2 p þ­tSaveToFÿile_ìŸr‘蘀KillÌ{•olear˜WŠªw~‚qAtID·€ð­t½‚¥p¡pDraw_ingíQ÷`W‚30v“‘‚q×zÑw…ux$p ‚Kø$õw{pAtCwbuB‡O’þ¬viniHelp³» 0§{pOn¦ˆÙ‚–pe•et˜l@׋v_XuCrÝerpdQ™ qdo·c˜„b—IVXu°ï’‹¯OpeŸned"x—•¬Ù¯n§Ò«ëwp_ûB_…€_LeftkQáwqi{ponWƒý|rbDatabßase±jë‚FlowTQMÆOxËs¢€r-²¦sý!–qADDON_ÿDATABASEóv—¾qo³FLOWöQ°Óê¾qFILEÆt¶oƒPp•³‰´› þCUST_UûI_–±NAME›ýñMENU_T¿OOLS}Ûî`„}¯rRUN_оqßEXIT_r°ER¯RORj̰"§oïnsªªwGet¶d² Ñë‘UCC°5õ =p†Argsã­îPpµ)ÂaÎceu³4ÊKÂ÷a}c¨nßÍÛ0§HìðÚ3Ï0:ûZÓ0ÿÿù_µÈ} ©Àÿÿ¬ÀáDÀ"2OëñID=ÿ"{9E12D0ÿE3-4E0B-ÿ11D0-885ÿC-0020AFÿ84D582}"ë Xu=Ty/&Hm07Ô ¦="AzüÐS¡ContexîÈ="0ÐCMGÿ="484AF2Ï00F6uÙÑPBÿ="90922AÏ4D2B“ÓÐGCÿ="D8DA62o9563ªÑ6AÐÿ [Host ÿExtenderÿ Info] þ5Ö1={3832ÿD640-CF9ý0ÐCF-8E4ý3ÐA0C911ÿ005A};VBóE;5Ù·ÐWorkãspÌÐTy=88Û, -á35.à57?6, Z <é>á€àÏáûTyIO[D–ï‰'¶ÐÁ0BÞ5ÿûÿ<¬À­ÿƒÜÂßHЉI6òp”!€A×ÀéóF¢î]ÿ—™ÞËO¥¿.nJé‡zm :Ë0ì©dŠCU©dxìðúìðîÛÀ±$ðÞ5²1äkwAÿ+ÿ#ìðˆìðýÑí>à1 òìðŠñ¨„A°3Ü14¾èßÌâ¼€àÜ3$Ê`ÿå¬È ¬ÏàüÁ þÚ¢ÿ à û Á ï&8J\n€’¤¶ÈÚìþ"4FXj|Ž ²ÄÖèú //0/B/T/f/x/Š/œ/®/À/Ò/ä/ö/??,?>?P?b?t?†?˜?ª?¼?Î?à?ò?OO(O:OLO^OpO‚O”O¦O¸OÊOÜOîO__$_6_H_Z_l_~__¢_´_Æ_Ø_ê_ü_o o2oDoVohozoŒožo°oÂoÔoæoøo .@Rdvˆš¬¾Ðâô*<N`r„–¨ºÌÞðŸŸ&Ÿ8ŸJŸ\ŸnŸ€Ÿ’Ÿ¤Ÿ¶ŸÈŸÚŸìŸþŸ¯"¯4¯F¯X¯j¯|¯Ž¯ ¯²¯Ä¯Ö¯è¯ú¯ ¿¿0¿B¿T¿f¿x¿Š¿œ¿®¿À¿Ò¿ä¿ö¿ÏÏ,Ï>ÏPÏbÏtφϘϪϼÏÎÏàÏòÏßß(ß:ßLß^ßp߂ߔߦ߸ßÊßÜßîßïï$ï6ïHïZïlï~ïï¢ï´ïÆïØïêïüïÿ ÿ2ÿDÿVÿhÿzÿŒÿžÿ°ÿÂÿÔÿàøýTêñrý ä÷Bÿœ~Ô»÷ìLO ¿ÀÊŒ ìÿÂLØ®ý<ïúê?™ ‹ôêñëðïò÷ô gü÷àû(ÿ™¤Z;kYâ@(v®<`,b:ÏÜd(A=|,³šúùëðˆ YÿR”/š8ëðTqèóÕŒëðƒ”Ò4išœëðýnëð&FHW ïð!ëð§ßTÚ™+ïð4 ÷·ˆñ __ Øëð·} Û7Mëðýw|š‡w×õëð$çô|xÓ óòh±ÏëðÂêñWy)ÿB<´œ_ê/’ïð'w,[š¿ä±IëðÿO` ûæõ2·ÿpš-²~ï?w \šwc¹.W§¤S›]ÞýÊ7įRƒôðD~w¤dš¨»€¥=çôÈ¿ wì/N›“K” þÿÿÿ  þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®ø´@€HP\h t ¬ä  PagesMasters Page-1Divided processLined/Shaded processTagged process Data storeOpen rectangleExternal entity 2Data store 3Framed rectangleSumming junctionOR 1-D SingleNextTop/bottom to sideˆýÿÿÿ‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§þÿÿÿªþÿÿÿ«¬þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿà…ŸòùOh«‘+'³Ù0ÌMHP`lx„Ìääburton=D:\Program Files\Visio\Solutions\Flowchart\Audit Diagram.vstntop-autotoolsGàLÿÿÿÿVT$m g&&" WMFC® 0Œ–,` N VT$m EMF0­ly | Í"õ VISIODrawing  ö ä &%    |,š'ÿÿÿ% V0Ï4ûÊÏÊûÊû4Ï4ÏÊ% €( % €%  W0âGè·âGèGè·â·âG% €% €( &%    |,š'ÿÿÿ% V0e ‘£e£‘£‘ e e£% €( % €%  W0x ~x ~ ~xx % €% €( &%    |,š'ÿÿÿ% V0',é'éé,','% €( % €%  W$C,CC,C% €% €( &%    |,š'ÿÿÿ% V0e‘°e°‘°‘ee°% €( % €%  W0x-~x-~-~xx-% €% €( &%    |,š'ÿÿÿ% V0 -Ï ÏÏ- - % €( % €%  W$)-))-)% €% €( &%    |,š'ÿÿÿ% V0'-é'éé-'-'% €( % €%  W$C-CC-C% €% €( &%    |,š'ÿÿÿ% V0žS` ÄžÄ` Ä` SžSžÄ% €( % €%  W$ºSºÄºSºÄ% €% €( &%    |,š'ÿÿÿ% V0Ü„„܄܄% €( % €%  W$66„66„% €% €( &%    |,š'ÿÿÿ% V0 ,Ï ÏÏ, , % €( % €%  W$),)),)% €% €( &%    |,š'ÿÿÿ% V<Á[y[Ý[ÁmNR?[eXy8kAÝ[% €( % €( &%    |,š'ÿÿÿ% V<}[5[5m[‹A}8‘X·[¨R5m% €( % €( &%    |,š'ÿÿÿ% V<Ù„ „ê„ê Ù û    „% €( % €( &%    |,š'ÿÿÿ% V<ÏCe‡ÏTÏvTvT‡eeTCTTÏT% €( % €( &%    |,š'ÿÿÿ% V0Ï'û½Ï½û½û'Ï'Ͻ% €( % €%  W0â:èªâ:è:èªâªâ:% €% €( &%    |,š'ÿÿÿ% V0á' ½á½ ½ 'á'á½% €( % €%  W0ô:úªô:ú:úªôªô:% €% €( &%    |,š'ÿÿÿ% V0–SXÄ–ÄXÄXS–S–Ä% €( % €%  W$²S²Ä²S²Ä% €% €( &%    |,š'ÿÿÿ% V<r³Ïš|³rÔºŠµšÏÉZÄj|³% €( % €( &%    |,š'ÿÿÿ% V0„SFÄ„ÄFÄFS„S„Ä% €( % €%  W$ S Ä S Ä% €% €( &%    |,š'ÿÿÿ% V0é' ½é½ ½ 'é'é½% €( % €%  W0ü: ªü: : ªüªü:% €% €( &%    |,š'ÿÿÿ% V0žû` lžl` l` ûžûžl% €( % €%  W$ºûºlºûºl% €% €( &%    |,š'ÿÿÿ% V<]l¡'lnln]'¡l% €( % €( &%    |,š'ÿÿÿ% V0r² žH rH žH ž² r² rH % €( % €%  W0…Ä ‹5 …Ä ‹Ä ‹5 …5 …Ä % €% €( % €&%  W$‘ee‘ee% €% €( % €   |,š'% V,Z'qZ'eqZ% €( % €% €&%  W$û£ûÿû£ûÿ% €% €( % €   |,š'% V,ðýýûðýý% €( % €% €&%  W$½?½?% €% €( % €   |,š'% V,t<‹S‹<St<‹<% €( % €&%    |,š'ÿÿÿ% V<â’r2ú’â©M&A2e'rfú’% €( % €( &%    |,š'ÿÿÿ% V<j’ú2ú©â’vjw'›2&ú©% €( % €( % €&%  W$w½w?w½w?% €% €( % €   |,š'% V,l<ƒSƒ<wSl<ƒ<% €( % €% €&%  W$e½e?e½e?% €% €( % €   |,š' &6WMFC0% V,Z<qSq<eSZ<q<% €( % €&%    |,š'ÿÿÿ% V<Cć4vÄTÄT#C#e4‡#v#vÄ% €( % €( &%    |,š'ÿÿÿ% V<û{¤™¤›˜{iÿYû™‰¤›% €( % €( &%    |,š'ÿÿÿ% V<å•€¥ù•ôhå`û!€x¥% €( % €( &%    |,š'ÿÿÿ% V0ûs ½ã û㠽㠽s ûs ûã % €( % €%  W$s ã s ã % €% €( % €&%  W$eÊÊj eÊÊj % €% €( % €   |,š'% V,Â_ Üt Ì_ Üs Ât Ì_ % €( % €&%    |,š'ÿÿÿ% V0Ss  ã Sã  ã  s Ss Sã % €( % €%  W$os oã os oã % €% €( % €&%  W$eÊ o eÊ o % €% €( % €   |,š'% V,c 4z c 4s z c % €( % €&%    |,š'ÿÿÿ% V<Õ >Ä >ñ *Õ š Œ ² )Ä ¶ >ñ % €( % €( &%    |,š'ÿÿÿ% V<ÒÕ Ä æÕ Òñ ñ¶ çÄ ² Œ š æÕ % €( % €( &%    |,š'ÿÿÿ% V0r¸ žN rN žN ž¸ r¸ rN % €( % €%  W0…Ë ‹; …Ë ‹Ë ‹; …; …Ë % €% €( &%    |,š'ÿÿÿ% V<æH *¸ H ÷H ÷§ æ§ ¸ *§ § H % €( % €( &%    |,š'ÿÿÿ% V0Å5 ñ€ Å€ ñ€ ñ5 Å5 Å€ % €( % €%  W$Ø5 Ø€ Ø5 Ø€ % €% €( &%    |,š'ÿÿÿ% V0ÅÎ ñ Å ñ ñÎ ÅÎ Å % €( % €%  W0Øà Þ Øà Þà Þ Ø Øà % €% €( % €&%  W$ÎË ÓË ÎË ÓË % €% €( % €   |,š'% V,Ñ¿ èÖ Ñ¿ èË ÑÖ Ñ¿ % €( % €&%    |,š'ÿÿÿ% V<Î èJ Î Î9 ×9 ×J è) × × Î % €( % €(   ß ú ú-|,šüÿÿÿ-$ÏÊûÊû4Ï4ÏÊü-ð--%âGèGè·â·âGú-úÿÿÿ-ðú-|,šüÿÿÿ-$e£‘£‘ e e£-ð--%x ~ ~xx --ðú-|,šüÿÿÿ-$'éé,','-ð--%C,C--ðú-|,šüÿÿÿ-$e°‘°‘ee°-ð--%x-~-~xx---ðú-|,šüÿÿÿ-$ ÏÏ- - -ð--%)-)--ðú-|,šüÿÿÿ-$'éé-'-'-ð--%C-C--ðú-|,šüÿÿÿ-$žÄ` Ä` SžSžÄ-ð--%ºSºÄ--ðú-|,šüÿÿÿ-$„܄܄-ð--%66„--ðú-|,šüÿÿÿ-$ ÏÏ, , -ð--%),)--ðú-|,šüÿÿÿ-$Ý[ÁmNR?[eXy8kAÝ[-ð-ðú-|,šüÿÿÿ-$5m[‹A}8‘X·[¨R5m-ð-ðú-|,šüÿÿÿ-$ „ê„ê Ù û    „-ð-ðú-|,šüÿÿÿ-$ÏTÏvTvT‡eeTCTTÏT-ð-ðú-|,šüÿÿÿ-$Ͻû½û'Ï'Ͻ-ð--%â:è:èªâªâ:--ðú-|,šüÿÿÿ-$á½ ½ 'á'á½-ð--%ô:ú:úªôªô:--ðú-|,šüÿÿÿ-$–ÄXÄXS–S–Ä-ð--%²S²Ä--ðú-|,šüÿÿÿ-$|³rÔºŠµšÏÉZÄj|³-ð-ðú-|,šüÿÿÿ-$„ÄFÄFS„S„Ä-ð--% S Ä--ðú-|,šüÿÿÿ-$é½ ½ 'é'é½-ð--%ü: : ªüªü:--ðú-|,šüÿÿÿ-$žl` l` ûžûžl-ð--%ºûºl--ðú-|,šüÿÿÿ-$lnln]'¡l-ð-ðú-|,šüÿÿÿ-$rH žH ž² r² rH -ð--%…Ä ‹Ä ‹5 …5 …Ä --ð-ú-%‘ee--ð-|,šü- $Z'eqZ-ð--ú-%û£ûÿ--ð-|,šü- $ýûðýý-ð--ú-%½?--ð-|,šü- $‹<St<‹<-ð-ú-|,šüÿÿÿ-$ú’â©M&A2e'rfú’-ð-ðú-|,šüÿÿÿ-$ú©â’vjw'›2&ú©-ð-ð-ú-%w½w?--ð-|,šü- $ƒ<wSl<ƒ<-ð--ú-%e½e?--ð-|,šü- $q<eSZ<q<-ð-ú-|,šüÿÿÿ-$vÄTÄT#C#e4‡#v#vÄ-ð-ðú-|,šüÿÿÿ-$¤›˜{iÿYû™‰¤›-ð-ðú-|,šüÿÿÿ-$¥ù•ôhå`û!€x¥-ð-ðú-|,šüÿÿÿ-$û㠽㠽s ûs ûã -ð--%s ã --ð-ú-%eÊÊj --ð-|,šü- $Ì_ Üs Ât Ì_ -ð-ú-|,šüÿÿÿ-$Sã  ã  s Ss Sã -ð--%os oã --ð-ú-%eÊ o --ð-|,šü- $c 4s z c -ð-ú-|,šüÿÿÿ-$>ñ *Õ š Œ ² )Ä ¶ >ñ -ð-ðú-|,šüÿÿÿ-$æÕ Òñ ñ¶ çÄ ² Œ š æÕ -ð-ðú-|,šüÿÿÿ-$rN žN ž¸ r¸ rN -ð--%…Ë ‹Ë ‹; …; …Ë --ðú-|,šüÿÿÿ-$H ÷H ÷§ æ§ ¸ *§ § H -ð-ðú-|,šüÿÿÿ-$Å€ ñ€ ñ5 Å5 Å€ -ð--%Ø5 Ø€ --ðú-|,šüÿÿÿ-$Å ñ ñÎ ÅÎ Å -ð--%Øà Þà Þ Ø Øà --ð-ú-%ÎË ÓË --ð-|,šü- $Ñ¿ èË ÑÖ Ñ¿ -ð-ú-|,šüÿÿÿ-$Î Î9 ×9 ×J è) × × Î -ð-ð0d€lt€_VPID_PREVIEWS_PID_LINKBASEä A þÿ$ ÀF0ŽAv è6 0(N( @€¿¿¿¿¿¿¿¿¿ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwwwwwwwÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿÿÿÿÿÿÿÿÿÿ÷÷øð ÷øø÷ÿÿ ªÿÿ ªª÷ÿ𪪠÷ÿ ªª÷ÿ ¢""ˆ€" ÷ðª‡÷ÿ ÷wwÿÿVisioInformation"ÿÿÿÿÿÿÿÿÿÿÿÿ ¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð÷ÿðÿüwð÷ÿÿÿÿÌÏð÷÷øÿüð‡÷ÿÿÿÇÿÿüð÷ÿ÷÷ÿ|wp÷ÿÿpðwpp÷÷øÿ Àÿðp ÷ÿððððð ÷ÿ ÿÿÿÿÿð ÷ÿ ÿÿÿÿÿÿð ÷÷  ÷ÿ𪪠ÿ𪪪 ÷ÿø ª÷𪪪 ÷ÿÿðÿÿð÷÷ø÷ø÷ø÷ø÷ø÷÷ÿÿÿÿÿÿÿÿÿ€ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷€ÿÿÿÿÿÿÿÿÿx÷ø÷ø÷ø÷ø÷‡€ÿÿÿÿÿÿÿÿÿˆÿ÷ÿ÷ÿ÷ÿ÷ÿ€ˆˆˆˆˆˆˆˆˆ€ààààààààààààààààààààààààààààà?ààÿàÿ( @ÿÿÿÿÿðÿÿðßÿð€0ÀpÀp àðð þðAîð]ÆðAîðwîðwîðk‚0\:0k‚0 wþ0 þ0 0€0€0€0ÿÿðÿüÿýàÿýÀÿý€ÿýÿüààààààààààààààààààààààààààààà?ààÿàÿ( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‡wwwwpÿÿÿÿpˆˆpªªpªªpÿÿÿÿpˆˆpªªpªªpÿÿÿ€ÿÿÿpÿÿÿ‡ˆˆˆˆ€ÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿntop-5.0.1+dfsg1/docs/TODO0000644000000000000000000000356507414541016013626 0ustar rootroot The list below is (mostly) outdated. Please have a look at the www.ntop.org site or at the ntop tracker for the latest news. ################ 1. Fixed. 2. Fixed. 3. Fixed. 4. Fixed. 5. Adapt intop output as the window size changes (Carl van Schaik ) 6. - Add a mode where only the non-local traffic shows up - Add a mode where stats reset at each ntop iteration (Davin Milun ) 7. Fixed. 8. Multihoming support (Luca Deri and Stefano Suin). 9. It would be great if ntop could log to a file in a way so that ppl can run it, then probably shutdown the machine for a while and start it up again so that it _appends_ to the same statistics. ie that ppl don't lose their overall-traffic-statistic. (Luzian Scherrer ). 11. Fixed. 12. Fixed. 13. Fixed. 13. Fixed. 14. Fixed. 15. Fixed. 16. Fixed. 17. Fixed. 18. Fixed. 19. Fixed. 20. Fixed. 21. Fixed. 23. Fixed. 24. Fixed. 25. Fixed. 26. Fixed. 27. Fixed. 28. Fixed. 29. Fixed. 30. Fixed. 31. Add an ACL that filters requests depending on the client IP address (??@trinux.org). 32. Fixed. 33. Fixed. 34. Fixed. 35. Fixed. 37. Fixed. 38. Fixed. 39. Fixed. 40. Specify protocols (e.g. IPIP) on the command line as it happens with IP (Olaf Schnapauff ). 41. Fixed. 42. Fixed. 43. Fixed. 44. Fixed. 45. Fixed. 46. Fixed. 47. Fixed. 48. "ntop -d -w 3000" on Slackware stops after about a minute. (Bobby Hitt ) 49. Fixed. 50. Fixed. 51. Fixed. 52. Some broadcast packets corrupt text-based display (Reinhard Volk ) 53. Fixed. 54. Fixed. 55. Reset traffic matrix stats every 5 minutes. (Mario Goorden ) 56. Maintain a static (not purgeable) list of the 10 most active hosts ever. (Rodney Clark) 57. Fixed.ntop-5.0.1+dfsg1/docs/database/0000755000000000000000000000000012012127277014670 5ustar rootrootntop-5.0.1+dfsg1/docs/database/README0000644000000000000000000000057211023713717015555 0ustar rootroot NTOP DATABASE SUPPORT --------------------- ntop allows network traffic information to be stored in a MySQL database for further processing. This applies *only* to NetFlow flows. Supposing that you compiled ntop with mysql support, you can configure flow DB export via ntop: plugins->netflow plugin -> configure Have fun! ---------- Luca Deri , June 2008. ntop-5.0.1+dfsg1/docs/BUG_REPORT0000644000000000000000000000471107477426625014604 0ustar rootrootHOWTO report a bug in ntop ========================== Burton M. Strauss III , June 2002 1. Use a meaningful subject along with a meaningful title "ntop problem" won't do. "ntop seg faults in xxxx.c at line xxxx" is great 2. Make explicit WHICH version of ntop you are reporting this against. Where you got it, source or package, etc. "RC1, downloaded from ntop.org on 18May2002, built from source according to BUILD-NTOP.txt." Also indicate if you have followed the procedure in BUILD-NTOP.txt to make a static linked version OR are using shared libraries installed with the OS. 3. Give a detailed explanation of the problem 4. Background information The EXACT command line you use to invoke ntop. If it's in a script, cut & paste it and resolve all the variables! Web interface problems: The exact URL you used from the browser. (If you are in the normal frameset, you may need to right click - open in a new window - to see the url). Otherwise, give the FULL navigation, e.g. Data Sent | Throughput, clicked on "Host" to sort) Error Messages: Cut & paste the exact text. If it's in the log, give us 15 or 20 lines before. If the problem is a segmentation fault, include the backtrace (available with the gcc compiler if you specify the -K parameter). This is only a minimal trace and may not give us the information we need, but it's better than nothing. For repeatable seg faults, please see instructions on using gdb at http://snapshot.ntop.org and post the "info stack" and relevant variable "print" command outputs. 4. Environment - please give the following information: OS & Version (e.g. Solaris 8/i386 or RedHat Linux 7.3 or whatever) CPU (type & quantity), Memory (e.g. 1 P3-800, 128MB) # network interfaces and types (vendor, bus, etc.), plus where they are on the network (e.g. two NetGear RT311s (PCI), one on the internal network, one connected to the cable modem). We're trying to see roughly where are the interface(s) you're monitoring and what their bandwidth is. How many machines (traffic sources/destinations) and users are being monitored. (e.g. 10 hosts - 2 are very busy ftp servers, the rest user workstations). What else (other daemons) is/are running on the machine, load, etc. Again, we're interested if this is a very busy, memory constrained machine, or ntop has a dual Pentium 1000, with 1GB of ram to monitor a 56k dialup... Remember, more information is always better than too little. ntop-5.0.1+dfsg1/www/0000755000000000000000000000000012012127266013016 5ustar rootrootntop-5.0.1+dfsg1/www/Perl/0000755000000000000000000000000012012127266013720 5ustar rootrootntop-5.0.1+dfsg1/www/Perl/nClient0000755000000000000000000001635307414541016015255 0ustar rootroot#!/usr/bin/perl # # Copyright (C) 2001 Luca Deri # # http://www.ntop.org/ # # # LWP module can be downloaded from www.cpan.org # use LWP::Simple; # $debug = 1; $ntopUser = ""; $ntopHost = ""; $ntopPort = ""; $passwdFile = ""; $homeNtopURL = ""; $passwdFile = $ENV{HOME}."/.ntopasswd"; ############################## if($debug) { for($i=0; $i<10; $i++) { if($ARGV[$i] ne "") { print $i."\t".$ARGV[$i]."\n"; } else { last; } } } ############################### if($ARGV[0] =~ /attach/) { attach(); } elsif($ARGV[0] =~ /lsdev/) { lsdev(); } elsif($ARGV[0] =~ /devinfo/) { devinfo(); } elsif($ARGV[0] =~ /lshost/) { lshost(); } elsif($ARGV[0] =~ /hostinfo/) { hostinfo(); } elsif($ARGV[0] =~ /arp/) { arp(); } elsif($ARGV[0] =~ /nbt/) { nbt(); } else { usage(); } ############################## sub attach { # attach [user:pw@]host:port if($ENV{NTOP_ROOT} eq "") { print "ERROR: NTOP_ROOT is empty. Set it to user\@ntopHost:ntopPort\n\n"; usage(); } if($ENV{NTOP_ROOT} =~ /(\S*)@(\S*):(\d*)/) { $ntopUser = $1; $ntopHost = $2; $ntopPort = $3; if($debug) { print "user: $ntopUser\n"; print "host: $ntopHost\n"; print "port: $ntopPort\n"; } if(($1 eq "") || ($2 eq "") || ($3 eq "")) { print "ERROR: NTOP_ROOT is not properly defined. Set it to user\@ntopHost:ntopPort\n\n"; usage(); } print "Password: "; $ntopPwd = ; chop($ntopPwd); if($debug) { print "Password: '".$ntopPwd."'\n"; } $URL = "http://$ntopUser:$ntopPwd\@".$ntopHost.":".$ntopPort."/"; if($debug) { print "URL: '".$URL."'\n"; } $content = get($URL); if($content eq "") { print "ERROR: unable to connect to ntop. Please check host:port/user/pw\n"; exit(-1); } else { print "User $ntopUser successfully connected to $ntopHost:$ntopPort\n"; } umask((umask() & 077) | 077); # -rw------- if(open(OUT, "> ".$passwdFile)) { print OUT "http://$ntopUser:$ntopPwd\@".$ntopHost.":".$ntopPort."/\n"; close(OUT); } else { print "ERROR: unable to create/update file $passwdFile\n"; exit(-1); } } else { usage(); } } ############################## sub lsdev { getNtopHomeURL(); $content = get($homeNtopURL."dumpTrafficData.html?language=perl&filter=ifAddr"); if($debug) { print "Received: $content\n"; } if($content eq "") { print "ERROR: unable to talk with ntop.\n"; exit(-1); } else { %hash = eval($content); while (($key, $value) = each %hash) { print $key."\n"; } } } ############################## sub unbundle { my(%elems) = @_; my(@unbundled) = (); my($index)= 0; while (($key, $value) = each %elems) { if($value =~ /^HASH/) { while (($key1, $value1) = each %$value) { if($value1 =~ /^HASH/) { while (($key2, $value2) = each %$value1) { $unbundled[$index][0] = $key.":".$key.":".$key2; $unbundled[$index][1] = $value2; $index++; } } else { $unbundled[$index][0] = $key.":".$key1; $unbundled[$index][1] = $value1; $index++; } } } else { $unbundled[$index][0] = $key; $unbundled[$index][1]= $value; $index++; } } return(@unbundled); } ############################## sub devinfo { if($ARGV[1] eq "") { usage(); } getNtopHomeURL(); $content = get($homeNtopURL."dumpTrafficData.html?language=perl&key=$ARGV[1]"); if($debug) { print "Received: $content\n"; } if($content eq "") { print "ERROR: unable to talk with ntop.\n"; exit(-1); } else { %hash = eval($content); if(!$hash{$ARGV[1]}) { print "ERROR: unknown device $ARGV[1].\n"; exit(-1); } $elems = $hash{$ARGV[1]}; %elems = %$elems; @allelems = unbundle(%elems); foreach $i (0 .. $#allelems) { printf("%-30s\t%s\n", $allelems[$i][0], $allelems[$i][1]); } } } ############################## sub lshost { getNtopHomeURL(); $content = get($homeNtopURL."dumpData.html?language=perl&filter=ethAddressString"); if($debug) { print "Received: $content\n"; } if($content eq "") { print "ERROR: unable to talk with ntop.\n"; exit(-1); } else { %hash = eval($content); while (($key, $value) = each %hash) { print $key."\n"; } } } ############################## sub hostinfo { if($ARGV[1] eq "") { usage(); } getNtopHomeURL(); $content = get($homeNtopURL."dumpData.html?language=perl&key=$ARGV[1]"); if($debug) { print "Received: $content\n"; } if($content eq "") { print "ERROR: unable to talk with ntop.\n"; exit(-1); } else { %hash = eval($content); if(!$hash{$ARGV[1]}) { print "ERROR: unknown device $ARGV[1].\n"; exit(-1); } $elems = $hash{$ARGV[1]}; %elems = %$elems; @allelems = unbundle(%elems); foreach $i (0 .. $#allelems) { printf("%-30s\t%s\n", $allelems[$i][0], $allelems[$i][1]); } } } ############################## sub arp { getNtopHomeURL(); $content = get($homeNtopURL."dumpData.html?language=perl&filter=ethAddressString"); if($debug) { print "Received: $content\n"; } if($content eq "") { print "ERROR: unable to talk with ntop.\n"; exit(-1); } else { %hash = eval($content); while (($key, $dummy) = each %hash) { my($macAddress) = $hash{$key}{ethAddressString}; if(($key ne "") && ($macAddress ne "") && (!($key =~ /:/))) { printf("%-20s\t%-20s\n", $key, $macAddress); } } } } ############################## sub nbt { getNtopHomeURL(); $content = get($homeNtopURL."dumpData.html?language=perl&filter=nbHostName"); if($debug) { print "Received: $content\n"; } if($content eq "") { print "ERROR: unable to talk with ntop.\n"; exit(-1); } else { %hash = eval($content); while (($key, $dummy) = each %hash) { my($nbHostName) = $hash{$key}{nbHostName}; if(($key ne "") && ($nbHostName ne "")) { printf("%-20s\t%-20s\n", $key, $nbHostName); } } } } ############################## sub getNtopHomeURL { if(open(IN, $passwdFile)) { $homeNtopURL = ; chop($homeNtopURL); close(IN); if($homeNtopURL eq "") { print "ERROR: problems while reading $passwdFile. Did you attach to a running ntop?\n"; exit(-1); } } else { print "ERROR: unable to read file $passwdFile. Did you attach to a running ntop?\n"; exit(-1); } } ############################## sub usage { print " nClient [ ] Available commands: attach attach to a running ntop lsdev show ntop available network devices devinfo show info about the specified device lshost show ntop's known host hostinfo show info about the specified host arp show ntop's ARP table nbt show ntop's NetBIOS hosts How to use nClient: 1) start a copy of ntop at ntopHost:ntopPort 2) Set the environment variable NTOP_ROOT to user\@ntopHost:ntopPort For instance (on tcsh): setenv NTOP_ROOT luca\@dummy.ntop.org:3000 3) nClient attach 4) nClient 5) Have fun! ====================================== (C) 2001 - Luca Deri \n"; exit(0); } ntop-5.0.1+dfsg1/www/Perl/dumpFlat.pl0000755000000000000000000002057707414541016016052 0ustar rootroot#!/usr/bin/perl # # David Moore # # Description: # # Fetch information out of ntop and write it as a delimited ASCII flat file. # # March 2001 # # Currently set up to loop indefinitely to dump data in 1 minute cycles. # # command line syntax perl dumpflat.pl > ntopflat.txt # # Each record Line contains all associated elements unwrapped by concatenating the hash key names. # Currently there are 163 identified keys. # The first line written is the delineated element name list. This will be 3000-4000 characters. # Subsequent lines contain the delineated element values. # # Field element order is fixed by the order in the "@flatkeys" definition. # # Any new fields encountered not in the "@flatkeys" definition are # appended to the end of the record as "key=value" pairs. # These may be subsequently added to the "@flatkeys" definition. # use LWP::Simple; $ntopHost = "localhost"; $ntopPort = 3000; $URL = "http://".$ntopHost.":".$ntopPort."/dumpData.html?language=perl"; $delimiter = "|"; #field delimiter # Define all of the fields used as a key. (See ntop emitter.c for key names. Search on "el->" to find key assignments.) # Keys are flattened from hierarchical version by concatenating keys level names. 163 keys. @flatkeys = qw(PRIMARY DUMPTIME hostNumIpAddress hostSymIpAddress firstSeen lastSeen minTTL maxTTL nbHostName nbDescr nbDomainName nbNodeType atNodeName atNetwork atNode ipxHostName pktSent pktReceived pktBroadcastSent bytesBroadcastSent pktMulticastSent pktMulticastRcvd bytesMulticastSent bytesSent bytesReceived bytesSentLocally bytesReceivedLocally bytesSentRemotely bytesReceivedFromRemote actualSentThpt actualRcvdThpt lastHourSentThpt lastHourRcvdThpt averageSentThpt averageRcvdThpt peakSentThpt peakRcvdThpt actualSentPktThpt actualRcvdPktThpt averageSentPktThpt averageRcvdPktThpt peakRcvdPktThpt tcpSentLocally tcpReceivedLocally tcpSentRemotely tcpReceivedFromRemote udpSentLocally udpReceivedLocally udpSentRemotely udpReceivedFromRemote icmpSent icmpReceived ospfSent ospfReceived igmpSent igmpReceived arp_rarpSent arp_rarpReceived appletalkSent appletalkReceived decnetSent decnetReceived dlcSent dlcReceived icmpMsgSent icmpMsgRcvd stpSent stpRcvd ipxSent ipxReceived netbiosSent netbiosReceived osiSent osiReceived pktDuplicatedAckSent pktDuplicatedAckRcvd qnxSent qnxReceived otherSent otherReceived securityHostPkts_synPktsSent securityHostPkts_synPktsRcvd securityHostPkts_rstPktsSent securityHostPkts_rstPktsRcvd securityHostPkts_rstAckPktsSent securityHostPkts_rstAckPktsRcvd IP_FTP_sentLocally IP_FTP_receivedLocally IP_FTP_sentRemotely IP_FTP_receivedFromRemote IP_HTTP_sentLocally IP_HTTP_receivedLocally IP_HTTP_sentRemotely IP_HTTP_receivedFromRemote IP_DNS_sentLocally IP_DNS_receivedLocally IP_DNS_sentRemotely IP_DNS_receivedFromRemote IP_Telnet_sentLocally IP_Telnet_receivedLocally IP_Telnet_sentRemotely IP_Telnet_receivedFromRemote IP_NBios-IP_sentLocally IP_NBios-IP_receivedLocally IP_NBios-IP_sentRemotely IP_NBios-IP_receivedFromRemote IP_Mail_sentLocally IP_Mail_receivedLocally IP_Mail_sentRemotely IP_Mail_receivedFromRemote IP_SNMP_sentLocally IP_SNMP_receivedLocally IP_SNMP_sentRemotely IP_SNMP_receivedFromRemote IP_NFS_sentLocally IP_NFS_receivedLocally IP_NFS_sentRemotely IP_NFS_receivedFromRemote IP_X11_sentLocally IP_X11_receivedLocally IP_X11_sentRemotely IP_X11_receivedFromRemote IP_SSH_sentLocally IP_SSH_receivedLocally IP_SSH_sentRemotely IP_SSH_receivedFromRemote IP_NEWS_sentLocally IP_NEWS_receivedLocally IP_NEWS_sentRemotely IP_NEWS_receivedFromRemote SENT_ICMP_ECHO SENT_ICMP_ECHOREPLY SENT_ICMP_UNREACH RCVD_ICMP_ECHO RCVD_ICMP_ECHOREPLY RCVD_ICMP_UNREACH securityPkts_synPktsSent securityPkts_synPktsRcvd securityPkts_rstPktsSent securityPkts_rstPktsRcvd securityPkts_rstAckPktsSent securityPkts_rstAckPktsRcvd securityPkts_synFinPktsSent securityPkts_synFinPktsRcvd securityPkts_finPushUrgPktsSent securityPkts_finPushUrgPktsRcvd securityPkts_nullPktsSent securityPkts_nullPktsRcvd securityPkts_ackScanSent securityPkts_ackScanRcvd securityPkts_xmasScanSent securityPkts_xmasScanRcvd securityPkts_finScanSent securityPkts_finScanRcvd securityPkts_nullScanSent securityPkts_nullScanRcvd securityPkts_rejectedTCPConnSent securityPkts_rejectedTCPConnRcvd securityPkts_establishedTCPConnSent securityPkts_establishedTCPConnRcvd securityPkts_udpToClosedPortSent securityPkts_udpToClosedPortRcvd ethAddressString); #Print a header line $outstring =""; foreach $key (@flatkeys){ $outstring = $outstring.$key.$delimiter;} print $outstring."\n"; $runloop = 1; while ($runloop){ #perpetual loop? # $runloop = 0; #No, just once! uncomment to run just once. $content = ""; $content = get($URL); if($content eq "") { print "No data. Please make sure ntop is up and running\n"; } else { # evaluate the hash table %ntopHash = eval($content); $recordString = ""; #clear record string # %ntopHash is a hierarchical complex hash of the received entries # Walk through all of the keys and build a flat file while (($key, $value) = each %ntopHash) { if ($recordString ne '') { print $recordString."\n"; #output previous record $recordString = ''; #initialize new record to empty undef %flathash; #clear any leftover hash keys and contents @flathash{@flatkeys} =("") x @flatkeys; #initialize a non-heirarchical hash to empty contents. } #Primary record Starts $flathash{'PRIMARY'} = $key; #PRIMARY record key value is the level 1 key name. (usually IP but sometimes ethernet for local hosts) ($Second, $Minute, $Hour,$Day,$Month, $Year) = gmtime(time); if ($Second < 10) {$Second = "0".$Second;} if ($Minute < 10) {$Minute = "0".$Minute;} if ($Hour < 10) {$Hour = "0".$Hour;} if ($Day < 10) {$Day = "0".$Day;} $Month = $Month + 1; if ($Month < 10) {$Month = "0".$Month;} $Year = $Year + 1900; $timestring = $Year."-".$Month."-".$Day."-".$Hour.":".$Minute.":".$Second; $flathash{'DUMPTIME'} = $timestring; #Timestamp of dump request. YYYY-MM-DD-hh:mm:ss $finalvalue = $value; #value is alway empty or a hash %hash2 = %$value; while (($key2, $value2) = each %hash2) { $finalvalue = $value2; #Hold value2 as it may or may not be another hash key # print "(2K) ".$key2."\n"; %hash3 = %$value2; while (($key3, $value3) = each %hash3) { $finalvalue = $value3; #Hold value3 as it may or may not be another hash key # print "(3K) ".$key3."\n"; %hash4 = %$value3; while (($key4, $value4) = each %hash4) { $finalvalue = $value4; #value 4 is never a hash key. Maximum nest depth. $flathash{$key2."_".$key3."_".$key4} = $finalvalue; #flathash key is concatenated hierarchical keys 2,3,&4 with underscores. $finalvalue = ""; #clear for coming up from nested hierarchy. } if ($finalvalue ne '' && index($finalvalue, 'HASH(0x') < 0) { $flathash{$key2."_".$key3} = $finalvalue; #flathash key is concatenated hierarchical keys 2&3 with underscores. $finalvalue = ""; #clear for coming up from nested hierarchy. } } if ($finalvalue ne '' && index($finalvalue, 'HASH(0x') < 0) { $flathash{$key2} = $finalvalue; #flathash key is hierarchical keys 2. $finalvalue = ""; #clear for coming up from nested hierarchy. } } # Build record string. End of primary loop, construct a record string. foreach $key (@flatkeys){ $recordString = $recordString.$flathash{$key}.$delimiter; #fixed order record. delete $flathash{$key}; #remove each key after use to look for unaccounted for keys. } while (($keyX, $valueX) = each %flathash) { if (index($valueX, 'HASH(0x') < 0) { #eliminate null hash keys $recordString = $recordString.$keyX."=".$valueX.$delimiter; #append any unaccounted keys and values. } } } if ($recordString ne '') { print $recordString."\n"; #output last record $recordString = ''; #initialize new record to empty @flathash{@flatkeys} =("") x @flatkeys; #initialize a non-heirarchical hash to empty contents. } } if ($runloop){sleep 60;} #dump on 1 minute intervals. Don't wait to quit. # Debug # print "\n\n==========================\n"; # print $content."\n"; # print "\n\n==========================\n"; } #end perpetual loop ntop-5.0.1+dfsg1/www/Perl/mapper.pl0000755000000000000000000002341111417252015015544 0ustar rootroot#!/usr/bin/perl -w # ========================================================================== # mapper.pl # # A helper script to show host geographical position in ntop. A heavily- # modified version of www/Perl/mapper.pl to use www.geoplugin.net/xml.gp # intead of (the apparently defunct) netgeo.caida.org/perl/netgeo.cgi. # # Unfortunately this script is heavy on dependencies, but fortunately # those should be part of most standard Perl toolkits: Data::Dumper, # CGI.pm, LWP::Simple, and XML::Simple. # # Bugs: # * Error reporting is pretty non-specific, although most requests for # external resources (e.g., API calls) should generate errors in the # vicinity of where the attempt was made # * Since I'm using CGI.pm anyway, the URL parameter processing could # be done a lot more cleanly with CGI.pm. # # TODO: # * Move any hard-coded URLs or "interesting"/configurable API # parameters to the top of the script where they can be easily # seen and modified. # * This script could do its work in a hundred fewer lines... # * Script needs more useful $DEBUGGING statements, if any at all. # # Author(s): Kevin M. Ernst , July 2010 # Luca Deri , 2001 # as well as several other contributors # # Older copyright notices and most of the original comments are left # intact, below. Any contributions made by Kevin Ernst may be considered # to be in the public domain, or under Luca's original license, whatever # that may have been. # # ========================================================================== # # Copyright (C) 2001 Luca Deri # # http://www.ntop.org/ # # Description: # # This is a simple program that returns a GIF about # a host location # # October 2001 # # NOTE # The URL format changed: # http://146.101.249.88/p/browse.cgi?scale=500000&lon=10.40&lat=43.72&width=320&height=200 use LWP::Simple; use CGI qw(:standard :html3 div); # div isn't strictly supported by CGI.pm use Data::Dumper; use XML::Simple; use strict; my $DEBUGGING = 0; my $SCRIPTNAME = `basename $0`; my $DEBUGHOST = "212.171.49.54"; my $MAPSCALE = 2000000; my $css = <$duringcallto" . "().

\nSorry it didn't work out."); } # fatal_error # Generic routine to produce sort-of-nice-looking HTML error pages: sub emit_error_html { my ($severity, $title, $message, @explanation) = @_; # $type can either be "warning" or "fatal" (like, "this is never supposed # to happen"-fatal) print header('text/html'), start_html(-title=>$title, -style=>{-code=>$css}, -id=>'content'); for ($severity) { #/benign/ and do { print div({-class=>'note'}, $message); last; ); /fatal/ and do { print div({-class=>'fatal'}, $message); last; }; /warn/ and do { print div({-class=>'warn'}, $message); last; }; # else print div({-class=>'fatal'}, "SCRIPT ERROR LINE #" . __LINE__); @explanation = "A bad value was passed to emit_error_html().
\n" . "This should never happen."; } #for print p({-class=>'explanation'}, @explanation), end_html(); } # emit_error_html # Process the query string and isolate just the target host part: # (TODO: this should be rewritten to use CGI.pm, while we're at it...) sub extract_host_from_query_string { my ($i, %in, @in, $key, $val, $theHost); if($ENV{QUERY_STRING_UNESCAPED} ne "") { # Remove backslashes $ENV{QUERY_STRING_UNESCAPED} =~ s/\\//g; @in = split(/[&;]/,$ENV{QUERY_STRING_UNESCAPED}); } else { @in = split(/[&;]/,$ENV{QUERY_STRING}); } foreach $i (0 .. $#in) { # Convert plus to space $in[$i] =~ s/\+/ /g; # Split into key and value. ($key, $val) = split(/=/,$in[$i],2); # splits on the first =. # Convert %XX from hex numbers to alphanumeric $key =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge; $val =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge; # Associate key and value $in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator $in{$key} .= $val; } $theHost = $in{host}; # First of all, this shouldn't happen because 'ntop' should pass the # correct arguments to us. if($theHost eq "") { #$theHost = "131.114.21.10"; #$theHost = "17.254.0.91"; # kernst 2010-07-01: This is now an error, unless we're $DEBUGGING: if ($DEBUGGING) { $theHost = $DEBUGHOST; } else { return; # bad exit status, emit_error_html will handle # returns 'undef' in scalar context, or '()' (empty list) # in list context. See Cookbook #10.10. } } return $theHost; } # sub process_query_string # Isolate just the IP address part for further processing: sub isolate_ip_addr { my $theHost = $_[0]; # first and only argument my ($item, @arr); # 17.08.2008 Ramon Schenkel # Removes the domain to separate the IP-address: # split by @ char and store in array @arr = split (/@/, $theHost); # print each element of array foreach $item (@arr) { # drop the domain name $theHost=$item; } return $theHost; } # sub isolate_ip_addr # Returns an array (list) in order of (lat, long) given an IP as $_[0]: sub give_ip_latlong { my $theHost = $_[0]; my ($answer, $GEOURL, $geoxml); # The NetGeo service at caida.org doesn't work anymore. (At least on July # 1st, 2010 it didn't. Not for me.) #$URL = "http://netgeo.caida.org/perl/netgeo.cgi?target=" . # $theHost . "&method=getLatLong&nonblocking=true"; # Use geoplugin.net instead: $GEOURL = "http://www.geoplugin.net/xml.gp?ip=$theHost"; # TODO: move this to the top of the script with the rest of the globals. # Try to retrieve and parse the results as XML: unless ($answer = get($GEOURL)) { return }; $geoxml = eval { XMLin($answer) }; return if $@; # This is supposed to bomb out on badly-formed XML... # I hope it works... if ($DEBUGGING) { print Dumper($geoxml); } if($geoxml eq "") { #print "ERROR: Nothing returned from geoplugin.net.\n"; return; } elsif(not exists $geoxml->{geoplugin_latitude}) { # Whatever got returned wasn't the XML we were looking for. # Probably the stupid ISP hijacked the error page (looking at you, # RoadRunner).... return; } else { # Parse the old netgeo.caida.org output. This isn't used any more, but # I'm leaving the code and comments intact for posterity (kernst). # now let's print the raw output #@rows = split(/\n/, $content); #for($i=0; $i<$#rows; $i++) { # if($DEBUGGING) { # print $i.") ".$rows[$i]."\n"; # } # if($rows[$i] =~ /(\S*):( *)(.*)
/) { # #print $1." = ".$3. "\n"; # $elem{$1} = $3; # } #} # Return (lat, long) in list context: if (!$DEBUGGING) { return (sprintf("%0.2f", $geoxml->{geoplugin_latitude}), sprintf("%0.2f", $geoxml->{geoplugin_longitude})); } else { print "geoplugin.net returned the following for $theHost:\n"; print " lat = $geoxml->{geoplugin_latitude}\n"; print " long = $geoxml->{geoplugin_longitude}\n\n"; print "\$GEOURL = $GEOURL\n"; } } } # give_ip_latlong # Returns image/gif for the given lat/long: sub emit_map_graphic { my ($lat, $long) = @_; my ($MAPURL, $map); # Whatever this was, it probably hasn't worked since 2001... # $URL1 = "http://146.101.249.88/M4/gif.cgi?scale=500000&lon=" . # $elem{LONG} . "&lat=" . $elem{LAT} . "&width=320&height=200"; # Fix courtesy of $MAPURL = "http://www.multimap.com/map/gif.cgi?scale=$MAPSCALE" . '&db=ap&overviewmap=ap&lon=' . $long . '&lat=' . $lat . '&width=320&height=200&icon=blue'; # TODO: move this to the top of the script with the rest of the globals. if(!$DEBUGGING) { $map = get($MAPURL) || return; unless (is_a_valid_gif($map)) { return }; print "Content-type: image/gif\n\n"; print $map; } else { print "\$MAPURL = $MAPURL\n\n"; } } #sub emit_map_graphic # Sniff the first few bytes of a data stream to determine if what got # returned is a genuine GIF87/89 file, or something like an "Error 404": sub is_a_valid_gif { my $content = $_[0]; $content =~ /^GIF8/ ? return 1 : return; } # is_a_valid_gif # End of mapper.pl ntop-5.0.1+dfsg1/www/Perl/remoteClient.pl0000755000000000000000000000142707414541016016721 0ustar rootroot#!/usr/bin/perl # # Copyright (C) 2001 Luca Deri # # http://www.ntop.org/ # # # Description: # # This is a simple program that shows how to # fetch information out of ntop # # January 2001 # use LWP::Simple; $ntopHost = "localhost"; $ntopPort = 3000; $URL = "http://".$ntopHost.":".$ntopPort."/dumpData.html?language=perl"; $content = get($URL); if($content eq "") { print "No data. Please make sure ntop is up and running\n"; } else { # evaluate the hash table %hash = eval($content); # %hash now contains the received entries while (($key, $value) = each %hash) { print $key."\n"; } # now let's print the raw output print "==========================\n"; print $content."\n"; print "==========================\n"; } ntop-5.0.1+dfsg1/www/README0000644000000000000000000000236207512451770013712 0ustar rootrootThis directory contains some examples that allow you to extract data out of ntop. If you want you can build ntop as "configure --enable-micro-ntop" if you don't want to include the full web interface that's not necessary for the enclosed code. Regardless of the used programming language (currently PHP and Perl are supported) your application can access two URLs (1) dumpData.html http://:/dumpData.html?language= (2) dumpTrafficData.html http://:/dumpTrafficData.html?language= URL (1) will define the %hash array that contains information about the active hosts. URL (2) will define the %interfaces array that contains information about the active network interfaces. NOTE To both URL's it's possible to add key= for returning data that's related only to the specified key. For instance http://:/dumpTrafficData.html?language=perl&key=eth0 returns information related to the eth0 interface only. Example In former ntop versions, users could use the -l flag to periodically generate a file that contains traffic statistics information. This functionality has been replaced using this new API. --------------- Luca Deri - January 2001 ntop-5.0.1+dfsg1/www/PHP/0000755000000000000000000000000012012127266013445 5ustar rootrootntop-5.0.1+dfsg1/www/PHP/index.html0000644000000000000000000000456507414541016015457 0ustar rootroot

Search Active Hosts

Ntop Host:Port:

Show Interface Stats

Ntop Host:Port:

Show Sessions

Ntop Host:Port:
Protocol

© 2001 by Luca Deri
ntop-5.0.1+dfsg1/www/PHP/sessions.php0000644000000000000000000000356607414541016016041 0ustar rootroot /style.css type="text/css"> \n"; } else { $outStr = ""; fputs ($fp, "GET /dumpSessionsData.html?language=php&proto=$proto HTTP/1.0\r\n\r\n"); while (!feof($fp)) { $out = fgets($fp,128); if($out == "\n") $begin = 1; else if($begin == 1) $outStr .= $out; } fclose ($fp); #echo "
$outStr
"; eval($outStr); } echo "
\n\n"; echo "\n"; while (list ($key, $val) = each($ntopHash)) { echo "\n"; echo "\n"; } echo "
SessionsValues
$key\n"; while (list ($key_1, $val_1) = each ($val)) if(gettype($val_1) == "array") { echo "\n"; } else if($val_1 != "0") { if($key_1 == "sessionState") { if($val_1 == 0) $val2 = "SYN"; else if($val_1 == 1) $val2 = "SYN_ACK"; else if($val_1 == 2) $val2 = "ACTIVE"; else if($val_1 == 3) $val2 = "FIN1_ACK0"; else if($val_1 == 4) $val2 = "FIN1_ACK1"; else if($val_1 == 5) $val2 = "FIN2_ACK0"; else if($val_1 == 6) $val2 = "FIN2_ACK1"; else if($val_1 == 7) $val2 = "FIN2_ACK2"; else if($val_1 == 8) $val2 = "TIMEOUT"; else if($val_1 == 9) $val2 = "END"; echo "\n"; } else echo "\n"; } echo "
$key_1\n"; while (list ($key_2, $val_2) = each ($val_1)) { echo "\n"; } echo "
$key_2 $val_2
$key_1 $val2
$key_1 $val_1
\n"; // echo "
$outStr
";
?>


ntop-5.0.1+dfsg1/www/PHP/doSearch.php0000644000000000000000000000364107414541016015715 0ustar rootroot /style.css type="text/css"> \n"; } else { $outStr = ""; fputs ($fp, "GET /dumpData.html?language=php HTTP/1.0\r\n\r\n"); while (!feof($fp)) { $out = fgets($fp,128); if($out == "\n") $begin = 1; else if($begin == 1) $outStr .= $out; } fclose ($fp); eval($outStr); } // echo count($$ntopHash); echo "
\n\n"; echo "\n"; $match1 = "^".$val_1; $match2 = $val_1; $match3 = $val_1."$"; //echo "$crit_1 - $oper_1 ->".$val_1."<-\n
"; while(list($key, $val) = each($$ntopHash)) { //echo "eregi($val[$crit_1]) = ".eregi($match1, $val[$crit_1])."
\n"; if((($oper_1 == "lt") && ($val[$crit_1] != "") && ($val[$crit_1] < $val_1)) || (($oper_1 == "gt") && ($val[$crit_1] != "") && ($val[$crit_1] > $val_1)) || (($oper_1 == "eq") && ($val[$crit_1] != "") && ($val[$crit_1] == $val_1)) || (($oper_1 == "startsWith") && ($val[$crit_1] != "") && (eregi($match1, $val[$crit_1]))) || (($oper_1 == "contains") && ($val[$crit_1] != "") && (eregi($match2, $val[$crit_1]))) || (($oper_1 == "doesntContain") && ($val[$crit_1] != "") && (!eregi($match2, $val[$crit_1]))) || (($oper_1 == "endsWith") && ($val[$crit_1] != "") && (eregi($match3, $val[$crit_1]))) ) { $url = "http://$host:$port/".ereg_replace(":", "_", $key).".html"; echo ""; echo "\n"; } } echo "
HostValues
$key\n"; while (list ($key_1, $val_1) = each ($val)) if($val_1 != "0") echo ""; echo "
$key_1$val_1
\n"; // echo "
$outStr
";
?>


ntop-5.0.1+dfsg1/www/PHP/ifStats.php0000644000000000000000000000245007414541016015577 0ustar rootroot /style.css type="text/css"> \n"; } else { $outStr = ""; fputs ($fp, "GET /dumpTrafficData.html?language=php HTTP/1.0\r\n\r\n"); while (!feof($fp)) { $out = fgets($fp,128); if($out == "\n") $begin = 1; else if($begin == 1) $outStr .= $out; } fclose ($fp); //echo "
$outStr
"; eval($outStr); } echo "
\n\n"; echo "\n"; while (list ($key, $val) = each($ntopHash)) { echo "\n"; echo "\n"; } echo "
InterfaceValues
$key\n"; while (list ($key_1, $val_1) = each ($val)) if(gettype($val_1) == "array") { echo "\n"; } else if($val_1 != "0") echo "\n"; echo "
$key_1\n"; while (list ($key_2, $val_2) = each ($val_1)) { echo "\n"; } echo "
$key_2 $val_2
$key_1 $val_1
\n"; // echo "
$outStr
";
?>


ntop-5.0.1+dfsg1/www/Python/0000755000000000000000000000000012012127266014277 5ustar rootrootntop-5.0.1+dfsg1/www/Python/ntopTest.py0000644000000000000000000000136707542305502016503 0ustar rootroot#!/usr/bin/env python import urllib, time URL = "http://localhost:3000/dumpData.html?language=python" print "Getting NTop stats in Python format" statsText = '' attempt = 1 # NTop takes a while to build the stats while not statsText.count("hostNumIpAddress"): print "Attempt #" + str(attempt) try: statsText = urllib.urlopen(URL).read() except IOError: "NTop timed out, is it active?" assert statsText.count("ntopDict"), \ "ntopDict not in output" assert attempt < 100, \ "Could not get stats from NTop" attempt += 1 # give it a little while time.sleep(2) try: exec(statsText) except: print "Problems interpreting the stats" else: print "Found stats for the following hosts:" for host in ntopDict.keys(): print host print "All done." ntop-5.0.1+dfsg1/www/FILES0000644000000000000000000000031607414541016013606 0ustar rootrootwww www/FILES www/README www/PHP/ www/PHP/index.html www/PHP/ifStats.php www/PHP/doSearch.php www/PHP/sessions.php www/Perl/ www/Perl/remoteClient.pl www/Perl/dumpFlat.pl www/Perl/mapper.pl www/Perl/nClientntop-5.0.1+dfsg1/ip.c0000644000000000000000000013347312010426113012750 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * http://www.ntop.org * * Copyright (C) 1998-2012 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" /* ***************************************** */ static u_char ethBroadcast[] = { 255, 255, 255, 255, 255, 255 }; /* ***************************************** */ /* Fingerprint code courtesy of ettercap http://ettercap.sourceforge.net */ static u_char TTL_PREDICTOR(u_char x) /* coded by awgn */ { /* round the TTL to the nearest power of 2 (ceiling) */ register u_char i = x; register u_char j = 1; register u_char c = 0; do { c += i & 1; j <<= 1; } while ( i >>= 1 ); if( c == 1 ) return x; else return ( j ? j : 0xff ); } /* ************************************ */ static void updateRoutedTraffic(HostTraffic *router, Counter bytes) { if(router != NULL) { if(router->routedTraffic == NULL) { int mallocLen = sizeof(RoutingCounter); router->routedTraffic = (RoutingCounter*)malloc(mallocLen); if(router->routedTraffic == NULL) return; memset(router->routedTraffic, 0, mallocLen); } if(router->routedTraffic != NULL) { /* malloc() didn't fail */ incrementTrafficCounter(&router->routedTraffic->routedPkts, 1); incrementTrafficCounter(&router->routedTraffic->routedBytes, bytes); } } } /* ************************************ */ static void updateDevicePacketTTLStats(u_int ttl, int actualDeviceId) { if(ttl <= 32) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktTTLStats.upTo32, 1); else if(ttl <= 64) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktTTLStats.upTo64, 1); else if(ttl <= 96) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktTTLStats.upTo96, 1); else if(ttl <= 128) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktTTLStats.upTo128, 1); else if(ttl <= 160) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktTTLStats.upTo160, 1); else if(ttl <= 192) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktTTLStats.upTo192, 1); else if(ttl <= 224) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktTTLStats.upTo224, 1); else incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktTTLStats.upTo255, 1); } /* ************************************ */ static void checkNetworkRouter(HostTraffic *srcHost, HostTraffic *dstHost, u_char *ether_dst, int actualDeviceId, Counter bytes, const struct pcap_pkthdr *h, const u_char *p) { if(ether_dst == NULL) return; if((subnetLocalHost(srcHost) && (!subnetLocalHost(dstHost)) && (!broadcastHost(dstHost)) && (!multicastHost(dstHost))) || (subnetLocalHost(dstHost) && (!subnetLocalHost(srcHost)) && (!broadcastHost(srcHost)) && (!multicastHost(srcHost)))) { HostTraffic *router = lookupHost(NULL, ether_dst, srcHost->vlanId, 0, 0, actualDeviceId, h, p); if(router == NULL) return; if(((router->hostNumIpAddress[0] != '\0') && (broadcastHost(router) || multicastHost(router) || (!subnetLocalHost(router)) /* No IP: is this a special Multicast address ? */)) || (addrcmp(&router->hostIpAddress,&dstHost->hostIpAddress) == 0) || (memcmp(router->ethAddress, dstHost->ethAddress, LEN_ETHERNET_ADDRESS) == 0) ) return; #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "(%s/%s/%s) -> (%s/%s/%s) routed by [%s/%s/%s]", srcHost->ethAddressString, srcHost->hostNumIpAddress, srcHost->hostResolvedName, dstHost->ethAddressString, dstHost->hostNumIpAddress, dstHost->hostResolvedName, router->ethAddressString, router->hostNumIpAddress, router->hostResolvedName); #endif setHostFlag(FLAG_GATEWAY_HOST, router); updateRoutedTraffic(router, bytes); } } /* ************************************ */ void processIpPkt(const u_char *bp, /* Pointer to IP */ const struct pcap_pkthdr *h, const u_char *p, /* Original packet */ u_int ip_offset, u_int length, u_char *ether_src, u_char *ether_dst, int actualDeviceId, int vlanId) { u_short sport=0, dport=0; struct ip ip; struct ip6_hdr *ip6; struct icmp6_hdr icmp6Pkt; u_int advance = 0; u_char *cp = NULL; u_char *snapend = NULL; u_int icmp6len = 0; u_int nh; int fragmented = 0; struct tcphdr tp; struct udphdr up; struct icmp icmpPkt; u_int hlen, ip_len, tcpDataLength, udpDataLength, off=0, tcpUdpLen, idx; HostTraffic *srcHost=NULL, *dstHost=NULL; HostAddr srcAddr, dstAddr; /* Protocol Independent addresses */ u_char forceUsingIPaddress = 0; struct timeval tvstrct; u_char *theData, found = 0; TrafficCounter ctr; ProtocolsList *protoList; u_short newSession = 0; u_short nonFullyRemoteSession = 1; /* Need to copy this over in case bp isn't properly aligned. * This occurs on SunOS 4.x at least. * * Paul D. Smith */ memcpy(&ip, bp, sizeof(struct ip)); /* TODO: isipv6 = (ip.ip_v == 6)?1:0; */ if(ip.ip_v == 6) { /* handle IPv6 packets */ ip6 = (struct ip6_hdr *)bp; } else ip6 = NULL; if(ip6) hlen = sizeof(struct ip6_hdr); else hlen = (u_int)ip.ip_hl * 4; incrementTrafficCounter(&myGlobals.device[actualDeviceId].ipPkts, 1); /* Fix below courtesy of Christian Hammers */ if(ip6) incrementTrafficCounter(&myGlobals.device[actualDeviceId].ipv6Bytes, length /* ntohs(ip.ip_len) */); else incrementTrafficCounter(&myGlobals.device[actualDeviceId].ipv4Bytes, length /* ntohs(ip.ip_len) */); if(ip6 == NULL) { if(ip.ip_p == CONST_GRE_PROTOCOL_TYPE) { /* Cisco GRE (Generic Routing Encapsulation) Tunnels (RFC 1701, 1702) */ GreTunnel tunnel; PPPTunnelHeader pppTHeader; memcpy(&tunnel, bp+hlen, sizeof(GreTunnel)); switch(ntohs(tunnel.protocol)) { case CONST_PPP_PROTOCOL_TYPE: memcpy(&pppTHeader, bp+hlen+sizeof(GreTunnel), sizeof(PPPTunnelHeader)); if(ntohs(pppTHeader.protocol) == 0x21 /* IP */) { memcpy(&ip, bp+hlen+sizeof(GreTunnel)+sizeof(PPPTunnelHeader), sizeof(struct ip)); hlen = (u_int)ip.ip_hl * 4; ether_src = NULL, ether_dst = NULL; } break; case ETHERTYPE_IP: memcpy(&ip, bp+hlen+4 /* 4 is the size of the GRE header */, sizeof(struct ip)); hlen = (u_int)ip.ip_hl * 4; ether_src = NULL, ether_dst = NULL; break; } } } if((ether_src == NULL) && (ether_dst == NULL)) { /* Ethernet-less protocols (e.g. PPP/RAW IP) */ forceUsingIPaddress = 1; } if(ip6) { addrput(AF_INET6, &srcAddr, &ip6->ip6_src); addrput(AF_INET6, &dstAddr, &ip6->ip6_dst); } else { NTOHL(ip.ip_dst.s_addr); NTOHL(ip.ip_src.s_addr); addrput(AF_INET, &srcAddr,&ip.ip_src.s_addr); addrput(AF_INET, &dstAddr,&ip.ip_dst.s_addr); } if(ip6 == NULL) { if(isBroadcastAddress(&dstAddr, NULL, NULL) && (ether_src != NULL) && (ether_dst != NULL) /* PPP has no ethernet */ && (memcmp(ether_dst, ethBroadcast, 6) != 0)) { /* forceUsingIPaddress = 1; */ srcHost = lookupHost(NULL, ether_src, vlanId, 0, 0, actualDeviceId, h, p); if(srcHost != NULL) { if(vlanId != NO_VLAN) srcHost->vlanId = vlanId; if(myGlobals.runningPref.enableSuspiciousPacketDump && (!hasWrongNetmask(srcHost))) { /* Dump the first packet only */ char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY]; traceEvent(CONST_TRACE_WARNING, "Host %s has a wrong netmask", etheraddr_string(ether_src, etherbuf)); dumpSuspiciousPacket(actualDeviceId, h, p); } setHostFlag(FLAG_HOST_WRONG_NETMASK, srcHost); } } } /* IMPORTANT: do NOT change the order of the lines below (see isBroadcastAddress call) */ dstHost = lookupHost(&dstAddr, ether_dst, vlanId, 1 , 0, actualDeviceId, h, p); if(dstHost == NULL) { /* Sanity check */ lowMemory(); return; } srcHost = lookupHost(&srcAddr, ether_src, vlanId, /* Don't check for multihoming when the destination address is a broadcast address */ (!isBroadcastAddress(&dstAddr, NULL, NULL)), forceUsingIPaddress, actualDeviceId, h, p); if(srcHost == NULL) { /* Sanity check */ lowMemory(); return; /* It might be that there's not enough memory that that dstHost = lookupHost(&ip.ip_dst, ether_dst) caused srcHost to be freed */ } if(vlanId != NO_VLAN) { srcHost->vlanId = vlanId; dstHost->vlanId = vlanId; } #ifdef DEBUG if(myGlobals.runningPref.rFileName != NULL) { static int numPkt=1; traceEvent(CONST_TRACE_INFO, "%d) %s -> %s", numPkt++, srcHost->hostNumIpAddress, dstHost->hostNumIpAddress); fflush(stdout); } #endif /* ****************** */ if(ip6) { updateDevicePacketTTLStats(ip6->ip6_hlim, actualDeviceId); if(ip6->ip6_hlim != 255) { if((srcHost->minTTL == 0) || (ip6->ip6_hlim < srcHost->minTTL)) srcHost->minTTL = ip6->ip6_hlim; if((ip6->ip6_hlim > srcHost->maxTTL)) srcHost->maxTTL = ip6->ip6_hlim; } } else { updateDevicePacketTTLStats(ip.ip_ttl, actualDeviceId); if(ip.ip_ttl != 255) { /* TTL can be calculated only when the packet is originated by the sender */ if((srcHost->minTTL == 0) || (ip.ip_ttl < srcHost->minTTL)) srcHost->minTTL = ip.ip_ttl; if((ip.ip_ttl > srcHost->maxTTL)) srcHost->maxTTL = ip.ip_ttl; } } ctr.value = h->len; updatePacketCount(srcHost, dstHost, ctr, 1, actualDeviceId); if(!myGlobals.device[actualDeviceId].dummyDevice) { checkNetworkRouter(srcHost, dstHost, ether_dst, actualDeviceId, length, h, p); ctr.value = length; } if(ip6) { incrementHostTrafficCounter(srcHost, ipv6BytesSent, length); incrementHostTrafficCounter(dstHost, ipv6BytesRcvd, length); } else { incrementHostTrafficCounter(srcHost, ipv4BytesSent, length); incrementHostTrafficCounter(dstHost, ipv4BytesRcvd, length); } if(subnetPseudoLocalHost(srcHost)) { if(subnetPseudoLocalHost(dstHost)) { incrementHostTrafficCounter(srcHost, bytesSentLoc, length); incrementHostTrafficCounter(dstHost, bytesRcvdLoc, length); } else { incrementHostTrafficCounter(srcHost, bytesSentRem, length); incrementHostTrafficCounter(dstHost, bytesRcvdLoc, length); } } else { /* srcHost is remote */ if(subnetPseudoLocalHost(dstHost)) { incrementHostTrafficCounter(srcHost, bytesSentLoc, length); incrementHostTrafficCounter(dstHost, bytesRcvdFromRem, length); } else { incrementHostTrafficCounter(srcHost, bytesSentRem, length); incrementHostTrafficCounter(dstHost, bytesRcvdFromRem, length); } } if(ip6) { if(ip6->ip6_nxt == IPPROTO_FRAGMENT) { fragmented = 1; nh = ip6->ip6_nxt; } } else { off = ntohs(ip.ip_off); if(off & 0x3fff) { fragmented = 1; nh = ip.ip_p; } } /* This is a fragment: fragment handling is handled by handleFragment() called below. Courtesy of Andreas Pfaller */ if(fragmented) { incrementTrafficCounter(&myGlobals.device[actualDeviceId].fragmentedIpBytes, length); switch(nh) { case IPPROTO_TCP: incrementHostTrafficCounter(srcHost, tcpFragmentsSent, length); incrementHostTrafficCounter(dstHost, tcpFragmentsRcvd, length); break; case IPPROTO_UDP: incrementHostTrafficCounter(srcHost, udpFragmentsSent, length); incrementHostTrafficCounter(dstHost, udpFragmentsRcvd, length); break; case IPPROTO_ICMP: incrementHostTrafficCounter(srcHost, icmpFragmentsSent, length); incrementHostTrafficCounter(dstHost, icmpFragmentsRcvd, length); break; case IPPROTO_GRE: incrementHostTrafficCounter(srcHost, greSent, length); incrementHostTrafficCounter(dstHost, greRcvd, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].greBytes, length); break; case IPPROTO_IPSEC_ESP: case IPPROTO_IPSEC_AH: incrementHostTrafficCounter(srcHost, ipsecSent, length); incrementHostTrafficCounter(dstHost, ipsecRcvd, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].ipsecBytes, length); break; case IPPROTO_ICMPV6: incrementHostTrafficCounter(srcHost, icmp6FragmentsSent, length); incrementHostTrafficCounter(dstHost, icmp6FragmentsRcvd, length); break; } } if(ip6) { advance = sizeof(struct ip6_hdr); cp = (unsigned char *) ip6; snapend = (unsigned char *)(bp+length); nh = ip6->ip6_nxt; ip_len = ntohs(ip6->ip6_plen); tcpUdpLen = ip_len; } else { nh = ip.ip_p; ip_len = ntohs(ip.ip_len); tcpUdpLen = ip_len - hlen; } loop: if(ip6) cp +=advance; switch(nh) { case IPPROTO_FRAGMENT: if(ip6) { advance = sizeof(struct ip6_frag); if(snapend <= cp+advance) goto end; nh = *cp; goto loop; } /* If it's no IPv6 we continue */ case IPPROTO_TCP: incrementTrafficCounter(&myGlobals.device[actualDeviceId].tcpBytes, length); if(tcpUdpLen < sizeof(struct tcphdr)) { if(myGlobals.runningPref.enableSuspiciousPacketDump) { traceEvent(CONST_TRACE_WARNING, "Malformed TCP pkt %s->%s detected (packet too short)", srcHost->hostResolvedName, dstHost->hostResolvedName); dumpSuspiciousPacket(actualDeviceId, h, p); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->malformedPktsSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->malformedPktsRcvd, srcHost, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].securityPkts.malformedPkts, 1); } } else { memcpy(&tp, bp+hlen, sizeof(struct tcphdr)); /* Sanity check */ if(tcpUdpLen >= (tp.th_off * 4)) { int diff; /* Real lenght if we captured the full packet */ tcpDataLength = tcpUdpLen - (tp.th_off * 4); /* Actual lenght scaled with caplen */ diff = h->caplen - (h->len - tcpDataLength); if(diff > 0) { tcpDataLength = diff; theData = (u_char*)(bp+hlen+(tp.th_off * 4)); } else { tcpDataLength = 0; theData = NULL; } } else { tcpDataLength = 0; theData = NULL; } sport = ntohs(tp.th_sport); dport = ntohs(tp.th_dport); if(srcHost->fingerprint == NULL) { char fingerprint[64] = { 0 } ; int WIN=0, MSS=-1, WS=-1, S=0, N=0, D=0, T=0; int ttl; char WSS[3] = { 0 }, _MSS[5] = { 0 }; struct tcphdr *tcp = (struct tcphdr*)(bp+hlen); u_char *tcp_opt = (u_char *)(tcp + 1); u_char *tcp_data = (u_char *)(bp + hlen + tp.th_off * 4); if(tcp->th_flags & TH_SYN) { /* only SYN or SYN-2ACK packets */ if(tcpUdpLen > 0) { if(ip6) { if(!fragmented) D = 1; } else if(ntohs(ip.ip_off) & IP_DF) D = 1; /* don't fragment bit is set */ WIN = ntohs(tcp->th_win); /* TCP window size */ if(tcp_data != tcp_opt) { /* there are some tcp_option to be parsed */ u_char *opt_start = tcp_opt, *opt_end = tcp_data; u_short num_loops = 0; while(opt_start < opt_end) { switch(opt_start[0]) { case TCPOPT_EOL: /* end option: exit */ opt_start = opt_end; break; case TCPOPT_NOP: N = 1; opt_start++; break; case TCPOPT_SACKOK: S = 1; opt_start += 2; break; case TCPOPT_MAXSEG: opt_start += 2; MSS = ntohs(ptohs(opt_start)); opt_start += 2; break; case TCPOPT_WSCALE: opt_start += 2; WS = *opt_start; opt_start++; break; case TCPOPT_TIMESTAMP: T = 1; opt_start++; opt_start += (*opt_start - 1); break; default: opt_start++; if(*opt_start > 0) opt_start += (*opt_start - 1); break; } num_loops++; if(num_loops > 16) { /* Suspicious packet: maybe the TCP options are wrong */ break; } } } if(WS == -1) safe_snprintf(__FILE__, __LINE__, WSS, sizeof(WSS), "WS"); else safe_snprintf(__FILE__, __LINE__, WSS, sizeof(WSS), "%02X", WS & 0xFFFF); if(MSS == -1) safe_snprintf(__FILE__, __LINE__, _MSS, sizeof(_MSS), "_MSS"); else safe_snprintf(__FILE__, __LINE__, _MSS, sizeof(_MSS), "%04X", MSS & 0xFFFFFFFF); safe_snprintf(__FILE__, __LINE__, fingerprint, sizeof(fingerprint), "%04X:%s:%02X:%s:%d:%d:%d:%d:%c:%02X", WIN, _MSS, ttl = TTL_PREDICTOR(ip.ip_ttl), WSS , S, N, D, T, (tcp->th_flags & TH_ACK) ? 'A' : 'S', tcpUdpLen); #if 0 traceEvent(CONST_TRACE_INFO, "[%s][%s]", srcHost->hostNumIpAddress, fingerprint); #endif srcHost->fingerprint = strdup(fingerprint); } } } if((sport > 0) || (dport > 0)) { /* It might be that tcpDataLength is 0 when the rcvd packet is fragmented and the main packet has not yet been rcvd */ updateInterfacePorts(actualDeviceId, sport, dport, length); if(tcpDataLength > 0) /* Don't update ports for all packets */ updateUsedPorts(srcHost, dstHost, sport, dport, tcpDataLength); if(subnetPseudoLocalHost(srcHost)) { if(subnetPseudoLocalHost(dstHost)) { incrementHostTrafficCounter(srcHost, tcpSentLoc, length); incrementHostTrafficCounter(dstHost, tcpRcvdLoc, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].tcpGlobalTrafficStats.local, length); } else { incrementHostTrafficCounter(srcHost, tcpSentRem, length); incrementHostTrafficCounter(dstHost, tcpRcvdLoc, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].tcpGlobalTrafficStats.local2remote, length); } } else { /* srcHost is remote */ if(subnetPseudoLocalHost(dstHost)) { incrementHostTrafficCounter(srcHost, tcpSentLoc, length); incrementHostTrafficCounter(dstHost, tcpRcvdFromRem, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].tcpGlobalTrafficStats.remote2local, length); } else { incrementHostTrafficCounter(srcHost, tcpSentRem, length); incrementHostTrafficCounter(dstHost, tcpRcvdFromRem, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].tcpGlobalTrafficStats.remote, length); nonFullyRemoteSession = 0; } } if(nonFullyRemoteSession) { if(ip6) handleSession(h, p, nh, fragmented, tp.th_win, srcHost, sport, dstHost, dport, ntohs(ip6->ip6_plen), 0, ip_offset, &tp, tcpDataLength, theData, actualDeviceId, &newSession, IPOQUE_PROTOCOL_UNKNOWN, 1); else handleSession(h, p, nh, (off & 0x3fff), tp.th_win, srcHost, sport, dstHost, dport, ip_len, 0, ip_offset, &tp, tcpDataLength, theData, actualDeviceId, &newSession, IPOQUE_PROTOCOL_UNKNOWN, 1); } } } if(ip6) goto end; else break; case IPPROTO_UDP: incrementTrafficCounter(&myGlobals.device[actualDeviceId].udpBytes, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].udpGlobalTrafficStats.totalFlows, 1); if(tcpUdpLen < sizeof(struct udphdr)) { if(myGlobals.runningPref.enableSuspiciousPacketDump) { traceEvent(CONST_TRACE_WARNING, "Malformed UDP pkt %s->%s detected (packet too short)", srcHost->hostResolvedName, dstHost->hostResolvedName); dumpSuspiciousPacket(actualDeviceId, h, p); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->malformedPktsSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->malformedPktsRcvd, srcHost, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].securityPkts.malformedPkts, 1); } } else { udpDataLength = (u_int)(tcpUdpLen - sizeof(struct udphdr)); memcpy(&up, bp+hlen, sizeof(struct udphdr)); sport = ntohs(up.uh_sport); dport = ntohs(up.uh_dport); if(!(fragmented)) { /* Not fragmented */ if(((sport == 53) || (dport == 53) /* domain */) || ((sport == 5353) && (dport == 5353)) /* Multicast DNS */) { short isRequest = 0, positiveReply = 0; u_int16_t transactionId = 0; if(myGlobals.runningPref.enablePacketDecoding && (bp != NULL) /* packet long enough */) { /* The DNS chain will be checked here */ transactionId = processDNSPacket(srcHost, sport, bp+hlen+sizeof(struct udphdr), udpDataLength, &isRequest, &positiveReply); #ifdef DNS_SNIFF_DEBUG traceEvent(CONST_TRACE_INFO, "DNS_SNIFF_DEBUG: %s:%d->%s:%d [request: %d][positive reply: %d]", srcHost->hostResolvedName, sport, dstHost->hostResolvedName, dport, isRequest, positiveReply); #endif allocHostTrafficCounterMemory(srcHost, protocolInfo, sizeof(ProtocolInfo)); allocHostTrafficCounterMemory(dstHost, protocolInfo, sizeof(ProtocolInfo)); if((srcHost->protocolInfo == NULL) || (dstHost->protocolInfo == NULL)) return; allocHostTrafficCounterMemory(srcHost, protocolInfo->dnsStats, sizeof(ServiceStats)); if(srcHost->protocolInfo->dnsStats == NULL) return; allocHostTrafficCounterMemory(dstHost, protocolInfo->dnsStats, sizeof(ServiceStats)); if(dstHost->protocolInfo->dnsStats == NULL) return; allocHostTrafficCounterMemory(srcHost, protocolInfo, sizeof(ProtocolInfo)); allocHostTrafficCounterMemory(srcHost, protocolInfo->dnsStats, sizeof(ServiceStats)); allocHostTrafficCounterMemory(dstHost, protocolInfo, sizeof(ProtocolInfo)); allocHostTrafficCounterMemory(dstHost, protocolInfo->dnsStats, sizeof(ServiceStats)); if(isRequest) { /* to be 64bit-proof we have to copy the elements */ tvstrct.tv_sec = h->ts.tv_sec; tvstrct.tv_usec = h->ts.tv_usec; addTimeMapping(transactionId, tvstrct); if(subnetLocalHost(dstHost)) { incrementHostTrafficCounter(srcHost, protocolInfo->dnsStats->numLocalReqSent, 1); } else { incrementHostTrafficCounter(srcHost, protocolInfo->dnsStats->numRemReqSent, 1); } if(subnetLocalHost(srcHost)) { incrementHostTrafficCounter(dstHost, protocolInfo->dnsStats->numLocalReqRcvd, 1); } else { incrementHostTrafficCounter(dstHost, protocolInfo->dnsStats->numRemReqRcvd, 1); } } else { time_t microSecTimeDiff; /* to be 64bit-safe we have to copy the elements */ tvstrct.tv_sec = h->ts.tv_sec; tvstrct.tv_usec = h->ts.tv_usec; microSecTimeDiff = getTimeMapping(transactionId, tvstrct); if(microSecTimeDiff > 0) { #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "TransactionId=0x%X [%.1f ms]", transactionId, ((float)microSecTimeDiff)/1000); #endif if(microSecTimeDiff > 0) { if(subnetLocalHost(dstHost)) { if((srcHost->protocolInfo->dnsStats->fastestMicrosecLocalReqServed == 0) || (microSecTimeDiff < srcHost->protocolInfo->dnsStats->fastestMicrosecLocalReqServed)) srcHost->protocolInfo->dnsStats->fastestMicrosecLocalReqServed = microSecTimeDiff; if(microSecTimeDiff > srcHost->protocolInfo->dnsStats->slowestMicrosecLocalReqServed) srcHost->protocolInfo->dnsStats->slowestMicrosecLocalReqServed = microSecTimeDiff; } else { if((srcHost->protocolInfo->dnsStats->fastestMicrosecRemReqServed == 0) || (microSecTimeDiff < srcHost->protocolInfo->dnsStats->fastestMicrosecRemReqServed)) srcHost->protocolInfo->dnsStats->fastestMicrosecRemReqServed = microSecTimeDiff; if(microSecTimeDiff > srcHost->protocolInfo->dnsStats->slowestMicrosecRemReqServed) srcHost->protocolInfo->dnsStats->slowestMicrosecRemReqServed = microSecTimeDiff; } if(subnetLocalHost(srcHost)) { if((dstHost->protocolInfo->dnsStats->fastestMicrosecLocalReqMade == 0) || (microSecTimeDiff < dstHost->protocolInfo->dnsStats->fastestMicrosecLocalReqMade)) dstHost->protocolInfo->dnsStats->fastestMicrosecLocalReqMade = microSecTimeDiff; if(microSecTimeDiff > dstHost->protocolInfo->dnsStats->slowestMicrosecLocalReqMade) dstHost->protocolInfo->dnsStats->slowestMicrosecLocalReqMade = microSecTimeDiff; } else { if((dstHost->protocolInfo->dnsStats->fastestMicrosecRemReqMade == 0) || (microSecTimeDiff < dstHost->protocolInfo->dnsStats->fastestMicrosecRemReqMade)) dstHost->protocolInfo->dnsStats->fastestMicrosecRemReqMade = microSecTimeDiff; if(microSecTimeDiff > dstHost->protocolInfo->dnsStats->slowestMicrosecRemReqMade) dstHost->protocolInfo->dnsStats->slowestMicrosecRemReqMade = microSecTimeDiff; } } else { #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "getTimeMapping(0x%X) failed for DNS", transactionId); #endif } } /* Courtesy of Roberto F. De Luca */ if(sport != 5353) setHostFlag(FLAG_NAME_SERVER_HOST, srcHost); if(positiveReply) { incrementHostTrafficCounter(srcHost, protocolInfo->dnsStats->numPositiveReplSent, 1); incrementHostTrafficCounter(dstHost, protocolInfo->dnsStats->numPositiveReplRcvd, 1); } else { incrementHostTrafficCounter(srcHost, protocolInfo->dnsStats->numNegativeReplSent, 1); incrementHostTrafficCounter(dstHost, protocolInfo->dnsStats->numNegativeReplRcvd, 1); } } } else { /* no packet decoding (let's speculate a bit) */ if(sport != 5353) setHostFlag(FLAG_NAME_SERVER_HOST, srcHost); } } else if(sport == 123) /* NTP */ { if(myGlobals.runningPref.enablePacketDecoding) { char *ntpPktPtr = (char*)bp+hlen+sizeof(struct udphdr); u_char ntpRole = ntpPktPtr[0] & 0x07; if(ntpRole == 4 /* NTP Server */) setHostFlag(FLAG_HOST_TYPE_SVC_NTP_SERVER, srcHost); } } else if(sport == 500) /* IPSEC IKE */ { incrementHostTrafficCounter(srcHost, ipsecSent, length); incrementHostTrafficCounter(dstHost, ipsecRcvd, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].ipsecBytes, length); } else { if(myGlobals.runningPref.enablePacketDecoding) handleNetbios(srcHost, dstHost, sport, dport, udpDataLength, bp, length, hlen); } } if((sport > 0) || (dport > 0)) { updateInterfacePorts(actualDeviceId, sport, dport, length); updateUsedPorts(srcHost, dstHost, sport, dport, udpDataLength); /* It might be that udpBytes is 0 when the rcvd packet is fragmented and the main packet has not yet been rcvd */ if(subnetPseudoLocalHost(srcHost)) { if(subnetPseudoLocalHost(dstHost)) { incrementHostTrafficCounter(srcHost, udpSentLoc, length); incrementHostTrafficCounter(dstHost, udpRcvdLoc, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].udpGlobalTrafficStats.local, length); } else { incrementHostTrafficCounter(srcHost, udpSentRem, length); incrementHostTrafficCounter(dstHost, udpRcvdLoc, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].udpGlobalTrafficStats.local2remote, length); } } else { /* srcHost is remote */ if(subnetPseudoLocalHost(dstHost)) { incrementHostTrafficCounter(srcHost, udpSentLoc, length); incrementHostTrafficCounter(dstHost, udpRcvdFromRem, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].udpGlobalTrafficStats.remote2local, length); } else { incrementHostTrafficCounter(srcHost, udpSentRem, length); incrementHostTrafficCounter(dstHost, udpRcvdFromRem, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].udpGlobalTrafficStats.remote, length); nonFullyRemoteSession = 0; } } /* if(nonFullyRemoteSession) */ { /* There is no session structure returned for UDP sessions */ if(ip6) handleSession(h, p, nh, fragmented, 0, srcHost, sport, dstHost, dport, ntohs(ip6->ip6_plen), 0, ip_offset, NULL, udpDataLength, (u_char*)(bp+hlen+sizeof(struct udphdr)), actualDeviceId, &newSession, IPOQUE_PROTOCOL_UNKNOWN, 1); else handleSession(h, p, nh, (off & 0x3fff), 0, srcHost, sport, dstHost, dport, ip_len, 0, ip_offset, NULL, udpDataLength, (u_char*)(bp+hlen+sizeof(struct udphdr)), actualDeviceId, &newSession, IPOQUE_PROTOCOL_UNKNOWN, 1); } newSession = 1; /* Trick to account flows anyway */ } } if(ip6) goto end; else break; case IPPROTO_ICMP: incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpBytes, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpGlobalTrafficStats.totalFlows, 1); if(tcpUdpLen < sizeof(struct icmp)) { if(myGlobals.runningPref.enableSuspiciousPacketDump) { traceEvent(CONST_TRACE_WARNING, "Malformed ICMP pkt %s->%s detected (packet too short)", srcHost->hostResolvedName, dstHost->hostResolvedName); dumpSuspiciousPacket(actualDeviceId, h, p); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->malformedPktsSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->malformedPktsRcvd, srcHost, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].securityPkts.malformedPkts, 1); } } else { memcpy(&icmpPkt, bp+hlen, sizeof(struct icmp)); incrementHostTrafficCounter(srcHost, icmpSent, length); incrementHostTrafficCounter(dstHost, icmpRcvd, length); if(off & 0x3fff) { char *fmt = "Detected ICMP fragment [%s -> %s] (network attack attempt?)"; incrementHostTrafficCounter(srcHost, icmpFragmentsSent, length); incrementHostTrafficCounter(dstHost, icmpFragmentsRcvd, length); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->icmpFragmentSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->icmpFragmentRcvd, srcHost, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].securityPkts.icmpFragment, 1); if(myGlobals.runningPref.enableSuspiciousPacketDump) { traceEvent(CONST_TRACE_WARNING, fmt, srcHost->hostResolvedName, dstHost->hostResolvedName); dumpSuspiciousPacket(actualDeviceId, h, p); } } /* ************************************************************* */ if(icmpPkt.icmp_type <= ICMP_MAXTYPE) { short dumpPacket = 1; allocHostTrafficCounterMemory(srcHost, icmpInfo, sizeof(IcmpHostInfo)); if(srcHost->icmpInfo == NULL) return; incrementHostTrafficCounter(srcHost, icmpInfo->icmpMsgSent[icmpPkt.icmp_type], 1); allocHostTrafficCounterMemory(dstHost, icmpInfo, sizeof(IcmpHostInfo)); if(dstHost->icmpInfo == NULL) return; incrementHostTrafficCounter(dstHost, icmpInfo->icmpMsgRcvd[icmpPkt.icmp_type], 1); switch (icmpPkt.icmp_type) { case ICMP_ECHOREPLY: case ICMP_ECHO: /* Do not log anything */ dumpPacket = 0; break; case ICMP_UNREACH: case ICMP_REDIRECT: case ICMP_ROUTERADVERT: case ICMP_TIMXCEED: case ICMP_PARAMPROB: case ICMP_MASKREPLY: case ICMP_MASKREQ: case ICMP_INFO_REQUEST: case ICMP_INFO_REPLY: case ICMP_TIMESTAMP: case ICMP_TIMESTAMPREPLY: case ICMP_SOURCE_QUENCH: if(myGlobals.runningPref.enableSuspiciousPacketDump) { dumpSuspiciousPacket(actualDeviceId, h, p); } break; } if(myGlobals.runningPref.enableSuspiciousPacketDump && dumpPacket) { if(!((icmpPkt.icmp_type == 3) && (icmpPkt.icmp_code == 3))) { /* Avoid to print twice the same message: - Detected ICMP msg (type=3/code=3) from lhost -> ahost - Host [ahost] sent UDP data to a closed port of host [lhost:10001] (scan attempt?) */ traceEvent(CONST_TRACE_INFO, "Detected ICMP msg [type=%s/code=%d] %s->%s", mapIcmpType(icmpPkt.icmp_type), icmpPkt.icmp_code, srcHost->hostResolvedName, dstHost->hostResolvedName); } } } /* ************************************************************* */ if(subnetPseudoLocalHost(srcHost)) if(subnetPseudoLocalHost(dstHost)) incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpGlobalTrafficStats.local, length); else incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpGlobalTrafficStats.local2remote, length); else /* srcHost is remote */ if(subnetPseudoLocalHost(dstHost)) incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpGlobalTrafficStats.remote2local, length); else incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpGlobalTrafficStats.remote, length); if(myGlobals.runningPref.enableSuspiciousPacketDump && (icmpPkt.icmp_type == ICMP_ECHO) && (broadcastHost(dstHost) || multicastHost(dstHost))) { traceEvent(CONST_TRACE_WARNING, "Smurf packet detected for host [%s->%s]", srcHost->hostResolvedName, dstHost->hostResolvedName); } else if(icmpPkt.icmp_type == ICMP_DEST_UNREACHABLE /* Destination Unreachable */) { struct ip *oip = &icmpPkt.icmp_ip; switch(icmpPkt.icmp_code) { case ICMP_UNREACH_PORT: /* Port Unreachable */ memcpy(&dport, ((u_char *)bp+hlen+30), sizeof(dport)); dport = ntohs(dport); switch (oip->ip_p) { case IPPROTO_TCP: if(myGlobals.runningPref.enableSuspiciousPacketDump) traceEvent(CONST_TRACE_WARNING, "Host [%s] sent TCP data to a closed port of host [%s:%d] (scan attempt?)", dstHost->hostResolvedName, srcHost->hostResolvedName, dport); /* Simulation of rejected TCP connection */ allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->rejectedTCPConnSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->rejectedTCPConnRcvd, srcHost, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].securityPkts.rejectedTCPConn, 1); break; case IPPROTO_UDP: if(myGlobals.runningPref.enableSuspiciousPacketDump) traceEvent(CONST_TRACE_WARNING, "Host [%s] sent UDP data to a closed port of host [%s:%d] (scan attempt?)", dstHost->hostResolvedName, srcHost->hostResolvedName, dport); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&dstHost->secHostPkts->udpToClosedPortSent, srcHost, actualDeviceId); incrementUsageCounter(&srcHost->secHostPkts->udpToClosedPortRcvd, dstHost, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].securityPkts.udpToClosedPort, 1); break; } allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->icmpPortUnreachSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->icmpPortUnreachRcvd, srcHost, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].securityPkts.icmpPortUnreach, 1); break; case ICMP_UNREACH_NET: case ICMP_UNREACH_HOST: allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->icmpHostNetUnreachSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->icmpHostNetUnreachRcvd, srcHost, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].securityPkts.icmpHostNetUnreach, 1); break; case ICMP_UNREACH_PROTOCOL: /* Protocol Unreachable */ if(myGlobals.runningPref.enableSuspiciousPacketDump) traceEvent(CONST_TRACE_WARNING, /* See http://www.packetfactory.net/firewalk/ */ "Host [%s] rcvd a ICMP protocol Unreachable from host [%s]" " (Firewalking scan attempt?)", dstHost->hostResolvedName, srcHost->hostResolvedName); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->icmpProtocolUnreachSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->icmpProtocolUnreachRcvd, srcHost, actualDeviceId); break; case ICMP_UNREACH_NET_PROHIB: /* Net Administratively Prohibited */ case ICMP_UNREACH_HOST_PROHIB: /* Host Administratively Prohibited */ case ICMP_UNREACH_FILTER_PROHIB: /* Access Administratively Prohibited */ if(myGlobals.runningPref.enableSuspiciousPacketDump) traceEvent(CONST_TRACE_WARNING, /* See http://www.packetfactory.net/firewalk/ */ "Host [%s] sent ICMP Administratively Prohibited packet to host [%s]" " (Firewalking scan attempt?)", dstHost->hostResolvedName, srcHost->hostResolvedName); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->icmpAdminProhibitedSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->icmpAdminProhibitedRcvd, srcHost, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].securityPkts.icmpAdminProhibited, 1); break; } if(myGlobals.runningPref.enableSuspiciousPacketDump) dumpSuspiciousPacket(actualDeviceId, h, p); } } break; case IPPROTO_ICMPV6: if(ip6 == NULL) { if(myGlobals.runningPref.enableSuspiciousPacketDump) { traceEvent(CONST_TRACE_WARNING,"Protocol violation: ICMPv6 protocol in IPv4 packet: %s->%s", srcHost->hostResolvedName, dstHost->hostResolvedName); dumpSuspiciousPacket(actualDeviceId, h, p); } goto end; } incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmp6Bytes, length); if(ip6->ip6_plen) icmp6len = ntohs(ip6->ip6_plen); /* TODO: considering the pointers cp et bp*/ if(icmp6len < sizeof(struct icmp6_hdr)) { if(myGlobals.runningPref.enableSuspiciousPacketDump) { traceEvent(CONST_TRACE_WARNING, "Malformed ICMPv6 pkt %s->%s detected (packet too short)", srcHost->hostResolvedName, dstHost->hostResolvedName); dumpSuspiciousPacket(actualDeviceId, h, p); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->malformedPktsSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->malformedPktsRcvd, srcHost, actualDeviceId); } } else { memcpy(&icmp6Pkt, bp+hlen, sizeof(struct icmp6_hdr)); incrementHostTrafficCounter(srcHost, icmp6Sent, length); incrementHostTrafficCounter(dstHost, icmp6Rcvd, length); if(fragmented) { char *fmt = "Detected ICMPv6 fragment [%s -> %s] (network attack attempt?)"; incrementHostTrafficCounter(srcHost, icmp6FragmentsSent, length); incrementHostTrafficCounter(dstHost, icmp6FragmentsRcvd, length); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->icmpFragmentSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->icmpFragmentRcvd, srcHost, actualDeviceId); if(myGlobals.runningPref.enableSuspiciousPacketDump) { traceEvent(CONST_TRACE_WARNING, fmt, srcHost->hostResolvedName, dstHost->hostResolvedName); dumpSuspiciousPacket(actualDeviceId, h, p); } } /* ************************************************************* */ if(icmp6Pkt.icmp6_type <= ICMP6_MAXTYPE) { allocHostTrafficCounterMemory(srcHost, icmpInfo, sizeof(IcmpHostInfo)); if(srcHost->icmpInfo == NULL) return; incrementHostTrafficCounter(srcHost, icmpInfo->icmpMsgSent[icmp6Pkt.icmp6_type], 1); allocHostTrafficCounterMemory(dstHost, icmpInfo, sizeof(IcmpHostInfo)); if(dstHost->icmpInfo == NULL) return; incrementHostTrafficCounter(dstHost, icmpInfo->icmpMsgRcvd[icmp6Pkt.icmp6_type], 1); switch (icmp6Pkt.icmp6_type) { case ICMP6_ECHO_REPLY: case ICMP6_ECHO_REQUEST: /* Do not log anything */ break; case ICMP6_DST_UNREACH: case ND_REDIRECT: case ICMP6_TIME_EXCEEDED: case ICMP6_PARAM_PROB: case ICMP6_NI_QUERY: case ICMP6_NI_REPLY: if(myGlobals.runningPref.enableSuspiciousPacketDump) { dumpSuspiciousPacket(actualDeviceId, h, p); } break; } } /* ************************************************************* */ if(subnetPseudoLocalHost(srcHost)) if(subnetPseudoLocalHost(dstHost)) incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpGlobalTrafficStats.local, length); else incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpGlobalTrafficStats.local2remote, length); else /* srcHost is remote */ if(subnetPseudoLocalHost(dstHost)) incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpGlobalTrafficStats.remote2local, length); else incrementTrafficCounter(&myGlobals.device[actualDeviceId].icmpGlobalTrafficStats.remote, length); if(icmp6Pkt.icmp6_type == ND_ROUTER_ADVERT) { HostTraffic *router = lookupHost(NULL, ether_src, vlanId, 0, 0, actualDeviceId, h, p); if(router != NULL) setHostFlag(FLAG_GATEWAY_HOST, router); } if(icmp6Pkt.icmp6_type == ICMP6_DST_UNREACH /* Destination Unreachable */) { struct ip6_hdr *oip = (struct ip6_hdr *)&icmp6Pkt+1; switch(icmp6Pkt.icmp6_code) { case ICMP6_DST_UNREACH_NOPORT: /* Port Unreachable */ memcpy(&dport, ((u_char *)bp+hlen+30), sizeof(dport)); dport = ntohs(dport); switch (oip->ip6_nxt) { case IPPROTO_TCP: if(myGlobals.runningPref.enableSuspiciousPacketDump) traceEvent(CONST_TRACE_WARNING, "Host [%s] sent TCP data to a closed port of host [%s:%d] (scan attempt?)", dstHost->hostResolvedName, srcHost->hostResolvedName, dport); /* Simulation of rejected TCP connection */ allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->rejectedTCPConnSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->rejectedTCPConnRcvd, srcHost, actualDeviceId); break; case IPPROTO_UDP: if(myGlobals.runningPref.enableSuspiciousPacketDump) traceEvent(CONST_TRACE_WARNING, "Host [%s] sent UDP data to a closed port of host [%s:%d] (scan attempt?)", dstHost->hostResolvedName, srcHost->hostResolvedName, dport); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&dstHost->secHostPkts->udpToClosedPortSent, srcHost, actualDeviceId); incrementUsageCounter(&srcHost->secHostPkts->udpToClosedPortRcvd, dstHost, actualDeviceId); break; } allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->icmpPortUnreachSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->icmpPortUnreachRcvd, srcHost, actualDeviceId); break; case ICMP6_DST_UNREACH_NOROUTE: case ICMP6_DST_UNREACH_ADDR: allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->icmpHostNetUnreachSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->icmpHostNetUnreachRcvd, srcHost, actualDeviceId); break; case ICMP6_DST_UNREACH_ADMIN: /* Administratively Prohibited */ if(myGlobals.runningPref.enableSuspiciousPacketDump) traceEvent(CONST_TRACE_WARNING, /* See http://www.packetfactory.net/firewalk/ */ "Host [%s] sent ICMPv6 Administratively Prohibited packet to host [%s]" " (Firewalking scan attempt?)", dstHost->hostResolvedName, srcHost->hostResolvedName); allocateSecurityHostPkts(srcHost); allocateSecurityHostPkts(dstHost); incrementUsageCounter(&srcHost->secHostPkts->icmpAdminProhibitedSent, dstHost, actualDeviceId); incrementUsageCounter(&dstHost->secHostPkts->icmpAdminProhibitedRcvd, srcHost, actualDeviceId); break; } if(myGlobals.runningPref.enableSuspiciousPacketDump) dumpSuspiciousPacket(actualDeviceId, h, p); } } break; default: if(srcHost->ipProtosList != NULL) { protoList = myGlobals.ipProtosList; idx = 0; while(protoList != NULL) { if((protoList->protocolId == nh) || ((protoList->protocolIdAlias != 0) && (protoList->protocolIdAlias == nh))) { allocHostTrafficCounterMemory(srcHost, ipProtosList, (size_t)(myGlobals.numIpProtosToMonitor*sizeof(ProtoTrafficInfo**))); if(srcHost->ipProtosList) { allocHostTrafficCounterMemory(srcHost, ipProtosList[idx], sizeof(ShortProtoTrafficInfo)); if(srcHost->ipProtosList[idx] == NULL) return; incrementHostTrafficCounter(srcHost, ipProtosList[idx]->sent, length); } allocHostTrafficCounterMemory(dstHost, ipProtosList, (size_t)(myGlobals.numIpProtosToMonitor*sizeof(ProtoTrafficInfo**))); if(dstHost->ipProtosList) { allocHostTrafficCounterMemory(dstHost, ipProtosList[idx], sizeof(ShortProtoTrafficInfo)); if(dstHost->ipProtosList[idx] == NULL) return; incrementHostTrafficCounter(dstHost, ipProtosList[idx]->rcvd, length); } if(myGlobals.device[actualDeviceId].ipProtosList) incrementTrafficCounter(&myGlobals.device[actualDeviceId].ipProtosList[idx], length); found = 1; break; } idx++, protoList = protoList->next; } } if(!found) { incrementTrafficCounter(&myGlobals.device[actualDeviceId].otherIpBytes, length); sport = dport = 0; allocHostTrafficCounterMemory(srcHost, nonIPTraffic, sizeof(NonIPTraffic)); allocHostTrafficCounterMemory(dstHost, nonIPTraffic, sizeof(NonIPTraffic)); if((srcHost->nonIPTraffic == NULL) || (dstHost->nonIPTraffic == NULL)) return; incrementHostTrafficCounter(srcHost, nonIPTraffic->otherSent, length); incrementUnknownProto(srcHost, 0 /* sent */, 0 /* eth */, 0 /* dsap */, 0 /* ssap */, nh); incrementHostTrafficCounter(dstHost, nonIPTraffic->otherRcvd, length); incrementUnknownProto(dstHost, 1 /* rcvd */, 0 /* eth */, 0 /* dsap */, 0 /* ssap */, nh); } break; } end: ; /* Needed by some compilers */ #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "IP=%d TCP=%d UDP=%d ICMP=%d (len=%d)", (int)myGlobals.device[actualDeviceId].ipBytes.value, (int)myGlobals.device[actualDeviceId].tcpBytes.value, (int)myGlobals.device[actualDeviceId].udpBytes.value, (int)myGlobals.device[actualDeviceId].icmpBytes.value, length); #endif } ntop-5.0.1+dfsg1/pbuf.c0000644000000000000000000016241211777006053013307 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * http://www.ntop.org * * Copyright (C) 1998-2012 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" static void updateASTraffic(int actualDeviceId, u_int16_t src_as_id, u_int16_t dst_as_id, u_int octets); /* ******************************* */ void allocateSecurityHostPkts(HostTraffic *srcHost) { if(srcHost->secHostPkts == NULL) { if((srcHost->secHostPkts = (SecurityHostProbes*)malloc(sizeof(SecurityHostProbes))) == NULL) return; resetSecurityHostTraffic(srcHost); } } /* ************************************ */ u_int computeEfficiency(u_int pktLen) { u_int pktEfficiency; if(myGlobals.cellLength == 0) pktEfficiency = 0; else pktEfficiency = 100 - (((pktLen % myGlobals.cellLength) * 100) / myGlobals.cellLength); // traceEvent(CONST_TRACE_WARNING, "[len=%d][efficiency=%d]", pktLen, pktEfficiency); return(pktEfficiency); } /* ************************************ */ /* Reset the traffic at every hour */ static void resetHourTraffic(u_short hourId) { int i; for(i=0; itrafficDistribution != NULL) { resetTrafficCounter(&el->trafficDistribution->last24HoursBytesSent[hourId]); resetTrafficCounter(&el->trafficDistribution->last24HoursBytesRcvd[hourId]); } } } } /* ************************************ */ static void addContactedPeers(HostTraffic *sender, HostAddr *srcAddr, HostTraffic *receiver, HostAddr *dstAddr, int actualDeviceId) { if((sender == NULL) || (receiver == NULL) || (sender == receiver)) { if(sender != NULL) { /* This is normal. Return without warning */ return; } traceEvent(CONST_TRACE_ERROR, "Sanity check failed @ addContactedPeers (%p, %p)", sender, receiver); return; } if((sender != myGlobals.otherHostEntry) && (receiver != myGlobals.otherHostEntry)) { /* The statements below have no effect if the serial has been already computed */ setHostSerial(sender); setHostSerial(receiver); sender->totContactedSentPeers += incrementUsageCounter(&sender->contactedSentPeers, receiver, actualDeviceId); receiver->totContactedRcvdPeers += incrementUsageCounter(&receiver->contactedRcvdPeers, sender, actualDeviceId); } } /* ************************************ */ void updatePacketCount(HostTraffic *srcHost, HostTraffic *dstHost, TrafficCounter bytes, Counter numPkts, int actualDeviceId) { static u_short lastHourId=0; u_short hourId; struct tm t, *thisTime; if(numPkts == 0) return; if((srcHost == NULL) || (dstHost == NULL)) { traceEvent(CONST_TRACE_ERROR, "NULL host detected"); return; } CM_Update(srcHost->sent_to_matrix, dstHost->serialHostIndex, (int)numPkts); CM_Update(dstHost->recv_from_matrix, srcHost->serialHostIndex, (int)numPkts); updateASTraffic(actualDeviceId, srcHost->hostAS, dstHost->hostAS, (u_int)bytes.value); if(srcHost == dstHost) { return; } else if((srcHost == myGlobals.otherHostEntry) && (dstHost == myGlobals.otherHostEntry)) { return; } thisTime = localtime_r(&myGlobals.actTime, &t); if(thisTime == NULL) { myGlobals.actTime = time(NULL); thisTime = localtime_r(&myGlobals.actTime, &t); } hourId = thisTime->tm_hour % 24 /* just in case... */;; if(lastHourId != hourId) { resetHourTraffic(hourId); lastHourId = hourId; } if(srcHost != myGlobals.otherHostEntry) { incrementHostTrafficCounter(srcHost, pktsSent, numPkts); incrementHostTrafficCounter(srcHost, pktsSentSession, numPkts); allocHostTrafficCounterMemory(srcHost, trafficDistribution, sizeof(TrafficDistribution)); if(srcHost->trafficDistribution == NULL) return; incrementHostTrafficCounter(srcHost, trafficDistribution->last24HoursBytesSent[hourId], bytes.value); incrementHostTrafficCounter(srcHost, bytesSent, bytes.value); incrementHostTrafficCounter(srcHost, bytesSentSession, bytes.value); } if(dstHost != myGlobals.otherHostEntry) { incrementHostTrafficCounter(dstHost, pktsRcvd, numPkts); incrementHostTrafficCounter(dstHost, pktsRcvdSession, numPkts); allocHostTrafficCounterMemory(dstHost, trafficDistribution, sizeof(TrafficDistribution)); if(dstHost->trafficDistribution == NULL) return; incrementHostTrafficCounter(dstHost, trafficDistribution->last24HoursBytesRcvd[hourId], bytes.value); incrementHostTrafficCounter(dstHost, bytesRcvd, bytes.value); incrementHostTrafficCounter(dstHost, bytesRcvdSession, bytes.value); } if(broadcastHost(dstHost)) { if(srcHost != myGlobals.otherHostEntry) { incrementHostTrafficCounter(srcHost, pktsBroadcastSent, numPkts); incrementHostTrafficCounter(srcHost, bytesBroadcastSent, bytes.value); } incrementTrafficCounter(&myGlobals.device[actualDeviceId].broadcastPkts, numPkts); } else if(isMulticastAddress(&(dstHost->hostIpAddress), NULL, NULL)) { #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "%s->%s", srcHost->hostResolvedName, dstHost->hostResolvedName); #endif if(srcHost != myGlobals.otherHostEntry) { incrementHostTrafficCounter(srcHost, pktsMulticastSent, numPkts); incrementHostTrafficCounter(srcHost, bytesMulticastSent, bytes.value); } if(dstHost != myGlobals.otherHostEntry) { incrementHostTrafficCounter(dstHost, pktsMulticastRcvd, numPkts); incrementHostTrafficCounter(dstHost, bytesMulticastRcvd, bytes.value); } incrementTrafficCounter(&myGlobals.device[actualDeviceId].multicastPkts, numPkts); } if((dstHost != NULL) /*&& (!broadcastHost(dstHost))*/) addContactedPeers(srcHost, &srcHost->hostIpAddress, dstHost, &dstHost->hostIpAddress, actualDeviceId); } /* ************************************ */ void updateHostName(HostTraffic *el) { if((el->hostNumIpAddress[0] == '\0') || (el->hostResolvedName == NULL) || (el->hostResolvedNameType == FLAG_HOST_SYM_ADDR_TYPE_NONE) || strcmp(el->hostResolvedName, el->hostNumIpAddress) == 0) { int i; if(el->nonIPTraffic == NULL) { el->nonIPTraffic = (NonIPTraffic*)calloc(1, sizeof(NonIPTraffic)); if(el->nonIPTraffic == NULL) return; /* Not enough memory */ } if(el->nonIPTraffic->nbHostName != NULL) { /* Use NetBIOS name (when available) if the IP address has not been resolved. */ memset(el->hostResolvedName, 0, sizeof(el->hostResolvedName)); setResolvedName(el, el->nonIPTraffic->nbHostName, FLAG_HOST_SYM_ADDR_TYPE_NETBIOS); } if(el->hostResolvedName[0] != '\0') for(i=0; el->hostResolvedName[i] != '\0'; i++) el->hostResolvedName[i] = (char)tolower(el->hostResolvedName[i]); } } /* ************************************ */ void updateInterfacePorts(int actualDeviceId, u_short sport, u_short dport, u_int length) { if((sport >= MAX_IP_PORT) || (dport >= MAX_IP_PORT) || (length == 0)) return; accessMutex(&myGlobals.purgePortsMutex, "updateInterfacePorts"); if(myGlobals.device[actualDeviceId].ipPorts == NULL) allocDeviceMemory(actualDeviceId); if(myGlobals.device[actualDeviceId].ipPorts[sport] == NULL) { myGlobals.device[actualDeviceId].ipPorts[sport] = (PortCounter*)malloc(sizeof(PortCounter)); if(myGlobals.device[actualDeviceId].ipPorts[sport] == NULL) { releaseMutex(&myGlobals.purgePortsMutex); return; } myGlobals.device[actualDeviceId].ipPorts[sport]->port = sport; myGlobals.device[actualDeviceId].ipPorts[sport]->sent = 0; myGlobals.device[actualDeviceId].ipPorts[sport]->rcvd = 0; } if(myGlobals.device[actualDeviceId].ipPorts[dport] == NULL) { myGlobals.device[actualDeviceId].ipPorts[dport] = (PortCounter*)malloc(sizeof(PortCounter)); if(myGlobals.device[actualDeviceId].ipPorts[dport] == NULL) { releaseMutex(&myGlobals.purgePortsMutex); return; } myGlobals.device[actualDeviceId].ipPorts[dport]->port = dport; myGlobals.device[actualDeviceId].ipPorts[dport]->sent = 0; myGlobals.device[actualDeviceId].ipPorts[dport]->rcvd = 0; } myGlobals.device[actualDeviceId].ipPorts[sport]->sent += length; myGlobals.device[actualDeviceId].ipPorts[dport]->rcvd += length; releaseMutex(&myGlobals.purgePortsMutex); } /* ************************************ */ void incrementUnknownProto(HostTraffic *host, int direction, u_int16_t eth_type, u_int16_t dsap, u_int16_t ssap, u_int16_t ipProto) { int i; if(host->nonIPTraffic == NULL) { host->nonIPTraffic = (NonIPTraffic*)calloc(1, sizeof(NonIPTraffic)); if(host->nonIPTraffic == NULL) return; } if(direction == 0) { /* Sent */ if(host->nonIPTraffic->unknownProtoSent == NULL) { host->nonIPTraffic->unknownProtoSent = (UnknownProto*)malloc(sizeof(UnknownProto)* MAX_NUM_UNKNOWN_PROTOS); if(host->nonIPTraffic->unknownProtoSent == NULL) return; memset(host->nonIPTraffic->unknownProtoSent, 0, sizeof(UnknownProto)*MAX_NUM_UNKNOWN_PROTOS); } for(i=0; inonIPTraffic->unknownProtoSent[i].protoType == 0) break; if((host->nonIPTraffic->unknownProtoSent[i].protoType == 1) && eth_type) { if(host->nonIPTraffic->unknownProtoSent[i].proto.ethType == eth_type) { return; } } else if((host->nonIPTraffic->unknownProtoSent[i].protoType == 2) && (dsap || ssap)) { if((host->nonIPTraffic->unknownProtoSent[i].proto.sapType.dsap == dsap) && (host->nonIPTraffic->unknownProtoSent[i].proto.sapType.ssap == ssap)) { return; } } else if((host->nonIPTraffic->unknownProtoSent[i].protoType == 3) && ipProto) { if(host->nonIPTraffic->unknownProtoSent[i].proto.ipType == ipProto) { return; } } } if(inonIPTraffic->unknownProtoSent[i].protoType = 1; host->nonIPTraffic->unknownProtoSent[i].proto.ethType = eth_type; } else if(dsap || ssap) { host->nonIPTraffic->unknownProtoSent[i].protoType = 2; host->nonIPTraffic->unknownProtoSent[i].proto.sapType.dsap = dsap; host->nonIPTraffic->unknownProtoSent[i].proto.sapType.ssap = ssap; } else { host->nonIPTraffic->unknownProtoSent[i].protoType = 3; host->nonIPTraffic->unknownProtoSent[i].proto.ipType = ipProto; } } } else { /* Rcvd */ if(host->nonIPTraffic->unknownProtoRcvd == NULL) { host->nonIPTraffic->unknownProtoRcvd = (UnknownProto*)malloc(sizeof(UnknownProto)* MAX_NUM_UNKNOWN_PROTOS); if(host->nonIPTraffic->unknownProtoRcvd == NULL) return; memset(host->nonIPTraffic->unknownProtoRcvd, 0, sizeof(UnknownProto)*MAX_NUM_UNKNOWN_PROTOS); } for(i=0; inonIPTraffic->unknownProtoRcvd[i].protoType == 0) break; if((host->nonIPTraffic->unknownProtoRcvd[i].protoType == 1) && eth_type) { if(host->nonIPTraffic->unknownProtoRcvd[i].proto.ethType == eth_type) { return; } } else if((host->nonIPTraffic->unknownProtoRcvd[i].protoType == 2) && (dsap || ssap)) { if((host->nonIPTraffic->unknownProtoRcvd[i].proto.sapType.dsap == dsap) && (host->nonIPTraffic->unknownProtoRcvd[i].proto.sapType.ssap == ssap)) { return; } } else if((host->nonIPTraffic->unknownProtoRcvd[i].protoType == 3) && ipProto) { if(host->nonIPTraffic->unknownProtoRcvd[i].proto.ipType == ipProto) { return; } } } if(inonIPTraffic->unknownProtoRcvd[i].protoType = 1; host->nonIPTraffic->unknownProtoRcvd[i].proto.ethType = eth_type; } else if(dsap || ssap) { host->nonIPTraffic->unknownProtoRcvd[i].protoType = 2; host->nonIPTraffic->unknownProtoRcvd[i].proto.sapType.dsap = dsap; host->nonIPTraffic->unknownProtoRcvd[i].proto.sapType.ssap = ssap; } else { host->nonIPTraffic->unknownProtoRcvd[i].protoType = 3; host->nonIPTraffic->unknownProtoRcvd[i].proto.ipType = ipProto; } } } } /* ************************************ */ static AsStats* allocASStats(u_int16_t as_id) { AsStats *asStats = (AsStats*)malloc(sizeof(AsStats)); if(0) traceEvent(CONST_TRACE_WARNING, "Allocating stats for AS %d", as_id); if(asStats != NULL) { memset(asStats, 0, sizeof(AsStats)); asStats->as_id = as_id; resetTrafficCounter(&asStats->outBytes); resetTrafficCounter(&asStats->outPkts); resetTrafficCounter(&asStats->inBytes); resetTrafficCounter(&asStats->inPkts); resetTrafficCounter(&asStats->selfBytes); resetTrafficCounter(&asStats->selfPkts); } return(asStats); } /* ************************************ */ static void updateASTraffic(int actualDeviceId, u_int16_t src_as_id, u_int16_t dst_as_id, u_int octets) { AsStats *stats, *prev_stats = NULL; u_char found_src = 0, found_dst = 0; if(0) traceEvent(CONST_TRACE_INFO, "updateASTraffic(actualDeviceId=%d, src_as_id=%d, dst_as_id=%d, octets=%d)", actualDeviceId, src_as_id, dst_as_id, octets); if((src_as_id == 0) && (dst_as_id == 0)) return; accessMutex(&myGlobals.device[actualDeviceId].asMutex, "updateASTraffic"); stats = myGlobals.device[actualDeviceId].asStats; while(stats) { if(stats->as_id == src_as_id) { stats->lastUpdate = myGlobals.actTime; incrementTrafficCounter(&stats->outBytes, octets), incrementTrafficCounter(&stats->outPkts, 1), stats->totPktsSinceLastRRDDump++; if(src_as_id == dst_as_id) { incrementTrafficCounter(&stats->selfBytes, octets), incrementTrafficCounter(&stats->selfPkts, 1); releaseMutex(&myGlobals.device[actualDeviceId].asMutex); return; } if(dst_as_id == 0) { releaseMutex(&myGlobals.device[actualDeviceId].asMutex); return; } else found_src = 1; } else if(stats->as_id == dst_as_id) { stats->lastUpdate = myGlobals.actTime; incrementTrafficCounter(&stats->inBytes, octets), incrementTrafficCounter(&stats->inPkts, 1), stats->totPktsSinceLastRRDDump++; if(src_as_id == dst_as_id) { incrementTrafficCounter(&stats->selfBytes, octets), incrementTrafficCounter(&stats->selfPkts, 1); releaseMutex(&myGlobals.device[actualDeviceId].asMutex); return; } if(src_as_id == 0) { releaseMutex(&myGlobals.device[actualDeviceId].asMutex); return; } else found_dst = 1; } if(found_src && found_dst) { releaseMutex(&myGlobals.device[actualDeviceId].asMutex); return; } if((myGlobals.actTime-stats->lastUpdate) > PARM_AS_MAXIMUM_IDLE) { AsStats *next = stats->next; if(0) traceEvent(CONST_TRACE_INFO, "Purging stats about AS %d", stats->as_id); if(prev_stats == NULL) myGlobals.device[actualDeviceId].asStats = next; else prev_stats->next = next; free(stats); stats = next; } else { prev_stats = stats; stats = stats->next; } } /* while */ /* One (or both) ASs are missing */ if((src_as_id != 0) && (!found_src)) { stats = allocASStats(src_as_id); stats->next = myGlobals.device[actualDeviceId].asStats; stats->lastUpdate = myGlobals.actTime; myGlobals.device[actualDeviceId].asStats = stats; } if((dst_as_id != 0) && (dst_as_id != src_as_id) && (!found_dst)) { stats = allocASStats(dst_as_id); stats->next = myGlobals.device[actualDeviceId].asStats; stats->lastUpdate = myGlobals.actTime; myGlobals.device[actualDeviceId].asStats = stats; } releaseMutex(&myGlobals.device[actualDeviceId].asMutex); /* We created the AS entry so we now need to update the AS information */ updateASTraffic(actualDeviceId, src_as_id, dst_as_id, octets); } /* ************************************ */ #undef DEBUG void queuePacket(u_char *_deviceId, const struct pcap_pkthdr *h, const u_char *p) { int len, deviceId, actDeviceId; /* *************************** - If the queue is full then wait until a slot is freed - If the queue is getting full then periodically wait until a slot is freed **************************** */ #ifdef MAX_PROCESS_BUFFER if(myGlobals.queueBufferInit == 0) { myGlobals.queueBufferCount = 0; myGlobals.queueBufferInit = 1; memset(&myGlobals.queueBuffer, 0, sizeof(myGlobals.queueBuffer)); } #endif myGlobals.receivedPackets++; if((p == NULL) || (h == NULL)) { traceEvent(CONST_TRACE_WARNING, "Invalid packet received. Skipped."); } #ifdef WIN32_DEMO if(myGlobals.receivedPackets >= MAX_NUM_PACKETS) return; #endif if(myGlobals.ntopRunState > FLAG_NTOPSTATE_RUN) return; deviceId = (int)((long)_deviceId); actDeviceId = getActualInterface(deviceId); incrementTrafficCounter(&myGlobals.device[actDeviceId].receivedPkts, 1); /* We assume that if there's a packet to queue for the sFlow interface then this has been queued by the sFlow plugins, while it was probably handling a queued packet */ #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "queuePacket: got packet from %s (%d)", myGlobals.device[deviceId].name, deviceId); #endif /* We don't sample on sFlow sampled interfaces */ if(myGlobals.device[deviceId].sflowGlobals == NULL) { if(myGlobals.device[actDeviceId].samplingRate > 1) { if(myGlobals.device[actDeviceId].droppedSamples < myGlobals.device[actDeviceId].samplingRate) { myGlobals.device[actDeviceId].droppedSamples++; return; /* Not enough samples received */ } else myGlobals.device[actDeviceId].droppedSamples = 0; } } if(h->len < 60) { /* Filter out noise */ updateDevicePacketStats(h->len, actDeviceId); return; } if(tryLockMutex(&myGlobals.device[deviceId].packetProcessMutex, "queuePacket") == 0) { /* Locked so we can process the packet now */ u_char p1[MAX_PACKET_LEN]; myGlobals.receivedPacketsProcessed++; len = h->caplen; if(h->caplen >= MAX_PACKET_LEN) { if(h->caplen > myGlobals.device[deviceId].mtuSize) { #ifndef WIN32 static u_int8_t msg_shown = 0; if(!msg_shown) { traceEvent(CONST_TRACE_WARNING, "Packet truncated (%d->%d): using LRO perhaps ?", h->len, MAX_PACKET_LEN); msg_shown = 1; } #endif } ((struct pcap_pkthdr*)h)->caplen = len = MAX_PACKET_LEN-1; } memcpy(p1, p, len); processPacket(_deviceId, h, p1); releaseMutex(&myGlobals.device[deviceId].packetProcessMutex); return; } /* If we reach this point it means that somebody was already processing a packet so we need to queue it. */ if(myGlobals.device[deviceId].packetQueueLen >= CONST_PACKET_QUEUE_LENGTH) { #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "Dropping packet [packet queue=%d/max=%d][id=%d]", myGlobals.device[deviceId].packetQueueLen, myGlobals.maxPacketQueueLen, deviceId); #endif myGlobals.receivedPacketsLostQ++; incrementTrafficCounter(&myGlobals.device[getActualInterface(deviceId)].droppedPkts, 1); ntop_conditional_sched_yield(); /* Allow other threads (dequeue) to run */ sleep(1); } else { #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "About to queue packet... "); #endif accessMutex(&myGlobals.device[deviceId].packetQueueMutex, "queuePacket"); myGlobals.receivedPacketsQueued++; memcpy(&myGlobals.device[deviceId].packetQueue[myGlobals.device[deviceId].packetQueueHead].h, h, sizeof(struct pcap_pkthdr)); memset(myGlobals.device[deviceId].packetQueue[myGlobals.device[deviceId].packetQueueHead].p, 0, sizeof(myGlobals.device[deviceId].packetQueue[myGlobals.device[deviceId].packetQueueHead].p)); /* Just to be safe */ len = h->caplen; memcpy(myGlobals.device[deviceId].packetQueue[myGlobals.device[deviceId].packetQueueHead].p, p, len); myGlobals.device[deviceId].packetQueue[myGlobals.device[deviceId].packetQueueHead].h.caplen = len; myGlobals.device[deviceId].packetQueue[myGlobals.device[deviceId].packetQueueHead].deviceId = (int)((long)((void*)_deviceId)); myGlobals.device[deviceId].packetQueueHead = (myGlobals.device[deviceId].packetQueueHead+1) % CONST_PACKET_QUEUE_LENGTH; myGlobals.device[deviceId].packetQueueLen++; if(myGlobals.device[deviceId].packetQueueLen > myGlobals.device[deviceId].maxPacketQueueLen) myGlobals.device[deviceId].maxPacketQueueLen = myGlobals.device[deviceId].packetQueueLen; releaseMutex(&myGlobals.device[deviceId].packetQueueMutex); #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "Queued packet... [packet queue=%d/max=%d]", myGlobals.device[deviceId].packetQueueLen, myGlobals.maxPacketQueueLen); #endif #ifdef DEBUG_THREADS traceEvent(CONST_TRACE_INFO, "+ [packet queue=%d/max=%d]", myGlobals.device[deviceId].packetQueueLen, myGlobals.maxPacketQueueLen); #endif } signalCondvar(&myGlobals.device[deviceId].queueCondvar, 0); ntop_conditional_sched_yield(); /* Allow other threads (dequeue) to run */ } /* ************************************ */ void cleanupPacketQueue(void) { ; /* Nothing to do */ } /* ************************************ */ void* dequeuePacket(void* _deviceId) { u_int deviceId = (u_int)((long)_deviceId); struct pcap_pkthdr h; u_char p[MAX_PACKET_LEN]; traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: NPA: network packet analyzer (packet processor) thread running [p%d]", (long unsigned int)pthread_self(), getpid()); /* Don't bother stalling until RUN, start grabbing packets NOW ... */ while(myGlobals.ntopRunState <= FLAG_NTOPSTATE_RUN) { #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "Waiting for packet..."); #endif while((myGlobals.device[deviceId].packetQueueLen == 0) && (myGlobals.ntopRunState <= FLAG_NTOPSTATE_RUN) /* Courtesy of Wies-Software */) { waitCondvar(&myGlobals.device[deviceId].queueCondvar); } if(myGlobals.ntopRunState > FLAG_NTOPSTATE_RUN) break; #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "Got packet..."); #endif accessMutex(&myGlobals.device[deviceId].packetQueueMutex, "dequeuePacket"); memcpy(&h, &myGlobals.device[deviceId].packetQueue[myGlobals.device[deviceId].packetQueueTail].h, sizeof(struct pcap_pkthdr)); deviceId = myGlobals.device[deviceId].packetQueue[myGlobals.device[deviceId].packetQueueTail].deviceId; /* This code should be changed ASAP. It is a bad trick that avoids ntop to go beyond packet boundaries (L.Deri 17/03/2003) 1. h->len is truncated 2. MAX_PACKET_LEN should probably be removed 3. all the functions must check that they are not going beyond packet boundaries */ if((h.caplen != h.len) && (myGlobals.device[deviceId].sflowGlobals == NULL) /* This warning is normal for sFlow */ && (myGlobals.runningPref.enablePacketDecoding /* Courtesy of Ken Beaty */)) traceEvent (CONST_TRACE_WARNING, "dequeuePacket: caplen %d != len %d\n", h.caplen, h.len); memcpy(p, myGlobals.device[deviceId].packetQueue[myGlobals.device[deviceId].packetQueueTail].p, MAX_PACKET_LEN); if(h.len > MAX_PACKET_LEN) { static u_int8_t msg_shown = 0; if(!msg_shown) { traceEvent(CONST_TRACE_WARNING, "Packet truncated (%d->%d): using LRO perhaps ?", h.len, MAX_PACKET_LEN); msg_shown = 1; } h.len = MAX_PACKET_LEN; } myGlobals.device[deviceId].packetQueueTail = (myGlobals.device[deviceId].packetQueueTail+1) % CONST_PACKET_QUEUE_LENGTH; myGlobals.device[deviceId].packetQueueLen--; releaseMutex(&myGlobals.device[deviceId].packetQueueMutex); #ifdef DEBUG_THREADS traceEvent(CONST_TRACE_INFO, "- [packet queue=%d/max=%d]", myGlobals.device[deviceId].packetQueueLen, myGlobals.maxPacketQueueLen); #endif #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "Processing packet... [packet queue=%d/max=%d][id=%d]", myGlobals.device[deviceId].packetQueueLen, myGlobals.maxPacketQueueLen, deviceId); #endif myGlobals.actTime = time(NULL); accessMutex(&myGlobals.device[deviceId].packetProcessMutex, "dequeuePacket"); processPacket((u_char*)((long)deviceId), &h, p); releaseMutex(&myGlobals.device[deviceId].packetProcessMutex); } myGlobals.device[deviceId].dequeuePacketThreadId = 0; traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: NPA: network packet analyzer (%s) thread terminated [p%d]", (long unsigned int)pthread_self(), myGlobals.device[deviceId].humanFriendlyName, getpid()); return(NULL); } /* ************************************ */ static void flowsProcess(const struct pcap_pkthdr *h, const u_char *p, int deviceId) { FlowFilterList *list = myGlobals.flowsList; while(list != NULL) { #ifdef DEBUG if(!list->pluginStatus.activePlugin) traceEvent(CONST_TRACE_NOISY, "%s inactive", list->flowName); else if(list->fcode[deviceId].bf_insns == NULL) traceEvent(CONST_TRACE_NOISY, "%s no filter", list->flowName); #endif if((list->pluginStatus.activePlugin) && (list->fcode[deviceId].bf_insns != NULL)) { #ifdef DEBUG { struct ether_header *ep; u_int16_t et=0, et8021q=0; ep = (struct ether_header *)p; et = ntohs(ep->ether_type); if(et == ETHERTYPE_802_1Q) { et8021q = et; ep = (struct ether_header *)(p+4); et = ntohs(ep->ether_type); } traceEvent(CONST_TRACE_NOISY, "%smatch on %s for '%s' %s0x%04x-%s-%d/%d", bpf_filter(list->fcode[deviceId].bf_insns, (u_char*)p, h->len, h->caplen) ? "" : "No ", myGlobals.device[deviceId].name, list->flowName, et8021q == ETHERTYPE_802_1Q ? "(802.1q) " : "", et, et == ETHERTYPE_IP ? "IPv4" : et == ETHERTYPE_IPv6 ? "IPv6" : et == ETHERTYPE_ARP ? "ARP" : et == ETHERTYPE_REVARP ? "RARP" : "other", h->len, h->caplen); } #endif if(bpf_filter(list->fcode[deviceId].bf_insns, (u_char*)p, h->len, h->caplen)) { incrementTrafficCounter(&list->bytes, h->len); incrementTrafficCounter(&list->packets, 1); if(list->pluginStatus.pluginPtr != NULL) { void(*pluginFunct)(u_char*, const struct pcap_pkthdr*, const u_char*); pluginFunct = (void(*)(u_char *_deviceId, const struct pcap_pkthdr*, const u_char*))list->pluginStatus.pluginPtr->pluginFunct; pluginFunct((u_char*)&deviceId, h, p); } } } list = list->next; } } /* ************************************ */ static void addNonIpTrafficInfo(HostTraffic *el, u_int16_t proto, u_short len, u_int direction) { NonIpProtoTrafficInfo *nonIp; int numIterations; if(el->nonIpProtoTrafficInfos == NULL) goto notFoundProto; else nonIp = el->nonIpProtoTrafficInfos; numIterations = 0; while(nonIp != NULL) { if(nonIp->protocolId == proto) break; numIterations++; if(numIterations == MAX_NUM_NON_IP_PROTO_TRAFFIC_INFO) return; /* Too many protocols */ nonIp = nonIp->next; } if(nonIp == NULL) { notFoundProto: /* Protocol not found */ nonIp = (NonIpProtoTrafficInfo*)calloc(1, sizeof(NonIpProtoTrafficInfo)); if(nonIp == NULL) return; nonIp->next = el->nonIpProtoTrafficInfos; el->nonIpProtoTrafficInfos = nonIp; nonIp->protocolId = proto; } if(direction == 0) incrementTrafficCounter(&nonIp->sentPkts, 1), incrementTrafficCounter(&nonIp->sentBytes, len); else incrementTrafficCounter(&nonIp->rcvdPkts, 1), incrementTrafficCounter(&nonIp->rcvdBytes, len); } /* ************************************ */ void updateDevicePacketStats(u_int length, int actualDeviceId) { if(length <= 64) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.upTo64, 1); else if(length <= 128) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.upTo128, 1); else if(length <= 256) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.upTo256, 1); else if(length <= 512) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.upTo512, 1); else if(length <= 1024) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.upTo1024, 1); else if(length <= 1518) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.upTo1518, 1); #ifdef MAKE_WITH_JUMBO_FRAMES else if(length <= 2500) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.upTo2500, 1); else if(length <= 6500) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.upTo6500, 1); else if(length <= 9000) incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.upTo9000, 1); else incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.above9000, 1); #else else incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.above1518, 1); #endif if((myGlobals.device[actualDeviceId].rcvdPktStats.shortest.value == 0) || (myGlobals.device[actualDeviceId].rcvdPktStats.shortest.value > length)) myGlobals.device[actualDeviceId].rcvdPktStats.shortest.value = length; if(myGlobals.device[actualDeviceId].rcvdPktStats.longest.value < length) myGlobals.device[actualDeviceId].rcvdPktStats.longest.value = length; } /* ***************************************************** */ void dumpSuspiciousPacket(int actualDeviceId, const struct pcap_pkthdr *h, const u_char *p) { if((p == NULL) || (h == NULL)) return; if(myGlobals.device[actualDeviceId].pcapErrDumper != NULL) { pcap_dump((u_char*)myGlobals.device[actualDeviceId].pcapErrDumper, h, p); traceEvent(CONST_TRACE_INFO, "Dumped %d bytes suspicious packet", h->caplen); } } /* ***************************************************** */ void dumpOtherPacket(int actualDeviceId, const struct pcap_pkthdr *h, const u_char *p) { if((p == NULL) || (h == NULL)) return; if(myGlobals.device[actualDeviceId].pcapOtherDumper != NULL) pcap_dump((u_char*)myGlobals.device[actualDeviceId].pcapOtherDumper, h, p); } /* ***************************************************** */ /* * This is the top level routine of the printer. 'p' is the points * to the ether header of the packet, 'tvp' is the timestamp, * 'length' is the length of the packet off the wire, and 'caplen' * is the number of bytes actually captured. */ void processPacket(u_char *_deviceId, const struct pcap_pkthdr *h, const u_char *p) { struct ether_header ehdr; struct tokenRing_header *trp; u_int hlen, caplen = h->caplen; u_int headerDisplacement = 0, length = h->len; const u_char *orig_p = p, *p1; u_char *ether_src=NULL, *ether_dst=NULL; u_short eth_type=0; /* Token-Ring Strings */ struct tokenRing_llc *trllc; int deviceId, actualDeviceId; u_int16_t vlanId=NO_VLAN; static time_t lastUpdateThptTime = 0; #ifdef LINUX AnyHeader *anyHeader; #endif #ifdef MAX_PROCESS_BUFFER struct timeval pktStartOfProcessing, pktEndOfProcessing; #endif #ifdef MEMORY_DEBUG #ifdef MEMORY_DEBUG_UNLIMITED #warning MEMORY_DEBUG defined for UNLIMITED usage! #else #ifdef MEMORY_DEBUG_PACKETS { static long numPkt=0; if(++numPkt >= MEMORY_DEBUG_PACKETS) { traceEvent(CONST_TRACE_ALWAYSDISPLAY, "NOTE: ntop shutting down - memory debug packet limit (%d) reached", MEMORY_DEBUG_PACKETS); cleanup(1); } } #endif /* MEMORY_DEBUG_PACKETS */ #ifdef MEMORY_DEBUG_SECONDS { static time_t memoryDebugAbortTime=0; if(memoryDebugAbortTime == 0) { memoryDebugAbortTime = time(NULL) + MEMORY_DEBUG_SECONDS; } else if(time(NULL) > memoryDebugAbortTime) { traceEvent(CONST_TRACE_ALWAYSDISPLAY, "NOTE: ntop shutting down - memory debug abort time reached"); cleanup(1); } } #endif /* MEMORY_DEBUG_SECONDS */ #endif /* MEMORY_DEBUG_UNLIMITED */ #endif /* MEMORY_DEBUG */ if(myGlobals.ntopRunState > FLAG_NTOPSTATE_RUN) return; /* This allows me to fetch the time from the captured packet instead of calling time(NULL). */ myGlobals.actTime = h->ts.tv_sec; deviceId = (int)((long)_deviceId); actualDeviceId = getActualInterface(deviceId); #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "deviceId=%d - actualDeviceId=%ld", deviceId, actualDeviceId); #endif #ifdef MAX_PROCESS_BUFFER { float elapsed; gettimeofday(&pktStartOfProcessing, NULL); elapsed = timeval_subtract(pktStartOfProcessing, h->ts); if(elapsed < 0) elapsed = 0; myGlobals.queueBuffer[++myGlobals.queueBufferCount & (MAX_PROCESS_BUFFER - 1)] = elapsed; if((myGlobals.device[actualDeviceId].ethernetPkts.value > 100) && (elapsed > myGlobals.qmaxDelay)) myGlobals.qmaxDelay = elapsed; } #endif #ifdef DEBUG if(myGlobals.pcap_file_list != NULL) { traceEvent(CONST_TRACE_INFO, "."); fflush(stdout); } #endif updateDevicePacketStats(length, actualDeviceId); incrementTrafficCounter(&myGlobals.device[actualDeviceId].ethernetPkts, 1); incrementTrafficCounter(&myGlobals.device[actualDeviceId].ethernetBytes, h->len); if(myGlobals.runningPref.mergeInterfaces && actualDeviceId != deviceId) incrementTrafficCounter(&myGlobals.device[deviceId].ethernetPkts, 1); if(myGlobals.device[actualDeviceId].pcapDumper != NULL) pcap_dump((u_char*)myGlobals.device[actualDeviceId].pcapDumper, h, p); if((myGlobals.device[deviceId].mtuSize != CONST_UNKNOWN_MTU) && (length > myGlobals.device[deviceId].mtuSize) ) { /* Sanity check */ if(myGlobals.runningPref.enableSuspiciousPacketDump) { traceEvent(CONST_TRACE_WARNING, "Packet # %u too long (len = %u)!", (unsigned int)myGlobals.device[deviceId].ethernetPkts.value, (unsigned int)length); dumpSuspiciousPacket(actualDeviceId, h, p); } /* Fix below courtesy of Andreas Pfaller */ length = myGlobals.device[deviceId].mtuSize; incrementTrafficCounter(&myGlobals.device[actualDeviceId].rcvdPktStats.tooLong, 1); } #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "actualDeviceId = %d", actualDeviceId); #endif /* Note: The code below starts by assuming that if we haven't captured at * least an Ethernet frame header's worth of bytes we drop the packet. * This might be a bad assumption - why aren't we using the DLT_ derived fields? * e.g.: hlen = myGlobals.device[deviceId].headerSize; * Also, we probably should account for these runt packets - both count the * # of packets and the associated # of bytes. */ hlen = (u_int)((myGlobals.device[deviceId].datalink == DLT_NULL) ? CONST_NULL_HDRLEN : sizeof(struct ether_header)); if(!myGlobals.initialSniffTime && (myGlobals.pcap_file_list != NULL)) { myGlobals.initialSniffTime = h->ts.tv_sec; myGlobals.device[deviceId].lastThptUpdate = myGlobals.device[deviceId].lastMinThptUpdate = myGlobals.device[deviceId].lastHourThptUpdate = myGlobals.device[deviceId].lastFiveMinsThptUpdate = myGlobals.initialSniffTime; } memcpy(&myGlobals.lastPktTime, &h->ts, sizeof(myGlobals.lastPktTime)); if(caplen >= hlen) { HostTraffic *srcHost = NULL, *dstHost = NULL; memcpy(&ehdr, p, sizeof(struct ether_header)); switch(myGlobals.device[deviceId].datalink) { #ifdef LINUX case DLT_ANY: /* Linux 'any' device */ anyHeader = (AnyHeader*)p; length -= sizeof(AnyHeader); /* don't count nullhdr */ eth_type = ntohs(anyHeader->protoType); #if PACKET_DEBUG printf("pktType: 0x%x\n", ntohs(anyHeader->pktType)); printf("llcAddressType: 0x%x\n", ntohs(anyHeader->llcAddressType)); printf("llcAddressLen: 0x%x\n", ntohs(anyHeader->llcAddressLen)); printf("eth_type: 0x%x\n", eth_type); #endif ether_src = ether_dst = myGlobals.dummyEthAddress; processIpPkt(p+sizeof(AnyHeader), h, p, sizeof(struct ether_header), length, ether_src, ether_dst, actualDeviceId, vlanId); break; #endif case DLT_NULL: /* loopaback interface */ /* Support for ethernet headerless interfaces (e.g. lo0) Courtesy of Martin Kammerhofer */ length -= CONST_NULL_HDRLEN; /* don't count nullhdr */ /* All this crap is due to the old little/big endian story... */ if(((p[0] == 0) && (p[1] == 0) && (p[2] == 8) && (p[3] == 0)) || ((p[0] == 2) && (p[1] == 0) && (p[2] == 0) && (p[3] == 0)) /* OSX */) eth_type = ETHERTYPE_IP; else if(((p[0] == 0) && (p[1] == 0) && (p[2] == 0x86) && (p[3] == 0xdd)) || ((p[0] == 0x1E) && (p[1] == 0) && (p[2] == 0) && (p[3] == 0)) /* OSX */) eth_type = ETHERTYPE_IPv6; else { // traceEvent(CONST_TRACE_INFO, "[%d][%d][%d][%d]", p[0], p[1], p[2], p[3]); } ether_src = ether_dst = myGlobals.dummyEthAddress; break; case DLT_PPP: headerDisplacement = CONST_PPP_HDRLEN; /* PPP is like RAW IP. The only difference is that PPP has a header that's not present in RAW IP. IMPORTANT: DO NOT PUT A break BELOW this comment */ case DLT_RAW: /* RAW IP (no ethernet header) */ length -= headerDisplacement; /* don't count PPP header */ ether_src = ether_dst = NULL; processIpPkt(p+headerDisplacement, h, p, sizeof(struct ether_header), length, NULL, NULL, actualDeviceId, vlanId); break; case DLT_IEEE802: /* Token Ring */ trp = (struct tokenRing_header*)p; ether_src = (u_char*)trp->trn_shost, ether_dst = (u_char*)trp->trn_dhost; hlen = sizeof(struct tokenRing_header) - 18; if(trp->trn_shost[0] & CONST_TR_RII) /* Source Routed Packet */ hlen += ((ntohs(trp->trn_rcf) & CONST_TR_RCF_LEN_MASK) >> 8); length -= hlen, caplen -= hlen; p += hlen; trllc = (struct tokenRing_llc *)p; if(trllc->dsap == 0xAA && trllc->ssap == 0xAA) hlen = sizeof(struct tokenRing_llc); else hlen = sizeof(struct tokenRing_llc) - 5; length -= hlen, caplen -= hlen; p += hlen; if(hlen == sizeof(struct tokenRing_llc)) eth_type = ntohs(trllc->ethType); else eth_type = 0; break; default: eth_type = ntohs(ehdr.ether_type); /* NOTE: eth_type is a 32 bit integer (eg. 0x0800). If the first byte is NOT null (08 in the example below) then this is a Ethernet II frame, otherwise is a IEEE 802.3 Ethernet frame. */ ether_src = ESRC(&ehdr), ether_dst = EDST(&ehdr); if(eth_type == ETHERTYPE_802_1Q) /* VLAN */ { Ether80211q qType; memcpy(&qType, p+sizeof(struct ether_header), sizeof(Ether80211q)); vlanId = ntohs(qType.vlanId) & 0xFFF; #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "VLAN Id: %d", vlanId); #endif eth_type = ntohs(qType.protoType); hlen += 4; /* Skip the 802.1q header */ if(myGlobals.device[deviceId].hasVLANs != TRUE) { myGlobals.device[deviceId].hasVLANs = TRUE; myGlobals.haveVLANs = TRUE; #ifndef MAKE_WITH_JUMBO_FRAMES traceEvent(CONST_TRACE_NOISY, "Device %s(%d) MTU adjusted for 802.1q VLAN", myGlobals.device[deviceId].name, deviceId); extend8021Qmtu(); myGlobals.device[deviceId].rcvdPktStats.tooLong.value = 0l; #endif } } else if(eth_type == ETHERTYPE_MPLS) /* MPLS */ { char bos; /* bottom_of_stack */ u_char mplsLabels[MAX_NUM_MPLS_LABELS][MPLS_LABEL_LEN]; int numMplsLabels = 0; memset(mplsLabels, 0, sizeof(mplsLabels)); bos = 0; while(bos == 0) { memcpy(&mplsLabels[numMplsLabels], p+hlen, MPLS_LABEL_LEN); bos = (mplsLabels[numMplsLabels][2] & 0x1), hlen += 4, numMplsLabels++; if((hlen > caplen) || (numMplsLabels >= MAX_NUM_MPLS_LABELS)) return; /* bad packet */ } eth_type = ETHERTYPE_IP; } else if((ether_dst[0] == 0x01) && (ether_dst[1] == 0x00) && (ether_dst[2] == 0x0C) && (ether_dst[3] == 0x00) && (ether_dst[4] == 0x00) && (ether_dst[5] == 0x00)) { /* Cisco InterSwitch Link (ISL) Protocol This is basically the Cisco proprietary VLAN tagging (vs. the standard 802.1q) http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm */ IslHeader islHdr; memcpy(&islHdr, p, sizeof(IslHeader)); vlanId = ntohs(islHdr.vlanId); hlen = sizeof(IslHeader); /* Skip the ISL header */ memcpy(&ehdr, p+hlen, sizeof(struct ether_header)); hlen += (u_int)sizeof(struct ether_header); ether_src = ESRC(&ehdr), ether_dst = EDST(&ehdr); eth_type = ntohs(ehdr.ether_type); } } /* switch(myGlobals.device[deviceId].datalink) */ if((myGlobals.device[deviceId].datalink != DLT_PPP) && (myGlobals.device[deviceId].datalink != DLT_RAW) && (myGlobals.device[deviceId].datalink != DLT_ANY)) { if((myGlobals.device[deviceId].datalink == DLT_IEEE802) && (eth_type < ETHERMTU)) { TrafficCounter ctr; trp = (struct tokenRing_header*)orig_p; ether_src = (u_char*)trp->trn_shost, ether_dst = (u_char*)trp->trn_dhost; srcHost = lookupHost(NULL, ether_src, vlanId, 0, 0, actualDeviceId, h, p); if(srcHost == NULL) { /* Sanity check */ lowMemory(); return; } else { lockHostsHashMutex(srcHost, "processPacket-src-2"); } dstHost = lookupHost(NULL, ether_dst, vlanId, 0, 0, actualDeviceId, h, p); if(dstHost == NULL) { /* Sanity check */ lowMemory(); unlockHostsHashMutex(srcHost); return; } else { lockHostsHashMutex(dstHost, "processPacket-dst-2"); } if(vlanId != NO_VLAN) { srcHost->vlanId = vlanId; dstHost->vlanId = vlanId; } allocHostTrafficCounterMemory(srcHost, nonIPTraffic, sizeof(NonIPTraffic)); allocHostTrafficCounterMemory(dstHost, nonIPTraffic, sizeof(NonIPTraffic)); if((srcHost->nonIPTraffic == NULL) || (dstHost->nonIPTraffic == NULL)) return; incrementHostTrafficCounter(srcHost, nonIPTraffic->otherSent, length); incrementHostTrafficCounter(dstHost, nonIPTraffic->otherRcvd, length); incrementUnknownProto(srcHost, 0 /* sent */, eth_type /* eth */, 0 /* dsap */, 0 /* ssap */, 0 /* ip */); incrementUnknownProto(dstHost, 1 /* rcvd */, eth_type /* eth */, 0 /* dsap */, 0 /* ssap */, 0 /* ip */); ctr.value = length; /* Even if this is probably not IP the hostIpAddress field is fine because it is not used in this special case and I need a placeholder here. */ updatePacketCount(srcHost, dstHost, ctr, 1, actualDeviceId); } else if((myGlobals.device[deviceId].datalink != DLT_IEEE802) && (eth_type <= ETHERMTU) && (length > 3)) { /* The code below has been taken from tcpdump */ u_char sap_type; struct llc llcHeader; char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY]; if((ether_dst != NULL) && (strcmp(etheraddr_string(ether_dst, etherbuf), "FF:FF:FF:FF:FF:FF") == 0) && (p[sizeof(struct ether_header)] == 0xff) && (p[sizeof(struct ether_header)+1] == 0xff) && (p[sizeof(struct ether_header)+4] == 0x0)) { srcHost = lookupHost(NULL, ether_src, vlanId, 0, 0, actualDeviceId, h, p); if(srcHost == NULL) { /* Sanity check */ lowMemory(); return; } else { lockHostsHashMutex(srcHost, "processPacket-src-3"); } dstHost = lookupHost(NULL, ether_dst, vlanId, 0, 0, actualDeviceId, h, p); if(dstHost == NULL) { /* Sanity check */ lowMemory(); unlockHostsHashMutex(srcHost); return; } else { lockHostsHashMutex(dstHost, "processPacket-dst-3"); } if(vlanId != NO_VLAN) { srcHost->vlanId = vlanId; dstHost->vlanId = vlanId; } allocHostTrafficCounterMemory(srcHost, nonIPTraffic, sizeof(NonIPTraffic)); allocHostTrafficCounterMemory(dstHost, nonIPTraffic, sizeof(NonIPTraffic)); if((srcHost->nonIPTraffic == NULL) || (dstHost->nonIPTraffic == NULL)) return; } else { /* MAC addresses are meaningful here */ srcHost = lookupHost(NULL, ether_src, vlanId, 0, 0, actualDeviceId, h, p); dstHost = lookupHost(NULL, ether_dst, vlanId, 0, 0, actualDeviceId, h, p); if((srcHost == NULL) || (dstHost == NULL)) return; allocHostTrafficCounterMemory(srcHost, nonIPTraffic, sizeof(NonIPTraffic)); allocHostTrafficCounterMemory(dstHost, nonIPTraffic, sizeof(NonIPTraffic)); if((srcHost->nonIPTraffic == NULL) || (dstHost->nonIPTraffic == NULL)) return; if((srcHost != NULL) && (dstHost != NULL)) { TrafficCounter ctr; int llcLen; lockHostsHashMutex(srcHost, "processPacket-src-4"); lockHostsHashMutex(dstHost, "processPacket-dst-4"); if(vlanId != NO_VLAN) { srcHost->vlanId = vlanId; dstHost->vlanId = vlanId; } p1 = (u_char*)(p+hlen); /* Watch out for possible alignment problems */ llcLen = (int)min(length, sizeof(llcHeader)); memcpy(&llcHeader, (char*)p1, llcLen); sap_type = llcHeader.ssap & ~CONST_LLC_GSAP; llcsap_string(sap_type); if((sap_type == 0xAA /* SNAP */) && (llcHeader.ctl.snap_ether.snap_orgcode[0] == 0x0) && (llcHeader.ctl.snap_ether.snap_orgcode[1] == 0x0) && (llcHeader.ctl.snap_ether.snap_orgcode[2] == 0xc) /* 0x00000C = Cisco */ && (llcHeader.ctl.snap_ether.snap_ethertype[0] == 0x20) && (llcHeader.ctl.snap_ether.snap_ethertype[1] == 0x00) /* 0x2000 Cisco Discovery Protocol */ ) { u_char *cdp; int cdp_idx = 0; cdp = (u_char*)(p+hlen+llcLen); if(cdp[cdp_idx] == 0x02) { /* CDP v2 */ struct cdp_element { u_int16_t cdp_type; u_int16_t cdp_len; // u_char cdp_content[255]; }; cdp_idx = 4; while((cdp_idx+sizeof(struct cdp_element)) < (length-(hlen+llcLen))) { struct cdp_element element; memcpy(&element, &cdp[cdp_idx], sizeof(struct cdp_element)); cdp_idx += (int)sizeof(struct cdp_element); element.cdp_len = ntohs(element.cdp_len); element.cdp_type = ntohs(element.cdp_type); if(element.cdp_len == 0) break; /* Sanity check */ switch(element.cdp_type) { case 0x0001: /* Device Id */ if((srcHost->hostResolvedName[0] == '\0') || (strcmp(srcHost->hostResolvedName, srcHost->hostNumIpAddress))) { u_short tmpStrLen = min(element.cdp_len-4, MAX_LEN_SYM_HOST_NAME-1); strncpy(srcHost->hostResolvedName, (char*)&cdp[cdp_idx], tmpStrLen); srcHost->hostResolvedName[tmpStrLen] = '\0'; } break; case 0x0002: /* Addresses */ break; case 0x0003: /* Port Id */ break; case 0x0004: /* Capabilities */ break; case 0x0005: /* Sw Version */ if(srcHost->description == NULL) { char *tmpStr; u_short tmpStrLen = min(element.cdp_len-4, 255)+1; tmpStr = (char*)malloc(tmpStrLen); memcpy(tmpStr, &cdp[cdp_idx], tmpStrLen-2); tmpStr[tmpStrLen-1] = '\0'; srcHost->description = tmpStr; } break; case 0x0006: /* Platform */ if(srcHost->fingerprint == NULL) { char *tmpStr; u_short tmpStrLen = min(element.cdp_len-4, 64)+2; tmpStr = (char*)malloc(tmpStrLen); tmpStr[0] = ':'; memcpy(&tmpStr[1], &cdp[cdp_idx], tmpStrLen-2); tmpStr[tmpStrLen-1] = '\0'; srcHost->fingerprint = tmpStr; srcHost->hwModel = strdup(&tmpStr[1]); } break; case 0x0008: /* Cluster Management */ break; case 0x0009: /* VTP Management Domain */ break; } cdp_idx += (int)(element.cdp_len-sizeof(struct cdp_element)); } if(srcHost->fingerprint == NULL) srcHost->fingerprint = strdup(":Cisco"); /* Default */ } } if(sap_type != 0x42 /* !STP */) { addNonIpTrafficInfo(srcHost, sap_type, length, 0 /* sent */); addNonIpTrafficInfo(dstHost, sap_type, length, 1 /* rcvd */); } if(sap_type == 0x42 /* STP */) { /* Spanning Tree */ incrementHostTrafficCounter(srcHost, nonIPTraffic->stpSent, length); incrementHostTrafficCounter(dstHost, nonIPTraffic->stpRcvd, length); setHostFlag(FLAG_HOST_TYPE_SVC_BRIDGE, srcHost); incrementTrafficCounter(&myGlobals.device[actualDeviceId].stpBytes, length); } else if((llcHeader.ssap == LLCSAP_NETBIOS) && (llcHeader.dsap == LLCSAP_NETBIOS)) { /* Netbios */ incrementHostTrafficCounter(srcHost, nonIPTraffic->netbiosSent, length); incrementHostTrafficCounter(dstHost, nonIPTraffic->netbiosRcvd, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].netbiosBytes, length); } else if(sap_type == 0xAA /* SNAP */) { u_int16_t snapType; p1 = (u_char*)(p1+sizeof(llcHeader)); memcpy(&snapType, p1, sizeof(snapType)); snapType = ntohs(snapType); /* See section "ETHERNET NUMBERS OF INTEREST" in RFC 1060 http://www.faqs.org/rfcs/rfc1060.html */ if((llcHeader.ctl.snap_ether.snap_orgcode[0] == 0x0) && (llcHeader.ctl.snap_ether.snap_orgcode[1] == 0x0) && (llcHeader.ctl.snap_ether.snap_orgcode[2] == 0x0C) /* Cisco */) { /* NOTE: If llcHeader.ctl.snap_ether.snap_ethertype[0] == 0x20 && llcHeader.ctl.snap_ether.snap_ethertype[1] == 0x0 this is Cisco Discovery Protocol */ setHostFlag(FLAG_GATEWAY_HOST, srcHost); } incrementHostTrafficCounter(srcHost, nonIPTraffic->otherSent, length); incrementHostTrafficCounter(dstHost, nonIPTraffic->otherRcvd, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].otherBytes, length); incrementUnknownProto(srcHost, 0 /* sent */, 0 /* eth */, llcHeader.dsap /* dsap */, llcHeader.ssap /* ssap */, 0 /* ip */); incrementUnknownProto(dstHost, 1 /* rcvd */, 0 /* eth */, llcHeader.dsap /* dsap */, llcHeader.ssap /* ssap */, 0 /* ip */); } else { /* Unknown Protocol */ #ifdef UNKNOWN_PACKET_DEBUG traceEvent(CONST_TRACE_INFO, "UNKNOWN_PACKET_DEBUG: [%u] [%x] %s %s > %s", (u_short)sap_type,(u_short)sap_type, etheraddr_string(ether_src, etherbuf), llcsap_string(llcHeader.ssap & ~CONST_LLC_GSAP), etheraddr_string(ether_dst, etherbuf)); #endif incrementTrafficCounter(&myGlobals.device[actualDeviceId].otherBytes, length); incrementUnknownProto(srcHost, 0 /* sent */, 0 /* eth */, llcHeader.dsap /* dsap */, llcHeader.ssap /* ssap */, 0 /* ip */); incrementUnknownProto(dstHost, 1 /* rcvd */, 0 /* eth */, llcHeader.dsap /* dsap */, llcHeader.ssap /* ssap */, 0 /* ip */); } ctr.value = length; /* Even if this is not IP the hostIpAddress field is fine because it is not used in this special case and I need a placeholder here. */ updatePacketCount(srcHost, dstHost, ctr, 1, actualDeviceId); } } } else if((eth_type == ETHERTYPE_IP) || (eth_type == ETHERTYPE_IPv6)) { TrafficCounter ctr; srcHost = lookupHost(NULL, ether_src, vlanId, 0, 0, actualDeviceId, h, p); dstHost = lookupHost(NULL, ether_dst, vlanId, 0, 0, actualDeviceId, h, p); if((srcHost == NULL) || (dstHost == NULL)) { /* Sanity check */ lowMemory(); return; } lockHostsHashMutex(srcHost, "processPacket-src-6"); lockHostsHashMutex(dstHost, "processPacket-dst-ip"); incrementHostTrafficCounter(srcHost, pktsSent, 1); incrementHostTrafficCounter(srcHost, bytesSent, h->len); incrementHostTrafficCounter(dstHost, pktsRcvd, 1); incrementHostTrafficCounter(dstHost, bytesRcvd, h->len); ctr.value = h->len; updatePacketCount(srcHost, dstHost, ctr, 1, actualDeviceId); if((myGlobals.device[deviceId].datalink == DLT_IEEE802) && (eth_type > ETHERMTU)) { processIpPkt(p, h, orig_p, hlen, length, ether_src, ether_dst, actualDeviceId, vlanId); } else { processIpPkt(p+hlen, h, orig_p, hlen, length, ether_src, ether_dst, actualDeviceId, vlanId); } } else if(eth_type == 0x8864) /* PPPOE */ { /* PPPoE - Courtesy of Andreas Pfaller Feb20032 * This strips the PPPoE encapsulation for traffic transiting the network. */ struct pppoe_hdr *pppoe_hdr=(struct pppoe_hdr *) (p+hlen); int protocol=ntohs(*((int *) (p+hlen+6))); if(pppoe_hdr->ver==1 && pppoe_hdr->type==1 && pppoe_hdr->code==0 && protocol==0x0021) { hlen+=8; /* length of pppoe header */ processIpPkt(p+hlen, h, orig_p, hlen, length, NULL, NULL, actualDeviceId, vlanId); } } else { /* MAC addresses are meaningful here */ struct ether_arp arpHdr; HostAddr addr; TrafficCounter ctr; if(length > hlen) length -= hlen; else length = 0; srcHost = lookupHost(NULL, ether_src, vlanId, 0, 0, actualDeviceId, h, p); if(srcHost == NULL) { /* Sanity check */ lowMemory(); return; } else { lockHostsHashMutex(srcHost, "processPacket-src-5"); allocHostTrafficCounterMemory(srcHost, nonIPTraffic, sizeof(NonIPTraffic)); if(srcHost->nonIPTraffic == NULL) { unlockHostsHashMutex(srcHost); return; } } dstHost = lookupHost(NULL, ether_dst, vlanId, 0, 0, actualDeviceId, h, p); if(dstHost == NULL) { /* Sanity check */ lowMemory(); unlockHostsHashMutex(srcHost); return; } else { /* traceEvent(CONST_TRACE_INFO, "lockHostsHashMutex()"); */ lockHostsHashMutex(dstHost, "processPacket-src-5"); allocHostTrafficCounterMemory(dstHost, nonIPTraffic, sizeof(NonIPTraffic)); if(dstHost->nonIPTraffic == NULL) { unlockHostsHashMutex(srcHost), unlockHostsHashMutex(dstHost); return; } } if(vlanId != NO_VLAN) { srcHost->vlanId = vlanId; dstHost->vlanId = vlanId; } switch(eth_type) { case ETHERTYPE_ARP: /* ARP - Address resolution Protocol */ memcpy(&arpHdr, p+hlen, sizeof(arpHdr)); hlen += (u_int)sizeof(arpHdr); if(EXTRACT_16BITS(&arpHdr.arp_pro) == ETHERTYPE_IP) { int arpOp = EXTRACT_16BITS(&arpHdr.arp_op); switch(arpOp) { case ARPOP_REPLY: /* ARP REPLY */ addr.hostFamily = AF_INET; memcpy(&addr.Ip4Address.s_addr, &arpHdr.arp_tpa, sizeof(struct in_addr)); addr.Ip4Address.s_addr = ntohl(addr.Ip4Address.s_addr); unlockHostsHashMutex(srcHost), unlockHostsHashMutex(dstHost); dstHost = lookupHost(&addr, (u_char*)&arpHdr.arp_tha, vlanId, 0, 0, actualDeviceId, h, p); memcpy(&addr.Ip4Address.s_addr, &arpHdr.arp_spa, sizeof(struct in_addr)); addr.Ip4Address.s_addr = ntohl(addr.Ip4Address.s_addr); if(dstHost != NULL) { lockHostsHashMutex(dstHost, "processPacket-dst-6"); allocHostTrafficCounterMemory(dstHost, nonIPTraffic, sizeof(NonIPTraffic)); incrementHostTrafficCounter(dstHost, nonIPTraffic->arpReplyPktsRcvd, 1); } srcHost = lookupHost(&addr, (u_char*)&arpHdr.arp_sha, vlanId, 0, 0, actualDeviceId, h, p); if(srcHost != NULL) { lockHostsHashMutex(srcHost, "processPacket-src-6"); allocHostTrafficCounterMemory(srcHost, nonIPTraffic, sizeof(NonIPTraffic)); incrementHostTrafficCounter(srcHost, nonIPTraffic->arpReplyPktsSent, 1); } } } /* DO NOT ADD A break ABOVE ! */ case ETHERTYPE_REVARP: /* Reverse ARP */ if(srcHost != NULL) { incrementHostTrafficCounter(srcHost, nonIPTraffic->arp_rarpSent, length); } if(dstHost != NULL) { incrementHostTrafficCounter(dstHost, nonIPTraffic->arp_rarpRcvd, length); } incrementTrafficCounter(&myGlobals.device[actualDeviceId].arpRarpBytes, length); break; case ETHERTYPE_IPv6: processIpPkt(p+hlen, h, orig_p, hlen, length, ether_src, ether_dst, actualDeviceId, vlanId); incrementHostTrafficCounter(srcHost, ipv6BytesSent, length); incrementHostTrafficCounter(dstHost, ipv6BytesRcvd, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].ipv6Bytes, length); break; default: #ifdef UNKNOWN_PACKET_DEBUG traceEvent(CONST_TRACE_INFO, "UNKNOWN_PACKET_DEBUG: %s/%s->%s/%s [eth type %d (0x%x)]", srcHost->hostNumIpAddress, srcHost->ethAddressString, dstHost->hostNumIpAddress, dstHost->ethAddressString, eth_type, eth_type); #endif incrementHostTrafficCounter(srcHost, nonIPTraffic->otherSent, length); incrementHostTrafficCounter(dstHost, nonIPTraffic->otherRcvd, length); incrementTrafficCounter(&myGlobals.device[actualDeviceId].otherBytes, length); incrementUnknownProto(srcHost, 0 /* sent */, eth_type /* eth */, 0 /* dsap */, 0 /* ssap */, 0 /* ip */); incrementUnknownProto(dstHost, 1 /* rcvd */, eth_type /* eth */, 0 /* dsap */, 0 /* ssap */, 0 /* ip */); break; } ctr.value = length; /* Even if this is not IP the hostIpAddress field is fine because it is not used in this special case and I need a placeholder here. */ if(srcHost && dstHost) updatePacketCount(srcHost, dstHost, ctr, 1, actualDeviceId); } } if(srcHost) unlockHostsHashMutex(srcHost); if(dstHost) unlockHostsHashMutex(dstHost); } else { /* count runts somehow? */ } if(myGlobals.flowsList != NULL) /* Handle flows last */ flowsProcess(h, p, deviceId); #ifdef MAX_PROCESS_BUFFER { float elapsed; gettimeofday(&pktEndOfProcessing, NULL); elapsed = timeval_subtract(pktEndOfProcessing, pktStartOfProcessing); myGlobals.processBuffer[++myGlobals.processBufferCount & (MAX_PROCESS_BUFFER - 1)] = elapsed; if(elapsed > myGlobals.pmaxDelay) myGlobals.pmaxDelay = elapsed; } #endif if(myGlobals.pcap_file_list != NULL) { if(myGlobals.actTime > (lastUpdateThptTime + PARM_THROUGHPUT_REFRESH_INTERVAL)) { updateThpt(1); lastUpdateThptTime = myGlobals.actTime; } } if(myGlobals.resetHashNow == 1) { int i; traceEvent(CONST_TRACE_INFO, "Resetting stats on user request..."); for(i=0; i # Updated 1Q 2000 Rocco Carbone # # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # 1i\ static VendorInfo vendorInfo [] = { 1,$s/-//g 1,$s/ /, "/ 1,$s/^/ { 0x/ 1,$s/$/" }/ 1,$s/$/,/ $a\ { 0x0, NULL } $a\ }; ntop-5.0.1+dfsg1/reportUtils.c0000644000000000000000000055467512010426113014707 0ustar rootroot/* * Copyright (C) 1998-2012 Luca Deri * * http://www.ntop.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ntop.h" #include "globals-report.h" typedef struct osInfo { char *name, *link; } OsInfo; typedef struct osNumInfo { char *name; unsigned short num; } OsNumInfo; static OsInfo osInfos[] = { { "Windows", CONST_IMG_OS_WINDOWS }, { "IRIX", CONST_IMG_OS_IRIX }, { "Linux", CONST_IMG_OS_LINUX }, { "SunOS", CONST_IMG_OS_SUNOS }, { "Solaris", CONST_IMG_OS_SOLARIS }, { "HP/JETdirect", CONST_IMG_OS_HP_JETDIRET }, { "Mac", CONST_IMG_OS_MAC }, { "Novell", CONST_IMG_OS_NOVELL }, { "BSD", CONST_IMG_OS_BSD }, { "Unix", CONST_IMG_OS_UNIX }, { "Berkeley", CONST_IMG_OS_BERKELEY }, { "HP-UX", CONST_IMG_OS_HP_UX }, { "AIX", CONST_IMG_OS_AIX }, { "Cisco", CONST_IMG_OS_CISCO }, { NULL, NULL } }; /* ************************* */ void *mallocAndInitWithReportWarn(int sz, char *from) { void *tmpTable; tmpTable = malloc(sz); if (tmpTable == NULL) { traceEvent(CONST_TRACE_ERROR, "Unable to allocate temporary table (%d) for %s", sz, from); traceEvent(CONST_TRACE_INFO, "User warned, continuing without generating report"); printFlagedWarning("SORRY: An internal error does not allow creation of this report."); } else { memset (tmpTable, 0, sz); } return tmpTable; } /* ************************************ */ void formatUsageCounter(UsageCounter usageCtr, Counter topValue, /* If this value != 0 then a percentage is printed */ int actualDeviceId) { char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; int i, sendHeader=0; HostTraffic *el; if(topValue == 0) { /* No percentage is printed */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s", formatPkts(usageCtr.value.value, formatBuf, sizeof(formatBuf))); sendString(buf); } else { float pctg; pctg = ((float)usageCtr.value.value/(float)topValue)*100; if(pctg > 100) pctg = 100; /* This should not happen ! */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s [%.0f %%]", formatPkts(usageCtr.value.value, formatBuf, sizeof(formatBuf)), pctg); sendString(buf); } for(i=0; i
    "); sendHeader = 1; } sendString("\n
  • "); sendString(makeHostLink(el, 0, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); } else traceEvent(CONST_TRACE_WARNING, "Unable to find host serial - host skipped"); } } if(sendHeader) sendString("
\n"); else sendString(" \n"); } /* ********************************** */ void printTableDoubleEntry(char *buf, int bufLen, char *label, char* color, float totalS, float percentageS, float totalR, float percentageR) { int int_perc; char formatBuf[32]; if((totalS == 0) && (totalR == 0)) return; if(percentageS < 0.5) { int_perc = 0; percentageS = 0; } else if(percentageS > 99.5) { int_perc = 100; percentageS = 100; } else { int_perc = (int)(percentageS + 0.5); } switch(int_perc) { case 0: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s" " \n", getRowColor(), label, formatKBytes(totalS, formatBuf, sizeof(formatBuf))); break; case 100: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s" "\"100%%\"\n", getRowColor(), label, formatKBytes(totalS, formatBuf, sizeof(formatBuf))); break; default: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s" "" "" "\n
\"%d%%\"" "

 

"TABLE_OFF"\n", getRowColor(), label, formatKBytes(totalS, formatBuf, sizeof(formatBuf)), int_perc, (100*int_perc)/100, (100*(100-int_perc))/100); } sendString(buf); /* ************************ */ if(totalR == 0) percentageR = 0; if(percentageR < 0.5) { int_perc = 0; percentageR = 0; } else if(percentageR > 99.5) { int_perc = 100; percentageR = 100; } else { int_perc = (int)(percentageR + 0.5); } switch(int_perc) { case 0: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" " \n\n", formatKBytes(totalR, formatBuf, sizeof(formatBuf))); break; case 100: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "\"100\"\n\n", formatKBytes(totalR, formatBuf, sizeof(formatBuf))); break; default: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "" "\n
\"%d%%\"" "" "

 

\n\n", formatKBytes(totalR, formatBuf, sizeof(formatBuf)), int_perc, (100*int_perc)/100, (100*(100-int_perc))/100); } sendString(buf); } /* ********************************** */ void printTableEntryPercentage(char *buf, int bufLen, char *label, char* label_1, char* label_2, float total, float percentage, u_int showFlows, Counter flows) { int int_perc; char formatBuf[32], flowBuf[64], tmpBuf[32]; if(percentage < 0.5) int_perc = 0; else if(percentage > 99.5) int_perc = 100; else int_perc = (int) (percentage + 0.5); if(showFlows == 0) flowBuf[0] = '\0'; else safe_snprintf(__FILE__, __LINE__, flowBuf, sizeof(flowBuf), "%s", formatPkts(flows, tmpBuf, sizeof(tmpBuf))); switch(int_perc) { case 0: if(total == -1) { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "\n%s" "\n" "\n" "" "" "\n
%s 0 %%\n" "" "\n
 
%s 100 %%
\n\n", getRowColor(), label, CONST_COLOR_1, flowBuf, /* label_1, */ CONST_COLOR_2, CONST_COLOR_2, label_2); } else { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "\n%s" "%s %s" "\n" "\n" "" "" "\n
%s 0 %%\n" "" "\n
 
%s 100 %%
\n\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, CONST_COLOR_1, label_1, CONST_COLOR_2, CONST_COLOR_1, label_2); } break; case 100: if(total == -1) { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "\n%s" "" "\n" "\n" "" "" "\n
%s 100 %%\n" "" "\n
 
%s 0 %%
\n\n", getRowColor(), label, CONST_COLOR_1, label_1, CONST_COLOR_1, CONST_COLOR_2, label_2); } else { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "\n%s" "%s %s" "\n" "\n" "" "" "\n
%s 100 %%\n" "" "\n
 
%s 0 %%
\n\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, CONST_COLOR_1, label_1, CONST_COLOR_1, CONST_COLOR_2, label_2); } break; default: if(total == -1) { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "\n%s" "\n" "" "\n" "" "" "\n
%s %.1f %%\n" "" "" "\n
  
%s %.1f %%
\n\n", getRowColor(), label, CONST_COLOR_1, label_1, percentage, int_perc, CONST_COLOR_1, (100-int_perc), CONST_COLOR_2, CONST_COLOR_2, label_2, (100-percentage)); } else { safe_snprintf(__FILE__, __LINE__, buf, bufLen, "\n%s%s %s" "\n" "" "\n" "" "\n
%s %.1f %%\n" "" "" "\n
  
%s %.1f %%
\n\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, CONST_COLOR_1, label_1, percentage, int_perc, CONST_COLOR_1, (100-int_perc), CONST_COLOR_2, CONST_COLOR_2, label_2, (100-percentage)); } } sendString(buf); } /* ******************************* */ void printFooterHostLink(void) { ; } /* ******************************* */ static void printFooterTrafficPct(void) { char buf[LEN_GENERAL_WORK_BUFFER]; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "

" "\n" "" "\n" "\n" "" "" "" "" "\n" "
The percentage value is - for a given host - the traffic for that host " "during that hour divided by the total traffic for that host for the last 24 hours.
0%% 0%% to %d%% %d%% to %d%% >%d%% to 100%%
\n", CONST_PCTG_LOW, CONST_PCTG_LOW, CONST_PCTG_MID, CONST_PCTG_MID); sendString(buf); } /* ******************************* */ void printFooter(int reportType) { switch(reportType) { case TRAFFIC_STATS: break; case SORT_DATA_RECEIVED_PROTOS: case SORT_DATA_SENT_PROTOS: case SORT_DATA_PROTOS: case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_IP: case SORT_DATA_IP: case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_RECEIVED_THPT: case SORT_DATA_SENT_THPT: case SORT_DATA_THPT: case SORT_DATA_HOST_TRAFFIC: break; } sendString("

\n"); switch(reportType) { case TRAFFIC_STATS: break; case SORT_DATA_RECEIVED_PROTOS: case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_PROTOS: case SORT_DATA_SENT_IP: case SORT_DATA_PROTOS: case SORT_DATA_IP: printFooterHostLink(); break; case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_HOST_TRAFFIC: printFooterHostLink(); printFooterTrafficPct(); break; case SORT_DATA_RECEIVED_THPT: case SORT_DATA_SENT_THPT: case SORT_DATA_THPT: printFooterHostLink(); sendString("

Peak values are the maximum value for any 10 second interval." "
Average values are recomputed each 60 seconds, using values " "accumulated since this run of ntop was started.

\n"); sendString("

Note: Both values are reset each time ntop is restarted.

\n"); break; } sendString("
\n"); } /* ******************************* */ void printHeader(int reportType, int revertOrder, u_int column, HostsDisplayPolicy showHostsMode, LocalityDisplayPolicy showLocalityMode, char *vlanList, u_short vlanId) { char buf[LEN_GENERAL_WORK_BUFFER]; char *sign, *arrowGif, *arrow[128], *theAnchor[128], *url=NULL; int i, idx, j, hourId, useVlans = 0; char htmlAnchor[128], htmlAnchor1[128], theLink[128], theVlanLink[128]; ProtocolsList *protoList; char theDate[8]; struct tm t; char hours[][24] = {"12
AM", "1
AM", "2
AM", "3
AM", "4
AM", "5
AM", "6
AM", "7
AM", "8
AM", "9
AM", "10
AM", "11
AM", "12
PM", "1
PM", "2
PM", "3
PM", "4
PM", "5
PM", "6
PM", "7
PM", "8
PM", "9
PM", "10
PM", "11
PM"}; for(i=0; i%d<-\n",showHostsMode); */ strftime(theDate, 8, CONST_TOD_HOUR_TIMESPEC, localtime_r(&myGlobals.actTime, &t)); hourId = atoi(theDate); memset(arrow, 0, sizeof(arrow)); memset(theAnchor, 0, sizeof(theAnchor)); memset(htmlAnchor, 0, sizeof(htmlAnchor)); memset(htmlAnchor1, 0, sizeof(htmlAnchor1)); if(revertOrder) { sign = ""; arrowGif = " " CONST_IMG_ARROW_UP; } else { sign = "-"; arrowGif = " " CONST_IMG_ARROW_DOWN; } memset(buf, 0, sizeof(buf)); switch(reportType) { case TRAFFIC_STATS: url = CONST_TRAFFIC_STATS_HTML; break; case SORT_DATA_PROTOS: url = CONST_SORT_DATA_PROTOS_HTML; break; case SORT_DATA_IP: url = CONST_SORT_DATA_IP_HTML; break; case SORT_DATA_THPT: url = CONST_SORT_DATA_THPT_HTML; break; case SORT_DATA_HOST_TRAFFIC: url = CONST_SORT_DATA_HOST_TRAFFIC_HTML; break; } safe_snprintf(__FILE__, __LINE__, htmlAnchor, sizeof(htmlAnchor), " 0) && (vlanId < MAX_VLAN)) safe_snprintf(__FILE__, __LINE__, theLink, sizeof(theLink), "/%s?col=%s%d&vlan=%d&showL=%d&showH=", url, revertOrder ? "-" : "", column, vlanId, showLocalityMode); else safe_snprintf(__FILE__, __LINE__, theLink, sizeof(theLink), "/%s?col=%s%d&showL=%d&showH=", url, revertOrder ? "-" : "", column, showLocalityMode); safe_snprintf(__FILE__, __LINE__, theVlanLink, sizeof(theVlanLink), "/%s?col=%s%d&showL=%d&showH=%d", url, revertOrder ? "-" : "", column, showLocalityMode, showHostsMode); sendString("
\n"); if(reportType != TRAFFIC_STATS) { sendString("\n
"); sendString("

\nHosts:" "\n", theLink, theLink, theLink); break; case showOnlyRemoteHosts: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n" "\n" "\n" "\n", theLink, theLink, theLink); break; default: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n" "\n" "\n" "\n", theLink, theLink, theLink); break; } sendString(buf); if(useVlans) { u_char found = 0; sendString("

VLAN: "); for(i=0; i%d ] ", i), found = 1; else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "[ %d ] ", theVlanLink, i, i); sendString(buf); } if(!found) safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "[ All ] "); else safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "[ All ] ", theVlanLink); sendString(buf); } sendString("

\nData:" "

"); } switch(reportType) { case SORT_DATA_RECEIVED_PROTOS: case SORT_DATA_SENT_PROTOS: case SORT_DATA_PROTOS: sendString("

\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"" "\n" "" "\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2]); sendString(buf); for(i=0; i<=15; i++) if(abs(column) == i+1) { arrow[i] = arrowGif; theAnchor[i] = htmlAnchor; } else { arrow[i] = ""; theAnchor[i] = htmlAnchor1; } safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "" "" "" "", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2], theAnchor[3], arrow[3], theAnchor[4], arrow[4], theAnchor[7], arrow[7], theAnchor[8], arrow[8]); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "" "" "", theAnchor[10], arrow[10], theAnchor[12], arrow[12], theAnchor[13], arrow[13], theAnchor[14], arrow[14]); sendString(buf); protoList = myGlobals.ipProtosList, idx=0; while(protoList != NULL) { if(abs(column) == BASE_PROTOS_IDX+idx) { arrow[BASE_PROTOS_IDX+idx] = arrowGif; theAnchor[BASE_PROTOS_IDX+idx] = htmlAnchor; } else { arrow[BASE_PROTOS_IDX+idx] = ""; theAnchor[BASE_PROTOS_IDX+idx] = htmlAnchor1; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", theAnchor[BASE_PROTOS_IDX+idx], BASE_PROTOS_IDX+idx, protoList->protocolName, arrow[BASE_PROTOS_IDX+idx]); sendString(buf); idx++, protoList = protoList->next; } safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "", theAnchor[15], arrow[15]); sendString(buf); break; case SORT_DATA_RECEIVED_IP: case SORT_DATA_SENT_IP: case SORT_DATA_IP: sendString("
\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s%s0\">Data%s%s1\">TCP%s%s2\">UDP%s%s3\">ICMP%s%s4\">ICMPv6%s%s7\">IPsec%s%s8\">(R)ARP%s%s11\">NetBios%s%s13\">GRE%s%s14\">IPv6%s%s15\">STP%s%s%d\">%s%s%s16\">Other%s
" "\n" "" "\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2]); sendString(buf); if(abs(column) == 1) { arrow[0] = arrowGif; theAnchor[0] = htmlAnchor; } else { arrow[0] = ""; theAnchor[0] = htmlAnchor1; } for(i=0; i 0) { if(abs(column) == (i+2)) { arrow[0] = arrowGif; theAnchor[0] = htmlAnchor; } else { arrow[0] = ""; theAnchor[0] = htmlAnchor1; } safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "", theAnchor[0], i+2, getProtoName(0, i), arrow[0]); sendString(buf); } } break; case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_HOST_TRAFFIC: sendString("
\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s%s0\">Data%s%s%d\">%s%s
" "" "\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1]); sendString(buf); j = hourId; for (i = 0; i < 24; i++) { j = j % 24; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", hours[j]); sendString (buf); if (!j) { j = 23; } else { j--; } } break; case SORT_DATA_RECEIVED_THPT: case SORT_DATA_SENT_THPT: case SORT_DATA_THPT: sendString("
\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON "
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s%s
" "" "\n\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1]); sendString(buf); updateThpt(0); if(abs(column) == 1) { arrow[0] = arrowGif; theAnchor[0] = htmlAnchor; } else { arrow[0] = ""; theAnchor[0] = htmlAnchor1; } if(abs(column) == 2) { arrow[1] = arrowGif; theAnchor[1] = htmlAnchor; } else { arrow[1] = ""; theAnchor[1] = htmlAnchor1; } if(abs(column) == 3) { arrow[2] = arrowGif; theAnchor[2] = htmlAnchor; } else { arrow[2] = ""; theAnchor[2] = htmlAnchor1;} if(abs(column) == 4) { arrow[3] = arrowGif; theAnchor[3] = htmlAnchor; } else { arrow[3] = ""; theAnchor[3] = htmlAnchor1;} if(abs(column) == 5) { arrow[4] = arrowGif; theAnchor[4] = htmlAnchor; } else { arrow[4] = ""; theAnchor[4] = htmlAnchor1;} if(abs(column) == 6) { arrow[5] = arrowGif; theAnchor[5] = htmlAnchor; } else { arrow[5] = ""; theAnchor[5] = htmlAnchor1;} safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "\n"); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "" "" "", theAnchor[0], arrow[0], theAnchor[1], arrow[1], theAnchor[2], arrow[2]); sendString(buf); break; case TRAFFIC_STATS: sendString("
\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, ""TABLE_ON"
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%sData
%s1\">Current%s%s2\">Avg%s%s3\">Peak%s
" "" "\n\n", theAnchor[0], arrow[0], theAnchor[1], arrow[1]); sendString(buf); break; } sendString("\n\n"); } /* ******************************* */ char* _getOSFlag(HostTraffic *el, char *elOsName, int showOsName, char *tmpStr, int tmpStrLen, char *file, int line) { /* Lengthen tmpString buffer - to handle long name given by nmap for Win2k Courtesy of Marcel Hauser */ char *flagImg = ""; char *theOsName; int i; if((el == NULL) && (elOsName == NULL)) return(""); tmpStr[0] = '\0'; if(elOsName != NULL) theOsName = elOsName; else { if(el->fingerprint == NULL) return(""); if(el->fingerprint[0] != ':') setHostFingerprint(el); if(el->fingerprint[0] != ':') return(""); theOsName = &el->fingerprint[1]; } if(theOsName[0] == '\0') return(""); flagImg = NULL; for(i=0; osInfos[i].link != NULL; i++) { if(strstr(theOsName, osInfos[i].name) != NULL) { flagImg = osInfos[i].link; break; } } if(!showOsName) { if(flagImg != NULL) { safe_snprintf(file, line, tmpStr, tmpStrLen, "%s", flagImg); } else tmpStr[0] = '\0'; } else { if(flagImg != NULL) { safe_snprintf(file, line, tmpStr, tmpStrLen, "%s [%s]", flagImg, theOsName); } else { safe_snprintf(file, line, tmpStr, tmpStrLen, "%s", theOsName); } } return(tmpStr); } /* ******************************* */ int sortHostFctn(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; int rc, n_a, n_b; char *nameA, *nameB; if((a == NULL) && (b != NULL)) { traceEvent(CONST_TRACE_WARNING, "sortHostFctn() error (1)"); return(1); } else if((a != NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortHostFctn() error (2)"); return(-1); } else if((a == NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "sortHostFctn() error (3)"); return(0); } switch(myGlobals.columnSort) { case 1: rc=cmpFctnResolvedName(a, b); return(rc); break; case 2: rc = addrcmp(&(*a)->hostIpAddress,&(*b)->hostIpAddress); return(rc); break; case 3: return(strcasecmp((*a)->ethAddressString, (*b)->ethAddressString)); case 5: return(strcasecmp(getVendorInfo((*a)->ethAddress, 0), getVendorInfo((*b)->ethAddress, 0))); break; case 6: if((*a)->nonIPTraffic == NULL) { nameA = ""; } else { if((*a)->nonIPTraffic->nbHostName != NULL) nameA = (*a)->nonIPTraffic->nbHostName; else nameA = ""; } if((*b)->nonIPTraffic == NULL) { nameB = ""; } else { if((*b)->nonIPTraffic->nbHostName != NULL) nameB = (*b)->nonIPTraffic->nbHostName; else nameB = ""; } return(strcasecmp(nameA, nameB)); break; case 7: n_a = guessHops(*a); n_b = guessHops(*b); if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case 8: n_a = (int)((*a)->totContactedSentPeers+(*a)->totContactedRcvdPeers); n_b = (int)((*b)->totContactedSentPeers+(*b)->totContactedRcvdPeers); if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case 9: n_a = (int)((*a)->lastSeen-(*a)->firstSeen); n_b = (int)((*b)->lastSeen-(*b)->firstSeen); if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case 10: n_a = (*a)->hostAS, n_b = (*b)->hostAS; if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case 11: return(strcasecmp((*a)->community ? (*a)->community : "", (*b)->community ? (*b)->community : "")); break; case 12: return(memcmp(&(*a)->flags, &(*b)->flags, sizeof(fd_set))); break; case CONST_VLAN_COLUMN_SORT: n_a = (*a)->vlanId, n_b = (*b)->vlanId; if(n_a < n_b) return(1); else if(n_a > n_b) return(-1); else return(0); break; case FLAG_DOMAIN_DUMMY_IDX: rc = cmpFctnLocationName(a, b); return(rc); break; case 4: default: if((*a)->actBandwidthUsage < (*b)->actBandwidthUsage) return(1); else if ((*a)->actBandwidthUsage > (*b)->actBandwidthUsage) return(-1); else return(0); break; } } /* ******************************* */ int cmpUsersTraffic(const void *_a, const void *_b) { UsersTraffic **a = (UsersTraffic **)_a; UsersTraffic **b = (UsersTraffic **)_b; Counter sum_a, sum_b; if((a == NULL) && (b != NULL)) { return(1); } else if((a != NULL) && (b == NULL)) { return(-1); } else if((a == NULL) && (b == NULL)) { return(0); } sum_a = (*a)->bytesSent + (*a)->bytesRcvd; sum_b = (*b)->bytesSent + (*b)->bytesRcvd; if(sum_a > sum_b) return(-1); else if (sum_a == sum_b) return(0); else return(1); } /* ******************************* */ int cmpProcesses(const void *_a, const void *_b) { ProcessInfo **a = (ProcessInfo **)_a; ProcessInfo **b = (ProcessInfo **)_b; if((a == NULL) && (b != NULL)) { return(1); } else if((a != NULL) && (b == NULL)) { return(-1); } else if((a == NULL) && (b == NULL)) { return(0); } switch(myGlobals.columnSort) { case 2: /* PID */ if((*a)->pid == (*b)->pid) return(0); else if((*a)->pid < (*b)->pid) return(1); else return(-1); break; case 3: /* User */ return(strcasecmp((*a)->user, (*b)->user)); break; case 4: /* Sent */ if((*a)->bytesSent.value == (*b)->bytesSent.value) return(0); else if((*a)->bytesSent.value < (*b)->bytesSent.value) return(1); else return(-1); break; case 5: /* Rcvd */ if((*a)->bytesRcvd.value == (*b)->bytesRcvd.value) return(0); else if((*a)->bytesRcvd.value < (*b)->bytesRcvd.value) return(1); else return(-1); break; default: /* Process name */ return(strcasecmp((*a)->command, (*b)->command)); } } /* ******************************* */ static int cmpOSFctn(const void *_a, const void *_b) { OsNumInfo *a = (OsNumInfo *)_a; OsNumInfo *b = (OsNumInfo *)_b; if(a->num < b->num) return(1); else return(-1); } /* ******************************* */ int cmpFctnLocationName(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; char *c_a = "", *c_b = ""; if((a != NULL) && (*a != NULL) && (*a)->geo_ip && ((*a)->geo_ip->country_code != NULL)) c_a = (*a)->geo_ip->country_code; if((b != NULL) && (*b != NULL) && (*b)->geo_ip && ((*b)->geo_ip->country_code != NULL)) c_b = (*b)->geo_ip->country_code; return(strcmp(c_a, c_b)); } /* ******************************* */ int cmpFctn(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; Counter a_=0, b_=0; float fa_=0, fb_=0; short floatCompare = 0, columnProtoId; if((a == NULL) && (b != NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (1)"); return(1); } else if((a != NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (2)"); return(-1); } else if((a == NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (3)"); return(0); } else if((*a == NULL) && (*b != NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (4)"); return(1); } else if((*a != NULL) && (*b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (5)"); return(-1); } else if((*a == NULL) && (*b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpFctn() error (6)"); return(0); } if(myGlobals.columnSort == FLAG_HOST_DUMMY_IDX) { return(cmpFctnResolvedName(a, b)); } else if(myGlobals.columnSort == FLAG_DOMAIN_DUMMY_IDX) { int rc; fillDomainName(*a); fillDomainName(*b); #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "%s='%s'/'%s' - %s='%s'/'%s'", (*a)->hostResolvedName, (*a)->ip2ccValue, (*a)->dnsDomainValue, (*b)->hostResolvedName, (*b)->ip2ccValue, (*b)->dnsDomainValue ); #endif rc = cmpFctnLocationName(a, b); return(rc); } #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "reportKind=%d/columnSort=%d/numIpProtosToMonitor=%d\n", myGlobals.reportKind, myGlobals.columnSort, myGlobals.numIpProtosToMonitor); #endif switch(myGlobals.reportKind) { case SORT_DATA_RECEIVED_PROTOS: switch(myGlobals.columnSort) { case 0: a_ = (*a)->bytesRcvd.value, b_ = (*b)->bytesRcvd.value; break; case 1: a_ = (*a)->tcpRcvdLoc.value + (*a)->tcpRcvdFromRem.value; b_ = (*b)->tcpRcvdLoc.value + (*b)->tcpRcvdFromRem.value; break; case 2: a_ = (*a)->udpRcvdLoc.value + (*a)->udpRcvdFromRem.value; b_ = (*b)->udpRcvdLoc.value + (*b)->udpRcvdFromRem.value; break; case 3: a_ = (*a)->icmpRcvd.value, b_ = (*b)->icmpRcvd.value; break; case 4: a_ = (*a)->icmp6Rcvd.value, b_ = (*b)->icmp6Rcvd.value; break; case 7: a_ = (*a)->ipsecRcvd.value; b_ = (*b)->ipsecRcvd.value; break; case 8: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->arp_rarpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->arp_rarpRcvd.value; break; case 11: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->netbiosRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->netbiosRcvd.value; break; case 13: a_ = (*a)->greRcvd.value; b_ = (*b)->greRcvd.value; break; case 14: a_ = (*a)->ipv6BytesRcvd.value, b_ = (*b)->ipv6BytesRcvd.value; break; case 15: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->stpRcvd.value; break; case 16: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->otherRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->otherRcvd.value; break; default: if((myGlobals.columnSort >= BASE_PROTOS_IDX) && (myGlobals.columnSort < (BASE_PROTOS_IDX+myGlobals.numIpProtosList))) { int idx = myGlobals.columnSort-BASE_PROTOS_IDX; if((*a)->ipProtosList && (*a)->ipProtosList[idx]) a_ = (*a)->ipProtosList[idx]->rcvd.value; else a_ = 0; if((*b)->ipProtosList && (*b)->ipProtosList[idx]) b_ = (*b)->ipProtosList[idx]->rcvd.value; else b_ = 0; } break; } break; case SORT_DATA_RECEIVED_IP: columnProtoId = myGlobals.columnSort - 1; if((columnProtoId != -1) && (columnProtoId <= myGlobals.l7.numSupportedProtocols)) { if(columnProtoId <= 0) { a_ = b_ = 0; } else { a_ = (*a)->l7.traffic[columnProtoId-1].bytesRcvd; b_ = (*b)->l7.traffic[columnProtoId-1].bytesRcvd; } } else { a_ = (*a)->ipv4BytesRcvd.value, b_ = (*b)->ipv4BytesRcvd.value; } break; case SORT_DATA_RECEIVED_THPT: switch(myGlobals.columnSort) { case 1: fa_ = (*a)->actualRcvdThpt, fb_ = (*b)->actualRcvdThpt, floatCompare = 1; break; case 2: fa_ = (*a)->averageRcvdThpt, fb_ = (*b)->averageRcvdThpt, floatCompare = 1; break; case 3: fa_ = (*a)->peakRcvdThpt, fb_ = (*b)->peakRcvdThpt, floatCompare = 1; break; } break; case SORT_DATA_RCVD_HOST_TRAFFIC: case SORT_DATA_SENT_HOST_TRAFFIC: case SORT_DATA_HOST_TRAFFIC: /* Nothing */ break; case SORT_DATA_SENT_PROTOS: switch(myGlobals.columnSort) { case 0: a_ = (*a)->bytesSent.value, b_ = (*b)->bytesSent.value; break; case 1: a_ = (*a)->tcpSentLoc.value + (*a)->tcpSentRem.value; b_ = (*b)->tcpSentLoc.value + (*b)->tcpSentRem.value; break; case 2: a_ = (*a)->udpSentLoc.value + (*a)->udpSentRem.value; b_ = (*b)->udpSentLoc.value + (*b)->udpSentRem.value; break; case 3: a_ = (*a)->icmpSent.value, b_ = (*b)->icmpSent.value; break; case 4: a_ = (*a)->icmp6Sent.value, b_ = (*b)->icmp6Sent.value; break; case 7: a_ = (*a)->ipsecSent.value; b_ = (*b)->ipsecSent.value; break; case 8: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->arp_rarpSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->arp_rarpSent.value; break; case 11: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->netbiosSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->netbiosSent.value; break; case 13: a_ = (*a)->greSent.value; b_ = (*b)->greSent.value; break; case 14: a_ = (*a)->ipv6BytesSent.value, b_ = (*b)->ipv6BytesSent.value; break; case 15: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->stpSent.value; break; case 16: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->otherSent.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->otherSent.value; break; default: if((myGlobals.columnSort >= BASE_PROTOS_IDX) && (myGlobals.columnSort < (BASE_PROTOS_IDX+myGlobals.numIpProtosList))) { int idx = myGlobals.columnSort-BASE_PROTOS_IDX; if((*a)->ipProtosList && (*a)->ipProtosList[idx]) a_ = (*a)->ipProtosList[idx]->sent.value; else a_ = 0; if((*b)->ipProtosList && (*b)->ipProtosList[idx]) b_ = (*b)->ipProtosList[idx]->sent.value; else b_ = 0; } break; } break; case SORT_DATA_SENT_IP: columnProtoId = myGlobals.columnSort - 1; if((columnProtoId != -1) && (columnProtoId <= myGlobals.l7.numSupportedProtocols)) { if(columnProtoId <= 0) { a_ = b_ = 0; } else { a_ = (*a)->l7.traffic[columnProtoId-1].bytesSent; b_ = (*b)->l7.traffic[columnProtoId-1].bytesSent; } } else { a_ = (*a)->ipv4BytesSent.value, b_ = (*b)->ipv4BytesSent.value; } break; case SORT_DATA_SENT_THPT: switch(myGlobals.columnSort) { case 1: fa_ = (*a)->actualSentThpt, fb_ = (*b)->actualSentThpt, floatCompare = 1; break; case 2: fa_ = (*a)->averageSentThpt, fb_ = (*b)->averageSentThpt, floatCompare = 1; break; case 3: fa_ = (*a)->peakSentThpt, fb_ = (*b)->peakSentThpt, floatCompare = 1; break; } break; case TRAFFIC_STATS: /* Nothing */ break; case SORT_DATA_PROTOS: switch(myGlobals.columnSort) { case 0: a_ = (*a)->bytesRcvd.value+(*a)->bytesSent.value, b_ = (*b)->bytesRcvd.value+(*b)->bytesSent.value; break; case 1: a_ = (*a)->tcpRcvdLoc.value + (*a)->tcpRcvdFromRem.value + (*a)->tcpSentLoc.value + (*a)->tcpSentRem.value; b_ = (*b)->tcpRcvdLoc.value + (*b)->tcpRcvdFromRem.value + (*b)->tcpSentLoc.value + (*b)->tcpSentRem.value; break; case 2: a_ = (*a)->udpRcvdLoc.value + (*a)->udpRcvdFromRem.value + (*a)->udpSentLoc.value + (*a)->udpSentRem.value; b_ = (*b)->udpRcvdLoc.value + (*b)->udpRcvdFromRem.value + (*b)->udpSentLoc.value + (*b)->udpSentRem.value; break; case 3: a_ = (*a)->icmpRcvd.value+(*a)->icmpSent.value, b_ = (*b)->icmpRcvd.value+(*b)->icmpSent.value; break; case 4: a_ = (*a)->icmp6Rcvd.value+(*a)->icmp6Sent.value, b_ = (*b)->icmp6Rcvd.value+(*b)->icmp6Sent.value; break; case 5: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpSent.value+(*a)->nonIPTraffic->stpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->stpSent.value+(*b)->nonIPTraffic->stpRcvd.value; break; case 7: a_ = (*a)->ipsecSent.value+(*a)->ipsecRcvd.value; b_ = (*b)->ipsecSent.value+(*b)->ipsecRcvd.value; break; case 8: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->arp_rarpSent.value+(*a)->nonIPTraffic->arp_rarpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->arp_rarpSent.value+(*b)->nonIPTraffic->arp_rarpRcvd.value; break; case 11: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->netbiosSent.value+(*a)->nonIPTraffic->netbiosRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->netbiosSent.value+(*b)->nonIPTraffic->netbiosRcvd.value; break; case 13: a_ = (*a)->greSent.value + (*a)->greRcvd.value; b_ = (*b)->greSent.value + (*b)->greRcvd.value; break; case 14: a_ = (*a)->ipv6BytesRcvd.value+(*a)->ipv6BytesSent.value, b_ = (*b)->ipv6BytesRcvd.value+(*b)->ipv6BytesSent.value; break; case 15: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->stpSent.value+(*a)->nonIPTraffic->stpRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->stpSent.value+(*b)->nonIPTraffic->stpRcvd.value; break; case 16: a_ = (*a)->nonIPTraffic == NULL ? 0 : (*a)->nonIPTraffic->otherSent.value+(*a)->nonIPTraffic->otherRcvd.value; b_ = (*b)->nonIPTraffic == NULL ? 0 : (*b)->nonIPTraffic->otherSent.value+(*b)->nonIPTraffic->otherRcvd.value; break; default: if((myGlobals.columnSort >= BASE_PROTOS_IDX) && (myGlobals.columnSort < (BASE_PROTOS_IDX+myGlobals.numIpProtosList))) { int idx = myGlobals.columnSort-BASE_PROTOS_IDX; if(((*a)->ipProtosList == NULL) && ((*b)->ipProtosList != NULL)) return(1); else if(((*a)->ipProtosList != NULL) && ((*b)->ipProtosList == NULL)) return(-1); if((*a)->ipProtosList && (*a)->ipProtosList[idx]) a_ = (*a)->ipProtosList[idx]->sent.value +(*a)->ipProtosList[idx]->rcvd.value; else a_ = 0; if((*b)->ipProtosList && (*b)->ipProtosList[idx]) b_ = (*b)->ipProtosList[idx]->sent.value +(*b)->ipProtosList[idx]->rcvd.value; else b_ = 0; } break; } break; case SORT_DATA_IP: columnProtoId = myGlobals.columnSort - 1; if((columnProtoId != -1) && (columnProtoId <= myGlobals.l7.numSupportedProtocols)) { if(columnProtoId <= 0) { a_ = b_ = 0; } else { a_ = (*a)->l7.traffic[columnProtoId-1].bytesSent + (*a)->l7.traffic[columnProtoId-1].bytesRcvd; b_ = (*b)->l7.traffic[columnProtoId-1].bytesSent + (*b)->l7.traffic[columnProtoId-1].bytesRcvd; } } else { a_ = (*a)->ipv4BytesRcvd.value+(*a)->ipv4BytesSent.value; b_ = (*b)->ipv4BytesRcvd.value+(*b)->ipv4BytesSent.value; } break; case SORT_DATA_THPT: switch(myGlobals.columnSort) { case 1: fa_ = (*a)->actualThpt; fb_ = (*b)->actualThpt; floatCompare = 1; break; case 2: fa_ = (*a)->averageThpt; fb_ = (*b)->averageThpt; floatCompare = 1; break; case 3: fa_ = (*a)->peakThpt; fb_ = (*b)->peakThpt; floatCompare = 1; break; } break; } if(floatCompare == 0) { #if 0 traceEvent(CONST_TRACE_INFO, "[1] %s=%lu - %s=%lu", (*a)->hostResolvedName, (unsigned long)a_, (*b)->hostResolvedName, (unsigned long)b_); #endif if(a_ < b_) { return(1); } else if (a_ > b_) { return(-1); } } else { #if 0 traceEvent(CONST_TRACE_INFO, "[2] %s=%lu - %s=%lu", (*a)->hostResolvedName, (unsigned long)fa_, (*b)->hostResolvedName, (unsigned long)fb_); #endif if(fa_ < fb_) { return(1); } else if (fa_ > fb_) { return(-1); } } return(0); } /* ******************************* */ int cmpMulticastFctn(const void *_a, const void *_b) { HostTraffic **a = (HostTraffic **)_a; HostTraffic **b = (HostTraffic **)_b; int rc; if((a == NULL) && (b != NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpMulticastFctn() error (1)"); return(1); } else if((a != NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpMulticastFctn() error (2)"); return(-1); } else if((a == NULL) && (b == NULL)) { traceEvent(CONST_TRACE_WARNING, "cmpMulticastFctn() error (3)"); return(0); } switch(myGlobals.columnSort) { case 2: if((*a)->pktsMulticastSent.value < (*b)->pktsMulticastSent.value) return(1); else if ((*a)->pktsMulticastSent.value > (*b)->pktsMulticastSent.value) return(-1); else return(0); break; /* NOTREACHED */ case 3: if((*a)->bytesMulticastSent.value < (*b)->bytesMulticastSent.value) return(1); else if ((*a)->bytesMulticastSent.value > (*b)->bytesMulticastSent.value) return(-1); else return(0); break; /* NOTREACHED */ case 4: if((*a)->pktsMulticastRcvd.value < (*b)->pktsMulticastRcvd.value) return(1); else if ((*a)->pktsMulticastRcvd.value > (*b)->pktsMulticastRcvd.value) return(-1); else return(0); break; /* NOTREACHED */ case 5: if((*a)->bytesMulticastRcvd.value < (*b)->bytesMulticastRcvd.value) return(1); else if ((*a)->bytesMulticastRcvd.value > (*b)->bytesMulticastRcvd.value) return(-1); else return(0); break; /* NOTREACHED */ default: rc=cmpFctnResolvedName(a, b); return(rc); } } /* *********************************** */ static char* getBgPctgColor(float pctg) { if(pctg == 0) return(TD_BG); else if(pctg <= CONST_PCTG_LOW) /* < 25% */ return(CONST_CONST_PCTG_LOW_COLOR); else if(pctg <= CONST_PCTG_MID) /* 25% <=> 75% */ return(CONST_CONST_PCTG_MID_COLOR); else /* > 75% */ return(CONST_PCTG_HIGH_COLOR); } /* ******************************* */ void printHostThtpShort(HostTraffic *el, int reportType, u_int hourId) { int i, j; Counter tc; char buf[64]; if(el->trafficDistribution == NULL) return; for(i=0, tc=0; i<24; i++) { switch(reportType) { case SORT_DATA_RCVD_HOST_TRAFFIC: tc += el->trafficDistribution->last24HoursBytesRcvd[i].value; break; case SORT_DATA_SENT_HOST_TRAFFIC: tc += el->trafficDistribution->last24HoursBytesSent[i].value; break; case SORT_DATA_HOST_TRAFFIC: case TRAFFIC_STATS: tc += el->trafficDistribution->last24HoursBytesRcvd[i].value + el->trafficDistribution->last24HoursBytesSent[i].value; break; } } j = hourId; for(i=0; i<24; i++) { float pctg=0; j = j % 24; if(tc > 0) { switch(reportType) { case SORT_DATA_RCVD_HOST_TRAFFIC: pctg = (float)(el->trafficDistribution->last24HoursBytesRcvd[j].value*100)/(float)tc; break; case SORT_DATA_SENT_HOST_TRAFFIC: pctg = (float)(el->trafficDistribution->last24HoursBytesSent[j].value*100)/(float)tc; break; case SORT_DATA_HOST_TRAFFIC: case TRAFFIC_STATS: pctg = ( (float)(el->trafficDistribution->last24HoursBytesRcvd[j].value*100) + (float)(el->trafficDistribution->last24HoursBytesSent[j].value*100) ) / (float)tc; break; } } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getBgPctgColor(pctg)); sendString(buf); if (!j) { j = 23; } else { j--; } } } /* ******************************* */ int cmpHostsFctn(const void *_a, const void *_b) { struct hostTraffic **a = (struct hostTraffic **)_a; struct hostTraffic **b = (struct hostTraffic **)_b; Counter a_=0, b_=0; switch(myGlobals.columnSort) { case 2: /* IP Address */ return(addrcmp(&(*a)->hostIpAddress, &(*b)->hostIpAddress)); break; case 3: /* Data Sent */ switch(myGlobals.sortFilter) { case FLAG_REMOTE_TO_LOCAL_ACCOUNTING: a_ = (*a)->bytesSentLoc.value; b_ = (*b)->bytesSentLoc.value; break; case FLAG_LOCAL_TO_REMOTE_ACCOUNTING: a_ = (*a)->bytesSentRem.value; b_ = (*b)->bytesSentRem.value; break; case FLAG_LOCAL_TO_LOCAL_ACCOUNTING: a_ = (*a)->bytesSentLoc.value; b_ = (*b)->bytesSentLoc.value; break; } if(a_ < b_) return(1); else if (a_ > b_) return(-1); else return(0); break; case 4: /* Data Rcvd */ switch(myGlobals.sortFilter) { case FLAG_REMOTE_TO_LOCAL_ACCOUNTING: a_ = (*a)->bytesRcvdLoc.value; b_ = (*b)->bytesRcvdLoc.value; break; case FLAG_LOCAL_TO_REMOTE_ACCOUNTING: a_ = (*a)->bytesRcvdFromRem.value; b_ = (*b)->bytesRcvdFromRem.value; break; case FLAG_LOCAL_TO_LOCAL_ACCOUNTING: a_ = (*a)->bytesRcvdLoc.value; b_ = (*b)->bytesRcvdLoc.value; break; } if(a_ < b_) return(1); else if (a_ > b_) return(-1); else return(0); break; default: /* Host Name */ return(cmpFctnResolvedName(a, b)); } return(-1); } /* ************************************ */ int printPacketStats(HostTraffic *el, int actualDeviceId) { char buf[LEN_GENERAL_WORK_BUFFER]; char formatBuf[32]; int headerSent = 0, rc = 0; char *tableHeader = "
%s"FLAG_HOST_DUMMY_IDX_STR"\">Host%s%s"FLAG_DOMAIN_DUMMY_IDX_STR"\">Location%s
 
\n\n
"; /* *********************** */ if(el->secHostPkts != NULL) { if(((el->secHostPkts->rejectedTCPConnSent.value.value+ el->secHostPkts->rejectedTCPConnRcvd.value.value+ el->secHostPkts->establishedTCPConnSent.value.value+ el->secHostPkts->establishedTCPConnRcvd.value.value+ el->secHostPkts->synPktsSent.value.value+ el->secHostPkts->synPktsRcvd.value.value) > 0)) { if(!headerSent) { sendString(tableHeader); headerSent = 1; } sendString("
\n" ""TABLE_ON"" "" "" "\n\n"); if((el->secHostPkts->synPktsSent.value.value+el->secHostPkts->synPktsRcvd.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->synPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->synPktsRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->establishedTCPConnSent.value.value+el->secHostPkts->establishedTCPConnRcvd.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->establishedTCPConnSent, el->secHostPkts->synPktsSent.value.value, actualDeviceId); formatUsageCounter(el->secHostPkts->establishedTCPConnRcvd, el->secHostPkts->synPktsRcvd.value.value, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->terminatedTCPConnServer.value.value + el->secHostPkts->terminatedTCPConnClient.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->terminatedTCPConnServer, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->terminatedTCPConnClient, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->rejectedTCPConnSent.value.value+el->secHostPkts->rejectedTCPConnRcvd.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->rejectedTCPConnSent, el->secHostPkts->synPktsSent.value.value, actualDeviceId); formatUsageCounter(el->secHostPkts->rejectedTCPConnRcvd, el->secHostPkts->synPktsRcvd.value.value, actualDeviceId); sendString("\n\n"); } } /* *********************** */ if((el->secHostPkts->synPktsSent.value.value+el->secHostPkts->synPktsRcvd.value.value +el->secHostPkts->rstAckPktsSent.value.value+el->secHostPkts->rstAckPktsRcvd.value.value +el->secHostPkts->rstPktsSent.value.value+el->secHostPkts->rstPktsRcvd.value.value +el->secHostPkts->synFinPktsSent.value.value+el->secHostPkts->synFinPktsRcvd.value.value +el->secHostPkts->finPushUrgPktsSent.value.value+el->secHostPkts->finPushUrgPktsRcvd.value.value +el->secHostPkts->nullPktsSent.value.value+el->secHostPkts->nullPktsRcvd.value.value) > 0) { if(!headerSent) { sendString(tableHeader); headerSent = 1; sendString("
\n"TABLE_ON"
TCP ConnectionsDirected toRcvd From
Attempted
Established
Terminated
Rejected
"); sendString("" "" "\n\n"); } if((el->secHostPkts->synPktsSent.value.value+el->secHostPkts->synPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->synPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->synPktsRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->rstAckPktsSent.value.value+el->secHostPkts->rstAckPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->rstAckPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->rstAckPktsRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->rstPktsSent.value.value+el->secHostPkts->rstPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->rstPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->rstPktsRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->synFinPktsSent.value.value+el->secHostPkts->synFinPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->synFinPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->synFinPktsRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->finPushUrgPktsSent.value.value+el->secHostPkts->finPushUrgPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->finPushUrgPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->finPushUrgPktsRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->nullPktsSent.value.value+el->secHostPkts->nullPktsRcvd.value.value) > 0) { sendString(""); formatUsageCounter(el->secHostPkts->nullPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->nullPktsRcvd, 0, actualDeviceId); sendString("\n\n"); } } /* *********************** */ if(((el->secHostPkts->ackXmasFinSynNullScanSent.value.value+el->secHostPkts->ackXmasFinSynNullScanRcvd.value.value +el->secHostPkts->udpToClosedPortSent.value.value +el->secHostPkts->udpToClosedPortRcvd.value.value +el->secHostPkts->udpToDiagnosticPortSent.value.value +el->secHostPkts->udpToDiagnosticPortRcvd.value.value +el->secHostPkts->tcpToDiagnosticPortSent.value.value +el->secHostPkts->tcpToDiagnosticPortRcvd.value.value +el->secHostPkts->tinyFragmentSent.value.value +el->secHostPkts->tinyFragmentRcvd.value.value +el->secHostPkts->icmpFragmentSent.value.value +el->secHostPkts->icmpFragmentRcvd.value.value +el->secHostPkts->overlappingFragmentSent.value.value +el->secHostPkts->overlappingFragmentRcvd.value.value +el->secHostPkts->closedEmptyTCPConnSent.value.value +el->secHostPkts->closedEmptyTCPConnRcvd.value.value +el->secHostPkts->icmpPortUnreachSent.value.value +el->secHostPkts->icmpPortUnreachRcvd.value.value +el->secHostPkts->icmpHostNetUnreachSent.value.value +el->secHostPkts->icmpHostNetUnreachRcvd.value.value +el->secHostPkts->icmpProtocolUnreachSent.value.value +el->secHostPkts->icmpProtocolUnreachRcvd.value.value +el->secHostPkts->icmpAdminProhibitedSent.value.value +el->secHostPkts->icmpAdminProhibitedRcvd.value.value +el->secHostPkts->malformedPktsSent.value.value +el->secHostPkts->malformedPktsRcvd.value.value ) > 0)) { if(!headerSent) { sendString(tableHeader); headerSent = 1; sendString("
\n"TABLE_ON"
TCP FlagsPkts SentPkts Rcvd
SYN
RST|ACK
RST
SYN|FIN
FIN|PUSH|URG
NULL
"); sendString("" "" "" "\n\n"); } if((el->secHostPkts->ackXmasFinSynNullScanSent.value.value+el->secHostPkts->ackXmasFinSynNullScanRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->ackXmasFinSynNullScanSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->ackXmasFinSynNullScanRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->udpToClosedPortSent.value.value+ el->secHostPkts->udpToClosedPortRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->udpToClosedPortSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->udpToClosedPortRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->udpToDiagnosticPortSent.value.value+ el->secHostPkts->udpToDiagnosticPortRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->udpToDiagnosticPortSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->udpToDiagnosticPortRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->tcpToDiagnosticPortSent.value.value+ el->secHostPkts->tcpToDiagnosticPortRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->tcpToDiagnosticPortSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->tcpToDiagnosticPortRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->tinyFragmentSent.value.value+ el->secHostPkts->tinyFragmentRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->tinyFragmentSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->tinyFragmentRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->icmpFragmentSent.value.value+ el->secHostPkts->icmpFragmentRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpFragmentSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpFragmentRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->overlappingFragmentSent.value.value+ el->secHostPkts->overlappingFragmentRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->overlappingFragmentSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->overlappingFragmentRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->closedEmptyTCPConnSent.value.value+ el->secHostPkts->closedEmptyTCPConnRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->closedEmptyTCPConnSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->closedEmptyTCPConnRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->icmpPortUnreachSent.value.value+ el->secHostPkts->icmpPortUnreachRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpPortUnreachSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpPortUnreachRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->icmpHostNetUnreachSent.value.value+ el->secHostPkts->icmpHostNetUnreachRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpHostNetUnreachSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpHostNetUnreachRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->icmpProtocolUnreachSent.value.value+ el->secHostPkts->icmpProtocolUnreachRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpProtocolUnreachSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpProtocolUnreachRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->icmpAdminProhibitedSent.value.value+ el->secHostPkts->icmpAdminProhibitedRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->icmpAdminProhibitedSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->icmpAdminProhibitedRcvd, 0, actualDeviceId); sendString("\n\n"); } if((el->secHostPkts->malformedPktsSent.value.value+ el->secHostPkts->malformedPktsRcvd.value.value) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); formatUsageCounter(el->secHostPkts->malformedPktsSent, 0, actualDeviceId); formatUsageCounter(el->secHostPkts->malformedPktsRcvd, 0, actualDeviceId); sendString("\n\n"); } } } if(headerSent) { sendString("
AnomalyPkts Sent toPkts Rcvd from
ACK/XMAS/SYN/FIN/NULL Scan
UDP Pkt to Closed Port
UDP Pkt Disgnostic Port
TCP Pkt Disgnostic Port
Tiny Fragments
ICMP Fragments
Overlapping Fragments
Closed Empty TCP Conn.
ICMP Port Unreachable
ICMP Net Unreachable
ICMP Protocol Unreachable
ICMP Administratively Prohibited
Malformed Pkts
"TABLE_OFF"

\n"); sendString("

\n"); sendString("
"TABLE_OFF"
"); rc = 1; } if(el->nonIPTraffic) { if((el->nonIPTraffic->arpReqPktsSent.value + el->nonIPTraffic->arpReplyPktsSent.value + el->nonIPTraffic->arpReplyPktsRcvd.value) > 0) { rc = 1; //if(headerSent) sendString(tableHeader); sendString("
\n"TABLE_ON""); sendString("" "" "" "\n\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(el->nonIPTraffic->arpReqPktsSent.value, formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(el->nonIPTraffic->arpReplyPktsRcvd.value, formatBuf, sizeof(formatBuf)), ((el->nonIPTraffic->arpReqPktsSent.value > 0) ? (float)((el->nonIPTraffic->arpReplyPktsRcvd.value*100)/(float)el->nonIPTraffic->arpReqPktsSent.value) : 0)); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", getRowColor(), formatPkts(el->nonIPTraffic->arpReplyPktsSent.value, formatBuf, sizeof(formatBuf))); sendString(buf); sendString("
ARPPackets
Request Sent%s
Reply Rcvd%s (%.1f %%)
Reply Sent%s
"TABLE_OFF"

\n

\n"); } } return(rc); } /* ************************************ */ void hostReport(int idx, char *hostName, int vlanId, int sortedColumn) { HostTraffic *el; urlFixupFromRFC1945Inplace(hostName); #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "Searching hostname: '%s'", hostName); #endif for(el=getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if((el != myGlobals.broadcastEntry) && (el->hostNumIpAddress != NULL) && ((el->vlanId <= 0) || (el->vlanId == vlanId)) && ((strcmp(el->hostNumIpAddress, hostName) == 0) || (strcmp(el->ethAddressString, hostName) == 0))) { break; } } /* for */ if(el) { if(el->community && (!isAllowedCommunity(el->community))) { returnHTTPpageBadCommunity(); } else { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); switch(idx) { case 0: hostTrafficDistrib(el, sortedColumn); break; case 1: hostFragmentDistrib(el, sortedColumn); break; case 2: hostTotalFragmentDistrib(el, sortedColumn); break; case 3: hostTimeTrafficDistribution(el, sortedColumn); break; case 4: hostIPTrafficDistrib(el, sortedColumn); break; case 5: sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 0); createHostMap(el); break; } } } } /* ************************************ */ void printHostFragmentStats(HostTraffic *el, int actualDeviceId) { Counter totalSent, totalRcvd; char buf[LEN_GENERAL_WORK_BUFFER]; char linkName[LEN_GENERAL_WORK_BUFFER/2]; totalSent = el->tcpFragmentsSent.value + el->udpFragmentsSent.value + el->icmpFragmentsSent.value; totalRcvd = el->tcpFragmentsRcvd.value + el->udpFragmentsRcvd.value + el->icmpFragmentsRcvd.value; if((totalSent == 0) && (totalRcvd == 0)) return; sendString("
\n" ""TABLE_ON"" "" "" "\n\n"); printTableDoubleEntry(buf, sizeof(buf), "TCP", CONST_COLOR_1, (float)el->tcpFragmentsSent.value/1024, 100*((float)SD(el->tcpFragmentsSent.value, totalSent)), (float)el->tcpFragmentsRcvd.value/1024, 100*((float)SD(el->tcpFragmentsRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "UDP", CONST_COLOR_1, (float)el->udpFragmentsSent.value/1024, 100*((float)SD(el->udpFragmentsSent.value, totalSent)), (float)el->udpFragmentsRcvd.value/1024, 100*((float)SD(el->udpFragmentsRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "ICMP", CONST_COLOR_1, (float)el->icmpFragmentsSent.value/1024, 100*((float)SD(el->icmpFragmentsSent.value, totalSent)), (float)el->icmpFragmentsRcvd.value/1024, 100*((float)SD(el->icmpFragmentsRcvd.value, totalRcvd))); if((totalSent > 0) || (totalRcvd > 0)) { int vlanId; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); if(el->hostNumIpAddress[0] != '\0') { strncpy(linkName, el->hostNumIpAddress, sizeof(linkName)); } else { strncpy(linkName, el->ethAddressString, sizeof(linkName)); } /* For Ethernet and IPv6 addresses */ urlFixupToRFC1945Inplace(linkName); if(el->vlanId > 0) { vlanId = -el->vlanId; } else vlanId = 0; if(totalSent > 0) { sendString(""); } else { sendString(""); } if(totalRcvd > 0) { sendString(""); } else { sendString(""); } sendString("\n"); /* ***************************************** */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "", getRowColor()); sendString(buf); if(totalSent > 0) { sendString(""); } else { sendString(""); } if(totalRcvd > 0) { sendString(""); } else { sendString(""); } sendString("\n"); } sendString("
ProtocolData SentData Rcvd
Fragment Distribution"); hostReport(1, linkName, vlanId, 1); sendString(" "); hostReport(1, linkName, vlanId, 1); sendString(" 
IP Fragment Distribution"); hostReport(2, linkName, vlanId, 1); sendString(" "); hostReport(2, linkName, vlanId, 0); sendString(" 
"TABLE_OFF"

\n"); sendString("

\n"); } /* ************************************ */ static char* sap2name(u_int16_t proto, char *sap, int sap_len) { switch(proto) { case SAP_NULL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "NULL LSAP"); break; case SAP_LLC_SLMGMT: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "LLC Sub-Layer Management"); break; case SAP_SNA_PATHCTRL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "SNA Path Control"); break; case SAP_IP: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "TCP/IP"); break; case SAP_SNA1: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "SNA"); break; case SAP_SNA2: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "SNA"); break; case SAP_PROWAY_NM_INIT: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "PROWAY (IEC955) Network Management and Initialization"); break; case SAP_TI: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Texas Instruments"); break; case SAP_BPDU: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Spanning Tree BPDU"); break; case SAP_RS511: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "EIA RS-511 Manufacturing Message Service"); break; case SAP_X25: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "ISO 8208 (X.25 over 802.2)"); break; case 0x7F: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "ISO 802.2"); break; case SAP_XNS: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "XNS"); break; case SAP_BACNET: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "BACnet"); break; case SAP_NESTAR: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Nestar"); break; case SAP_PROWAY_ASLM: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "PROWAY (IEC955) Active Station List Maintenance"); break; case SAP_ARP: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "ARP"); break; case SAP_SNAP: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "SNAP"); break; case SAP_VINES1: case SAP_VINES2: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Banyan Vines"); break; case SAP_NETWARE: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "NetWare"); break; case SAP_NETBIOS: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "NetBIOS"); break; case SAP_IBMNM: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "IBM Net Management"); break; case SAP_HPEXT: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "HP Extended LLC"); break; case SAP_UB: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Ungermann-Bass"); break; case SAP_RPL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Remote Program Load"); break; case SAP_OSINL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "ISO Network Layer"); break; case SAP_GLOBAL: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "Global LSAP"); break; default: safe_snprintf(__FILE__, __LINE__, sap, sap_len, "0x%X", proto); break; } return(sap); } /* ************************************ */ static void printUnknownProto(UnknownProto proto) { char buf[64]; switch(proto.protoType) { case 1: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • Ethernet Type: 0x%04X\n", proto.proto.ethType); break; case 2: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • SAP: DSAP=0x%02X/SSAP=0x%02X\n", proto.proto.sapType.dsap, proto.proto.sapType.ssap); break; case 3: safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
  • IP Protocol: 0x%d\n", proto.proto.ipType); break; default: return; } sendString(buf); } /* ************************************ */ void printHostTrafficStats(HostTraffic *el, int actualDeviceId) { Counter totalSent, totalRcvd; Counter actTotalSent, actTotalRcvd; char buf[LEN_GENERAL_WORK_BUFFER]; char linkName[LEN_GENERAL_WORK_BUFFER/2]; int i, idx; ProtocolsList *protoList; totalSent = el->tcpSentLoc.value+el->tcpSentRem.value+el->udpSentLoc.value+el->udpSentRem.value; totalSent += el->icmpSent.value+el->icmp6Sent.value+el->ipv6BytesSent.value; totalSent += el->greSent.value + el->ipsecSent.value; if(el->nonIPTraffic != NULL) totalSent += el->nonIPTraffic->arp_rarpSent.value + el->nonIPTraffic->netbiosSent.value+el->nonIPTraffic->stpSent.value+el->nonIPTraffic->otherSent.value; totalRcvd = el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value; totalRcvd += el->udpRcvdLoc.value+el->udpRcvdFromRem.value; totalRcvd += el->icmpRcvd.value+el->icmp6Rcvd.value+el->ipv6BytesRcvd.value; totalRcvd += el->greRcvd.value + el->ipsecRcvd.value; if(el->nonIPTraffic != NULL) totalRcvd += el->nonIPTraffic->arp_rarpRcvd.value + el->nonIPTraffic->netbiosRcvd.value+el->nonIPTraffic->stpRcvd.value+el->nonIPTraffic->otherRcvd.value; protoList = myGlobals.ipProtosList; idx = 0; while(protoList != NULL) { if(el->ipProtosList[idx] != NULL) { totalSent += el->ipProtosList[idx]->sent.value; totalRcvd += el->ipProtosList[idx]->rcvd.value; } idx++, protoList = protoList->next; } actTotalSent = el->tcpSentLoc.value+el->tcpSentRem.value; actTotalRcvd = el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value; if(el->trafficDistribution) { sendString("\n\n
    \n"); printHostHourlyTraffic(el); sendString("\n
    \n"); } if(el->secHostPkts || el->nonIPTraffic) { sendString("\n\n\n"); sendString("\n\n
    \n"); if(printPacketStats(el, actualDeviceId) == 0) sendString("\n"CONST_NO_DATA_YET""); sendString("\n
    \n"); } /* if((totalSent == 0) && (totalRcvd == 0)) return; */ sendString("\n\n\n"); sendString("\n\n
    \n"); sendString("
    \n" ""TABLE_ON"" "" "\n\n"); printTableDoubleEntry(buf, sizeof(buf), "TCP", CONST_COLOR_1, (float)actTotalSent/1024, 100*((float)SD(actTotalSent, totalSent)), (float)actTotalRcvd/1024, 100*((float)SD(actTotalRcvd, totalRcvd))); actTotalSent = el->udpSentLoc.value+el->udpSentRem.value; actTotalRcvd = el->udpRcvdLoc.value+el->udpRcvdFromRem.value; printTableDoubleEntry(buf, sizeof(buf), "UDP", CONST_COLOR_1, (float)actTotalSent/1024, 100*((float)SD(actTotalSent, totalSent)), (float)actTotalRcvd/1024, 100*((float)SD(actTotalRcvd, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "ICMP", CONST_COLOR_1, (float)el->icmpSent.value/1024, 100*((float)SD(el->icmpSent.value, totalSent)), (float)el->icmpRcvd.value/1024, 100*((float)SD(el->icmpRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "ICMPv6", CONST_COLOR_1, (float)el->icmp6Sent.value/1024, 100*((float)SD(el->icmp6Sent.value, totalSent)), (float)el->icmp6Rcvd.value/1024, 100*((float)SD(el->icmp6Rcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "IPv6", CONST_COLOR_1, (float)el->ipv6BytesSent.value/1024, 100*((float)SD(el->ipv6BytesSent.value, totalSent)), (float)el->ipv6BytesRcvd.value/1024, 100*((float)SD(el->ipv6BytesRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "GRE", CONST_COLOR_1, (float)el->greSent.value/1024, 100*((float)SD(el->greSent.value, totalSent)), (float)el->greRcvd.value/1024, 100*((float)SD(el->greRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "IPsec", CONST_COLOR_1, (float)el->ipsecSent.value/1024, 100*((float)SD(el->ipsecSent.value, totalSent)), (float)el->ipsecRcvd.value/1024, 100*((float)SD(el->ipsecRcvd.value, totalRcvd))); if(el->nonIPTraffic != NULL) { printTableDoubleEntry(buf, sizeof(buf), "(R)ARP", CONST_COLOR_1, (float)el->nonIPTraffic->arp_rarpSent.value/1024, 100*((float)SD(el->nonIPTraffic->arp_rarpSent.value, totalSent)), (float)el->nonIPTraffic->arp_rarpRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->arp_rarpRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "NetBios", CONST_COLOR_1, (float)el->nonIPTraffic->netbiosSent.value/1024, 100*((float)SD(el->nonIPTraffic->netbiosSent.value, totalSent)), (float)el->nonIPTraffic->netbiosRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->netbiosRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "STP", CONST_COLOR_1, (float)el->nonIPTraffic->stpSent.value/1024, 100*((float)SD(el->nonIPTraffic->stpSent.value, totalSent)), (float)el->nonIPTraffic->stpRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->stpRcvd.value, totalRcvd))); printTableDoubleEntry(buf, sizeof(buf), "Other (Non IP)", CONST_COLOR_1, (float)el->nonIPTraffic->otherSent.value/1024, 100*((float)SD(el->nonIPTraffic->otherSent.value, totalSent)), (float)el->nonIPTraffic->otherRcvd.value/1024, 100*((float)SD(el->nonIPTraffic->otherRcvd.value, totalRcvd))); } { protoList = myGlobals.ipProtosList; idx = 0; while(protoList != NULL) { printTableDoubleEntry(buf, sizeof(buf), protoList->protocolName, CONST_COLOR_1, el->ipProtosList[idx] != NULL ? (float)el->ipProtosList[idx]->sent.value/1024 : 0, el->ipProtosList[idx] != NULL ? 100*((float)SD(el->ipProtosList[idx]->sent.value, totalSent)) : 0, el->ipProtosList[idx] != NULL ? (float)el->ipProtosList[idx]->rcvd.value/1024 : 0, el->ipProtosList[idx] != NULL ? 100*((float)SD(el->ipProtosList[idx]->rcvd.value, totalRcvd)) : 0); idx++, protoList = protoList->next; } } { totalSent = el->tcpSentLoc.value+el->tcpSentRem.value+ el->udpSentLoc.value+el->udpSentRem.value+ el->icmpSent.value+el->icmp6Sent.value+el->ipv6BytesSent.value+ el->greSent.value+el->ipsecSent.value; totalRcvd = el->tcpRcvdLoc.value+el->tcpRcvdFromRem.value+ el->udpRcvdLoc.value+el->udpRcvdFromRem.value+ el->icmpRcvd.value+el->icmp6Rcvd.value+el->ipv6BytesRcvd.value+ el->greRcvd.value+el->ipsecRcvd.value; if(el->nonIPTraffic) { totalSent += el->nonIPTraffic->stpSent.value+ el->nonIPTraffic->arp_rarpSent.value+ el->nonIPTraffic->netbiosSent.value+el->nonIPTraffic->otherSent.value; totalRcvd += el->nonIPTraffic->stpRcvd.value+ el->nonIPTraffic->arp_rarpRcvd.value+ el->nonIPTraffic->netbiosRcvd.value+el->nonIPTraffic->otherRcvd.value; } protoList = myGlobals.ipProtosList; idx = 0; while(protoList != NULL) { if(el->ipProtosList[idx] != NULL) { totalSent += el->ipProtosList[idx]->sent.value; totalRcvd += el->ipProtosList[idx]->rcvd.value; } idx++, protoList = protoList->next; } if((totalSent > 0) || (totalRcvd > 0)) { Counter sent, rcvd; int headerAlreadySent; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); if(el->hostNumIpAddress[0] != '\0') strncpy(linkName, el->hostNumIpAddress, sizeof(linkName)); else strncpy(linkName, el->ethAddressString, sizeof(linkName)); /* For Ethernet and Ipv6 addresses */ urlFixupToRFC1945Inplace(linkName); if(totalSent > 0) { sendString(""); } else { sendString(""); } if(totalRcvd > 0) { sendString(""); } else { sendString(""); } sendString("\n"); sent = rcvd = 0; headerAlreadySent = 0; for(i=0; il7.traffic[i].bytesSent, rcvd += el->l7.traffic[i].bytesRcvd; for(i=0; il7.traffic[i].bytesSent || el->l7.traffic[i].bytesRcvd) { if(!headerAlreadySent) { sendString("" "" "\n\n"); headerAlreadySent = 1; } printTableDoubleEntry(buf, sizeof(buf), getProtoName(0, i), CONST_COLOR_1, (float)el->l7.traffic[i].bytesSent/1024, 100*((float)SD(el->l7.traffic[i].bytesSent, sent)), (float)el->l7.traffic[i].bytesRcvd/1024, 100*((float)SD(el->l7.traffic[i].bytesRcvd, rcvd))); } } if(sent || rcvd) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor()); sendString(buf); if(sent > 0) { sendString(""); } else sendString(""); if(rcvd > 0) { sendString(""); } else sendString(""); sendString("\n"); } } } sendString("
    ProtocolData SentData Rcvd
    Protocol Distribution"); hostReport(0, linkName, el->vlanId, 1); sendString(" "); hostReport(0, linkName, el->vlanId, 0); sendString(" 
    L7 ProtocolData SentData Rcvd
    " "IP Distribution"); hostReport(4, linkName, el->vlanId, 1); sendString(" "); hostReport(4, linkName, el->vlanId, 0); sendString(" 
    "TABLE_OFF"

    \n"); sendString("

    \n"); /* ************************************** */ if(el->nonIpProtoTrafficInfos != NULL) { NonIpProtoTrafficInfo *nonIp = el->nonIpProtoTrafficInfos; printSectionTitle("Non IP Protocol Distribution"); sendString("
    \n" ""TABLE_ON"" "" "\n\n"); while(nonIp != NULL) { char buf1[64]; printTableDoubleEntry(buf, sizeof(buf), sap2name(nonIp->protocolId, buf1, sizeof(buf1)), CONST_COLOR_1, (float)nonIp->sentBytes.value/1024, 100*((float)SD(nonIp->sentBytes.value, el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->otherSent.value)), (float)nonIp->rcvdBytes.value/1024, 100*((float)SD(nonIp->rcvdBytes.value, el->nonIPTraffic == NULL ? 0 : el->nonIPTraffic->otherRcvd.value))); nonIp = nonIp->next; } sendString("
    ProtocolData SentData Rcvd
    "TABLE_OFF"

    \n"); sendString("

    \n"); } /* ************************************** */ if(el->nonIPTraffic != NULL) { if(el->nonIPTraffic->unknownProtoSent || el->nonIPTraffic->unknownProtoRcvd) { printSectionTitle("Unknown Protocols"); sendString("
    \n" ""TABLE_ON"" "" "\n\n"); if(el->nonIPTraffic->unknownProtoSent == NULL) { sendString("\n"); } else { sendString("\n"); } if(el->nonIPTraffic->unknownProtoRcvd == NULL) { sendString("\n"); } else { sendString("\n"); } sendString("
    Data SentData Rcvd
     
    "); for(i=0; inonIPTraffic->unknownProtoSent[i]); sendString("  
    "); for(i=0; inonIPTraffic->unknownProtoRcvd[i]); sendString(" 
    "TABLE_OFF"

    \n"); sendString("

    \n"); } } sendString("\n
    \n"); } /* ************************************ */ void printIcmpv6Stats(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32], formatBuf1[32]; printSectionTitle("ICMPv6 Traffic\n"); sendString("
    \n"); sendString("" "" "\n\n"); if(el->icmpInfo->icmpMsgSent[ICMP6_ECHO_REQUEST].value+el->icmpInfo->icmpMsgRcvd[ICMP6_ECHO_REQUEST].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP6_ECHO_REQUEST].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP6_ECHO_REQUEST].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP6_ECHO_REPLY].value+el->icmpInfo->icmpMsgRcvd[ICMP6_ECHO_REPLY].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP6_ECHO_REPLY].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP6_ECHO_REPLY].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP6_DST_UNREACH].value+el->icmpInfo->icmpMsgRcvd[ICMP6_DST_UNREACH].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP6_DST_UNREACH].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP6_DST_UNREACH].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_REDIRECT].value+el->icmpInfo->icmpMsgRcvd[ND_REDIRECT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ND_REDIRECT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_REDIRECT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_ROUTER_ADVERT].value+el->icmpInfo->icmpMsgRcvd[ND_ROUTER_ADVERT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ND_ROUTER_ADVERT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_ROUTER_ADVERT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_ROUTER_SOLICIT].value+el->icmpInfo->icmpMsgRcvd[ND_ROUTER_SOLICIT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ND_ROUTER_SOLICIT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_ROUTER_SOLICIT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_NEIGHBOR_SOLICIT].value+el->icmpInfo->icmpMsgRcvd[ND_NEIGHBOR_SOLICIT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ND_NEIGHBOR_SOLICIT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_NEIGHBOR_SOLICIT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ND_NEIGHBOR_ADVERT].value+el->icmpInfo->icmpMsgRcvd[ND_NEIGHBOR_ADVERT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ND_NEIGHBOR_ADVERT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ND_NEIGHBOR_ADVERT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } sendString("
    TypePkt SentPkt Rcvd
    Echo Request%s%s
    Echo Reply%s%s
    Unreach%s%s
    Redirect%s%s
    Router Advertisement%s%s
    Router solicitation%s%s
    Neighbor solicitation%s%s
    Neighbor advertisment%s%s
    "TABLE_OFF"
    \n"); } /* ******************************************** */ void printIcmpv4Stats(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER]; char formatBuf[32], formatBuf1[32]; sendString("
    \n"); sendString("" "" "\n\n"); if(el->icmpInfo->icmpMsgSent[ICMP_ECHO].value+el->icmpInfo->icmpMsgRcvd[ICMP_ECHO].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_ECHO].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_ECHO].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_ECHOREPLY].value+el->icmpInfo->icmpMsgRcvd[ICMP_ECHOREPLY].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_ECHOREPLY].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_ECHOREPLY].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_UNREACH].value+el->icmpInfo->icmpMsgRcvd[ICMP_UNREACH].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_UNREACH].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_UNREACH].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_REDIRECT].value+el->icmpInfo->icmpMsgRcvd[ICMP_REDIRECT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_REDIRECT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_REDIRECT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_ROUTERADVERT].value+el->icmpInfo->icmpMsgRcvd[ICMP_ROUTERADVERT].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_ROUTERADVERT].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_ROUTERADVERT].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_TIMXCEED].value+el->icmpInfo->icmpMsgRcvd[ICMP_TIMXCEED].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_TIMXCEED].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_TIMXCEED].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_PARAMPROB].value+el->icmpInfo->icmpMsgRcvd[ICMP_PARAMPROB].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_PARAMPROB].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_PARAMPROB].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_MASKREQ].value+el->icmpInfo->icmpMsgRcvd[ICMP_MASKREQ].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_MASKREQ].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_MASKREQ].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_MASKREPLY].value+el->icmpInfo->icmpMsgRcvd[ICMP_MASKREPLY].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_MASKREPLY].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_MASKREPLY].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_SOURCE_QUENCH].value+el->icmpInfo->icmpMsgRcvd[ICMP_SOURCE_QUENCH].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_SOURCE_QUENCH].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_SOURCE_QUENCH].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_TIMESTAMP].value+el->icmpInfo->icmpMsgRcvd[ICMP_TIMESTAMP].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_TIMESTAMP].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_TIMESTAMP].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_INFO_REQUEST].value+el->icmpInfo->icmpMsgRcvd[ICMP_INFO_REQUEST].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_INFO_REQUEST].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_INFO_REQUEST].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->icmpInfo->icmpMsgSent[ICMP_INFO_REPLY].value+el->icmpInfo->icmpMsgRcvd[ICMP_INFO_REPLY].value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", formatPkts(el->icmpInfo->icmpMsgSent[ICMP_INFO_REPLY].value, formatBuf, sizeof(formatBuf)), formatPkts(el->icmpInfo->icmpMsgRcvd[ICMP_INFO_REPLY].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } /************ ICMPv6 info*********************/ sendString("
    TypePkt SentPkt Rcvd
    Echo Request%s%s
    Echo Reply%s%s
    Unreach%s%s
    Redirect%s%s
    Router Advertisement%s%s
    Time Exceeded%s%s
    Parameter Problem%s%s
    Network Mask Request%s%s
    Network Mask Reply%s%s
    Source Quench%s%s
    Timestamp%s%s
    Info Request%s%s
    Info Reply%s%s
    "TABLE_OFF"
    \n"); } /* ************************************ */ void printHostIcmpStats(HostTraffic *el){ int family; if(el->icmpInfo == NULL) return; family = el->hostIpAddress.hostFamily; if (family == AF_INET) printIcmpv4Stats(el); else if (family == AF_INET6) printIcmpv6Stats(el); } /* ************************************ */ void printHostHTTPVirtualHosts(HostTraffic *el, int actualDeviceId) { char buf[LEN_GENERAL_WORK_BUFFER]; char formatBuf[32], formatBuf1[32]; if((el->protocolInfo != NULL) && (el->protocolInfo->httpVirtualHosts != NULL)) { VirtualHostList *list = el->protocolInfo->httpVirtualHosts; sendString(""TABLE_ON"" "" "\n\n"); while(list != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "" "\n\n", getRowColor(), list->virtualHostName, formatBytes(list->bytesSent.value, 1, formatBuf, sizeof(formatBuf)), formatBytes(list->bytesRcvd.value, 1, formatBuf1, sizeof(formatBuf1))); sendString(buf); list = list->next; } sendString("
    Virtual HostSentRcvd
    %s%s %s 
    "TABLE_OFF"\n"); sendString("
    NOTE: The above table is not updated in realtime but when connections are terminated.
    \n"); } } /* ************************************ */ HostTraffic* quickHostLink(HostSerialIndex theSerialIdx, int deviceId, HostTraffic *el) { HostSerial theSerial; if(cmpSerial(&theSerialIdx, &myGlobals.broadcastEntry->serialHostIndex)) { memcpy(el, myGlobals.broadcastEntry, sizeof(HostTraffic)); return(el); } else if(cmpSerial(&theSerialIdx, &myGlobals.otherHostEntry->serialHostIndex)) { memcpy(el, myGlobals.otherHostEntry, sizeof(HostTraffic)); return(0); } else getHostSerialFromId(theSerialIdx, &theSerial); memset(el, 0, sizeof(HostTraffic)); copySerial(&el->serialHostIndex, &theSerialIdx); if((theSerial.serialType == SERIAL_IPV4) || (theSerial.serialType == SERIAL_IPV6)) { /* IP */ char buf[LEN_GENERAL_WORK_BUFFER]; addrcpy(&el->hostIpAddress,&theSerial.value.ipSerial.ipAddress); el->vlanId = theSerial.value.ipSerial.vlanId; strncpy(el->hostNumIpAddress, _addrtostr(&el->hostIpAddress, buf, sizeof(buf)), sizeof(el->hostNumIpAddress)); // FIX -- Update address TODO } else { /* MAC */ char *ethAddr; char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY]; memcpy(el->ethAddress, theSerial.value.ethSerial.ethAddress, LEN_ETHERNET_ADDRESS); el->vlanId = theSerial.value.ethSerial.vlanId; ethAddr = etheraddr_string(el->ethAddress, etherbuf); strncpy(el->ethAddressString, ethAddr, sizeof(el->ethAddressString)); if (el->hostIpAddress.hostFamily == AF_INET) el->hostIp4Address.s_addr = 0x1234; /* dummy */ } return(el); } /* ************************************ */ void printHostContactedPeers(HostTraffic *el, int actualDeviceId) { char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; HostTraffic *theHost; u_int8_t header_sent; if((el->pktsSent.value == 0) && (el->pktsRcvd.value == 0)) return; sendString("
    \n\n\n"); if(el->pktsSent.value > 0) { header_sent = 0; for(theHost=getFirstHost(actualDeviceId); theHost != NULL; theHost = getNextHost(actualDeviceId, theHost)) { if((theHost->l2Host == el->l2Host) && (theHost->hostIpAddress.hostFamily == el->hostIpAddress.hostFamily)) { int val = CM_PointEst(el->sent_to_matrix, theHost->serialHostIndex); if(val > 0) { if(!header_sent) { header_sent = 1; sendString("\n"); } /* ************************** */ if(el->pktsRcvd.value > 0) { header_sent = 0; for(theHost=getFirstHost(actualDeviceId); theHost != NULL; theHost = getNextHost(actualDeviceId, theHost)) { if((theHost->l2Host == el->l2Host) && (theHost->hostIpAddress.hostFamily == el->hostIpAddress.hostFamily)) { int val = CM_PointEst(el->recv_from_matrix, theHost->serialHostIndex); if(val > 0) { if(!header_sent) { header_sent = 1; sendString("\n"); /* ***************************************************** */ } sendString("
    " "
    " TABLE_ON"" "\n\n"); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), makeHostLink(theHost, 0, 0, 0, hostLinkBuf, sizeof(hostLinkBuf)), val); sendString(buf); } } } sendString("
    Sent To# Contacts
    %s%u 
    "TABLE_OFF); if(header_sent) sendString("\n
    \n"); sendString("
    " "
    " TABLE_ON"" "" "\n\n"); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), makeHostLink(theHost, 0, 0, 0, hostLinkBuf, sizeof(hostLinkBuf)), val); sendString(buf); } } } sendString("
    Received From# Contacts
    %s%u 
    "TABLE_OFF); if(header_sent) sendString("\n
    \n"); sendString("
    "TABLE_OFF"\n"); sendString("
    \n"); } /* ************************************ */ /* Function below courtesy of Andreas Pfaller */ char *getSessionState(IPSession *session) { switch (session->sessionState) { case FLAG_STATE_SYN: return("Syn Sent"); case FLAG_STATE_SYN_ACK: return("Rcvd Syn/Ack"); case FLAG_STATE_ACTIVE: return("Active"); case FLAG_STATE_FIN1_ACK0: return("Fin1 Ack0"); case FLAG_STATE_FIN1_ACK1: return("Fin1 Ack1"); case FLAG_STATE_FIN2_ACK0: return("Fin2 Ack0"); case FLAG_STATE_FIN2_ACK1: return("Fin2 Ack1"); case FLAG_STATE_FIN2_ACK2: return("Fin2 Ack2"); case FLAG_STATE_TIMEOUT: return("Timeout"); case FLAG_STATE_END: return("End"); } return("*Unknown*"); } /* ******************************* */ /* Return codes: OK 0 Minor 1 Warning 2 Error 3 */ u_short isHostHealthy(HostTraffic *el) { if(hasDuplicatedMac(el) || hasSentIpDataOnZeroPort(el)) return(3); if(hasWrongNetmask(el)) return(2); if((el->totContactedSentPeers > CONTACTED_PEERS_THRESHOLD) || (el->totContactedRcvdPeers > CONTACTED_PEERS_THRESHOLD)) { /* Mail/DNS/HTTP server usually touch many hosts */ if(!(isSMTPhost(el) || nameServerHost(el) || isHTTPhost(el))) { return(2); } } if((el->secHostPkts != NULL) && ((el->secHostPkts->nullPktsSent.value.value > 0) || (el->secHostPkts->synFinPktsSent.value.value > 0) || (el->secHostPkts->ackXmasFinSynNullScanSent.value.value > 0) || (el->secHostPkts->tinyFragmentSent.value.value > 0) || (el->secHostPkts->icmpFragmentSent.value.value > 0) || (el->secHostPkts->overlappingFragmentSent.value.value > 0) || (el->secHostPkts->malformedPktsRcvd.value.value > 0))) { return(2); } if((el->secHostPkts != NULL) && ((el->secHostPkts->rstPktsRcvd.value.value > 0) || (el->secHostPkts->rejectedTCPConnRcvd.value.value > 0) || (el->secHostPkts->udpToClosedPortRcvd.value.value > 0) || (el->secHostPkts->udpToDiagnosticPortSent.value.value > 0) || (el->secHostPkts->closedEmptyTCPConnSent.value.value > 0) || (el->secHostPkts->icmpPortUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpHostNetUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpProtocolUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpAdminProhibitedRcvd.value.value > 0))) { return(1); } return(0); } /* ************************************ */ static void checkHostHealthness(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER]; if(hasWrongNetmask(el) || hasDuplicatedMac(el) || hasSentIpDataOnZeroPort(el) || (el->totContactedSentPeers > CONTACTED_PEERS_THRESHOLD) || (el->totContactedRcvdPeers > CONTACTED_PEERS_THRESHOLD) || ((el->secHostPkts != NULL) && ((el->secHostPkts->nullPktsSent.value.value > 0) || (el->secHostPkts->synFinPktsSent.value.value > 0) || (el->secHostPkts->rstPktsRcvd.value.value > 0) || (el->secHostPkts->ackXmasFinSynNullScanSent.value.value > 0) || (el->secHostPkts->rejectedTCPConnRcvd.value.value > 0) || (el->secHostPkts->udpToClosedPortRcvd.value.value > 0) || (el->secHostPkts->udpToDiagnosticPortSent.value.value > 0) || (el->secHostPkts->tinyFragmentSent.value.value > 0) || (el->secHostPkts->icmpFragmentSent.value.value > 0) || (el->secHostPkts->overlappingFragmentSent.value.value > 0) || (el->secHostPkts->closedEmptyTCPConnSent.value.value > 0) || (el->secHostPkts->icmpPortUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpHostNetUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpProtocolUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpAdminProhibitedRcvd.value.value > 0) || (el->secHostPkts->malformedPktsRcvd.value.value > 0)))) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s " CONST_IMG_HIGH_RISK CONST_IMG_MEDIUM_RISK CONST_IMG_LOW_RISK "
      ", getRowColor(), "Host Healthness (Risk Flags)"); sendString(buf); if(hasDuplicatedMac(el)) sendString("
    1. " CONST_IMG_HIGH_RISK "" "Duplicated MAC found for this IP address (spoofing?)\n"); if(hasSentIpDataOnZeroPort(el)) sendString("
    2. " CONST_IMG_HIGH_RISK "" "Traffic on suspicious IP ports\n"); if(hasWrongNetmask(el)) sendString("
    3. " CONST_IMG_MEDIUM_RISK "" "Wrong network mask or bridging enabled\n"); if((el->totContactedSentPeers > CONTACTED_PEERS_THRESHOLD) || (el->totContactedRcvdPeers > CONTACTED_PEERS_THRESHOLD)) { sendString("
    4. " CONST_IMG_MEDIUM_RISK "" "Suspicious activities: too many host contacts\n"); } if((el->secHostPkts != NULL) && ((el->secHostPkts->nullPktsSent.value.value > 0) || (el->secHostPkts->synFinPktsSent.value.value > 0) || (el->secHostPkts->ackXmasFinSynNullScanSent.value.value > 0) || (el->secHostPkts->tinyFragmentSent.value.value > 0) || (el->secHostPkts->icmpFragmentSent.value.value > 0) || (el->secHostPkts->overlappingFragmentSent.value.value > 0) || (el->secHostPkts->malformedPktsRcvd.value.value > 0))) { sendString("
    5. " CONST_IMG_MEDIUM_RISK "" "Unexpected packets (e.g. traffic to closed port or connection reset):
      \n"); if(el->secHostPkts->synFinPktsSent.value.value > 0) sendString("[Sent: syn-fin] "); if(el->secHostPkts->ackXmasFinSynNullScanSent.value.value > 0) sendString("[Sent: xmas] "); if(el->secHostPkts->tinyFragmentSent.value.value > 0) sendString("[Sent: Tiny frag] "); if(el->secHostPkts->icmpFragmentSent.value.value > 0) sendString("[Sent: icmp frag] "); if(el->secHostPkts->overlappingFragmentSent.value.value > 0) sendString("[Sent: overlapfrag] "); if(el->secHostPkts->malformedPktsRcvd.value.value > 0) sendString("[Rcvd: malformed] "); } if((el->secHostPkts != NULL) && ((el->secHostPkts->rejectedTCPConnRcvd.value.value > 0) || (el->secHostPkts->udpToClosedPortRcvd.value.value > 0) || (el->secHostPkts->udpToDiagnosticPortSent.value.value > 0) || (el->secHostPkts->rstPktsRcvd.value.value > 0) || (el->secHostPkts->closedEmptyTCPConnSent.value.value > 0) || (el->secHostPkts->icmpPortUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpHostNetUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpProtocolUnreachRcvd.value.value > 0) || (el->secHostPkts->icmpAdminProhibitedRcvd.value.value > 0))) { sendString("
    6. " CONST_IMG_LOW_RISK "" "Unexpected packets (e.g. traffic to closed port or connection reset):
      \n"); if(el->secHostPkts->rejectedTCPConnRcvd.value.value > 0) sendString("[Rcvd: rejected] "); if(el->secHostPkts->udpToClosedPortRcvd.value.value > 0) sendString("[Sent: udp to closed] "); if(el->secHostPkts->udpToDiagnosticPortSent.value.value > 0) sendString("[Sent: udp to diag] "); if(el->secHostPkts->rstPktsRcvd.value.value > 0) sendString("[Rcvd: rst] "); if(el->secHostPkts->closedEmptyTCPConnSent.value.value > 0) sendString("[Sent: closed-empty] "); if(el->secHostPkts->icmpPortUnreachRcvd.value.value > 0) sendString("[Rcvd: port unreac] "); if(el->secHostPkts->icmpHostNetUnreachRcvd.value.value > 0) sendString("[Rcvd: hostnet unreac] "); if(el->secHostPkts->icmpProtocolUnreachRcvd.value.value > 0) sendString("[Rcvd: proto unreac] "); if(el->secHostPkts->icmpAdminProhibitedRcvd.value.value > 0) sendString("[Rcvd: admin prohib] "); } sendString("
    \n\n"); } } /* ************************************ */ static void printUserList(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER]; UserList *list = el->protocolInfo->userList; int num = 0; while(list != NULL) { if(num > 0) sendString("
    "); if(FD_ISSET(BITFLAG_SMTP_USER, &(list->userFlags))) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s [ SMTP ]\n", list->userName, list->userName); sendString(buf); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s [", list->userName); sendString(buf); if(FD_ISSET(BITFLAG_POP_USER, &(list->userFlags))) sendString(" POP "); if(FD_ISSET(BITFLAG_IMAP_USER, &(list->userFlags))) sendString(" IMAP "); if(FD_ISSET(BITFLAG_SMTP_USER, &(list->userFlags))) sendString(" SMTP "); if(FD_ISSET(BITFLAG_P2P_USER, &(list->userFlags))) sendString(" P2P "); if(FD_ISSET(BITFLAG_FTP_USER, &(list->userFlags))) sendString(" FTP "); if(FD_ISSET(BITFLAG_MESSENGER_USER, &(list->userFlags))) sendString(" MSG "); if(FD_ISSET(BITFLAG_VOIP_USER, &(list->userFlags))) sendString(" VoIP "); if(FD_ISSET(BITFLAG_DAAP_USER, &(list->userFlags))) sendString(" DAAP "); sendString("]\n"); } list = list->next; num++; } } /* ************************************ */ void checkHostProvidedServices(HostTraffic *el) { char buf[LEN_GENERAL_WORK_BUFFER]; if(isServer(el) || isWorkstation(el) || isMasterBrowser(el) || isPrinter(el) || isBridgeHost(el) || nameServerHost(el) || isNtpServer(el) || gatewayHost(el) || isVoIPHost(el) || isSMTPhost(el) || isIMAPhost(el) || isPOPhost(el) || isDirectoryHost(el) || isFTPhost(el) || isHTTPhost(el) || isWINShost(el) || isDHCPClient(el) || isDHCPServer(el) || isFacebookClient(el) || isTwitterClient(el) ) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "", getRowColor(), "Host Type"); sendString(buf); if(isServer(el)) sendString("Server
    \n"); if(isWorkstation(el)) sendString("Workstation
    \n"); if(isMasterBrowser(el)) sendString("Master Browser
    \n"); if(isPrinter(el)) sendString("Printer " CONST_IMG_PRINTER "
    \n"); if(isBridgeHost(el)) sendString("Layer-2 Switch/Bridge " CONST_IMG_BRIDGE "
    \n"); if(nameServerHost(el)) sendString("Name Server " CONST_IMG_DNS_SERVER "
    \n"); if(isNtpServer(el)) sendString("NTP Server " CONST_IMG_NTP_SERVER "
    \n"); if(gatewayHost(el)) sendString("Gateway/Router " CONST_IMG_ROUTER "
    \n"); if(isVoIPGateway(el) && (!isVoIPClient(el))) sendString("VoIP Gateway " CONST_IMG_VOIP_HOST "
    \n"); else if(isVoIPClient(el)) sendString("VoIP Host " CONST_IMG_VOIP_HOST "
    \n"); if(isSMTPhost(el)) sendString("SMTP (Mail) Server " CONST_IMG_SMTP_SERVER "
    \n"); if(isPOPhost(el)) sendString("POP Server " CONST_IMG_POP_SERVER "
    \n"); if(isIMAPhost(el)) sendString("IMAP Server " CONST_IMG_IMAP_SERVER "
    \n"); if(isDirectoryHost(el)) sendString("Directory Server " CONST_IMG_DIRECTORY_SERVER "
    \n"); if(isFTPhost(el)) sendString("FTP Server " CONST_IMG_FTP_SERVER "
    \n"); if(isHTTPhost(el)) sendString("HTTP Server " CONST_IMG_HTTP_SERVER "
    \n"); if(isWINShost(el)) sendString("WINS Server
    \n"); if(isDHCPClient(el)) sendString("BOOTP/DHCP Client " CONST_IMG_DHCP_CLIENT "
    \n"); if(isDHCPServer(el)) sendString("BOOTP/DHCP Server " CONST_IMG_DHCP_SERVER "
    \n"); if(isFacebookClient(el)) sendString(CONST_FACEBOOK_ICON" Client
    \n"); if(isTwitterClient(el)) sendString(CONST_TWITTER_ICON" Client
    \n"); sendString("\n"); } } /* ************************************ */ void printHostDetailedInfo(HostTraffic *el, int actualDeviceId) { char buf[4*LEN_GENERAL_WORK_BUFFER], buf1[64], osBuf[512]; float percentage; Counter total; char *dynIp, *multihomed, *multivlaned; u_short as=0; HostTraffic *theHost; char formatBuf[LEN_TIMEFORMAT_BUFFER], formatBuf1[LEN_TIMEFORMAT_BUFFER], formatBuf2[32], custom_host_name[128]; sendString("
    \n

    "TABLE_ON"\n"); if(el->hostNumIpAddress[0] != '\0') { char *hostType; if(broadcastHost(el)) hostType = "broadcast"; else if(multicastHost(el)) hostType = "multicast"; else hostType = "unicast"; if(isDHCPClient(el)) dynIp = "/dynamic"; else dynIp = ""; if(isMultihomed(el) && (!broadcastHost(el))) multihomed = " - multihomed " CONST_IMG_MULTIHOMED; else multihomed = ""; if(isMultivlaned(el) && (!broadcastHost(el))) multivlaned = " - multivlaned " CONST_IMG_MULTIVLANED; else multivlaned = ""; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n"); #if 0 if(isMultihomed(el) && (!broadcastHost(el))) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n"); } #endif if((el->network_mask > 0) && (el->network_mask != 32)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "Host Network", host2networkName(el, buf1, sizeof(buf1))); sendString(buf); } if((el->protocolInfo != NULL) && (el->protocolInfo->dhcpStats != NULL)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor(), "DHCP Information"); sendString(buf); sendString("\n\n"); } } else { if(el->l2Host) { u_int8_t header_sent = 0; for(theHost = getFirstHost(actualDeviceId); theHost != NULL; theHost = getNextHost(actualDeviceId, theHost)) { if((theHost != el) && (!theHost->l2Host) && (memcmp(theHost->lastEthAddress, el->ethAddress, LEN_ETHERNET_ADDRESS) == 0)) { if(!header_sent) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n"); } } /* Read custom host name if any */ safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "hostname.%s", (el->hostNumIpAddress[0] != '\0') ? el->hostNumIpAddress : el->ethAddressString); if(fetchPrefsValue(buf, custom_host_name, sizeof(custom_host_name)) == -1) custom_host_name[0] = '\0'; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), (el->hostNumIpAddress[0] != '\0') ? el->hostNumIpAddress : el->ethAddressString, custom_host_name); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "First/Last Seen", formatTime(&(el->firstSeen), formatBuf, sizeof(formatBuf)), formatTime(&(el->lastSeen), formatBuf1, sizeof(formatBuf1)), formatSeconds(myGlobals.actTime-el->lastSeen, formatBuf2, sizeof(formatBuf2))); sendString(buf); if(el->hostAS != 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Autonomous System", el->hostAS, el->hostAS, (el->hostASDescr != NULL) ? el->hostASDescr : "No AS info"); sendString(buf); } if((el->known_subnet_id != UNKNOWN_SUBNET_ID) && (el->known_subnet_id < myGlobals.numKnownSubnets)) { char subnet_buf[48]; host2networkName(el, subnet_buf, sizeof(subnet_buf)); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Subnet", el->known_subnet_id, subnet_buf); sendString(buf); } if(el->dnsDomainValue && (el->dnsDomainValue[0] != '\0')) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Domain", el->dnsDomainValue); sendString(buf); } if((el->ethAddressString[0] != '\0') && strcmp(el->ethAddressString, "00:00:00:00:00:00") && strcmp(el->ethAddressString, "00:01:02:03:04:05") /* dummy address */) { if(isMultihomed(el)) { char *symMacAddr, symLink[32]; char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY]; symMacAddr = etheraddr_string(el->ethAddress, etherbuf); strcpy(symLink, symMacAddr); urlFixupToRFC1945Inplace(symLink); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Main Host MAC Address", symLink, symMacAddr, myGlobals.separator /* it avoids empty cells not to be rendered */); sendString(buf); } else { char *vendorName = getVendorInfo(el->ethAddress, 1), macbuf[32]; safe_snprintf(__FILE__, __LINE__, macbuf, sizeof(macbuf), "%s", el->ethAddressString); macbuf[2] = macbuf[5] = macbuf[8] = macbuf[11] = macbuf[14] = '_'; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "MAC Address \"Network", macbuf, el->ethAddressString, myGlobals.separator /* it avoids empty cells not to be rendered */, (vendorName[0] != '\0') ? "[" : "", vendorName, (vendorName[0] != '\0') ? "]" : ""); sendString(buf); } } if(((el->lastEthAddress[0] != 0) || (el->lastEthAddress[1] != 0) || (el->lastEthAddress[2] != 0) || (el->lastEthAddress[3] != 0) || (el->lastEthAddress[4] != 0) || (el->lastEthAddress[5] != 0) /* The address isn't empty */) && (memcmp(el->lastEthAddress, el->ethAddress, LEN_ETHERNET_ADDRESS) != 0)) { /* Different MAC addresses */ char *symMacAddr, symLink[32], shortBuf[64]; char etherbuf[LEN_ETHERNET_ADDRESS_DISPLAY]; char *vendorName; symMacAddr = etheraddr_string(el->lastEthAddress, etherbuf); strcpy(symLink, symMacAddr); urlFixupToRFC1945Inplace(symLink); safe_snprintf(__FILE__, __LINE__, shortBuf, sizeof(shortBuf), "%s", symLink, symMacAddr); vendorName = getVendorInfo(el->lastEthAddress, 1); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Last MAC Address/Router \"Network", shortBuf, myGlobals.separator /* it avoids empty cells not to be rendered */, (vendorName[0] != '\0') ? "[" : "", vendorName, (vendorName[0] != '\0') ? "]" : ""); sendString(buf); } if(el->hostNumIpAddress[0] != '\0') { setHostFingerprint(el); if((el->fingerprint != NULL) && (el->fingerprint[0] == ':') && (strlen(el->fingerprint) > 2)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "OS Name", getOSFlag(el, NULL, 1, osBuf, sizeof(osBuf)), myGlobals.separator /* it avoids empty cells not to be rendered */); sendString(buf); } { char linkName[256], vlanStr[32]; if(el->hostNumIpAddress[0] != '\0') { strncpy(linkName, el->hostNumIpAddress, sizeof(linkName)); } else { strncpy(linkName, el->ethAddressString, sizeof(linkName)); } /* For Ethernet and IPv6 addresses */ urlFixupToRFC1945Inplace(linkName); if(el->vlanId > 0) { safe_snprintf(__FILE__, __LINE__, vlanStr, sizeof(vlanStr), "-%d", el->vlanId); } else vlanStr[0] = '\0'; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n"); } if((as = getHostAS(el)) != 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Origin AS", CONST_DOMAIN_STATS_HTML, as, as); sendString(buf); } if(el->vlanId != NO_VLAN) { char tmpBuf[64]; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "VLAN Id", vlan2name(el->vlanId, tmpBuf, sizeof(tmpBuf))); sendString(buf); } if(el->ifId != NO_INTERFACE) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Interface Id", el->ifId); sendString(buf); } if(el->nonIPTraffic) { if((el->nonIPTraffic->nbHostName != NULL) || (el->nonIPTraffic->nbDomainName != NULL)) { if(el->nonIPTraffic->nbAccountName) { if(el->nonIPTraffic->nbDomainName != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbAccountName, el->nonIPTraffic->nbHostName, el->nonIPTraffic->nbDomainName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbAccountName, el->nonIPTraffic->nbHostName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); } } else { if(el->nonIPTraffic->nbDomainName != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbHostName != NULL ? el->nonIPTraffic->nbHostName : "", el->nonIPTraffic->nbDomainName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbHostName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); } } sendString(buf); } else if(el->nonIPTraffic->nbHostName != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "NetBios Name", el->nonIPTraffic->nbHostName, getNbNodeType(el->nonIPTraffic->nbNodeType), el->nonIPTraffic->nbDescr ? el->nonIPTraffic->nbDescr : ""); sendString(buf); } } if(!multicastHost(el)) { if(subnetPseudoLocalHost(el)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Host Location", "Local (inside specified/local subnet or known network list)"); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Host Location", "Remote (outside specified/local subnet)"); } sendString(buf); } if(el->geo_ip) { char *countryIcon, buf3[512] = { '\0' }; if(myGlobals.runningPref.mapperURL) buildMapLink(el, buf3, sizeof(buf3)); countryIcon = getHostCountryIconURL(el); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Physical Location", el->geo_ip->city ? el->geo_ip->city : "Unknown city", el->geo_ip->country_name, countryIcon, buf3); sendString(buf); } if(el->community) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Community", el->community, el->community); sendString(buf); } if(el->hwModel) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Hardware Model", el->hwModel); sendString(buf); } if(el->description) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Description", el->description); sendString(buf); } if(el->minTTL > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "IP TTL (Time to Live)", el->minTTL, el->maxTTL, guessHops(el)); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Total Data Sent", formatBytes(el->bytesSent.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->pktsSent.value, formatBuf1, sizeof(formatBuf1)), formatPkts(el->pktsDuplicatedAckSent.value, formatBuf2, sizeof(formatBuf2)), (int)(((float)el->pktsDuplicatedAckSent.value*100)/(float)(el->pktsSent.value+1)) ); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Broadcast Pkts Sent", formatPkts(el->pktsBroadcastSent.value, formatBuf, sizeof(formatBuf))); sendString(buf); if(el->routedTraffic != NULL) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Routed Traffic", formatBytes(el->routedTraffic->routedBytes.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->routedTraffic->routedPkts.value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if((el->pktsMulticastSent.value > 0) || (el->pktsMulticastRcvd.value > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n"); } if(el->bytesSent.value == 0) percentage = 0; else percentage = 100 - (((float)el->bytesSentRem.value*100)/el->bytesSent.value); if(el->hostNumIpAddress[0] != '\0') { printTableEntryPercentage(buf, sizeof(buf), "Data Sent Stats", "Local", "Rem", -1, percentage, 0, 0); if(el->bytesSent.value > 0) { percentage = (((float)el->ipv4BytesSent.value*100)/el->bytesSent.value); printTableEntryPercentage(buf, sizeof(buf), "IP vs. Non-IP Sent", "IP", "Non-IP", -1, percentage, 0, 0); } } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n", getRowColor(), "Total Data Rcvd", formatBytes(el->bytesRcvd.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->pktsRcvd.value, formatBuf1, sizeof(formatBuf1)), formatPkts(el->pktsDuplicatedAckRcvd.value, formatBuf2, sizeof(formatBuf2)), (int)((float)(el->pktsDuplicatedAckRcvd.value*100)/(float)(el->pktsRcvd.value+1))); sendString(buf); if(el->bytesRcvd.value == 0) percentage = 0; else percentage = 100 - (((float)el->bytesRcvdFromRem.value*100)/el->bytesRcvd.value); if(el->hostNumIpAddress[0] != '\0') printTableEntryPercentage(buf, sizeof(buf), "Data Rcvd Stats", "Local", "Rem", -1, percentage, 0, 0); if(el->bytesRcvd.value > 0) { percentage = (((float)el->ipv4BytesRcvd.value*100)/el->bytesRcvd.value); printTableEntryPercentage(buf, sizeof(buf), "IP vs. Non-IP Rcvd", "IP", "Non-IP", -1, percentage, 0, 0); } total = el->pktsSent.value+el->pktsRcvd.value; if(total > 0) { percentage = ((float)el->pktsSent.value*100)/((float)total); printTableEntryPercentage(buf, sizeof(buf), "Sent vs. Rcvd Pkts", "Sent", "Rcvd", -1, percentage, 0, 0); } total = el->bytesSent.value+el->bytesRcvd.value; if(total > 0) { percentage = ((float)el->bytesSent.value*100)/((float)total); printTableEntryPercentage(buf, sizeof(buf), "Sent vs. Rcvd Data", "Sent", "Rcvd", -1, percentage, 0, 0); } /* ******************** */ checkHostProvidedServices(el); /* **************************** */ if((el->protocolInfo) && (el->protocolInfo->userList != NULL)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n"); } /* **************************** */ if((el->hostNumIpAddress[0] != '\0') && (!subnetPseudoLocalHost(el)) && (!multicastHost(el)) && (!privateIPAddress(el))) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n\n"); } /* RRD */ if(el->hostNumIpAddress[0] != '\0') { char rrdBuf[LEN_GENERAL_WORK_BUFFER]; hostRRdGraphLink(el, NETWORK_VIEW, 0, rrdBuf, sizeof(rrdBuf)); if(rrdBuf[0] != '\0') { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n" "\n\n", getRowColor(), rrdBuf); sendString(buf); } } checkHostHealthness(el); sendString("
    %s%s [%s%s%s%s]", getRowColor(), "IP Address", el->hostNumIpAddress, hostType, dynIp, multihomed, multivlaned); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), " [ Purge Asset ]", el->serialHostIndex); sendString(buf); sendString("
    %s 
      ", getRowColor(), "Multihomed Addresses"); sendString(buf); for(theHost = getFirstHost(actualDeviceId); theHost != NULL; theHost = getNextHost(actualDeviceId, theHost)) { if((theHost != el) && (memcmp(theHost->ethAddress, el->ethAddress, LEN_ETHERNET_ADDRESS) == 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
    1. %s", theHost->hostNumIpAddress, theHost->hostNumIpAddress); sendString(buf); } } /* for */ sendString("
    %s%s
    %s\n"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Server", _intoa(el->protocolInfo->dhcpStats->dhcpServerIpAddress, buf1, sizeof(buf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "Previous IP Address", _intoa(el->protocolInfo->dhcpStats->previousIpAddress, buf1, sizeof(buf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "Address Assigned on", formatTime(&(el->protocolInfo->dhcpStats->assignTime), formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "To be Renewed Before", formatTime(&(el->protocolInfo->dhcpStats->renewalTime), formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "Lease Ends on", formatTime(&(el->protocolInfo->dhcpStats->leaseTime), formatBuf, sizeof(formatBuf))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor()); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Discover", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_DISCOVER_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_DISCOVER_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Offer", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_OFFER_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_OFFER_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Request", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_REQUEST_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_REQUEST_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Decline", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_DECLINE_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_DECLINE_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Ack", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_ACK_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_ACK_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Nack", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_NACK_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_NACK_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Release", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_RELEASE_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_RELEASE_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Inform", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_INFORM_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_INFORM_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n\n", getRowColor(), "DHCP Unknown Msg", formatPkts(el->protocolInfo->dhcpStats->dhcpMsgSent[FLAG_DHCP_UNKNOWN_MSG].value, formatBuf, sizeof(formatBuf)), formatPkts(el->protocolInfo->dhcpStats->dhcpMsgRcvd[FLAG_DHCP_UNKNOWN_MSG].value, formatBuf1, sizeof(formatBuf1))); sendString(buf); sendString("
    %s%s
    %s%s
    %s%s
    %s%s
    %s%s
    DHCP PacketsSentRcvd
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    %s%s%s
    "TABLE_OFF"
    %s" "
    ", getRowColor(), "IP Addresses Bound to this MAC"); sendString(buf); header_sent = 1; } sendString(makeHostLink(theHost, 0, 0, 0, buf, sizeof(buf))); sendString("
    \n"); } } /* for */ if(header_sent) sendString("
    Custom Host Name" "" "" "" "
    %s" "%s  -  %s [Inactive since %s]
    %s" "%d" " [%s]
    %s" "%s
    %s" "%s
    %s" "%s%s
    %s" "%s %s%s%s%s
    %s" "%s %s%s%s%s" "
    %s" "%s%s
    %sMap ", getRowColor(), "Contacts Map", CONST_HOST_IP_MAP_HTML, linkName, vlanStr, CHART_FORMAT); sendString(buf); } sendString("
    %s" "%d
    %s" "%s
    %s" "%d
    %s" "%s@%s [domain %s] (%s) %s
    %s" "%s@%s (%s) %s
    %s" "%s [domain %s] (%s) %s
    %s" "%s (%s) %s
    %s" "%s (%s) %s
    %s" "%s
    %s" "%s
    %s" "%s, %s %s %s 
    %s" "%s" "
    %s" "%s
    %s" "%s
    %s" "%d:%d [~%d hop(s)]
    %s" "" "%s/%s Pkts/%s Retran. Pkts [%d%%]
    %s" "%s Pkts
    %s" "%s/%s Pkts
    %s", getRowColor(), "Multicast Traffic"); sendString(buf); if(el->pktsMulticastSent.value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Sent %s/%s Pkts ", formatBytes(el->bytesMulticastSent.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->pktsMulticastSent.value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } if(el->pktsMulticastRcvd.value > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%sRcvd %s/%s Pkts", (el->pktsMulticastSent.value > 0) ? " - " : "", formatBytes(el->bytesMulticastRcvd.value, 1, formatBuf, sizeof(formatBuf)), formatPkts(el->pktsMulticastRcvd.value, formatBuf1, sizeof(formatBuf1))); sendString(buf); } sendString("
    %s" "" "%s/%s Pkts/%s Retran. Pkts [%d%%]
    " "Known Users " CONST_IMG_HAS_USERS "\n", getRowColor()); sendString(buf); printUserList(el); sendString("
    \n
    " "%s" "[ Whois ]\n", getRowColor(), "Further Host Information", el->hostNumIpAddress); sendString(buf); sendString("
    Historical Data%s
    "TABLE_OFF"

    \n"); sendString("

    \n"); } /* ************************************ */ void printServiceStats(char* svcName, ServiceStats* ss, short printSentStats) { char buf[LEN_GENERAL_WORK_BUFFER]; Counter tot, tot1; float f1, f2, f3, f4; char formatBuf[32], formatBuf1[32], formatBuf2[32], formatBuf3[32], formatBuf4[32], formatBuf5[32], formatBuf6[32], formatBuf7[32]; if(ss != NULL) { if(printSentStats) { tot = ss->numLocalReqSent.value+ss->numRemReqSent.value; if(tot == 0) f1 = f2 = 0; else { f1 = (ss->numLocalReqSent.value*100)/tot; f2 = (ss->numRemReqSent.value*100)/tot; } tot1 = ss->numPositiveReplRcvd.value+ss->numNegativeReplRcvd.value; if(tot1 == 0) f3 = f4 = 0; else { f3 = (ss->numPositiveReplRcvd.value*100)/tot1; f4 = (ss->numNegativeReplRcvd.value*100)/tot1; } if((tot > 0) || (tot1 > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%%" "%s%.1f%%" "%s%.1f%%" "%s%.1f%%" "%s - %s%s - %s" "\n\n", getRowColor(), svcName, formatPkts(ss->numLocalReqSent.value, formatBuf, sizeof(formatBuf)), f1, formatPkts(ss->numRemReqSent.value, formatBuf1, sizeof(formatBuf1)), f2, formatPkts(ss->numPositiveReplRcvd.value, formatBuf2, sizeof(formatBuf2)), f3, formatPkts(ss->numNegativeReplRcvd.value, formatBuf3, sizeof(formatBuf3)), f4, formatMicroSeconds(ss->fastestMicrosecLocalReqMade, formatBuf4, sizeof(formatBuf4)), formatMicroSeconds(ss->slowestMicrosecLocalReqMade, formatBuf5, sizeof(formatBuf5)), formatMicroSeconds(ss->fastestMicrosecRemReqMade, formatBuf6, sizeof(formatBuf6)), formatMicroSeconds(ss->slowestMicrosecRemReqMade, formatBuf7, sizeof(formatBuf7)) ); sendString(buf); } } else { tot = ss->numLocalReqRcvd.value+ss->numRemReqRcvd.value; if(tot == 0) f1 = f2 = 0; else { f1 = (ss->numLocalReqRcvd.value*100)/tot; f2 = (ss->numRemReqRcvd.value*100)/tot; } tot1 = ss->numPositiveReplSent.value+ss->numNegativeReplSent.value; if(tot1 == 0) f3 = f4 = 0; else { f3 = (ss->numPositiveReplSent.value*100)/tot1; f4 = (ss->numNegativeReplSent.value*100)/tot1; } if((tot > 0) || (tot1 > 0)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s" "%s%.1f%%" "%s%.1f%%" "%s%.1f%%" "%s%.1f%%" "%s - %s%s - %s" "\n\n", getRowColor(), svcName, formatPkts(ss->numLocalReqRcvd.value, formatBuf, sizeof(formatBuf)), f1, formatPkts(ss->numRemReqRcvd.value, formatBuf1, sizeof(formatBuf1)), f2, formatPkts(ss->numPositiveReplSent.value, formatBuf2, sizeof(formatBuf2)), f3, formatPkts(ss->numNegativeReplSent.value, formatBuf3, sizeof(formatBuf3)), f4, formatMicroSeconds(ss->fastestMicrosecLocalReqServed, formatBuf4, sizeof(formatBuf4)), formatMicroSeconds(ss->slowestMicrosecLocalReqServed, formatBuf5, sizeof(formatBuf5)), formatMicroSeconds(ss->fastestMicrosecRemReqServed, formatBuf6, sizeof(formatBuf6)), formatMicroSeconds(ss->slowestMicrosecRemReqServed, formatBuf7, sizeof(formatBuf7)) ); sendString(buf); } } } } /* ************************************ */ void printHostUsedServices(HostTraffic *el, int actualDeviceId) { Counter tot; if((el->protocolInfo == NULL) || ((el->protocolInfo->dnsStats == NULL) && (el->protocolInfo->httpStats == NULL))) return; tot = 0; if(el->protocolInfo->dnsStats) tot += el->protocolInfo->dnsStats->numLocalReqSent.value + el->protocolInfo->dnsStats->numRemReqSent.value; if(el->protocolInfo->httpStats) tot += el->protocolInfo->httpStats->numLocalReqSent.value + el->protocolInfo->httpStats->numRemReqSent.value; if(tot > 0) { printSectionTitle("Client Role"); sendString("
    \n"); sendString(""TABLE_ON"\n" "" "" "" "" "" "" "" "\n\n"); if(el->protocolInfo->dnsStats) printServiceStats("DNS", el->protocolInfo->dnsStats, 1); if(el->protocolInfo->httpStats) printServiceStats("HTTP", el->protocolInfo->httpStats, 1); sendString("
     # Loc. Req. Sent# Rem. Req. Sent# Pos. Reply Rcvd# Neg. Reply RcvdLocal RndTripRem RndTrip
    "TABLE_OFF"\n"); sendString("
    \n"); } /* ************ */ tot = 0; if(el->protocolInfo->dnsStats) tot += el->protocolInfo->dnsStats->numLocalReqRcvd.value+el->protocolInfo->dnsStats->numRemReqRcvd.value; if(el->protocolInfo->httpStats) tot += el->protocolInfo->httpStats->numLocalReqRcvd.value+el->protocolInfo->httpStats->numRemReqRcvd.value; if(tot > 0) { printSectionTitle("Server Role"); sendString("
    \n"); sendString("

    "TABLE_ON"\n" "" "" "" "" "" "" "" "\n\n"); if(el->protocolInfo->dnsStats) printServiceStats("DNS", el->protocolInfo->dnsStats, 0); if(el->protocolInfo->httpStats) printServiceStats("HTTP", el->protocolInfo->httpStats, 0); sendString("
     # Loc. Req. Rcvd# Rem. Req. Rcvd# Pos. Reply Sent# Neg. Reply SentLocal RndTripRem RndTrip
    "TABLE_OFF"\n"); sendString("

    \n"); } } /* ********************************** */ void printTableEntry(char *buf, int bufLen, char *label, char* color, float total, float percentage, u_int showFlows, Counter flows, u_int showRRD) { int int_perc; char formatBuf[32], flowBuf[64], tmpBuf[32], rrdBuf[768]; struct stat statbuf; char _label[256]; encodeString(label, _label, sizeof(_label)); /* traceEvent(CONST_TRACE_INFO, "'%s' -> '%s'", label, _label); */ if(total == 0) return; int_perc = (int)percentage; /* This shouldn't happen */ if(int_perc < 0) { int_perc = 0; percentage = 0; } else if(int_perc > 100) { int_perc = 100; percentage = 100; } if(!showFlows) flowBuf[0] = '\0'; else safe_snprintf(__FILE__, __LINE__, flowBuf, sizeof(flowBuf), "%s", formatPkts(flows, tmpBuf, sizeof(tmpBuf))); if(!showRRD) rrdBuf[0] = '\0'; else { safe_snprintf(__FILE__, __LINE__, rrdBuf, sizeof(rrdBuf), "%s/interfaces/%s/IP_%sBytes.rrd", myGlobals.rrdPath != NULL ? myGlobals.rrdPath : ".", myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName, label); revertSlashIfWIN32(rrdBuf, 0); if(stat(rrdBuf, &statbuf) == 0) { time_t now = time(NULL); safe_snprintf(__FILE__, __LINE__, rrdBuf, sizeof(rrdBuf), "

    " "
    " "" " 
    \n", _label, myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName, _label, myGlobals.device[myGlobals.actualReportDeviceId].uniqueIfName, now-12*3600, now); } else { rrdBuf[0] = '\0'; /* traceEvent(CONST_TRACE_INFO, "-> Unable to find file '%s'", rrdBuf); */ } } if(showRRD && (rrdBuf[0] != '\0')) { int_perc = 0; /* Trick for avoid showing the bar */ } switch(int_perc) { case 0: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s %s%.1f%%" " %s\n\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, percentage, rrdBuf); break; case 100: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s %s100%%" "\"100%%\"%s" "\n\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, rrdBuf); break; default: safe_snprintf(__FILE__, __LINE__, buf, bufLen, "%s" "%s %s%.1f%%" "" "\n
    \"%.1f%%\"%s" "" "

     

    "TABLE_OFF"\n\n", getRowColor(), label, formatKBytes(total, formatBuf, sizeof(formatBuf)), flowBuf, percentage, percentage, (260*int_perc)/100, rrdBuf, (260*(100-int_perc))/100, getActualRowColor()); } sendString(buf); } /* *********************************** */ void printHostHourlyTrafficEntry(HostTraffic *el, int i, Counter tcSent, Counter tcRcvd) { float pctg; char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32]; if(el->trafficDistribution == NULL) return; safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "%s", formatBytes(el->trafficDistribution->last24HoursBytesSent[i].value, 0, formatBuf, sizeof(formatBuf))); sendString(buf); if(tcSent > 0) pctg = (float)(el->trafficDistribution->last24HoursBytesSent[i].value*100)/(float)tcSent; else pctg = 0; safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "%.1f %%", getBgPctgColor(pctg), pctg); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "%s", formatBytes(el->trafficDistribution->last24HoursBytesRcvd[i].value, 0, formatBuf, sizeof(formatBuf))); sendString(buf); if(tcRcvd > 0) pctg = (float)(el->trafficDistribution->last24HoursBytesRcvd[i].value*100)/(float)tcRcvd; else pctg = 0; safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "%.1f %%\n", getBgPctgColor(pctg), pctg); sendString(buf); } /* ************************************ */ char* getNbNodeType(char nodeType) { switch(nodeType) { case 0x0: return("Workstation"); case 0x20: default: return("Server"); } return(""); /* NOTREACHED */ } /* ********************************** */ void printFlagedWarning(char *text) { char buf[LEN_GENERAL_WORK_BUFFER]; safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "

    \n" "

    \"Warning\"

    \n" "

    %s

    \n" "
    \n", text); sendString(buf); } /* ********************************** */ void printPageTitle(char *text) { sendString("

     

    \n"); switch (myGlobals.ntopRunState) { case FLAG_NTOPSTATE_RUN: break; case FLAG_NTOPSTATE_STOPCAP: sendString("
    " "Packet capture stopped" "
    \n"); break; case FLAG_NTOPSTATE_SHUTDOWN: sendString("
    " "ntop shutting down" "
    \n"); break; case FLAG_NTOPSTATE_TERM: sendString("
    " "ntop stopped" "
    \n"); break; } sendString("
    \n

    "); sendString(text); sendString("

    \n
    \n"); } /* ******************************** */ void printSectionTitle(char *text) { sendString("

     

    \n" "
    \n

    "); sendString(text); sendString("

    \n
    \n"); } /* ******************************** */ void printHostsCharacterization(void) { u_int a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, l=0, unhealthy=0, totHosts=0; HostTraffic *el; char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER], headerSent = 0; printHTMLheader("Local Hosts Characterization", NULL, 0); for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if((broadcastHost(el) == 0) /* No broadcast addresses please */ && (multicastHost(el) == 0) /* No multicast addresses please */ && subnetPseudoLocalHost(el)) { totHosts++; if(el->community && (!isAllowedCommunity(el->community))) continue; if(isPrinter(el) || isBridgeHost(el) || nameServerHost(el) || isNtpServer(el) || gatewayHost(el) || isVoIPHost(el) || isSMTPhost(el) || isIMAPhost(el) || isPOPhost(el) || isDirectoryHost(el) || isFTPhost(el) || isHTTPhost(el) || isWINShost(el) || isDHCPClient(el) || isDHCPServer(el) || isP2P(el) || (isHostHealthy(el) != 0) ) { if(!headerSent) { sendString("
    "TABLE_ON"\n" "" "" "" "" "" "" "" "" "" "" "" "\n\n" ); headerSent = 1; } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor(), makeHostLink(el, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString(buf); if(isHostHealthy(el) != 0) { sendString(""); unhealthy++; } else sendString(""); if(isBridgeHost(el)) { sendString(""); a++; } else sendString(""); if(gatewayHost(el)) { sendString(""); b++; } else sendString(""); if(isVoIPHost(el)) { sendString(""); c++; } else sendString(""); if(isPrinter(el)) { sendString(""); d++; } else sendString(""); if(nameServerHost(el) || isNtpServer(el)) { sendString(""); e++; } else sendString(""); if(isSMTPhost(el) || isIMAPhost(el) || isPOPhost(el)) { sendString(""); f++; } else sendString(""); if(isDirectoryHost(el) || isFTPhost(el) || isHTTPhost(el)) { sendString(""); g++; } else sendString(""); if(isDHCPServer(el) || isWINShost(el)) { sendString(""); h++; } else sendString(""); if(isDHCPClient(el)) { sendString(""); i++; } else sendString(""); if(isP2P(el)) { sendString(""); l++; } else sendString(""); sendString("\n\n"); } } } if(!headerSent) { printNoDataYet(); } else { sendString(""); if(unhealthy > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", unhealthy, (float)(unhealthy*100)/(float)totHosts); sendString(buf); } else sendString(""); if(a > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", a); sendString(buf); } else sendString(""); if(b > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", b); sendString(buf); } else sendString(""); if(c > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", c); sendString(buf); } else sendString(""); if(d > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", d); sendString(buf); } else sendString(""); if(e > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", e); sendString(buf); } else sendString(""); if(f > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", f); sendString(buf); } else sendString(""); if(g > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", g); sendString(buf); } else sendString(""); if(h > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", h); sendString(buf); } else sendString(""); if(i > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", i); sendString(buf); } else sendString(""); if(l > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", i); sendString(buf); } else sendString(""); sendString("
    HostUnhealthy
    Host
    L2 Switch
    Bridge
    GatewayVoIP
    Host
    PrinterNTP/DNS
    Server
    SMTP/POP/IMAP
    Server
    Directory/FTP/HTTP
    Server
    DHCP/WINS
    Server
    DHCP
    Client
    P2P
    %sX X X X X X X X X X X 
    Total%d [%.1f %%] %d %d %d %d %d %d %d %d %d %d 
    \n"); } } /* ******************************** */ static void printFingerprintCounts(int countScanned, int countWithoutFP, int countBroadcast, int countMulticast, int countRemote, int countNotIP, int countUnknownFP, int unknownFPsEtc, int countCantResolve, int fingerprintRemote, char *unknownFPs) { char buf[LEN_GENERAL_WORK_BUFFER]; struct tm t; sendString("


    \n"); printSectionTitle("Statistics"); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "

    \n\n" "\n" "\n" "\n" "\n" "\n" "\n", countScanned, countWithoutFP, countBroadcast, countMulticast); sendString(buf); if(fingerprintRemote != TRUE) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n", countRemote); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "\n" "\n" "\n", countNotIP, countScanned - countWithoutFP - countBroadcast - countMulticast - countRemote - countNotIP); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", countCantResolve); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "" "\n", countUnknownFP); sendString(buf); sendString("\n
    Scanned
    Hosts%d
    Less:
    No fingerprint%d
    Broadcast%d
    Multicast%d
    Remote%d
    Non IP host%d
    Gives:
    Possible to report%d
    Less: Can not resolve*%d
    Less: Unknown Fingerprint**%d
    \n

    \n"); sendString("\n"); sendString("\n"); sendString("
    * Can not resolve means " "either the fingerprint was incomplete, or we tried to resolve " "it on a previous scan and it was not on file. " "No further action will occur for these hosts.
    ** Unknown Fingerprints means " "we have not tried to resolve them yet.\n" "
      "); if((myGlobals.nextFingerprintScan > 0) && (countUnknownFP > 0) && (myGlobals.runningPref.debugMode != 1)) { strftime(buf, sizeof(buf), CONST_LOCALE_TIMESPEC, localtime_r(&myGlobals.nextFingerprintScan, &t)); sendString("
    • May be resolved during the next scan, scheduled for "); sendString(buf); sendString(" (approximately).
    • \n"); } if(unknownFPs[0] != '\0') { unknownFPs[0]=' '; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
    • Are: %s%s
    • \n", unknownFPs, unknownFPsEtc == 1 ? " ..." : ""); sendString(buf); } #ifdef CONST_ETTERCAP_HOMEPAGE safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "
    • Click " "here " "to visit Ettercap's home page at SourceForge. " "And, click " "here " " to upload new fingerprints, or download additional (unverified) ones.

    • \n", CONST_ETTERCAP_HOMEPAGE, CONST_ETTERCAP_HOMEPAGE, CONST_ETTERCAP_FINGERPRINT); sendString(buf); #endif sendString("
    • You can use the 'make dnetter' command, part of the ntop source distribution, " "to download the latest fingerprint file from the Ettercap cvs.

    • \n"); if(fingerprintRemote != TRUE) sendString("
    Fingerprinting of non-local hosts may be erroneous " "- routers and intermediate hosts can alter the characteristics used to " "determine the operating system. Unfortunately, this can also occur because " "of entries not in the signature file, " CONST_OSFINGERPRINT_FILE "(.gz) - " "and there's no way to tell." "\n
    That said, if you would like to see a page with ALL host fingerprints, " "local and remote, click here

    \n"); } /* ******************************** */ void printHostsStats(int fingerprintRemote) { u_int idx, numEntries=0, maxHosts; HostTraffic *el, **tmpTable; OsNumInfo theOSs[MAX_NUM_OS]; int i, countScanned=0, countWithoutFP=0, countBroadcast=0, countMulticast=0, countRemote=0, countNotIP=0, countUnknownFP=0, countCantResolve=0; char buf[LEN_GENERAL_WORK_BUFFER], hostLinkBuf[3*LEN_GENERAL_WORK_BUFFER]; char unknownFPs[LEN_GENERAL_WORK_BUFFER]; int unknownFPsEtc=0; memset(theOSs, 0, sizeof(theOSs)); memset(unknownFPs, 0, sizeof(unknownFPs)); if(fingerprintRemote == 1) printHTMLheader("All Host Fingerprints (Local+Remote)", NULL, BITFLAG_HTML_NO_REFRESH); else printHTMLheader("Local Host Fingerprints", NULL, BITFLAG_HTML_NO_REFRESH); printSectionTitle("OS Summary"); if(myGlobals.device[myGlobals.actualReportDeviceId].dummyDevice) { printFlagedWarning("Host statistics (OS fingerprinting) are not available for virtual interfaces"); return; } maxHosts = myGlobals.device[myGlobals.actualReportDeviceId].hosts.hostsno; /* save it as it can change */ tmpTable = (HostTraffic**)mallocAndInitWithReportWarn(maxHosts*sizeof(HostTraffic*), "printHostsStats"); if(tmpTable == NULL) return; for(el = getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { countScanned++; if(el->community && (!isAllowedCommunity(el->community))) continue; if(el->fingerprint == NULL) { countWithoutFP++; continue; } if(broadcastHost(el)) { /* No broadcast addresses please */ countBroadcast++; continue; } if(multicastHost(el)) { /* No multicast addresses please */ countMulticast++; continue; } if((!subnetPseudoLocalHost(el)) && (fingerprintRemote != TRUE)) { /* Local only */ countRemote++; continue; } if((el->fingerprint[0] != ':') /* fingerprint has not been computed */ && ((el->hostNumIpAddress[0] == '\0') || (addrnull(&el->hostIpAddress)))) { countNotIP++; continue; } if(el->fingerprint[0] != ':') setHostFingerprint(el); if(el->fingerprint[0] != ':') { countUnknownFP++; if(strstr(unknownFPs, el->fingerprint) == NULL) { if(strlen(unknownFPs) + strlen(el->fingerprint) > (sizeof(unknownFPs) - 5)) { unknownFPsEtc=1; } else { strncat(unknownFPs, ", ", (sizeof(unknownFPs) - strlen(unknownFPs) - 1)); strncat(unknownFPs, el->fingerprint, (sizeof(unknownFPs) - strlen(unknownFPs) - 1)); } } continue; } if((el->fingerprint[0] == ':') && (el->fingerprint[1] == '\0')) { /* Too short */ countCantResolve++; continue; } tmpTable[numEntries++] = el; for(i=0; ifingerprint[1]) == 0) { theOSs[i].num++; break; } } if(theOSs[i].name == NULL) { theOSs[i].name = strdup(&el->fingerprint[1]); theOSs[i].num++; } if(numEntries >= maxHosts) break; } if(numEntries <= 0) { printNoDataYet(); free(tmpTable); printFingerprintCounts(countScanned, countWithoutFP, countBroadcast, countMulticast, countRemote, countNotIP, countUnknownFP, unknownFPsEtc, countCantResolve, fingerprintRemote, unknownFPs); return; } myGlobals.columnSort = 0; qsort(tmpTable, numEntries, sizeof(HostTraffic*), cmpFctn); sendString("
    \n"); sendString(""TABLE_ON"\n"); for(i=0; i"); os = strdup(theOSs[i].name); word = strtok_r(os, " ", &strtokState); while(word != NULL) { if((sentBR++) > 0) sendString("
    \n"); sendString(word); word = strtok_r(NULL, " ", &strtokState); } free(os); sendString(""); } } sendString("
    \n\n"); for(idx=0; idxhostNumIpAddress; if((tmpName1[0] == '\0') || (strcmp(tmpName1, "0.0.0.0") == 0)) tmpName1 = myGlobals.separator; safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", getRowColor(), makeHostLink(el, FLAG_HOSTLINK_TEXT_FORMAT, 0, 0, hostLinkBuf, sizeof(hostLinkBuf))); sendString(buf); for(i=0; ifingerprint[1]) == 0) { if((el->protocolInfo != NULL) && (el->protocolInfo->userList != NULL)) { sendString(""); } else { if((el->nonIPTraffic != NULL) && (el->nonIPTraffic->nbDomainName != NULL)) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "", el->nonIPTraffic->nbDomainName); sendString(buf); } else sendString(""); } } else sendString(""); } } /* for */ sendString("\n\n"); } } sendString("
    Host
    %s"); printUserList(el); sendString("
    \n
    [ %s ]X 
    \n

     

    "); /* ********************************** */ qsort(theOSs, MAX_NUM_OS, sizeof(OsNumInfo), cmpOSFctn); sendString("
    " TABLE_ON "\n" "\n\n"); for(i=0; i\n" "\n", theOSs[i].name, theOSs[i].num); sendString(buf); free(theOSs[i].name); } } sendString("
    OSTotal
    %s%d
    \n
    \n"); free(tmpTable); printFingerprintCounts(countScanned, countWithoutFP, countBroadcast, countMulticast, countRemote, countNotIP, countUnknownFP, unknownFPsEtc, countCantResolve, fingerprintRemote, unknownFPs); } /* ******************************************************** */ void printMutexStatus(int textPrintFlag, PthreadMutex *mutexId, char *mutexName) { #ifdef MUTEX_DEBUG char buf[LEN_GENERAL_WORK_BUFFER], bufAttempt[64], bufLock[64], bufUnlock[64]; struct tm t; if(mutexId->numLocks == 0) /* Mutex never used */ return; memset(bufAttempt, 0, sizeof(bufAttempt)); if(mutexId->attempt.time.tv_sec > 0) { strftime(bufAttempt, sizeof(bufAttempt), CONST_LOCALE_TIMESPEC, localtime_r((const time_t*)&mutexId->attempt.time.tv_sec, &t)); strncat(bufAttempt, "
    \n", (sizeof(bufAttempt) - strlen(bufAttempt) - 1)); } memset(bufLock, 0, sizeof(bufLock)); if(mutexId->lock.time.tv_sec > 0) { strftime(bufLock, sizeof(bufLock), CONST_LOCALE_TIMESPEC, localtime_r((const time_t*)&mutexId->lock.time.tv_sec, &t)); strncat(bufLock, "
    \n", (sizeof(bufLock) - strlen(bufLock) - 1)); } memset(bufUnlock, 0, sizeof(bufUnlock)); if(mutexId->unlock.time.tv_sec > 0) { strftime(bufUnlock, sizeof(bufUnlock), CONST_LOCALE_TIMESPEC, localtime_r((const time_t*)&mutexId->unlock.time.tv_sec, &t)); strncat(bufUnlock, "
    \n", (sizeof(bufUnlock) - strlen(bufUnlock) - 1)); } if(textPrintFlag == TRUE) { if(myGlobals.runningPref.disableMutexExtraInfo) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Mutex %s is %s, locked: %u times.\n", mutexName, mutexId->isLocked ? "locked" : "unlocked", mutexId->numLocks); sendString(buf); } else if(mutexId->attempt.line > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Mutex %s is %s.\n" " locked: %u times, last was at %s %s:%d(%d %u)\n" " blocked: at %s:%d(%d %u)\n", mutexName, mutexId->isLocked ? "locked" : "unlocked", mutexId->numLocks, bufLock, mutexId->lock.file, mutexId->lock.line, mutexId->lock.pid, mutexId->lock.thread, mutexId->attempt.file, mutexId->attempt.line, mutexId->attempt.pid, mutexId->attempt.thread); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), " unlocked: %u times, last was %s:%d(%d %u)\n" " longest: %.6f sec from %s:%d\n", mutexId->numReleases, mutexId->unlock.file, mutexId->unlock.line, mutexId->unlock.pid, mutexId->unlock.thread, mutexId->maxLockedDuration, mutexId->max.file, mutexId->max.line); sendString(buf); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Mutex %s, is %s.\n" " locked: %u times, last was at %s %s:%d(%d %u)\n" " unlocked: %u times, last was at %s %s:%d(%d %u)\n" " longest: %.6f sec from %s:%d\n", mutexName, mutexId->isLocked ? "locked" : "unlocked", mutexId->numLocks, bufLock, mutexId->lock.file, mutexId->lock.line, mutexId->lock.pid, mutexId->lock.thread, mutexId->numReleases, bufUnlock, mutexId->unlock.file, mutexId->unlock.line, mutexId->unlock.pid, mutexId->unlock.thread, mutexId->maxLockedDuration, mutexId->max.file, mutexId->max.line); sendString(buf); } } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s\n%s\n", mutexName, mutexId->isLocked ? "locked" : "unlocked"); sendString(buf); if(!myGlobals.runningPref.disableMutexExtraInfo) { if(mutexId->attempt.line == 0) { sendString(" \n"); } else { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s, %s:%d p:%d t:%u\n", bufAttempt, mutexId->attempt.file, mutexId->attempt.line, mutexId->attempt.pid, mutexId->attempt.thread); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s %s:%d p:%d t:%u\n", bufLock, mutexId->lock.file, mutexId->lock.line, mutexId->lock.pid, mutexId->lock.thread); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s %s:%d p:%d t:%u\n", bufUnlock, mutexId->unlock.file, mutexId->unlock.line, mutexId->unlock.pid, mutexId->unlock.thread); sendString(buf); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%.6f seconds %s:%d\n", mutexId->maxLockedDuration, mutexId->max.file, mutexId->max.line); sendString(buf); } safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%u / %u\n", mutexId->numLocks, mutexId->numReleases); sendString(buf); } #endif } /* ************************************************ */ void printPluginTrailer(char *left, char *middle) { sendString("
    \n
    \n
    \n"); if(left != NULL) { sendString("\n"); /* So there's at least something in to cell */ } sendString("\n
    [ Refresh this data ]"); sendString(" "); sendString(" "); if(middle != NULL) sendString(middle); sendString(" "); sendString("" " [ Back to plugins ]" "
    \n
    \n"); } /* ************************************ */ void buildMapLink(HostTraffic *el, char *buf, int buf_len) { if(privateIPAddress(el)) buf[0] = '\0'; else { safe_snprintf(__FILE__, __LINE__, buf, buf_len, " " "\n", myGlobals.runningPref.mapperURL, el->hostResolvedName, el->hostNumIpAddress); } } /* ************************************ */ ntop-5.0.1+dfsg1/httpd.c0000644000000000000000000040007412001370731013461 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * http://www.ntop.org * * Copyright (C) 1998-2012 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include "ntop.h" #include "globals-report.h" #if 0 #define URL_DEBUG #define HTTP_DEBUG #endif /* Private structure definitions */ struct _HTTPstatus { int statusCode; char *reasonPhrase; char *longDescription; }; /* This is the complete list of "Status Codes" and suggested "Reason Phrases" for HTTP responses, as stated in RFC 2068 NOTE: the natural order is altered so "200 OK" results the first item in the table (index = 0) */ struct _HTTPstatus HTTPstatus[] = { { 200, "OK", NULL }, { 100, "Continue", NULL }, { 101, "Switching Protocols", NULL }, { 201, "Created", NULL }, { 202, "Accepted", NULL }, { 203, "Non-Authoritative Information", NULL }, { 204, "No Content", NULL }, { 205, "Reset Content", NULL }, { 206, "Partial Content", NULL }, { 300, "Multiple Choices", NULL }, { 301, "Moved Permanently", NULL }, { 302, "Moved Temporarily", NULL }, { 303, "See Other", NULL }, { 304, "Not Modified", NULL }, { 305, "Use Proxy", NULL }, { 400, "Bad Request", "The specified request is invalid." }, { 401, "Authorization Required", "Unauthorized to access the document." }, { 402, "Payment Required", NULL }, { 403, "Forbidden", "Server refused to fulfill your request." }, { 404, "Not Found", "The server cannot find the requested page " "(page expired or ntop configuration ?)." }, { 405, "Method Not Allowed", NULL }, { 406, "Not Acceptable", NULL }, { 407, "Proxy Authentication Required", NULL }, { 408, "Request Time-out", "The request was timed-out." }, { 409, "Conflict", NULL }, { 410, "Gone", "The page you requested is not available in your current ntop " "configuration. See the ntop " "man page for more information" }, { 411, "Length Required", NULL }, { 412, "Precondition Failed", NULL }, { 413, "Request Entity Too Large", NULL }, { 414, "Request-URI Too Large", NULL }, { 415, "Unsupported Media Type", NULL }, { 500, "Internal Server Error", NULL }, { 501, "Not Implemented", "The requested method is not implemented by this server." }, { 502, "Bad Gateway", NULL }, { 503, "Service Unavailable", NULL }, { 504, "Gateway Time-out", NULL }, { 505, "HTTP Version not supported", "This server doesn't support the specified HTTP version." }, }; /* Note: the numbers below are offsets inside the HTTPstatus table, they must be corrected every time the table is modified. */ #define BITFLAG_HTTP_STATUS_200 ( 0<<8) #define BITFLAG_HTTP_STATUS_302 (11<<8) #define BITFLAG_HTTP_STATUS_304 (13<<8) #define BITFLAG_HTTP_STATUS_400 (15<<8) #define BITFLAG_HTTP_STATUS_401 (16<<8) #define BITFLAG_HTTP_STATUS_403 (18<<8) #define BITFLAG_HTTP_STATUS_404 (19<<8) #define BITFLAG_HTTP_STATUS_408 (23<<8) #define BITFLAG_HTTP_STATUS_500 (31<<8) #define BITFLAG_HTTP_STATUS_501 (32<<8) #define BITFLAG_HTTP_STATUS_505 (36<<8) /* ************************* */ #define MAX_NUM_COMMUNITIES 32 static u_int httpBytesSent; char httpRequestedURL[512], theHttpUser[32], theLastHttpUser[32]; char allowedCommunities[256], *listAllowedCommunities[MAX_NUM_COMMUNITIES]; static HostAddr *requestFrom; /* ************************* */ /* Forward */ static int readHTTPheader(char* theRequestedURL, int theRequestedURLLen, char *thePw, int thePwLen, char *theAgent, int theAgentLen, char *theReferer, int theRefererLen, char *theLanguage, int theLanguageLen, char *ifModificedSince, int ifModificedSinceLen, int *isPostMethod); static int returnHTTPPage(char* pageName, int postLen, HostAddr *from, struct timeval *httpRequestedAt, int *usedFork, char *agent, char *referer, char *requestedLanguage[], int numLang, char *ifModificedSince, int isPostMethod); static int generateNewInternalPages(char* pageName); static int decodeString(char *bufcoded, unsigned char *bufplain, int outbufsize); static void logHTTPaccess(int rc, struct timeval *httpRequestedAt, u_int gzipBytesSent); static void returnHTTPspecialStatusCode(int statusIdx, char *additionalText); static int checkURLsecurity(char *url); static int checkHTTPpassword(char *theRequestedURL, int theRequestedURLLen _UNUSED_, char* thePw, int thePwLen); static char compressedFilePath[256]; static short compressFile = 0, acceptGzEncoding; static FILE *compressFileFd=NULL; #ifdef MAKE_WITH_ZLIB static void compressAndSendData(u_int*); #endif /* ************************* */ #ifdef HAVE_OPENSSL char* printSSLError(int errorId) { switch(errorId) { case SSL_ERROR_NONE: return("SSL_ERROR_NONE"); case SSL_ERROR_SSL: return("SSL_ERROR_SSL"); case SSL_ERROR_WANT_READ: return("SSL_ERROR_WANT_READ"); case SSL_ERROR_WANT_WRITE: return("SSL_ERROR_WANT_WRITE"); case SSL_ERROR_WANT_X509_LOOKUP: return("SSL_ERROR_WANT_X509_LOOKUP"); case SSL_ERROR_SYSCALL: return("SSL_ERROR_SYSCALL"); case SSL_ERROR_ZERO_RETURN: return("SSL_ERROR_ZERO_RETURN"); case SSL_ERROR_WANT_CONNECT: return("SSL_ERROR_WANT_CONNECT"); default: return("???"); } } #endif /* ************************* */ static int readHTTPheader(char* theRequestedURL, int theRequestedURLLen, char *thePw, int thePwLen, char *theAgent, int theAgentLen, char *theReferer, int theRefererLen, char *theLanguage, int theLanguageLen, char *ifModificedSince, int ifModificedSinceLen, int *isPostMethod) { #ifdef HAVE_OPENSSL SSL* ssl = getSSLsocket(-myGlobals.newSock); #endif char aChar[8] /* just in case */, lastChar; char *lineStr; int rc, idxChar=0, contentLen=-1, numLine=0, topSock; fd_set mask; struct timeval wait_time; int errorCode=0, lineStrLen; char *tmpStr; *isPostMethod = FALSE; /* Assume GET Method by default */ thePw[0] = '\0'; lastChar = '\n'; theRequestedURL[0] = '\0'; memset(httpRequestedURL, 0, sizeof(httpRequestedURL)); lineStrLen = 768; lineStr = (char*)calloc(lineStrLen, sizeof(char)); if(lineStr == NULL) { traceEvent(CONST_TRACE_WARNING, "Not enough memory"); return(FLAG_HTTP_INVALID_REQUEST); } #ifdef HAVE_OPENSSL topSock = abs(myGlobals.newSock); #else topSock = myGlobals.newSock; #endif for(;;) { FD_ZERO(&mask); FD_SET((unsigned int)topSock, &mask); /* printf("About to call select()\n"); fflush(stdout); */ if(myGlobals.newSock > 0) { /* Call select only for HTTP. Fix courtesy of Olivier Maul */ /* select returns immediately */ wait_time.tv_sec = 10; wait_time.tv_usec = 0; rc = select(myGlobals.newSock+1, &mask, 0, 0, &wait_time); if(rc == 0) { errorCode = FLAG_HTTP_REQUEST_TIMEOUT; /* Timeout */ #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Timeout while reading from socket."); #endif break; } } /* printf("About to call recv()\n"); fflush(stdout); */ /* printf("Rcvd %d bytes\n", recv(myGlobals.newSock, aChar, 1, MSG_PEEK)); fflush(stdout); */ #ifdef HAVE_OPENSSL if(myGlobals.newSock < 0) { rc = SSL_read(ssl, aChar, 1); if(rc == -1) { /* traceEvent(CONST_TRACE_ERROR, "[SSL] [error=%d]", SSL_get_error(ssl, rc)); */ ntop_ssl_error_report("read"); } } else rc = (int)recv(myGlobals.newSock, aChar, 1, 0); #else rc = (int)recv(myGlobals.newSock, aChar, 1, 0); #endif if(rc != 1) { idxChar = 0; #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Socket read returned %d (errno=%d)", rc, errno); #endif /* FIXME (DL): is valid to write to the socket after this condition? */ break; /* Empty line */ } else if((errorCode == 0) && !isprint(aChar[0]) && !isspace(aChar[0])) { errorCode = FLAG_HTTP_INVALID_REQUEST; #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Rcvd non expected char '%c' [%d/0x%x]", aChar[0], aChar[0], aChar[0]); #endif } else { #ifdef URL_DEBUG if(0) traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Rcvd char '%c' [%d/0x%x]", aChar[0], aChar[0], aChar[0]); #endif if(aChar[0] == '\r') { /* is ignored as recommended in section 19.3 of RFC 2068 */ continue; } else if(aChar[0] == '\n') { if(lastChar == '\n') { idxChar = 0; break; } numLine++; lineStr[idxChar] = '\0'; #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: read HTTP %s line: %s [%d]", (numLine>1) ? "header" : "request", lineStr, idxChar); #endif if(errorCode != 0) { ; /* skip parsing after an error was detected */ } else if(numLine == 1) { strncpy(httpRequestedURL, lineStr, sizeof(httpRequestedURL)-1)[sizeof(httpRequestedURL)-1] = '\0'; if(idxChar < 9) { errorCode = FLAG_HTTP_INVALID_REQUEST; #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Too short request line."); #endif } else if(strncmp(&lineStr[idxChar-9], " HTTP/", 6) != 0) { errorCode = FLAG_HTTP_INVALID_REQUEST; #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Malformed request line. [%s][idxChar=%d]", &lineStr[idxChar-9], idxChar); { int y; for(y=0; y= 3) && (strncmp(lineStr, "GET ", 4) == 0)) { tmpStr = &lineStr[4]; } else if((idxChar >= 4) && (strncmp(lineStr, "POST ", 5) == 0)) { tmpStr = &lineStr[5]; *isPostMethod = TRUE; /* HEAD method could be supported with some litle modifications... } else if((idxChar >= 4) && (strncmp(lineStr, "HEAD ", 5) == 0)) { tmpStr = &lineStr[5]; */ } else { errorCode = FLAG_HTTP_INVALID_METHOD; #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Unrecognized method in request line."); #endif } if(tmpStr) { int beginIdx; /* Before to copy the URL let's check whether it has been sent through a proxy */ if(strncasecmp(tmpStr, "http://", 7) == 0) beginIdx = 7; else if(strncasecmp(tmpStr, "https://", 8) == 0) beginIdx = 8; else beginIdx = 0; if(beginIdx > 0) { while((tmpStr[beginIdx] != '\0') && (tmpStr[beginIdx] != '/')) beginIdx++; } strncpy(theRequestedURL, &tmpStr[beginIdx], theRequestedURLLen-1)[theRequestedURLLen-1] = '\0'; } } } else if((idxChar >= 21) && (strncasecmp(lineStr, "Authorization: Basic ", 21) == 0)) { strncpy(thePw, &lineStr[21], thePwLen-1)[thePwLen-1] = '\0'; #ifdef MAKE_WITH_ZLIB } else if((idxChar >= 17) && (strncasecmp(lineStr, "Accept-Encoding: ", 17) == 0)) { if(strstr(&lineStr[17], "gzip")) acceptGzEncoding = 1; #endif } else if((idxChar >= 16) && (strncasecmp(lineStr, "Content-Length: ", 16) == 0)) { contentLen = atoi(&lineStr[16]); #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: len=%d [%s/%s]", contentLen, lineStr, &lineStr[16]); #endif } else if((idxChar >= 19) && (strncasecmp(lineStr, "If-Modified-Since: ", 19) == 0)) { strncpy(ifModificedSince, &lineStr[19], ifModificedSinceLen-1)[ifModificedSinceLen-1] = '\0'; } else if((idxChar >= 12) && (strncasecmp(lineStr, "User-Agent: ", 12) == 0)) { strncpy(theAgent, &lineStr[12], theAgentLen-1)[theAgentLen-1] = '\0'; } else if((idxChar >= 9) && (strncasecmp(lineStr, "Referer: ", 9) == 0)) { strncpy(theReferer, &lineStr[9], theRefererLen-1)[theRefererLen-1] = '\0'; } idxChar=0; } else if(idxChar > lineStrLen-2) { if(errorCode == 0) { errorCode = FLAG_HTTP_INVALID_REQUEST; #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Line too long (hackers ?)"); #endif } } else { lineStr[idxChar++] = aChar[0]; } } lastChar = aChar[0]; } free(lineStr); return((errorCode) ? errorCode : contentLen); } /* ************************* */ char* encodeString(char* in, char* out, u_int out_len) { int i, out_idx; out[0] = '\0'; for(i = out_idx = 0; i < strlen(in); i++) { if(isalnum(in[i])) { out[out_idx++] = in[i]; if(out_idx >= out_len) return(out); } else if(in[i] == ' ') { out[out_idx++] = '+'; if(out_idx >= out_len) return(out); } else { char hex_str[8]; out[out_idx++] = '%'; sprintf(hex_str, "%02X", in[i] & 0xFF); out[out_idx++] = hex_str[0]; if(out_idx >= out_len) return(out); out[out_idx++] = hex_str[1]; if(out_idx >= out_len) return(out); } } out[out_idx++] = '\0'; return(out); } /* ************************* */ static int decodeString(char *bufcoded, unsigned char *bufplain, int outbufsize) { /* single character decode */ #define DEC(c) pr2six[(int)c] #define MAXVAL 63 unsigned char pr2six[256]; char six2pr[64] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+','/' }; /* static */ int first = 1; int nbytesdecoded, j; char *bufin = bufcoded; unsigned char *bufout = bufplain; int nprbytes; /* If this is the first call, initialize the mapping table. * This code should work even on non-ASCII machines. */ if(first) { first = 0; for(j=0; j<256; j++) pr2six[j] = MAXVAL+1; for(j=0; j<64; j++) pr2six[(int)six2pr[j]] = (unsigned char) j; } /* Strip leading whitespace. */ while(*bufcoded==' ' || *bufcoded == '\t') bufcoded++; /* Figure out how many characters are in the input buffer. * If this would decode into more bytes than would fit into * the output buffer, adjust the number of input bytes downwards. */ bufin = bufcoded; while(pr2six[(int)*(bufin++)] <= MAXVAL) ; nprbytes = (int)(bufin - bufcoded - 1); nbytesdecoded = ((nprbytes+3)/4) * 3; if(nbytesdecoded > outbufsize) { nprbytes = (outbufsize*4)/3; } bufin = bufcoded; while (nprbytes > 0) { *(bufout++) = (unsigned char) (DEC(*bufin) << 2 | DEC(bufin[1]) >> 4); *(bufout++) = (unsigned char) (DEC(bufin[1]) << 4 | DEC(bufin[2]) >> 2); *(bufout++) = (unsigned char) (DEC(bufin[2]) << 6 | DEC(bufin[3])); bufin += 4; nprbytes -= 4; } if(nprbytes & 03) { if(pr2six[(int)bufin[-2]] > MAXVAL) { nbytesdecoded -= 2; } else { nbytesdecoded -= 1; } } return(nbytesdecoded); } /* ************************* */ static void ssiMenu_Head(void) { FlowFilterList *flows = myGlobals.flowsList; short foundAplugin = 0; char buf[LEN_GENERAL_WORK_BUFFER]; ExtraPage *ep; memset(&buf, 0, sizeof(buf)); sendStringWOssi( "\n" "\n" "\n" "\n" "\n" "\n"); } /* ************************* */ static void ssiMenu_Body(void) { sendStringWOssi( "\n" " \n" " \n" "" " \n" " \n" " \n" " \n" " \n" "
    \n" " \n" " \n" " \n" " \n" "
    \n"); if(myGlobals.runningPref.instance != NULL) { sendStringWOssi( " \n" " " " \n" " \n" " \n" "
    \"ntopInstance: "); sendStringWOssi(myGlobals.runningPref.instance); sendStringWOssi( "
    "); } else { sendStringWOssi(" "); } sendStringWOssi( "
    (C) 1998-2012 - " CONST_MAILTO_LUCA "  
    \n" " \n" "
    Please enable make sure that the ntop html/ directory is properly installed
    \n" "
    " "" "
    \n" "

     

    \n"); } /* ************************* */ static void processSSI(const char *ssiRequest) { int rc; char *ssiVirtual, *ssiURIstart, *ssiURIend, *ssiPARMstart; myGlobals.numSSIRequests++; #ifdef HTTP_DEBUG traceEvent(CONST_TRACE_INFO, "HTTP_DEBUG: SSI: Request %d = '%s'", myGlobals.numSSIRequests, ssiRequest); #endif /* We need to check if it's the ONLY form we support... * * * If it is, we need to do some of the processing we normally do in handleHTTPrequest() * after the receive and before returnHTTPPage(). But not all - this is, after all * a request made by ntop internally, or from an ntop .html page which you had to * be root (or the ntop userid) to install in the first place... * * 1. We need to check whether the URL is invalid, i.e. it contains '..' or * similar chars that can be used for reading system files. * 2. We can't check the password - we no longer have the Authorization header. * Besides, we already authorized the page request. * 3. Strip leading /s and trailing white space * 4. Break the URI into URI and PARM, then * 5. Actually process it... * * Lastly, remember ssiRequest (and pointers to it) is a COPY, so we don't have * to restore characters we null out. But, once we do so, we can't display the whole * request! */ if((ssiVirtual = strstr(ssiRequest, "virtual=\"")) == NULL) { myGlobals.numBadSSIRequests++; traceEvent(CONST_TRACE_WARNING, "SSI: Ignored invalid (form): '%s'", ssiRequest); #ifdef HTTP_DEBUG sendString(""); sendString(ssiRequest); #endif return; } ssiURIstart = &ssiVirtual[strlen("virtual=\"")]; if((ssiURIend=strchr(ssiURIstart, '"')) == NULL) { myGlobals.numBadSSIRequests++; traceEvent(CONST_TRACE_WARNING, "SSI: Ignored invalid (quotes): '%s'", ssiRequest); #ifdef HTTP_DEBUG sendString(""); sendString(ssiRequest); #endif return; } ssiURIend[0] = '\0'; #ifdef HTTP_DEBUG traceEvent(CONST_TRACE_INFO, "HTTP_DEBUG: SSI: Requested URI = '%s'", ssiURIstart); #endif if((rc = checkURLsecurity(ssiURIstart)) != 0) { myGlobals.numBadSSIRequests++; traceEvent(CONST_TRACE_ERROR, "SSI: URL security: '%s' rejected (code=%d)", ssiURIstart, rc); return; } while(ssiURIstart[0] == '/') { ssiURIstart++; } while((ssiURIend > ssiURIstart) && ((ssiURIend[0] == ' ') || (ssiURIend[0] == '\n') || (ssiURIend[0] == '\r') || (ssiURIend[0] == '\t'))) { ssiURIend[0] = '\0'; ssiURIend--; } if((ssiPARMstart = strchr(ssiURIstart, '?')) != NULL) { /* We have parms! */ ssiPARMstart[0] = '\0'; ssiPARMstart++; #ifdef HTTP_DEBUG traceEvent(CONST_TRACE_INFO, "HTTP_DEBUG: SSI: Adjusted URI = '%s' PARM = '%s'", ssiURIstart, ssiPARMstart); } else { traceEvent(CONST_TRACE_INFO, "HTTP_DEBUG: SSI: Adjusted URI = '%s'", ssiURIstart); #endif } if(ssiURIstart[0] == '\0') { myGlobals.numBadSSIRequests++; traceEvent(CONST_TRACE_WARNING, "SSI: Invalid - NULL request ignored"); #ifdef HTTP_DEBUG sendString(""); #endif return; } /* And so begins the actual processing of an SSI */ sendString("\n\n\n"); if(strcasecmp(ssiURIstart, CONST_SSI_MENUBODY_HTML) == 0) { ssiMenu_Body(); } else if(strcasecmp(ssiURIstart, CONST_SSI_MENUHEAD_HTML) == 0) { ssiMenu_Head(); } else { /* Not recognized - oh dear */ sendString("

    ERROR: Unrecognized SSI request, '"); sendString(ssiURIstart); sendString("'"); if(ssiPARMstart != NULL) { sendString(", with parm '"); sendString(ssiPARMstart); sendString("'"); } sendString("

    \n"); myGlobals.numBadSSIRequests++; return; } sendString("\n\n\n"); myGlobals.numHandledSSIRequests++; } /* ************************* */ void sendFile(char* fileName, int doNotUnlink) { FILE *fd; char tmpStr[256]; int len, bufSize = (int)(sizeof(tmpStr)-1), totLen = 0; memset(&tmpStr, 0, sizeof(tmpStr)); if((fd = fopen(fileName, "rb")) != NULL) { for(;;) { len = fread(tmpStr, sizeof(char), bufSize, fd); if(len > 0) { sendStringLen(tmpStr, len); totLen += len; } if(len <= 0) break; } fclose(fd); } else traceEvent(CONST_TRACE_WARNING, "Unable to open file %s - graphic not sent", fileName); if (doNotUnlink == 0) { unlink(fileName); } } /* ************************* */ void _sendStringLen(char *theString, unsigned int len, int allowSSI) { int bytesSent, rc, retries = 0; char *ssiStart, *ssiEnd, temp; static unsigned int fileSerial = 0; if(myGlobals.newSock == FLAG_DUMMY_SOCKET) return; if((allowSSI == 1) && ((ssiStart = strstr(theString, "")) != NULL) { ssiEnd = &ssiEnd[strlen("-->")]; /* * If we've found an SSI, we need to process the thirds - * before, the SSI itself and after. Either end can be empty. * Plus the SSI might be incomplete... * * theString: ...... * ^ssiStart ^ssiEnd */ /* process before */ if(ssiStart != theString) { temp = ssiStart[0]; ssiStart[0] = '\0'; sendString(theString); ssiStart[0] = temp; } /* process SSI */ temp = ssiEnd[0]; ssiEnd[0] = '\0'; processSSI(ssiStart); ssiEnd[0] = temp; /* process after */ if(ssiEnd[0] != '\0') { sendString(ssiEnd); } } else { myGlobals.numBadSSIRequests++; traceEvent(CONST_TRACE_WARNING, "SSI: Ignored invalid (no close): '%s'", ssiStart); #ifdef HTTP_DEBUG sendString(""); sendString(ssiStart); #endif } /* SSI: test for --> */ /* We did SOMETHING with this SSI, so we're done with sendStringLen() */ return; } /* SSI: test for \n"); /* JQuery */ sendString("\n"); /* http://www.d3js.org */ sendString("\n"); sendString("\n"); /* www.jqplot.com */ sendString("\n"); sendString("\n"); sendString("\n"); sendString("\n"); sendString("\n"); sendString("\n"); sendString("\n"); /* Sankey */ sendString("\n"); // } else { sendString("\n"); sendString("\n"); sendString("\n"); sendString("\n"); sendString("\n"); /* JQuery */ sendString("\n"); /* JQuery UI */ sendString("\n"); // } sendString("\n"); } /* ************************* */ void printHTMLheader(char *title, char *htmlTitle, int headerFlags) { char buf[LEN_GENERAL_WORK_BUFFER], *theTitle; if(htmlTitle != NULL) theTitle = htmlTitle; else theTitle = title; sendString(" "); if(0) sendString((myGlobals.runningPref.w3c == TRUE) ? CONST_W3C_DOCTYPE_LINE "\n" : "\n"); /* FIX */ sendString("\n\n"); if(0) sendString((myGlobals.runningPref.w3c == TRUE) ? CONST_W3C_CHARTYPE_LINE "\n" : "\n"); /* FIX */ if(title != NULL) { sendString("\n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "%s\n", title); sendString(buf); } else if(myGlobals.runningPref.w3c == TRUE) sendString("ntop page\n"); if((headerFlags & BITFLAG_HTML_NO_REFRESH) == 0) { safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "\n", myGlobals.runningPref.refreshRate); sendString(buf); } sendString("\n"); sendString("\n"); /* sendString(""); */ sendJSLibraries(0); if((headerFlags & BITFLAG_HTML_NO_STYLESHEET) == 0) { sendString("\n"); } /* ******************************************************* */ ssiMenu_Head(); sendString(""); /* ******************************************************* */ if((headerFlags & BITFLAG_HTML_NO_BODY) == 0) { sendString("\n\n"); ssiMenu_Body(); if((theTitle != NULL) && ((headerFlags & BITFLAG_HTML_NO_HEADING) == 0)) printSectionTitle(theTitle); } } /* ************************* */ void printHTMLtrailer(void) { char buf[LEN_GENERAL_WORK_BUFFER], formatBuf[32]; int i, len, numRealDevices = 0; /* Add code for Ajax find */ sendString("" ); switch (myGlobals.ntopRunState) { case FLAG_NTOPSTATE_STOPCAP: sendString("\n
    \n
    " "Packet capture stopped" "
    "); break; case FLAG_NTOPSTATE_SHUTDOWN: case FLAG_NTOPSTATE_SHUTDOWNREQ: sendString("\n
    \n
    " "ntop shutting down" "
    "); break; case FLAG_NTOPSTATE_TERM: sendString("\n
    \n
    " "ntop stopped" "
    "); break; } sendString("\n
     
    "); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, " 
    Report created on %s ", ctime(&myGlobals.actTime)); sendString(buf); if(myGlobals.pcap_file_list == NULL) { safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "[ntop uptime: %s]\n", formatSeconds((unsigned long)(time(NULL)-myGlobals.initialSniffTime), formatBuf, sizeof(formatBuf))); } else { safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "[from file %s]\n", myGlobals.pcap_file_list->fileName); } sendString(buf); if(theHttpUser[0] != '\0') { safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "[HTTP user: %s]\n", theHttpUser); sendString(buf); } sendString("
    \n"); safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "Generated by ntop v.%s (%d bit)\n[%s]
    " "© 1998-2012 by Luca Deri, built: %s.
    \n", version, sizeof(long) == 8 ? 64 : 32, osName, buildDate); sendString(buf); sendString("\n"); if(myGlobals.checkVersionStatus != FLAG_CHECKVERSION_NOTCHECKED) { u_char useRed; switch(myGlobals.checkVersionStatus) { case FLAG_CHECKVERSION_OBSOLETE: case FLAG_CHECKVERSION_UNSUPPORTED: case FLAG_CHECKVERSION_NOTCURRENT: case FLAG_CHECKVERSION_OLDDEVELOPMENT: case FLAG_CHECKVERSION_DEVELOPMENT: case FLAG_CHECKVERSION_NEWDEVELOPMENT: useRed = 1; break; default: useRed = 0; break; } sendString("Version: "); if(useRed) sendString(""); sendString(reportNtopVersionCheck()); if(useRed) sendString(""); sendString("
    \n"); } if(myGlobals.pcap_file_list != NULL) { safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "Listening on [%s]\n", CONST_PCAP_NW_INTERFACE_FILE); } else { buf[0] = '\0'; for(i = len = numRealDevices=0; i0) ? "," : "Listening on [", myGlobals.device[i].humanFriendlyName); numRealDevices++; } } if((i == 0) || (numRealDevices == 0)) buf[0] = '\0'; else { safe_snprintf(__FILE__, __LINE__, &buf[len], LEN_GENERAL_WORK_BUFFER-len, "]\n"); } } len = strlen(buf); if ((myGlobals.runningPref.currentFilterExpression != NULL) && (*myGlobals.runningPref.currentFilterExpression != '\0')) { safe_snprintf(__FILE__, __LINE__, &buf[len], LEN_GENERAL_WORK_BUFFER-len, "with kernel (libpcap) filtering expression \"%s\"
    \n", myGlobals.runningPref.currentFilterExpression); } else { safe_snprintf(__FILE__, __LINE__, &buf[len], LEN_GENERAL_WORK_BUFFER-len, "for all packets (i.e. without a filtering expression)\n
    "); } sendString(buf); if(!myGlobals.runningPref.mergeInterfaces) { safe_snprintf(__FILE__, __LINE__, buf, LEN_GENERAL_WORK_BUFFER, "Web reports include only interface \"%s\"", myGlobals.device[myGlobals.actualReportDeviceId].humanFriendlyName); sendString(buf); } else { sendString("Web reports include all interfaces (merged)"); } sendString("
    \n\n\n"); } /* ******************************* */ void initAccessLog(void) { if(myGlobals.runningPref.accessLogFile) { #ifdef WIN32 _umask(0137); #else umask(0137); #endif myGlobals.accessLogFd = fopen(myGlobals.runningPref.accessLogFile, "a"); if(myGlobals.accessLogFd == NULL) { traceEvent(CONST_TRACE_ERROR, "Unable to create file %s. Access log is disabled.", myGlobals.runningPref.accessLogFile); } } } /* ************************* */ void termAccessLog(void) { if(myGlobals.accessLogFd != NULL) fclose(myGlobals.accessLogFd); } /* ******************************* */ static void logHTTPaccess(int rc, struct timeval *httpRequestedAt, u_int gzipBytesSent) { char theDate[48], myUser[64], buf[24]; struct timeval loggingAt; unsigned long msSpent; char theZone[6]; unsigned long gmtoffset; struct tm t; if(myGlobals.accessLogFd != NULL) { gettimeofday(&loggingAt, NULL); if(httpRequestedAt != NULL) msSpent = (unsigned long)(delta_time(&loggingAt, httpRequestedAt)/1000); else msSpent = 0; /* Use standard Apache format per http://httpd.apache.org/docs/logs.html */ localtime_r(&myGlobals.actTime, &t); strftime(theDate, sizeof(theDate), CONST_APACHELOG_TIMESPEC, &t); gmtoffset = (myGlobals.thisZone < 0) ? -myGlobals.thisZone : myGlobals.thisZone; safe_snprintf(__FILE__, __LINE__, theZone, sizeof(theZone), "%c%2.2ld%2.2ld", (myGlobals.thisZone < 0) ? '-' : '+', gmtoffset/3600, (gmtoffset/60)%60); if((theHttpUser == NULL) || (theHttpUser[0] == '\0')) strncpy(myUser, "-", 64); else { safe_snprintf(__FILE__, __LINE__, myUser, sizeof(myUser), " %s ", theHttpUser); } if(gzipBytesSent > 0) fprintf(myGlobals.accessLogFd, "%s %s - [%s %s] \"%s\" %d %u/%u - - %lu\n", _addrtostr(requestFrom, buf, sizeof(buf)), myUser, theDate, theZone, httpRequestedURL, rc, gzipBytesSent, httpBytesSent, msSpent); else fprintf(myGlobals.accessLogFd, "%s %s - [%s %s] \"%s\" %d %u - - %lu\n", _addrtostr(requestFrom, buf, sizeof(buf)), myUser, theDate, theZone, httpRequestedURL, rc, httpBytesSent, msSpent); fflush(myGlobals.accessLogFd); } } /* ************************* */ static void returnHTTPbadRequest(void) { myGlobals.numUnsuccessfulInvalidrequests[myGlobals.newSock > 0]++; returnHTTPspecialStatusCode(BITFLAG_HTTP_STATUS_400, NULL); } /* ************************* */ static void returnHTTPaccessDenied(void) { myGlobals.numUnsuccessfulDenied[myGlobals.newSock > 0]++; returnHTTPspecialStatusCode(BITFLAG_HTTP_STATUS_401 | BITFLAG_HTTP_NEED_AUTHENTICATION, NULL); } /* ************************* */ static void returnHTTPaccessForbidden(void) { myGlobals.numUnsuccessfulForbidden[myGlobals.newSock > 0]++; returnHTTPspecialStatusCode(BITFLAG_HTTP_STATUS_403, NULL); } /* ************************* */ void returnHTTPpageNotFound(char* additionalText) { myGlobals.numUnsuccessfulNotfound[myGlobals.newSock > 0]++; returnHTTPspecialStatusCode(BITFLAG_HTTP_STATUS_404, additionalText); } /* ************************* */ static void returnHTTPrequestTimedOut(void) { myGlobals.numUnsuccessfulTimeout[myGlobals.newSock > 0]++; returnHTTPspecialStatusCode(BITFLAG_HTTP_STATUS_408, NULL); } /* ************************* */ void returnHTTPnotImplemented(void) { myGlobals.numUnsuccessfulInvalidmethod[myGlobals.newSock > 0]++; returnHTTPspecialStatusCode(BITFLAG_HTTP_STATUS_501, NULL); } /* ************************* */ static void returnHTTPversionNotSupported(void) { myGlobals.numUnsuccessfulInvalidversion[myGlobals.newSock > 0]++; returnHTTPspecialStatusCode(BITFLAG_HTTP_STATUS_505, NULL); } /* ************************* */ void returnHTTPversionServerError(void) { returnHTTPspecialStatusCode(BITFLAG_HTTP_STATUS_500, NULL); } /* ************************* */ void returnHTTPpageBadCommunity(void) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, BITFLAG_HTTP_STATUS_200, 0); printHTMLheader("Bad Community", NULL, BITFLAG_HTML_NO_REFRESH | BITFLAG_HTML_NO_HEADING); sendString("

    Invalid Community

    " "Your security settings do not allow you to see the specified page" "

    "); } /* ************************* */ static void returnHTTPspecialStatusCode(int statusFlag, char *additionalText) { int statusIdx; char buf[LEN_GENERAL_WORK_BUFFER]; statusIdx = (statusFlag >> 8) & 0xff; if((statusIdx < 0) || (statusIdx > sizeof(HTTPstatus)/sizeof(HTTPstatus[0]))) { statusIdx = 0; statusFlag = 0; #ifdef URL_DEBUG traceEvent(CONST_TRACE_ERROR, "URL_DEBUG: INTERNAL: invalid HTTP status id (%d) set to zero.\n", statusIdx); #endif } sendHTTPHeader(FLAG_HTTP_TYPE_HTML, statusFlag, 0); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "Error %d", HTTPstatus[statusIdx].statusCode); printHTMLheader(buf, NULL, BITFLAG_HTML_NO_REFRESH | BITFLAG_HTML_NO_HEADING); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "

    Error %d

    \n%s\n", HTTPstatus[statusIdx].statusCode, HTTPstatus[statusIdx].longDescription); sendString(buf); if(strlen(httpRequestedURL) > 0) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "

    Received request:

    "%s"
    ", httpRequestedURL); sendString(buf); } if(additionalText != NULL) sendString(additionalText); logHTTPaccess(HTTPstatus[statusIdx].statusCode, NULL, 0); } /* *******************************/ void returnHTTPredirect(char* destination) { compressFile = acceptGzEncoding = 0; sendHTTPHeader(FLAG_HTTP_TYPE_HTML, BITFLAG_HTTP_STATUS_302 | BITFLAG_HTTP_NO_CACHE_CONTROL | BITFLAG_HTTP_MORE_FIELDS, 1); sendString("Location: /"); sendString(destination); sendString("\n\n"); } /* ************************* */ void sendHTTPHeader(int mimeType, int headerFlags, int useCompressionIfAvailable) { int statusIdx; char tmpStr[256], theDate[48]; time_t theTime = myGlobals.actTime - (time_t)myGlobals.thisZone; struct tm t; compressFile = 0; statusIdx = (headerFlags >> 8) & 0xff; if((statusIdx < 0) || (statusIdx > sizeof(HTTPstatus)/sizeof(HTTPstatus[0]))){ statusIdx = 0; #ifdef URL_DEBUG traceEvent(CONST_TRACE_ERROR, "URL_DEBUG: INTERNAL: invalid HTTP status id (%d) set to zero.", statusIdx); #endif } safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "HTTP/1.0 %d %s\r\n", HTTPstatus[statusIdx].statusCode, HTTPstatus[statusIdx].reasonPhrase); sendString(tmpStr); if( (myGlobals.runningPref.P3Pcp != NULL) || (myGlobals.runningPref.P3Puri != NULL) ) { sendString("P3P: "); if(myGlobals.runningPref.P3Pcp != NULL) { safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "cp=\"%s\"%s", myGlobals.runningPref.P3Pcp, myGlobals.runningPref.P3Puri != NULL ? ", " : ""); sendString(tmpStr); } if(myGlobals.runningPref.P3Puri != NULL) { safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "policyref=\"%s\"", myGlobals.runningPref.P3Puri); sendString(tmpStr); } sendString("\r\n"); } /* Use en standard for this per RFC */ localtime_r(&theTime, &t); strftime(theDate, sizeof(theDate)-1, CONST_RFC1945_TIMESPEC, &t); theDate[sizeof(theDate)-1] = '\0'; safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "Date: %s\r\n", theDate); sendString(tmpStr); if(headerFlags & BITFLAG_HTTP_IS_CACHEABLE) { sendString("Cache-Control: max-age=3600, must-revalidate, public\r\n"); theTime += 3600; strftime(theDate, sizeof(theDate)-1, CONST_RFC1945_TIMESPEC, &t); theDate[sizeof(theDate)-1] = '\0'; safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "Expires: %s\r\n", theDate); sendString(tmpStr); } else if((headerFlags & BITFLAG_HTTP_NO_CACHE_CONTROL) == 0) { sendString("Cache-Control: no-cache\r\n"); sendString("Expires: 0\r\n"); } if((headerFlags & BITFLAG_HTTP_KEEP_OPEN) == 0) { sendString("Connection: close\n"); } safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "Server: ntop/%s/%d-bit (%s)\r\n", version, sizeof(long) == 8 ? 64 : 32, osName); sendString(tmpStr); if(headerFlags & BITFLAG_HTTP_NEED_AUTHENTICATION) { sendString("WWW-Authenticate: Basic realm=\"ntop HTTP server\"\r\n"); } /* http://en.wikipedia.org/wiki/Internet_media_type */ switch(mimeType) { case FLAG_HTTP_TYPE_HTML: sendString("Content-Type: text/html\r\n"); break; case FLAG_HTTP_TYPE_GIF: sendString("Content-Type: image/gif\r\n"); break; case FLAG_HTTP_TYPE_JPEG: sendString("Content-Type: image/jpeg\r\n"); break; case FLAG_HTTP_TYPE_PNG: sendString("Content-Type: image/png\r\n"); break; case FLAG_HTTP_TYPE_CSS: sendString("Content-Type: text/css\r\n"); break; case FLAG_HTTP_TYPE_TEXT: sendString("Content-Type: text/plain\r\n"); break; case FLAG_HTTP_TYPE_ICO: sendString("Content-Type: application/octet-stream\r\n"); break; case FLAG_HTTP_TYPE_JSON: sendString("Content-Type: application/json\r\n"); break; case FLAG_HTTP_TYPE_JS: sendString("Content-Type: application/javascript\r\n"); break; case FLAG_HTTP_TYPE_XML: sendString("Content-Type: text/xml\r\n"); break; case FLAG_HTTP_TYPE_P3P: sendString("Content-Type: text/xml\r\n"); break; case FLAG_HTTP_TYPE_SVG: sendString("Content-Type: image/svg+xml\r\n"); break; case FLAG_HTTP_TYPE_PDF: sendString("Content-Type: application/pdf\r\n"); break; case FLAG_HTTP_TYPE_NONE: break; #ifdef URL_DEBUG default: traceEvent(CONST_TRACE_ERROR, "URL_DEBUG: INTERNAL: invalid MIME type code requested (%d)\n", mimeType); #endif } if((mimeType == MIME_TYPE_CHART_FORMAT) || (mimeType == FLAG_HTTP_TYPE_JSON) || (mimeType == FLAG_HTTP_TYPE_TEXT) || (mimeType == FLAG_HTTP_TYPE_PDF) /* FIX */) { compressFile = 0; if(myGlobals.newSock < 0 /* SSL */) acceptGzEncoding = 0; } else { if(useCompressionIfAvailable && acceptGzEncoding) compressFile = 1; } #if 1 if((headerFlags & BITFLAG_HTTP_MORE_FIELDS) == 0) { sendString("\r\n"); } #endif } /* ************************* */ static int checkURLsecurity(char *url) { int len, i, begin; char *token; char *workURL; #ifdef URL_DEBUG #endif #if 0 traceEvent(CONST_TRACE_INFO, "URL_DEBUG: RAW url is '%s'", url); #endif /* Courtesy of "Burton M. Strauss III" This is a fix against Unicode exploits. Let's be really smart about this - instead of defending against hostile requests we don't yet know about, let's make sure it we only serve up the very limited set of pages we're interested in serving up... http://server[:port]/url Our urls end in .htm(l), .css, .jpg, .gif or .png We don't want to serve requests that attempt to hide or obscure our server. Yes, we MIGHT somehow reject a marginally legal request, but tough! Any character that shouldn't be in a CLEAR request, causes us to bounce the request... For example, //, .. and /. -- directory transversal \r, \n -- used to hide stuff in logs :, @ -- used to obscure logins, etc. unicode exploits -- used to hide the above */ /* No URL? That is our default action... */ if((url == NULL) || (url[0] == '\0')) return(0); if(strlen(url) >= MAX_LEN_URL) { traceEvent(CONST_TRACE_NOISY, "URL security(2): URL too long (len=%d)", (int)strlen(url)); return(2); } if(strstr(url, "%") != NULL) { /* Convert encoding (%nn) to their base characters - * we also handle the special case of %3A (:) * which we convert to _ (not :) * See urlFixupFromRFC1945Inplace() and urlFixupToRFC1945Inplace() * We handle this 1st because some of the gcc functions interpret encoding/unicode "for" us */ for(i=0, begin=0; i 0) { traceEvent(CONST_TRACE_NOISY, "URL security(2): Found // in URL...rejecting request"); return(2); } /* a double &? */ if(strstr(url, "&&") > 0) { traceEvent(CONST_TRACE_NOISY, "URL security(2): Found && in URL...rejecting request"); return(2); } /* a double ?? */ if(strstr(url, "??") > 0) { traceEvent(CONST_TRACE_NOISY, "URL security(2): Found ?? in URL...rejecting request"); return(2); } /* a double dot? */ if(strstr(url, "..") > 0) { traceEvent(CONST_TRACE_NOISY, "URL security(3): Found .. in URL...rejecting request"); return(3); } /* Past the bad stuff -- check the URI (not the parameters) for prohibited characters */ workURL = strdup(url); token = strchr(workURL, '?'); if(token != NULL) { token[0] = '\0'; } #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: uri is '%s'", workURL); #endif /* Prohibited characters? */ if((len = strcspn(workURL, CONST_URL_PROHIBITED_CHARACTERS)) < strlen(workURL)) { /* Before complaining we need to check if this is a host name */ char hostname[48]; int l, found = 0; HostTraffic *el; safe_snprintf(__FILE__, __LINE__, hostname, sizeof(hostname), "%s", &workURL[1]); l = strlen(hostname); if(l > 5) l -= 5; hostname[l] = '\0'; for(el=getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { #if 0 traceEvent(CONST_TRACE_WARNING, "[%s][%s][%s]", el->ethAddressString, el->hostNumIpAddress, el->hostResolvedName); #endif if((el != myGlobals.broadcastEntry) && (strstr(el->hostResolvedName, hostname))) { found = 1; break; } } /* for */ if(!found) { char c = workURL[len]; if(workURL[len] != ' ') traceEvent(CONST_TRACE_NOISY, "URL security(4): Prohibited character(s) at %d [%c] in URL... rejecting request [%s]", len, workURL[len], workURL); free(workURL); return((c == ' ') ? -4 : 4); } } /* So far, so go - check the extension */ /* BMS - allow cvs2html/diff/diff... */ if (strncmp(url, "cvs2html/diff/diff", strlen("cvs2html/diff/diff")) == 0) { free(workURL); return(0); } /* allow w3c/p3p.xml... * NOTE that we don't allow general .p3p and .xml requests * Those are bounced below... */ if(strncasecmp(workURL, CONST_W3C_P3P_XML, strlen(CONST_W3C_P3P_XML)) == 0) { free(workURL); return(0); } if(strncasecmp(workURL, CONST_NTOP_P3P, strlen(CONST_NTOP_P3P)) == 0) { free(workURL); return(0); } #ifdef MAKE_WITH_XMLDUMP /* Special cases for plugins/xmldump/xxxx.xml... */ if((strncasecmp(workURL, "/" CONST_PLUGINS_HEADER CONST_XMLDUMP_PLUGIN_NAME, strlen("/" CONST_PLUGINS_HEADER CONST_XMLDUMP_PLUGIN_NAME)) == 0) || (strncasecmp(workURL, "/" CONST_XML_DTD_NAME, strlen("/" CONST_XML_DTD_NAME)) == 0)) { free(workURL); return(0); } #endif /* Find the terminal . for checking the extension */ for(i=strlen(workURL)-1; i >= 0; i--) if(workURL[i] == '.') break; i++; if((i > 0) && (!((strcasecmp(&workURL[i], "htm") == 0) || (strcasecmp(&workURL[i], "html") == 0) || (strcasecmp(&workURL[i], "txt") == 0) || (strcasecmp(&workURL[i], "jpg") == 0) || (strcasecmp(&workURL[i], "png") == 0) || (strcasecmp(&workURL[i], "svg") == 0) || (strcasecmp(&workURL[i], "gif") == 0) || (strcasecmp(&workURL[i], "ico") == 0) || (strcasecmp(&workURL[i], "js") == 0) || /* Javascript */ (strcasecmp(&workURL[i], "json") == 0) || (strcasecmp(&workURL[i], "pdf") == 0) || (strcasecmp(&workURL[i], "lua") == 0) || /* used for Lua binding */ (strcasecmp(&workURL[i], "py") == 0) || /* used for Python binding */ (strcasecmp(&workURL[i], "bytecode") == 0) || /* used for Lua bytecode binding */ (strcasecmp(&workURL[i], "css") == 0)))) { traceEvent(CONST_TRACE_NOISY, "URL security(5): Found bad file extension (.%s) in URL...\n", &workURL[i]); free(workURL); return(5); } free(workURL); return(0); } /* ************************* */ #if defined(HAVE_ALARM) && defined(PARM_FORK_CHILD_PROCESS) && (!defined(WIN32)) static RETSIGTYPE quitNow(int signo _UNUSED_) { /* Don't use traceEvent below as it can be blocked as the call to this function is triggered by an alarm */ printf("ERROR: http generation failed, alarm() tripped. Please report this to ntop-dev list!"); /* returnHTTPrequestTimedOut(); */ exit(0); } #endif /* ************************* */ #ifdef MAKE_WITH_HTTPSIGTRAP RETSIGTYPE httpcleanup(int signo) { static int msgSent = 0; int i; void *array[20]; size_t size; char **strings; if(msgSent<10) { traceEvent(CONST_TRACE_ERROR, "http: caught signal %d %s", signo, signo == SIGHUP ? "SIGHUP" : signo == SIGINT ? "SIGINT" : signo == SIGQUIT ? "SIGQUIT" : signo == SIGILL ? "SIGILL" : signo == SIGABRT ? "SIGABRT" : signo == SIGFPE ? "SIGFPE" : signo == SIGKILL ? "SIGKILL" : signo == SIGSEGV ? "SIGSEGV" : signo == SIGPIPE ? "SIGPIPE" : signo == SIGALRM ? "SIGALRM" : signo == SIGTERM ? "SIGTERM" : signo == SIGUSR1 ? "SIGUSR1" : signo == SIGUSR2 ? "SIGUSR2" : signo == SIGCHLD ? "SIGCHLD" : #ifdef SIGCONT signo == SIGCONT ? "SIGCONT" : #endif #ifdef SIGSTOP signo == SIGSTOP ? "SIGSTOP" : #endif #ifdef SIGBUS signo == SIGBUS ? "SIGBUS" : #endif #ifdef SIGSYS signo == SIGSYS ? "SIGSYS" #endif : "other"); msgSent++; } } #endif /* MAKE_WITH_HTTPSIGTRAP */ /* ****************************************** * This block of code generates internal * * copies of the major navigational pages * * which are normally in the html/ * * directory, in case that directory is * * damaged. * * * * There are also a few real pages * * in here. * * * * Return 0 if you generated the page * * 1 if not * * * **************************************** */ static int generateNewInternalPages(char* pageName) { /* Note we do not have CONST_INDEX_HTML nor CONST_LEFTMENU_HTML here. * * They are special cased with CONST_TRAFFIC_STATS_HTML, below, so old-style * URLs probably still work... * *TODO: This stuff is just to warn the user ... and both chunks should probably be * removed around 3.4... */ if((strcasecmp(pageName, CONST_INDEX_INNER_HTML) == 0) || (strcasecmp(pageName, CONST_LEFTMENU_HTML) == 0) || (strcasecmp(pageName, CONST_LEFTMENU_NOJS_HTML) == 0) || (strcasecmp(pageName, CONST_HOME_UNDERSCORE_HTML) == 0)) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); sendString("\n"); printHTMLheader("Welcome to ntop!", NULL, BITFLAG_HTML_NO_REFRESH); sendString("

    Problem

    \n" "

    The page you have requested (either explicitly or implicitly),

    \n
    ");
    
        sendString(pageName);
        sendString("
    \n

    Is one which used to be part of ntop, but is no longer available.

    \n" "

    The framesets used in versions 3.1 and earlier have been removed. " "Please update your bookmarks or contact your system's administrator for help.

    \n"); return(0); } if(strcasecmp(pageName, CONST_ABTNTOP_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); sendString("\n"); printHTMLheader("Welcome to ntop!", NULL, BITFLAG_HTML_NO_REFRESH); sendString("\n
    \n"); sendString("ntop shows the current network usage. It displays a list of hosts that are\n"); sendString("currently using the network and reports information concerning the IP\n"); sendString("(Internet Protocol) and Fibre Channel (FC) traffic generated by each host. The traffic is \n"); sendString("sorted according to host and protocol. Protocols (user configurable) include:\n"); sendString("
    • TCP/UDP/ICMP
    • (R)ARP
    • DLC
    • " "IPsec
    • Netbios
    • TCP/UDP
      • FTP
      • " "HTTP
      • DNS
      • Telnet
      • SMTP/POP/IMAP
      • SNMP
      • \n"); sendString("NFS
      • X11
      \n

      \n"); sendString("

    • Fibre Channel
      • Control Traffic - SW2,GS3,ELS
      • SCSI

    \n"); sendString("

    ntop's author strongly believes in \n"); sendString("open source software and encourages everyone to modify, improve\n "); sendString("and extend ntop in the interest of the whole Internet community according\n"); sendString("to the enclosed licence (see COPYING).

    Problems, bugs, questions, "); sendString("desirable enhancements, source code contributions, etc., should be sent to the "); sendString(CONST_MAILTO_LIST ".

    \n"); sendString("

    For information on ntop and information privacy, see "); sendString("this page.

    \n
    "); return 0; } return 1; /* Not in this bunch, boss */ } /* **************************************** */ int isAllowedCommunity(char *community_name) { int i; //traceEvent(CONST_TRACE_INFO, "-> isAllowedCommunity(%s)", community_name); if((theHttpUser[0] == '\0') /* No authentication */ || (!strcmp(theHttpUser, "admin"))) /* Admin user */ return(1); for(i=0; i isAllowedCommunity(%s): %s", community_name, listAllowedCommunities[i]); if(strcmp(listAllowedCommunities[i], community_name) == 0) return(1); } // traceEvent(CONST_TRACE_INFO, "-> isAllowedCommunity(%s): NOT ALLOWED", community_name); return(0); } /* **************************************** */ static int returnHTTPPage(char* pageName, int postLen, HostAddr *from, struct timeval *httpRequestedAt, int *usedFork, char *agent, char *referer, char *requestedLanguage[], int numLang, char *ifModificedSince, int isPostMethod) { char *questionMark, *pageURI, *token; int sortedColumn = 0, printTrailer=1, idx, networkMode = 0 /* DOMAIN_VIEW */; int errorCode = 0, pageNum = 0, found = 0, portNr = 0, mode = 0; struct stat statbuf; FILE *fd = NULL; char tmpStr[512], *domainNameParm = NULL, *communityNameParm = NULL, *host = NULL; char *db_key = NULL, *db_val = NULL; int revertOrder=0, vlanId=NO_VLAN, ifId=NO_INTERFACE, subnetId = ALL_SUBNET_IDS, showL2Only = 0; struct tm t; HostsDisplayPolicy showHostsMode = myGlobals.hostsDisplayPolicy; LocalityDisplayPolicy showLocalityMode = myGlobals.localityDisplayPolicy; int showPrefPage = showPrefBasicPref; int i, showBytes = 1; *usedFork = 0; #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Page: '%s'", pageName); #endif questionMark = strchr(pageName, '?'); if((questionMark != NULL) && (questionMark[0] == '?')) { char requestedURL[MAX_LEN_URL]; char *tkn; /* Safe strcpy as requestedURL < MAX_LEN_URL (checked by checkURLsecurity) */ strcpy(requestedURL, &questionMark[1]); tkn = strtok(requestedURL, "&"); while(tkn != NULL) { if(strncmp(tkn, "col=", 4) == 0) { idx = atoi(&tkn[4]); if(tkn[4] == '-') revertOrder=1; sortedColumn = abs(idx); } else if(strncmp(tkn, "host=", 5) == 0) { host = strdup(&tkn[5]); } else if(strncmp(tkn, "dom=", 4) == 0) { domainNameParm = strdup(&tkn[4]); } else if(strncmp(tkn, "community=", 10) == 0) { communityNameParm = strdup(&tkn[10]); } else if(strncmp(tkn, "netmode=", 8) == 0) { networkMode = atoi(&tkn[8]); } else if(strncmp(tkn, "key=", 4) == 0) { db_key = strdup(&tkn[4]); } else if(strncmp(tkn, "val=", 4) == 0) { u_int val = 0; if(db_val != NULL) { if(db_key && (!strcmp(db_key, EVENTS_MASK))) val = atoi(db_val); free(db_val); } if(db_key && (!strcmp(db_key, EVENTS_MASK))) { char str_val[16]; val = val | atoi(&tkn[4]); safe_snprintf(__FILE__, __LINE__, str_val, sizeof(str_val), "%d", val); db_val = strdup(str_val); } else db_val = strdup(&tkn[4]); } else if(strncmp(tkn, "port=", 5) == 0) { portNr = atoi(&tkn[5]); } else if(strncmp(tkn, "unit=", 5) == 0) { showBytes = atoi(&tkn[5]); } else if(strncmp(tkn, "vlan=", 5) == 0) { vlanId = atoi(&tkn[5]); } else if(strncmp(tkn, "subnet=", 7) == 0) { subnetId = atoi(&tkn[7]); } else if(strncmp(tkn, "l2Only=", 7) == 0) { showL2Only = atoi(&tkn[7]); } else if(strncmp(tkn, "if=", 3) == 0) { ifId = atoi(&tkn[3]); } else if(strncmp(tkn, "mode=", 5) == 0) { mode = atoi(&tkn[5]); } else if(strncmp(tkn, "showH=", 6) == 0) { showHostsMode = atoi(&tkn[6]); if((showHostsMode < showAllHosts) || (showHostsMode > showOnlyRemoteHosts)) showHostsMode = showAllHosts; } else if(strncmp(tkn, "showL=", 6) == 0) { showLocalityMode = atoi(&tkn[6]); if((showLocalityMode < showSentReceived) || (showLocalityMode > showOnlyReceived)) showHostsMode = showAllHosts; } else if(strncmp(tkn, "showD=", 6) == 0) { /* This is the configure NTOP preferences Page */ showPrefPage = atoi(&tkn[6]); } else if(strncmp(tkn, "page=", 5) == 0) { pageNum = atoi(&tkn[5]); if(pageNum < 0) pageNum = 0; } else { /* legacy code: we assume this is a 'unfixed' col= */ idx = atoi(tkn); if(idx < 0) revertOrder=1; sortedColumn = abs(idx); } tkn = strtok(NULL, "&"); } } /* Keep the myGlobals, local and prefsDB copies in sync */ if(myGlobals.hostsDisplayPolicy != showHostsMode) { char tmp[8]; myGlobals.hostsDisplayPolicy = showHostsMode; if((myGlobals.hostsDisplayPolicy < showAllHosts) || (myGlobals.hostsDisplayPolicy > showOnlyRemoteHosts)) myGlobals.hostsDisplayPolicy = showAllHosts; safe_snprintf(__FILE__, __LINE__, tmp, sizeof(tmp), "%d", myGlobals.hostsDisplayPolicy); storePrefsValue("globals.displayPolicy", tmp); } if(myGlobals.localityDisplayPolicy != showLocalityMode) { char tmp[8]; myGlobals.localityDisplayPolicy = showLocalityMode; if((myGlobals.localityDisplayPolicy < showSentReceived) || (myGlobals.localityDisplayPolicy > showOnlyReceived)) myGlobals.localityDisplayPolicy = showSentReceived; safe_snprintf(__FILE__, __LINE__, tmp, sizeof(tmp), "%d", myGlobals.localityDisplayPolicy); storePrefsValue("globals.displayPolicy", tmp); } if(pageName[0] == '\0') { /* Default ntop entry page */ strncpy(pageName, CONST_TRAFFIC_STATS_HTML, sizeof(CONST_TRAFFIC_STATS_HTML)); /* strncpy(pageName, CONST_HOST_MAP, sizeof(CONST_HOST_MAP)); */ } /* Generic w3c p3p request? force it to ours... */ if(strncmp(pageName, CONST_W3C_P3P_XML, strlen(CONST_W3C_P3P_XML)) == 0) strncpy(pageName, CONST_NTOP_P3P, sizeof(CONST_NTOP_P3P)); /* * Search for an .html file (ahead of the internally generated text) * * We execute the following tests for the file * 0..n. look for a - version based on the Accept-Language: value(s) from the user * n+1. look for a - version based on the host's default setlocale() value * n+2. look for a default english version (no - tag) * * For each directory in the list. * * Note that pageURI is a duplicate of pageName, but drops any parameters... */ pageURI = strdup(pageName); token = strchr(pageURI, '?'); if(token != NULL) token[0] = '\0'; if(strcmp(pageURI, CONST_NETWORK_IMAGE_MAP) == 0) { safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "%s/%s", myGlobals.spoolPath, pageURI); if(stat(tmpStr, &statbuf) != 0) { sendString("

    ERROR: Can not locate image map file, request ignored

    \n"); traceEvent(CONST_TRACE_ERROR, "Can not locate image map file '%s', ignored...", tmpStr); free(pageURI); if(host != NULL) free(host); if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); return(0); } if((fd = fopen(tmpStr, "rb")) == NULL) { sendString("

    ERROR: Can not open image map file, request ignored

    \n"); traceEvent(CONST_TRACE_ERROR, "Can not open image map file '%s', ignored...", tmpStr); free(pageURI); if(host != NULL) free(host); if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); return(0); } } else { for(idx=0; (!found) && (myGlobals.dataFileDirs[idx] != NULL); idx++) { safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "%s/html/%s", myGlobals.dataFileDirs[idx], pageURI); revertSlashIfWIN32(tmpStr, 0); #if defined(HTTP_DEBUG) || defined(URL_DEBUG) traceEvent(CONST_TRACE_INFO, "HTTP/URL_DEBUG: Testing for page %s at %s", pageURI, tmpStr); #endif if(stat(tmpStr, &statbuf) == 0) { if(ifModificedSince[0] != '\0') { struct tm modified; if(strptime(ifModificedSince, CONST_RFC1945_TIMESPEC, &modified) != NULL) { struct tm *_tm = localtime(&statbuf.st_mtime); time_t t_modified, t_if_modified_since; t_modified = mktime(_tm)-(time_t)myGlobals.thisZone; t_if_modified_since = mktime(&modified); if(t_modified > t_if_modified_since) { /* The file has been modified */ } else { char theDate[48]; time_t theTime = myGlobals.actTime - (time_t)myGlobals.thisZone; sendString("HTTP/1.1 304 Not Modified\r\n"); strftime(theDate, sizeof(theDate)-1, CONST_RFC1945_TIMESPEC, localtime_r(&theTime, &t)); theDate[sizeof(theDate)-1] = '\0'; safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "Date: %s\r\n", theDate); sendString(tmpStr); sendString("Connection: close\r\n"); free(pageURI); return(0); } } } if((fd = fopen(tmpStr, "rb")) != NULL) { found = 1; /* traceEvent(CONST_TRACE_ERROR, "--> %s", tmpStr); */ break; } traceEvent(CONST_TRACE_ERROR, "Cannot open file '%s', ignored...", tmpStr); } else { if(0) traceEvent(CONST_TRACE_INFO, "File %s not found on disk [%s][%d]", tmpStr, myGlobals.dataFileDirs[idx], idx); } } } #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: tmpStr=%s - fd=0x%x", tmpStr, fd); #endif if(fd != NULL) { char theDate[48], *buffer; time_t theTime; int sz, len = strlen(pageURI), mimeType = FLAG_HTTP_TYPE_HTML; if(len > 4) { if(strcasecmp(&pageURI[len-4], ".gif") == 0) mimeType = FLAG_HTTP_TYPE_GIF; else if(strcasecmp(&pageURI[len-4], ".jpg") == 0) mimeType = FLAG_HTTP_TYPE_JPEG; else if(strcasecmp(&pageURI[len-4], ".png") == 0) mimeType = FLAG_HTTP_TYPE_PNG; else if(strcasecmp(&pageURI[len-4], ".css") == 0) mimeType = FLAG_HTTP_TYPE_CSS; else if(strcasecmp(&pageURI[len-4], ".ico") == 0) mimeType = FLAG_HTTP_TYPE_ICO; else if(strcasecmp(&pageURI[len-5], ".json") == 0) mimeType = FLAG_HTTP_TYPE_JSON; else if(strcasecmp(&pageURI[len-4], ".pdf") == 0) mimeType = FLAG_HTTP_TYPE_PDF; else if(strcasecmp(&pageURI[len-3], ".js") == 0) mimeType = FLAG_HTTP_TYPE_JS; else if(strcasecmp(&pageURI[len-4], ".xml") == 0) /* w3c/p3p.xml */ mimeType = FLAG_HTTP_TYPE_XML; else if(strcasecmp(&pageURI[len-4], ".svg") == 0) mimeType = FLAG_HTTP_TYPE_SVG; } sendHTTPHeader(mimeType, BITFLAG_HTTP_IS_CACHEABLE | BITFLAG_HTTP_MORE_FIELDS, 1); compressFile = 0; /* Don't move this */ if(myGlobals.actTime > statbuf.st_mtime) { /* just in case the system clock is wrong... */ theTime = statbuf.st_mtime - myGlobals.thisZone; /* Use en standard for this per RFC */ strftime(theDate, sizeof(theDate)-1, CONST_RFC1945_TIMESPEC, localtime_r(&theTime, &t)); theDate[sizeof(theDate)-1] = '\0'; safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "Last-Modified: %s\r\n", theDate); sendString(tmpStr); } //traceEvent(CONST_TRACE_INFO, "++++++++++= '%s'", &pageURI[len-5]); if((strlen(pageURI) > 5) && strcasecmp(&pageURI[len-5], ".html")) { /* We should not send information about page length as in case of SSI (embedded into .html pages), the page will be actually longer than the file size and the browse will close the connection before we sent the whole page */ sendString("Accept-Ranges: bytes\n"); fseek(fd, 0, SEEK_END); safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "Content-Length: %d\r\n", (len = ftell(fd))); fseek(fd, 0, SEEK_SET); sendString(tmpStr); } sendString("\r\n"); /* mark the end of HTTP header */ /* We are copying a file. Let's use a big (but not absurd) buffer. */ sz = max(4096, min(16384, statbuf.st_size+8)); buffer = (char*)malloc(sz); memset(buffer, 0, sz); for(;;) { len = fread(buffer, sizeof(char), sz-1, fd); if(len <= 0) break; sendStringLen(buffer, len); } free(buffer); fclose(fd); /* closeNwSocket(&myGlobals.newSock); */ free(pageURI); if(host != NULL) free(host); if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); return(0); } /* **************** */ /* Revert to the full requested pageName, as these strncasecmp strcasecmp check the fronts only */ free(pageURI); if(strncasecmp(pageName, CONST_PLUGINS_HEADER, strlen(CONST_PLUGINS_HEADER)) == 0) { if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); if(handlePluginHTTPRequest(&pageName[strlen(CONST_PLUGINS_HEADER)])) { return(0); } else { return(FLAG_HTTP_INVALID_PAGE); } } if(strncasecmp(pageName, CONST_CONFIG_NTOP_HTML, strlen(CONST_CONFIG_NTOP_HTML)) == 0) { handleNtopConfig (pageName, showPrefPage, isPostMethod ? postLen : 0); if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); return(0); } /* Putting this here (and not on top of this function) helps because at least a partial respose has been sent back to the user in the meantime */ if(strncasecmp(pageName, CONST_SHUTDOWN_NTOP_HTML, strlen(CONST_SHUTDOWN_NTOP_HTML)) == 0) { shutdownNtop(); } else if(strncasecmp(pageName, CONST_SHUTDOWNNOW_NTOP_IMG, strlen(CONST_SHUTDOWNNOW_NTOP_IMG)) == 0) { /* Do nothing ... handled later */ printTrailer=0; } else if(strncasecmp(pageName, CONST_CHANGE_FILTER_HTML, strlen(CONST_CHANGE_FILTER_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); changeFilter(); } else if(strncasecmp(pageName, CONST_DO_CHANGE_FILTER, strlen(CONST_DO_CHANGE_FILTER)) == 0) { printTrailer=0; if(doChangeFilter(postLen)==0) /* resetStats() */; } else if(strncasecmp(pageName, CONST_FILTER_INFO_HTML, strlen(CONST_FILTER_INFO_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHTMLheader(NULL, NULL, BITFLAG_HTML_NO_REFRESH); /* printHTMLtrailer is called afterwards and inserts the relevant info */ } else if(strncasecmp(pageName, CONST_RESET_STATS_HTML, strlen(CONST_RESET_STATS_HTML)) == 0) { /* Courtesy of Daniel Savard */ sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHTMLheader("Statistics reset requested...", NULL, BITFLAG_HTML_NO_REFRESH); myGlobals.resetHashNow = 1; /* resetStats(); */ sendString("

    NOTE: Statistics will be reset at the next safe point, which " "is at the end of processing for the current/next packet and " "may have already occured.
    \n" "Reset takes a few seconds - please do not immediately request " "the next page from the ntop web server or it will appear to hang.

    \n"); } else if(strncasecmp(pageName, CONST_SWITCH_NIC_HTML, strlen(CONST_SWITCH_NIC_HTML)) == 0) { char *equal = strchr(pageName, '='); sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if(equal == NULL) switchNwInterface(0); else switchNwInterface(atoi(&equal[1])); } else if(strcasecmp(pageName, CONST_DO_ADD_USER) == 0) { printTrailer=0; doAddUser(postLen /* \r\n */); theLastHttpUser[0] = '\0'; } else if(strncasecmp(pageName, CONST_DELETE_USER, strlen(CONST_DELETE_USER)) == 0) { printTrailer=0; if((questionMark == NULL) || (questionMark[0] == '\0')) deleteUser(NULL); else deleteUser(&questionMark[1]); } else if(strncasecmp(pageName, CONST_MODIFY_URL, strlen(CONST_MODIFY_URL)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if((questionMark == NULL) || (questionMark[0] == '\0')) { addURL(NULL); } else addURL(&questionMark[1]); } else if(strncasecmp(pageName, CONST_DELETE_URL, strlen(CONST_DELETE_URL)) == 0) { printTrailer=0; if((questionMark == NULL) || (questionMark[0] == '\0')) deleteURL(NULL); else deleteURL(&questionMark[1]); } else if(strcasecmp(pageName, CONST_DO_ADD_URL) == 0) { printTrailer=0; doAddURL(postLen /* \r\n */); } else if(strncasecmp(pageName, CONST_SHOW_PLUGINS_HTML, strlen(CONST_SHOW_PLUGINS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if(questionMark == NULL) showPluginsList(""); else showPluginsList(&pageName[strlen(CONST_SHOW_PLUGINS_HTML)+1]); } else if(strcasecmp(pageName, CONST_SHOW_USERS_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); showUsers(); } else if(strcasecmp(pageName, CONST_ADD_USERS_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); addUser(NULL); theLastHttpUser[0] = '\0'; } else if(strncasecmp(pageName, CONST_MODIFY_USERS, strlen(CONST_MODIFY_USERS)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if((questionMark == NULL) || (questionMark[0] == '\0')) addUser(NULL); else addUser(&questionMark[1]); theLastHttpUser[0] = '\0'; } else if(strcasecmp(pageName, CONST_SHOW_URLS_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); showURLs(); } else if(strcasecmp(pageName, CONST_ADD_URLS_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); addURL(NULL); /* Temporary here - begin Due to some strange problems, graph generation has some problems when several charts are generated concurrently. This NEEDS to be fixed. */ } else if(strcasecmp(pageName, CONST_FAVICON_ICO) == 0) { /* Burton Strauss (BStrauss@acm.org) - April 2002 favicon.ico and we don't have the file (or it would have been handled above) so punt! */ #ifdef LOG_URLS traceEvent(CONST_TRACE_INFO, "Note: favicon.ico request, returned 404."); #endif returnHTTPpageNotFound(NULL); printTrailer=0; } else if(strncasecmp(pageName, CONST_SHOW_MUTEX_HTML, strlen(CONST_SHOW_MUTEX_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printTrailer=0; printMutexStatusReport(0); } else if(strncasecmp(pageName, CONST_FIND_HOST_JSON, strlen(CONST_FIND_HOST_JSON)) == 0) { char buf[64]; sendHTTPHeader(FLAG_HTTP_TYPE_JSON, 0, 1); printTrailer = 0; unescape(buf, sizeof(buf), db_key); findHost(buf); } else if(strncasecmp(pageName, CONST_EDIT_PREFS, strlen(CONST_EDIT_PREFS)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); edit_prefs(postLen, db_key, db_val); db_key = db_val = NULL; /* Avoid double free */ printTrailer = 1; } else if(strncasecmp(pageName, CONST_PRIVACYCLEAR_HTML, strlen(CONST_PRIVACYCLEAR_HTML)) == 0) { storePrefsValue("globals.displayPrivacyNotice", "0"); traceEvent(CONST_TRACE_ALWAYSDISPLAY, "PRIVACY: Flag cleared, notice will display next run"); returnHTTPredirect(CONST_PRIVACYNOTICE_HTML); } else if(strncasecmp(pageName, CONST_PRIVACYFORCE_HTML, strlen(CONST_PRIVACYFORCE_HTML)) == 0) { storePrefsValue("globals.displayPrivacyNotice", "2"); traceEvent(CONST_TRACE_ALWAYSDISPLAY, "PRIVACY: Flag forced, notice will display each run"); returnHTTPredirect(CONST_PRIVACYNOTICE_HTML); } else if(strncasecmp(pageName, CONST_TRAFFIC_SUMMARY_HTML, strlen(CONST_TRAFFIC_SUMMARY_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); /* It needs to go here otherwise when we update the pcap dropped packets this value is updated only in the child process and not into the main one. */ printTrafficSummary(revertOrder); } else if ((strncasecmp(pageName, CONST_TRAFFIC_STATS_HTML, strlen(CONST_TRAFFIC_STATS_HTML)) == 0) || (strncasecmp(pageName, CONST_INDEX_HTML, strlen(CONST_INDEX_HTML)) == 0) || (strncasecmp(pageName, CONST_LEFTMENU_HTML, strlen(CONST_LEFTMENU_HTML)) == 0)) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if((myGlobals.ntopRunState < FLAG_NTOPSTATE_RUN) || ((myGlobals.numDevices == 1) && (!strcmp(myGlobals.device[0].name, "none")))) { printHTMLheader("Configure ntop", NULL, BITFLAG_HTML_NO_REFRESH); safe_snprintf (__FILE__, __LINE__, tmpStr, sizeof (tmpStr), "No interface has been configured. Please configure ntop first.", CONST_CONFIG_NTOP_HTML); printFlagedWarning (tmpStr); if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); return(0); } /* It needs to go here otherwise when we update the pcap dropped packets this value is updated only in the child process and not into the main one. */ printTrafficStatistics(revertOrder); } else { /* OK, we're doing basic reporting ... * (1) Are we really running? * (2) Fork (if we can) to create a read-only, stable copy * (3) Figure out which page the user wants and give it to him/her */ if (myGlobals.ntopRunState < FLAG_NTOPSTATE_RUN) { safe_snprintf (__FILE__, __LINE__, tmpStr, sizeof (tmpStr), "Configure Ntop first. No packet " "captures analyzed", CONST_CONFIG_NTOP_HTML); printFlagedWarning (tmpStr); if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); return(0); } #if defined(PARM_FORK_CHILD_PROCESS) && (!defined(WIN32)) if(!myGlobals.runningPref.debugMode) { handleDiedChild(0); #if !defined(WIN32) && defined(MAKE_WITH_SYSLOG) /* Child processes must log to syslog. * If no facility was set through -L | --use-syslog=facility * then force the default */ if(myGlobals.runningPref.useSyslog == FLAG_SYSLOG_NONE) { static char messageSent = 0; if(!messageSent) { messageSent = 1; traceEvent(CONST_TRACE_INFO, "NOTE: -L | --use-syslog=facility not specified, child processes will log to the default (%d).", DEFAULT_SYSLOG_FACILITY); } } #endif /* !defined(WIN32) && defined(MAKE_WITH_SYSLOG) */ /* The URLs below are "read-only" hence I can fork a copy of ntop */ if((myGlobals.childntoppid = fork()) < 0) traceEvent(CONST_TRACE_ERROR, "An error occurred while forking ntop [errno=%d]..", errno); else { *usedFork = 1; /* This is zero in the parent copy of the structure */ if(myGlobals.childntoppid) { /* father process */ myGlobals.numChildren++; compressFile = 0; if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); return(0); } else { detachFromTerminalUnderUnix(0); /* Close inherited sockets */ #ifdef HAVE_OPENSSL if(myGlobals.sslInitialized) { closeNwSocket(&myGlobals.sock_ssl); shutdown(myGlobals.sock_ssl, SHUT_RDWR); } #endif /* HAVE_OPENSSL */ if(myGlobals.runningPref.webPort > 0) { closeNwSocket(&myGlobals.sock); shutdown(myGlobals.sock, SHUT_RDWR); } #if defined(HAVE_ALARM) && defined(PARM_FORK_CHILD_PROCESS) && (!defined(WIN32)) signal(SIGALRM, quitNow); alarm(120); /* Don't freeze */ #endif } } } #endif if(strncasecmp(pageName, CONST_EMBEDDED_PYTHON_HEADER, strlen(CONST_EMBEDDED_PYTHON_HEADER)) == 0) { if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); printTrailer = 0; #ifdef HAVE_PYTHON if(handlePythonHTTPRequest(&pageName[strlen(CONST_EMBEDDED_PYTHON_HEADER)], isPostMethod ? postLen : 0)) { ; } else return(FLAG_HTTP_INVALID_PAGE); #else returnHTTPpageNotFound("Python support disabled into this ntop instance"); #endif } else if(generateNewInternalPages(pageName) == 0) { /* We did the work in the function except for this */ if(strcasecmp(pageName, CONST_HOME_HTML) != 0) printTrailer=0; } else if(strncasecmp(pageName, CONST_SORT_DATA_THPT_STATS_HTML, strlen(CONST_SORT_DATA_THPT_STATS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printThptStats(sortedColumn); } else if(strncasecmp(pageName, CONST_HOSTS_INFO_HTML, strlen(CONST_HOSTS_INFO_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHostsInfo(sortedColumn, revertOrder, pageNum, showBytes, vlanId, ifId, subnetId, showL2Only); } else if(strncasecmp(pageName, CONST_HOSTS_LOCAL_FINGERPRINT_HTML, strlen(CONST_HOSTS_LOCAL_FINGERPRINT_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHostsStats(FALSE); } else if(strncasecmp(pageName, CONST_HOSTS_REMOTE_FINGERPRINT_HTML, strlen(CONST_HOSTS_REMOTE_FINGERPRINT_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHostsStats(TRUE); } else if(strncasecmp(pageName, CONST_HOSTS_LOCAL_CHARACT_HTML, strlen(CONST_HOSTS_LOCAL_CHARACT_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHostsCharacterization(); } else if(strncasecmp(pageName, CONST_SORT_DATA_PROTOS_HTML, strlen(CONST_SORT_DATA_PROTOS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHostsTraffic(SORT_DATA_PROTOS, sortedColumn, revertOrder, pageNum, CONST_SORT_DATA_PROTOS_HTML, showHostsMode, showLocalityMode, vlanId); } else if(strncasecmp(pageName, CONST_SORT_DATA_IP_HTML, strlen(CONST_SORT_DATA_IP_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHostsTraffic(SORT_DATA_IP, sortedColumn, revertOrder, pageNum, CONST_SORT_DATA_IP_HTML, showHostsMode, showLocalityMode, vlanId); } else if(strncasecmp(pageName, CONST_IF_STATS_HTML, strlen(CONST_IF_STATS_HTML)) == 0) { compressFile = 0; sendHTTPHeader(FLAG_HTTP_TYPE_TEXT, 0, 1); printInterfaceStats(); printTrailer=0; } else if(strncasecmp(pageName, CONST_SORT_DATA_THPT_HTML, strlen(CONST_SORT_DATA_THPT_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if(sortedColumn == 0) { sortedColumn = FLAG_HOST_DUMMY_IDX; } printHostsTraffic(SORT_DATA_THPT, sortedColumn, revertOrder, pageNum, CONST_SORT_DATA_THPT_HTML, showHostsMode, showLocalityMode, vlanId); } else if(strncasecmp(pageName, CONST_SORT_DATA_HOST_TRAFFIC_HTML, strlen(CONST_SORT_DATA_HOST_TRAFFIC_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if(sortedColumn == 0) { sortedColumn = FLAG_HOST_DUMMY_IDX; } printHostsTraffic(SORT_DATA_HOST_TRAFFIC, sortedColumn, revertOrder, pageNum, CONST_SORT_DATA_HOST_TRAFFIC_HTML, showHostsMode, showLocalityMode, vlanId); } else if(strncasecmp(pageName, CONST_LAST_HOUR_TOP_TALKERS_HTML, strlen(CONST_LAST_HOUR_TOP_TALKERS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printTopTalkers(1, mode); if(mode == 1) printTrailer=0; } else if(strncasecmp(pageName, CONST_LAST_DAY_TOP_TALKERS_HTML, strlen(CONST_LAST_DAY_TOP_TALKERS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printTopTalkers(0, mode); if(mode == 1) printTrailer=0; } else if(strncasecmp(pageName, CONST_HISTORICAL_TALKERS_HTML, strlen(CONST_HISTORICAL_TALKERS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); /* TODO */ returnHTTPpageNotFound("This feature is not YET available on your platform: we're working for you"); } else if(strcasecmp(pageName, CONST_NET_FLOWS_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); listNetFlows(); } else if(strncasecmp(pageName, CONST_IP_R_2_L_HTML, strlen(CONST_IP_R_2_L_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if(sortedColumn == 0) { sortedColumn = 1; } printIpAccounting(FLAG_REMOTE_TO_LOCAL_ACCOUNTING, sortedColumn, revertOrder, pageNum); } else if(strncasecmp(pageName, CONST_IP_R_2_R_HTML, strlen(CONST_IP_R_2_R_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if(sortedColumn == 0) { sortedColumn = 1; } printIpAccounting(FLAG_REMOTE_TO_REMOTE_ACCOUNTING, sortedColumn, revertOrder, pageNum); } else if(strncasecmp(pageName, CONST_IP_L_2_R_HTML, strlen(CONST_IP_L_2_R_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if(sortedColumn == 0) { sortedColumn = 1; } printIpAccounting(FLAG_LOCAL_TO_REMOTE_ACCOUNTING, sortedColumn, revertOrder, pageNum); } else if(strncasecmp(pageName, CONST_IP_L_2_L_HTML, strlen(CONST_IP_L_2_L_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); if(sortedColumn == 0) { sortedColumn = 1; } printIpAccounting(FLAG_LOCAL_TO_LOCAL_ACCOUNTING, sortedColumn, revertOrder, pageNum); } else if(strncasecmp(pageName, CONST_ACTIVE_SESSIONS_HTML, strlen(CONST_ACTIVE_SESSIONS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printActiveSessions(myGlobals.actualReportDeviceId, pageNum, NULL); } else if(strncasecmp(pageName, CONST_MULTICAST_STATS_HTML, strlen(CONST_MULTICAST_STATS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printMulticastStats(sortedColumn, revertOrder, pageNum); } else if(strncasecmp(pageName, CONST_DOMAIN_STATS_HTML, strlen(CONST_DOMAIN_STATS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printDomainStats(domainNameParm, abs(networkMode), 0, abs(sortedColumn), revertOrder, pageNum); } else if(strncasecmp(pageName, CONST_COMMUNITIES_STATS_HTML, strlen(CONST_COMMUNITIES_STATS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printDomainStats(communityNameParm ? communityNameParm : domainNameParm, 0, 1, abs(sortedColumn), revertOrder, pageNum); } else if(strncasecmp(pageName, CONST_SHOW_PORT_TRAFFIC_HTML, strlen(CONST_SHOW_PORT_TRAFFIC_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); showPortTraffic(portNr); } else if(strcasecmp(pageName, CONST_LOCAL_ROUTERS_LIST_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printLocalRoutersList(myGlobals.actualReportDeviceId); } else if(strcasecmp(pageName, CONST_VLAN_LIST_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printVLANList(myGlobals.actualReportDeviceId); } else if(strcasecmp(pageName, CONST_IP_PROTO_USAGE_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printIpProtocolUsage(); } else if(strncasecmp(pageName, CONST_PIE_IP_TRAFFIC, strlen(CONST_PIE_IP_TRAFFIC)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); drawTrafficPie(); printTrailer=0; } else if(strncasecmp(pageName, CONST_PIE_PKT_CAST_DIST, strlen(CONST_PIE_PKT_CAST_DIST)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); pktCastDistribPie(); printTrailer=0; } else if(strncasecmp(pageName, CONST_PIE_PKT_SIZE_DIST, strlen(CONST_PIE_PKT_SIZE_DIST)) == 0) { if(myGlobals.device[myGlobals.actualReportDeviceId].ethernetPkts.value > 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); pktSizeDistribPie(); printTrailer=0; } else { printNoDataYet(); } } else if(strncasecmp(pageName, CONST_PIE_TTL_DIST, strlen(CONST_PIE_TTL_DIST)) == 0) { if(myGlobals.device[myGlobals.actualReportDeviceId].ipPkts.value > 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); pktTTLDistribPie(); printTrailer=0; } else { printNoDataYet(); } } else if(strncasecmp(pageName, CONST_PIE_IPPROTO_RL_DIST, strlen(CONST_PIE_IPPROTO_RL_DIST)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); ipProtoDistribPie(); printTrailer=0; } else if(strncasecmp(pageName, CONST_PIE_INTERFACE_DIST, strlen(CONST_PIE_INTERFACE_DIST)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); interfaceTrafficPie(); printTrailer=0; } else if(strncasecmp(pageName, CONST_HOST_SERVICE_DISTR_HTML, strlen(CONST_HOST_SERVICE_DISTR_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); drawDeviceServiceDistribution(); printTrailer=0; #ifndef WIN32 } else if(strncasecmp(pageName,CONST_NETWORK_MAP_HTML, strlen(CONST_NETWORK_MAP_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); makeDot(); printTrailer=1; #endif } else if(strncasecmp(pageName, CONST_HOST_IP_MAP_HTML, strlen(CONST_HOST_IP_MAP_HTML)) == 0) { char hostName[47], *theHost = ""; idx = 5; theHost = &pageName[strlen(CONST_HOST_IP_MAP_HTML)+1]; if(strlen(theHost) <= strlen(CHART_FORMAT)) { printNoDataYet(); } else { HostTraffic *el=NULL; char *minus; if(strlen(theHost) >= 47) theHost[47] = 0; for(i=strlen(theHost); i>0; i--) if(theHost[i] == '?') { theHost[i] = '\0'; break; } memset(hostName, 0, sizeof(hostName)); strncpy(hostName, theHost, strlen(theHost)-strlen(CHART_FORMAT)); if((minus = strchr(hostName, '-')) != NULL) { minus[0] = '\0'; vlanId = atoi(&minus[1]); } urlFixupFromRFC1945Inplace(hostName); #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "Searching hostname: '%s'", hostName); #endif for(el=getFirstHost(myGlobals.actualReportDeviceId); el != NULL; el = getNextHost(myGlobals.actualReportDeviceId, el)) { if((el != myGlobals.broadcastEntry) && (el->hostNumIpAddress != NULL) && ((el->vlanId <= 0) || (el->vlanId == vlanId)) && ((strcmp(el->hostNumIpAddress, hostName) == 0) || (strcmp(el->ethAddressString, hostName) == 0) || (strcmp(el->hostResolvedName, hostName) == 0) )) { break; } } /* for */ if(el == NULL) { returnHTTPpageNotFound(NULL); } else { if(el->community && (!isAllowedCommunity(el->community))) { returnHTTPpageBadCommunity(); } else { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); safe_snprintf (__FILE__, __LINE__, tmpStr, sizeof (tmpStr), "Contacts Map for Host %s", hostName); printHTMLheader(tmpStr, NULL, BITFLAG_HTML_NO_BODY); createHostMap(el); } } printTrailer = 0; } } else if(strncasecmp(pageName, CONST_BAR_IPPROTO_DIST, strlen(CONST_BAR_IPPROTO_DIST)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); drawGlobalIpProtoDistribution(); printTrailer=0; } else if(strcasecmp(pageName, CONST_CREDITS_HTML) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHTMLheader("Credits", NULL, BITFLAG_HTML_NO_REFRESH); sendString("

    "); sendString("

    ntop was been created by "); sendString(""); sendString("Luca Deri while studying how to model network traffic. He was unsatisfied"); sendString("by the many network traffic analysis tools he had access to, and decided to "); sendString("write a new application able to report network traffic information in a way"); sendString("similar to the popular Unix top command. At that point in time (it was June "); sendString("1998) ntop was born.

    "); sendString("

    The current release is very different from the initial one as it includes"); sendString("many features and much additional media support.

    "); sendString("

    ntop has definitively more than one author:

    "); /* * Addresses are blinded to prevent easy spam harvest - * see http://www.wbwip.com/wbw/emailencoder.html */ sendString("
    • " CONST_MAILTO_STEFANO " has contributed several ideas and comments
    • "); sendString("
    • " CONST_MAILTO_ABDELKADER " and " CONST_MAILTO_OLIVIER " provided IPv6 support
    • "); sendString("
    • " CONST_MAILTO_DINESH " for SCSI & FiberChannel support
    • "); sendString("
    • " CONST_MAILTO_BURTON " contributed to ntop in early 2000's.
    • "); sendString("
    • " CONST_MAILTO_MEDICI " implemented RRD Alarm and Region Map.
    "); sendString("

    In addition, many other people downloaded this program, tested it,"); sendString("joined the ntop "); sendString("and ntop-dev mailing lists,"); sendString("reported problems, changed it and improved significantly. This is because"); sendString("they have realised that ntop doesn't belong uniquely to its author,"); sendString("but to the whole Internet community. Their names are throught the ntop code.

    "); sendString("

    The author would like to thank all these people who contributed to ntop"); sendString(" and turned it into a first class network monitoring tool. Many thanks guys!

    "); } else if(strncasecmp(pageName, CONST_INFO_NTOP_HTML, strlen(CONST_INFO_NTOP_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printNtopConfigInfo(FALSE, &myGlobals.runningPref); } else if(strncasecmp(pageName, CONST_TEXT_INFO_NTOP_HTML, strlen(CONST_TEXT_INFO_NTOP_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printNtopConfigInfo(TRUE, &myGlobals.runningPref); printTrailer = 0; } else if(strncasecmp(pageName, CONST_PROBLEMRPT_HTML, strlen(CONST_PROBLEMRPT_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printNtopProblemReport(); printTrailer = 0; } else if(strncasecmp(pageName, CONST_VIEW_LOG_HTML, strlen(CONST_VIEW_LOG_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printNtopLogReport(FALSE); printTrailer = 0; } else if(strncasecmp(pageName, CONST_DUMP_DATA_HTML, strlen(CONST_DUMP_DATA_HTML)) == 0) { if(questionMark && strstr(questionMark, "json")) sendHTTPHeader(FLAG_HTTP_TYPE_JSON, 0, 1); else sendHTTPHeader(FLAG_HTTP_TYPE_TEXT, 0, 1); if((questionMark == NULL) || (questionMark[0] == '\0')) { dumpNtopHashes(NULL, NULL, myGlobals.actualReportDeviceId); } else { dumpNtopHashes(NULL, &questionMark[1], myGlobals.actualReportDeviceId); } printTrailer = 0; } else if(strncasecmp(pageName, CONST_DUMP_HOSTS_INDEXES_HTML, strlen(CONST_DUMP_HOSTS_INDEXES_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_TEXT, 0, 1); if((questionMark == NULL) || (questionMark[0] == '\0')) dumpNtopHashIndexes(NULL, NULL, myGlobals.actualReportDeviceId); else dumpNtopHashIndexes(NULL, &questionMark[1], myGlobals.actualReportDeviceId); printTrailer = 0; } else if(strncasecmp(pageName, CONST_DUMP_NTOP_FLOWS_HTML, strlen(CONST_DUMP_NTOP_FLOWS_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_TEXT, 0, 1); if((questionMark == NULL) || (questionMark[0] == '\0')) dumpNtopFlows(NULL, NULL, myGlobals.actualReportDeviceId); else dumpNtopFlows(NULL, &questionMark[1], myGlobals.actualReportDeviceId); printTrailer = 0; } else if(strncasecmp(pageName, CONST_DUMP_TRAFFIC_DATA_HTML, strlen(CONST_DUMP_TRAFFIC_DATA_HTML)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_TEXT, 0, 1); if((questionMark == NULL) || (questionMark[0] == '\0')) dumpNtopTrafficInfo(NULL, NULL); else dumpNtopTrafficInfo(NULL, &questionMark[1]); printTrailer = 0; } else if(strncasecmp(pageName, CONST_PURGE_HOST, strlen(CONST_PURGE_HOST)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); purgeHost((HostSerialIndex)atoi(db_key)); } else if(strncasecmp(pageName, CONST_HOST_MAP, strlen(CONST_HOST_MAP)) == 0) { sendHTTPHeader(FLAG_HTTP_TYPE_HTML, 0, 1); printHTMLheader("Hosts World Map", NULL, 0); createAllHostsMap(); printTrailer = 1; } else if(strlen(pageName) > 5) { char hostName[32]; for(i=strlen(pageName); i>0; i--) if(pageName[i] == '?') { pageName[i] = '\0'; break; } pageName[strlen(pageName)-5] = '\0'; if(strlen(pageName) >= 31) pageName[31] = 0; urlFixupFromRFC1945Inplace(pageName); strncpy(hostName, pageName, sizeof(hostName)); if(sortedColumn == 0) sortedColumn = 1; #ifdef URL_DEBUG traceEvent(CONST_TRACE_NORMAL, "Searching hostname: '%s'", hostName); #endif printAllSessionsHTML(hostName, myGlobals.actualReportDeviceId, sortedColumn, revertOrder, pageNum, pageName); } else { printTrailer = 0; errorCode = FLAG_HTTP_INVALID_PAGE; } } if(domainNameParm != NULL) free(domainNameParm); if(db_key != NULL) free(db_key); if(db_val != NULL) free(db_val); if(printTrailer && (postLen == -1)) printHTMLtrailer(); #if defined(PARM_FORK_CHILD_PROCESS) && (!defined(WIN32)) if(*usedFork) { u_int gzipBytesSent = 0; #ifdef MAKE_WITH_ZLIB if(compressFile) compressAndSendData(&gzipBytesSent); #endif closeNwSocket(&myGlobals.newSock); shutdown(myGlobals.newSock, SHUT_RDWR); logHTTPaccess(200, httpRequestedAt, gzipBytesSent); exit(0); } #endif /* FORK_CHILD */ if(pageName && (strncasecmp(pageName, CONST_SHUTDOWNNOW_NTOP_IMG, strlen(CONST_SHUTDOWNNOW_NTOP_IMG)) == 0)) { /* Processed the page, it's time to flag this for the web server to shutdown... */ termAccessLog(); traceEvent(CONST_TRACE_ALWAYSDISPLAY, "WEB: Beginning actual shutdown sequence"); setRunState(FLAG_NTOPSTATE_SHUTDOWNREQ); } return(errorCode); } /* ************************* */ static int checkHTTPpassword(char *theRequestedURL, int theRequestedURLLen _UNUSED_, char* thePw, int thePwLen) { char outBuffer[65], tmpOutBuffer[65], *user = NULL, users[LEN_GENERAL_WORK_BUFFER]; int i, rc; datum key, nextkey; theHttpUser[0] = '\0'; #ifdef URL_DEBUG traceEvent(CONST_TRACE_INFO, "URL_DEBUG: Checking password-protect for '%s'", theRequestedURL); #endif if(myGlobals.securityItemsLoaded == 0) { traceEvent(CONST_TRACE_NOISY, "SECURITY: Loading items table"); accessMutex(&myGlobals.securityItemsMutex, "load"); key = gdbm_firstkey(myGlobals.pwFile); while(key.dptr != NULL) { myGlobals.securityItems[myGlobals.securityItemsLoaded++] = key.dptr; nextkey = gdbm_nextkey(myGlobals.pwFile, key); key = nextkey; if(myGlobals.securityItemsLoaded == MAX_NUM_PWFILE_ENTRIES) { traceEvent(CONST_TRACE_WARNING, "Number of entries in password file, %d at limit", myGlobals.securityItemsLoaded); break; } } releaseMutex(&myGlobals.securityItemsMutex); } outBuffer[0] = '\0'; tmpOutBuffer[0] = '\0'; accessMutex(&myGlobals.securityItemsMutex, "test"); for(i=0; i 0) { for(i=0; i<(int)sizeof(outBuffer); i++) if(outBuffer[i] == ':') { outBuffer[i] = '\0'; user = outBuffer; break; } strncpy(thePw, &outBuffer[i+1], thePwLen-1)[thePwLen-1] = '\0'; } if(strlen(user) >= sizeof(theHttpUser)) user[sizeof(theHttpUser)-1] = '\0'; strcpy(theHttpUser, user); /* Following is not URL_DEBUG so we don't accidentally log the crypt()ed password value */ #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "DEBUG: User='%s' - Pw='%s'", user, thePw); #endif safe_snprintf(__FILE__, __LINE__, users, LEN_GENERAL_WORK_BUFFER, "1%s", user); /* Start simple. Is the user even in the permitted list? */ if(strstr(nextkey.dptr, users) == NULL) { if(nextkey.dptr != NULL) free(nextkey.dptr); if(strlen(&theRequestedURL[1]) > 40) { theRequestedURL[40]='.'; theRequestedURL[41]='.'; theRequestedURL[42]='.'; theRequestedURL[43]='\0'; } traceEvent(CONST_TRACE_NOISY, "SECURITY: user '%s' request for url '%s' disallowed", user == NULL ? "none" : strcmp(user, "") || user[0] == '\0' ? "unspecified" : user, &theRequestedURL[1]); return 0; /* The specified user is not among those who are allowed to access the URL */ } free(nextkey.dptr); key.dptr = users; key.dsize = strlen(users)+1; nextkey = gdbm_fetch(myGlobals.pwFile, key); /* Following is not URL_DEBUG so we don't accidentally log the crypt()ed password value */ #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "DEBUG: Record='%s' = '%s'", users, nextkey.dptr); #endif if(nextkey.dptr != NULL) { #ifdef WIN32 rc = !strcmp(nextkey.dptr, thePw); #else rc = !strcmp(nextkey.dptr, (char*)crypt((const char*)thePw, (const char*)CONST_CRYPT_SALT)); #endif free(nextkey.dptr); } else rc = 0; if(strcmp(theHttpUser, theLastHttpUser)) { char prefKey[64], *item, *strtokState; strcpy(theLastHttpUser, theHttpUser); snprintf(prefKey, sizeof(prefKey), "%s%s", COMMUNITY_PREFIX, theHttpUser); fetchPwValue(prefKey, allowedCommunities, sizeof(allowedCommunities)); // traceEvent(CONST_TRACE_INFO, "++++++++++++> '%s'", allowedCommunities); item = strtok_r(allowedCommunities, "&", &strtokState); for(i=0; (item != NULL) && (i < sizeof(allowedCommunities)-1); i++) { listAllowedCommunities[i] = item; item = strtok_r(NULL, "&", &strtokState); } } if(rc == 0) { if(strlen(&theRequestedURL[1]) > 40) { theRequestedURL[40]='.'; theRequestedURL[41]='.'; theRequestedURL[42]='.'; theRequestedURL[43]='\0'; } traceEvent(CONST_TRACE_NOISY, "SECURITY: user '%s' request for url '%s' disallowed", user == NULL ? "none" : strcmp(user, "") || user[0] == '\0' ? "unspecified" : user, &theRequestedURL[1]); } return(rc); } /* ************************* */ #ifdef MAKE_WITH_ZLIB static void compressAndSendData(u_int *gzipBytesSent) { FILE *fd; int len; char tmpStr[256]; memset(&tmpStr, 0, sizeof(tmpStr)); if(gzflush(compressFileFd, Z_FINISH) != Z_OK) { int err; traceEvent(CONST_TRACE_WARNING, "gzflush error %d (%s)", err, gzerror(compressFileFd, &err)); } gzclose(compressFileFd); compressFile = 0; /* Stop compression */ fd = fopen(compressedFilePath, "rb"); if(fd == NULL) { if(gzipBytesSent != NULL) (*gzipBytesSent) = 0; return; } sendString("Content-Encoding: gzip\r\n"); fseek(fd, 0, SEEK_END); safe_snprintf(__FILE__, __LINE__, tmpStr, sizeof(tmpStr), "Content-Length: %d\r\n\r\n", (len = ftell(fd))); fseek(fd, 0, SEEK_SET); sendString(tmpStr); if(gzipBytesSent != NULL) (*gzipBytesSent) = len; for(;;) { len = fread(tmpStr, sizeof(char), 255, fd); if(len <= 0) break; sendStringLen(tmpStr, len); } fclose(fd); // traceEvent(CONST_TRACE_ERROR, "[SSL] %s", compressedFilePath); unlink(compressedFilePath); } #endif /* MAKE_WITH_ZLIB */ /* ************************* */ void handleHTTPrequest(HostAddr from) { int rc, i, skipLeading, postLen = 0, usedFork = 0, numLang = 0; char requestedURL[MAX_LEN_URL], pw[64], agent[256], referer[256], workLanguage[256], ifModificedSince[48], *requestedURLCopy=NULL; struct timeval httpRequestedAt; u_int gzipBytesSent = 0; char *requestedLanguage[MAX_LANGUAGES_REQUESTED]; char tmpStr[512]; int isPostMethod = FALSE; myGlobals.numHandledRequests[myGlobals.newSock > 0]++; gettimeofday(&httpRequestedAt, NULL); if(from.hostFamily == AF_INET) from.Ip4Address.s_addr = ntohl(from.Ip4Address.s_addr); requestFrom = &from; #if defined(MAX_NUM_BAD_IP_ADDRESSES) && (MAX_NUM_BAD_IP_ADDRESSES > 0) /* Note if the size of the table is zero, we simply nullify all of this code (why bother wasting the work effort) Burton M. Strauss III , June 2002 */ for(i=0; i 0]++; traceEvent(CONST_TRACE_ERROR, "Rejected request from address %s " "(it previously sent ntop a bad request)", _addrtostr(&from, requestedURL, sizeof(requestedURL))); return; } } } #endif memset(requestedURL, 0, sizeof(requestedURL)); memset(pw, 0, sizeof(pw)); memset(agent, 0, sizeof(agent)); memset(referer, 0, sizeof(referer)); memset(ifModificedSince, 0, sizeof(ifModificedSince)); memset(&workLanguage, 0, sizeof(workLanguage)); httpBytesSent = 0; compressFile = 0; compressFileFd = NULL; acceptGzEncoding = 0; postLen = readHTTPheader(requestedURL, sizeof(requestedURL), pw, sizeof(pw), agent, sizeof(agent), referer, sizeof(referer), workLanguage, sizeof(workLanguage), ifModificedSince, sizeof(ifModificedSince), &isPostMethod); #if defined(HTTP_DEBUG) || defined(URL_DEBUG) traceEvent(CONST_TRACE_INFO, "HTTP: Requested URL = '%s', length = %d", requestedURL, postLen); traceEvent(CONST_TRACE_INFO, "HTTP: User-Agent = '%s'", agent); traceEvent(CONST_TRACE_INFO, "HTTP: Referer = '%s'", referer); #endif if(postLen >= -1) { ; /* no errors, skip following tests */ } else if(postLen == FLAG_HTTP_INVALID_REQUEST) { returnHTTPbadRequest(); return; } else if(postLen == FLAG_HTTP_INVALID_METHOD) { /* Courtesy of Vanja Hrustic */ returnHTTPnotImplemented(); return; } else if(postLen == FLAG_HTTP_INVALID_VERSION) { returnHTTPversionNotSupported(); return; } else if(postLen == FLAG_HTTP_REQUEST_TIMEOUT) { returnHTTPrequestTimedOut(); return; } /* We need to check whether the URL is invalid, i.e. it contains '..' or similar chars that can be used for reading system files */ requestedURLCopy = strdup(requestedURL); if((rc = checkURLsecurity(requestedURLCopy)) > 0) { traceEvent(CONST_TRACE_ERROR, "URL security: '%s' rejected (code=%d)(client=%s)", requestedURL, rc, _addrtostr(&from, tmpStr, sizeof(tmpStr))); #if defined(MAX_NUM_BAD_IP_ADDRESSES) && (MAX_NUM_BAD_IP_ADDRESSES > 0) { /* Note if the size of the table is zero, we simply nullify all of this code (why bother wasting the work effort Burton M. Strauss III , June 2002 */ int found = 0; /* Let's record the IP address of this nasty guy so he will stay far from ntop for a while */ for(i=0; i */ if((requestedURL[0] != '\0') && (requestedURL[0] != '/')) { returnHTTPpageNotFound(NULL); return; } if(checkHTTPpassword(requestedURL, sizeof(requestedURL), pw, sizeof(pw) ) != 1) { returnHTTPaccessDenied(); return; } myGlobals.actTime = time(NULL); /* Don't forget this */ skipLeading = 0; while (requestedURL[skipLeading] == '/') { skipLeading++; } if(requestedURL[0] == '\0') { returnHTTPpageNotFound(NULL); } #ifdef IDLE_PURGE_DEBUG traceEvent(CONST_TRACE_INFO, "IDLE_PURGE_DEBUG: handleHTTPrequest() accessMutex(purgeMutex)...calling"); #endif accessMutex(&myGlobals.purgeMutex, "returnHTTPPage"); #ifdef IDLE_PURGE_DEBUG traceEvent(CONST_TRACE_INFO, "IDLE_PURGE_DEBUG: handleHTTPrequest() accessMutex(purgeMutex)...locked"); #endif rc = returnHTTPPage(&requestedURL[1], postLen, &from, &httpRequestedAt, &usedFork, agent, referer, requestedLanguage, numLang, ifModificedSince, isPostMethod); #ifdef IDLE_PURGE_DEBUG traceEvent(CONST_TRACE_INFO, "IDLE_PURGE_DEBUG: handleHTTPrequest() releaseMutex(purgeMutex)...calling"); #endif releaseMutex(&myGlobals.purgeMutex); #ifdef IDLE_PURGE_DEBUG traceEvent(CONST_TRACE_INFO, "IDLE_PURGE_DEBUG: handleHTTPrequest() releaseMutex(purgeMutex)...released"); #endif if(rc == 0) { myGlobals.numSuccessfulRequests[myGlobals.newSock > 0]++; #ifdef MAKE_WITH_ZLIB if(compressFile) compressAndSendData(&gzipBytesSent); else #endif gzipBytesSent = 0; if(!usedFork) logHTTPaccess(200, &httpRequestedAt, gzipBytesSent); } else if(rc == FLAG_HTTP_INVALID_PAGE) { returnHTTPpageNotFound(NULL); } } /* *******************************/ int readHTTPpostData(int len, char *buf, int buflen) { int rc, idx=0; #ifdef HAVE_OPENSSL SSL* ssl = getSSLsocket(-myGlobals.newSock); #endif memset(buf, 0, buflen); if(len > (buflen-8)) { BufferTooSmall(buf, buflen); return (-1); } while(len > 0) { #ifdef HAVE_OPENSSL if(myGlobals.newSock < 0) rc = SSL_read(ssl, &buf[idx], len); else rc = recv(myGlobals.newSock, &buf[idx], len, 0); #else rc = recv(myGlobals.newSock, &buf[idx], len, 0); #endif if(rc < 0) return (-1); idx += rc; len -= rc; } buf[idx] = '\0'; while(1) { fd_set mask; struct timeval wait_time; FD_ZERO(&mask); FD_SET((unsigned int)abs(myGlobals.newSock), &mask); /* select returns immediately */ wait_time.tv_sec = 0, wait_time.tv_usec = 0; if(select(myGlobals.newSock+1, &mask, 0, 0, &wait_time) == 1) { char aChar[8]; /* just in case */ #ifdef HAVE_OPENSSL if(myGlobals.newSock < 0) rc = SSL_read(ssl, aChar, 1); else rc = recv(myGlobals.newSock, aChar, 1, 0); #else rc = recv(myGlobals.newSock, aChar, 1, 0); #endif if(rc <= 0) break; } else break; } #if 0 printf("HTTP POST data: '%s' (%d)\n", buf, idx); fflush(stdout); #endif #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "Data: '%s' (%d)", buf, idx); #endif return (idx); } ntop-5.0.1+dfsg1/globals-structtypes.h0000644000000000000000000020623012010426113016367 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * http://www.ntop.org * * Copyright (C) 1998-2012 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* ******************************* Some nice links: http://www.sockets.com/protocol.htm http://www.iana.org/assignments/protocol-numbers Courtesy of Helmut Schneider ******************************* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This file, included from ntop.h, contains the structure and typedef definitions. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * fallbacks for essential typedefs */ #ifdef WIN32 #ifndef __GNUC__ typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; #endif #if !defined(HAVE_u_int8_T) typedef u_char u_int8_t; #endif #if !defined(HAVE_u_int16_T) typedef u_short u_int16_t; #endif #if !defined(HAVE_u_int32_T) typedef u_int u_int32_t; #endif #endif /* WIN32 */ #if !defined(HAVE_U_INT64_T) #if defined(WIN32) /* typedef _int64 u_int64_t; */ #else #if defined(HAVE_u_int64_T) #define u_int64_t u_int64_t #else #if defined(HAVE_UINT64_T) #define u_int64_t uint64_t #else #error "Sorry, I'm unable to define u_int64_t on your platform" #endif #endif #endif #endif #if !defined(HAVE_U_INT32_T) #if defined(HAVE_UINT32_T) #define u_int32_t uint32_t #else typedef unsigned int u_int32_t; #endif #endif #if !defined(HAVE_U_INT16_T) #if defined(HAVE_UINT16_T) #define u_int16_t uint16_t #else typedef unsigned short u_int16_t; #endif #endif #if !defined(HAVE_U_INT8_T) #if defined(HAVE_UINT8_T) #define u_int8_t uint8_t #else typedef unsigned char u_int8_t; #endif #endif #if !defined(HAVE_INT32_T) typedef int int32_t; #endif #if !defined(HAVE_INT16_T) typedef short int16_t; #endif #if !defined(HAVE_INT8_T) typedef char int8_t; #endif #ifndef bool #define bool u_int8_t #endif typedef struct ether80211q { u_int16_t vlanId; u_int16_t protoType; } Ether80211q; /* PPPoE - Courtesy of Andreas Pfaller Feb2003 */ #ifdef HAVE_LINUX_IF_PPPOX_H #include #else /* Extracted and modified from the Linux header for other systems - BMS Mar2003 */ /* And for Linux systems without if_pppox.h - BMS Apr2003 */ struct pppoe_tag { u_int16_t tag_type; u_int16_t tag_len; char tag_data; }; struct pppoe_hdr { #ifdef CFG_LITTLE_ENDIAN u_int8_t ver : 4; u_int8_t type : 4; #else u_int8_t type : 4; u_int8_t ver : 4; #endif u_int8_t code; u_int16_t sid; u_int16_t length; struct pppoe_tag tag; }; #endif typedef struct _mac_t { u_int8_t mact_octet[6]; } mac_t; typedef struct hostAddr { u_int hostFamily; /* AF_INET AF_INET6 */ union { struct in_addr _hostIp4Address; struct in6_addr _hostIp6Address; } addr; } HostAddr; #define Ip4Address addr._hostIp4Address #define Ip6Address addr._hostIp6Address #define SIZEOF_HOSTSERIAL 8 #define UNKNOWN_SERIAL_INDEX 0 #define SERIAL_NONE 0 #define SERIAL_MAC 1 #define SERIAL_IPV4 2 #define SERIAL_IPV6 3 typedef struct _ethSerial { u_char ethAddress[LEN_ETHERNET_ADDRESS]; u_int16_t vlanId; } EthSerial; typedef struct _ipSerial { HostAddr ipAddress; u_int16_t vlanId; } IpSerial; typedef struct hostSerial { u_int8_t serialType; /* 0 == empty */ union { EthSerial ethSerial; /* hostSerial == SERIAL_MAC */ IpSerial ipSerial; /* hostSerial == SERIAL_IPV4/SERIAL_IPV6 */ } value; } HostSerial; typedef u_int32_t HostSerialIndex; typedef struct { time_t dump_date; HostSerialIndex idx; } HostSerialIndexDump; typedef struct { time_t dump_date; HostSerial serial; } HostSerialDump; /* extern int emptySerial(HostSerialIndex *a); extern int cmpSerial(HostSerialIndex *a, HostSerialIndex *b); extern int copySerial(HostSerialIndex *a, HostSerialIndex *b); */ #define emptySerial(a) (*a == UNKNOWN_SERIAL_INDEX) #define cmpSerial(a, b) (*a == *b) #define copySerial(a, b) { *a = *b; } #define setEmptySerial(a) { *a = UNKNOWN_SERIAL_INDEX; } #ifdef WIN32 #define pid_t unsigned int #ifndef RETSIGTYPE #define RETSIGTYPE void #endif #endif #ifdef MAKE_WITH_SYSLOG /* Now, if we don't have gcc, we haven't created the facilitynames table, so do it * manually */ typedef struct my_code { char *c_name; int c_val; } MYCODE; #endif #ifdef HAVE_OPENSSL typedef struct ssl_connection { SSL* ctx; int socketId; } SSL_connection; #endif /* HAVE_OPENSSL */ #ifdef MAKE_NTOP_PACKETSZ_DECLARATIONS /* Missing declarations */ typedef struct { unsigned id :16; /* query identification number */ /* fields in third byte */ unsigned rd :1; /* recursion desired */ unsigned tc :1; /* truncated message */ unsigned aa :1; /* authoritive answer */ unsigned opcode :4; /* purpose of message */ unsigned qr :1; /* response flag */ /* fields in fourth byte */ unsigned rcode :4; /* response code */ unsigned unused :3; /* unused bits (MBZ as of 4.9.3a3) */ unsigned ra :1; /* recursion available */ /* remaining bytes */ unsigned qdcount :16; /* number of question entries */ unsigned ancount :16; /* number of answer entries */ unsigned nscount :16; /* number of authority entries */ unsigned arcount :16; /* number of resource entries */ } HEADER; #endif /* MAKE_NTOP_PACKETSZ_DECLARATIONS */ typedef struct portProtoMapper { u_int portProto; /* Port/proto to map */ u_int mappedPortProto; /* Mapped port/proto */ u_char dummyEntry; /* Set to 1 if this entry is dummy */ } PortProtoMapper; typedef struct portProtoMapperHandler { u_short numElements; /* numIpPortsToHandle */ int numSlots;/* numIpPortMapperSlots */ PortProtoMapper *theMapper; } PortProtoMapperHandler; typedef struct protocolsList { char *protocolName; u_int16_t protocolId, protocolIdAlias; /* I know it's ugly however this should be enough for most of the situations */ struct protocolsList *next; } ProtocolsList; #ifndef HAVE_RW_LOCK #ifndef WIN32 #define pthread_rwlock_t pthread_mutex_t #define pthread_rwlock_init pthread_mutex_init #define pthread_rwlock_wrlock pthread_mutex_lock #define pthread_rwlock_unlock pthread_mutex_unlock #define pthread_rwlock_destroy pthread_mutex_destroy /* Fix courtesy of Mark Gibbons */ #define pthread_rwlock_trywrlock pthread_mutex_trylock #endif #endif #ifndef WIN32 typedef struct conditionalVariable { pthread_mutex_t mutex; pthread_cond_t condvar; int predicate; } ConditionalVariable; #else #define pthread_t HANDLE #define pthread_mutex_t HANDLE #define pthread_cond_t HANDLE #define pthread_rwlock_t HANDLE typedef struct conditionalVariable { HANDLE condVar; CRITICAL_SECTION criticalSection; } ConditionalVariable; extern int pthread_create(pthread_t *threadId, void* notUsed, void *(*__start_routine) (void *), char* userParm); extern void pthread_detach(pthread_t *threadId); extern int pthread_mutex_init(pthread_mutex_t *mutex, char* notused); extern void pthread_mutex_destroy(pthread_mutex_t *mutex); extern int pthread_mutex_lock(pthread_mutex_t *mutex); extern int pthread_mutex_trylock(pthread_mutex_t *mutex); extern int pthread_mutex_unlock(pthread_mutex_t *mutex); #endif /* WIN32 */ typedef struct holder { struct timeval time; pid_t pid; pthread_t thread; int line; char file[5]; } Holder; typedef struct pthreadMutex { u_int8_t isInitialized; #ifdef MUTEX_DEBUG pthread_mutex_t mutex, statedatamutex; u_int8_t isLocked; u_int numLocks, numReleases; Holder attempt, lock, unlock, max; float maxLockedDuration; #else pthread_rwlock_t mutex; #endif } PthreadMutex; typedef struct packetInformation { unsigned short deviceId; struct pcap_pkthdr h; u_char p[MAX_PACKET_LEN]; } PacketInformation; typedef struct hash_list { u_int16_t idx; /* Index of this entry in hostTraffic */ struct hash_list *next; } HashList; #ifdef WIN32 typedef __int64 Counter; #else typedef unsigned long long Counter; #endif typedef struct trafficCounter { Counter value; u_char modified; } TrafficCounter; /* ******************************** */ inline static void incrementTrafficCounter(TrafficCounter *ctr, Counter value) { if(value > 0) ctr->value += value, ctr->modified = 1; } inline static void resetTrafficCounter(TrafficCounter *ctr) { ctr->value = 0, ctr->modified = 0; } /* ************* Types Definition ********************* */ typedef struct thptEntry { float trafficValue; /* ****** */ HostSerialIndex topHostSentSerial, secondHostSentSerial, thirdHostSentSerial; TrafficCounter topSentTraffic, secondSentTraffic, thirdSentTraffic; /* ****** */ HostSerialIndex topHostRcvdSerial, secondHostRcvdSerial, thirdHostRcvdSerial; TrafficCounter topRcvdTraffic, secondRcvdTraffic, thirdRcvdTraffic; } ThptEntry; /* *********************** */ typedef struct packetStats { TrafficCounter upTo64, upTo128, upTo256; TrafficCounter upTo512, upTo1024, upTo1518; #ifdef MAKE_WITH_JUMBO_FRAMES TrafficCounter upTo2500, upTo6500, upTo9000, above9000; #else TrafficCounter above1518; #endif TrafficCounter shortest, longest; TrafficCounter tooLong; } PacketStats; /* *********************** */ typedef struct ttlStats { TrafficCounter upTo32, upTo64, upTo96; TrafficCounter upTo128, upTo160, upTo192, upTo224, upTo255; } TTLstats; /* *********************** */ typedef struct simpleProtoTrafficInfo { TrafficCounter local, local2remote, remote, remote2local; /* Bytes */ TrafficCounter totalFlows; } SimpleProtoTrafficInfo; /* *********************** */ typedef struct usageCounter { TrafficCounter value; HostSerialIndex peersSerials[MAX_NUM_CONTACTED_PEERS]; /* host serial */ } UsageCounter; /* *********************** */ typedef struct routingCounter { TrafficCounter routedPkts, routedBytes; } RoutingCounter; /* *********************** */ /* NOTE: anything added here must be also added in the SecurityDeviceProbes structure */ typedef struct securityHostProbes { UsageCounter synPktsSent, rstPktsSent, rstAckPktsSent, synFinPktsSent, finPushUrgPktsSent, nullPktsSent; UsageCounter synPktsRcvd, rstPktsRcvd, rstAckPktsRcvd, synFinPktsRcvd, finPushUrgPktsRcvd, nullPktsRcvd; UsageCounter ackXmasFinSynNullScanSent, ackXmasFinSynNullScanRcvd; UsageCounter rejectedTCPConnSent, rejectedTCPConnRcvd; UsageCounter establishedTCPConnSent, establishedTCPConnRcvd; UsageCounter terminatedTCPConnServer, terminatedTCPConnClient; /* ********* */ UsageCounter udpToClosedPortSent, udpToClosedPortRcvd; UsageCounter udpToDiagnosticPortSent, udpToDiagnosticPortRcvd, tcpToDiagnosticPortSent, tcpToDiagnosticPortRcvd; UsageCounter tinyFragmentSent, tinyFragmentRcvd; UsageCounter icmpFragmentSent, icmpFragmentRcvd; UsageCounter overlappingFragmentSent, overlappingFragmentRcvd; UsageCounter closedEmptyTCPConnSent, closedEmptyTCPConnRcvd; UsageCounter icmpPortUnreachSent, icmpPortUnreachRcvd; UsageCounter icmpHostNetUnreachSent, icmpHostNetUnreachRcvd; UsageCounter icmpProtocolUnreachSent, icmpProtocolUnreachRcvd; UsageCounter icmpAdminProhibitedSent, icmpAdminProhibitedRcvd; UsageCounter malformedPktsSent, malformedPktsRcvd; } SecurityHostProbes; /* NOTE: anything added here must be also added in the SecurityHostProbes structure */ typedef struct securityDeviceProbes { TrafficCounter synPkts, rstPkts, rstAckPkts, synFinPkts, finPushUrgPkts, nullPkts; TrafficCounter rejectedTCPConn; TrafficCounter establishedTCPConn; TrafficCounter terminatedTCPConn; TrafficCounter ackXmasFinSynNullScan; /* ********* */ TrafficCounter udpToClosedPort; TrafficCounter udpToDiagnosticPort, tcpToDiagnosticPort; TrafficCounter tinyFragment; TrafficCounter icmpFragment; TrafficCounter overlappingFragment; TrafficCounter closedEmptyTCPConn; TrafficCounter malformedPkts; TrafficCounter icmpPortUnreach; TrafficCounter icmpHostNetUnreach; TrafficCounter icmpProtocolUnreach; TrafficCounter icmpAdminProhibited; } SecurityDeviceProbes; /* *********************** */ typedef struct sapType { u_char dsap, ssap; } SapType; \ /* *********************** */ typedef struct unknownProto { u_char protoType; /* 0=notUsed, 1=Ethernet, 2=SAP, 3=IP */ union { u_int16_t ethType; SapType sapType; u_int16_t ipType; } proto; } UnknownProto; /* *********************** */ typedef struct nonIPTraffic { /* NetBIOS */ char nbNodeType, *nbHostName, *nbAccountName, *nbDomainName, *nbDescr; /* Non IP */ TrafficCounter stpSent, stpRcvd; /* Spanning Tree */ TrafficCounter arp_rarpSent, arp_rarpRcvd; TrafficCounter arpReqPktsSent, arpReplyPktsSent, arpReplyPktsRcvd; TrafficCounter netbiosSent, netbiosRcvd; TrafficCounter otherSent, otherRcvd; /* Other traffic we cannot classify */ UnknownProto *unknownProtoSent, *unknownProtoRcvd; /* List of MAX_NUM_UNKNOWN_PROTOS elements */ } NonIPTraffic; /* *********************** */ typedef struct trafficDistribution { TrafficCounter lastCounterBytesSent, last24HoursBytesSent[25], lastDayBytesSent; TrafficCounter lastCounterBytesRcvd, last24HoursBytesRcvd[25], lastDayBytesRcvd; } TrafficDistribution; /* *********************** */ typedef struct portUsage { u_short port, clientUses, serverUses; HostSerialIndex clientUsesLastPeer, serverUsesLastPeer; TrafficCounter clientTraffic, serverTraffic; struct portUsage *next; } PortUsage; /* *********************** */ typedef struct hostTalker { HostSerialIndex hostSerial; float bps /* bytes/sec */; } HostTalker; /* *********************** */ typedef struct hostTalkerSeries { HostSerialIndex hostSerial; float total_bps /* bytes/sec */; float bps_series[60 /* 1 x minute */]; } HostTalkerSeries; /* *********************** */ typedef struct topTalkers { time_t when; HostTalker senders[MAX_NUM_TOP_TALKERS], receivers[MAX_NUM_TOP_TALKERS]; } TopTalkers; /* *********************** */ typedef struct virtualHostList { char *virtualHostName; TrafficCounter bytesSent, bytesRcvd; /* ... by the virtual host */ struct virtualHostList *next; } VirtualHostList; /* *********************** */ typedef struct userList { char *userName; fd_set userFlags; struct userList *next; } UserList; /* *********************** */ typedef struct fileList { pcap_t *pcapPtr; char *fileName; fd_set fileFlags; struct fileList *next; } FileList; /* *********************** */ typedef struct storedAddress { char symAddress[MAX_LEN_SYM_HOST_NAME]; time_t recordCreationTime; short symAddressType; char pad; /* Quiet valgrind */ } StoredAddress; /* *********************** */ typedef struct macInfo { u_char isSpecial; char vendorName[MAX_LEN_VENDOR_NAME]; } MACInfo; /* *********************** */ typedef struct serviceStats { TrafficCounter numLocalReqSent, numRemReqSent; TrafficCounter numPositiveReplSent, numNegativeReplSent; TrafficCounter numLocalReqRcvd, numRemReqRcvd; TrafficCounter numPositiveReplRcvd, numNegativeReplRcvd; time_t fastestMicrosecLocalReqMade, slowestMicrosecLocalReqMade; time_t fastestMicrosecLocalReqServed, slowestMicrosecLocalReqServed; time_t fastestMicrosecRemReqMade, slowestMicrosecRemReqMade; time_t fastestMicrosecRemReqServed, slowestMicrosecRemReqServed; } ServiceStats; /* *********************** */ typedef struct dhcpStats { struct in_addr dhcpServerIpAddress; /* DHCP server that assigned the address */ struct in_addr previousIpAddress; /* Previous IP address is any */ time_t assignTime; /* when the address was assigned */ time_t renewalTime; /* when the address has to be renewed */ time_t leaseTime; /* when the address lease will expire */ TrafficCounter dhcpMsgSent[MAX_NUM_DHCP_MSG + 1], dhcpMsgRcvd[MAX_NUM_DHCP_MSG + 1]; } DHCPStats; /* *********************** */ #ifndef ICMP6_MAXTYPE #define ICMP6_MAXTYPE 142 #endif /* *********************** */ typedef struct icmpHostInfo { TrafficCounter icmpMsgSent[ICMP6_MAXTYPE+1]; TrafficCounter icmpMsgRcvd[ICMP6_MAXTYPE+1]; time_t lastUpdated; } IcmpHostInfo; /* *********************** */ typedef struct protocolInfo { /* HTTP */ VirtualHostList *httpVirtualHosts; /* POP3/SMTP... */ UserList *userList; ServiceStats *dnsStats, *httpStats; DHCPStats *dhcpStats; } ProtocolInfo; /* *********************** */ typedef struct shortProtoTrafficInfo { TrafficCounter sent, rcvd; /* Bytes */ } ShortProtoTrafficInfo; /* *********************** */ typedef struct protoTrafficInfo { TrafficCounter sentLoc, sentRem; TrafficCounter rcvdLoc, rcvdFromRem; TrafficCounter pktSent, pktRcvd; TrafficCounter totalFlows; } ProtoTrafficInfo; /* *********************** */ #define MAX_NUM_NON_IP_PROTO_TRAFFIC_INFO 8 typedef struct nonIpProtoTrafficInfo { u_int16_t protocolId; TrafficCounter sentBytes, rcvdBytes; TrafficCounter sentPkts, rcvdPkts; struct nonIpProtoTrafficInfo *next; } NonIpProtoTrafficInfo; /* **************************** */ typedef struct networkDelay { struct timeval last_update; u_long min_nw_delay, max_nw_delay; u_int num_samples; double total_delay; u_int16_t peer_port; HostSerialIndex last_peer; } NetworkDelay; /* **************************** */ typedef struct { Counter bytesSent, bytesRcvd; } ProtoTraffic; #define hostIp4Address hostIpAddress.Ip4Address #define hostIp6Address hostIpAddress.Ip6Address /* Host Traffic */ typedef struct hostTraffic { u_int8_t to_be_deleted; /* 1 = the host will be deleted in the next purge loop */ u_short magic; u_int8_t l2Host; /* 1 = Ethernet, 0 = IP and above */ u_int hostTrafficBucket; /* Index in the **hash_hostTraffic list */ u_short refCount; /* Reference counter */ HostSerial hostSerial; HostSerialIndex serialHostIndex; /* Stored in myGlobals.serialFile and valid until ntop restart */ HostAddr hostIpAddress; u_int16_t vlanId; /* VLAN Id (-1 if not set) */ u_int16_t ifId; /* Interface Id [e.g. for NetFlow] (-1 if not set) */ u_int16_t hostAS; /* AS to which the host belongs to */ char *hostASDescr; /* Description of the host AS */ time_t firstSeen, lastSeen; /* time when this host has sent/rcvd some data */ u_char ethAddress[LEN_ETHERNET_ADDRESS]; u_char lastEthAddress[LEN_ETHERNET_ADDRESS]; /* used for remote addresses */ char ethAddressString[LEN_ETHERNET_ADDRESS_DISPLAY]; char hostNumIpAddress[20] /* xxx.xxx.xxx.xxx */, *dnsDomainValue, *dnsTLDValue; u_int8_t network_mask; /* IPv6 notation e.g. /24 */ int8_t known_subnet_id; /* UNKNOWN_SUBNET_ID if the host does not belong to a known subnet */ char *hwModel, *description, *community, *fingerprint; char hostResolvedName[MAX_LEN_SYM_HOST_NAME]; short hostResolvedNameType; u_short minTTL, maxTTL; /* IP TTL (Time-To-Live) */ struct timeval minLatency, maxLatency; GeoIPRecord *geo_ip; TrafficCounter greSent, greRcvd, grePktSent, grePktRcvd, lastGrePktSent, lastGrePktRcvd; TrafficCounter ipsecSent, ipsecRcvd, ipsecPktSent, ipsecPktRcvd, lastIpsecPktSent, lastIpsecPktRcvd; /* Sketches */ CM_type *sent_to_matrix, *recv_from_matrix; NonIPTraffic *nonIPTraffic; NonIpProtoTrafficInfo *nonIpProtoTrafficInfos; /* Info about further non IP protos */ fd_set flags; TrafficCounter pktsSent, pktsRcvd, pktsSentSession, pktsRcvdSession; TrafficCounter pktsDuplicatedAckSent, pktsDuplicatedAckRcvd; TrafficCounter pktsBroadcastSent, bytesBroadcastSent; TrafficCounter pktsMulticastSent, bytesMulticastSent; TrafficCounter pktsMulticastRcvd, bytesMulticastRcvd; TrafficCounter lastBytesSent, lastHourBytesSent; TrafficCounter bytesSent, bytesSentLoc, bytesSentRem, bytesSentSession; TrafficCounter lastBytesRcvd, lastHourBytesRcvd, bytesRcvd; TrafficCounter bytesRcvdLoc, bytesRcvdFromRem, bytesRcvdSession; float actualRcvdThpt, lastHourRcvdThpt, averageRcvdThpt, peakRcvdThpt; float actualSentThpt, lastHourSentThpt, averageSentThpt, peakSentThpt; float actualThpt, averageThpt /* REMOVE */, peakThpt; unsigned short actBandwidthUsage, actBandwidthUsageS, actBandwidthUsageR; TrafficDistribution *trafficDistribution; u_int32_t numHostSessions; /* Routing */ RoutingCounter *routedTraffic; /* IP */ PortUsage *portsUsage; /* 0...MAX_ASSIGNED_IP_PORTS */ /* NetworkDelay Stats */ NetworkDelay *clientDelay /* 0..MAX_NUM_NET_DELAY_STATS-1 */, *serverDelay /* 0 ..MAX_NUM_NET_DELAY_STATS-1 */; /* Don't change the recentl... to unsigned ! */ int recentlyUsedClientPorts[MAX_NUM_RECENT_PORTS], recentlyUsedServerPorts[MAX_NUM_RECENT_PORTS]; int otherIpPortsRcvd[MAX_NUM_RECENT_PORTS], otherIpPortsSent[MAX_NUM_RECENT_PORTS]; TrafficCounter ipv4BytesSent, ipv4BytesRcvd, ipv6BytesSent, ipv6BytesRcvd; TrafficCounter tcpSentLoc, tcpSentRem, udpSentLoc, udpSentRem, icmpSent,icmp6Sent; TrafficCounter tcpRcvdLoc, tcpRcvdFromRem, udpRcvdLoc, udpRcvdFromRem, icmpRcvd, icmp6Rcvd; TrafficCounter tcpFragmentsSent, tcpFragmentsRcvd, udpFragmentsSent, udpFragmentsRcvd, icmpFragmentsSent, icmpFragmentsRcvd, icmp6FragmentsSent, icmp6FragmentsRcvd; /* Protocol decoders */ ProtocolInfo *protocolInfo; /* Interesting Packets */ SecurityHostProbes *secHostPkts; IcmpHostInfo *icmpInfo; ShortProtoTrafficInfo **ipProtosList; /* List of myGlobals.numIpProtosList entries */ Counter totContactedSentPeers, totContactedRcvdPeers; /* # of different contacted peers */ struct hostTraffic *next; /* pointer to the next element */ UsageCounter contactedSentPeers; /* peers that talked with this host */ UsageCounter contactedRcvdPeers; /* peers that talked with this host */ struct { ProtoTraffic *traffic; } l7; } HostTraffic; /* **************************** */ typedef struct domainStats { HostTraffic *domainHost; /* ptr to a host that belongs to the domain */ char *communityName; int8_t known_subnet_id; TrafficCounter bytesSent, bytesRcvd; TrafficCounter tcpSent, udpSent; TrafficCounter icmpSent,icmp6Sent; TrafficCounter tcpRcvd, udpRcvd; TrafficCounter icmpRcvd,icmp6Rcvd; } DomainStats; /* *********************** */ typedef struct ipFragment { struct hostTraffic *src, *dest; char fragmentOrder; u_int fragmentId, lastOffset, lastDataLength; u_int totalDataLength, expectedDataLength; u_int totalPacketLength; u_short sport, dport; time_t firstSeen; struct ipFragment *prev, *next; } IpFragment; /* **************************** */ typedef struct trafficEntry { TrafficCounter pktsSent, bytesSent; TrafficCounter pktsRcvd, bytesRcvd; u_short vsanId; } TrafficEntry; typedef struct serviceEntry { u_short port; char* name; } ServiceEntry; typedef struct portCounter { u_short port; Counter sent, rcvd; } PortCounter; /* IP Session Information */ typedef struct ipSession { u_short magic; u_int8_t proto; /* IPPROTO_TCP / IPPROTO_UDP... */ u_char isP2P; /* Set to 1 if this is a P2P session */ u_int8_t knownProtocolIdx; /* Mark this as a special protocol session */ HostTraffic* initiator; /* initiator address */ HostAddr initiatorRealIp; /* Real IP address (if masqueraded and known) */ u_short sport; /* initiator address (port) */ HostTraffic *remotePeer; /* remote peer address */ HostAddr remotePeerRealIp; /* Real IP address (if masqueraded and known) */ char *virtualPeerName; /* Name of a virtual host (e.g. HTTP virtual host) */ u_short dport; /* remote peer address (port) */ time_t firstSeen; /* time when the session has been initiated */ time_t lastSeen; /* time when the session has been closed */ u_long pktSent, pktRcvd; TrafficCounter bytesSent; /* # bytes sent (initiator -> peer) [IP] */ TrafficCounter bytesRcvd; /* # bytes rcvd (peer -> initiator)[IP] */ TrafficCounter bytesProtoSent; /* # bytes sent (Protocol [e.g. HTTP]) */ TrafficCounter bytesProtoRcvd; /* # bytes rcvd (Protocol [e.g. HTTP]) */ u_int minWindow, maxWindow; /* TCP window size */ struct timeval synTime, synAckTime, ackTime; /* Used to calcolate nw delay */ struct timeval clientNwDelay, serverNwDelay; /* Network Delay/Latency */ u_short numFin; /* # FIN pkts rcvd */ u_short numFinAcked; /* # ACK pkts rcvd */ u_int32_t lastAckIdI2R; /* ID of the last ACK rcvd */ u_int32_t lastAckIdR2I; /* ID of the last ACK rcvd */ TrafficCounter bytesRetranI2R; /* # bytes retransmitted (due to duplicated ACKs) */ TrafficCounter bytesRetranR2I; /* # bytes retransmitted (due to duplicated ACKs) */ u_int32_t finId[MAX_NUM_FIN]; /* ACK ids we're waiting for */ u_long lastFlags; /* flags of the last TCP packet */ u_int32_t lastCSAck, lastSCAck; /* they store the last ACK ids C->S/S->C */ u_int32_t lastCSFin, lastSCFin; /* they store the last FIN ids C->S/S->C */ u_char lastInitiator2RemFlags[MAX_NUM_STORED_FLAGS]; /* TCP flags */ u_char lastRem2InitiatorFlags[MAX_NUM_STORED_FLAGS]; /* TCP flags */ u_char sessionState; /* actual session state */ u_char passiveFtpSession; /* checked if this is a passive FTP session */ u_char voipSession; /* checked if this is a VoIP session */ char *session_info; /* Info about this session (if any) */ struct ipSession *next; struct { u_int8_t proto_guessed; u_int16_t major_proto; struct ipoque_flow_struct *flow; struct ipoque_id_struct *src, *dst; } l7; } IPSession; /* ************************************* */ typedef struct ntopIfaceAddrInet { struct in_addr ifAddr; struct in_addr network; struct in_addr netmask; } NtopIfaceAddrInet; typedef struct ntopIfaceAddrInet6 { struct in6_addr ifAddr; int prefixlen; } NtopIfaceAddrInet6; typedef struct ntopIfaceaddr{ int family; struct ntopIfaceaddr *next; union { NtopIfaceAddrInet inet; NtopIfaceAddrInet6 inet6; } af; } NtopIfaceAddr; /* ************************************* */ /* Flow aggregation */ typedef enum { noAggregation = 0, portAggregation, hostAggregation, protocolAggregation, asAggregation } AggregationType; typedef enum { noDnsResolution = 0, dnsResolutionForLocalHostsOnly = 1, dnsResolutionForLocalRemoteOnly = 2, dnsResolutionForAll = 3 } DnsResolutionMode; typedef struct probeInfo { struct in_addr probeAddr; u_int16_t probePort; u_int32_t pkts; u_int32_t lastSequenceNumber, lowestSequenceNumber, highestSequenceNumber, totNumFlows; u_int32_t lostFlows; } ProbeInfo; /* Flow aggregation */ typedef enum { hostCreation = 1, hostDeletion = 1 << 2, sessionCreation = 1 << 3, sessionDeletion = 1 << 4, hostFlagged = 1 << 5, hostUnflagged = 1 << 6 } EventType; /* *************************** */ #define CONST_FLOW_VERSION_1 1 #define CONST_V1FLOWS_PER_PAK 30 #define CONST_FLOW_VERSION_5 5 #define CONST_V5FLOWS_PER_PAK 30 #define CONST_FLOW_VERSION_7 7 #define CONST_V7FLOWS_PER_PAK 28 /* For more info see: http://www.cisco.com/warp/public/cc/pd/iosw/ioft/neflct/tech/napps_wp.htm ftp://ftp.net.ohio-state.edu/users/maf/cisco/ */ /* ********************************* */ struct flow_ver1_hdr { u_int16_t version; /* Current version = 1*/ u_int16_t count; /* The number of records in PDU. */ u_int32_t sysUptime; /* Current time in msecs since router booted */ u_int32_t unix_secs; /* Current seconds since 0000 UTC 1970 */ u_int32_t unix_nsecs; /* Residual nanoseconds since 0000 UTC 1970 */ }; struct flow_ver1_rec { u_int32_t srcaddr; /* Source IP Address */ u_int32_t dstaddr; /* Destination IP Address */ u_int32_t nexthop; /* Next hop router's IP Address */ u_int16_t input; /* Input interface index */ u_int16_t output; /* Output interface index */ u_int32_t dPkts; /* Packets sent in Duration */ u_int32_t dOctets; /* Octets sent in Duration */ u_int32_t first; /* SysUptime at start of flow */ u_int32_t last; /* and of last packet of the flow */ u_int16_t srcport; /* TCP/UDP source port number (.e.g, FTP, Telnet, etc.,or equivalent) */ u_int16_t dstport; /* TCP/UDP destination port number (.e.g, FTP, Telnet, etc.,or equivalent) */ u_int16_t pad; /* pad to word boundary */ u_int8_t proto; /* IP protocol, e.g., 6=TCP, 17=UDP, etc... */ u_int8_t tos; /* IP Type-of-Service */ u_int8_t pad2[7]; /* pad to word boundary */ }; typedef struct single_flow_ver1_rec { struct flow_ver1_hdr flowHeader; struct flow_ver1_rec flowRecord[CONST_V1FLOWS_PER_PAK+1 /* safe against buffer overflows */]; } NetFlow1Record; /* ********************************* */ struct flow_ver5_hdr { u_int16_t version; /* Current version=5*/ u_int16_t count; /* The number of records in PDU. */ u_int32_t sysUptime; /* Current time in msecs since router booted */ u_int32_t unix_secs; /* Current seconds since 0000 UTC 1970 */ u_int32_t unix_nsecs; /* Residual nanoseconds since 0000 UTC 1970 */ u_int32_t flow_sequence; /* Sequence number of total flows seen */ u_int8_t engine_type; /* Type of flow switching engine (RP,VIP,etc.)*/ u_int8_t engine_id; /* Slot number of the flow switching engine */ }; struct flow_ver5_rec { u_int32_t srcaddr; /* Source IP Address */ u_int32_t dstaddr; /* Destination IP Address */ u_int32_t nexthop; /* Next hop router's IP Address */ u_int16_t input; /* Input interface index */ u_int16_t output; /* Output interface index */ u_int32_t dPkts; /* Packets sent in Duration (milliseconds between 1st & last packet in this flow)*/ u_int32_t dOctets; /* Octets sent in Duration (milliseconds between 1st & last packet in this flow)*/ u_int32_t first; /* SysUptime at start of flow */ u_int32_t last; /* and of last packet of the flow */ u_int16_t srcport; /* TCP/UDP source port number (.e.g, FTP, Telnet, etc.,or equivalent) */ u_int16_t dstport; /* TCP/UDP destination port number (.e.g, FTP, Telnet, etc.,or equivalent) */ u_int8_t pad1; /* pad to word boundary */ u_int8_t tcp_flags; /* Cumulative OR of tcp flags */ u_int8_t proto; /* IP protocol, e.g., 6=TCP, 17=UDP, etc... */ u_int8_t tos; /* IP Type-of-Service */ u_int16_t src_as; /* source peer/origin Autonomous System */ u_int16_t dst_as; /* dst peer/origin Autonomous System */ u_int8_t src_mask; /* source route's mask bits */ u_int8_t dst_mask; /* destination route's mask bits */ u_int16_t pad2; /* pad to word boundary */ }; typedef struct single_flow_ver5_rec { struct flow_ver5_hdr flowHeader; struct flow_ver5_rec flowRecord[CONST_V5FLOWS_PER_PAK+1 /* safe against buffer overflows */]; } NetFlow5Record; /* ********************************* */ struct flow_ver7_hdr { u_int16_t version; /* Current version=7*/ u_int16_t count; /* The number of records in PDU. */ u_int32_t sysUptime; /* Current time in msecs since router booted */ u_int32_t unix_secs; /* Current seconds since 0000 UTC 1970 */ u_int32_t unix_nsecs; /* Residual nanoseconds since 0000 UTC 1970 */ u_int32_t flow_sequence; /* Sequence number of total flows seen */ u_int32_t reserved; }; struct flow_ver7_rec { u_int32_t srcaddr; /* Source IP Address */ u_int32_t dstaddr; /* Destination IP Address */ u_int32_t nexthop; /* Next hop router's IP Address */ u_int16_t input; /* Input interface index */ u_int16_t output; /* Output interface index */ u_int32_t dPkts; /* Packets sent in Duration */ u_int32_t dOctets; /* Octets sent in Duration */ u_int32_t first; /* SysUptime at start of flow */ u_int32_t last; /* and of last packet of the flow */ u_int16_t srcport; /* TCP/UDP source port number (.e.g, FTP, Telnet, etc.,or equivalent) */ u_int16_t dstport; /* TCP/UDP destination port number (.e.g, FTP, Telnet, etc.,or equivalent) */ u_int8_t flags; /* Shortcut mode(dest only,src only,full flows*/ u_int8_t tcp_flags; /* Cumulative OR of tcp flags */ u_int8_t proto; /* IP protocol, e.g., 6=TCP, 17=UDP, etc... */ u_int8_t tos; /* IP Type-of-Service */ u_int16_t dst_as; /* dst peer/origin Autonomous System */ u_int16_t src_as; /* source peer/origin Autonomous System */ u_int8_t dst_mask; /* destination route's mask bits */ u_int8_t src_mask; /* source route's mask bits */ u_int16_t pad2; /* pad to word boundary */ u_int32_t router_sc; /* Router which is shortcut by switch */ }; typedef struct single_flow_ver7_rec { struct flow_ver7_hdr flowHeader; struct flow_ver7_rec flowRecord[CONST_V7FLOWS_PER_PAK+1 /* safe against buffer overflows */]; } NetFlow7Record; /* ************************************ */ /* NetFlow v9/IPFIX */ typedef struct flow_set { u_int16_t templateId; u_int16_t fieldCount; } FlowSet; typedef struct flow_ipfix_template_field { u_int16_t fieldType; u_int16_t fieldLen; u_int8_t isPenField; } V9V10TemplateField; typedef struct flow_ver9_hdr { u_int16_t version; /* Current version=9 */ u_int16_t count; /* The number of records in PDU. */ u_int32_t sysUptime; /* Current time in msecs since router booted */ u_int32_t unix_secs; /* Current seconds since 0000 UTC 1970 */ u_int32_t flow_sequence; /* Sequence number of total flows seen */ u_int32_t sourceId; /* Source id */ } V9FlowHeader; typedef struct flow_ipfix_hdr { u_int16_t version; /* Current version=10 */ u_int16_t length; /* The flow length (bytes) */ u_int32_t sysUptime; /* Current time in msecs since router booted */ u_int32_t flow_sequence; /* Sequence number of total flows seen */ u_int32_t domainId; /* Observation domain id */ } IPFIXFlowHeader; typedef struct flow_ver9_template_field { u_int16_t fieldType; u_int16_t fieldLen; } V9TemplateField; typedef struct flow_ver9_template_header { u_int16_t templateFlowset; /* = 0 */ u_int16_t flowsetLen; } V9TemplateHeader; typedef struct flow_ver9_template_def { u_int16_t templateId; u_int16_t fieldCount; } V9TemplateDef; typedef struct flow_ver9_template { /* V9TemplateHeader */ u_int16_t flowsetLen; /* V9TemplateDef */ u_int16_t templateId; u_int16_t fieldCount; } V9SimpleTemplate; typedef struct flow_ver9_flow_set { u_int16_t templateId; u_int16_t flowsetLen; } V9FlowSet; typedef struct flow_ver9_templateids { u_int16_t templateId; u_int16_t templateLen; char *templateDescr; } V9TemplateId; /* ******************************************* */ #define NUM_TEMPLATES 88 typedef struct flowSetV9 { V9SimpleTemplate templateInfo; u_int16_t flowLen; /* Real flow length */ V9V10TemplateField *fields; struct flowSetV9 *next; } FlowSetV9; typedef struct interfaceStats { u_int32_t netflow_device_ip; u_int16_t netflow_device_port; u_short interface_id; char interface_name[32]; TrafficCounter inBytes, outBytes, inPkts, outPkts; TrafficCounter selfBytes, selfPkts; struct interfaceStats *next; } InterfaceStats; /* AS statistics */ typedef struct astats { u_short as_id; time_t lastUpdate; Counter totPktsSinceLastRRDDump; TrafficCounter inBytes, outBytes, inPkts, outPkts; TrafficCounter selfBytes, selfPkts; struct astats *next; } AsStats; typedef struct { u_int32_t address[4]; /* [0]=network, [1]=mask, [2]=broadcast, [3]=mask_v6 */ } NetworkStats; #define MAX_INTERFACE_STATS_QUEUE_LEN 32 typedef struct optionTemplate { u_int16_t templateId; struct optionTemplate *next; } OptionTemplate; typedef struct netFlowGlobals { u_char netFlowDebug; /* Flow Storage */ char *dumpPath; u_short dumpInterval; time_t dumpFdCreationTime; FILE *dumpFd; /* Flow reception */ AggregationType netFlowAggregation; int netFlowInSocket, netFlowDeviceId; #ifdef HAVE_SCTP int netFlowInSctpSocket; #endif u_short netFlowInPort; struct in_addr netFlowIfAddress, netFlowIfMask; char *netFlowWhiteList, *netFlowBlackList; u_long numNetFlowsPktsRcvd, numNetFlowsV5Rcvd; u_long numNetFlowsV1Rcvd, numNetFlowsV7Rcvd, numNetFlowsV9Rcvd, numNetFlowsProcessed; u_long numNetFlowsRcvd, lastNumNetFlowsRcvd; u_long totalNetFlowsTCPSize, totalNetFlowsUDPSize, totalNetFlowsICMPSize, totalNetFlowsOtherSize; u_long numNetFlowsTCPRcvd, numNetFlowsUDPRcvd, numNetFlowsICMPRcvd, numNetFlowsOtherRcvd; u_long numBadNetFlowsVersionsRcvd, numBadFlowPkts, numBadFlowBytes, numBadFlowReality; u_long numSrcNetFlowsEntryFailedBlackList, numSrcNetFlowsEntryFailedWhiteList, numSrcNetFlowsEntryAccepted, numDstNetFlowsEntryFailedBlackList, numDstNetFlowsEntryFailedWhiteList, numDstNetFlowsEntryAccepted; u_long numNetFlowsV9TemplRcvd, numNetFlowsV9BadTemplRcvd, numNetFlowsV9UnknTemplRcvd, numNetFlowsV9OptionFlowsRcvd; /* Stats */ ProbeInfo probeList[MAX_NUM_PROBES]; InterfaceStats *ifStats; NetworkStats whiteNetworks[MAX_NUM_NETWORKS], blackNetworks[MAX_NUM_NETWORKS]; u_short numWhiteNets, numBlackNets; u_int32_t flowProcessed; Counter flowProcessedBytes; HostTraffic *dummyHost; FlowSetV9 *templates; OptionTemplate *optionTemplates; pthread_t netFlowThread; int threadActive; PthreadMutex whiteblackListMutex, ifStatsMutex; #ifdef HAVE_SNMP pthread_t netFlowUtilsThread; InterfaceStats *ifStatsQueue[MAX_INTERFACE_STATS_QUEUE_LEN]; u_short ifStatsQueue_len; PthreadMutex ifStatsQueueMutex; ConditionalVariable ifStatsQueueCondvar; #endif } NetFlowGlobals; /* *********************************** */ #define MAX_NUM_SFLOW_INTERFACES 4096 typedef struct ifCounters { u_int32_t ifIndex; u_int32_t ifType; u_int64_t ifSpeed; u_int32_t ifDirection; /* Derived from MAU MIB (RFC 2668) 0 = unknown, 1 = full-duplex, 2 = half-duplex, 3 = in, 4 = out */ u_int32_t ifStatus; /* bit field with the following bits assigned: bit 0 = ifAdminStatus (0 = down, 1 = up) bit 1 = ifOperStatus (0 = down, 1 = up) */ u_int64_t ifInOctets; u_int32_t ifInUcastPkts; u_int32_t ifInMulticastPkts; u_int32_t ifInBroadcastPkts; u_int32_t ifInDiscards; u_int32_t ifInErrors; u_int32_t ifInUnknownProtos; u_int64_t ifOutOctets; u_int32_t ifOutUcastPkts; u_int32_t ifOutMulticastPkts; u_int32_t ifOutBroadcastPkts; u_int32_t ifOutDiscards; u_int32_t ifOutErrors; u_int32_t ifPromiscuousMode; struct ifCounters *next; } IfCounters; typedef struct sFlowGlobals { u_char sflowDebug; /* Flow reception */ AggregationType sflowAggregation; int sflowInSocket, sflowDeviceId; u_char sflowAssumeFTP; u_short sflowInPort; struct in_addr sflowIfAddress, sflowIfMask; char *sflowWhiteList, *sflowBlackList; u_long numsFlowsPktsRcvd; u_long numsFlowsV2Rcvd, numsFlowsV4Rcvd, numsFlowsV5Rcvd, numsFlowsProcessed; u_long numsFlowsSamples, numsFlowCounterUpdates; u_long numBadsFlowsVersionsRcvd, numBadFlowReality; u_long numSrcsFlowsEntryFailedBlackList, numSrcsFlowsEntryFailedWhiteList, numSrcsFlowsEntryAccepted, numDstsFlowsEntryFailedBlackList, numDstsFlowsEntryFailedWhiteList, numDstsFlowsEntryAccepted; /* Stats */ ProbeInfo probeList[MAX_NUM_PROBES]; NetworkStats whiteNetworks[MAX_NUM_NETWORKS], blackNetworks[MAX_NUM_NETWORKS]; u_short numWhiteNets, numBlackNets; u_int32_t flowProcessed; Counter flowProcessedBytes; HostTraffic *dummyHost; pthread_t sflowThread; int threadActive; PthreadMutex whiteblackListMutex; u_long numSamplesReceived, initialPool, lastSample; u_int32_t flowSampleSeqNo, numSamplesToGo; IfCounters *ifCounters; } SflowGlobals; /* *********************************** */ typedef struct { u_int hostsno; /* # of valid entries in the following table */ u_int actualHashSize; struct hostTraffic **hash_hostTraffic; u_short hashListMaxLookups; } HostsHashInfo; /* *********************************** */ typedef struct ntopInterface { char *name; /* Interface name (e.g. eth0) */ char *uniqueIfName; /* Unique interface name used to save data on disk */ char *humanFriendlyName; /* Human friendly name of the interface (needed under WinNT and above) */ int flags; /* the status of the interface as viewed by ntop */ u_int32_t addr; /* Internet address (four bytes notation) */ char *ipdot; /* IP address (dot notation) */ char *fqdn; /* FQDN (resolved for humans) */ struct in_addr network; /* network number associated to this interface */ struct in_addr netmask; /* netmask associated to this interface */ u_int numHosts; /* # hosts of the subnet */ struct in_addr ifAddr; /* network number associated to this interface */ #ifdef INET6 NtopIfaceAddr *v6Addrs; #endif time_t started; /* time the interface was enabled to look at pkts */ time_t firstpkt; /* time first packet was captured */ time_t lastpkt; /* time last packet was captured */ pcap_t *pcapPtr; /* LBNL pcap handler */ pcap_dumper_t *pcapDumper; /* LBNL pcap dumper - enabled using the 'l' flag */ pcap_dumper_t *pcapErrDumper; /* LBNL pcap dumper - all suspicious packets are logged */ pcap_dumper_t *pcapOtherDumper;/* LBNL pcap dumper - all "other" (unknown Ethernet and IP) packets are logged */ char virtualDevice; /* set to 1 for virtual devices (e.g. eth0:1) */ char activeDevice; /* Is the interface active (useful for virtual interfaces) */ char dummyDevice; /* set to 1 for 'artificial' devices (e.g. sFlow-device) */ bool hasVLANs; /* Have we seen 802.1q stuff */ u_int32_t deviceSpeed; /* Device speed (0 if speed is unknown) */ int snaplen; /* maximum # of bytes to capture foreach pkt */ /* read timeout in milliseconds */ int datalink; /* data-link encapsulation type (see DLT_* in net/bph.h) */ u_short samplingRate; /* default = 1 */ u_short droppedSamples; /* Number of packets dropped due to sampling, since the last processed pkt */ u_short mtuSize, /* MTU and header, derived from DLT and table in globals-core.c */ headerSize; char *filter; /* user defined filter expression (if any) */ int fd; /* unique identifier (Unix file descriptor) */ PthreadMutex asMutex, counterMutex; AsStats *asStats; /* * NPA - Network Packet Analyzer (main thread) */ PthreadMutex packetQueueMutex; PthreadMutex packetProcessMutex; PacketInformation *packetQueue; /* [CONST_PACKET_QUEUE_LENGTH+1]; */ u_int packetQueueLen, maxPacketQueueLen, packetQueueHead, packetQueueTail; ConditionalVariable queueCondvar; pthread_t dequeuePacketThreadId; /* * The packets section */ TrafficCounter receivedPkts; /* # of pkts recevied by the application */ TrafficCounter droppedPkts; /* # of pkts dropped by the application */ TrafficCounter pcapDroppedPkts; /* # of pkts dropped by libpcap */ TrafficCounter initialPcapDroppedPkts; /* # of pkts dropped by libpcap at startup */ TrafficCounter ethernetPkts; /* # of Ethernet pkts captured by the application */ TrafficCounter broadcastPkts; /* # of broadcast pkts captured by the application */ TrafficCounter multicastPkts; /* # of multicast pkts captured by the application */ TrafficCounter ipPkts; /* # of IP pkts captured by the application */ /* * The bytes section */ TrafficCounter ethernetBytes; /* # bytes captured */ TrafficCounter ipv4Bytes; TrafficCounter fragmentedIpBytes; TrafficCounter tcpBytes; TrafficCounter udpBytes; TrafficCounter otherIpBytes; TrafficCounter icmpBytes; TrafficCounter stpBytes; /* Spanning Tree */ TrafficCounter ipsecBytes; TrafficCounter netbiosBytes; TrafficCounter arpRarpBytes; TrafficCounter greBytes; TrafficCounter ipv6Bytes; TrafficCounter icmp6Bytes; TrafficCounter otherBytes; TrafficCounter *ipProtosList; /* List of myGlobals.numIpProtosList entries */ PortCounter **ipPorts; /* [MAX_IP_PORT] */ TrafficCounter lastMinEthernetBytes; TrafficCounter lastFiveMinsEthernetBytes; TrafficCounter lastMinEthernetPkts; TrafficCounter lastFiveMinsEthernetPkts; TrafficCounter lastNumEthernetPkts; TrafficCounter lastEthernetPkts; TrafficCounter lastTotalPkts; TrafficCounter lastBroadcastPkts; TrafficCounter lastMulticastPkts; TrafficCounter lastEthernetBytes; TrafficCounter lastIpBytes; TrafficCounter lastNonIpBytes; PacketStats rcvdPktStats; /* statistics from start of the run to time of call */ TTLstats rcvdPktTTLStats; float peakThroughput, actualThpt, lastMinThpt, lastFiveMinsThpt; float peakPacketThroughput, actualPktsThpt, lastMinPktsThpt, lastFiveMinsPktsThpt; time_t lastThptUpdate, lastMinThptUpdate; time_t lastHourThptUpdate, lastFiveMinsThptUpdate; float throughput; float packetThroughput; unsigned long numThptSamples; TopTalkers last60MinTopTalkers[60], last24HoursTopTalkers[24]; SimpleProtoTrafficInfo tcpGlobalTrafficStats, udpGlobalTrafficStats, icmpGlobalTrafficStats; SecurityDeviceProbes securityPkts; TrafficCounter numEstablishedTCPConnections; /* = # really established connections */ pthread_t pcapDispatchThreadId; HostsHashInfo hosts; /* ************************** */ IPSession **sessions; u_int numSessions, maxNumSessions; /* ************************** */ NetFlowGlobals *netflowGlobals; /* NetFlow */ SflowGlobals *sflowGlobals; /* sFlow */ /* ********************* */ struct { PthreadMutex l7Mutex; struct ipoque_detection_module_struct *l7handler; Counter *protoTraffic; } l7; } NtopInterface; /* *********************************** */ typedef struct processInfo { char marker; /* internal use only */ char *command, *user; time_t firstSeen, lastSeen; int pid; TrafficCounter bytesSent, bytesRcvd; /* peers that talked with this process */ HostSerial contactedIpPeersSerials[MAX_NUM_CONTACTED_PEERS]; u_int contactedIpPeersIdx; } ProcessInfo; /* *********************************** */ typedef struct processInfoList { ProcessInfo *element; struct processInfoList *next; } ProcessInfoList; typedef union { HEADER qb1; u_char qb2[PACKETSZ]; } querybuf; typedef struct { char queryName[MAXDNAME]; /* original name queried */ int queryType; /* type of original query */ char name[MAXDNAME]; /* official name of host */ char aliases[MAX_ALIASES][MAXDNAME]; /* alias list */ u_int32_t addrList[MAX_ADDRESSES]; /* list of addresses from name server */ int addrType; /* host address type */ int addrLen; /* length of address */ } DNSHostInfo; /* ****************************** NOTE: Most of the code below has been borrowed from tcpdump. ****************************** */ /* RFC 951 */ typedef struct bootProtocol { unsigned char bp_op; /* packet opcode/message type. 1 = BOOTREQUEST, 2 = BOOTREPLY */ unsigned char bp_htype; /* hardware addr type - RFC 826 */ unsigned char bp_hlen; /* hardware addr length (6 for 10Mb Ethernet) */ unsigned char bp_hops; /* gateway hops (server set) */ u_int32_t bp_xid; /* transaction ID (random) */ unsigned short bp_secs; /* seconds elapsed since client started trying to boot */ unsigned short bp_flags; /* flags (not much used): 0x8000 is broadcast */ struct in_addr bp_ciaddr; /* client IP address */ struct in_addr bp_yiaddr; /* 'your' (client) IP address */ struct in_addr bp_siaddr; /* server IP address */ struct in_addr bp_giaddr; /* relay IP address */ unsigned char bp_chaddr[16]; /* client hardware address (optional) */ unsigned char bp_sname[64]; /* server host name */ unsigned char bp_file[128]; /* boot file name */ unsigned char bp_vend[256]; /* vendor-specific area - RFC 1048 */ } BootProtocol; /* ******************************************* */ /* * The definitions below have been copied * from llc.h that's part of tcpdump * */ struct llc { u_char dsap; u_char ssap; union { u_char u_ctl; u_short is_ctl; struct { u_char snap_ui; u_char snap_pi[5]; } snap; struct { u_char snap_ui; u_char snap_orgcode[3]; u_char snap_ethertype[2]; } snap_ether; } ctl; }; /* ******************************* */ typedef struct { u_int16_t checksum, length; u_int8_t hops, packetType; u_char destNw[4], destNode[6]; u_int16_t dstSocket; u_char srcNw[4], srcNode[6]; u_int16_t srcSocket; } IPXpacket; struct enamemem { u_short e_addr0; u_short e_addr1; u_short e_addr2; char *e_name; u_char *e_nsap; /* used only for nsaptable[] */ struct enamemem *e_nxt; }; /* **************** Plugin **************** */ typedef void(*VoidFunct)(u_char /* 0=term plugin, 1=term ntop */); typedef int(*IntFunct)(void); typedef void(*PluginFunct)(u_char *_deviceId, const struct pcap_pkthdr *h, const u_char *p); typedef void(*PluginHTTPFunct)(char* url); typedef void(*PluginCreateDeleteFunct)(HostTraffic*, u_short, u_char); typedef struct extraPage { /* url and description of extra page (if any) for a plugin */ char *icon; char *url; char *descr; } ExtraPage; typedef enum { NoViewNoConfigure = 0, ViewOnly, ConfigureOnly, ViewConfigure } PluginViewConfigure; typedef struct pluginInfo { /* Plugin Info */ char *pluginNtopVersion; /* Version of ntop for which the plugin was compiled */ char *pluginName; /* Short plugin name (e.g. icmpPlugin) */ char *pluginDescr; /* Long plugin description */ char *pluginVersion; char *pluginAuthor; char *pluginURLname; /* Set it to NULL if the plugin doesn't speak HTTP */ char activeByDefault; /* Set it to 1 if this plugin is active by default */ PluginViewConfigure viewConfigureFlag; char inactiveSetup; /* Set it to 1 if this plugin can be called inactive for setup */ IntFunct startFunct; VoidFunct termFunct; PluginFunct pluginFunct; /* Initialize here all the plugin structs... */ PluginHTTPFunct httpFunct; /* Set it to NULL if the plugin doesn't speak HTTP */ PluginCreateDeleteFunct crtDltFunct; /* Called whenever a host is created/deleted */ char* bpfFilter; /* BPF filter for selecting packets that will be routed to the plugin */ char *pluginStatusMessage; ExtraPage *extraPages; /* other pages this responds to */ } PluginInfo; typedef struct pluginStatus { PluginInfo *pluginPtr; void *pluginMemoryPtr; /* ptr returned by dlopen() */ char activePlugin; } PluginStatus; /* Flow Filter List */ typedef struct flowFilterList { char* flowName; struct bpf_program *fcode; /* compiled filter code one for each device */ struct flowFilterList *next; /* next element (linked list) */ TrafficCounter bytes, packets; PluginStatus pluginStatus; } FlowFilterList; typedef struct sessionInfo { HostAddr sessionHost; u_short sessionPort; time_t creationTime; char *session_info; } SessionInfo; typedef struct hostAddress { unsigned int numAddr; char* symAddr; } HostAddress; /* *********************** */ /* Appletalk Datagram Delivery Protocol */ typedef struct atDDPheader { u_int16_t datagramLength, ddpChecksum; u_int16_t dstNet, srcNet; u_char dstNode, srcNode; u_char dstSocket, srcSocket; u_char ddpType; } AtDDPheader; /* Appletalk Name Binding Protocol */ typedef struct atNBPheader { u_char function, nbpId; } AtNBPheader; /* *********************** */ typedef struct usersTraffic { char* userName; Counter bytesSent, bytesRcvd; } UsersTraffic; /* **************************** */ typedef struct transactionTime { u_int16_t transactionId; struct timeval theTime; } TransactionTime; /* **************************** */ /* Packet buffer */ struct pbuf { struct pcap_pkthdr h; u_char b[sizeof(unsigned int)]; /* actual size depend on snaplen */ }; /* **************************** */ typedef struct badGuysAddr { HostAddr addr; time_t lastBadAccess; u_int16_t count; } BadGuysAddr; /* ******** Token Ring ************ */ #if defined(WIN32) && !defined (__GNUC__) typedef unsigned char u_int8_t; typedef unsigned short u_int16_t; #endif /* WIN32 */ struct tokenRing_header { u_int8_t trn_ac; /* access control field */ u_int8_t trn_fc; /* field control field */ u_int8_t trn_dhost[6]; /* destination host */ u_int8_t trn_shost[6]; /* source host */ u_int16_t trn_rcf; /* route control field */ u_int16_t trn_rseg[8]; /* routing registers */ }; struct tokenRing_llc { u_int8_t dsap; /* destination SAP */ u_int8_t ssap; /* source SAP */ u_int8_t llc; /* LLC control field */ u_int8_t protid[3]; /* protocol id */ u_int16_t ethType; /* ethertype field */ }; /* ******** ANY ************ */ typedef struct anyHeader { u_int16_t pktType; u_int16_t llcAddressType; u_int16_t llcAddressLen; u_char ethAddress[LEN_ETHERNET_ADDRESS]; u_int16_t pad; u_int16_t protoType; } AnyHeader; /* ******** FDDI ************ */ typedef struct fddi_header { u_char fc; /* frame control */ u_char dhost[6]; /* destination host */ u_char shost[6]; /* source host */ } FDDI_header; #define FDDI_HDRLEN (sizeof(struct fddi_header)) /* ************ GRE (Generic Routing Encapsulation) ************* */ typedef struct greTunnel { u_int16_t flags, protocol; u_int16_t payload, callId; u_int32_t seqAckNumber; } GreTunnel; /* ************ PPP ************* */ typedef struct pppTunnelHeader { u_int16_t unused, protocol; } PPPTunnelHeader; /* ******** Cisco ISL ************ */ typedef struct islHeader { u_char dstEthAddress[LEN_ETHERNET_ADDRESS]; u_char srcEthAddress[LEN_ETHERNET_ADDRESS]; u_int16_t len; u_int8_t dap, ssap, control; u_char hsa[3]; u_int16_t vlanId, idx, notUsed; } IslHeader; /* ******************************** */ typedef struct serialCacheEntry { char isMAC; char data[17]; u_long creationTime; } SerialCacheEntry; #ifndef HAVE_GETOPT_H struct option { char *name; int has_arg; int *flag; int val; }; #endif /* HAVE_GETOPT_H */ /* *************************************************************** */ typedef enum { showAllHosts = 0, showOnlyLocalHosts, showOnlyRemoteHosts } HostsDisplayPolicy; /* *************************************************************** */ typedef enum { showSentReceived = 0, showOnlySent, showOnlyReceived } LocalityDisplayPolicy; /* *************************************************************** */ typedef enum { showPrefBasicPref = 1, showPrefDisplayPref, showPrefIPPref, showPrefAdvPref, showPrefDbgPref, } UserPrefDisplayPage; /* *********************************** */ #ifdef WIN32 #define mode_t int #endif #ifdef WIN32 #define ntop_mkdir(a, b) _mkdir(a) #else #define ntop_mkdir(a, b) mkdir(a, b) #endif #define BROADCAST_HOSTS_ENTRY 0 #define OTHER_HOSTS_ENTRY 1 #define FIRST_HOSTS_ENTRY 2 /* first available host entry */ /* * Preferences settable by a user, from the web page & cmd line * */ typedef struct _userPref { char *accessLogFile; /* -a |--access-log-file */ bool enablePacketDecoding; /* -b | --disable-decoders */ bool stickyHosts; /* -c | --sticky-hosts */ bool daemonMode; /* -d | --daemon */ int maxNumLines; /* -e | --max-table-rows */ bool trackOnlyLocalHosts; /* -g | --track-local-hosts */ char *devices; /* -i | --interface */ char *pcapLog; /* -l | --pcap-log */ char *localAddresses; /* -m | --local-subnets */ DnsResolutionMode numericFlag; /* -n | --numeric-ip-addresses */ char *protoSpecs; /* -p | --protocols */ bool enableSuspiciousPacketDump; /* -q | --create-suspicious-packets */ int refreshRate; /* -r | --refresh-time */ bool disablePromiscuousMode; /* -s | --no-promiscuous */ int traceLevel; /* -t | --trace-level */ char *mapperURL; /* -U | --disable-mapper */ u_int maxNumHashEntries; /* -x */ u_int maxNumSessions; /* -X */ char *webAddr; /* -w | --http-serveraddress[:port] */ int webPort; int ipv4or6; /* -6 -4 */ bool enableSessionHandling; /* -z | --disable-sessions */ char *currentFilterExpression; /* -B | --filter-expression */ u_short samplingRate; /* -C | --sampling-rate */ char domainName[MAXHOSTNAMELEN]; /* -D | --domain */ char *flowSpecs; /* -F | --flow-spec */ bool debugMode; /* -K | --enable-debug */ #ifndef WIN32 int useSyslog; /* -L | --use-syslog*/ #endif bool mergeInterfaces; /* -M | --no-interface-merge */ bool enableL7; /* Enable/disable l7 protocol pattern matching */ char *pcapLogBasePath; /* -O | --pcap-file-path */ /* Added by Ola Lundqvist . */ #ifdef HAVE_OPENSSL char *sslAddr; /* -W | --https-serveraddress[:port] */ int sslPort; #endif bool w3c; /* --w3c '136' */ char *P3Pcp; /* --p3p-cp '137' */ char *P3Puri; /* --p3p-uri '138' */ char *instance; /* --instance '140' */ char *logo; bool disableStopcap; /* --disable-stopcap '142' */ bool disableMutexExtraInfo; /* --disable-mutexextrainfo '145' */ bool disablenDPI; /* --disable-ndpi '146' */ bool disablePython; /* --disable-python '147' */ bool skipVersionCheck; /* --skip-version-check '150' */ char *knownSubnets; /* --known-subnets '151' */ } UserPref; typedef struct ntopGlobals { /* How is ntop run? */ char *program_name; /* The name the program was run with, stripped of any leading path */ int basentoppid; /* Used for writing to /var/run/ntop.pid (or whatever) */ int childntoppid; /* Zero unless we're in a child */ #ifndef WIN32 char pidFileName[NAME_MAX]; #endif char *startedAs; /* ACTUAL starting line, not the resolved one */ int ntop_argc; /* # of command line arguments */ char **ntop_argv; /* vector of command line arguments */ /* search paths - set in globals-core.c from CFG_ constants set in ./configure */ char **dataFileDirs; char **pluginDirs; char **configFileDirs; /* User-configurable parameters via the command line and the web page. */ UserPref savedPref; /* this is what is saved */ UserPref runningPref; /* this is what is currently used */ #ifndef WIN32 char *effectiveUserName; int userId, groupId; /* 'u' */ #endif char *dbPath; /* 'P' */ char *spoolPath; /* 'Q' */ struct fileList *pcap_file_list; /* --pcap-file-list */ /* Other flags (these could set via command line options one day) */ HostsDisplayPolicy hostsDisplayPolicy; LocalityDisplayPolicy localityDisplayPolicy; int securityItemsLoaded; char *securityItems[MAX_NUM_PWFILE_ENTRIES]; /* Results flags - something we've learned */ bool haveASN, haveVLANs; /* Physical and Logical network interfaces */ pcap_if_t *allDevs; /* all devices available for pcap_open */ u_short numDevices; /* total network interfaces */ NtopInterface *device; /* pointer to the network interfaces table */ /* Database */ GDBM_FILE pwFile, prefsFile, macPrefixFile, fingerprintFile, serialFile, topTalkersFile, resolverCacheFile; /* the table of broadcast entries */ HostTraffic *broadcastEntry; /* the table of other hosts entries */ HostTraffic *otherHostEntry; /* Host serial */ u_int32_t hostSerialCounter; /* Administrative */ char *shortDomainName; #if defined(MAX_NUM_BAD_IP_ADDRESSES) && (MAX_NUM_BAD_IP_ADDRESSES > 0) BadGuysAddr weDontWantToTalkWithYou[MAX_NUM_BAD_IP_ADDRESSES]; #endif /* Multi-thread related */ unsigned short numThreads; /* # of running threads */ pthread_t mainThreadId; /* * Purge database */ pthread_t purgeDbThreadId; /* * HTS - Hash Purge */ PthreadMutex purgeMutex; /* * HTS - Host Traffic Statistics */ PthreadMutex hostsHashLockMutex; PthreadMutex hostsHashMutex[CONST_HASH_INITIAL_SIZE]; volatile u_short hostsHashMutexNumLocks[CONST_HASH_INITIAL_SIZE]; /* Host Serial */ PthreadMutex serialLockMutex; /* * SIH - Scan Idle Hosts - optional */ pthread_t scanIdleThreadId; /* * SFP - Scan Fingerprints */ pthread_t scanFingerprintsThreadId; time_t nextFingerprintScan; /* * DNSAR - DNS Address Resolution - optional */ PthreadMutex addressResolutionMutex; u_int numDequeueAddressThreads; pthread_t dequeueAddressThreadId[MAX_NUM_DEQUEUE_ADDRESS_THREADS]; ConditionalVariable queueAddressCondvar; /* * Control mutexes */ PthreadMutex gdbmMutex, portsMutex; PthreadMutex sessionsMutex[NUM_SESSION_MUTEXES]; PthreadMutex purgePortsMutex; PthreadMutex securityItemsMutex; #ifdef FORPRENPTL PthreadMutex preNPTLlogMutex; #endif pthread_t handleWebConnectionsThreadId; /* SSL support */ #ifdef HAVE_OPENSSL int sslInitialized; SSL_CTX* ctx; SSL_connection ssl[MAX_SSL_CONNECTIONS]; #endif /* HAVE_OPENSSL */ /* ntop state - see flags in globals-defines.h */ short ntopRunState; u_char resetHashNow; /* used for hash reset */ /* Filter Chains */ FlowFilterList *flowsList; /* Address Resolution */ u_long dnsSniffCount, dnsSniffRequestCount, dnsSniffFailedCount, dnsSniffARPACount, dnsSniffStoredInCache; u_int addressQueuedCurrent, addressQueuedMax, addressUnresolvedDrops, resolvedAddresses, failedResolvedAddresses; #ifdef PARM_USE_HOST u_long numResolvedFromHostAddresses; #endif /* Misc */ char *separator; /* html separator */ volatile unsigned long numHandledSIGPIPEerrors; u_short checkVersionStatus; time_t checkVersionStatusAgain; /* Purge */ Counter numPurgedHosts, numTerminatedSessions; /* Time */ int32_t thisZone; /* seconds offset from gmt to local time */ time_t actTime, initialSniffTime, lastRefreshTime; struct timeval lastPktTime; /* Monitored Protocols */ int numActServices; /* # of protocols being monitored (as stated by the protocol file) */ ServiceEntry **udpSvc, **tcpSvc; /* the pointers to the tables of TCP/UDP Protocols to monitor */ u_short numIpProtosToMonitor; char **ipTrafficProtosNames; /* Protocols */ u_short numIpProtosList; ProtocolsList *ipProtosList; /* IP Ports */ PortProtoMapperHandler ipPortMapper; /* Packet Capture */ Counter receivedPackets, receivedPacketsProcessed, receivedPacketsQueued, receivedPacketsLostQ; TransactionTime transTimeHash[CONST_NUM_TRANSACTION_ENTRIES]; u_char dummyEthAddress[LEN_ETHERNET_ADDRESS]; u_short *mtuSize, *headerSize; /* (Pseudo) Local Networks */ NetworkStats localNetworks[MAX_NUM_NETWORKS]; u_short numLocalNetworks; /* All known Networks */ NetworkStats subnetStats[MAX_NUM_INTERFACE_NETWORKS]; u_short numKnownSubnets; #if defined(MEMORY_DEBUG) && (MEMORY_DEBUG == 3) size_t allocatedMemory; #endif u_char webInterfaceDisabled; int enableIdleHosts; /* Purging of idle hosts support enabled by default */ int actualReportDeviceId; short columnSort, reportKind, sortFilter; int sock, newSock; #ifdef HAVE_OPENSSL int sock_ssl; #endif int numChildren; /* rrd */ char *rrdPath, *rrdVolatilePath; mode_t rrdDirectoryPermissions, rrdUmask; /* http.c */ FILE *accessLogFd; unsigned long numHandledRequests[2]; unsigned long numHandledBadrequests[2]; unsigned long numSuccessfulRequests[2]; unsigned long numUnsuccessfulInvalidrequests[2]; unsigned long numUnsuccessfulInvalidmethod[2]; unsigned long numUnsuccessfulInvalidversion[2]; unsigned long numUnsuccessfulTimeout[2]; unsigned long numUnsuccessfulNotfound[2]; unsigned long numUnsuccessfulDenied[2]; unsigned long numUnsuccessfulForbidden[2]; unsigned long numSSIRequests, numBadSSIRequests, numHandledSSIRequests; u_short webServerRequestQueueLength; /* Hash table collisions - counted during use */ int hashCollisionsLookup; /* Vendor lookup file */ int numVendorLookupRead, numVendorLookupAdded, numVendorLookupAddedSpecial, numVendorLookupCalls, numVendorLookupSpecialCalls, numVendorLookupFound48bit, numVendorLookupFound24bit, numVendorLookupFoundMulticast, numVendorLookupFoundLAA; /* Memory usage */ int piMem, ippmtmMem; /* LogView */ char ** logView; /* vector of log messages */ int logViewNext; PthreadMutex logViewMutex; int multipleVLANedHostCount; #ifdef MAX_PROCESS_BUFFER float queueBuffer[MAX_PROCESS_BUFFER], processBuffer[MAX_PROCESS_BUFFER]; int queueBufferInit, queueBufferCount, processBufferInit, processBufferCount; float qmaxDelay, pmaxDelay; #endif #ifdef PARM_ENABLE_EXPERIMENTAL u_short experimentalFlagSet; /* Is the 'experimental' flag set? */ #endif /* If the traffic is divided in cells (e.g. ATM, cell payload is 47 bytes) this is the cell lenght */ u_int16_t cellLength; /* GeoIP */ GeoIP *geo_ip_db, *geo_ip_asn_db; PthreadMutex geolocalizationMutex; /* Event Handling */ u_int32_t event_mask; char *event_log; /* RRD */ time_t rrdTime; /* Message display */ u_char lowMemoryMsgShown; struct { u_short numSupportedProtocols; u_int16_t flow_struct_size, proto_size; } l7; } NtopGlobals; ntop-5.0.1+dfsg1/ssl_utils.c0000644000000000000000000002436411721027165014373 0ustar rootroot/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * http://www.ntop.org * * Copyright (C) 1998-2012 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * */ #include "ntop.h" #ifdef HAVE_OPENSSL #include int verify_callback(int ok, X509_STORE_CTX *ctx); void ntop_ssl_error_report(char * whyMe) { unsigned long l; char buf[200]; const char *file,*data; int line,flags; unsigned long es; if(myGlobals.newSock != 0) { if(SSL_get_error(getSSLsocket(myGlobals.newSock), -1) == SSL_ERROR_SSL) return; /* Internale OpenSSL failure: can't do much */ } es = CRYPTO_thread_id(); while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)) != 0) { ERR_error_string_n(l, buf, sizeof buf); traceEvent(CONST_TRACE_INFO, "SSL(%s)ERROR [Thread %lu]: %s at %s(%d) %s", whyMe, es, buf, file, line, (flags&ERR_TXT_STRING)?data:""); } } int init_ssl(void) { int idx; FILE* fd=NULL; char buf [384]; SSL_METHOD *meth; int s_server_session_id_context = 1; /* anything will do */ DIR* directoryPointer=NULL; struct dirent *dp; struct stat fStat; myGlobals.sslInitialized = 0; if(myGlobals.runningPref.sslPort == 0) { traceEvent(CONST_TRACE_INFO, "SSL is present but https is disabled: use -W for enabling it"); return(0); /* The user decided NOT to use SSL */ } memset(myGlobals.ssl, 0, sizeof(myGlobals.ssl)); traceEvent(CONST_TRACE_INFO, "SSL: Initializing..."); /* * If necessary, initialize the prng for ssl... */ if (RAND_status() == 0) { struct timeval TOD; /* * If we get here, we need to add some entropy, because it's not there by default * and because we don't have egd running. * * Remember, this is ntop during startup, so we can't just use ntop counters... * * We need some stuff that's random from ntop user/instance to ntop user/instance * and some stuff the user just can't affect. * * We have to be careful, as some things that might seem random, such as pid# * aren't if ntop is started during boot. OTOP, if the user won't run egd, then * well, there's only so much we're going to do... */ traceEvent(CONST_TRACE_INFO, "SSL_PRNG: Initializing."); traceEvent(CONST_TRACE_NOISY, "SSL_PRNG: see http://www.openssl.org/support/faq.cgi#USER1."); RAND_add(version, strlen(version), (double)4.0); RAND_add(buildDate, strlen(buildDate), (double)4.0); RAND_add(configure_parameters, strlen(configure_parameters), (double)4.0); gettimeofday(&TOD, NULL); safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%d%u%u%x%x%x", getpid(), TOD.tv_sec, TOD.tv_usec, myGlobals.startedAs, myGlobals.udpSvc, myGlobals.tcpSvc ); RAND_add(buf, strlen(buf), (double)24.0); directoryPointer = opendir(myGlobals.dbPath); if (directoryPointer == NULL) { traceEvent(CONST_TRACE_WARNING, "SSL_PRNG: Unable to find directory '%s' for additional randomness", myGlobals.dbPath); } else { while((dp = readdir(directoryPointer)) != NULL) { if (dp->d_name[0] != '.') { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/%s", myGlobals.dbPath, dp->d_name); if (stat(buf, &fStat) == 0) { RAND_add(&fStat, sizeof(fStat), (double)16.0); } } } closedir(directoryPointer); } if (RAND_status() == 0) { traceEvent(CONST_TRACE_WARNING, "SSL_PRNG: Unsuccessfully initialized - https:// may not work."); } else { traceEvent(CONST_TRACE_INFO, "SSL_PRNG: Successfully initialized."); } } else { traceEvent(CONST_TRACE_INFO, "SSL_PRNG: Automatically initialized!"); } for(idx=0; myGlobals.configFileDirs[idx] != NULL; idx++) { safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%s/%s", myGlobals.configFileDirs[idx], CONST_SSL_CERTF_FILENAME); revertSlashIfWIN32(buf, 0); if((fd = fopen(buf, "rb")) != NULL) break; } if(fd == NULL) { traceEvent(CONST_TRACE_WARNING, "SSL: Unable to find certificate '%s'. SSL support has been disabled", CONST_SSL_CERTF_FILENAME); return(-1); } else fclose(fd); SSL_load_error_strings(); SSL_library_init(); OpenSSL_add_ssl_algorithms(); #if (OPENSSL_VERSION_NUMBER < 0x00905100l) needs_openssl_095_or_later(); #endif meth = (SSL_METHOD*)SSLv23_server_method(); myGlobals.ctx = SSL_CTX_new(meth); if (!myGlobals.ctx) { ntop_ssl_error_report("ssl_init-server_method"); return(2); } SSL_CTX_set_options(myGlobals.ctx, SSL_OP_ALL); /* Enable the work-arounds */ SSL_CTX_set_options(myGlobals.ctx, SSL_OP_NO_TLSv1); if ((!SSL_CTX_load_verify_locations(myGlobals.ctx, NULL, NULL)) || (!SSL_CTX_set_default_verify_paths(myGlobals.ctx))) { ntop_ssl_error_report("ssl_init-verify"); } SSL_CTX_set_session_id_context(myGlobals.ctx, (void*)&s_server_session_id_context, sizeof s_server_session_id_context); SSL_CTX_set_client_CA_list(myGlobals.ctx,SSL_load_client_CA_file(NULL)); if (SSL_CTX_use_certificate_file(myGlobals.ctx, buf, SSL_FILETYPE_PEM) <= 0) { ntop_ssl_error_report("ssl_init-use_cert"); return(3); } if (SSL_CTX_use_PrivateKey_file(myGlobals.ctx, buf, SSL_FILETYPE_PEM) <= 0) { ntop_ssl_error_report("ssl_init-use_pvtkey"); return(4); } if (!SSL_CTX_check_private_key(myGlobals.ctx)) { traceEvent(CONST_TRACE_ERROR, "Private key does not match the certificate public key"); return(5); } myGlobals.sslInitialized=1; traceEvent(CONST_TRACE_INFO, "SSL initialized successfully"); return(0); } /* ********************* */ static int init_ssl_connection(SSL *con) { int i; long verify_error; if(!myGlobals.sslInitialized) return(0); if ((i=SSL_accept(con)) <= 0) { #ifdef DEBUG traceEvent(CONST_TRACE_INFO, "SSL_accept: %d", i); #endif if (BIO_sock_should_retry(i)) return(1); verify_error=SSL_get_verify_result(con); if (verify_error != X509_V_OK) { traceEvent(CONST_TRACE_WARNING, "verify error:%s", X509_verify_cert_error_string(verify_error)); } else ntop_ssl_error_report("ssl_init_connection"); return(0); } #ifdef DEBUG { /* the following declarations are needed to put debug mode to work */ X509 *peer; char *str, buf[BUFSIZ]; peer=SSL_get_peer_certificate(con); if(peer != NULL) { traceEvent(CONST_TRACE_INFO, "Client certificate"); X509_NAME_oneline(X509_get_subject_name(peer),buf,BUFSIZ); traceEvent(CONST_TRACE_INFO, "subject=%s",buf); X509_NAME_oneline(X509_get_issuer_name(peer),buf,BUFSIZ); traceEvent(CONST_TRACE_INFO, "issuer=%s",buf); X509_free(peer); } if (SSL_get_shared_ciphers(con,buf,BUFSIZ) != NULL) traceEvent(CONST_TRACE_INFO, "Shared ciphers:%s",buf); str=SSL_CIPHER_get_name(SSL_get_current_cipher(con)); traceEvent(CONST_TRACE_INFO, "CIPHER is %s",(str != NULL)?str:"(NONE)"); if (con->hit) traceEvent(CONST_TRACE_INFO, "Reused session-id"); if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) & TLS1_FLAGS_TLS_PADDING_BUG) traceEvent(CONST_TRACE_WARNING, "Peer has incorrect TLSv1 block padding"); } #endif return(1); } /* ********************* */ int accept_ssl_connection(int fd) { int i; if(!myGlobals.sslInitialized) return(-1); for(i=0; i. When the menu // bar is vertical, they would be put in // a separate TD cell. // HTML code to the left of the folder item mainFolderLeft: '', // HTML code to the right of the folder item mainFolderRight: '', // HTML code to the left of the regular item mainItemLeft: '', // HTML code to the right of the regular item mainItemRight: '', // sub menu display attributes // HTML code to the left of the folder item folderLeft: '', // HTML code to the right of the folder item folderRight: '', // HTML code to the left of the regular item itemLeft: '', // HTML code to the right of the regular item itemRight: '', // cell spacing for main menu mainSpacing: 0, // cell spacing for sub menus subSpacing: 0, // optional settings // If not set, use the default // auto disappear time for submenus in milli-seconds delay: 500, // 1st layer sub menu starting index zIndexStart: 1000, // z-index incremental step for subsequent layers zIndexInc: 5, // sub menu header appears before the sub menu table subMenuHeader: null, // sub menu header appears after the sub menu table subMenuFooter: null, // submenu location adjustments // // offsetHMainAdjust for adjusting the first submenu // of a 'hbr' menu. // offsetVMainAdjust for adjusting the first submenu // of a 'vbr' menu. // offsetSubAdjust for subsequent level of submenus // offsetHMainAdjust: [0, 0], offsetVMainAdjust: [0, 0], offsetSubAdjust: [0, 0], // act on click to open sub menu // not yet implemented // 0 : use default behavior // 1 : hover open in all cases // 2 : click on main, hover on sub // 3 : click open in all cases (illegal as of 1.5) clickOpen: 1, // special effects on open/closing a sub menu effect: null }; // Globals var _cmIDCount = 0; var _cmIDName = 'cmSubMenuID'; // for creating submenu id var _cmTimeOut = null; // how long the menu would stay var _cmCurrentItem = null; // the current menu item being selected; var _cmNoAction = new Object (); // indicate that the item cannot be hovered. var _cmNoClick = new Object (); // similar to _cmNoAction but does not respond to mouseup/mousedown events var _cmSplit = new Object (); // indicate that the item is a menu split var _cmMenuList = new Array (); // a list of the current menus var _cmItemList = new Array (); // a simple list of items var _cmFrameList = new Array (); // a pool of reusable iframes var _cmFrameListSize = 0; // keep track of the actual size var _cmFrameIDCount = 0; // keep track of the frame id var _cmFrameMasking = true; // use the frame masking // disable iframe masking for IE7 /*@cc_on @if (@_jscript_version >= 5.6) if (_cmFrameMasking) { var v = navigator.appVersion; var i = v.indexOf ("MSIE "); if (i >= 0) { if (parseInt (navigator.appVersion.substring (i + 5)) >= 7) _cmFrameMasking = false; } } @end @*/ var _cmClicked = false; // for onClick // flag for turning on off hiding objects // // 0: automatic // 1: hiding // 2: no hiding var _cmHideObjects = 0; // Utility function to do a shallow copy a node property function cmClone (nodeProperties) { var returnVal = new Object (); for (v in nodeProperties) returnVal[v] = nodeProperties[v]; return returnVal; } // // store the new menu information into a structure to retrieve it later // function cmAllocMenu (id, menu, orient, nodeProperties, prefix) { var info = new Object (); info.div = id; info.menu = menu; info.orient = orient; info.nodeProperties = nodeProperties; info.prefix = prefix; var menuID = _cmMenuList.length; _cmMenuList[menuID] = info; return menuID; } // // request a frame // function cmAllocFrame () { if (_cmFrameListSize > 0) return cmGetObject (_cmFrameList[--_cmFrameListSize]); var frameObj = document.createElement ('iframe'); var id = _cmFrameIDCount++; frameObj.id = 'cmFrame' + id; frameObj.frameBorder = '0'; frameObj.style.display = 'none'; frameObj.src = 'javascript:false'; document.body.appendChild (frameObj); frameObj.style.filter = 'alpha(opacity=0)'; frameObj.style.zIndex = 99; frameObj.style.position = 'absolute'; frameObj.style.border = '0'; frameObj.scrolling = 'no'; return frameObj; } // // make a frame resuable later // function cmFreeFrame (frameObj) { _cmFrameList[_cmFrameListSize++] = frameObj.id; } ////////////////////////////////////////////////////////////////////// // // Drawing Functions and Utility Functions // ////////////////////////////////////////////////////////////////////// // // produce a new unique id // function cmNewID () { return _cmIDName + (++_cmIDCount); } // // return the property string for the menu item // function cmActionItem (item, isMain, idSub, menuInfo, menuID) { _cmItemList[_cmItemList.length] = item; var index = _cmItemList.length - 1; idSub = (!idSub) ? 'null' : ('\'' + idSub + '\''); var clickOpen = menuInfo.nodeProperties.clickOpen; var onClick = (clickOpen == 3) || (clickOpen == 2 && isMain); var param = 'this,' + isMain + ',' + idSub + ',' + menuID + ',' + index; var returnStr; if (onClick) returnStr = ' onmouseover="cmItemMouseOver(' + param + ',false)" onmousedown="cmItemMouseDownOpenSub (' + param + ')"'; else returnStr = ' onmouseover="cmItemMouseOverOpenSub (' + param + ')" onmousedown="cmItemMouseDown (' + param + ')"'; return returnStr + ' onmouseout="cmItemMouseOut (' + param + ')" onmouseup="cmItemMouseUp (' + param + ')"'; } // // this one is used by _cmNoClick to only take care of onmouseover and onmouseout // events which are associated with menu but not actions associated with menu clicking/closing // function cmNoClickItem (item, isMain, idSub, menuInfo, menuID) { // var index = _cmItemList.push (item) - 1; _cmItemList[_cmItemList.length] = item; var index = _cmItemList.length - 1; idSub = (!idSub) ? 'null' : ('\'' + idSub + '\''); var param = 'this,' + isMain + ',' + idSub + ',' + menuID + ',' + index; return ' onmouseover="cmItemMouseOver (' + param + ')" onmouseout="cmItemMouseOut (' + param + ')"'; } function cmNoActionItem (item) { return item[1]; } function cmSplitItem (prefix, isMain, vertical) { var classStr = 'cm' + prefix; if (isMain) { classStr += 'Main'; if (vertical) classStr += 'HSplit'; else classStr += 'VSplit'; } else classStr += 'HSplit'; return eval (classStr); } // // draw the sub menu recursively // function cmDrawSubMenu (subMenu, prefix, id, nodeProperties, zIndexStart, menuInfo, menuID) { var str = '
    '; if (nodeProperties.subMenuHeader) str += nodeProperties.subMenuHeader; str += ''; var strSub = ''; var item; var idSub; var hasChild; var i; var classStr; for (i = 5; i < subMenu.length; ++i) { item = subMenu[i]; if (!item) continue; if (item == _cmSplit) item = cmSplitItem (prefix, 0, true); item.parentItem = subMenu; item.subMenuID = id; hasChild = (item.length > 5); idSub = hasChild ? cmNewID () : null; str += ''; if (item[0] != null) str += item[0]; else str += hasChild ? nodeProperties.folderLeft : nodeProperties.itemLeft; str += ''; } str += '
    ' + item[1]; str += ''; if (hasChild) { str += nodeProperties.folderRight; strSub += cmDrawSubMenu (item, prefix, idSub, nodeProperties, zIndexStart + nodeProperties.zIndexInc, menuInfo, menuID); } else str += nodeProperties.itemRight; str += '
    '; if (nodeProperties.subMenuFooter) str += nodeProperties.subMenuFooter; str += '
    ' + strSub; return str; } // // The function that builds the menu inside the specified element id. // // id id of the element // orient orientation of the menu in [hv][ub][lr] format // menu the menu object to be drawn // nodeProperties properties for the theme // prefix prefix of the theme // function cmDraw (id, menu, orient, nodeProperties, prefix) { var obj = cmGetObject (id); if (!prefix) prefix = nodeProperties.prefix; if (!prefix) prefix = ''; if (!nodeProperties) nodeProperties = _cmNodeProperties; if (!orient) orient = 'hbr'; var menuID = cmAllocMenu (id, menu, orient, nodeProperties, prefix); var menuInfo = _cmMenuList[menuID]; // setup potentially missing properties if (!nodeProperties.delay) nodeProperties.delay = _cmNodeProperties.delay; if (!nodeProperties.clickOpen) nodeProperties.clickOpen = _cmNodeProperties.clickOpen; if (!nodeProperties.zIndexStart) nodeProperties.zIndexStart = _cmNodeProperties.zIndexStart; if (!nodeProperties.zIndexInc) nodeProperties.zIndexInc = _cmNodeProperties.zIndexInc; if (!nodeProperties.offsetHMainAdjust) nodeProperties.offsetHMainAdjust = _cmNodeProperties.offsetHMainAdjust; if (!nodeProperties.offsetVMainAdjust) nodeProperties.offsetVMainAdjust = _cmNodeProperties.offsetVMainAdjust; if (!nodeProperties.offsetSubAdjust) nodeProperties.offsetSubAdjust = _cmNodeProperties.offsetSubAdjust; // save user setting on frame masking menuInfo.cmFrameMasking = _cmFrameMasking; var str = ''; var strSub = ''; var vertical; // draw the main menu items if (orient.charAt (0) == 'h') { str += ''; vertical = false; } else { vertical = true; } var i; var item; var idSub; var hasChild; var classStr; for (i = 0; i < menu.length; ++i) { item = menu[i]; if (!item) continue; item.menu = menu; item.subMenuID = id; str += vertical ? ' 5); idSub = hasChild ? cmNewID () : null; str += cmActionItem (item, 1, idSub, menuInfo, menuID) + '>'; if (item == _cmSplit) item = cmSplitItem (prefix, 1, vertical); if (item[0] == _cmNoAction || item[0] == _cmNoClick) { str += cmNoActionItem (item); str += vertical? '' : ''; continue; } classStr = prefix + 'Main' + (hasChild ? 'Folder' : 'Item'); str += vertical ? ''; str += (item[0] == null) ? (hasChild ? nodeProperties.mainFolderLeft : nodeProperties.mainItemLeft) : item[0]; str += vertical ? '' : ''; str += vertical ? ''; str += item[1]; str += vertical ? '' : ''; str += vertical ? ''; str += hasChild ? nodeProperties.mainFolderRight : nodeProperties.mainItemRight; str += vertical ? '' : ''; str += vertical ? '' : ''; if (hasChild) strSub += cmDrawSubMenu (item, prefix, idSub, nodeProperties, nodeProperties.zIndexStart, menuInfo, menuID); } if (!vertical) str += ''; str += '
    ' + strSub; obj.innerHTML = str; } // // The function builds the menu inside the specified element id. // // This function is similar to cmDraw except that menu is taken from HTML node // rather a javascript tree. This feature allows links to be scanned by search // bots. // // This function basically converts HTML node to a javascript tree, and then calls // cmDraw to draw the actual menu, replacing the hidden menu tree. // // Format: // // function cmDrawFromText (id, orient, nodeProperties, prefix) { var domMenu = cmGetObject (id); var menu = null; for (var currentDomItem = domMenu.firstChild; currentDomItem; currentDomItem = currentDomItem.nextSibling) { if (!currentDomItem.tagName) continue; var tag = currentDomItem.tagName.toLowerCase (); if (tag != 'ul' && tag != 'ol') continue; menu = cmDrawFromTextSubMenu (currentDomItem); break; } if (menu) cmDraw (id, menu, orient, nodeProperties, prefix); } // // a recursive function that build menu tree structure // function cmDrawFromTextSubMenu (domMenu) { var items = new Array (); for (var currentDomItem = domMenu.firstChild; currentDomItem; currentDomItem = currentDomItem.nextSibling) { if (!currentDomItem.tagName || currentDomItem.tagName.toLowerCase () != 'li') continue; if (currentDomItem.firstChild == null) { items[items.length] = _cmSplit; continue; } var item = new Array (); var currentItem = currentDomItem.firstChild; var hasAction = false; for (; currentItem; currentItem = currentItem.nextSibling) { // scan for span or div tag if (!currentItem.tagName) continue; if (currentItem.className == 'cmNoClick') { item[0] = _cmNoClick; item[1] = getActionHTML (currentItem); hasAction = true; break; } if (currentItem.className == 'cmNoAction') { item[0] = _cmNoAction; item[1] = getActionHTML (currentItem); hasAction = true; break; } var tag = currentItem.tagName.toLowerCase (); if (tag != 'span') continue; if (!currentItem.firstChild) item[0] = null; else item[0] = currentItem.innerHTML; currentItem = currentItem.nextSibling; break; } if (hasAction) { items[items.length] = item; continue; } if (!currentItem) continue; for (; currentItem; currentItem = currentItem.nextSibling) { if (!currentItem.tagName) continue; var tag = currentItem.tagName.toLowerCase (); if (tag == 'a') { item[1] = currentItem.innerHTML; item[2] = currentItem.href; item[3] = currentItem.target; item[4] = currentItem.title; if (item[4] == '') item[4] = null; } else if (tag == 'span' || tag == 'div') { item[1] = currentItem.innerHTML; item[2] = null; item[3] = null; item[4] = null; } break; } for (; currentItem; currentItem = currentItem.nextSibling) { // scan for span tag if (!currentItem.tagName) continue; var tag = currentItem.tagName.toLowerCase (); if (tag != 'ul' && tag != 'ol') continue; var subMenuItems = cmDrawFromTextSubMenu (currentItem); for (i = 0; i < subMenuItems.length; ++i) item[i + 5] = subMenuItems[i]; break; } items[items.length] = item; } return items; } // // obtain the actual action item's action, which is inside a // table. The first row should be it // function getActionHTML (htmlNode) { var returnVal = ''; var currentDomItem; // find the table first for (currentDomItem = htmlNode.firstChild; currentDomItem; currentDomItem = currentDomItem.nextSibling) { if (currentDomItem.tagName && currentDomItem.tagName.toLowerCase () == 'table') break; } if (!currentDomItem) return returnVal; // skip over tbody for (currentDomItem = currentDomItem.firstChild; currentDomItem; currentDomItem = currentDomItem.nextSibling) { if (currentDomItem.tagName && currentDomItem.tagName.toLowerCase () == 'tbody') break; } if (!currentDomItem) return returnVal; // get the first tr for (currentDomItem = currentDomItem.firstChild; currentDomItem; currentDomItem = currentDomItem.nextSibling) { if (currentDomItem.tagName && currentDomItem.tagName.toLowerCase () == 'tr') break; } if (!currentDomItem) return returnVal; return currentDomItem.innerHTML; } // // get the DOM object associated with the item // function cmGetMenuItem (item) { if (!item.subMenuID) return null; var subMenu = cmGetObject (item.subMenuID); // we are dealing with a main menu item if (item.menu) { var menu = item.menu; // skip over table, tbody, tr, reach td subMenu = subMenu.firstChild.firstChild.firstChild.firstChild; var i; for (i = 0; i < menu.length; ++i) { if (menu[i] == item) return subMenu; subMenu = subMenu.nextSibling; } } else if (item.parentItem) // sub menu item { var menu = item.parentItem; var table = cmGetObject (item.subMenuID + 'Table'); if (!table) return null; // skip over table, tbody, reach tr subMenu = table.firstChild.firstChild; var i; for (i = 5; i < menu.length; ++i) { if (menu[i] == item) return subMenu; subMenu = subMenu.nextSibling; } } return null; } // // disable a menu item // function cmDisableItem (item, prefix) { if (!item) return; var menuItem = cmGetMenuItem (item); if (!menuItem) return; if (item.menu) menuItem.className = prefix + 'MainItemDisabled'; else menuItem.className = prefix + 'MenuItemDisabled'; item.isDisabled = true; } // // enable a menu item // function cmEnableItem (item, prefix) { if (!item) return; var menuItem = cmGetMenuItem (item); if (!menuItem) return; if (item.menu) menu.className = prefix + 'MainItem'; else menu.className = prefix + 'MenuItem'; item.isDisabled = false; } ////////////////////////////////////////////////////////////////////// // // Mouse Event Handling Functions // ////////////////////////////////////////////////////////////////////// // // action should be taken for mouse moving in to the menu item // // Here we just do things concerning this menu item, w/o opening sub menus. // function cmItemMouseOver (obj, isMain, idSub, menuID, index, calledByOpenSub) { if (!calledByOpenSub && _cmClicked) { cmItemMouseOverOpenSub (obj, isMain, idSub, menuID, index); return; } clearTimeout (_cmTimeOut); if (_cmItemList[index].isDisabled) return; var prefix = _cmMenuList[menuID].prefix; if (!obj.cmMenuID) { obj.cmMenuID = menuID; obj.cmIsMain = isMain; } var thisMenu = cmGetThisMenu (obj, prefix); // insert obj into cmItems if cmItems doesn't have obj if (!thisMenu.cmItems) thisMenu.cmItems = new Array (); var i; for (i = 0; i < thisMenu.cmItems.length; ++i) { if (thisMenu.cmItems[i] == obj) break; } if (i == thisMenu.cmItems.length) { //thisMenu.cmItems.push (obj); thisMenu.cmItems[i] = obj; } // hide the previous submenu that is not this branch if (_cmCurrentItem) { // occationally, we get this case when user // move the mouse slowly to the border if (_cmCurrentItem == obj || _cmCurrentItem == thisMenu) { var item = _cmItemList[index]; cmSetStatus (item); return; } var thatMenuInfo = _cmMenuList[_cmCurrentItem.cmMenuID]; var thatPrefix = thatMenuInfo.prefix; var thatMenu = cmGetThisMenu (_cmCurrentItem, thatPrefix); if (thatMenu != thisMenu.cmParentMenu) { if (_cmCurrentItem.cmIsMain) _cmCurrentItem.className = thatPrefix + 'MainItem'; else _cmCurrentItem.className = thatPrefix + 'MenuItem'; if (thatMenu.id != idSub) cmHideMenu (thatMenu, thisMenu, thatMenuInfo); } } // okay, set the current menu to this obj _cmCurrentItem = obj; // just in case, reset all items in this menu to MenuItem cmResetMenu (thisMenu, prefix); var item = _cmItemList[index]; var isDefaultItem = cmIsDefaultItem (item); if (isDefaultItem) { if (isMain) obj.className = prefix + 'MainItemHover'; else obj.className = prefix + 'MenuItemHover'; } cmSetStatus (item); } // // action should be taken for mouse moving in to the menu item // // This function also opens sub menu // function cmItemMouseOverOpenSub (obj, isMain, idSub, menuID, index) { clearTimeout (_cmTimeOut); if (_cmItemList[index].isDisabled) return; cmItemMouseOver (obj, isMain, idSub, menuID, index, true); if (idSub) { var subMenu = cmGetObject (idSub); var menuInfo = _cmMenuList[menuID]; var orient = menuInfo.orient; var prefix = menuInfo.prefix; cmShowSubMenu (obj, isMain, subMenu, menuInfo); } } // // action should be taken for mouse moving out of the menu item // function cmItemMouseOut (obj, isMain, idSub, menuID, index) { var delayTime = _cmMenuList[menuID].nodeProperties.delay; _cmTimeOut = window.setTimeout ('cmHideMenuTime ()', delayTime); window.defaultStatus = ''; } // // action should be taken for mouse button down at a menu item // function cmItemMouseDown (obj, isMain, idSub, menuID, index) { if (_cmItemList[index].isDisabled) return; if (cmIsDefaultItem (_cmItemList[index])) { var prefix = _cmMenuList[menuID].prefix; if (obj.cmIsMain) obj.className = prefix + 'MainItemActive'; else obj.className = prefix + 'MenuItemActive'; } } // // action should be taken for mouse button down at a menu item // this is one also opens submenu if needed // function cmItemMouseDownOpenSub (obj, isMain, idSub, menuID, index) { if (_cmItemList[index].isDisabled) return; _cmClicked = true; cmItemMouseDown (obj, isMain, idSub, menuID, index); if (idSub) { var subMenu = cmGetObject (idSub); var menuInfo = _cmMenuList[menuID]; cmShowSubMenu (obj, isMain, subMenu, menuInfo); } } // // action should be taken for mouse button up at a menu item // function cmItemMouseUp (obj, isMain, idSub, menuID, index) { if (_cmItemList[index].isDisabled) return; var item = _cmItemList[index]; var link = null, target = '_self'; if (item.length > 2) link = item[2]; if (item.length > 3 && item[3]) target = item[3]; if (link != null) { _cmClicked = false; window.open (link, target); } var menuInfo = _cmMenuList[menuID]; var prefix = menuInfo.prefix; var thisMenu = cmGetThisMenu (obj, prefix); var hasChild = (item.length > 5); if (!hasChild) { if (cmIsDefaultItem (item)) { if (obj.cmIsMain) obj.className = prefix + 'MainItem'; else obj.className = prefix + 'MenuItem'; } cmHideMenu (thisMenu, null, menuInfo); } else { if (cmIsDefaultItem (item)) { if (obj.cmIsMain) obj.className = prefix + 'MainItemHover'; else obj.className = prefix + 'MenuItemHover'; } } } ////////////////////////////////////////////////////////////////////// // // Mouse Event Support Utility Functions // ////////////////////////////////////////////////////////////////////// // // move submenu to the appropriate location // function cmMoveSubMenu (obj, isMain, subMenu, menuInfo) { var orient = menuInfo.orient; var offsetAdjust; if (isMain) { if (orient.charAt (0) == 'h') offsetAdjust = menuInfo.nodeProperties.offsetHMainAdjust; else offsetAdjust = menuInfo.nodeProperties.offsetVMainAdjust; } else offsetAdjust = menuInfo.nodeProperties.offsetSubAdjust; if (!isMain && orient.charAt (0) == 'h') orient = 'v' + orient.charAt (1) + orient.charAt (2); var mode = String (orient); var p = subMenu.offsetParent; var subMenuWidth = cmGetWidth (subMenu); var horiz = cmGetHorizontalAlign (obj, mode, p, subMenuWidth); if (mode.charAt (0) == 'h') { if (mode.charAt (1) == 'b') subMenu.style.top = (cmGetYAt (obj, p) + cmGetHeight (obj) + offsetAdjust[1]) + 'px'; else subMenu.style.top = (cmGetYAt (obj, p) - cmGetHeight (subMenu) - offsetAdjust[1]) + 'px'; if (horiz == 'r') subMenu.style.left = (cmGetXAt (obj, p) + offsetAdjust[0]) + 'px'; else subMenu.style.left = (cmGetXAt (obj, p) + cmGetWidth (obj) - subMenuWidth - offsetAdjust[0]) + 'px'; } else { if (horiz == 'r') subMenu.style.left = (cmGetXAt (obj, p) + cmGetWidth (obj) + offsetAdjust[0]) + 'px'; else subMenu.style.left = (cmGetXAt (obj, p) - subMenuWidth - offsetAdjust[0]) + 'px'; if (mode.charAt (1) == 'b') subMenu.style.top = (cmGetYAt (obj, p) + offsetAdjust[1]) + 'px'; else subMenu.style.top = (cmGetYAt (obj, p) + cmGetHeight (obj) - cmGetHeight (subMenu) + offsetAdjust[1]) + 'px'; } // IE specific iframe masking method /*@cc_on @if (@_jscript_version >= 5.5) if (menuInfo.cmFrameMasking) { if (!subMenu.cmFrameObj) { var frameObj = cmAllocFrame (); subMenu.cmFrameObj = frameObj; } var frameObj = subMenu.cmFrameObj; frameObj.style.zIndex = subMenu.style.zIndex - 1; frameObj.style.left = (cmGetX (subMenu) - cmGetX (frameObj.offsetParent)) + 'px'; frameObj.style.top = (cmGetY (subMenu) - cmGetY (frameObj.offsetParent)) + 'px'; frameObj.style.width = cmGetWidth (subMenu) + 'px'; frameObj.style.height = cmGetHeight (subMenu) + 'px'; frameObj.style.display = 'block'; } @end @*/ if (horiz != orient.charAt (2)) orient = orient.charAt (0) + orient.charAt (1) + horiz; return orient; } // // automatically re-adjust the menu position based on available screen size. // function cmGetHorizontalAlign (obj, mode, p, subMenuWidth) { var horiz = mode.charAt (2); if (!(document.body)) return horiz; var body = document.body; var browserLeft; var browserRight; if (window.innerWidth) { // DOM window attributes browserLeft = window.pageXOffset; browserRight = window.innerWidth + browserLeft; } else if (body.clientWidth) { // IE attributes browserLeft = body.clientLeft; browserRight = body.clientWidth + browserLeft; } else return horiz; if (mode.charAt (0) == 'h') { if (horiz == 'r' && (cmGetXAt (obj) + subMenuWidth) > browserRight) horiz = 'l'; if (horiz == 'l' && (cmGetXAt (obj) + cmGetWidth (obj) - subMenuWidth) < browserLeft) horiz = 'r'; return horiz; } else { if (horiz == 'r' && (cmGetXAt (obj, p) + cmGetWidth (obj) + subMenuWidth) > browserRight) horiz = 'l'; if (horiz == 'l' && (cmGetXAt (obj, p) - subMenuWidth) < browserLeft) horiz = 'r'; return horiz; } } // // show the subMenu w/ specified orientation // also move it to the correct coordinates // function cmShowSubMenu (obj, isMain, subMenu, menuInfo) { var prefix = menuInfo.prefix; if (!subMenu.cmParentMenu) { // establish the tree w/ back edge var thisMenu = cmGetThisMenu (obj, prefix); subMenu.cmParentMenu = thisMenu; if (!thisMenu.cmSubMenu) thisMenu.cmSubMenu = new Array (); thisMenu.cmSubMenu[thisMenu.cmSubMenu.length] = subMenu; } var effectInstance = subMenu.cmEffect; if (effectInstance) effectInstance.showEffect (true); else { // position the sub menu only if we are not already showing the submenu var orient = cmMoveSubMenu (obj, isMain, subMenu, menuInfo); subMenu.cmOrient = orient; var forceShow = false; if (subMenu.style.visibility != 'visible' && menuInfo.nodeProperties.effect) { try { effectInstance = menuInfo.nodeProperties.effect.getInstance (subMenu, orient); effectInstance.showEffect (false); } catch (e) { forceShow = true; subMenu.cmEffect = null; } } else forceShow = true; if (forceShow) { subMenu.style.visibility = 'visible'; /*@cc_on @if (@_jscript_version >= 5.5) if (subMenu.cmFrameObj) subMenu.cmFrameObj.style.display = 'block'; @end @*/ } } if (!_cmHideObjects) { _cmHideObjects = 2; // default = not hide, may change behavior later try { if (window.opera) { if (parseInt (navigator.appVersion) < 9) _cmHideObjects = 1; } } catch (e) { } } if (_cmHideObjects == 1) { if (!subMenu.cmOverlap) subMenu.cmOverlap = new Array (); cmHideControl ("IFRAME", subMenu); cmHideControl ("OBJECT", subMenu); } } // // reset all the menu items to class MenuItem in thisMenu // function cmResetMenu (thisMenu, prefix) { if (thisMenu.cmItems) { var i; var str; var items = thisMenu.cmItems; for (i = 0; i < items.length; ++i) { if (items[i].cmIsMain) { if (items[i].className == (prefix + 'MainItemDisabled')) continue; } else { if (items[i].className == (prefix + 'MenuItemDisabled')) continue; } if (items[i].cmIsMain) str = prefix + 'MainItem'; else str = prefix + 'MenuItem'; if (items[i].className != str) items[i].className = str; } } } // // called by the timer to hide the menu // function cmHideMenuTime () { _cmClicked = false; if (_cmCurrentItem) { var menuInfo = _cmMenuList[_cmCurrentItem.cmMenuID]; var prefix = menuInfo.prefix; cmHideMenu (cmGetThisMenu (_cmCurrentItem, prefix), null, menuInfo); _cmCurrentItem = null; } } // // Only hides this menu // function cmHideThisMenu (thisMenu, menuInfo) { var effectInstance = thisMenu.cmEffect; if (effectInstance) effectInstance.hideEffect (true); else { thisMenu.style.visibility = 'hidden'; thisMenu.style.top = '0px'; thisMenu.style.left = '0px'; thisMenu.cmOrient = null; /*@cc_on @if (@_jscript_version >= 5.5) if (thisMenu.cmFrameObj) { var frameObj = thisMenu.cmFrameObj; frameObj.style.display = 'none'; frameObj.style.width = '1px'; frameObj.style.height = '1px'; thisMenu.cmFrameObj = null; cmFreeFrame (frameObj); } @end @*/ } cmShowControl (thisMenu); thisMenu.cmItems = null; } // // hide thisMenu, children of thisMenu, as well as the ancestor // of thisMenu until currentMenu is encountered. currentMenu // will not be hidden // function cmHideMenu (thisMenu, currentMenu, menuInfo) { var prefix = menuInfo.prefix; var str = prefix + 'SubMenu'; // hide the down stream menus if (thisMenu.cmSubMenu) { var i; for (i = 0; i < thisMenu.cmSubMenu.length; ++i) { cmHideSubMenu (thisMenu.cmSubMenu[i], menuInfo); } } // hide the upstream menus while (thisMenu && thisMenu != currentMenu) { cmResetMenu (thisMenu, prefix); if (thisMenu.className == str) { cmHideThisMenu (thisMenu, menuInfo); } else break; thisMenu = cmGetThisMenu (thisMenu.cmParentMenu, prefix); } } // // hide thisMenu as well as its sub menus if thisMenu is not // already hidden // function cmHideSubMenu (thisMenu, menuInfo) { if (thisMenu.style.visibility == 'hidden') return; if (thisMenu.cmSubMenu) { var i; for (i = 0; i < thisMenu.cmSubMenu.length; ++i) { cmHideSubMenu (thisMenu.cmSubMenu[i], menuInfo); } } var prefix = menuInfo.prefix; cmResetMenu (thisMenu, prefix); cmHideThisMenu (thisMenu, menuInfo); } // // hide a control such as IFRAME // function cmHideControl (tagName, subMenu) { var x = cmGetX (subMenu); var y = cmGetY (subMenu); var w = subMenu.offsetWidth; var h = subMenu.offsetHeight; var i; for (i = 0; i < document.all.tags(tagName).length; ++i) { var obj = document.all.tags(tagName)[i]; if (!obj || !obj.offsetParent) continue; // check if the object and the subMenu overlap var ox = cmGetX (obj); var oy = cmGetY (obj); var ow = obj.offsetWidth; var oh = obj.offsetHeight; if (ox > (x + w) || (ox + ow) < x) continue; if (oy > (y + h) || (oy + oh) < y) continue; // if object is already made hidden by a different // submenu then we dont want to put it on overlap list of // of a submenu a second time. // - bug fixed by Felix Zaslavskiy if(obj.style.visibility == 'hidden') continue; //subMenu.cmOverlap.push (obj); subMenu.cmOverlap[subMenu.cmOverlap.length] = obj; obj.style.visibility = 'hidden'; } } // // show the control hidden by the subMenu // function cmShowControl (subMenu) { if (subMenu.cmOverlap) { var i; for (i = 0; i < subMenu.cmOverlap.length; ++i) subMenu.cmOverlap[i].style.visibility = ""; } subMenu.cmOverlap = null; } // // returns the main menu or the submenu table where this obj (menu item) // is in // function cmGetThisMenu (obj, prefix) { var str1 = prefix + 'SubMenu'; var str2 = prefix + 'Menu'; while (obj) { if (obj.className == str1 || obj.className == str2) return obj; obj = obj.parentNode; } return null; } // // A special effect function to hook the menu which contains // special effect object to the timer. // function cmTimeEffect (menuID, show, delayTime) { window.setTimeout ('cmCallEffect("' + menuID + '",' + show + ')', delayTime); } // // A special effect function. Called by timer. // function cmCallEffect (menuID, show) { var menu = cmGetObject (menuID); if (!menu || !menu.cmEffect) return; try { if (show) menu.cmEffect.showEffect (false); else menu.cmEffect.hideEffect (false); } catch (e) { } } // // return true if this item is handled using default handlers // function cmIsDefaultItem (item) { if (item == _cmSplit || item[0] == _cmNoAction || item[0] == _cmNoClick) return false; return true; } // // returns the object baring the id // function cmGetObject (id) { if (document.all) return document.all[id]; return document.getElementById (id); } // // functions that obtain the width of an HTML element. // function cmGetWidth (obj) { var width = obj.offsetWidth; if (width > 0 || !cmIsTRNode (obj)) return width; if (!obj.firstChild) return 0; // use TABLE's length can cause an extra pixel gap //return obj.parentNode.parentNode.offsetWidth; // use the left and right child instead return obj.lastChild.offsetLeft - obj.firstChild.offsetLeft + cmGetWidth (obj.lastChild); } // // functions that obtain the height of an HTML element. // function cmGetHeight (obj) { var height = obj.offsetHeight; if (height > 0 || !cmIsTRNode (obj)) return height; if (!obj.firstChild) return 0; // use the first child's height return obj.firstChild.offsetHeight; } // // functions that obtain the coordinates of an HTML element // function cmGetX (obj) { if (!obj) return 0; var x = 0; do { x += obj.offsetLeft; obj = obj.offsetParent; } while (obj); return x; } function cmGetXAt (obj, elm) { var x = 0; while (obj && obj != elm) { x += obj.offsetLeft; obj = obj.offsetParent; } if (obj == elm) return x; return x - cmGetX (elm); } function cmGetY (obj) { if (!obj) return 0; var y = 0; do { y += obj.offsetTop; obj = obj.offsetParent; } while (obj); return y; } function cmIsTRNode (obj) { var tagName = obj.tagName; return tagName == "TR" || tagName == "tr" || tagName == "Tr" || tagName == "tR"; } // // get the Y position of the object. In case of TR element though, // we attempt to adjust the value. // function cmGetYAt (obj, elm) { var y = 0; if (!obj.offsetHeight && cmIsTRNode (obj)) { var firstTR = obj.parentNode.firstChild; obj = obj.firstChild; y -= firstTR.firstChild.offsetTop; } while (obj && obj != elm) { y += obj.offsetTop; obj = obj.offsetParent; } if (obj == elm) return y; return y - cmGetY (elm); } // // extract description from the menu item and set the status text // function cmSetStatus (item) { var descript = ''; if (item.length > 4) descript = (item[4] != null) ? item[4] : (item[2] ? item[2] : descript); else if (item.length > 2) descript = (item[2] ? item[2] : descript); window.defaultStatus = descript; } // // debug function, ignore :) // function cmGetProperties (obj) { if (obj == undefined) return 'undefined'; if (obj == null) return 'null'; var msg = obj + ':\n'; var i; for (i in obj) msg += i + ' = ' + obj[i] + '; '; return msg; } /* v2.0.4 1. Fixed the bug that cmEnableItem setting the wrong isDisabled value. 2. Fixed a missing semicolon issue. */ /* v2.0.3 1. Fix an issue with IE6 displaying menu over HTTPS connection. Thanks to Paul Horton for reporting the bug and testing possible solutions. */ /* v2.0.2 1. Minor clean up and some attempts to reduce memory leak in IE. */ /* v2.0.1 1. Disable iframe masking for IE7 since it is no longer necessary. */ /* v2.0 1. improves the way handling flash/iframe/select boxes in IE and firefox and Opera 9. Hiding these elements is no longer necessary. For older versions of Opera, flash/iframe still need to be hidden. 2. Improves cmDrawFromText (). Also allows custom actions. 3. Improves clickOpen behavior. Now once a submenu is opened, opening other sub menus no longer requires clicking. 4. Special Effects. This version has hooks that allow people to install special effects to various themes. 5. For a given menu item, cmGetMenuitem(item) provides the ability to find the corresponding DOM element. 6. Disable API. If you know which item to disable, you can call cmDisableItem(item, themePrefix) and cmEnableItem(item, themePrefix). However, you will have to provide your own CSS for the item. For purposes other than to disable an item, cmGetMenuItem (item) is provided for locating HTML DOM element of the menu item in concern. 7. Better z-index. Now you can specify in the theme property the starting z-index and incremental step for submenus. 8. Allow themes to insert additional elements before and after the sub menu table. 9. Improved themes. More organized and easier to customize. 10. Add a flag to control hiding/nohiding objects/iframes. By default, only Opera before 9 hides objects. 11. Add new property options to control submenu positions to fine tune the look. 12. It is no longer necessary to specify the theme name while calling cmDraw and cmDrawFromText. Currently it still accepts it, but it will not in the future. */ /* v1.4.4 1. a quick fix for a bug for _cmSplit checking. reported by Son Nguyen. */ /* v1.4.3 1. changed how _cmSplit is handled a bit so that _cmNoClick can work properly. All splits in predefined themes are changed to use _cmNoClick instead of _cmNoAction. */ /* v1.4.2 1. fixed _cmNoClick mouse hoover bug. 2. fixed a statusbar text problem that cause text to disappear when hoovering mouse within the same menu item. 3. changed the behavior of cmDrawFromText s.t. if the title of the of a link is empty, the actual url is used as text. To clear this link information, title needs to be ' '. */ /* v1.4.1 1. fixed a problem introduced in 1.4 where re-entering a main menu item which doesn't have a child can disable its hover setting. Apparently I deleted an extra line of code when I was doing cleaning up. Reported by David Maliachi and a few others. */ /* JSCookMenu v1.4 1. fixed a minor td cell closure problem. Thanks to Georg Lorenz for discovering that. 2. added clickOpen to nodeProperties. See _cmNodeProperties for description. Basically menus can be opened on click only. 3. added an ability to draw menu from an html node instead of a javascript tree, making this script search bot friendly (I hope?). */ /* JSCookMenu v1.31 1. fix a bug on IE with causes submenus to display at the top left corner due to doctype. The fix was provided by Burton Strauss . */ /* JSCookMenu v1.3 1. automatically realign (left and right) the submenu when client space is not enough. 2. add _cmNoClick to get rid of menu closing behavior on the particular menu item, to make it possible for things such as search box to be inside the menu. */ /* JSCookMenu v1.25 1. fix Safari positioning issue. The problem is that all TR elements are located at the top left corner. Thus, need to obtain the "virtual" position of these element could be at. */ /* JSCookMenu v1.24 1. fix window based control hiding bug thanks to Felix Zaslavskiy for the fix. */ /* JSCookMenu v1.23 1. correct a position bug when the container is positioned. thanks to Andre for narrowing down the problem. */ /* JSCookMenu v1.22 1. change Array.push (obj) call to Array[length] = obj. Suggestion from Dick van der Kaaden to make the script compatible with IE 5.0 2. Changed theme files a little to add z-index: 100 for sub menus. This change is necessary for Netscape to avoid a display problem. 3. some changes to the DOM structure to make this menu working on Netscape 6.0 (tested). The main reason is that NN6 does not do absolute positioning with tables. Therefore an extra div layer must be put around the table. */ /* JSCookMenu v1.21 1. fixed a bug that didn't add 'px' as part of coordinates. JSCookMenu should be XHTML validator friendly now. 2. removed unnecessary display attribute and corresponding theme entry to fix a problem that Netscape sometimes render Office theme incorrectly */ /* JSCookMenu v1.2. 1. fix the problem of showing status in Netscape 2. changed the handler parameters a bit to allow string literals to be passed to javascript based links 3. having null in target field would cause the link to be opened in the current window, but this behavior could change in the future releases */ /* JSCookMenu v1.1. added ability to hide controls in IE to show submenus properly */ /* JSCookMenu v1.01. cmDraw generates XHTML code */ /* JSCookMenu v1.0. (c) Copyright 2002 by Heng Yuan */ ntop-5.0.1+dfsg1/html/external.png0000644000000000000000000000024510421175651015472 0ustar rootroot‰PNG  IHDR ºì?PLTEf™Ì3™Ì™ÌÿfÌfÿÿÿÿÿÿÿDê•tRNSÿÿÿÿÿÿKF8IDATW%ËA@A"ëÿOÞÁT$š¼Êx´lç²È:rô”Ë£¡B®Îžùã!/øYì››Ä5fIEND®B`‚ntop-5.0.1+dfsg1/html/ntop.html0000644000000000000000000016323411763357226015032 0ustar rootroot NTOP

    NTOP

    NAME
    SYNOPSIS
    DESCRIPTION
    COMMAND−LINE OPTIONS
    WEB VIEWS
    NOTES
    SEE ALSO
    PRIVACY NOTICE
    USER SUPPORT
    AUTHOR
    LICENCE
    ACKNOWLEDGMENTS

    NAME

    ntop − display top network users

    SYNOPSIS

    ntop [@filename] [-a|--access-log-file <path>] [-b|--disable-decoders] [-c|--sticky-hosts] [-e|--max-table-rows] [-f|--traffic-dump-file file>] [-g|--track-local-hosts] [-h|--help] [-l|--pcap-log <path>] [-m|--local-subnets <addresses>] [-n|--numeric-ip-addresses] [-p|--protocols <list>] [-q|--create-suspicious-packets] [-r|--refresh-time <number>] [-s|--no-promiscuous] [-t|--trace-level <number>] [-x <max_num_hash_entries>] [-w|--http-server <port>] [-z|--disable-sessions] [-A|--set-admin-password password] [-B|--filter-expression expression] [-C <configmode>] [-D|--domain <name>] [-F|--flow-spec <specs>] [-M|--no-interface-merge] [-N|--wwn-map <path>] [-O|----output-packet-path <path>] [-P|--db-file-path <path>] [-Q|--spool-file-path <path>] [-U|--mapper <URL>] [-V|--version] [-X <max_num_TCP_sessions>] [--disable-instantsessionpurge] [--disable-mutexextrainfo] [--disable-ndpi] [--disable-python] [--instance] [--p3p-cp] [--p3p-uri] [--skip-version-check] [--w3c] [-4|--ipv4] [-6|--ipv6]

    Unix options:

    [-d|--daemon] [-i|--interface <name>] [-u|--user <user>] [-K|--enable-debug] [-L] [--pcap_setnonblock] [--use-syslog= <facility>] [--webserver-queue <number>]

    Windows option:

    [-i|--interface <number|name>]

    OpenSSL options:

    [-W|--https-server <port>] [--ssl-watchdog]

    DESCRIPTION

    ntop shows the current network usage. It displays a list of hosts that are currently using the network and reports information concerning the (IP and non-IP) traffic generated and received by each host. ntop may operate as a front-end collector (sFlow and/or netFlow plugins) or as a stand-alone collector/display program. A web browser is needed to access the information captured by the ntop program.

    ntop is a hybrid layer 2 / layer 3 network monitor, that is by default it uses the layer 2 Media Access Control (MAC) addresses AND the layer 3 tcp/ip addresses. ntop is capable of associating the two, so that ip and non-ip traffic (e.g. arp, rarp) are combined for a complete picture of network activity.

    COMMAND−LINE OPTIONS

    @filename

    The text of filename is copied - ignoring line breaks and comment lines (anything following a #) - into the command line. ntop behaves as if all of the text had simply been typed directly on the command line. For example, if the command line is "-t 3 @d -u ntop" and file d contains just the line ’-d’, then the effective command line is -t 3 -d -u ntop. Multiple @s are permitted. Nested @s (an @ inside the file) are not permitted.

    Remember, most ntop options are "sticky", that is they just set an internal flag. Invoking them multiple times doesn’t change ntop’s behavior. However, options that set a value, such as --trace-level, will use the LAST value given: --trace-level 2 --trace-level 3 will run as --trace-level 3.

    Beginning with 3.1, many command-line options may also be set via the web browser interface. These changes take effect on the next run of and on each subsequent run until changed.

    -a | --access-log-file

    By default ntop does not maintain a log of HTTP requests to the internal web server. Use this parameter to request logging and to specify the location of the file where these HTTP requests are logged.

    Each log entry is in Apache-like style. The only difference between Apache and ntop logs is that an additional column has been added which has the time (in milliseconds) that ntop needed to serve the request. Log entries look like this:

    192.168.1.1 - - [04/Sep/2003:20:38:55 -0500] - "GET / HTTP/1.1" 200 1489 4
    192.168.1.1 - - [04/Sep/2003:20:38:55 -0500] - "GET /index_top.html HTTP/1.1" 200 1854 4
    192.168.1.1 - - [04/Sep/2003:20:38:55 -0500] - "GET /index_inner.html HTTP/1.1" 200 1441 7
    192.168.1.1 - - [04/Sep/2003:20:38:56 -0500] - "GET /index_left.html HTTP/1.1" 200 1356 4
    192.168.1.1 - - [04/Sep/2003:20:38:56 -0500] - "GET /home_.html HTTP/1.1" 200 154/617 9
    192.168.1.1 - - [04/Sep/2003:20:38:56 -0500] - "GET /home.html HTTP/1.1" 200 1100/3195 10
    192.168.1.1 - - [04/Sep/2003:20:38:56 -0500] - "GET /About.html HTTP/1.1" 200 2010 10

    This parameter is the complete file name of the access log. In prior releases it was erroneously called --access-log-path.

    -b | --disable-decoders

    This parameter disables protocol decoders.

    Protocol decoders examine and collect information about layer 2 protocols such as NetBIOS or Netware SAP, as well as about specific tcp/ip (layer 3) protocols, such as DNS, http and ftp.

    This support is specifically coded for each protocol and is different from the capability to count raw information (packets and bytes) by protocol specified by the -p | --protocols parameter, below.

    Decoding protocols is a significant consumer of resources. If the ntop host is underpowered or monitoring a very busy network, you may wish to disable protocol decoding via this parameter. It may also be appropriate to use this parameter if you believe that ntop has problems handling some protocols that occur on your network.

    Even if decoding is disabled, ftp-data traffic is still decoded to look for passive ftp port commands.

    -c | --sticky-hosts

    Use this parameter to prevent idle hosts from being purged from memory.

    By default idle hosts are periodically purged from memory. An idle host is identified when no packets from or to that host have been monitored for the period of time defined by the value of PARM_HOST_PURGE_MINIMUM_IDLE in globals-defines.h.

    If you use this option, all hosts - active and idle - are retained in memory for the duration of the ntop run.

    P2P users, port scans, popular web servers and other activity will cause ntop to record data about a large number of hosts. On an active network, this will consume a significant - and always growing - amount of memory. It is strongly recommended that you use a filtering expression to limit the hosts which are stored if you use --sticky-hosts.

    The idle purge is a statistical one - a random selection of the eligible hosts will be purged during each cycle. Thus it is possible on a busy system for an idle host to remain in the ntop tables and appear ’active’ for some considerable time after it is truly idle.

    -d | --daemon

    This parameter causes ntop to become a daemon, i.e. a task which runs in the background without connection to a specific terminal. To use ntop other than as a casual monitoring tool, you probably will want to use this option.

    WARNING: If you are running as a daemon, the messages from ntop will be ’printed’ on to stdout and thus dropped. You probably don’t want to do this. So remember to also use the -L or --use-syslog options to save the messages into the system log.

    -e | --max-table-rows

    This defines the maximum number of lines that ntop will display on each generated ML page. If there are more lines to be displayed than this setting permits, only part of the data will be displayed. There will be page forward/back arrows placed at the bottom of the page for navigation between pages.

    -f | --traffic-dump-file

    By default, ntop captures traffic from network interface cards (NICs) or from netFlow/sFlow probes. However, ntop can also read data from a file - typically a tcpdump capture or the output from one of the ntop packet capture options.

    if you specify -f, ntop will not capture any traffic from NICs during or after the file has been read. netFlow/sFlow capture - if enabled - would still be active.

    This option is mostly used for debug purposes.

    -g | --track-local-hosts

    By default, ntop tracks all hosts that it sees from packets captured on the various NICs. Use this parameter to tell ntop to capture data only about local hosts. Local hosts are defined based on the addresses of the NICs and those networks identified as local via the -m | --local-subnets parameter.

    This parameter is useful on large networks or those that see many hosts, (e.g. a border router or gateway), where information about remote hosts is not desired/required to be tracked.

    -h | --help

    Print help information for ntop, including usage and parameters.

    -i | --interface

    Specifies the network interface or interfaces to be used by ntop for network monitoring.

    If multiple interfaces are used (this feature is available only if ntop is compiled with thread support) their names must be separated with a comma. For instance -i "eth0,lo".

    If not specified, the default is the first Ethernet device, e.g. eth0. The specific device that is ’first’ is highly system dependent. Especially on systems where the device name reflects the driver name instead of the type of interface.

    By default, traffic information obtained by all the interfaces is merged together as if the traffic was seen by only one interface. Use the -M parameter to keep traffic separate by interface.

    If you do not want ntop to monitor any interfaces, use -i none.

    Under Windows, the parameter value is either the number of the interface or its name, e.g. {6252C14C-44C9-49D9-BF59-B2DC18C7B811}. Run ntop -h to see a list of interface name-number mappings (at the end of the help information).

    -l | --pcap-log

    This parameter causes a dump file to be created of the network traffic captured by ntop in tcpdump (pcap) format. This file is useful for debug, and may be read back into ntop by the -f | --traffic-dump-file parameter. The dump is made after processing any filter expression ( never even sees filtered packets).

    The output file will be named <path>/<log>.<device>.pcap (Windows: <path>/<log>.pcap ), where <path> is defined by the -O | --output-packet-path parameter and <log> is defined by this -l | --pcap-log parameter.

    -m | --local-subnets

    ntop determines the ip addresses and netmasks for each active interface. Any traffic on those networks is considered local. This parameter allows the user to define additional networks and subnetworks whose traffic is also considered local in ntop reports. All other hosts are considered remote.

    Commas separate multiple network values. Both netmask and CIDR notation may be used, even mixed together, for instance "131.114.21.0/24,10.0.0.0/255.0.0.0".

    The local subnet - as defined by the interface address(es) - is/are always local and do not need to be specified. If you do give the same value as a NIC’s local address, a harmless warning message is issued.

    -n | --numeric-ip-addresses

    By default, ntop resolves IP addresses using a combination of active (explicit) DNS queries and passive sniffing. Sniffing of DNS responses occurs when ntop receives a network packet containing the response to some other user’s DNS query. ntop captures this information and enters it into ntop’s DNS cache, in expectation of shortly seeing traffic addressed to that host. This way ntop significantly reduces the number of DNS queries it makes.

    This parameter causes ntop to skip DNS resolution, showing only numeric IP addresses instead of the symbolic names. This option can useful when the DNS is not present or quite slow.

    -p | --protocols

    This parameter is used to specify the TCP/UDP protocols that ntop will monitor. The format is <label>=<protocol list> [, <label>=<protocol list>], where label is used to symbolically identify the <protocol list>. The format of <protocol list> is <protocol>[|<protocol>], where <protocol> is either a valid protocol specified inside the /etc/services file or a numeric port range (e.g. 80, or 6000-6500).

    A simple example is --protocols="HTTP=http|www|https|3128,FTP=ftp|ftp-data", which reduces the protocols displayed on the "IP" pages to three:

    Host Domain Data HTTP FTP Other IP
    ns2.attbi.com <flag> 954 63.9 % 0 0 954
    64.124.83.112.akamai.com <flag> 240 16.1 % 240 0 0
    64.124.83.99.akamai.com <flag> 240 16.1 % 240 0 0
    toolbarqueries.google.com <flag> 60 4.0 % 60 0 0

    If the <protocol list> is very long you may store it in a file (for instance protocol.list). To do so, specify the file name instead of the <protocol list> on the command line. e.g. ntop -p protocol.list

    If the -p parameter is omitted the following default value is used:

    FTP=ftp|ftp-data
    TP=http|www|https|3128 3128 is Squid, the HTTP cache
    DNS=name|domain
    Telnet=telnet|login
    NBios-IP=netbios-ns|netbios-dgm|netbios-ssn
    Mail=pop-2|pop-3|pop3|kpop|smtp|imap|imap2
    DHCP-BOOTP=67-68
    SNMP=snmp|snmp-trap
    NNTP=nntp
    NFS=mount|pcnfs|bwnfs|nfsd|nfsd-status
    X11=6000-6010
    SSH=22

    Peer-to-Peer Protocols
    ----------------------
    Gnutella=6346|6347|6348
    Kazaa=1214
    WinMX=6699|7730
    DirectConnect=0 Dummy port as this is a pure P2P protocol
    eDonkey=4661-4665

    Instant Messenger
    -----------------
    Messenger=1863|5000|5001|5190-5193

    NOTE: To resolve protocol names to port numbers, they must be specified in the system file used to list tcp/udp protocols and ports, which is typically /etc/services file. You will have to match the names in that file, exactly. Missing or unspecified (non-standard) ports must be specified by number, such as 3128 in our examples above.

    If you have a file named /etc/protocols, don’t get confused by it, as that’s the Ethernet protocol numbers, which are not what you’re looking for.

    -q | --create-suspicious-packets

    This parameter tells ntop to create a dump file of suspicious packets.

    There are many, many, things that cause a packet to be labeled as ’suspicious’, including:

    Detected ICMP fragment
    Detected Land Attack against host
    Detected overlapping/tiny packet fragment
    Detected traffic on a diagnostic port
    Host performed ACK/FIN/NULL scan
    Host rejected TCP session
    TP/FTP/SMTP/SSH detected at wrong port
    Malformed TCP/UDP/ICMP packet (packet too short)
    Packet # %u too long
    Received a ICMP protocol Unreachable from host
    Sent ICMP Administratively Prohibited packet to host
    Smurf packet detected for host
    TCP connection with no data exchanged
    TCP session reset without completing 3-way handshake
    Two MAC addresses found for the same IP address
    UDP data to a closed port
    Unknown protocol (no HTTP/FTP/SMTP/SSH) detected (on port 80/21/25/22)
    Unusual ICMP options

    When this parameter is used, one file is created for each network interface where suspicious packets are found. The file is in tcpdump (pcap) format and is named <path>/ntop-suspicious-pkts.<device>.pcap, where <path> is defined by the -O | --output-packet-path parameter.

    -r | --refresh-time

    Specifies the delay (in seconds) between automatic screen updates for those generated HTML pages which support them. This parameter allows you to leave your browser window open and have it always displaying nearly real-time data from ntop.

    The default is 3 seconds. Please note that if the delay is very short (1 second for instance), ntop might not be able to process all of the network traffic.

    -s | --no-promiscuous

    Use this parameter to prevent from setting the interface(s) into promiscuous mode.

    An interface in promiscuous mode will accept ALL Ethernet frames, regardless of whether they directed (addressed) to the specific network interface (NIC) or not. This is an essential part of enabling ntop to monitor an entire network. (Without promiscuous mode, ntop will only see traffic directed to the specific host it is running on, plus broadcast traffic such as the arp and dhcp protocols.

    Even if you use this parameter, the interface could well be in promiscuous mode if another application enabled it.

    ntop passes this setting on to libpcap, the packet capture library. On many systems, a non-promiscuous open of the network interface will fail, since the libpcap function on most systems require it to capture raw packets ( ntop captures raw packets so that we may view and analyze the layer 2 - MAC - information).

    Thus on most systems, ntop must probably still be started as root, and this option is largely ornamental. If it fails, you will see a ***FATALERROR*** message referring to pcap_open_live() and then an information message, "Sorry, but on this system, even with -s, it appears that ntop must be started as root".

    -t | --trace-level

    This parameter specifies the ’information’ level of messages that you wish ntop to display (on stdout or to the log). The higher the trace level number the more information that is displayed. The trace level ranges between 0 (no trace) and 5 (full debug tracings).

    The default trace value is 3.

    Trace level 0 is not quite zero messages. Fatal errors and certain startup/shutdown messages are always displayed. Trace level 1 is used to display errors only, level 2 for both errors and warnings, and level 3 displays error, warning and informational messages.

    Trace level 4 is called ’noisy’ and it is - generating many messages about the internal functioning of ntop. Trace level 5 and above are ’noisy’ plus extra logs, i.e. all possible messages, with a file:line tag prepended to every message.

    -u | --user

    Specifies the user ntop should run as after it initializes.

    ntop must normally be started as root so that it has sufficient privileges to open the network interfaces in promiscuous mode and to receive raw frames. See the discussion of -s | --no-promiscuous above, if you wish to try starting ntop as a non-root user.

    Shortly after starting up, ntop becomes the user you specify here, which normally has substantially reduced privileges, such as no login shell. This is the userid which owns ntop’s database and output files.

    The value specified may be either a username or a numeric user id. The group id used will be the primary group of the user specified.

    If this parameter is not specified, ntop will try to switch first to ’nobody’ and then to ’anonymous’ before giving up.

    NOTE: This should not be root unless you really understand the security risks. In order to prevent this by accident, the only way to run ntop as root is to explicitly specify -u root. Don’t do it.

    -x
    -X

    ntop creates a new hash/list entry for each new host/TCP session seen. In case of DOS (Denial Of Service) an attacker can easily exhaust all the host available memory because ntop is creating entries for dummy hosts. In order to avoid this you can set an upper limit in order to limit the memory ntop can use.

    -w | --http-server
    -W | --https-server

    ntop offers an embedded web server to present the information that has been so painstakingly gathered. An external HTTP server is NOT required NOR supported. The ntop web server is embedded into the application. These parameters specify the port (and optionally the address (i.e. interface)) of the ntop web server.

    For example, if started with -w 3000 (the default port), the URL to access ntop is http://hostname:3000/. If started with a full specification, e.g. -w 192.168.1.1:3000, ntop listens on only that address/port combination.

    If -w is set to 0 the web server will not listen for http:// connections.

    -W operates similarly, but controls the port for the https:// connections.

    Some examples:

    ntop -w 3000 -W 0 (this is the default setting) HTTP requests on port 3000 and no HTTPS.

    ntop -w 80 -W 443 Both HTTP and HTTPS have been enabled on their most common ports.

    ntop -w 0 -W 443 HTTP disabled, HTTPS enabled on the common port.

    Certain sensitive, configuration pages of the ntop web server are protected by a userid/password. By default, these are the user/URL administration, filter, shutdown and reset stats are password protected
    and are accessible initially only to user admin with a password set during the first run of ntop.

    Users can modify/add/delete users/URLs using ntop itself - see the Admin tab.

    The passwords, userids and URLs to protect with passwords are stored in a database file. Passwords are stored in an encrypted form in the database for further security. Best practices call for securing that database so that only the ntop user can read it.

    There is a discussion in docs/FAQ about further securing the ntop environment.

    -z | --disable-sessions

    This parameter disables TCP session tracking. Use it for better performance or when you don’t really need/care to track sessions.

    -A | --set-admin-password

    This parameter is used to start ntop , set the admin password and quit. It is quite useful for installers that need to automatically set the password for the admin user.

    -A and --set-admin-password (without a value) will prompt the user for the password.

    You may also use this parameter to set a specific value using --set-admin-password=value. The = is REQUIRED and no spaces are permitted!

    If you attempt to run ntop as a daemon without setting a password, a FATAL ERROR message is generated and ntop stops.

    -B | --filter-expression

    Filters allows the user to restrict the traffic seen by ntop on just about any imaginable item.

    The filter expression is set at run time by this parameter, but it may be changed during the ntop run on the Admin | Change Filter web page.

    The basic format is -B filter , where the quotes are REQUIRED

    The syntax of the filter expression uses the same BPF (Berkeley Packet Filter) expressions used by other packages such as tcpdump

    For instance, suppose you are interested only in the traffic generated/received by the host jake.unipi.it. ntop can then be started with the following filter:

    ntop -B src host jake.unipi.it or dst host jake.unipi.it

    or in shorthand:

    ntop -B host jake.unipi.it or host jake.unipi.it

    See the ’expression’ section of the tcpdump man page - usually available at http://www.tcpdump.org/tcpdump_man.html - for further information and the best quick guide to BPF filters currently available.

    WARNING: If you are using complex filter expressions, especially those with =s or meaningful spaces in them, be sure and use the long option format, --filter-expression="xxxx" and not -B "xxxx".

    -C |

    This instruments ntop to be used in two configurations: host and network mode. In host mode (default) ntop works as usual: the IP addresses received are those of real hosts. In host mode the IP addresses received are those of the C-class network to which the address belongs. Using ntop in network mode is extremely useful when installed in a traffic exchange (e.g. in the middle of the Internet) whereas the host mode should be used when ntop is installed on the edge of a network (e.g. inside a company). The network mode significantly reduces the amount of work ntop has to perform and it has to be used whenever ntop is used to find out how the network traffic flows and not to pin-point specific hosts.

    -D | --domain

    This identifies the local domain suffix, e.g. ntop.org. It may be necessary, if ntop is having difficulty determining it from the interface.

    -F | --flow-spec

    It is used to specify network flows similar to more powerful applications such as NeTraMet. A flow is a stream of captured packets that match a specified rule. The format is

    <flow-label>=’<matching expression>’[,<flow-label>=’<matching expression>’]

    , where the label is used to symbolically identify the flow specified by the expression. The expression is a bpf (Berkeley Packet Filter) expression. If an expression is specified, then the information concerning flows can be accessed following the ML link named ’List NetFlows’.

    For instance define two flows with the following expression LucaHosts=’host jake.unipi.it or host pisanino.unipi.it’,GatewayRoutedPkts=’gateway gateway.unipi.it’ .

    All the traffic sent/received by hosts jake.unipi.it or pisanino.unipi.it is collected by ntop and added to the LucaHosts flow, whereas all the packet routed by the gateway gateway.unipi.it are added to the GatewayRoutedPkts flow. If the flows list is very long you may store in a file (for instance flows.list) and specify the file name instead of the actual flows list (in the above example, this would be ’ntop -F flows.list’).

    Note that the double quotations around the entire flow expression are required.

    -K | --enable-debug

    Use this parameter to simplify application debug. It does three things: 1. Does not fork() on the "read only" html pages. 2. Displays mutex values on the configuration (info.html) page. 3. (If available - glibc/gcc) Activates an automated backtrace on application errors.

    -L | --use-syslog=facility

    Use this parameter to send log messages to the system log instead of stdout.

    -L and the simple form --use-syslog use the default log facility, defined as LOG_DAEMON in the #define symbol DEFAULT_SYSLOG_FACILITY in globals-defines.h.

    The complex form, --use-syslog=facility will set the log facility to whatever value (e.g. local3, security) you specify. The = is REQUIRED and no spaces are allowed!

    This setting applies both to ntop and to any child fork()ed for reporting. If this parameter is not specified, any fork()ed child will use the default value and will log it’s messages to the system log (this occurs because the fork()ed child must give up it’s access to the parents stdout).

    Because various systems do not make the permissible names available, we have a table at the end of globals-core.c. Look for myFacilityNames.

    -M | --no-interface-merge

    By default, ntop merges the data collected from all of the interfaces (NICs) it is monitoring into a single set of counters.

    If you have a simple network, say a small LAN with a connection to the internet, merging data is good as it gives you a better picture of the whole network. For larger, more complex networks, this may not be desirable. You may also have other reasons for wishing to monitor each interface separately, for example DMZ vs. LAN traffic.

    This option instructs ntop not to merge network interfaces together. This means that ntop will collect statistics for each interface and report them separately.

    Only ONE interface may be reported on at a time - use the Admin | Switch NIC option on the web server to select which interface to report upon.

    Note that activating either the netFlow and/or sFlow plugins will force the setting of -M. Once enabled, you cannot go back.

    -N | --wwn-map

    This options names the file providing the map of WWN to FCID/VSAN ids.

    -O | --output-packet-path

    This parameter defines the base path for the ntop-suspicious-pkts.XXX.pcap and normal packet dump files.

    If this parameter is not specified, the default value is the config.h parameter CFG_DBFILE_DIR, which is set during ./configure from the --localstatedir= parameter. If --localstatedir is not specified, it defaults to the --prefix value plus /var (e.g. /usr/local/var).

    Be aware that this may not be what you expect when running ntop as a daemon or Windows service. Setting an explicit and absolute path value is STRONGLY recommended if you use this facility.

    -P | --db-file-path
    -Q | --spool-file-path

    These parameters specify where ntop stores database files.

    There are two types, ’temporary’ - that is ones which need not be retained from ntop run to ntop run, and ’permanent’, which must be retained (or recreated).

    The ’permanent’ databases are the preferences, "prefsCache.db" and the password file, "ntop_pw.db". These are stored in the -P | --db-file-path specified location.

    Certain plugins use the -P | --db-file-path specified location for their database ("LsWatch.db") or (as a default value) for files (.../rrd/...).

    The ’temporary’ databases are the address queue, "addressQueue.db", the cached DNS resolutions, "dnsCache.db" and the MAC prefix (vendor table), "macPrefix.db".

    If only -P | --db-file-path is specified, it is used for both types of databases.

    The directories named must allow read/write and file creation by the ntop user. For security, nobody else should have even read access to these files.

    Note that the default value is the config.h parameter CFG_DBFILE_DIR. This is set during ./configure from the --localstatedir= parameter. If --localstatedir is not specified, it defaults to the --prefix value plus /var (e.g. /usr/local/var).

    This may not be what you expect when running ntop as a daemon or Windows service.

    Note that on versions of ntop prior to 2.3, these parameters defaulted to "." (the current working directory, e.g. the value returned by the pwd command) and caused havoc as it was different when ntop was run from the command line, vs. run via cron, vs. run from an initialization script.

    Setting an explicit and absolute path value is STRONGLY recommended.

    -U | --mapper

    Specifies the URL of the mapper.pl utility.

    If provided, ntop creates a clickable hyperlink on the ’Info about host xxxxxx’ page to this URL by appending ?host=xxxxx. Any type of host lookup could be performed, but this is intended to lookup the geographical location of the host.

    A cgi-based mapper interface to http://www.multimap.com is part of the ntop distribution [see www/Perl/mapper.pl]).

    -V | --version

    Prints ntop version information and then exits.

    -W | --https-server

    (See the joint documentation with the -w parameter, above)

    --disable-instantsessionpurge

    ntop sets completed sessions as ’timed out’ and then purge them almost instantly, which is not the behavior you might expect from the discussions about purge timeouts. This switch makes ntop respect the timeouts for completed sessions. It is NOT the default because a busy web server may have 100s or 1000s of completed sessions and this would significantly increase the amount of memory ntop uses.

    --disable-mutexextrainfo

    ntop stores extra information about the locks and unlocks of the protective mutexes it uses. Since ntop uses fine-grained locking, this information is updated frequently. On some OSes, the system calls used to collect this informatio (getpid() and gettimeofday()) are expensive. This option disables the extra information. It should have no processing impact on ntop
    - however should ntop actually deadlock, we would lose the information that sometimes tells us why.

    --disable-ndpi

    ntop is started without nDPI support thus application protocols are not recognized.

    --disable-python

    ntop is started without the Python interpreter. Beware as some ntop reports are based on python, thus disabling it will prevent some reports to work properly.

    --instance

    You can run multiple instances of ntop simultaneously by specifying different -P values (typically through separate ntop.conf files). If you set a value for this parameter (available only on the command line), you (1) display the ’instance’ name on every web page and (2) alter the log prefix from "NTOP" to your chosen value.

    If you want to make the tag more obvious, create a .instance class in style.css, e.g.:

    .instance {
    color: #666666;
    font-size: 18pt;
    }

    Note (UNIX): To run completely different versions of the ntop binary, you need to compile and install into a different library (using ./configure --prefix) and then specify the LD_LIBRARY_PATH before invoking, e.g.

    LD_LIBRARY_PATH=/devel/lib/ntop/:... /devel/bin/ntop ...args...

    If present, a file of the form <instance>_ntop_logo.gif will be used instead of the normal ntop_logo.gif. This is tested for ONLY once, at the beginning of the run. The EXACT word(s) of the --instance flag are used, without testing if they make a proper file name. If - for any reason - the file is not found, an informational message is logged and the normal logo file is used. To construct your own logo, make it a 300x40 transparent gif.

    NOTE: On the web pages, ntop uses the dladdr() function. The original Solaris routine had a bug, replicated in FreeBSD (and possibly other places) where it uses the ARGV[0] value - which might be erroneous - instead of the actual file name. If the ’running from’ value looks bogus but the ’libaries in’ value looks ok, go with the libarary.

    --p3p-cp
    --p3p-uri

    P3P is a W3C recommendation - http://www.w3.org/TR/P3P/ - for specifying personal information a site collects and what it does with the information. These parameters allow to return P3P information. We do not supply samples.

    --pcap_setnonblock

    On some platforms, the ntop web server will hang or appear to hang (it actually just responds incredibly slowly to the first request from a browser session), while the rest of ntop runs just fine. This is known to be an issue under FreeBSD 4.x.

    This option sets the non-blocking option (assuming it’s available in the version of libpcap that is installed).

    While this works around the problem (by turing an interupt driven process into a poll), it also MAY signifcantly increases the cpu usage of ntop. Although it does not actually interfere with other work, seeing ntop use 80-90% or more of the cpu is not uncommon - don’t say we didn’t warn you.

    THIS OPTION IS OFFICIALLY UNSUPPORTED and used at your own risk. Read the docs/FAQ write-up.

    --skip-version-check

    By default, ntop accesses a remote file to periodically check if the most current version is running. This option disables that check. Please review the privacy notice at the bottom of this page for more information. By default, the recheck period is slightly more than 15 days. This can be adjusted via a constant in globals-defines.h. If the result of the initial check indicates that the ntop version is a ’new development’ version (that is newer than the latest published development version), the recheck is disabled. This is because which fixes and enhancements were present/absent from the code.

    NOTE: At present, the recheck does not work under Windows.

    --ssl-watchdog

    Enable a watchdog for webserver hangs. These usually happen when connecting with older browsers. The user gets nothing back and other users can’t connect. Internally, packet processing continues but there is no way to access the data through the web server or shutdown ntop cleanly. With the watchdog, a timeout occurs after 3 seconds, and processing continues with a log message. Unfortunately, the user sees nothing - it just looks like a failed connection. (also available as a ./configure option, --enable-sslwatchdog)

    --w3c

    By default, ntop generates displayable but not great html. There are a number of tags we do not generate because they cause problems with older browsers which are still commonly used or are important to look good on real-world browsers. This flag tells ntop to generate ’BETTER’ (but not perfect) w3c compliant html 4.01 output. This in no way addresses all of the compatibility and markup issues. Over time, we would like to make ntop more compatible, but it will never be 100%. If you find any issues, please report them to ntop-dev.

    -4 | --ipv4

    Use IPv4 connections.

    -6 | --ipv6

    Use IPv6 connections

    WEB VIEWS

    While ntop is running, multiple users can access the traffic information using their web browsers. ntop does not generate ’fancy’ or ’complex’ html, although it does use frames, shallowly nested tables and makes some use of JavaScript and Cascading Style Sheets.

    Beginning with release 3.1, the menus are cascading dropdowns via JSCookMenu. With release 3.2, this extends to plugins.

    We do not expect problems with any current web browser, but our ability to test with less common ones is very limited. Testing has included Firefox and Internet Explorer, with very limited testing on other current common browsers such as Opera.

    In documentation and this man page, when we refer to a page such as Admin | Switch NIC, we mean the Broad category "Admin" and the detailed item "Switch NIC" on that Admin menu.

    NOTES

    ntop requires a number of external tools and libraries to operate. Certain other tools are optional, but add to the program’s capabilities.
    --webserver-queue

    Specifies the maximum number of web server requests for the tcp/ip stack to retain in it’s queue awaiting delivery to the ntop web server. Requests in excess of this queue may be dropped (allowing for retransmission) or rejected at the tcp/ip stack level, depending upon the OS. Whatever happens, happens at the OS level, without any information being delivered to ntop

    Required libraries include:

    libpcap from http://www.tcpdump.org/, version 0.7.2 or newer. 0.8.3 or newer is strongly recommended.

    The Windows version makes use of WinPcap (libpcap for Windows) which may be downloaded from http://winpcap.polito.it/install/default.htm.

    WARNING: The 2.x releases of WinPcap will NOT support SMP machines.

    gdbm from http://www.gnu.org/software/gdbm/gdbm.html

    ntop requires a POSIX threads library. As of ntop 3.2, the single-threaded version of ntop is no longer available.

    The gd 2.x library, for the creation of png files, available at http://www.boutell.com/gd/.

    The libpng 1.2.x library, for the creation of png files, available at http://www.libpng.org/pub/png/libpng.html.

    ntop should support both gd 1.X and libpng 1.0.x libraries but this has not been tested. Note that there are incompatibilities if you compile with one version of these libraries and then run with the other. Please read the discussion in docs/FAQ before reporting ANY problems of this nature.

    (if an https:// server is desired) openSSL from the OpenSSL project available at http://www.openssl.org.

    The rrdtool library is required by the rrd plugin. rrdtool creates ’Round-Robin databases’ which are used to store and graph historical data in a format that permits long duration retention without growing larger over time. The rrdtool home page is http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/

    ntop includes a limited version of rrdtool 1.0.49 in the myrrd/ directory. Users of ntop 3.2 should not need to specifically install rrdtool.

    The sflow Plugin is courtesy of and supported by InMon Corporation, http://www.inmon.com/sflowTools.htm.

    There are other optional libraries. See the output of ./configure for a fuller listing.

    Tool locations are current as of August 2005 - please send email to report new locations or dead links.

    SEE ALSO

    top(1), tcpdump(8). pcap(3).

    PRIVACY NOTICE

    By default at startup and at periodic intervals, the ntop program will retrieve a file containing current ntop program version information. Retrieving this file allows this ntop instance to confirm that it is running the most current version.

    The retrieval is done using standard http:// requests, which will create log records on the hosting system. These log records do contain information which identifies a specific ntop site. Accordingly, you are being notified that this individually identifiable information is being transmitted and recorded.

    You may request - via the --skip-version-check run-time option - that this check be eliminated. If you use this option, no individually identifiable information is transmitted or recorded, because the entire retrieval and check is skipped.

    We ask you to allow this retrieval and check, because it benefits both you and the ntop developers. It benefits you because you will be automatically notified if the ntop program version is obsolete, becomes unsupported or is no longer current. It benefits the developers of ntop because it allows us to determine the number of active ntop instances, and the operating system/versions that users are running ntop under. This allows us to focus development resources on systems like those our users are using ntop on.

    The individually identifiable information is contained in the web server log records which are automatically created each time the version file is retrieved. This is a function of the web server and not of ntop , but we do take advantage of it. The log record shows the IP address of the requestor (the ntop instance) and a User-Agent header field. We place information in the User-Agent header as follows:

    ntop/<version>
    host/<name from config.guess>
    distro/<if one>
    release/<of the distro, also if one>
    kernrlse/<kernel version or release>
    GCC/<version>
    config() <condensed parameters from ./configure>
    run() <condensed flags - no data - from the execution line>
    libpcap/<version>
    gdbm/<version>
    openssl/<version>
    zlib/<version>
    access/<http, https, both or none>
    interfaces() <given interface names>

    For example:

    ntop/2.2.98 host/i686-pc-linux-gnu distro/redhat release/9 kernrlse/2.4.20-8smp
    GCC/3.2.2 config(i18n) run(i; u; P; w; t; logextra; m; instantsessionpurge;
    schedyield; d; usesyslog=; t) gdbm/1.8.0 openssl/0.9.7a zlib/1.1.4
    access/http interfaces(eth0,eth1)

    Distro and release information is determined at compile time and consists of information typically found in the /etc/release (or similar) file. See the ntop tool linuxrelease for how this is determined.

    gcc compiler version (if available) is the internal version #s for the gcc compiler, e.g. 3.2.3.

    kernrlse is the Linux Kernel version or the xBSD ’release’ such as 4.9-RELEASE and is determined from the uname data (if it’s available).

    The ./configure parameters are stripped of directory paths, leading -s, etc. to create a short form that shows us what ./configure parameters people are using.

    Similarly, the run time parameters are stripped of data and paths, just showing which flags are being used.

    The libpcap, gdbm, openssl and zlib versions come from the strings returned by the various inquiry functions (if they’re availabe).

    Here’s a sample log record:

    67.xxx.xxx.xxx - - [28/Dec/2003:12:11:46 -0500] "GET /version.xml TP/1.0"
    200 1568 www.burtonstrauss.com "-" "ntop/2.2.98 host/i686-pc-linux-gnu
    distro/redhat release/9 kernrlse/2.4.20-8smp GCC/3.2.2 config(i18n)
    run(i; u; P; w; t; logextra; m; instantsessionpurge; schedyield; d;
    usesyslog=) libpcap/0.8 gdbm/1.8.0 openssl/0.9.7a zlib/1.1.4 access/http
    interfaces(eth0,eth1,eth2)" "-"

    USER SUPPORT

    Please send bug reports to the ntop-dev <ntop-dev@ntop.org> mailing list. The ntop <ntop@ntop.org> mailing list is used for discussing ntop usage issues. In order to post messages on the lists a (free) subscription is required to limit/avoid spam. Please do NOT contact the author directly unless this is a personal question.

    Commercial support is available upon request. Please see the ntop site for further info.

    Please send code patches to <patch@ntop.org>.

    AUTHOR

    ntop’s author is Luca Deri (http://luca.ntop.org/) who can be reached at <deri@ntop.org>.

    LICENCE

    ntop is distributed under the GNU GPL licence (http://www.gnu.org/).

    ACKNOWLEDGMENTS

    The author acknowledges the Centro Serra of the University of Pisa, Italy (http://www-serra.unipi.it/) for hosting the ntop sites (both web and mailing lists), and Burton Strauss <burton@ntopsupport.com> for his help and user assistance. Many thanks to Stefano Suin <stefano@ntop.org> and Rocco Carbone <rocco@ntop.org> for contributing to the project.


    ntop-5.0.1+dfsg1/html/phone.gif0000644000000000000000000000064110235447663014752 0ustar rootrootGIF89aÕ¨–qbgdƒŒ’!;Xîîî(R…|k²¢~KHA!$)¤ª­==87Mc½¥tœnslZ0U”›Ÿ333ªyogUFYlTSOtsg±t @CGlneŠƒk(@Yÿÿÿ!ù ,¾@pH,‡…ÁEb\…£p!ùtš@‡ Y„ƒ£BÖDÉ 8‘<Èp $òxH&H‰NöläiQ |d k ˆdd B–{£Ÿc– p© °µd² ds¥|B†· |’ ¥ˆƒCm ˆwEæ–’ET\^RIKMO„¤,;ntop-5.0.1+dfsg1/html/p2p.gif0000644000000000000000000000207707523667755014363 0ustar rootrootGIF87açt¤]t§fœešs«q¨gžm¢e˜t¦lžmže–kšv–$gšÇù@ºî*×ÿ=Èû$ÊÿÇûÌÿÍþÆùÂôÃõ$Íþ=Ãõ>޽‡§6]•Öÿ6½ñ#Ïÿ;¿í2Çô9Äï.Îû/È÷ÐþÊþÔú ­à Àò1¹è@|œ-k¢Ëÿ.ÓÿR†¬LoMnušÈñ=Íù'½í Êú³ãP}Dpj•€8j›¾ê?x˜3. -š¿Éò,Êô/ºß?7X /w;q Ï÷c $ v”ÐóRÂãLf€ )Zz‚›>^‰§ËC H[ ‘§FF\ %8V´#›%y Y{  FX'Í郵Ý;ˆ¦j =\ %Rh Qf "n‹*´Ý6ˆ§w˜&+ ÒñVÂßQrŒ#"@•¼ ƒ¡h‰# ;Ïõ9ÄñÏú$¼á5:T0N ™½4›*k~ *.)Xw¡Æ"Óü$ÃóÐý Âðn“24V˜¼=»ãP‡¤4T‚×þ[™Å¢ÍÈõ:Ðý1ÀðÛýÆ÷Ãõ ÊøšÉ¤ÑÐüC¸è3}žv©Åø7½ð'Ä÷&Ä÷!Å÷ÎþÂóÎþÉüÔüÆü»îÀô!ºí*£e˜¶ç0Àñ4»ì(Ãï,¿ð!¼ë¿ï½íµå´ã¼ì Çð1Äï3¸æ.{r˜ ii¦`…s˜ym‘t˜p“yžo“f^†q˜‚7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,þ0€@$P°€A D0B 0dаC@„1‚D 'P¤P±‚E /`Ä1ƒF 7päбƒG?€2„H#G$Q²„I'O D‘2…J+W°dѲ…K/_À„)"f "eÌœA“FÍ6mܼGÎ:uì AsO={øô)RÅÏ@ BC„P!C‡%RDd£FŽAŠôGÒ$J•,]´%“¦Mœ:yúÄT(Q£H•2u U*U«Xµrõ V,Y³hÕ²u W.]»xõòõ X0aÈ3v Y2e˘5sö Z4iÓ¨%U³v [6mÛ¸uóö \8qãÈ•3w]:uëØµs÷^ËʦÍÛ⸠0 °éµ@nC™ß x°'Æ…ñ8©˜´’×êÊG7ë\^U†S&+Ž» ¹ÌíÊôv5lµ¶î…ôÛÂkÃ6©˜/|þGƒB%¤?!\OòÔA‹¤Ø’Ç}¿¶øÝšO5PªRô”ñžó[!¯ü\å“[už™«0Sôè µ@IÁo¶ÃNO­4ôÚF@-/Œ.Ž&…³ƒÑ<…oÔèû¦Ì¥Å:%OY«‡„Š%Žû€Ñ\f øÔÓHY øjµA%PöYÂ;c ~<™&2ÍÇ»xlŒrC¹ã+¾¶Æ9¹£ +@Õ‡åme¶0‘¯0µÜ`±p8!L²øúñodFfwÜ(,V‰™õ€åí¨x©Ï_¯p$axu(ÎK6ciÃÙA›K…z;¬Ð®ìÛ¹@ëBs^‰¬ÖCÞ›¯óýZd@¨JGœǽÏÐ\æKq\GiØÌxw<ÁÃû W׆R™Á8E¯“…Wdç£ǽØ—ó"‘£ÓvsúuWÕ¯åg¯UØl(¦¹Ï¡BÉSmÁR—Ë…ûSf¢î6Lö[Ü›4Q¦W|®o¤,Á–Ýüâì‚ħݱLläH²#»ÙË^ñg]¹±øwÁÄq/¦-yk,m¬>[H¡ä…ôXÂPwä™4Éõ ÚË’§³{ÂÚ OÇçˆì?wê %Ã)Ãþ¸°²2SôYÝÖÍeîùOØð`ivíyÍeNü ßU{ƒM4ÞIEND®B`‚ntop-5.0.1+dfsg1/html/graph.gif0000644000000000000000000000202310016621665014727 0ustar rootrootGIF89a÷1ÿÿÿÿÿÿÿÿÿÿ÷÷ÿ÷÷ÿ÷÷÷­Æ÷­Æ÷¥½÷¥½÷¥½ïœµïœµï”­ï”­ï”­ïŒ¥ïŒ¥ï„¥ï„¥ï{œï{œï{œïs”ïs”ïs”絽絽絽甥甥甥猥猥猥çkŒçkŒçkŒçZ„çZ„çZ„Þµ½Þµ½Þ¥µÞ¥µÞ¥µÞ”­Þ”­ÞŒ”ÞŒ”Þ„œÞ„œÞ„œÞ„ŒÞ„ŒÞ{”Þ{”Þ{„Þ{„Þ{„Þs”Þs”ÞkŒÞkŒÞkŒÞc„Þc„ÞZ{ÞZ{ÞZ{Ö­½Ö­½Ö­½Ö¥­Ö¥­Ö¥­Ö{”Ö{”Ö{”ÆŒ½ÆŒ½ÆŒ½Æ„ÆÆ„ÆÆRsÆRsÆRs½÷ÿ½÷ÿ½s­½s­½s­½Rs½Rs½Jk½Jk½Bc½Bc½Bc½1Z½1ZµïÿµïÿµïÿµsœµsœµsœµRsµRsµRsµRkµRkµ1Rµ1Rµ1R­çÿ­çÿ­çÿ­sœ­sœ­sœ­s”­s”­s”­Rk­Rk­Rk­1R­1R¥Þ÷¥Þ÷¥Þ÷¥sŒ¥sŒ¥sŒ¥1R¥1R¥1R¥)J¥)J¥)JœÖ÷œÖ÷œÖ÷œÎ÷œÎ÷œÎïœÎïœ1Jœ1Jœ)Jœ)Jœ)J”Îï”Îï”Îï”Æ÷”Æ÷”Æ÷”Æï”Æï”)B”)B”)BŒÆïŒÆïŒÆïŒ½ïŒ½ïŒJ„ŒJ„ŒJ„Œ)BŒ)BŒ)B„½ï„½ï„½ç„½ç„½ç„µï„µï„µï„)9„)9„)9s¥Þs¥Þs¥Þk¥çk¥çk¥Þk¥Þk¥ÞZ”ÎZ”ÎZ”ÎR”ÖR”ÖR”ÎR”ÎR”ÎRŒÖRŒÖRŒÖRŒÎRŒÎRŒÎJŒÆJŒÆJ„ÆJ„ÆJ„ÆBŒ­BŒ­BŒ­B„½B„½B„½B{ÆB{ÆB{ÆB{½B{½9{½9{½9s½9s½9s½9sµ9sµ9sµ1kµ1kµ1kµ1k­1k­1k­)sŒ)sŒ)sŒ)c­)c­)c­!Z¥!Z¥!Z¥RœRœRœR”R”J”J”J”!ù,ðHÀ &„1fÌŠ„TpñÇÇ? þñ’0Å#|øø“‚àFŽWT¼1‚BÈ?Z¢Àç@•9(輑%ÇÈ’(A€ÀÇK’?7n@PjG™°9,•L5´AM¥ †Úv궃0½ÙiÐÀÅ“²l=ÅÖ+ ¬À³ƒ€lƒ q…tŠ©_à\Ä=î ‚Ãy“$é$IH «Æj$RñžhМcH K ÔH˜»xIÊü$©Ô°c¢Göêx•½;õnÚe‚Ïa<'¸ñãÁùñCμ9=åУKŸ;ntop-5.0.1+dfsg1/html/corner.gif0000644000000000000000000000015307414541016015117 0ustar rootrootGIF89a ó1¸»Èµ¸Å½ÀÌÿÿÿôôôîîî!ù, 0È)8Û-zß[€ÛD†ãi jë¾n;ntop-5.0.1+dfsg1/html/linkedin.gif0000644000000000000000000000204111533301511015411 0ustar rootrootGIF89a÷0œ<¢ 5Š 1…I¨/V®?c´ÃÎè6¢ 8.[³/[³ÇÓê<©=“=k¾ÃÑëË×íB¯M´EœA—M{ǶÉèÇÕíçîùIµTºL¥H¡_¾/kÃ\‹Ð¯ÞËÚðó÷ýO»P©dÃ/tÍ.oÈ?zÌ\Ôl™Ø{§àÃÖï[ÈUÂoÏ.tÍ=~Ña™Ýl ßlÜ{ªã€­ä™¼çÃØòÇÚòËÝô×åöaÎcÏ?ˆÚl¤ã{­æ}®å€°ç‡µèÇÜôhÎc \©]ªZ¦?ÚW•Õl¨ã{±æ€´ç½ê¼éËàõÌàõ _©aªl«ã–ÃëÎãöwÑ{´æ~¶æ€·ç¸×òuÎ d©fªJÜl¯ã{¸æ€ºçžÊì×é÷ƒÑ h©jªV¨ßl³ã{»æ€½ç¦Ñî¸ÚòÒçö l©nª p©qª‘Ôb²ál·ã{¾æ€Áç™Íì t©v©vªwªu¦.ž×lºãm»ã{Áæ€Äç×ì÷ v©wª=ªÚyÄå€ÇçšÒì¤×î×í÷€Êçk¤» ×íMµÝ\¸Ø{Èæ‡Íè\ÀàlÆãlÇã~Íæ€ÎçˆÒé{Íæ€ÏçƒÐçÕê÷üýþÿÿÿÿÿÿÿÿ!ù¢,þý9ä§ Ÿ>tä¤S%‰’G†$qšÈ)“#E„ò´!³…I >˜8iòd£F2\žáÀgâ§PLnL9äF>›:… Åh6c´8 bƒC—,QZèÎ1Vš¡QcEC•&5*¤ç™.P¦ðÀ¡„ƒ=‘ít'¨;CXH0‘ e°„1CF†PˆÈÎÎ+RBíˆBD¨  ©£fg”"¡t˜ð€!’)[Ƭ™³gÐ_΄ÙI$G¨&@u À*^²,ùãDŠ,0PÀ$$Œôpñ‚„†àH7þèˆ:8À½;÷G;ntop-5.0.1+dfsg1/html/facebook.gif0000644000000000000000000000022411533301511015366 0ustar rootrootGIF89a³`x«ay¬;Y˜Ebžm„´ëîôÿÿÿÿÿÿ!ù,AðÈI« "ëƒä ö…@aÙšgz„B+¾¡ì‚gŽ ªV°¿[m'Äy4ãF2 8Ÿ„ÓsÀ„>¥NêÓx,àI;ntop-5.0.1+dfsg1/html/collapsed.gif0000644000000000000000000000013607414541016015576 0ustar rootrootGIF89a ¢ÿÀÀÀÌÌÿ»»»™™ÿˆˆˆffÌ!ù, # ¶î¦=ädaØg²¾Ý0›’„À¨Êi)hÄ }®“;ntop-5.0.1+dfsg1/html/user.gif0000644000000000000000000000164411036506736014620 0ustar rootrootGIF89a÷[I2ZI4\H1NNNm—vˆT“d+‘f0–g=»z4†s\‡t^•pA”sGš{T~m¦wMÙ~*Ý,ƒ¶%‡¹+м3ˆa’l’¿@ºu—ÃGšÅMŸÇV§Ìe©Íi•Zâ•Cç£Vç¥Víµlð¿{Ÿ—Œ£££º×†½ÚˆÏµØ¸‰Çß›Êâ£Íã¨Ñæ®Õè´ãÄ—ñÃòÊŽ÷Ú«ùàºÝÙÔÛëÁßíÇûêÏáááêêêÿÿÿ!ù;,wH° Á\¨a`  À°áŽRÀø`€Å2И#A€%TÈ "€:Lˆ!AŽ;t@ØyÓbL#p0 'Á˜/X aAC…¢MÜp±â„(LxIЄPtØàÀÖ‚DÓª%г­Û·;ntop-5.0.1+dfsg1/html/switch.gif0000644000000000000000000000075310002421250015116 0ustar rootrootGIF89aÆ___R~RTyTiiikkkrrrssswww|||=´=:º:7Á77Ä73Ë33Ì34Ë49Î9<Î<>Ï>MŠM__OÇOFÑFMÓMSÔSbÒbfÙfsÜsyÞyÿÿ€€€‚‚‚ƒƒƒ………†††‡‡‡‰‰‰ŠŠŠŒŒŒ’’’“““•••™™™›››œœœžžž®£££¥¥¥¦¦¦ªªª¬¬¬­­­¯¯¯³³³¸¸¸ººº¼¼¼¾¾¾‹ã‹£×£¥è¥²ì²ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÇÇÇÈÈÈËËËÍÍÍÎÎÎÒÒÒÔÔÔ×××ÚÚÚÜÜÜÞÞÞßßßÅðÅËòËÌòÌÙõÙàààãããäääèèèìììîîîïïïìúìðððñññòòòóóóôôôõõõööö÷÷÷òüòùùùúúúûûûüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù,H€‚B„……o„=ƒgoˆ†„„†oa‘›™Ÿlo¢¢Ÿ £OOm¯¬OH§’¦[M¶’¦6Ÿ¢e¶‚;ntop-5.0.1+dfsg1/html/gray_bg.gif0000644000000000000000000000046207414541016015244 0ustar rootrootGIF89aô$ó1¸»Èµ¸Å½ÀÌÿÿÿôôôîîî,ô$çPÈI«½8ëÍ»ÿ`(ŽdÙhª®lë¾p,Ïtmßx®ïsàÿÀ pH,ȤrÉl:ŸÐh’G­Z¯Ø¬v 3y¿à°xL.k¸è´zÍn³¤ð¸|N¯ÛïF·~Ïïûf‚ƒ„…†‰Š‹Œ4x‘’“”B—˜™}‡œžŸ 𣤥W•¨©ª«¬¦¯°±]¡´µ¶·'²º»¦­¾¿ÀÁJ¼ÄŸÈÉÊŸÆÍÎ{ÂÑÒÓ«ÏÖ×\ËÚÛÜaØßà<Ôãäåsáèé3Ýìíîgêñò)æõö÷yóúéïýþìû‚ÃG°`=­E;ntop-5.0.1+dfsg1/html/reflection.js0000644000000000000000000001167311301354272015635 0ustar rootroot/** * reflection.js v2.0 * http://cow.neondragon.net/stuff/reflection/ * Freely distributable under MIT-style license. */ /* From prototype.js */ if (!document.myGetElementsByClassName) { document.myGetElementsByClassName = function(className) { var children = document.getElementsByTagName('*') || document.all; var elements = new Array(); for (var i = 0; i < children.length; i++) { var child = children[i]; var classNames = child.className.split(' '); for (var j = 0; j < classNames.length; j++) { if (classNames[j] == className) { elements.push(child); break; } } } return elements; } } var Reflection = { defaultHeight : 0.5, defaultOpacity: 0.5, add: function(image, options) { Reflection.remove(image); doptions = { "height" : Reflection.defaultHeight, "opacity" : Reflection.defaultOpacity } if (options) { for (var i in doptions) { if (!options[i]) { options[i] = doptions[i]; } } } else { options = doptions; } try { var d = document.createElement('div'); var p = image; var classes = p.className.split(' '); var newClasses = ''; for (j=0;j|y]µ g# øÑ ÁÙ!°ì’ÆŒ9Ÿ2!†T€ !„¾¼z®¼mÝ2°Ó†ˆ Á±ÚË£/ã«ö&_ÈažN8ݾY3àáJDÜ·°@CYaÝä³=ÕX!Ð \,Ë!Ž¡Ëaéà“=¾X±A+E †nÓ!=Ù°ÔЈY0Ƭó¡/.ã@Á8C"ŸtR…C:;ntop-5.0.1+dfsg1/html/Risk_low.gif0000644000000000000000000000152607414541016015425 0ustar rootrootGIF89a ÷1ÿÿÿÿÿÌÿÿ™ÿÿfÿÿ3ÿÿÿÌÿÿÌÌÿÌ™ÿÌfÿÌ3ÿÌÿ™ÿÿ™Ìÿ™™ÿ™fÿ™3ÿ™ÿfÿÿfÌÿf™ÿffÿf3ÿfÿ3ÿÿ3Ìÿ3™ÿ3fÿ33ÿ3ÿÿÿÌÿ™ÿfÿ3ÿÌÿÿÌÿÌÌÿ™ÌÿfÌÿ3ÌÿÌÌÿÌÌÌÌÌ™ÌÌfÌÌ3ÌÌÌ™ÿÌ™ÌÌ™™Ì™fÌ™3Ì™ÌfÿÌfÌÌf™ÌffÌf3ÌfÌ3ÿÌ3ÌÌ3™Ì3fÌ33Ì3ÌÿÌÌÌ™ÌfÌ3Ì™ÿÿ™ÿÌ™ÿ™™ÿf™ÿ3™ÿ™Ìÿ™Ì̙̙™Ìf™Ì3™Ì™™ÿ™™Ì™™™™™f™™3™™™fÿ™fÌ™f™™ff™f3™f™3ÿ™3Ì™3™™3f™33™3™ÿ™Ì™™™f™3™fÿÿfÿÌfÿ™fÿffÿ3fÿfÌÿfÌÌfÌ™fÌffÌ3fÌf™ÿf™Ìf™™f™ff™3f™ffÿffÌff™fffff3fff3ÿf3Ìf3™f3ff33f3fÿfÌf™fff3f3ÿÿ3ÿÌ3ÿ™3ÿf3ÿ33ÿ3Ìÿ3ÌÌ3Ì™3Ìf3Ì33Ì3™ÿ3™Ì3™™3™f3™33™3fÿ3fÌ3f™3ff3f33f33ÿ33Ì33™33f333333ÿ3Ì3™3f333ÿÿÿÌÿ™ÿfÿ3ÿÌÿÌÌÌ™ÌfÌ3Ì™ÿ™Ì™™™f™3™fÿfÌf™fff3f3ÿ3Ì3™3f333ÿÌ™f3îÝ»ªˆwUD"îÝ»ªˆwUD"îÝ»ªˆwUD"îîîÝÝÝ»»»ªªªˆˆˆwwwUUUDDD"""!ù, 3ÿH࿃ø7®¡Ãqÿî1|Ø0âDŠ&”x¯£G  )r É’î¡;ntop-5.0.1+dfsg1/html/bridge.gif0000644000000000000000000000132210016363132015053 0ustar rootrootGIF89a& ö1ÿÿÿ>>>ÈÈÈööö@@@îîîÛÛÛÄÄÄBBBÍÍÍïïïëëë³³³kkkYYY¢¢¢ËËË}}}¿¿¿---æææzzz™™™õõõéééÑÑÑàààŠŠŠÒÒÒ~~~fff®®®WWW ÐÐЃƒƒooošššÓÓÓ•••ªªª’’’yyy¡¡¡ÖÖÖwwwŽŽŽ   ¬¬¬“““dddŸŸŸ–––lll¯¯¯———äää<<<,,,hhh¶¶¶ UUUÇÇǦ¦¦\\\EEE½½½XXX666AAAKKKMMMHHHFFFLLLSSSDDD)))""":::RRR(((»»»ÉÉÉÆÆÆÂÂÂÃÃü¼¼555ÕÕÕÅÅŧ§§ ±±±£££‡‡‡999‹‹‹ÿÿÿ!ùr,& ÿ€rƒ„‚„‡‚r†‡‘’‡“šŽš  ¥¥’‚œ¢”¨ˆŽ¥  §ƒ†É !Ê" #$†%&‚'()*+,-…./0ƒ1 2̇34#5¥67XÂ!J€:vðØÀLN€=¤ RÀÃG ?€òNÈQDа0‚Y)G I‚«’%L>hâDÎ(¢\b` •*V®`É¢eÊ./nèâåK,XªTià’ Q`’„1ÇÓ‡˜ ÄŒQ@¦L™Ìœ1 ¥ š4p/á ˜ÀÀ Q)&T¤ÆÀ·®¼0Ð /Ú8úa ‡N’ÞÀ!ÜI‚¨8ƒ;ntop-5.0.1+dfsg1/html/functions.js0000644000000000000000000000734410570333443015517 0ustar rootroot/** * Sets/unsets the pointer in browse mode * * @param object the table row * @param object the color to use for this row * @param object the background color * * @return boolean whether pointer is set or not */ function setPointer(theRow, thePointerColor, theNormalBgColor) { var theCells = null; if (thePointerColor == '' || typeof(theRow.style) == 'undefined') { return false; } if (typeof(document.getElementsByTagName) != 'undefined') { theCells = theRow.getElementsByTagName('th'); } else if (typeof(theRow.cells) != 'undefined') { theCells = theRow.cells; } else { return false; } var rowCellsCnt = theCells.length; var currentColor = null; var newColor = null; // Opera does not return valid values with "getAttribute" if (typeof(window.opera) == 'undefined' && typeof(theCells[0].getAttribute) != 'undefined' && typeof(theCells[0].getAttribute) != 'undefined') { currentColor = theCells[0].getAttribute('bgcolor'); newColor = (currentColor.toLowerCase() == thePointerColor.toLowerCase()) ? theNormalBgColor : thePointerColor; for (var c = 0; c < rowCellsCnt; c++) { theCells[c].setAttribute('bgcolor', newColor, 0); } // end for } else { currentColor = theCells[0].style.backgroundColor; newColor = (currentColor.toLowerCase() == thePointerColor.toLowerCase()) ? theNormalBgColor : thePointerColor; for (var c = 0; c < rowCellsCnt; c++) { theCells[c].style.backgroundColor = newColor; } } // -------------------- if (typeof(document.getElementsByTagName) != 'undefined') { theCells = theRow.getElementsByTagName('td'); } else if (typeof(theRow.cells) != 'undefined') { theCells = theRow.cells; } else { return false; } var rowCellsCnt = theCells.length; var currentColor = null; var newColor = null; // Opera does not return valid values with "getAttribute" if (typeof(window.opera) == 'undefined' && typeof(theCells[0].getAttribute) != 'undefined' && typeof(theCells[0].getAttribute) != 'undefined') { currentColor = theCells[0].getAttribute('bgcolor'); newColor = (currentColor.toLowerCase() == thePointerColor.toLowerCase()) ? theNormalBgColor : thePointerColor; for (var c = 0; c < rowCellsCnt; c++) { theCells[c].setAttribute('bgcolor', newColor, 0); } // end for } else { currentColor = theCells[0].style.backgroundColor; newColor = (currentColor.toLowerCase() == thePointerColor.toLowerCase()) ? theNormalBgColor : thePointerColor; for (var c = 0; c < rowCellsCnt; c++) { theCells[c].style.backgroundColor = newColor; } } return true; } // end of the 'setPointer()' function function popUp(url) { sealWin=window.open(url,"win",'toolbar=no,width=570,height=200'); sealWin.focus(); } function confirmDelete() { return confirm("Are you sure you want to delete this interface ?"); } function confirmReset() { return confirm("Are you sure you want to reset all statistics ?"); } function confirmShutdown() { return confirm("Are you sure you want to shutdown NTOP?"); } /* Check SVG browser support */ var hasSVGSupport = false; // does client have SVG support? if (navigator.mimeTypes != null && navigator.mimeTypes.length > 0) { if ((navigator.mimeTypes["image/svg+xml"] != null) || (navigator.mimeTypes["image/svg-xml"] != null)) { hasSVGSupport = true; } } ntop-5.0.1+dfsg1/html/router.gif0000644000000000000000000000160507414541016015152 0ustar rootrootGIF89a÷1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿ¥¥ÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿœœÿ!ù,bàÁƒþûc0aÂ…:<ø¯"Ê*”˜±`Ã… '‚¬82$ň€Œh’`É‘,5ºü(¤Â–4/^´Ør Ä•(9"$¹ÓfF£;"UÊ3©R”=E íè3a@;ntop-5.0.1+dfsg1/html/fforward.png0000644000000000000000000000140311121511373015450 0ustar rootroot‰PNG  IHDRóÿabKGDùC» pHYs  šœtIMEÕ -ÙÏ¥IDAT8˽’ÍKTQ‡çÞ;÷œ{gFœ„9ç™´Ätřڴªÿ ˆˆÚ´Î“J¤6‚QXCÑFgQ‘VŠ2H+E­E”Ë´¯MæL~ÌŒ3ÞùòžŽ"Ö2zà…ÃÃy¿óòÿ€Ê>g0ÿâÿ€°ªg@@@mõ _-gÏÝ]4·ÛD$é^XXN¥RiEQV\.W!nï^\ü<’Íd>ÀpgCJ‰S§O.í4'“Ep †É.C͉h4rÎëõr]×Ì ç[‚G'BmÁ.Ç[oYZÁ·<{úÀý ·TUU_½|ÍšC-—¢ÑÈhcã‘ãšKÓÇFÇc‘È…öpÛ¸âL±TôïoY÷û¡S Š¢âÁ@̳¾¶æî¾~­?ŸËS)%úúúk²Ù¬···çÆ¡Ãõg€išà~Í…² Èçr %c<ÓÓS»Ns©äNÿÝ™lº¦³óòna h\¬¬&A°žYc %ì‚ B€µÌ*¥ŽD2•”Œ1c ‚s(œsnŠ¢" BwQÄãOì™Ùi¹ã æÆä›DvdøÅ7Ju¥:ü‚CB ùëÊ•2&&ÆŠ_¿ÙôùêºLÓ}¿\)³óïí·s³ÅìFþq°¥u`vnji{,.  Îña^’¡ø`Éç«‹µ†ÛcnÍS¬TÊ÷†âƒ¥\>?Ò ß4LÓv*­~‚ [ª¢Ì456] X ËDÁ¦Ñ–'¾;ÑÑqµ!аL€Él9[nÝîÙÞ!@lÛ®®'Ù3 ¶U,|(G‚¤¥%°mÛÚâ.RJ¯”’ìsTJIñ?ø ÝsìD MÖIEND®B`‚ntop-5.0.1+dfsg1/html/sorterStyle.css0000755000000000000000000000150011362667036016221 0ustar rootroot.sortable th { text-align:center; height: 30px;} .sortable th h3 { font-size:12px; padding:8px;} .sortable td {padding:4px 6px 6px; } .sortable .head h3 {background-position:right; background-repeat:no-repeat; display:inline; cursor:pointer;} .sortable .desc, .sortable .asc {background-color:#d3e0f3;} .sortable .desc h3{padding:8px 20px 8px 8px; background: url(/arrow_up.png) 100% center no-repeat; display:inline; cursor:pointer;} .sortable .asc h3{padding:8px 20px 8px 8px; background:url(/arrow_down.png) 100% center no-repeat; display:inline; cursor:pointer;} .sortable .head:hover, .sortable .desc:hover, .sortable .asc:hover {color:#fff} .sortable .evenrow td {background:#fff} .sortable .oddrow td {background:#ecf2f6} .sortable td.evenselected {background:#ecf2f6} .sortable td.oddselected {background:#dce6ee}ntop-5.0.1+dfsg1/html/warning.gif0000644000000000000000000000067407414541016015304 0ustar rootrootGIF89aÕÿÌ Ì Ì&0Ì3@Ì@PÌM`ÌYpÌf€ÌsÌ€ŸÌŒ¯Ì™¿Ì¦Ï̳ßÌ¿ïÀÀÀÿÌï¿ß³Ï¦¿™€f@3 ü¿ù³õ¦ò™ïŒì€ésæfâYßMÜ@Ù3Ö&ÒÏ Ì!ù,ÙÀ‡pH,H"ƒPp$ŸÅéT€Z§Îçİ&€cx‘‡Óéœçbãb³Ig\H0aì'{ '‹" {%(—&Ug'—(™[ ^`bl¤l%^'v®vnpOs €—¯v#zHRv—€ƒI‡€‹Õ!'‘G”Õ¹€dGikáÂÕ§'©D«ëâÕ%E'ñûv'Cæ|àGB±€'*\ȰaBD˜H±¢Å‹º²;ntop-5.0.1+dfsg1/html/jquery-ui-1.8.16.custom.min.js0000644000000000000000000063303711660052352020267 0ustar rootroot/*! * jQuery UI 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI */ (function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.16", keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({propAttr:c.fn.prop||c.fn.attr,_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d= this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this, "overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart": "mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight, outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a, "tabindex"),d=isNaN(b);return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&& a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted= false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); ;/* * jQuery UI Position 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Position */ (function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); ;/* * jQuery UI Draggable 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Draggables * * Depends: * jquery.ui.core.js * jquery.ui.mouse.js * jquery.ui.widget.js */ (function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== "original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;if(b.iframeFix)d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('
    ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options; this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}); this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);d.ui.ddmanager&&d.ui.ddmanager.dragStart(this,a);return true}, _mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b= false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration, 10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});d.ui.ddmanager&&d.ui.ddmanager.dragStop(this,a);return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle|| !d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&& a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent= this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"), 10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"), 10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[a.containment=="document"?0:d(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,a.containment=="document"?0:d(window).scrollTop()-this.offset.relative.top-this.offset.parent.top, (a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!= "hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"), 10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+ this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&& !(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.leftg[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=b.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1]:this.originalPageY;h=g?!(h-this.offset.click.topg[3])?h:!(h-this.offset.click.topg[2])?e:!(e-this.offset.click.left=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){e(this).removeClass("ui-resizable-autohide");b._handles.show()}},function(){if(!a.disabled)if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy(); var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a= false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"}); this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff= {width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis]; if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false}, _mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f, {top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(b){var a=this.options,c,d,f;a={minWidth:k(a.minWidth)?a.minWidth:0,maxWidth:k(a.maxWidth)?a.maxWidth:Infinity,minHeight:k(a.minHeight)?a.minHeight:0,maxHeight:k(a.maxHeight)?a.maxHeight: Infinity};if(this._aspectRatio||b){b=a.minHeight*this.aspectRatio;d=a.minWidth/this.aspectRatio;c=a.maxHeight*this.aspectRatio;f=a.maxWidth/this.aspectRatio;if(b>a.minWidth)a.minWidth=b;if(d>a.minHeight)a.minHeight=d;if(cb.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&l)b.left=i-a.minWidth;if(d&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left= null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+ a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+ c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]); b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.16"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(), 10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top- f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var l=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:l.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(l.css("position"))){c._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType? e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a= e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing, step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement= e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset; var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left: a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top- d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition, f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25, display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b= e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height= d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery); ;/* * jQuery UI Selectable 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Selectables * * Depends: * jquery.ui.core.js * jquery.ui.mouse.js * jquery.ui.widget.js */ (function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
    ")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable"); this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a=== "disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&& !b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top, left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]}; this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!= document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a); return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0], e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset(); c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"): this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null, dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")}, toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith(); if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b= this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f= d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")|| 0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out", a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h- f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g- this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this, this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop", a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a= this.options;if(a.icons){c("").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"); this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(), e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight|| e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", "aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.16", animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/); f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide", paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); ;/* * jQuery UI Autocomplete 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Autocomplete * * Depends: * jquery.ui.core.js * jquery.ui.widget.js * jquery.ui.position.js */ (function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.propAttr("readOnly"))){g= false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!= a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)}; this.menu=d("
      ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"); d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length
    • ").data("item.autocomplete",b).append(d("").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); (function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", -1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.scrollTop(),c=this.element.height();if(b<0)this.element.scrollTop(g+b);else b>=c&&this.element.scrollTop(g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b, this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| this.first()?":last":":first"))},hasScroll:function(){return this.element.height()").addClass("ui-button-text").html(this.options.label).appendTo(a.empty()).text(),e=this.options.icons,f=e.primary&&e.secondary,d=[];if(e.primary||e.secondary){if(this.options.text)d.push("ui-button-text-icon"+(f?"s":e.primary?"-primary":"-secondary"));e.primary&&a.prepend("");e.secondary&&a.append("");if(!this.options.text){d.push(f?"ui-button-icons-only": "ui-button-icon-only");this.hasTitle||a.attr("title",c)}}else d.push("ui-button-text-only");a.addClass(d.join(" "))}}});b.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(a,c){a==="disabled"&&this.buttons.button("option",a,c);b.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var a=this.element.css("direction")=== "ltr";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(a?"ui-corner-left":"ui-corner-right").end().filter(":last").addClass(a?"ui-corner-right":"ui-corner-left").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"); b.Widget.prototype.destroy.call(this)}})})(jQuery); ;/* * jQuery UI Dialog 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Dialog * * Depends: * jquery.ui.core.js * jquery.ui.widget.js * jquery.ui.button.js * jquery.ui.draggable.js * jquery.ui.mouse.js * jquery.ui.position.js * jquery.ui.resizable.js */ (function(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false, position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
      ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&!i.isDefaultPrevented()&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
      ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id", e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()};c.ui.dialog.maxZ+=1; d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
      ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
      ").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a, function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close", handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition, originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize", f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "): [a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f); if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"): e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a= this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height- b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.16",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "), create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&& c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(b.range==="min"||b.range==="max"?" ui-slider-range-"+b.range:""))}for(var j=c.length;j"); this.handles=c.add(d(e.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle", g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!a.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");i=a._start(g,l);if(i===false)return}break}m=a.options.step;i=a.options.values&&a.options.values.length? (h=a.values(l)):(h=a.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(i+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(i-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===a._valueMax())return;h=a._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===a._valueMin())return;h=a._trimAlignValue(i- m);break}a._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(g,k);a._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); return this},_mouseCapture:function(a){var b=this.options,c,f,e,j,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(b.range===true&&this.values(1)===b.min){g+=1;e=d(this.handles[g])}if(this._start(a,g)===false)return false; this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();b=e.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-e.width()/2,top:a.pageY-b.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b= this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b= this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b); c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var f;if(this.options.values&&this.options.values.length){f=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>f||b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= this.options.range,b=this.options,c=this,f=!this._animateOff?b.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({width:e- g+"%"},{queue:false,duration:b.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:b.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[f?"animate":"css"]({width:e+"%"}, b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.16"})})(jQuery); ;/* * jQuery UI Tabs 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Tabs * * Depends: * jquery.ui.core.js * jquery.ui.widget.js */ (function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
      ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
    • #{label}
    • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| (q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= -1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, "cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.16"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k'))}function N(a){return a.bind("mouseout", function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); b.addClass("ui-state-hover");b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.16"}});var B=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv}, setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g, "\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('
      '))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b);b.settings.disabled&&this._disableDatepicker(a)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c== "focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f==""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker(): d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a, b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.settings.disabled&&this._disableDatepicker(a);b.dpDiv.css("display","block")}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+= 1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/ 2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b= d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e= a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a, "datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f== a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input", a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=d.datepicker._get(b,"beforeShow");c=c?c.apply(a,[a,b]):{};if(c!==false){H(b.settings,c);b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value= "";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b); c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing= true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}); a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&& !a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(), h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b= this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b); this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, _checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): 0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e["selected"+(c=="M"? "Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a); this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField"); if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"? b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd", COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames: null)||this._defaults.monthNames;var i=function(o){(o=k+1 12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&& a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m, g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+s+"":f?"":''+s+"";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&& a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
      '+(c?h:"")+(this._isInRange(a,s)?'":"")+(c?"":h)+"
      ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='
      '+(/all|left/.test(t)&& x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'
      ';var z=j?'":"";for(t=0;t<7;t++){var r=(t+h)%7;z+="=5?' class="ui-datepicker-week-end"':"")+'>'+q[r]+""}y+=z+"";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q";var R=!j?"":'";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&ro;R+='";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+""}g++;if(g>11){g=0;m++}y+="
      '+this._get(a,"weekHeader")+"
      '+this._get(a,"calculateWeek")(r)+""+(F&&!D?" ":L?''+ r.getDate()+"":''+r.getDate()+"")+"
      "+(l?""+(i[0]>0&&G==i[1]-1?'
      ':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': "");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
      ',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b, e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
      ";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+ (c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input? a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c, e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a, "dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this; if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a== "string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.16";window["DP_jQuery_"+B]=d})(jQuery); ;/* * jQuery UI Progressbar 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Progressbar * * Depends: * jquery.ui.core.js * jquery.ui.widget.js */ (function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
      ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.16"})})(jQuery); ;/* * jQuery UI Effects 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/ */ jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], 16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", "borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, 0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, 211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})}; f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, [{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.16",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}), d=document.activeElement;c.wrap(b);if(c[0]===d||f.contains(c[0],d))f(d).focus();b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(e,g){a[g]=c.css(g);if(isNaN(parseInt(a[g],10)))a[g]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){var a,b=document.activeElement; if(c.parent().is(".ui-effects-wrapper")){a=c.parent().replaceWith(c);if(c[0]===b||f.contains(c[0],b))f(b).focus();return a}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)}); return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this, arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/ 2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b, d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c, a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b, d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); ;/* * jQuery UI Effects Fade 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/Fade * * Depends: * jquery.effects.core.js */ (function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); ;/* * jQuery UI Effects Fold 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/Fold * * Depends: * jquery.effects.core.js */ (function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], 10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); ;/* * jQuery UI Effects Highlight 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/Highlight * * Depends: * jquery.effects.core.js */ (function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); ;/* * jQuery UI Effects Pulsate 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Effects/Pulsate * * Depends: * jquery.effects.core.js */ (function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); b.dequeue()})})}})(jQuery); ;ntop-5.0.1+dfsg1/html/sankey.js0000644000000000000000000001631211775026165015004 0ustar rootrootd3.sankey = function() { var sankey = {}, nodeWidth = 24, nodePadding = 8, size = [1, 1], nodes = [], links = []; sankey.nodeWidth = function(_) { if (!arguments.length) return nodeWidth; nodeWidth = +_; return sankey; }; sankey.nodePadding = function(_) { if (!arguments.length) return nodePadding; nodePadding = +_; return sankey; }; sankey.nodes = function(_) { if (!arguments.length) return nodes; nodes = _; return sankey; }; sankey.links = function(_) { if (!arguments.length) return links; links = _; return sankey; }; sankey.size = function(_) { if (!arguments.length) return size; size = _; return sankey; }; sankey.layout = function(iterations) { computeNodeLinks(); computeNodeValues(); computeNodeBreadths(); computeNodeDepths(iterations); computeLinkDepths(); return sankey; }; sankey.relayout = function() { computeLinkDepths(); return sankey; }; sankey.link = function() { var curvature = .5; function link(d) { var x0 = d.source.x + d.source.dx, x1 = d.target.x, xi = d3.interpolateNumber(x0, x1), x2 = xi(curvature), x3 = xi(1 - curvature), y0 = d.source.y + d.sy + d.dy / 2, y1 = d.target.y + d.ty + d.dy / 2; return "M" + x0 + "," + y0 + "C" + x2 + "," + y0 + " " + x3 + "," + y1 + " " + x1 + "," + y1; } link.curvature = function(_) { if (!arguments.length) return curvature; curvature = +_; return link; }; return link; }; // Populate the sourceLinks and targetLinks for each node. // Also, if the source and target are not objects, assume they are indices. function computeNodeLinks() { nodes.forEach(function(node) { node.sourceLinks = []; node.targetLinks = []; }); links.forEach(function(link) { var source = link.source, target = link.target; if (typeof source === "number") source = link.source = nodes[link.source]; if (typeof target === "number") target = link.target = nodes[link.target]; source.sourceLinks.push(link); target.targetLinks.push(link); }); } // Compute the value (size) of each node by summing the associated links. function computeNodeValues() { nodes.forEach(function(node) { node.value = Math.max( d3.sum(node.sourceLinks, value), d3.sum(node.targetLinks, value) ); }); } // Iteratively assign the breadth (x-position) for each node. // Nodes are assigned the maximum breadth of incoming neighbors plus one; // nodes with no incoming links are assigned breadth zero, while // nodes with no outgoing links are assigned the maximum breadth. function computeNodeBreadths() { var remainingNodes = nodes, nextNodes, x = 0; while (remainingNodes.length) { nextNodes = []; remainingNodes.forEach(function(node) { node.x = x; node.dx = nodeWidth; node.sourceLinks.forEach(function(link) { nextNodes.push(link.target); }); }); remainingNodes = nextNodes; ++x; } // moveSinksRight(x); scaleNodeBreadths((width - nodeWidth) / (x - 1)); } function moveSourcesRight() { nodes.forEach(function(node) { if (!node.targetLinks.length) { node.x = d3.min(node.sourceLinks, function(d) { return d.target.x; }) - 1; } }); } function moveSinksRight(x) { nodes.forEach(function(node) { if (!node.sourceLinks.length) { node.x = x - 1; } }); } function scaleNodeBreadths(kx) { nodes.forEach(function(node) { node.x *= kx; }); } function computeNodeDepths(iterations) { var nodesByBreadth = d3.nest() .key(function(d) { return d.x; }) .sortKeys(d3.ascending) .entries(nodes) .map(function(d) { return d.values; }); // initializeNodeDepth(); resolveCollisions(); for (var alpha = 1; iterations > 0; --iterations) { relaxRightToLeft(alpha *= .99); resolveCollisions(); relaxLeftToRight(alpha); resolveCollisions(); } function initializeNodeDepth() { var ky = d3.min(nodesByBreadth, function(nodes) { return (size[1] - (nodes.length - 1) * nodePadding) / d3.sum(nodes, value); }); nodesByBreadth.forEach(function(nodes) { nodes.forEach(function(node, i) { node.y = i; node.dy = node.value * ky; }); }); links.forEach(function(link) { link.dy = link.value * ky; }); } function relaxLeftToRight(alpha) { nodesByBreadth.forEach(function(nodes, breadth) { nodes.forEach(function(node) { if (node.targetLinks.length) { var y = d3.sum(node.targetLinks, weightedSource) / d3.sum(node.targetLinks, value); node.y += (y - center(node)) * alpha; } }); }); function weightedSource(link) { return center(link.source) * link.value; } } function relaxRightToLeft(alpha) { nodesByBreadth.slice().reverse().forEach(function(nodes) { nodes.forEach(function(node) { if (node.sourceLinks.length) { var y = d3.sum(node.sourceLinks, weightedTarget) / d3.sum(node.sourceLinks, value); node.y += (y - center(node)) * alpha; } }); }); function weightedTarget(link) { return center(link.target) * link.value; } } function resolveCollisions() { nodesByBreadth.forEach(function(nodes) { var node, dy, y0 = 0, n = nodes.length, i; // Push any overlapping nodes down. nodes.sort(ascendingDepth); for (i = 0; i < n; ++i) { node = nodes[i]; dy = y0 - node.y; if (dy > 0) node.y += dy; y0 = node.y + node.dy + nodePadding; } // If the bottommost node goes outside the bounds, push it back up. dy = y0 - nodePadding - size[1]; if (dy > 0) { y0 = node.y -= dy; // Push any overlapping nodes back up. for (i = n - 2; i >= 0; --i) { node = nodes[i]; dy = node.y + node.dy + nodePadding - y0; if (dy > 0) node.y -= dy; y0 = node.y; } } }); } function ascendingDepth(a, b) { return a.y - b.y; } } function computeLinkDepths() { nodes.forEach(function(node) { node.sourceLinks.sort(ascendingTargetDepth); node.targetLinks.sort(ascendingSourceDepth); }); nodes.forEach(function(node) { var sy = 0, ty = 0; node.sourceLinks.forEach(function(link) { link.sy = sy; sy += link.dy; }); node.targetLinks.forEach(function(link) { link.ty = ty; ty += link.dy; }); }); function ascendingSourceDepth(a, b) { return a.source.y - b.source.y; } function ascendingTargetDepth(a, b) { return a.target.y - b.target.y; } } function center(node) { return node.y + node.dy / 2; } function value(link) { return link.value; } return sankey; }; ntop-5.0.1+dfsg1/html/autosuggest.css0000644000000000000000000000604611324366206016234 0ustar rootroot/* ================================================ autosuggest, inquisitor style ================================================ */ body { position: relative; } div.autosuggest { position: absolute; background-image: url(img_inquisitor/as_pointer.gif); background-position: top; background-repeat: no-repeat; padding: 10px 0 0 0; } div.autosuggest div.as_header, div.autosuggest div.as_footer { position: relative; height: 6px; padding: 0 6px; background-image: url(img_inquisitor/ul_corner_tr.gif); background-position: top right; background-repeat: no-repeat; overflow: hidden; } div.autosuggest div.as_footer { background-image: url(img_inquisitor/ul_corner_br.gif); } div.autosuggest div.as_header div.as_corner, div.autosuggest div.as_footer div.as_corner { position: absolute; top: 0; left: 0; height: 6px; width: 6px; background-image: url(img_inquisitor/ul_corner_tl.gif); background-position: top left; background-repeat: no-repeat; } div.autosuggest div.as_footer div.as_corner { background-image: url(img_inquisitor/ul_corner_bl.gif); } div.autosuggest div.as_header div.as_bar, div.autosuggest div.as_footer div.as_bar { height: 6px; overflow: hidden; background-color: #333; } div.autosuggest ul { list-style: none; margin: 0 0 -4px 0; padding: 0; overflow: hidden; background-color: #333; } div.autosuggest ul li { color: #ccc; padding: 0; margin: 0 4px 4px; text-align: left; } div.autosuggest ul li a { color: #ccc; display: block; text-decoration: none; background-color: transparent; text-shadow: #000 0px 0px 5px; position: relative; padding: 0; width: 100%; } div.autosuggest ul li a:hover { background-color: #444; } div.autosuggest ul li.as_highlight a:hover { background-color: #1B5CCD; } div.autosuggest ul li a span { display: block; padding: 3px 6px; font-weight: bold; } div.autosuggest ul li a span small { font-weight: normal; color: #999; } div.autosuggest ul li.as_highlight a span small { color: #ccc; } div.autosuggest ul li.as_highlight a { color: #fff; background-color: #1B5CCD; background-image: url(img_inquisitor/hl_corner_br.gif); background-position: bottom right; background-repeat: no-repeat; } div.autosuggest ul li.as_highlight a span { background-image: url(img_inquisitor/hl_corner_bl.gif); background-position: bottom left; background-repeat: no-repeat; } div.autosuggest ul li a .tl, div.autosuggest ul li a .tr { /* background-image: transparent; */ background-color: transparent; background-repeat: no-repeat; width: 6px; height: 6px; position: absolute; top: 0; padding: 0; margin: 0; } div.autosuggest ul li a .tr { right: 0; } div.autosuggest ul li.as_highlight a .tl { left: 0; background-image: url(img_inquisitor/hl_corner_tl.gif); background-position: bottom left; } div.autosuggest ul li.as_highlight a .tr { right: 0; background-image: url(img_inquisitor/hl_corner_tr.gif); background-position: bottom right; } div.autosuggest ul li.as_warning { font-weight: bold; text-align: center; } div.autosuggest ul em { font-style: normal; color: #6EADE7; }ntop-5.0.1+dfsg1/html/deleteURL.gif0000644000000000000000000000215707414541016015462 0ustar rootrootGIF89a ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïïïïïïïçççççÞÞÞÞÞÖÿÿÖÿÿÖÿÿÖÿÿÖÿÿÖÿ1Öÿ1Öÿ1Öÿ1Öÿ1ÎÿÿÎÿÿÎÿÿÎÿÿÎÿÿ¥ÿ9¥ÿ9¥ÿ9¥ÿ9¥ÿ1¥ÿ1¥ÿ1¥ÿ1¥ÿ1œÿ9œÿ9œÿ9œÿ9œÿ1œÿ1œÿ1œÿ1œÿ1œÖœÖœÖœÖœÖkÖkÖkÖkÖkÖk¥ÿk¥ÿk¥ÿk¥ÿk¥ÿk¥k¥k¥k¥kœkœkœkœkœcÖcÖcÖcÖcÎcÎcÎcÎcÎc¥ÿc¥ÿc¥ÿc¥ÿc¥ÿc¥c¥c¥c¥c¥ZZZZZZZZZZZZZZRZZRZZRZZRZZR9¥ÿ9¥ÿ9¥ÿ9¥ÿ9¥ÿ1¥ÿ1¥ÿ1¥ÿ1¥ÿ1¥1¥1¥1¥1œÿ1œÿ1œÿ1œÿ1œÿ1œk1œk1œk1œk1œk1œ1œ1œ1œ1œ1kÿ1kÿ1kÿ1kÿ1kÿ1k1k1k1k1k1cÿ1cÿ1cÿ1cÿ1cÿ1c11c11c11c11c11c1c1c1c1c!)!!)!!)!!)!!)!!!)!!)!!)!!)!!)!!!!!!!!!!!!!!!!!!!!kÿkÿkÿkÿkÿcÿcÿcÿcÿcÿ9¥9¥9¥9¥9k9k9k9k9c9c9c9c1ÿ1ÿ1ÿ1ÿ1ÿ1Ö1Ö1Ö1Ö1Ö1Î1Î1Î1Î1Î1¥1¥1¥1¥1¥1œ1œ1œ1œ1œ1k1k1k1k1k1c1c1c1c1c!ù, ÿHP ƒ\Èp`‡6„h€B‹%:̸#B8JY0!È’š<¹qeK,_º ©a™8˼¤@¦ÁšoÊ@ôο2W¦$øïÑD~dñCdÊ¥›þˆ"Æ;ò$ø+€2Ü~ ð@Ä눇:QÎðïÚV^Ã"ä…âŸJ‘h¹%‰¬íC7Å•é3ë2ni¯zHdÏW¿=VdŽÛ5nV(»QlfÆLs öpÏE¤¯þyÐ"Á[ËÖq{ˆEÒÜn’‹uÔ¿elµ’ òlƒ¶ õPp“I?N¶&VY u?L*ô(÷³ç=iû|¸,÷£òëÎÿZ6¡ñgÏáÿÇ]nwˆÓÉ‚Ó?·LTQc´a“z Í’ƒ2DÒ|f¡&!EJwa†.¨Y‡;ntop-5.0.1+dfsg1/html/back.png0000644000000000000000000000120511121511373014536 0ustar rootroot‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ /NGYIDAT8Ë¥“ËkSQÆ¿sϽÞ<1©·IÚhI U«nŠ è.¡ý\¹DÄ‚J}Twn \ .´’"®”<–bVFL4‡¥öœPóÀØÞsÍqQ‹†Ôo503?˜of€HJ©ôbeÀF*¥ôÀ#Œ­{’™—g.^ºãŒ‘^Ní×üneÅ“Ï玦2©ûN‡3`·ë]Vçè H§3NÓÜKe^Üi·Zñ©©ct:zŠ\¾2'9«ÿH$tEQ¼åÚ‡ÓÅÂÇÛ“‡&µsgÏS˲ Ó„s¶pwiIÈžÕµÊñr¹ro"4áž¿zRUEuµ!¶ €0MpÎ÷àÖ‚±öy=DUyÃ0ŒØõù›ÄápFë „% ©*4M˜¦cxÀ9o·Ú¦ËíÒ†‡}RX‚t¾}…M·Án³º² –@ý—(d³Y+—{Ëw»<Ï ÅB1IŸünYÔï¥CCtݪPPJ‘H<–Îæb>ŸoþôT*•6÷ojÕO+µêh*•—R’¿R•BSwayù‘ÜØh,VÊåæ?÷‰Dh0ŢəٸùôÙK!gfãV8Þ׫#ýÉ0 ‡®ë‰< TÝ/¥T^¿ÊçÕAÈíóùNLÇ¢ïŒa‡¢¼ÿØv€?4¡ØÊ,œ8‡IEND®B`‚ntop-5.0.1+dfsg1/html/jquery-ui-1.8.16.custom.css0000644000000000000000000010114211660052352017644 0ustar rootroot/* * jQuery UI CSS Framework 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Theming/API */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .ui-helper-clearfix { display: inline-block; } /* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix { height:1%; } .ui-helper-clearfix { display:block; } /* end clearfix */ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } /* * jQuery UI CSS Framework 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Theming/API * * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px */ /* Component containers ----------------------------------*/ .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } .ui-widget .ui-widget { font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } .ui-widget-content a { color: #222222; } .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } .ui-widget-header a { color: #222222; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } .ui-widget :active { outline: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } /* positioning */ .ui-icon-carat-1-n { background-position: 0 0; } .ui-icon-carat-1-ne { background-position: -16px 0; } .ui-icon-carat-1-e { background-position: -32px 0; } .ui-icon-carat-1-se { background-position: -48px 0; } .ui-icon-carat-1-s { background-position: -64px 0; } .ui-icon-carat-1-sw { background-position: -80px 0; } .ui-icon-carat-1-w { background-position: -96px 0; } .ui-icon-carat-1-nw { background-position: -112px 0; } .ui-icon-carat-2-n-s { background-position: -128px 0; } .ui-icon-carat-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -64px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -64px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 0 -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-off { background-position: -96px -144px; } .ui-icon-radio-on { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-start { background-position: -80px -160px; } /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } /* Overlays */ .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* * jQuery UI Resizable 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Resizable#theming */ .ui-resizable { position: relative;} .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* * jQuery UI Selectable 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Selectable#theming */ .ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } /* * jQuery UI Accordion 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Accordion#theming */ /* IE/Win - Fix animation bug - #4615 */ .ui-accordion { width: 100%; } .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } .ui-accordion .ui-accordion-li-fix { display: inline; } .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } .ui-accordion .ui-accordion-content-active { display: block; } /* * jQuery UI Autocomplete 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Autocomplete#theming */ .ui-autocomplete { position: absolute; cursor: default; } /* workarounds */ * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ /* * jQuery UI Menu 1.8.16 * * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Menu#theming */ .ui-menu { list-style:none; padding: 2px; margin: 0; display:block; float: left; } .ui-menu .ui-menu { margin-top: -3px; } .ui-menu .ui-menu-item { margin:0; padding: 0; zoom: 1; float: left; clear: left; width: 100%; } .ui-menu .ui-menu-item a { text-decoration:none; display:block; padding:.2em .4em; line-height:1.5; zoom:1; } .ui-menu .ui-menu-item a.ui-state-hover, .ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; } /* * jQuery UI Button 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Button#theming */ .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ .ui-button-icons-only { width: 3.4em; } button.ui-button-icons-only { width: 3.7em; } /*button text element */ .ui-button .ui-button-text { display: block; line-height: 1.4; } .ui-button-text-only .ui-button-text { padding: .4em 1em; } .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } /* no icon support for input elements, provide padding by default */ input.ui-button { padding: .4em 1em; } /*button icon element(s) */ .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } /*button sets*/ .ui-buttonset { margin-right: 7px; } .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } /* workarounds */ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ /* * jQuery UI Dialog 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Dialog#theming */ .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } .ui-draggable .ui-dialog-titlebar { cursor: move; } /* * jQuery UI Slider 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Slider#theming */ .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; }/* * jQuery UI Tabs 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Tabs#theming */ .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tabs .ui-tabs-hide { display: none !important; } /* * jQuery UI Datepicker 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Datepicker#theming */ .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left:2px; } .ui-datepicker .ui-datepicker-next { right:2px; } .ui-datepicker .ui-datepicker-prev-hover { left:1px; } .ui-datepicker .ui-datepicker-next-hover { right:1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } .ui-datepicker select.ui-datepicker-month-year {width: 100%;} .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 49%;} .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width:auto; } .ui-datepicker-multi .ui-datepicker-group { float:left; } .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } .ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } .ui-datepicker-rtl .ui-datepicker-group { float:right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ .ui-datepicker-cover { display: none; /*sorry for IE5*/ display/**/: block; /*sorry for IE5*/ position: absolute; /*must have*/ z-index: -1; /*must have*/ filter: mask(); /*must have*/ top: -4px; /*must have*/ left: -4px; /*must have*/ width: 200px; /*must have*/ height: 200px; /*must have*/ }/* * jQuery UI Progressbar 1.8.16 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Progressbar#theming */ .ui-progressbar { height:2em; text-align: left; } .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }ntop-5.0.1+dfsg1/html/skype.gif0000644000000000000000000000060610417211600014753 0ustar rootrootGIF89aÕ°ð¨ðhÐð°ð°ðxÐø`Èð ¸ðxÐð@Àð àøˆØø°ðhÈð0¸ðXÈð(¸ðPÈðHÀð¸ðHÈðØø€Ðø€Øø˜àøpÐð°àø¨àø°èø¸èøÈðøÀèøÐðøØðø0Àðèøøðøø8Àðøøø!ù(,£@J@HaÀÒáÅäÉÉ`’‰"R@ šƒ u$£ÀQÀY0¥SùTªp…‚E³8- $jJotFC  '—%E‘DqQC Dr¦C '""'¥¦ q—¼‘(#&&Æ(#ØÛ ÔxD ]R^¦A;ntop-5.0.1+dfsg1/html/arrow_up.png0000644000000000000000000000121411121511373015474 0ustar rootroot‰PNG  IHDRóÿasBIT|dˆtEXtSoftwarewww.inkscape.org›î<IDAT8•“OhAÆ¿7»3Ù…zhLÿÑ‚íÁ@*¨ÐÕŠhDbE-rkJÉIbÁ«ÇR‘ EO¥BñâM*^DPÐC)´*•”4‰¦š&ÙÙQ¬!©ößûæÇ|ß›!­5ÚÕÉ›|–f½évÖnà¸<ÝßIöuL:.Oï à¸<û²WÎLÇF“Á€f—Gÿ ฼„ʼnsÓÖ–—Ç–·‰øÈ% „EÇåÿáÑèp¢§74HŸKð±ô:Ñ ÂÃ]ŽËÓý"‰³GÇùJþ Æa2ŽWk ˆ ¡ý=‰æ<ØŽÃQÁíl*áÚëåehò „‰:}Ç6ñ.ÿN_ š¦ø+¶Ó÷ÔXÆRä¡"Kà(ËuÛ@A®¢¨VqþÔE‹ØŸ<Øoßñcã݇úb”¯¬Áä87PQT¯6ƒ°–¿½@¸7DG‡‰5ò ‘Œ™èŽdoLܱ@A‡‡×¹¼-<ƒd#$2ÐZC) ^¯áñÓùJ±´9cCêSnÅž¹w¹á‰£z÷ú«,sðmpÁÀL‚Á snWeM[¿ì‰!e.ÍzNÓ&´Ö ¥ú0ƒ`ph@dM[/ç<Úõ€Ò>~Ô‹+û²® Uë?c¶júJ¢ZÛ†25 |Ið½=¤/¼b1ö lܺ?n%&ÂFsï'0÷Å۶К"IEND®B`‚ntop-5.0.1+dfsg1/html/spacer.gif0000644000000000000000000000007210156113463015102 0ustar rootrootGIF89a€™ff!ù,„©Ëí£œ´Ú‹³Þ¼û¯;ntop-5.0.1+dfsg1/html/vgauge.jpg0000644000000000000000000000677407414541016015137 0ustar rootrootÿØÿàJFIFddÿÛC    #%$""!&+7/&)4)!"0A149;>>>%.DIC;ÿÛC  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ÿÀè "ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?OxDÔü-ö›íÒY¢‹‡*rHîpFMy¦½*¦³p‘[[ĈØUHÀ¯Zøsÿ"t¿õʼƒ_ÿå×ûõë´¬þ_‘¯ü8ÿ‘:oúå^Aâù]¾kØ>ÿÈ7ýr¯ñü‡.¿ß5Ogòü„_øqÿ"tÿõʼƒÄòºÿ|ׯü8ÿ‘:úå^Aâù]¾h{?—äõÿ‡ò'Oÿ\«È ÿå×û懳ù~@_øp3àé½£þ•ä ÿå×û潃áÇü‰Ó×*ñÿÈrëýóCÙü¿ G¯ü7ÿ‘:oúå^Aâù]¾k×þÈ?ýr¯ ñü‡.¿ß4=ŸËòzÿÃù§ÿ®Uä ÿå×ûæ½áÇü‰óÿ×*òÈrëýóCÙü¿ G¯ü8þé¿ë•yˆ?ä9uþù¯`øoÿ"tßõʼÄòºÿ|Ðö/Èëÿ ÿäNŸþ¹WxƒþC—_ïšõÿ‡ò'Oÿ\«È—þ¹×kÿòºÿ|ׯ|7ÿ‘:o÷+Èuïù]ÿ×CO£ù~@z÷Ãù&ÿr¼‡^ÿåßýt5ëÿF<?ýrʼƒ_ÿå×ûæ—Gòü€õx‡CÓ<*moµ‹Hfš!„,r:ƒ^g¯Æ­¬Ü ol && l && l" + val.substring(st, st+this.sInp.length) + "" + val.substring(st+this.sInp.length); var span = _b.DOM.cE("span", {}, output, true); if (arr[i].info != "") { var br = _b.DOM.cE("br", {}); span.appendChild(br); var small = _b.DOM.cE("small", {}, arr[i].info); span.appendChild(small); } var a = _b.DOM.cE("a", { href:"#" }); var tl = _b.DOM.cE("span", {className:"tl"}, " "); var tr = _b.DOM.cE("span", {className:"tr"}, " "); a.appendChild(tl); a.appendChild(tr); a.appendChild(span); a.name = i+1; a.onclick = function () { pointer.setHighlightedValue(); return false; }; a.onmouseover = function () { pointer.setHighlight(this.name); }; var li = _b.DOM.cE( "li", {}, a ); ul.appendChild( li ); } // no results // if (arr.length == 0 && this.oP.shownoresults) { var li = _b.DOM.cE( "li", {className:"as_warning"}, this.oP.noresults ); ul.appendChild( li ); } div.appendChild( ul ); var fcorner = _b.DOM.cE("div", {className:"as_corner"}); var fbar = _b.DOM.cE("div", {className:"as_bar"}); var footer = _b.DOM.cE("div", {className:"as_footer"}); footer.appendChild(fcorner); footer.appendChild(fbar); div.appendChild(footer); // get position of target textfield // position holding div below it // set width of holding div to width of field // var pos = _b.DOM.getPos(this.fld); div.style.left = pos.x + "px"; div.style.top = ( pos.y + this.fld.offsetHeight + this.oP.offsety ) + "px"; div.style.width = this.fld.offsetWidth + "px"; // set mouseover functions for div // when mouse pointer leaves div, set a timeout to remove the list after an interval // when mouse enters div, kill the timeout so the list won't be removed // div.onmouseover = function(){ pointer.killTimeout() }; div.onmouseout = function(){ pointer.resetTimeout() }; // add DIV to document // document.getElementsByTagName("body")[0].appendChild(div); // currently no item is highlighted // this.iHigh = 0; // remove list after an interval // var pointer = this; this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.oP.timeout); }; _b.AutoSuggest.prototype.changeHighlight = function(key) { var list = _b.DOM.gE("as_ul"); if (!list) return false; var n; if (key == 40) n = this.iHigh + 1; else if (key == 38) n = this.iHigh - 1; if (n > list.childNodes.length) n = list.childNodes.length; if (n < 1) n = 1; this.setHighlight(n); }; _b.AutoSuggest.prototype.setHighlight = function(n) { var list = _b.DOM.gE("as_ul"); if (!list) return false; if (this.iHigh > 0) this.clearHighlight(); this.iHigh = Number(n); list.childNodes[this.iHigh-1].className = "as_highlight"; this.killTimeout(); }; _b.AutoSuggest.prototype.clearHighlight = function() { var list = _b.DOM.gE("as_ul"); if (!list) return false; if (this.iHigh > 0) { list.childNodes[this.iHigh-1].className = ""; this.iHigh = 0; } }; _b.AutoSuggest.prototype.setHighlightedValue = function () { if (this.iHigh) { this.sInp = this.fld.value = this.aSug[ this.iHigh-1 ].value; // move cursor to end of input (safari) // this.fld.focus(); if (this.fld.selectionStart) this.fld.setSelectionRange(this.sInp.length, this.sInp.length); this.clearSuggestions(); // pass selected object to callback function, if exists // if (typeof(this.oP.callback) == "function") this.oP.callback( this.aSug[this.iHigh-1] ); } }; _b.AutoSuggest.prototype.killTimeout = function() { clearTimeout(this.toID); }; _b.AutoSuggest.prototype.resetTimeout = function() { clearTimeout(this.toID); var pointer = this; this.toID = setTimeout(function () { pointer.clearSuggestions() }, 1000); }; _b.AutoSuggest.prototype.clearSuggestions = function () { this.killTimeout(); var ele = _b.DOM.gE(this.idAs); var pointer = this; if (ele) { var fade = new _b.Fader(ele,1,0,250,function () { _b.DOM.remE(pointer.idAs) }); } }; // AJAX PROTOTYPE _____________________________________________ if (typeof(_b.Ajax) == "undefined") _b.Ajax = {}; _b.Ajax = function () { this.req = {}; this.isIE = false; }; _b.Ajax.prototype.makeRequest = function (url, meth, onComp, onErr) { if (meth != "POST") meth = "GET"; this.onComplete = onComp; this.onError = onErr; var pointer = this; // branch for native XMLHttpRequest object if (window.XMLHttpRequest) { this.req = new XMLHttpRequest(); this.req.onreadystatechange = function () { pointer.processReqChange() }; this.req.open("GET", url, true); // this.req.send(null); // branch for IE/Windows ActiveX version } else if (window.ActiveXObject) { this.req = new ActiveXObject("Microsoft.XMLHTTP"); if (this.req) { this.req.onreadystatechange = function () { pointer.processReqChange() }; this.req.open(meth, url, true); this.req.send(); } } }; _b.Ajax.prototype.processReqChange = function() { // only if req shows "loaded" if (this.req.readyState == 4) { // only if "OK" if (this.req.status == 200) { this.onComplete( this.req ); } else { this.onError( this.req.status ); } } }; // DOM PROTOTYPE _____________________________________________ if (typeof(_b.DOM) == "undefined") _b.DOM = {}; /* create element */ _b.DOM.cE = function ( type, attr, cont, html ) { var ne = document.createElement( type ); if (!ne) return 0; for (var a in attr) ne[a] = attr[a]; var t = typeof(cont); if (t == "string" && !html) ne.appendChild( document.createTextNode(cont) ); else if (t == "string" && html) ne.innerHTML = cont; else if (t == "object") ne.appendChild( cont ); return ne; }; /* get element */ _b.DOM.gE = function ( e ) { var t=typeof(e); if (t == "undefined") return 0; else if (t == "string") { var re = document.getElementById( e ); if (!re) return 0; else if (typeof(re.appendChild) != "undefined" ) return re; else return 0; } else if (typeof(e.appendChild) != "undefined") return e; else return 0; }; /* remove element */ _b.DOM.remE = function ( ele ) { var e = this.gE(ele); if (!e) return 0; else if (e.parentNode.removeChild(e)) return true; else return 0; }; /* get position */ _b.DOM.getPos = function ( e ) { var e = this.gE(e); var obj = e; var curleft = 0; if (obj.offsetParent) { while (obj.offsetParent) { curleft += obj.offsetLeft; obj = obj.offsetParent; } } else if (obj.x) curleft += obj.x; var obj = e; var curtop = 0; if (obj.offsetParent) { while (obj.offsetParent) { curtop += obj.offsetTop; obj = obj.offsetParent; } } else if (obj.y) curtop += obj.y; return {x:curleft, y:curtop}; }; // FADER PROTOTYPE _____________________________________________ if (typeof(_b.Fader) == "undefined") _b.Fader = {}; _b.Fader = function (ele, from, to, fadetime, callback) { if (!ele) return 0; this.e = ele; this.from = from; this.to = to; this.cb = callback; this.nDur = fadetime; this.nInt = 50; this.nTime = 0; var p = this; this.nID = setInterval(function() { p._fade() }, this.nInt); }; _b.Fader.prototype._fade = function() { this.nTime += this.nInt; var ieop = Math.round( this._tween(this.nTime, this.from, this.to, this.nDur) * 100 ); var op = ieop / 100; if (this.e.filters) // internet explorer { try { this.e.filters.item("DXImageTransform.Microsoft.Alpha").opacity = ieop; } catch (e) { // If it is not set initially, the browser will throw an error. This will set it if it is not set yet. this.e.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')'; } } else // other browsers { this.e.style.opacity = op; } if (this.nTime == this.nDur) { clearInterval( this.nID ); if (this.cb != undefined) this.cb(); } }; _b.Fader.prototype._tween = function(t,b,c,d) { return b + ( (c-b) * (t/d) ); };ntop-5.0.1+dfsg1/html/upload.gif0000644000000000000000000000155207524520114015115 0ustar rootrootGIF87a ÷ÿÿÿÌÌÌ™™™fff333x̧ü݃*ˆè3)FxÈŒdèˆé§IxP)Fxÿÿÿÿ(éÞ¶JxèÐŒs@€øèù¥wxóð¥ws˜¨æ,J³w(ôuTÕw 6Ôwÿÿÿÿ,陦w˜ ¦wê ¦wøè(éEÀ)FxxEÐ!é¼ê§Ix*FxÿÿÿÿÌê¾±Jxx `8³wÐŒ ¦wÐŒŒsðsí©wVÀFC:\MY DOWNLOAD FILE\ARROW-LEFT.GIF}ƒèwôî_—Fxôé( $XrÂ-FxpñJxr”FxX”FxÐ!MYDOWN~y doload fCêëˆXr)FxCëljèwàýàý`í§Ixx”FxÿÿÿÿpípíÂ-FxpñJxV–Fx.–FxÜðû€ëC:\!ù, G0€ PРÃ6$ ð!pHÐ`D… 6ü¨1dÆ+tHqãCŒ'Y&œ¨òà‰I^lˆPa@;ntop-5.0.1+dfsg1/html/Risk_high.gif0000644000000000000000000000154207414541016015541 0ustar rootrootGIF89a ÷1ÿÿÿÿÿÌÿÿ™ÿÿfÿÿ3ÿÿÿÌÿÿÌÌÿÌ™ÿÌfÿÌ3ÿÌÿ™ÿÿ™Ìÿ™™ÿ™fÿ™3ÿ™ÿfÿÿfÌÿf™ÿffÿf3ÿfÿ3ÿÿ3Ìÿ3™ÿ3fÿ33ÿ3ÿÿÿÌÿ™ÿfÿ3ÿÌÿÿÌÿÌÌÿ™ÌÿfÌÿ3ÌÿÌÌÿÌÌÌÌÌ™ÌÌfÌÌ3ÌÌÌ™ÿÌ™ÌÌ™™Ì™fÌ™3Ì™ÌfÿÌfÌÌf™ÌffÌf3ÌfÌ3ÿÌ3ÌÌ3™Ì3fÌ33Ì3ÌÿÌÌÌ™ÌfÌ3Ì™ÿÿ™ÿÌ™ÿ™™ÿf™ÿ3™ÿ™Ìÿ™Ì̙̙™Ìf™Ì3™Ì™™ÿ™™Ì™™™™™f™™3™™™fÿ™fÌ™f™™ff™f3™f™3ÿ™3Ì™3™™3f™33™3™ÿ™Ì™™™f™3™fÿÿfÿÌfÿ™fÿffÿ3fÿfÌÿfÌÌfÌ™fÌffÌ3fÌf™ÿf™Ìf™™f™ff™3f™ffÿffÌff™fffff3fff3ÿf3Ìf3™f3ff33f3fÿfÌf™fff3f3ÿÿ3ÿÌ3ÿ™3ÿf3ÿ33ÿ3Ìÿ3ÌÌ3Ì™3Ìf3Ì33Ì3™ÿ3™Ì3™™3™f3™33™3fÿ3fÌ3f™3ff3f33f33ÿ33Ì33™33f333333ÿ3Ì3™3f333ÿÿÿÌÿ™ÿfÿ3ÿÌÿÌÌÌ™ÌfÌ3Ì™ÿ™Ì™™™f™3™fÿfÌf™fff3f3ÿ3Ì3™3f333ÿÌ™f3îÝ»ªˆwUD"îÝ»ªˆwUD"îÝ»ªˆwUD"îîîÝÝÝ»»»ªªªˆˆˆwwwUUUDDD"""!ù, ?ÿH° €*ø›Ã‡ÿÝk¢DŠ^Ìq"G.œx¯¤É“$ ”¨² Ë–_Âpo&€€;ntop-5.0.1+dfsg1/html/docs/0000755000000000000000000000000012012127277014070 5ustar rootrootntop-5.0.1+dfsg1/html/docs/python/0000755000000000000000000000000012012127277015411 5ustar rootrootntop-5.0.1+dfsg1/html/docs/python/frames.html0000644000000000000000000000112211370533471017553 0ustar rootroot Ntop python.c modules API ntop-5.0.1+dfsg1/html/docs/python/index.html0000644000000000000000000000112211370533471017405 0ustar rootroot Ntop python.c modules API ntop-5.0.1+dfsg1/html/docs/python/identifier-index.html0000644000000000000000000006423111370533471021537 0ustar rootroot Identifier Index
       
      [frames] | no frames]

      Identifier Index

      [ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ ]

      B

      C

      E

      F

      G

      H

      I

      M

      N

      O

      P

      Q

      R

      S

      T

      U

      V

      _



      ntop-5.0.1+dfsg1/html/docs/python/epydoc.css0000644000000000000000000003730511370533471017421 0ustar rootroot /* Epydoc CSS Stylesheet * * This stylesheet can be used to customize the appearance of epydoc's * HTML output. * */ /* Default Colors & Styles * - Set the default foreground & background color with 'body'; and * link colors with 'a:link' and 'a:visited'. * - Use bold for decision list terms. * - The heading styles defined here are used for headings *within* * docstring descriptions. All headings used by epydoc itself use * either class='epydoc' or class='toc' (CSS styles for both * defined below). */ body { background: #ffffff; color: #000000; } p { margin-top: 0.5em; margin-bottom: 0.5em; } a:link { color: #0000ff; } a:visited { color: #204080; } dt { font-weight: bold; } h1 { font-size: +140%; font-style: italic; font-weight: bold; } h2 { font-size: +125%; font-style: italic; font-weight: bold; } h3 { font-size: +110%; font-style: italic; font-weight: normal; } code { font-size: 100%; } /* N.B.: class, not pseudoclass */ a.link { font-family: monospace; } /* Page Header & Footer * - The standard page header consists of a navigation bar (with * pointers to standard pages such as 'home' and 'trees'); a * breadcrumbs list, which can be used to navigate to containing * classes or modules; options links, to show/hide private * variables and to show/hide frames; and a page title (using *

      ). The page title may be followed by a link to the * corresponding source code (using 'span.codelink'). * - The footer consists of a navigation bar, a timestamp, and a * pointer to epydoc's homepage. */ h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } h2.epydoc { font-size: +130%; font-weight: bold; } h3.epydoc { font-size: +115%; font-weight: bold; margin-top: 0.2em; } td h3.epydoc { font-size: +115%; font-weight: bold; margin-bottom: 0; } table.navbar { background: #a0c0ff; color: #000000; border: 2px groove #c0d0d0; } table.navbar table { color: #000000; } th.navbar-select { background: #70b0ff; color: #000000; } table.navbar a { text-decoration: none; } table.navbar a:link { color: #0000ff; } table.navbar a:visited { color: #204080; } span.breadcrumbs { font-size: 85%; font-weight: bold; } span.options { font-size: 70%; } span.codelink { font-size: 85%; } td.footer { font-size: 85%; } /* Table Headers * - Each summary table and details section begins with a 'header' * row. This row contains a section title (marked by * 'span.table-header') as well as a show/hide private link * (marked by 'span.options', defined above). * - Summary tables that contain user-defined groups mark those * groups using 'group header' rows. */ td.table-header { background: #70b0ff; color: #000000; border: 1px solid #608090; } td.table-header table { color: #000000; } td.table-header table a:link { color: #0000ff; } td.table-header table a:visited { color: #204080; } span.table-header { font-size: 120%; font-weight: bold; } th.group-header { background: #c0e0f8; color: #000000; text-align: left; font-style: italic; font-size: 115%; border: 1px solid #608090; } /* Summary Tables (functions, variables, etc) * - Each object is described by a single row of the table with * two cells. The left cell gives the object's type, and is * marked with 'code.summary-type'. The right cell gives the * object's name and a summary description. * - CSS styles for the table's header and group headers are * defined above, under 'Table Headers' */ table.summary { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin-bottom: 0.5em; } td.summary { border: 1px solid #608090; } code.summary-type { font-size: 85%; } table.summary a:link { color: #0000ff; } table.summary a:visited { color: #204080; } /* Details Tables (functions, variables, etc) * - Each object is described in its own div. * - A single-row summary table w/ table-header is used as * a header for each details section (CSS style for table-header * is defined above, under 'Table Headers'). */ table.details { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } table.details table { color: #000000; } table.details a:link { color: #0000ff; } table.details a:visited { color: #204080; } /* Fields */ dl.fields { margin-left: 2em; margin-top: 1em; margin-bottom: 1em; } dl.fields dd ul { margin-left: 0em; padding-left: 0em; } dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } div.fields { margin-left: 2em; } div.fields p { margin-bottom: 0.5em; } /* Index tables (identifier index, term index, etc) * - link-index is used for indices containing lists of links * (namely, the identifier index & term index). * - index-where is used in link indices for the text indicating * the container/source for each link. * - metadata-index is used for indices containing metadata * extracted from fields (namely, the bug index & todo index). */ table.link-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; } td.link-index { border-width: 0px; } table.link-index a:link { color: #0000ff; } table.link-index a:visited { color: #204080; } span.index-where { font-size: 70%; } table.metadata-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } td.metadata-index { border-width: 1px; border-style: solid; } table.metadata-index a:link { color: #0000ff; } table.metadata-index a:visited { color: #204080; } /* Function signatures * - sig* is used for the signature in the details section. * - .summary-sig* is used for the signature in the summary * table, and when listing property accessor functions. * */ .sig-name { color: #006080; } .sig-arg { color: #008060; } .sig-default { color: #602000; } .summary-sig { font-family: monospace; } .summary-sig-name { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:link { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:visited { color: #006080; font-weight: bold; } .summary-sig-arg { color: #006040; } .summary-sig-default { color: #501800; } /* Subclass list */ ul.subclass-list { display: inline; margin: 0; padding: 0; } ul.subclass-list li { display: inline; margin: 0; padding: 0; } /* To render variables, classes etc. like functions */ table.summary .summary-name { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:link { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:visited { color: #006080; font-weight: bold; font-family: monospace; } /* Variable values * - In the 'variable details' sections, each varaible's value is * listed in a 'pre.variable' box. The width of this box is * restricted to 80 chars; if the value's repr is longer than * this it will be wrapped, using a backslash marked with * class 'variable-linewrap'. If the value's repr is longer * than 3 lines, the rest will be ellided; and an ellipsis * marker ('...' marked with 'variable-ellipsis') will be used. * - If the value is a string, its quote marks will be marked * with 'variable-quote'. * - If the variable is a regexp, it is syntax-highlighted using * the re* CSS classes. */ pre.variable { padding: .5em; margin: 0; background: #dce4ec; color: #000000; border: 1px solid #708890; } .variable-linewrap { color: #604000; font-weight: bold; } .variable-ellipsis { color: #604000; font-weight: bold; } .variable-quote { color: #604000; font-weight: bold; } .variable-group { color: #008000; font-weight: bold; } .variable-op { color: #604000; font-weight: bold; } .variable-string { color: #006030; } .variable-unknown { color: #a00000; font-weight: bold; } .re { color: #000000; } .re-char { color: #006030; } .re-op { color: #600000; } .re-group { color: #003060; } .re-ref { color: #404040; } /* Base tree * - Used by class pages to display the base class hierarchy. */ pre.base-tree { font-size: 80%; margin: 0; } /* Frames-based table of contents headers * - Consists of two frames: one for selecting modules; and * the other listing the contents of the selected module. * - h1.toc is used for each frame's heading * - h2.toc is used for subheadings within each frame. */ h1.toc { text-align: center; font-size: 105%; margin: 0; font-weight: bold; padding: 0; } h2.toc { font-size: 100%; font-weight: bold; margin: 0.5em 0 0 -0.3em; } /* Syntax Highlighting for Source Code * - doctest examples are displayed in a 'pre.py-doctest' block. * If the example is in a details table entry, then it will use * the colors specified by the 'table pre.py-doctest' line. * - Source code listings are displayed in a 'pre.py-src' block. * Each line is marked with 'span.py-line' (used to draw a line * down the left margin, separating the code from the line * numbers). Line numbers are displayed with 'span.py-lineno'. * The expand/collapse block toggle button is displayed with * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not * modify the font size of the text.) * - If a source code page is opened with an anchor, then the * corresponding code block will be highlighted. The code * block's header is highlighted with 'py-highlight-hdr'; and * the code block's body is highlighted with 'py-highlight'. * - The remaining py-* classes are used to perform syntax * highlighting (py-string for string literals, py-name for names, * etc.) */ pre.py-doctest { padding: .5em; margin: 1em; background: #e8f0f8; color: #000000; border: 1px solid #708890; } table pre.py-doctest { background: #dce4ec; color: #000000; } pre.py-src { border: 2px solid #000000; background: #f0f0f0; color: #000000; } .py-line { border-left: 2px solid #000000; margin-left: .2em; padding-left: .4em; } .py-lineno { font-style: italic; font-size: 90%; padding-left: .5em; } a.py-toggle { text-decoration: none; } div.py-highlight-hdr { border-top: 2px solid #000000; border-bottom: 2px solid #000000; background: #d8e8e8; } div.py-highlight { border-bottom: 2px solid #000000; background: #d0e0e0; } .py-prompt { color: #005050; font-weight: bold;} .py-more { color: #005050; font-weight: bold;} .py-string { color: #006030; } .py-comment { color: #003060; } .py-keyword { color: #600000; } .py-output { color: #404040; } .py-name { color: #000050; } .py-name:link { color: #000050 !important; } .py-name:visited { color: #000050 !important; } .py-number { color: #005000; } .py-defname { color: #000060; font-weight: bold; } .py-def-name { color: #000060; font-weight: bold; } .py-base-class { color: #000060; } .py-param { color: #000060; } .py-docstring { color: #006030; } .py-decorator { color: #804020; } /* Use this if you don't want links to names underlined: */ /*a.py-name { text-decoration: none; }*/ /* Graphs & Diagrams * - These CSS styles are used for graphs & diagrams generated using * Graphviz dot. 'img.graph-without-title' is used for bare * diagrams (to remove the border created by making the image * clickable). */ img.graph-without-title { border: none; } img.graph-with-title { border: 1px solid #000000; } span.graph-title { font-weight: bold; } span.graph-caption { } /* General-purpose classes * - 'p.indent-wrapped-lines' defines a paragraph whose first line * is not indented, but whose subsequent lines are. * - The 'nomargin-top' class is used to remove the top margin (e.g. * from lists). The 'nomargin' class is used to remove both the * top and bottom margin (but not the left or right margin -- * for lists, that would cause the bullets to disappear.) */ p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; margin: 0; } .nomargin-top { margin-top: 0; } .nomargin { margin-top: 0; margin-bottom: 0; } /* HTML Log */ div.log-block { padding: 0; margin: .5em 0 .5em 0; background: #e8f0f8; color: #000000; border: 1px solid #000000; } div.log-error { padding: .1em .3em .1em .3em; margin: 4px; background: #ffb0b0; color: #000000; border: 1px solid #000000; } div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; background: #ffffb0; color: #000000; border: 1px solid #000000; } div.log-info { padding: .1em .3em .1em .3em; margin: 4px; background: #b0ffb0; color: #000000; border: 1px solid #000000; } h2.log-hdr { background: #70b0ff; color: #000000; margin: 0; padding: 0em 0.5em 0em 0.5em; border-bottom: 1px solid #000000; font-size: 110%; } p.log { font-weight: bold; margin: .5em 0 .5em 0; } tr.opt-changed { color: #000000; font-weight: bold; } tr.opt-default { color: #606060; } pre.log { margin: 0; padding: 0; padding-left: 1em; } ntop-5.0.1+dfsg1/html/docs/python/host-module.html0000644000000000000000000015115111370533471020546 0ustar rootroot host
      Module host
      [frames] | no frames]

      Module host

      Module that exposes functions to get information on the current host taken into consideration

      Functions
      string
      serial()
      Get host unique serial identifier
      string
      ethAddress()
      Get host MAC address
      string
      ipAddress()
      Get host IP address
      string
      hostResolvedName()
      Get host Resolved Name
      number
      hostTrafficBucket()
      Get Traffic Bucket
      int
      numHostSessions()
      Get actual numHostSessions
      number
      vlanId()
      Get vlanId
      number
      network_mask()
      Get current host network_mask
      string
      hwModel()
      Get hwModel of the current host
      boolean
      isHostResolvedNameType(type)
      Check if the host matches the specified type
      boolean
      isFTPhost()
      Check FTP Host
      boolean
      isServer()
      Check isServer
      boolean
      isWorkstation()
      Check isWorkstation Host
      boolean
      isMasterBrowser()
      Check isMasterBrowser Host
      boolean
      isMultihomed()
      Check isMultihomed Host
      boolean
      isMultivlaned()
      Check isMultivlaned Host
      boolean
      isPrinter()
      Check isPrinter Host
      boolean
      isSMTPhost()
      Check isSMTPhost Host
      boolean
      isPOPhost()
      Check isPOPhost Host
      boolean
      isIMAPhost()
      Check isIMAPhost Host
      boolean
      isDirectoryHost()
      Check isDirectoryHost Host
      boolean
      isHTTPhost()
      Check isHTTPhost Host
      boolean
      isWINShost()
      Check isWINShost Host
      boolean
      isBridgeHost()
      Check isBridgeHost Host
      boolean
      isVoIPClient()
      Check isVoIPClient Host
      boolean
      isVoIPGateway()
      Check isVoIPGateway Host
      boolean
      isVoIPHost()
      Check isVoIPHost Host
      boolean
      isDHCPClient()
      Check isDHCPClient Host
      boolean
      isDHCPServer()
      Check isDHCPServer Host
      boolean
      isP2P()
      Check isP2P Host
      boolean
      isNtpServer()
      Check isNtpServer Host
      number
      totContactedSentPeers()
      Check totContactedSentPeers Host
      number
      totContactedRcvdPeers()
      Check totContactedRcvdPeers Host
      string
      fingerprint()
      Check fingerprint Host
      number
      synPktsSent()
      Check synPktsSent Host
      number
      pktSent()
      Return the number of packets sent by this host
      number
      pktRcvd()
      Return the number of packets rcvd by this host
      number
      bytesSent()
      Return the number of bytes sent by this host
      number
      bytesRcvd()
      Return the number of bytes rcvd by this host
      number
      sendThpt(type)
      Return the send throughput
      number
      receiveThpt(type)
      Return the receive throughput
      dictionary
      geoIP()
      Read geoLocalization info from GeoCityLite and return them
      Variables
        __package__ = None
      Function Details

      serial()

       

      Get host unique serial identifier

      Returns: string
      the unique serial identifier

      ethAddress()

       

      Get host MAC address

      Returns: string
      the host MAC address

      ipAddress()

       

      Get host IP address

      Returns: string
      the IP address

      hostResolvedName()

       

      Get host Resolved Name

      Returns: string
      the host Resolved Name

      hostTrafficBucket()

       

      Get Traffic Bucket

      Returns: number
      host traffic bucket

      numHostSessions()

       

      Get actual numHostSessions

      Returns: int
      the number of host Sessions

      vlanId()

       

      Get vlanId

      Returns: number
      the vlanId

      network_mask()

       

      Get current host network_mask

      Returns: number
      the network mask

      hwModel()

       

      Get hwModel of the current host

      Returns: string
      the hardware model or empy string if no info

      isHostResolvedNameType(type)

       

      Check if the host matches the specified type

      Parameters:
      • type (number) - the type of the host resolved name to check
      Returns: boolean
      true if the host resolved name is of type type, false otherwise

      isFTPhost()

       

      Check FTP Host

      Returns: boolean
      true if the current host is ftp, false otherwise

      isServer()

       

      Check isServer

      Returns: boolean
      true if the current host is a Server, false otherwise

      isWorkstation()

       

      Check isWorkstation Host

      Returns: boolean
      true if the current host is a workstation, false otherwise

      isMasterBrowser()

       

      Check isMasterBrowser Host

      Returns: boolean
      true if the current host is a Master Browser, false otherwise

      isMultihomed()

       

      Check isMultihomed Host

      Returns: boolean
      true if the current host is multihomed, false otherwise

      isMultivlaned()

       

      Check isMultivlaned Host

      Returns: boolean
      true if the current host is multilaned, false otherwise

      isPrinter()

       

      Check isPrinter Host

      Returns: boolean
      true if the current host is a printer, false otherwise

      isSMTPhost()

       

      Check isSMTPhost Host

      Returns: boolean
      true if the current host is a smtp host, false otherwise

      isPOPhost()

       

      Check isPOPhost Host

      Returns: boolean
      true if the current host is a pop host, false otherwise

      isIMAPhost()

       

      Check isIMAPhost Host

      Returns: boolean
      true if the current host is an imap host, false otherwise

      isDirectoryHost()

       

      Check isDirectoryHost Host

      Returns: boolean
      true if the current host is a directory host, false otherwise

      isHTTPhost()

       

      Check isHTTPhost Host

      Returns: boolean
      true if the current host is an http host, false otherwise

      isWINShost()

       

      Check isWINShost Host

      Returns: boolean
      true if the current host is a wins host, false otherwise

      isBridgeHost()

       

      Check isBridgeHost Host

      Returns: boolean
      true if the current host is a bridge, false otherwise

      isVoIPClient()

       

      Check isVoIPClient Host

      Returns: boolean
      true if the current host is a voip client host, false otherwise

      isVoIPGateway()

       

      Check isVoIPGateway Host

      Returns: boolean
      true if the current host is a voip gateway, false otherwise

      isVoIPHost()

       

      Check isVoIPHost Host

      Returns: boolean
      true if the current host is a voip host, false otherwise

      isDHCPClient()

       

      Check isDHCPClient Host

      Returns: boolean
      true if the current host is a dhcp client, false otherwise

      isDHCPServer()

       

      Check isDHCPServer Host

      Returns: boolean
      true if the current host is a dhcp server, false otherwise

      isP2P()

       

      Check isP2P Host

      Returns: boolean
      true if the current host is a p2p host, false otherwise

      isNtpServer()

       

      Check isNtpServer Host

      Returns: boolean
      true if the current host is a ntp server, false otherwise

      totContactedSentPeers()

       

      Check totContactedSentPeers Host

      Returns: number
      the number of the total contacted sent peers

      totContactedRcvdPeers()

       

      Check totContactedRcvdPeers Host

      Returns: number
      the number of the total contacted received peers

      fingerprint()

       

      Check fingerprint Host

      Returns: string
      the fingerprint of the current host or empty string if none

      synPktsSent()

       

      Check synPktsSent Host

      Returns: number
      the number of syn packets sent by the current host

      pktSent()

       

      Return the number of packets sent by this host

      Returns: number
      the number packets sent

      pktRcvd()

       

      Return the number of packets rcvd by this host

      Returns: number
      the number of packets received

      bytesSent()

       

      Return the number of bytes sent by this host

      Returns: number
      the number of bytes sent

      bytesRcvd()

       

      Return the number of bytes rcvd by this host

      Returns: number
      the number of bytes received

      sendThpt(type)

       

      Return the send throughput

      Parameters:
      • type (string) - actual average peak the type of the sent throughput to get
      Returns: number
      the number of bytes of the sent throughput of type type

      receiveThpt(type)

       

      Return the receive throughput

      Parameters:
      • type (string) - actual average peak the type of the received throughput to get
      Returns: number
      the number of bytes of the received throughput of type type

      geoIP()

       

      Read geoLocalization info from GeoCityLite and return them

      Returns: dictionary
      a dictionary {'country_code':string,'country_name':string, 'region':string, 'city': string, 'latitude': number float, 'longitude': number float } with all the geoLocation info retrieved by GeoCityLite for the current host

      ntop-5.0.1+dfsg1/html/docs/python/crarr.png0000644000000000000000000000052411370533471017234 0ustar rootroot‰PNG  IHDR e¢E,tEXtCreation TimeTue 22 Aug 2006 00:43:10 -0500` XtIMEÖ)Ó}Ö pHYsÂÂnÐu>gAMA± üaEPLTEÿÿÿÍð×ÏÀ€f4sW áÛЊrD`@bCÜÕÈéäÜ–X{`,¯Ÿ€lN‡o@õóðª™xdEðí螊dÐÆ´”~TÖwÅvtRNS@æØfMIDATxÚc`@¼ì¼0&+š—Šˆ°»(’ˆ€ ;; /ðEXùØ‘?Ð n ƒª†— b;'ª+˜˜YÐ#œ(r<£"IEND®B`‚ntop-5.0.1+dfsg1/html/docs/python/toc-everything.html0000644000000000000000000002307511370533471021260 0ustar rootroot Everything

      Everything


      All Functions

      fastbit.query
      host.bytesRcvd
      host.bytesSent
      host.ethAddress
      host.fingerprint
      host.geoIP
      host.hostResolvedName
      host.hostTrafficBucket
      host.hwModel
      host.ipAddress
      host.isBridgeHost
      host.isDHCPClient
      host.isDHCPServer
      host.isDirectoryHost
      host.isFTPhost
      host.isHTTPhost
      host.isHostResolvedNameType
      host.isIMAPhost
      host.isMasterBrowser
      host.isMultihomed
      host.isMultivlaned
      host.isNtpServer
      host.isP2P
      host.isPOPhost
      host.isPrinter
      host.isSMTPhost
      host.isServer
      host.isVoIPClient
      host.isVoIPGateway
      host.isVoIPHost
      host.isWINShost
      host.isWorkstation
      host.network_mask
      host.numHostSessions
      host.pktRcvd
      host.pktSent
      host.receiveThpt
      host.sendThpt
      host.serial
      host.synPktsSent
      host.totContactedRcvdPeers
      host.totContactedSentPeers
      host.vlanId
      interface.bpf
      interface.bytesStats
      interface.cpacketStats
      interface.fcBytesStats
      interface.fcPktsStats
      interface.humanName
      interface.icmpStats
      interface.ipStats
      interface.ipv4
      interface.ipv6
      interface.mtu
      interface.name
      interface.netflowStats
      interface.network
      interface.numHosts
      interface.numInterfaces
      interface.pktsStats
      interface.securityPkts
      interface.sflowStats
      interface.speed
      interface.tcpStats
      interface.throughputStats
      interface.time
      interface.udpStats
      interface.uniqueName
      interface.virtual
      ntop.findHostByNumIP
      ntop.getDBPath
      ntop.getFirstHost
      ntop.getNextHost
      ntop.getPreference
      ntop.getSpoolPath
      ntop.os
      ntop.printFlagedWarning
      ntop.printHTMLFooter
      ntop.printHTMLHeader
      ntop.returnHTTPnotImplemented
      ntop.returnHTTPversionServerError
      ntop.sendHTTPHeader
      ntop.sendString
      ntop.setPreference
      ntop.updateRRDCounter
      ntop.updateRRDGauge
      ntop.uptime
      ntop.version

      All Variables

      fastbit.__package__
      host.__package__
      interface.__package__
      ntop.__package__

      ntop-5.0.1+dfsg1/html/docs/python/module-tree.html0000644000000000000000000001031111370533471020520 0ustar rootroot Module Hierarchy
       
      [frames] | no frames]

      Module Hierarchy

      • fastbit: Module that exposes all the function to interact with a fastbit database, configured and interfaced with ntop.
      • host: Module that exposes functions to get information on the current host taken into consideration
      • interface: Module that exposes functions to get information on the current interfaces enabled in ntop.
      • ntop: Module that provides basic function to interact to the ntop http server and to get info on the ntop state.
      ntop-5.0.1+dfsg1/html/docs/python/toc-fastbit-module.html0000644000000000000000000000205611370533471022007 0ustar rootroot fastbit

      Module fastbit


      Functions

      query

      Variables

      __package__

      ntop-5.0.1+dfsg1/html/docs/python/ntop-module.html0000644000000000000000000006431211370533471020553 0ustar rootroot ntop
      Module ntop
      [frames] | no frames]

      Module ntop

      Module that provides basic function to interact to the ntop http server and to get info on the ntop state.

      Others exposed functions allows to cycle through all the hosts currently monitored by ntop.

      Functions
       
      sendHTTPHeader(mime_type)
      send an header back to the client
       
      returnHTTPnotImplemented()
      send http message code 501 back to the client
       
      returnHTTPversionServerError()
      send http message code 500 back to the client
       
      printHTMLHeader(title, sectionTitle, refresh)
      print the standard ntop header opening an html page to be filled with data
       
      printHTMLFooter()
      print the standard ntop footer closing an html page
       
      sendString(msg)
      send back to the client the message passed
       
      printFlagedWarning(msg)
      print a warning message and an image to instruct the users about the problem encountered
      int
      getFirstHost(actualDeviceId)
      retrieve the first host of the list of hosts currently monitored by ntop
      int
      getNextHost(actualDeviceId)
      retrieve the next host of the list of hosts currently monitored by ntop if no first host was previously retrieved get the first host of the list
       
      findHostByNumIP(hostIpAddress, vlanId, actualDeviceId)
      retrieve the host corresponding to the parameters passed (if any)
      string @return the current version of ntop
      version()
      retrieve the version of this ntop release
      string @return the name of the OS
      os()
      retrieve the operative system in witch ntop was build
      string @return the time from witch ntop started sniffing
      uptime()
      the current uptime of ntop
      string or None
      getPreference(key)
      get the ntop preference named key
       
      setPreference(key, value)
      set a preference in ntop, as if the user insert a new preference in the html interface
      string
      getDBPath()
      get the current dbPath defined in ntop
      string
      getSpoolPath()
      get the current spoolPath defined in ntop
       
      updateRRDCounter()
      update the counter of the RRDDatabase specified with the value passed
       
      updateRRDGauge()
      update the gauge of the RRDDatabase specified with the value passed
      Variables
        __package__ = None
      Function Details

      sendHTTPHeader(mime_type)

       

      send an header back to the client

      Parameters:
      • mime_type (int) - the mime type of the http respons (check global-defines.h for defined types. ES. 1 for html 12 for json)

      printHTMLHeader(title, sectionTitle, refresh)

       

      print the standard ntop header opening an html page to be filled with data

      Parameters:
      • title (string) - the title of the page
      • sectionTitle (int 0 false 1 true) - flag that indicates if the print should stop just before the sectionTitle of the page (no title will be printed)
      • refresh (int 0 false 1 true) - flag to inhibit the refresh for the current generated html page

      sendString(msg)

       

      send back to the client the message passed

      Parameters:
      • msg (string) - the message to be printed back to the client

      printFlagedWarning(msg)

       

      print a warning message and an image to instruct the users about the problem encountered

      Parameters:
      • msg (string) - the message to print

      getFirstHost(actualDeviceId)

       

      retrieve the first host of the list of hosts currently monitored by ntop

      Parameters:
      • actualDeviceId (int) - the number of the device from witch get the list of hosts, None to get from all interfaces
      Returns: int
      1 indicates that the first host was found, 0 otherwise

      getNextHost(actualDeviceId)

       

      retrieve the next host of the list of hosts currently monitored by ntop if no first host was previously retrieved get the first host of the list

      Parameters:
      • actualDeviceId (int) - the number of the device from witch get the list of hosts, None to get from all interfaces
      Returns: int
      1 indicates that the next host was found, 0 otherwise

      findHostByNumIP(hostIpAddress, vlanId, actualDeviceId)

       

      retrieve the host corresponding to the parameters passed (if any)

      Parameters:
      • hostIpAddress (string) - the ip address in dotted notation for ipv4 or string notation for ipv6
      • vlanId (int) - the number representing the vlanId in witch to search for the ipAddress passed
      • actualDeviceId (int) - the number of the device from witch get the list of hosts, None to get from all interfaces
      Returns:
      1 indicates that the host was found, 0 otherwise

      getPreference(key)

       

      get the ntop preference named key

      Parameters:
      • key (string) - the name of the preference from witch get the value
      Returns: string or None
      the value of the preference set in ntop if any, null otherwise

      setPreference(key, value)

       

      set a preference in ntop, as if the user insert a new preference in the html interface

      Parameters:
      • key (string) - the key of the preference to set
      • value (string) - the value to associate to the key passed

      getDBPath()

       

      get the current dbPath defined in ntop

      Returns: string
      the db path defined in ntop

      getSpoolPath()

       

      get the current spoolPath defined in ntop

      Returns: string
      the spool path defined in ntop

      ntop-5.0.1+dfsg1/html/docs/python/epydoc.js0000644000000000000000000002452511370533471017245 0ustar rootrootfunction toggle_private() { // Search for any private/public links on this page. Store // their old text in "cmd," so we will know what action to // take; and change their text to the opposite action. var cmd = "?"; var elts = document.getElementsByTagName("a"); for(var i=0; i...
      "; elt.innerHTML = s; } } function toggle(id) { elt = document.getElementById(id+"-toggle"); if (elt.innerHTML == "-") collapse(id); else expand(id); return false; } function highlight(id) { var elt = document.getElementById(id+"-def"); if (elt) elt.className = "py-highlight-hdr"; var elt = document.getElementById(id+"-expanded"); if (elt) elt.className = "py-highlight"; var elt = document.getElementById(id+"-collapsed"); if (elt) elt.className = "py-highlight"; } function num_lines(s) { var n = 1; var pos = s.indexOf("\n"); while ( pos > 0) { n += 1; pos = s.indexOf("\n", pos+1); } return n; } // Collapse all blocks that mave more than `min_lines` lines. function collapse_all(min_lines) { var elts = document.getElementsByTagName("div"); for (var i=0; i 0) if (elt.id.substring(split, elt.id.length) == "-expanded") if (num_lines(elt.innerHTML) > min_lines) collapse(elt.id.substring(0, split)); } } function expandto(href) { var start = href.indexOf("#")+1; if (start != 0 && start != href.length) { if (href.substring(start, href.length) != "-") { collapse_all(4); pos = href.indexOf(".", start); while (pos != -1) { var id = href.substring(start, pos); expand(id); pos = href.indexOf(".", pos+1); } var id = href.substring(start, href.length); expand(id); highlight(id); } } } function kill_doclink(id) { var parent = document.getElementById(id); parent.removeChild(parent.childNodes.item(0)); } function auto_kill_doclink(ev) { if (!ev) var ev = window.event; if (!this.contains(ev.toElement)) { var parent = document.getElementById(this.parentID); parent.removeChild(parent.childNodes.item(0)); } } function doclink(id, name, targets_id) { var elt = document.getElementById(id); // If we already opened the box, then destroy it. // (This case should never occur, but leave it in just in case.) if (elt.childNodes.length > 1) { elt.removeChild(elt.childNodes.item(0)); } else { // The outer box: relative + inline positioning. var box1 = document.createElement("div"); box1.style.position = "relative"; box1.style.display = "inline"; box1.style.top = 0; box1.style.left = 0; // A shadow for fun var shadow = document.createElement("div"); shadow.style.position = "absolute"; shadow.style.left = "-1.3em"; shadow.style.top = "-1.3em"; shadow.style.background = "#404040"; // The inner box: absolute positioning. var box2 = document.createElement("div"); box2.style.position = "relative"; box2.style.border = "1px solid #a0a0a0"; box2.style.left = "-.2em"; box2.style.top = "-.2em"; box2.style.background = "white"; box2.style.padding = ".3em .4em .3em .4em"; box2.style.fontStyle = "normal"; box2.onmouseout=auto_kill_doclink; box2.parentID = id; // Get the targets var targets_elt = document.getElementById(targets_id); var targets = targets_elt.getAttribute("targets"); var links = ""; target_list = targets.split(","); for (var i=0; i" + target[0] + ""; } // Put it all together. elt.insertBefore(box1, elt.childNodes.item(0)); //box1.appendChild(box2); box1.appendChild(shadow); shadow.appendChild(box2); box2.innerHTML = "Which "+name+" do you want to see documentation for?" + ""; } return false; } function get_anchor() { var href = location.href; var start = href.indexOf("#")+1; if ((start != 0) && (start != href.length)) return href.substring(start, href.length); } function redirect_url(dottedName) { // Scan through each element of the "pages" list, and check // if "name" matches with any of them. for (var i=0; i-m" or "-c"; // extract the portion & compare it to dottedName. var pagename = pages[i].substring(0, pages[i].length-2); if (pagename == dottedName.substring(0,pagename.length)) { // We've found a page that matches `dottedName`; // construct its URL, using leftover `dottedName` // content to form an anchor. var pagetype = pages[i].charAt(pages[i].length-1); var url = pagename + ((pagetype=="m")?"-module.html": "-class.html"); if (dottedName.length > pagename.length) url += "#" + dottedName.substring(pagename.length+1, dottedName.length); return url; } } } ntop-5.0.1+dfsg1/html/docs/python/toc-ntop-module.html0000644000000000000000000000531211370533471021331 0ustar rootroot ntop

      Module ntop


      Functions

      findHostByNumIP
      getDBPath
      getFirstHost
      getNextHost
      getPreference
      getSpoolPath
      os
      printFlagedWarning
      printHTMLFooter
      printHTMLHeader
      returnHTTPnotImplemented
      returnHTTPversionServerError
      sendHTTPHeader
      sendString
      setPreference
      updateRRDCounter
      updateRRDGauge
      uptime
      version

      Variables

      __package__

      ntop-5.0.1+dfsg1/html/docs/python/api-objects.txt0000644000000000000000000001073411370533471020362 0ustar rootrootfastbit fastbit-module.html fastbit.query fastbit-module.html#query fastbit.__package__ fastbit-module.html#__package__ host host-module.html host.isDHCPServer host-module.html#isDHCPServer host.isHTTPhost host-module.html#isHTTPhost host.isHostResolvedNameType host-module.html#isHostResolvedNameType host.isWINShost host-module.html#isWINShost host.isMultivlaned host-module.html#isMultivlaned host.isDHCPClient host-module.html#isDHCPClient host.hostTrafficBucket host-module.html#hostTrafficBucket host.hwModel host-module.html#hwModel host.isPrinter host-module.html#isPrinter host.bytesRcvd host-module.html#bytesRcvd host.pktSent host-module.html#pktSent host.isPOPhost host-module.html#isPOPhost host.isWorkstation host-module.html#isWorkstation host.pktRcvd host-module.html#pktRcvd host.synPktsSent host-module.html#synPktsSent host.totContactedSentPeers host-module.html#totContactedSentPeers host.isMultihomed host-module.html#isMultihomed host.__package__ host-module.html#__package__ host.isBridgeHost host-module.html#isBridgeHost host.receiveThpt host-module.html#receiveThpt host.isServer host-module.html#isServer host.isSMTPhost host-module.html#isSMTPhost host.isVoIPHost host-module.html#isVoIPHost host.totContactedRcvdPeers host-module.html#totContactedRcvdPeers host.hostResolvedName host-module.html#hostResolvedName host.isMasterBrowser host-module.html#isMasterBrowser host.vlanId host-module.html#vlanId host.bytesSent host-module.html#bytesSent host.fingerprint host-module.html#fingerprint host.network_mask host-module.html#network_mask host.numHostSessions host-module.html#numHostSessions host.serial host-module.html#serial host.isNtpServer host-module.html#isNtpServer host.ethAddress host-module.html#ethAddress host.sendThpt host-module.html#sendThpt host.isP2P host-module.html#isP2P host.isFTPhost host-module.html#isFTPhost host.isIMAPhost host-module.html#isIMAPhost host.geoIP host-module.html#geoIP host.isDirectoryHost host-module.html#isDirectoryHost host.isVoIPClient host-module.html#isVoIPClient host.ipAddress host-module.html#ipAddress host.isVoIPGateway host-module.html#isVoIPGateway interface interface-module.html interface.tcpStats interface-module.html#tcpStats interface.humanName interface-module.html#humanName interface.ipStats interface-module.html#ipStats interface.cpacketStats interface-module.html#cpacketStats interface.speed interface-module.html#speed interface.numInterfaces interface-module.html#numInterfaces interface.securityPkts interface-module.html#securityPkts interface.network interface-module.html#network interface.virtual interface-module.html#virtual interface.__package__ interface-module.html#__package__ interface.netflowStats interface-module.html#netflowStats interface.ipv4 interface-module.html#ipv4 interface.ipv6 interface-module.html#ipv6 interface.bytesStats interface-module.html#bytesStats interface.throughputStats interface-module.html#throughputStats interface.pktsStats interface-module.html#pktsStats interface.sflowStats interface-module.html#sflowStats interface.uniqueName interface-module.html#uniqueName interface.udpStats interface-module.html#udpStats interface.fcBytesStats interface-module.html#fcBytesStats interface.name interface-module.html#name interface.bpf interface-module.html#bpf interface.numHosts interface-module.html#numHosts interface.mtu interface-module.html#mtu interface.icmpStats interface-module.html#icmpStats interface.time interface-module.html#time interface.fcPktsStats interface-module.html#fcPktsStats ntop ntop-module.html ntop.printHTMLFooter ntop-module.html#printHTMLFooter ntop.uptime ntop-module.html#uptime ntop.sendHTTPHeader ntop-module.html#sendHTTPHeader ntop.printHTMLHeader ntop-module.html#printHTMLHeader ntop.version ntop-module.html#version ntop.returnHTTPnotImplemented ntop-module.html#returnHTTPnotImplemented ntop.updateRRDGauge ntop-module.html#updateRRDGauge ntop.returnHTTPversionServerError ntop-module.html#returnHTTPversionServerError ntop.setPreference ntop-module.html#setPreference ntop.getNextHost ntop-module.html#getNextHost ntop.__package__ ntop-module.html#__package__ ntop.getFirstHost ntop-module.html#getFirstHost ntop.getSpoolPath ntop-module.html#getSpoolPath ntop.updateRRDCounter ntop-module.html#updateRRDCounter ntop.getDBPath ntop-module.html#getDBPath ntop.printFlagedWarning ntop-module.html#printFlagedWarning ntop.findHostByNumIP ntop-module.html#findHostByNumIP ntop.sendString ntop-module.html#sendString ntop.os ntop-module.html#os ntop.getPreference ntop-module.html#getPreference ntop-5.0.1+dfsg1/html/docs/python/fastbit-module.html0000644000000000000000000001611311370533471021223 0ustar rootroot fastbit
      Module fastbit
      [frames] | no frames]

      Module fastbit

      Module that exposes all the function to interact with a fastbit database, configured and interfaced with ntop.

      Functions
      dictionary
      query(partition, select_clause, where, limit)
      Execute a fastbit query using ntop
      Variables
        __package__ = None
      Function Details

      query(partition, select_clause, where, limit)

       

      Execute a fastbit query using ntop

      Parameters:
      • partition (string) - required. indicates the from clause sql style (directory of the fastbit db partition to query)
      • select_clause (string) - required. indicates the columns
      • where (string) - required. indicates the where clause sql style
      • limit (int) - required. indicates the max result fetched from the db
      Returns: dictionary
      a dictionary {'columns':[],'values':[]} containing all the values retrieved (max limit) or error otherwise

      ntop-5.0.1+dfsg1/html/docs/python/interface-module.html0000644000000000000000000005603411370533471021535 0ustar rootroot interface
      Module interface
      [frames] | no frames]

      Module interface

      Module that exposes functions to get information on the current interfaces enabled in ntop.

      Functions
       
      numInterfaces()
      Get number of configured interfaces
      String @return the name of the interface
      name()
      Get interface name
      String @return the unique name of the interface
      uniqueName()
      Get unique interface name
      String @return the human-friendly name of the interface
      humanName()
      Get human-friendly interface name
      string
      ipv4(interfaceId)
      Get interface address (IPv4)
      string
      network(interfaceId)
      Get network and mask to which the interface belongs
      number
      numHosts(interfaceId)
      Get the number of hosts active on this interface
      string
      ipv6(interfaceId)
      Get interface address (IPv6)
      dictionary @return {'startTime':number, 'firstSeen': number, 'lastSeen': number}
      time(interfaceId)
      Get interface time
       
      virtual()
      Check if this is a virtual interface
       
      speed()
      Interface speed (0 if unknown)
       
      mtu()
      Get interface MTU size
       
      bpf()
      Get BPF filter set for this interface (if any)
       
      pktsStats()
      Get packet statistics
       
      fcPktsStats()
      Get FC pkts stats
       
      fcBytesStats()
      Get FC byte stats
       
      bytesStats()
      Get bytes statistics
       
      throughputStats()
       
      tcpStats()
      Get TCP stats
       
      udpStats()
      Get UDP stats
       
      icmpStats()
      Get ICMP stats
       
      ipStats()
      Get IP stats
       
      securityPkts()
      Get information about security packets
       
      netflowStats()
      Get NetFlow interface information
       
      sflowStats()
      Get sFlow interface information
       
      cpacketStats()
      Get cPacket counter information
      Variables
        __package__ = None
      Function Details

      ipv4(interfaceId)

       

      Get interface address (IPv4)

      Parameters:
      • interfaceId (int) - the id number for the specified interface
      Returns: string
      the ipv4 address of the interfeceId passed. Empty string if none. Null if no interface passed

      network(interfaceId)

       

      Get network and mask to which the interface belongs

      Parameters:
      • interfaceId (int) - the id number for the specified interface
      Returns: string
      the network and the network mask for the specified interfaceId

      numHosts(interfaceId)

       

      Get the number of hosts active on this interface

      Parameters:
      • interfaceId (int) - the id number for the specified interface
      Returns: number
      the number of hosts for the specified interfaceId

      ipv6(interfaceId)

       

      Get interface address (IPv6)

      Parameters:
      • interfaceId (int) - the id number for the specified interface
      Returns: string
      the ipv6 address of the interfeceId passed. Empty string if none. Null if no interface passed

      time(interfaceId)

       

      Get interface time

      Parameters:
      • interfaceId (int) - the id number for the specified interface
      Returns: dictionary @return {'startTime':number, 'firstSeen': number, 'lastSeen': number}

      ntop-5.0.1+dfsg1/html/docs/python/toc-host-module.html0000644000000000000000000001117711370533471021334 0ustar rootroot host

      Module host


      Functions

      bytesRcvd
      bytesSent
      ethAddress
      fingerprint
      geoIP
      hostResolvedName
      hostTrafficBucket
      hwModel
      ipAddress
      isBridgeHost
      isDHCPClient
      isDHCPServer
      isDirectoryHost
      isFTPhost
      isHTTPhost
      isHostResolvedNameType
      isIMAPhost
      isMasterBrowser
      isMultihomed
      isMultivlaned
      isNtpServer
      isP2P
      isPOPhost
      isPrinter
      isSMTPhost
      isServer
      isVoIPClient
      isVoIPGateway
      isVoIPHost
      isWINShost
      isWorkstation
      network_mask
      numHostSessions
      pktRcvd
      pktSent
      receiveThpt
      sendThpt
      serial
      synPktsSent
      totContactedRcvdPeers
      totContactedSentPeers
      vlanId

      Variables

      __package__

      ntop-5.0.1+dfsg1/html/docs/python/toc.html0000644000000000000000000000303711370533471017072 0ustar rootroot Table of Contents

      Table of Contents


      Everything

      Modules

      fastbit
      host
      interface
      ntop

      ntop-5.0.1+dfsg1/html/docs/python/help.html0000644000000000000000000002503311370533471017235 0ustar rootroot Help
       
      [frames] | no frames]

      API Documentation

      This document contains the API (Application Programming Interface) documentation for Ntop python.c modules API. Documentation for the Python objects defined by the project is divided into separate pages for each package, module, and class. The API documentation also includes two pages containing information about the project as a whole: a trees page, and an index page.

      Object Documentation

      Each Package Documentation page contains:

      • A description of the package.
      • A list of the modules and sub-packages contained by the package.
      • A summary of the classes defined by the package.
      • A summary of the functions defined by the package.
      • A summary of the variables defined by the package.
      • A detailed description of each function defined by the package.
      • A detailed description of each variable defined by the package.

      Each Module Documentation page contains:

      • A description of the module.
      • A summary of the classes defined by the module.
      • A summary of the functions defined by the module.
      • A summary of the variables defined by the module.
      • A detailed description of each function defined by the module.
      • A detailed description of each variable defined by the module.

      Each Class Documentation page contains:

      • A class inheritance diagram.
      • A list of known subclasses.
      • A description of the class.
      • A summary of the methods defined by the class.
      • A summary of the instance variables defined by the class.
      • A summary of the class (static) variables defined by the class.
      • A detailed description of each method defined by the class.
      • A detailed description of each instance variable defined by the class.
      • A detailed description of each class (static) variable defined by the class.

      Project Documentation

      The Trees page contains the module and class hierarchies:

      • The module hierarchy lists every package and module, with modules grouped into packages. At the top level, and within each package, modules and sub-packages are listed alphabetically.
      • The class hierarchy lists every class, grouped by base class. If a class has more than one base class, then it will be listed under each base class. At the top level, and under each base class, classes are listed alphabetically.

      The Index page contains indices of terms and identifiers:

      • The term index lists every term indexed by any object's documentation. For each term, the index provides links to each place where the term is indexed.
      • The identifier index lists the (short) name of every package, module, class, method, function, variable, and parameter. For each identifier, the index provides a short description, and a link to its documentation.

      The Table of Contents

      The table of contents occupies the two frames on the left side of the window. The upper-left frame displays the project contents, and the lower-left frame displays the module contents:

      Project
      Contents
      ...
      API
      Documentation
      Frame


      Module
      Contents
       
      ...
       

      The project contents frame contains a list of all packages and modules that are defined by the project. Clicking on an entry will display its contents in the module contents frame. Clicking on a special entry, labeled "Everything," will display the contents of the entire project.

      The module contents frame contains a list of every submodule, class, type, exception, function, and variable defined by a module or package. Clicking on an entry will display its documentation in the API documentation frame. Clicking on the name of the module, at the top of the frame, will display the documentation for the module itself.

      The "frames" and "no frames" buttons below the top navigation bar can be used to control whether the table of contents is displayed or not.

      The Navigation Bar

      A navigation bar is located at the top and bottom of every page. It indicates what type of page you are currently viewing, and allows you to go to related pages. The following table describes the labels on the navigation bar. Note that not some labels (such as [Parent]) are not displayed on all pages.

      Label Highlighted when... Links to...
      [Parent] (never highlighted) the parent of the current package
      [Package] viewing a package the package containing the current object
      [Module] viewing a module the module containing the current object
      [Class] viewing a class the class containing the current object
      [Trees] viewing the trees page the trees page
      [Index] viewing the index page the index page
      [Help] viewing the help page the help page

      The "show private" and "hide private" buttons below the top navigation bar can be used to control whether documentation for private objects is displayed. Private objects are usually defined as objects whose (short) names begin with a single underscore, but do not end with an underscore. For example, "_x", "__pprint", and "epydoc.epytext._tokenize" are private objects; but "re.sub", "__init__", and "type_" are not. However, if a module defines the "__all__" variable, then its contents are used to decide which objects are private.

      A timestamp below the bottom navigation bar indicates when each page was last updated.

      ntop-5.0.1+dfsg1/html/docs/python/toc-interface-module.html0000644000000000000000000000634411370533471022317 0ustar rootroot interface

      Module interface


      Functions

      bpf
      bytesStats
      cpacketStats
      fcBytesStats
      fcPktsStats
      humanName
      icmpStats
      ipStats
      ipv4
      ipv6
      mtu
      name
      netflowStats
      network
      numHosts
      numInterfaces
      pktsStats
      securityPkts
      sflowStats
      speed
      tcpStats
      throughputStats
      time
      udpStats
      uniqueName
      virtual

      Variables

      __package__

      ntop-5.0.1+dfsg1/html/docs/python/redirect.html0000644000000000000000000000201211370533471020076 0ustar rootrootEpydoc Redirect Page

      Epydoc Auto-redirect page

      When javascript is enabled, this page will redirect URLs of the form redirect.html#dotted.name to the documentation for the object with the given fully-qualified dotted name.

       

      ntop-5.0.1+dfsg1/html/ntop_logo.png0000644000000000000000000001272111040737306015651 0ustar rootroot‰PNG  IHDRg2AŽ liCCPICCProfilexœ­— 4U_ûÇ÷¹×u/—ëº\cdB¦ f™BˆŒ‘9ežg)!C…È×ÊÎËÖ…Äq$æqqq#ÅÇTXÀÖÝ“Ô3zà?˜—ÃGöÀ — Ùß>ËÊš`*ûÛÇ÷ü+j|þö­ü™+ˆ¡ÏËARâ ¢Rñ‰H\ç#=["{ D⯇Dâ^>ðq^:Ûúxúþ5_ÔÀÿu~øÎœ4 I`H&$EHë QJ Ú•j cM³FMwŒ¾‹Á‹‰¹—Õƒ Ç^Ä!É™Æ ñ\ãá—(*ÿGÁ`amQnqÌ#Ÿ›Çz¥òe"OØž¢Ÿþ,ÿV1PÙø¬èùí*çj‘ZtíBÝëú|Âõ ²t‹MíÍY/=ZT[ZgÛª_…µktÐv|èÌ~mÝÅÙ5þ&æ­ÌÛ™îÄ•žíÞ²>û~Žþ‰wY–ƒœƒ_‡»Hü~ß2ñA} =Ö÷1aÜp‚ybòSÁäµ)É©ßÓŸfÌ¿ð}YýJø1«3Ç0÷i¾`Áéûñïë‹MKw—í~œ^Á­Ì¯ÖbÖM7ø6Ö7›·b¶v8wvcYü݃ïì§õˆD’þga‘ðGd-ˆ $JŽâ&å{ªÓÔOiİU89ºn¼ÃS< ;ëc6öÚÿÑÿ¤@Žà¾ÐIa‘‡¢@,B|WRãDµ´œ Vuòè)ÙÓºgÌåä Î(©* «ŸÕSSwÑèÐ:¡m¬S­»¯§ªfPuaÖQÑø²I¨iŠÙóV‹÷—–¬ Ëxk![};;{‡pÇø+)NYWó®:¹¹>tËtOñHð¼ã•ê]âSëÛæ×í?08ÔÜRZ–z="Üé†öM‘LÄò­ÞȲ¨˜hŸÛ¾1±wããSî$ݹœàœh’¤t_0™&y3eìAsj~Z|º†CæÅ,õléÎ\Tîb^ÿêü¬‚¨BÏ"«bG§KŽ=f)E•n•Í<é{J(ϯˆ¬tz¦õüXªj¶º½&·6¤Î´^Š€%Ì¿hmHotmRj¦kþòòYKpëÙ6LÛÈ«Œv«îŽÙÎǯ]ºÄ»¶Þ4¼èÖéaèùÔû¸Ï»_áúÝÈ@ö ÃèÐöpÓÈ÷gG)Gû?”ŒÝúh3.?Á:±óip²l*bÚâ³Ä rfìKÉW¿oª³ØÙ±¹¼yÇ‘…ï‹ÅK Ëa?\VLW•ÖøÖ‘ë3›÷·œ¶åv°;Ó?ŸíÞúeú[d¶7¼Ÿz¨?Œ ¶M†@ È)‘ % ¡¢ Fchi0´´8,ŽÇ€gÄ33²°²²±±°=ÊÉÉÎÅÍÍÃËÇÇË/ pì˜BXˆ´ ˆŠ‰ŠJˆKJž8!%---#++sêÌ)ÂéÓgÎÈÉÉ+(((**)++«(«ªžUSSSW×P×ÔÔÒ:wN[[»[GWW÷¼®žž¾¾Á… †††FFMLLMÍÌÌÍ-.]ºdiIZ¬.[[[ÛØØÚÚξ;‡oŽŽWœœœ®^½ºpíš³³‹³««ë²››»»‡‡Çª§§——··÷†¯¯ŸŸß¶¿@@``PPЯàà½Ðа°ë×ÃÃo@7nܼqëV$"22**:úö튘˜ØØ¸¸øø;Ôwîܽ{ï^BB"mbbRÒýûÉÉ))¤2¦¦¦¥¥§gddffee³egçääææå=|˜Ï•Ÿ_PPXXTTÌW\üèQIÉãÇ¥ÇJKËÊžŒ}ü8>>119955ýyfæË—oßfgçç¾/../ýø±ºº¾¾¹¹½½»ûû÷þþþ‡¹ïÀÈ¥ÈiÀ„R¾|@ÊÙ|{¤ÔJÊ™zÔž0Ã@;Ë ìºæR£ô€ œêÀx€hjA?˜‡à$ BîP3~~þ-Áøÿ·ösJÓÊ3*Kªûjôê↚ZçÞé]Éó—õîè×ÌÒ)] 6nü/)ÿ&>ã®{‚F÷ý½”‘Ô²ôˆL«lé\Ú¼¥üîªâì’ØÒÐ'ÁåA•þÏ5«j¾ÖÕn7X7)½änE·í¶/w®tmw#z™ûO X EÜõSg˜Xœ|3ý|¦økñì³ùŽïÓË`EpMÃo+k§mweÏäþ€4`¼@†¤¿=ðᤠ|…Ðt²†îA-Ð& ‚ÙÁÂa9°qø¸Ü ž_ £!;AFÖC¶‰`C¸#^‘³’«“þûI¤Ò‡\F Š)8(b(¶(í(‡Ñêèô•5õC '&†‡¦+Š­£U¡íÃ]Â-Ó]§ÇÓ—âUð Œ5L&L¿™óX4XVY3hÙa{DR™æh;G§ çW·Ï:o-_(¿šV°äX€–ðªHçñ\ÑqI œÄºä°T®t”ŒÇIMÒ~F@#—ÿ¥¸¬´ <§2wvQmUƒ¨EqŽ^›SWñ¼žƒ~Ð…RÃv£é‹DS3kó[¥–¿.óZØ„ÙM9àÕ¯;U]]r±#í`¦=¸<í½J|¥ýÂü»ñA¶¡ð0£ë%áĈòHŠ(ûèÖØð¸™;êwËp‰AI_RR…Ò22¨2ò6r®æN?4Ë.Ô/ê{¤[Ò[ª_6ôÔ¬|Š´Y« ­A×¦Õ  :ÓÍ~-˜WJíA]ÌoÝæ}ùï´V‡2Fξ_ýóQwœ81ú©rÊî3óç™þ¯Ñßìf•æ~Ï-Ô/ú.]\–þÁðc{µ~-}=xÃjSy‹wµ½¸ÓÿÓiÚMÿöÛ~ïܾøþ‡õÒC8éXÛ‚ÿ²¹8ûü3æA…DeïjttD‘Úàôgű=¬Íþä0,™&Ô¸fù/±¼íýÿÔ?*nîžNŽW¼9”H•©½0‡¦«íqa 11Y𬣠̆ƒúÇ pHYs  šœ!tEXtSoftwareGraphicConverter (Intel)w‡úÞIDATxœìœ LgÇWŪµÕÚJÕ&¶*Z­I=jcCR“Þ±ÖJ¥§¦Icí¦‰Úª”ZñD-bÑJ<¼ªE¬  "âQY@®Ý™y}ogWv˜ofYv)ó’ Ì›÷½ù~ó3ŒNǶfuÔärYêZÕÈ¡ªª'ê Ô“¨>š\&oÔã¨GQéDX2ë4f̘aaaÓâã£ë+JË úÂjC¹&Wª¡üBEFúÉ”yS§N}Í ©SóÓm„ ¯7Þ®ª‚Ôµñs5µ–’×çsh5r‚ê®³êæˆTï   `ÈØâþdÛ£™ôÔBä@­§Êˇ~y:&&&üäþDÛ©Œ×rÈaj(ª«NgÔàØØØw'Ø®u=Ã÷¨PXàÐ,aÂIu{‚V²·›†ÒãG~s{>­g&êETk8Ïy>;$ÖpàÐ/nÏ«àÌFeÁ9áöÍâîU‚Ì ãÝžW+ÁyI'®3;Xà ÷$8C½ÎÕ4·ç¥ÁÑàhp€ò<€ª"€Ê øû9üÛ~€ä`v¬Ã¿bŒ0rr8ú<¶Êtæ+ç“0ó‰B˜çÅréçÕL1O{Ör§#Îî8*¹NáÜn¼†\1&é:æ”»ààÏž‡?¼øºji%æÿ<]œ‘q÷[Û•ÓbEbWÈPY¤îom/'N–P°„Æ{ê犱ìùùñ TJý/1ÝB}rLC-À¹=ž‡+=ÁÈTÀÊ3ØWÉú\1Îùûü%ÅñnžßtWSëpÄn\H\$½Ù2·² ²}£YìßLÏ#èó«–åÄ€Z‘3vd±˜‡£`,v«¬ 0Á)<è\k+=æpÀÙJ±¶êRç*EàLËÄ?Xù%É- ‡ìd¨‡Ã©¾¹ }@q2u ƃ€“¾æªý/ðy{€O ÄÞÍF—Óp×F,ìڇǛ‚5›´¶š2†s£H>>aû’\ úÑLìTp¬ÙZ–uj“(óXÁü­“öäh¢Aqq6%Vöͳ ‡ý3‘è'N$„c+ÄY¨’¥†x(œ´õL®ö&ÛÿØ2‰Ÿ½ëþF ;^Ù?ìò/eûÓ´Ûœ´?ä1±[åïêÙþx(…MJÅÛ)8ÀQ÷ÖÜh,2wS²ò±…ò¬™ä­Ëêpª 뀣µËôy GiQÖ‚pZ°²ìF±jÎ<+‡ÚJu8y»ã Ôe²Î¹}µÅà8÷ÈÀpø£ËٱʳUs6Òª¾¹qµêp²¶ªÆäXçï¶œ¡ç8lxÒåtöÅD¼ë˜ÿŽÏ$~ ¬Uþ…}>êv,oTræJSåçÜ«ÞÄŽ™¼D9æÆ·€Ñ¹âlµÄ±º,I±çÌÒC*ØÏ¾˜ùÝó_6HâWWwKNâ#taw'µzÕœUÅòs®g‹Çæ²óK[£ϰf4ûœ²TÇê2'–àü¨Ÿ„Þ‡czÁá$·%8¤F¥ÙZ¤Ìúñlÿó{ÕáÔã,sAOvÌ“aìs2ÂC†C¯FõC8‡ÛCz8;ÞëÁÒ˜üâþ`PZè P‡C–· `ngéÍù¡òâ:úgà|ÕN_„“ÔÖàWT®LÚ9 µIÜ'Ö4ß=·¶ßÇØ†Cv[jÒB€Ýߘvß­® à!gà|õ¿cj=…Ô+Ô–]Kk‚m ޽–àX=ºŽ ´}â(œà¿úZÆ]~š ‡öÞÎqÆ8l]+‡·,œ›¸`ÅÉŠÛá4Òž”üбoöbûÓ»h2d]s O˜¥˜þªí‡l²bÛ&I»É…s§`É@ÇÁ¸·ñMy‚Y›ý X‰2;+‡Hýºµñ K}ÔóY9xz€fÑsœ0_Y E8¶v¡É* œã 8$aë€K¸ð»–²[AWU~ó{âŽ1ù_0ïa¶ßÑ¥âózÚM^7ξ|æx°ç[1–ÑçÞï°e³kE8QS€§‡r5WäÇ*JüLSÙNƒqÀÖë°…¬…7A7›ç(ÂÙ6¹É/°@èËkÇâÚ§WËåÛ®à8!»à¸J N›•ǃeŒŸ£g’ëË×àØ€ùNÈp×—¯Á±!œóWNIÁdon²UàôÑà˜5·3qÓ’К¬µÊá|‰©³úç) œD˜ÝÁý•ÓN%äÄ ÈaFs8ôÕˆ-°t°Û“l¯Òg'ÝBŸ£Fè¬þa—àôòõõ}ŸÏŠ6ÂìŽnO´Ý)êc LBþ¨guâ'nLF}5bÈôéÓƒêòkaç œ>úkrµ¢?!-\Øôç†L//¯ÁxÔS:ñ½ŽûFïÐGrFy{{O8qb¨¿¿ÿvÔNÔ.M®‘ŸŸ_̰aÖ›gio›[M]³Q롯FЗŒžG½‚z凚¢Éešl†25õ˜ÎêÓ*ÍÑ;lD®/êÔ ”&—i ª?ª·NZ˜`¬­£Ù‰@uÑärÑøBËÙñþÿÿ’üèö ™ ˜IEND®B`‚ntop-5.0.1+dfsg1/html/bit_off.png0000644000000000000000000000017311127453220015253 0ustar rootroot‰PNG  IHDR ‹ðêú!tEXtSoftwareGraphicConverter (Intel)w‡úIDATxœbhfhÀ›ÿÿH`ðµÞŒIEND®B`‚ntop-5.0.1+dfsg1/html/multivlaned.gif0000644000000000000000000000161410245334210016146 0ustar rootrootGIF89a÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœcÿœcÿœcÿœcÿœcÿœcÿccÿccÿccÿccÿccÿccÿc1ÿc1ÿc1ÿc1ÿc1ÿ11ÿ11ÿ11ÿ11ÿ11ÿ11ÿ1ÿ1ÿ1ÿ1ÿ1ÿÿÿÿÿÿÎÿœÎÿœÎÿœÎÿœÎÿœÎÿœÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎc1Îc1Îc1Îc1Îc1Î11Î11Î11Î11Î11Î1Î1Î1Î1Î1½½½½½­­­­­­­­­­­­­­­­­­­­­œÿœœÿœœÿœœÿœœÿœœÿœœÿcœÿcœÿcœÿcœÿcœÿcœÎcœÎcœÎcœÎcœÎcœÎcœœœœœœœœœœœœœœœœœœœc1œc1œc1œc1œc1œc1œ11œ11œ11œ11œ11œ11cÎÿcÎÿcÎÿcÎÿcÎÿcÎÿcÎccÎccÎccÎccÎccœÿcœÿcœÿcœÿcœÿcœÎcœÎcœÎcœÎcœÎcœccœccœccœccœccœccœ1cœ1cœ1cœ1cœ1ccÿccÿccÿccÿccÿccÿccÎccÎccÎccÎccÎccccccccccccccccccc1c1c1c1c1cccccBBBBBBBBBBBBBBBBBBBBBBBB1œÎ1œÎ1œÎ1œÎ1œÎ1œÎ1œ11œ11œ11œ11œ11œ11cÎ1cÎ1cÎ1cÎ1cÎ1cÎ1cœ1cœ1cœ1cœ1cœ1cœ1c11c11c11c11c11c111c11c11c11c11c11c111111111111111!!!!!!!!!!!!!!!!!!11111111111111111!ù,iH° ÁË4¸ìײ…>„ˆÐ!Ä„bœXñ—Ç9 Ü(q£@9(åTL©ò¤'-4”ó2&š0Gþ¢iófÍ‘8{úÌ9ThP—B‹"]x”'ÓšN!%ú&ÕªI ²4;ntop-5.0.1+dfsg1/html/jqplot/0000755000000000000000000000000012012127277014451 5ustar rootrootntop-5.0.1+dfsg1/html/jqplot/jquery.jqplot.css0000644000000000000000000001274011762677020020025 0ustar rootroot/*rules for the plot target div. These will be cascaded down to all plot elements according to css rules*/ .jqplot-target { position: relative; color: #666666; font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; font-size: 1em; /* height: 300px; width: 400px;*/ } /*rules applied to all axes*/ .jqplot-axis { font-size: 0.75em; } .jqplot-xaxis { margin-top: 10px; } .jqplot-x2axis { margin-bottom: 10px; } .jqplot-yaxis { margin-right: 10px; } .jqplot-y2axis, .jqplot-y3axis, .jqplot-y4axis, .jqplot-y5axis, .jqplot-y6axis, .jqplot-y7axis, .jqplot-y8axis, .jqplot-y9axis, .jqplot-yMidAxis { margin-left: 10px; margin-right: 10px; } /*rules applied to all axis tick divs*/ .jqplot-axis-tick, .jqplot-xaxis-tick, .jqplot-yaxis-tick, .jqplot-x2axis-tick, .jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick, .jqplot-yMidAxis-tick { position: absolute; white-space: pre; } .jqplot-xaxis-tick { top: 0px; /* initial position untill tick is drawn in proper place */ left: 15px; /* padding-top: 10px;*/ vertical-align: top; } .jqplot-x2axis-tick { bottom: 0px; /* initial position untill tick is drawn in proper place */ left: 15px; /* padding-bottom: 10px;*/ vertical-align: bottom; } .jqplot-yaxis-tick { right: 0px; /* initial position untill tick is drawn in proper place */ top: 15px; /* padding-right: 10px;*/ text-align: right; } .jqplot-yaxis-tick.jqplot-breakTick { right: -20px; margin-right: 0px; padding:1px 5px 1px 5px; /* background-color: white;*/ z-index: 2; font-size: 1.5em; } .jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick { left: 0px; /* initial position untill tick is drawn in proper place */ top: 15px; /* padding-left: 10px;*/ /* padding-right: 15px;*/ text-align: left; } .jqplot-yMidAxis-tick { text-align: center; white-space: nowrap; } .jqplot-xaxis-label { margin-top: 10px; font-size: 11pt; position: absolute; } .jqplot-x2axis-label { margin-bottom: 10px; font-size: 11pt; position: absolute; } .jqplot-yaxis-label { margin-right: 10px; /* text-align: center;*/ font-size: 11pt; position: absolute; } .jqplot-yMidAxis-label { font-size: 11pt; position: absolute; } .jqplot-y2axis-label, .jqplot-y3axis-label, .jqplot-y4axis-label, .jqplot-y5axis-label, .jqplot-y6axis-label, .jqplot-y7axis-label, .jqplot-y8axis-label, .jqplot-y9axis-label { /* text-align: center;*/ font-size: 11pt; margin-left: 10px; position: absolute; } .jqplot-meterGauge-tick { font-size: 0.75em; color: #999999; } .jqplot-meterGauge-label { font-size: 1em; color: #999999; } table.jqplot-table-legend { margin-top: 12px; margin-bottom: 12px; margin-left: 12px; margin-right: 12px; } table.jqplot-table-legend, table.jqplot-cursor-legend { background-color: rgba(255,255,255,0.6); border: 1px solid #cccccc; position: absolute; font-size: 0.75em; } td.jqplot-table-legend { vertical-align:middle; } /* These rules could be used instead of assigning element styles and relying on js object properties. */ /* td.jqplot-table-legend-swatch { padding-top: 0.5em; text-align: center; } tr.jqplot-table-legend:first td.jqplot-table-legend-swatch { padding-top: 0px; } */ td.jqplot-seriesToggle:hover, td.jqplot-seriesToggle:active { cursor: pointer; } .jqplot-table-legend .jqplot-series-hidden { text-decoration: line-through; } div.jqplot-table-legend-swatch-outline { border: 1px solid #cccccc; padding:1px; } div.jqplot-table-legend-swatch { width:0px; height:0px; border-top-width: 5px; border-bottom-width: 5px; border-left-width: 6px; border-right-width: 6px; border-top-style: solid; border-bottom-style: solid; border-left-style: solid; border-right-style: solid; } .jqplot-title { top: 0px; left: 0px; padding-bottom: 0.5em; font-size: 1.2em; } table.jqplot-cursor-tooltip { border: 1px solid #cccccc; font-size: 0.75em; } .jqplot-cursor-tooltip { border: 1px solid #cccccc; font-size: 0.75em; white-space: nowrap; background: rgba(208,208,208,0.5); padding: 1px; } .jqplot-highlighter-tooltip, .jqplot-canvasOverlay-tooltip { border: 1px solid #cccccc; font-size: 0.75em; white-space: nowrap; background: rgba(208,208,208,0.5); padding: 1px; } .jqplot-point-label { font-size: 0.75em; z-index: 2; } td.jqplot-cursor-legend-swatch { vertical-align: middle; text-align: center; } div.jqplot-cursor-legend-swatch { width: 1.2em; height: 0.7em; } .jqplot-error { /* Styles added to the plot target container when there is an error go here.*/ text-align: center; } .jqplot-error-message { /* Styling of the custom error message div goes here.*/ position: relative; top: 46%; display: inline-block; } div.jqplot-bubble-label { font-size: 0.8em; /* background: rgba(90%, 90%, 90%, 0.15);*/ padding-left: 2px; padding-right: 2px; color: rgb(20%, 20%, 20%); } div.jqplot-bubble-label.jqplot-bubble-label-highlight { background: rgba(90%, 90%, 90%, 0.7); } div.jqplot-noData-container { text-align: center; background-color: rgba(96%, 96%, 96%, 0.3); } ntop-5.0.1+dfsg1/html/jqplot/excanvas.js0000644000000000000000000012214611762677020016634 0ustar rootroot// Memory Leaks patch from http://explorercanvas.googlecode.com/svn/trunk/ // svn : r73 // ------------------------------------------------------------------ // Copyright 2006 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Known Issues: // // * Patterns only support repeat. // * Radial gradient are not implemented. The VML version of these look very // different from the canvas one. // * Clipping paths are not implemented. // * Coordsize. The width and height attribute have higher priority than the // width and height style values which isn't correct. // * Painting mode isn't implemented. // * Canvas width/height should is using content-box by default. IE in // Quirks mode will draw the canvas using border-box. Either change your // doctype to HTML5 // (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) // or use Box Sizing Behavior from WebFX // (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) // * Non uniform scaling does not correctly scale strokes. // * Optimize. There is always room for speed improvements. // Only add this code if we do not already have a canvas implementation if (!document.createElement('canvas').getContext) { (function() { // alias some functions to make (compiled) code shorter var m = Math; var mr = m.round; var ms = m.sin; var mc = m.cos; var abs = m.abs; var sqrt = m.sqrt; // this is used for sub pixel precision var Z = 10; var Z2 = Z / 2; var IE_VERSION = +navigator.userAgent.match(/MSIE ([\d.]+)?/)[1]; /** * This funtion is assigned to the elements as element.getContext(). * @this {HTMLElement} * @return {CanvasRenderingContext2D_} */ function getContext() { return this.context_ || (this.context_ = new CanvasRenderingContext2D_(this)); } var slice = Array.prototype.slice; /** * Binds a function to an object. The returned function will always use the * passed in {@code obj} as {@code this}. * * Example: * * g = bind(f, obj, a, b) * g(c, d) // will do f.call(obj, a, b, c, d) * * @param {Function} f The function to bind the object to * @param {Object} obj The object that should act as this when the function * is called * @param {*} var_args Rest arguments that will be used as the initial * arguments when the function is called * @return {Function} A new function that has bound this */ function bind(f, obj, var_args) { var a = slice.call(arguments, 2); return function() { return f.apply(obj, a.concat(slice.call(arguments))); }; } function encodeHtmlAttribute(s) { return String(s).replace(/&/g, '&').replace(/"/g, '"'); } function addNamespace(doc, prefix, urn) { if (!doc.namespaces[prefix]) { doc.namespaces.add(prefix, urn, '#default#VML'); } } function addNamespacesAndStylesheet(doc) { addNamespace(doc, 'g_vml_', 'urn:schemas-microsoft-com:vml'); addNamespace(doc, 'g_o_', 'urn:schemas-microsoft-com:office:office'); // Setup default CSS. Only add one style sheet per document if (!doc.styleSheets['ex_canvas_']) { var ss = doc.createStyleSheet(); ss.owningElement.id = 'ex_canvas_'; ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + // default size is 300x150 in Gecko and Opera 'text-align:left;width:300px;height:150px}'; } } // Add namespaces and stylesheet at startup. addNamespacesAndStylesheet(document); var G_vmlCanvasManager_ = { init: function(opt_doc) { var doc = opt_doc || document; // Create a dummy element so that IE will allow canvas elements to be // recognized. doc.createElement('canvas'); doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); }, init_: function(doc) { // find all canvas elements var els = doc.getElementsByTagName('canvas'); for (var i = 0; i < els.length; i++) { this.initElement(els[i]); } }, /** * Public initializes a canvas element so that it can be used as canvas * element from now on. This is called automatically before the page is * loaded but if you are creating elements using createElement you need to * make sure this is called on the element. * @param {HTMLElement} el The canvas element to initialize. * @return {HTMLElement} the element that was created. */ initElement: function(el) { if (!el.getContext) { el.getContext = getContext; // Add namespaces and stylesheet to document of the element. addNamespacesAndStylesheet(el.ownerDocument); // Remove fallback content. There is no way to hide text nodes so we // just remove all childNodes. We could hide all elements and remove // text nodes but who really cares about the fallback content. el.innerHTML = ''; // do not use inline function because that will leak memory el.attachEvent('onpropertychange', onPropertyChange); el.attachEvent('onresize', onResize); var attrs = el.attributes; if (attrs.width && attrs.width.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setWidth_(attrs.width.nodeValue); el.style.width = attrs.width.nodeValue + 'px'; } else { el.width = el.clientWidth; } if (attrs.height && attrs.height.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setHeight_(attrs.height.nodeValue); el.style.height = attrs.height.nodeValue + 'px'; } else { el.height = el.clientHeight; } //el.getContext().setCoordsize_() } return el; }, // Memory Leaks patch : see http://code.google.com/p/explorercanvas/issues/detail?id=82 uninitElement: function(el){ if (el.getContext) { var ctx = el.getContext(); delete ctx.element_; delete ctx.canvas; el.innerHTML = ""; //el.outerHTML = ""; el.context_ = null; el.getContext = null; el.detachEvent("onpropertychange", onPropertyChange); el.detachEvent("onresize", onResize); } } }; function onPropertyChange(e) { var el = e.srcElement; switch (e.propertyName) { case 'width': el.getContext().clearRect(); el.style.width = el.attributes.width.nodeValue + 'px'; // In IE8 this does not trigger onresize. el.firstChild.style.width = el.clientWidth + 'px'; break; case 'height': el.getContext().clearRect(); el.style.height = el.attributes.height.nodeValue + 'px'; el.firstChild.style.height = el.clientHeight + 'px'; break; } } function onResize(e) { var el = e.srcElement; if (el.firstChild) { el.firstChild.style.width = el.clientWidth + 'px'; el.firstChild.style.height = el.clientHeight + 'px'; } } G_vmlCanvasManager_.init(); // precompute "00" to "FF" var decToHex = []; for (var i = 0; i < 16; i++) { for (var j = 0; j < 16; j++) { decToHex[i * 16 + j] = i.toString(16) + j.toString(16); } } function createMatrixIdentity() { return [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ]; } function matrixMultiply(m1, m2) { var result = createMatrixIdentity(); for (var x = 0; x < 3; x++) { for (var y = 0; y < 3; y++) { var sum = 0; for (var z = 0; z < 3; z++) { sum += m1[x][z] * m2[z][y]; } result[x][y] = sum; } } return result; } function copyState(o1, o2) { o2.fillStyle = o1.fillStyle; o2.lineCap = o1.lineCap; o2.lineJoin = o1.lineJoin; o2.lineWidth = o1.lineWidth; o2.miterLimit = o1.miterLimit; o2.shadowBlur = o1.shadowBlur; o2.shadowColor = o1.shadowColor; o2.shadowOffsetX = o1.shadowOffsetX; o2.shadowOffsetY = o1.shadowOffsetY; o2.strokeStyle = o1.strokeStyle; o2.globalAlpha = o1.globalAlpha; o2.font = o1.font; o2.textAlign = o1.textAlign; o2.textBaseline = o1.textBaseline; o2.arcScaleX_ = o1.arcScaleX_; o2.arcScaleY_ = o1.arcScaleY_; o2.lineScale_ = o1.lineScale_; } var colorData = { aliceblue: '#F0F8FF', antiquewhite: '#FAEBD7', aquamarine: '#7FFFD4', azure: '#F0FFFF', beige: '#F5F5DC', bisque: '#FFE4C4', black: '#000000', blanchedalmond: '#FFEBCD', blueviolet: '#8A2BE2', brown: '#A52A2A', burlywood: '#DEB887', cadetblue: '#5F9EA0', chartreuse: '#7FFF00', chocolate: '#D2691E', coral: '#FF7F50', cornflowerblue: '#6495ED', cornsilk: '#FFF8DC', crimson: '#DC143C', cyan: '#00FFFF', darkblue: '#00008B', darkcyan: '#008B8B', darkgoldenrod: '#B8860B', darkgray: '#A9A9A9', darkgreen: '#006400', darkgrey: '#A9A9A9', darkkhaki: '#BDB76B', darkmagenta: '#8B008B', darkolivegreen: '#556B2F', darkorange: '#FF8C00', darkorchid: '#9932CC', darkred: '#8B0000', darksalmon: '#E9967A', darkseagreen: '#8FBC8F', darkslateblue: '#483D8B', darkslategray: '#2F4F4F', darkslategrey: '#2F4F4F', darkturquoise: '#00CED1', darkviolet: '#9400D3', deeppink: '#FF1493', deepskyblue: '#00BFFF', dimgray: '#696969', dimgrey: '#696969', dodgerblue: '#1E90FF', firebrick: '#B22222', floralwhite: '#FFFAF0', forestgreen: '#228B22', gainsboro: '#DCDCDC', ghostwhite: '#F8F8FF', gold: '#FFD700', goldenrod: '#DAA520', grey: '#808080', greenyellow: '#ADFF2F', honeydew: '#F0FFF0', hotpink: '#FF69B4', indianred: '#CD5C5C', indigo: '#4B0082', ivory: '#FFFFF0', khaki: '#F0E68C', lavender: '#E6E6FA', lavenderblush: '#FFF0F5', lawngreen: '#7CFC00', lemonchiffon: '#FFFACD', lightblue: '#ADD8E6', lightcoral: '#F08080', lightcyan: '#E0FFFF', lightgoldenrodyellow: '#FAFAD2', lightgreen: '#90EE90', lightgrey: '#D3D3D3', lightpink: '#FFB6C1', lightsalmon: '#FFA07A', lightseagreen: '#20B2AA', lightskyblue: '#87CEFA', lightslategray: '#778899', lightslategrey: '#778899', lightsteelblue: '#B0C4DE', lightyellow: '#FFFFE0', limegreen: '#32CD32', linen: '#FAF0E6', magenta: '#FF00FF', mediumaquamarine: '#66CDAA', mediumblue: '#0000CD', mediumorchid: '#BA55D3', mediumpurple: '#9370DB', mediumseagreen: '#3CB371', mediumslateblue: '#7B68EE', mediumspringgreen: '#00FA9A', mediumturquoise: '#48D1CC', mediumvioletred: '#C71585', midnightblue: '#191970', mintcream: '#F5FFFA', mistyrose: '#FFE4E1', moccasin: '#FFE4B5', navajowhite: '#FFDEAD', oldlace: '#FDF5E6', olivedrab: '#6B8E23', orange: '#FFA500', orangered: '#FF4500', orchid: '#DA70D6', palegoldenrod: '#EEE8AA', palegreen: '#98FB98', paleturquoise: '#AFEEEE', palevioletred: '#DB7093', papayawhip: '#FFEFD5', peachpuff: '#FFDAB9', peru: '#CD853F', pink: '#FFC0CB', plum: '#DDA0DD', powderblue: '#B0E0E6', rosybrown: '#BC8F8F', royalblue: '#4169E1', saddlebrown: '#8B4513', salmon: '#FA8072', sandybrown: '#F4A460', seagreen: '#2E8B57', seashell: '#FFF5EE', sienna: '#A0522D', skyblue: '#87CEEB', slateblue: '#6A5ACD', slategray: '#708090', slategrey: '#708090', snow: '#FFFAFA', springgreen: '#00FF7F', steelblue: '#4682B4', tan: '#D2B48C', thistle: '#D8BFD8', tomato: '#FF6347', turquoise: '#40E0D0', violet: '#EE82EE', wheat: '#F5DEB3', whitesmoke: '#F5F5F5', yellowgreen: '#9ACD32' }; function getRgbHslContent(styleString) { var start = styleString.indexOf('(', 3); var end = styleString.indexOf(')', start + 1); var parts = styleString.substring(start + 1, end).split(','); // add alpha if needed if (parts.length != 4 || styleString.charAt(3) != 'a') { parts[3] = 1; } return parts; } function percent(s) { return parseFloat(s) / 100; } function clamp(v, min, max) { return Math.min(max, Math.max(min, v)); } function hslToRgb(parts){ var r, g, b, h, s, l; h = parseFloat(parts[0]) / 360 % 360; if (h < 0) h++; s = clamp(percent(parts[1]), 0, 1); l = clamp(percent(parts[2]), 0, 1); if (s == 0) { r = g = b = l; // achromatic } else { var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = hueToRgb(p, q, h + 1 / 3); g = hueToRgb(p, q, h); b = hueToRgb(p, q, h - 1 / 3); } return '#' + decToHex[Math.floor(r * 255)] + decToHex[Math.floor(g * 255)] + decToHex[Math.floor(b * 255)]; } function hueToRgb(m1, m2, h) { if (h < 0) h++; if (h > 1) h--; if (6 * h < 1) return m1 + (m2 - m1) * 6 * h; else if (2 * h < 1) return m2; else if (3 * h < 2) return m1 + (m2 - m1) * (2 / 3 - h) * 6; else return m1; } var processStyleCache = {}; function processStyle(styleString) { if (styleString in processStyleCache) { return processStyleCache[styleString]; } var str, alpha = 1; styleString = String(styleString); if (styleString.charAt(0) == '#') { str = styleString; } else if (/^rgb/.test(styleString)) { var parts = getRgbHslContent(styleString); var str = '#', n; for (var i = 0; i < 3; i++) { if (parts[i].indexOf('%') != -1) { n = Math.floor(percent(parts[i]) * 255); } else { n = +parts[i]; } str += decToHex[clamp(n, 0, 255)]; } alpha = +parts[3]; } else if (/^hsl/.test(styleString)) { var parts = getRgbHslContent(styleString); str = hslToRgb(parts); alpha = parts[3]; } else { str = colorData[styleString] || styleString; } return processStyleCache[styleString] = {color: str, alpha: alpha}; } var DEFAULT_STYLE = { style: 'normal', variant: 'normal', weight: 'normal', size: 10, family: 'sans-serif' }; // Internal text style cache var fontStyleCache = {}; function processFontStyle(styleString) { if (fontStyleCache[styleString]) { return fontStyleCache[styleString]; } var el = document.createElement('div'); var style = el.style; try { style.font = styleString; } catch (ex) { // Ignore failures to set to invalid font. } return fontStyleCache[styleString] = { style: style.fontStyle || DEFAULT_STYLE.style, variant: style.fontVariant || DEFAULT_STYLE.variant, weight: style.fontWeight || DEFAULT_STYLE.weight, size: style.fontSize || DEFAULT_STYLE.size, family: style.fontFamily || DEFAULT_STYLE.family }; } function getComputedStyle(style, element) { var computedStyle = {}; for (var p in style) { computedStyle[p] = style[p]; } // Compute the size var canvasFontSize = parseFloat(element.currentStyle.fontSize), fontSize = parseFloat(style.size); if (typeof style.size == 'number') { computedStyle.size = style.size; } else if (style.size.indexOf('px') != -1) { computedStyle.size = fontSize; } else if (style.size.indexOf('em') != -1) { computedStyle.size = canvasFontSize * fontSize; } else if(style.size.indexOf('%') != -1) { computedStyle.size = (canvasFontSize / 100) * fontSize; } else if (style.size.indexOf('pt') != -1) { computedStyle.size = fontSize / .75; } else { computedStyle.size = canvasFontSize; } // Different scaling between normal text and VML text. This was found using // trial and error to get the same size as non VML text. computedStyle.size *= 0.981; // Fix for VML handling of bare font family names. Add a '' around font family names. computedStyle.family = "'" + computedStyle.family.replace(/(\'|\")/g,'').replace(/\s*,\s*/g, "', '") + "'"; return computedStyle; } function buildStyle(style) { return style.style + ' ' + style.variant + ' ' + style.weight + ' ' + style.size + 'px ' + style.family; } var lineCapMap = { 'butt': 'flat', 'round': 'round' }; function processLineCap(lineCap) { return lineCapMap[lineCap] || 'square'; } /** * This class implements CanvasRenderingContext2D interface as described by * the WHATWG. * @param {HTMLElement} canvasElement The element that the 2D context should * be associated with */ function CanvasRenderingContext2D_(canvasElement) { this.m_ = createMatrixIdentity(); this.mStack_ = []; this.aStack_ = []; this.currentPath_ = []; // Canvas context properties this.strokeStyle = '#000'; this.fillStyle = '#000'; this.lineWidth = 1; this.lineJoin = 'miter'; this.lineCap = 'butt'; this.miterLimit = Z * 1; this.globalAlpha = 1; this.font = '10px sans-serif'; this.textAlign = 'left'; this.textBaseline = 'alphabetic'; this.canvas = canvasElement; var cssText = 'width:' + canvasElement.clientWidth + 'px;height:' + canvasElement.clientHeight + 'px;overflow:hidden;position:absolute'; var el = canvasElement.ownerDocument.createElement('div'); el.style.cssText = cssText; canvasElement.appendChild(el); var overlayEl = el.cloneNode(false); // Use a non transparent background. overlayEl.style.backgroundColor = 'red'; overlayEl.style.filter = 'alpha(opacity=0)'; canvasElement.appendChild(overlayEl); this.element_ = el; this.arcScaleX_ = 1; this.arcScaleY_ = 1; this.lineScale_ = 1; } var contextPrototype = CanvasRenderingContext2D_.prototype; contextPrototype.clearRect = function() { if (this.textMeasureEl_) { this.textMeasureEl_.removeNode(true); this.textMeasureEl_ = null; } this.element_.innerHTML = ''; }; contextPrototype.beginPath = function() { // TODO: Branch current matrix so that save/restore has no effect // as per safari docs. this.currentPath_ = []; }; contextPrototype.moveTo = function(aX, aY) { var p = getCoords(this, aX, aY); this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.lineTo = function(aX, aY) { var p = getCoords(this, aX, aY); this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { var p = getCoords(this, aX, aY); var cp1 = getCoords(this, aCP1x, aCP1y); var cp2 = getCoords(this, aCP2x, aCP2y); bezierCurveTo(this, cp1, cp2, p); }; // Helper function that takes the already fixed cordinates. function bezierCurveTo(self, cp1, cp2, p) { self.currentPath_.push({ type: 'bezierCurveTo', cp1x: cp1.x, cp1y: cp1.y, cp2x: cp2.x, cp2y: cp2.y, x: p.x, y: p.y }); self.currentX_ = p.x; self.currentY_ = p.y; } contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { // the following is lifted almost directly from // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes var cp = getCoords(this, aCPx, aCPy); var p = getCoords(this, aX, aY); var cp1 = { x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) }; var cp2 = { x: cp1.x + (p.x - this.currentX_) / 3.0, y: cp1.y + (p.y - this.currentY_) / 3.0 }; bezierCurveTo(this, cp1, cp2, p); }; contextPrototype.arc = function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { aRadius *= Z; var arcType = aClockwise ? 'at' : 'wa'; var xStart = aX + mc(aStartAngle) * aRadius - Z2; var yStart = aY + ms(aStartAngle) * aRadius - Z2; var xEnd = aX + mc(aEndAngle) * aRadius - Z2; var yEnd = aY + ms(aEndAngle) * aRadius - Z2; // IE won't render arches drawn counter clockwise if xStart == xEnd. if (xStart == xEnd && !aClockwise) { xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something // that can be represented in binary } var p = getCoords(this, aX, aY); var pStart = getCoords(this, xStart, yStart); var pEnd = getCoords(this, xEnd, yEnd); this.currentPath_.push({type: arcType, x: p.x, y: p.y, radius: aRadius, xStart: pStart.x, yStart: pStart.y, xEnd: pEnd.x, yEnd: pEnd.y}); }; contextPrototype.rect = function(aX, aY, aWidth, aHeight) { this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); }; contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.stroke(); this.currentPath_ = oldPath; }; contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.fill(); this.currentPath_ = oldPath; }; contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { var gradient = new CanvasGradient_('gradient'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.x1_ = aX1; gradient.y1_ = aY1; return gradient; }; contextPrototype.createRadialGradient = function(aX0, aY0, aR0, aX1, aY1, aR1) { var gradient = new CanvasGradient_('gradientradial'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.r0_ = aR0; gradient.x1_ = aX1; gradient.y1_ = aY1; gradient.r1_ = aR1; return gradient; }; contextPrototype.drawImage = function(image, var_args) { var dx, dy, dw, dh, sx, sy, sw, sh; // to find the original width we overide the width and height var oldRuntimeWidth = image.runtimeStyle.width; var oldRuntimeHeight = image.runtimeStyle.height; image.runtimeStyle.width = 'auto'; image.runtimeStyle.height = 'auto'; // get the original size var w = image.width; var h = image.height; // and remove overides image.runtimeStyle.width = oldRuntimeWidth; image.runtimeStyle.height = oldRuntimeHeight; if (arguments.length == 3) { dx = arguments[1]; dy = arguments[2]; sx = sy = 0; sw = dw = w; sh = dh = h; } else if (arguments.length == 5) { dx = arguments[1]; dy = arguments[2]; dw = arguments[3]; dh = arguments[4]; sx = sy = 0; sw = w; sh = h; } else if (arguments.length == 9) { sx = arguments[1]; sy = arguments[2]; sw = arguments[3]; sh = arguments[4]; dx = arguments[5]; dy = arguments[6]; dw = arguments[7]; dh = arguments[8]; } else { throw Error('Invalid number of arguments'); } var d = getCoords(this, dx, dy); var w2 = sw / 2; var h2 = sh / 2; var vmlStr = []; var W = 10; var H = 10; // For some reason that I've now forgotten, using divs didn't work vmlStr.push(' ' , '', ''); this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); }; contextPrototype.stroke = function(aFill) { var lineStr = []; var lineOpen = false; var W = 10; var H = 10; lineStr.push(''); if (!aFill) { appendStroke(this, lineStr); } else { appendFill(this, lineStr, min, max); } lineStr.push(''); this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); }; function appendStroke(ctx, lineStr) { var a = processStyle(ctx.strokeStyle); var color = a.color; var opacity = a.alpha * ctx.globalAlpha; var lineWidth = ctx.lineScale_ * ctx.lineWidth; // VML cannot correctly render a line if the width is less than 1px. // In that case, we dilute the color to make the line look thinner. if (lineWidth < 1) { opacity *= lineWidth; } lineStr.push( '' ); } function appendFill(ctx, lineStr, min, max) { var fillStyle = ctx.fillStyle; var arcScaleX = ctx.arcScaleX_; var arcScaleY = ctx.arcScaleY_; var width = max.x - min.x; var height = max.y - min.y; if (fillStyle instanceof CanvasGradient_) { // TODO: Gradients transformed with the transformation matrix. var angle = 0; var focus = {x: 0, y: 0}; // additional offset var shift = 0; // scale factor for offset var expansion = 1; if (fillStyle.type_ == 'gradient') { var x0 = fillStyle.x0_ / arcScaleX; var y0 = fillStyle.y0_ / arcScaleY; var x1 = fillStyle.x1_ / arcScaleX; var y1 = fillStyle.y1_ / arcScaleY; var p0 = getCoords(ctx, x0, y0); var p1 = getCoords(ctx, x1, y1); var dx = p1.x - p0.x; var dy = p1.y - p0.y; angle = Math.atan2(dx, dy) * 180 / Math.PI; // The angle should be a non-negative number. if (angle < 0) { angle += 360; } // Very small angles produce an unexpected result because they are // converted to a scientific notation string. if (angle < 1e-6) { angle = 0; } } else { var p0 = getCoords(ctx, fillStyle.x0_, fillStyle.y0_); focus = { x: (p0.x - min.x) / width, y: (p0.y - min.y) / height }; width /= arcScaleX * Z; height /= arcScaleY * Z; var dimension = m.max(width, height); shift = 2 * fillStyle.r0_ / dimension; expansion = 2 * fillStyle.r1_ / dimension - shift; } // We need to sort the color stops in ascending order by offset, // otherwise IE won't interpret it correctly. var stops = fillStyle.colors_; stops.sort(function(cs1, cs2) { return cs1.offset - cs2.offset; }); var length = stops.length; var color1 = stops[0].color; var color2 = stops[length - 1].color; var opacity1 = stops[0].alpha * ctx.globalAlpha; var opacity2 = stops[length - 1].alpha * ctx.globalAlpha; var colors = []; for (var i = 0; i < length; i++) { var stop = stops[i]; colors.push(stop.offset * expansion + shift + ' ' + stop.color); } // When colors attribute is used, the meanings of opacity and o:opacity2 // are reversed. lineStr.push(''); } else if (fillStyle instanceof CanvasPattern_) { if (width && height) { var deltaLeft = -min.x; var deltaTop = -min.y; lineStr.push(''); } } else { var a = processStyle(ctx.fillStyle); var color = a.color; var opacity = a.alpha * ctx.globalAlpha; lineStr.push(''); } } contextPrototype.fill = function() { this.stroke(true); }; contextPrototype.closePath = function() { this.currentPath_.push({type: 'close'}); }; function getCoords(ctx, aX, aY) { var m = ctx.m_; return { x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 }; }; contextPrototype.save = function() { var o = {}; copyState(this, o); this.aStack_.push(o); this.mStack_.push(this.m_); this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); }; contextPrototype.restore = function() { if (this.aStack_.length) { copyState(this.aStack_.pop(), this); this.m_ = this.mStack_.pop(); } }; function matrixIsFinite(m) { return isFinite(m[0][0]) && isFinite(m[0][1]) && isFinite(m[1][0]) && isFinite(m[1][1]) && isFinite(m[2][0]) && isFinite(m[2][1]); } function setM(ctx, m, updateLineScale) { if (!matrixIsFinite(m)) { return; } ctx.m_ = m; if (updateLineScale) { // Get the line scale. // Determinant of this.m_ means how much the area is enlarged by the // transformation. So its square root can be used as a scale factor // for width. var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; ctx.lineScale_ = sqrt(abs(det)); } } contextPrototype.translate = function(aX, aY) { var m1 = [ [1, 0, 0], [0, 1, 0], [aX, aY, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.rotate = function(aRot) { var c = mc(aRot); var s = ms(aRot); var m1 = [ [c, s, 0], [-s, c, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.scale = function(aX, aY) { this.arcScaleX_ *= aX; this.arcScaleY_ *= aY; var m1 = [ [aX, 0, 0], [0, aY, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { var m1 = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { var m = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, m, true); }; /** * The text drawing function. * The maxWidth argument isn't taken in account, since no browser supports * it yet. */ contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) { var m = this.m_, delta = 1000, left = 0, right = delta, offset = {x: 0, y: 0}, lineStr = []; var fontStyle = getComputedStyle(processFontStyle(this.font), this.element_); var fontStyleString = buildStyle(fontStyle); var elementStyle = this.element_.currentStyle; var textAlign = this.textAlign.toLowerCase(); switch (textAlign) { case 'left': case 'center': case 'right': break; case 'end': textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left'; break; case 'start': textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left'; break; default: textAlign = 'left'; } // 1.75 is an arbitrary number, as there is no info about the text baseline switch (this.textBaseline) { case 'hanging': case 'top': offset.y = fontStyle.size / 1.75; break; case 'middle': break; default: case null: case 'alphabetic': case 'ideographic': case 'bottom': offset.y = -fontStyle.size / 2.25; break; } switch(textAlign) { case 'right': left = delta; right = 0.05; break; case 'center': left = right = delta / 2; break; } var d = getCoords(this, x + offset.x, y + offset.y); lineStr.push(''); if (stroke) { appendStroke(this, lineStr); } else { // TODO: Fix the min and max params. appendFill(this, lineStr, {x: -left, y: 0}, {x: right, y: fontStyle.size}); } var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' + m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0'; var skewOffset = mr(d.x / Z + 1 - m[0][0]) + ',' + mr(d.y / Z - 2 * m[1][0]); lineStr.push('', '', ''); this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); }; contextPrototype.fillText = function(text, x, y, maxWidth) { this.drawText_(text, x, y, maxWidth, false); }; contextPrototype.strokeText = function(text, x, y, maxWidth) { this.drawText_(text, x, y, maxWidth, true); }; contextPrototype.measureText = function(text) { if (!this.textMeasureEl_) { var s = ''; this.element_.insertAdjacentHTML('beforeEnd', s); this.textMeasureEl_ = this.element_.lastChild; } var doc = this.element_.ownerDocument; this.textMeasureEl_.innerHTML = ''; this.textMeasureEl_.style.font = this.font; // Don't use innerHTML or innerText because they allow markup/whitespace. this.textMeasureEl_.appendChild(doc.createTextNode(text)); return {width: this.textMeasureEl_.offsetWidth}; }; /******** STUBS ********/ contextPrototype.clip = function() { // TODO: Implement }; contextPrototype.arcTo = function() { // TODO: Implement }; contextPrototype.createPattern = function(image, repetition) { return new CanvasPattern_(image, repetition); }; // Gradient / Pattern Stubs function CanvasGradient_(aType) { this.type_ = aType; this.x0_ = 0; this.y0_ = 0; this.r0_ = 0; this.x1_ = 0; this.y1_ = 0; this.r1_ = 0; this.colors_ = []; } CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { aColor = processStyle(aColor); this.colors_.push({offset: aOffset, color: aColor.color, alpha: aColor.alpha}); }; function CanvasPattern_(image, repetition) { assertImageIsValid(image); switch (repetition) { case 'repeat': case null: case '': this.repetition_ = 'repeat'; break; case 'repeat-x': case 'repeat-y': case 'no-repeat': this.repetition_ = repetition; break; default: throwException('SYNTAX_ERR'); } this.src_ = image.src; this.width_ = image.width; this.height_ = image.height; } function throwException(s) { throw new DOMException_(s); } function assertImageIsValid(img) { if (!img || img.nodeType != 1 || img.tagName != 'IMG') { throwException('TYPE_MISMATCH_ERR'); } if (img.readyState != 'complete') { throwException('INVALID_STATE_ERR'); } } function DOMException_(s) { this.code = this[s]; this.message = s +': DOM Exception ' + this.code; } var p = DOMException_.prototype = new Error; p.INDEX_SIZE_ERR = 1; p.DOMSTRING_SIZE_ERR = 2; p.HIERARCHY_REQUEST_ERR = 3; p.WRONG_DOCUMENT_ERR = 4; p.INVALID_CHARACTER_ERR = 5; p.NO_DATA_ALLOWED_ERR = 6; p.NO_MODIFICATION_ALLOWED_ERR = 7; p.NOT_FOUND_ERR = 8; p.NOT_SUPPORTED_ERR = 9; p.INUSE_ATTRIBUTE_ERR = 10; p.INVALID_STATE_ERR = 11; p.SYNTAX_ERR = 12; p.INVALID_MODIFICATION_ERR = 13; p.NAMESPACE_ERR = 14; p.INVALID_ACCESS_ERR = 15; p.VALIDATION_ERR = 16; p.TYPE_MISMATCH_ERR = 17; // set up externs G_vmlCanvasManager = G_vmlCanvasManager_; CanvasRenderingContext2D = CanvasRenderingContext2D_; CanvasGradient = CanvasGradient_; CanvasPattern = CanvasPattern_; DOMException = DOMException_; G_vmlCanvasManager._version = 888; })(); } // if ntop-5.0.1+dfsg1/html/jqplot/excanvas.min.js0000644000000000000000000005230211762677020017412 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: @VERSION * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * * included jsDate library by Chris Leonello: * * Copyright (c) 2010-2011 Chris Leonello * * jsDate is currently available for use in all personal or commercial projects * under both the MIT and GPL version 2.0 licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * jsDate borrows many concepts and ideas from the Date Instance * Methods by Ken Snyder along with some parts of Ken's actual code. * * Ken's origianl Date Instance Methods and copyright notice: * * Ken Snyder (ken d snyder at gmail dot com) * 2008-09-10 * version 2.0.2 (http://kendsnyder.com/sandbox/date/) * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) * * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. * Larry has generously given permission to adapt his code for inclusion * into jqPlot. * * Larry's original code can be found here: * * https://github.com/lsiden/export-jqplot-to-png * * */ if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&").replace(/"/g,""")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j1){m--}if(6*m<1){return j+(i-j)*6*m}else{if(2*m<1){return i}else{if(3*m<2){return j+(i-j)*(2/3-m)*6}else{return j}}}}var C={};function F(j){if(j in C){return C[j]}var ag,Z=1;j=String(j);if(j.charAt(0)=="#"){ag=j}else{if(/^rgb/.test(j)){var p=M(j);var ag="#",ah;for(var m=0;m<3;m++){if(p[m].indexOf("%")!=-1){ah=Math.floor(c(p[m])*255)}else{ah=+p[m]}ag+=k[r(ah,0,255)]}Z=+p[3]}else{if(/^hsl/.test(j)){var p=M(j);ag=I(p);Z=p[3]}else{ag=b[j]||j}}}return C[j]={color:ag,alpha:Z}}var o={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var L={};function E(i){if(L[i]){return L[i]}var p=document.createElement("div");var m=p.style;try{m.font=i}catch(j){}return L[i]={style:m.fontStyle||o.style,variant:m.fontVariant||o.variant,weight:m.fontWeight||o.weight,size:m.fontSize||o.size,family:m.fontFamily||o.family}}function u(m,j){var i={};for(var ah in m){i[ah]=m[ah]}var ag=parseFloat(j.currentStyle.fontSize),Z=parseFloat(m.size);if(typeof m.size=="number"){i.size=m.size}else{if(m.size.indexOf("px")!=-1){i.size=Z}else{if(m.size.indexOf("em")!=-1){i.size=ag*Z}else{if(m.size.indexOf("%")!=-1){i.size=(ag/100)*Z}else{if(m.size.indexOf("pt")!=-1){i.size=Z/0.75}else{i.size=ag}}}}}i.size*=0.981;i.family="'"+i.family.replace(/(\'|\")/g,"").replace(/\s*,\s*/g,"', '")+"'";return i}function ac(i){return i.style+" "+i.variant+" "+i.weight+" "+i.size+"px "+i.family}var s={butt:"flat",round:"round"};function S(i){return s[i]||"square"}function D(i){this.m_=B();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=d*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var m="width:"+i.clientWidth+"px;height:"+i.clientHeight+"px;overflow:hidden;position:absolute";var j=i.ownerDocument.createElement("div");j.style.cssText=m;i.appendChild(j);var p=j.cloneNode(false);p.style.backgroundColor="red";p.style.filter="alpha(opacity=0)";i.appendChild(p);this.element_=j;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var q=D.prototype;q.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};q.beginPath=function(){this.currentPath_=[]};q.moveTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"moveTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.lineTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"lineTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.bezierCurveTo=function(m,j,ak,aj,ai,ag){var i=V(this,ai,ag);var ah=V(this,m,j);var Z=V(this,ak,aj);K(this,ah,Z,i)};function K(i,Z,m,j){i.currentPath_.push({type:"bezierCurveTo",cp1x:Z.x,cp1y:Z.y,cp2x:m.x,cp2y:m.y,x:j.x,y:j.y});i.currentX_=j.x;i.currentY_=j.y}q.quadraticCurveTo=function(ai,m,j,i){var ah=V(this,ai,m);var ag=V(this,j,i);var aj={x:this.currentX_+2/3*(ah.x-this.currentX_),y:this.currentY_+2/3*(ah.y-this.currentY_)};var Z={x:aj.x+(ag.x-this.currentX_)/3,y:aj.y+(ag.y-this.currentY_)/3};K(this,aj,Z,ag)};q.arc=function(al,aj,ak,ag,j,m){ak*=d;var ap=m?"at":"wa";var am=al+A(ag)*ak-f;var ao=aj+l(ag)*ak-f;var i=al+A(j)*ak-f;var an=aj+l(j)*ak-f;if(am==i&&!m){am+=0.125}var Z=V(this,al,aj);var ai=V(this,am,ao);var ah=V(this,i,an);this.currentPath_.push({type:ap,x:Z.x,y:Z.y,radius:ak,xStart:ai.x,yStart:ai.y,xEnd:ah.x,yEnd:ah.y})};q.rect=function(m,j,i,p){this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath()};q.strokeRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.stroke();this.currentPath_=Z};q.fillRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.fill();this.currentPath_=Z};q.createLinearGradient=function(j,p,i,m){var Z=new U("gradient");Z.x0_=j;Z.y0_=p;Z.x1_=i;Z.y1_=m;return Z};q.createRadialGradient=function(p,ag,m,j,Z,i){var ah=new U("gradientradial");ah.x0_=p;ah.y0_=ag;ah.r0_=m;ah.x1_=j;ah.y1_=Z;ah.r1_=i;return ah};q.drawImage=function(aq,m){var aj,ah,al,ay,ao,am,at,aA;var ak=aq.runtimeStyle.width;var ap=aq.runtimeStyle.height;aq.runtimeStyle.width="auto";aq.runtimeStyle.height="auto";var ai=aq.width;var aw=aq.height;aq.runtimeStyle.width=ak;aq.runtimeStyle.height=ap;if(arguments.length==3){aj=arguments[1];ah=arguments[2];ao=am=0;at=al=ai;aA=ay=aw}else{if(arguments.length==5){aj=arguments[1];ah=arguments[2];al=arguments[3];ay=arguments[4];ao=am=0;at=ai;aA=aw}else{if(arguments.length==9){ao=arguments[1];am=arguments[2];at=arguments[3];aA=arguments[4];aj=arguments[5];ah=arguments[6];al=arguments[7];ay=arguments[8]}else{throw Error("Invalid number of arguments")}}}var az=V(this,aj,ah);var p=at/2;var j=aA/2;var ax=[];var i=10;var ag=10;ax.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",ax.join(""))};q.stroke=function(al){var aj=[];var Z=false;var m=10;var am=10;aj.push("ak.x){ak.x=j.x}if(ag.y==null||j.yak.y){ak.y=j.y}}}aj.push(' ">');if(!al){w(this,aj)}else{G(this,aj,ag,ak)}aj.push("");this.element_.insertAdjacentHTML("beforeEnd",aj.join(""))};function w(m,ag){var j=F(m.strokeStyle);var p=j.color;var Z=j.alpha*m.globalAlpha;var i=m.lineScale_*m.lineWidth;if(i<1){Z*=i}ag.push("')}function G(aq,ai,aK,ar){var aj=aq.fillStyle;var aB=aq.arcScaleX_;var aA=aq.arcScaleY_;var j=ar.x-aK.x;var p=ar.y-aK.y;if(aj instanceof U){var an=0;var aF={x:0,y:0};var ax=0;var am=1;if(aj.type_=="gradient"){var al=aj.x0_/aB;var m=aj.y0_/aA;var ak=aj.x1_/aB;var aM=aj.y1_/aA;var aJ=V(aq,al,m);var aI=V(aq,ak,aM);var ag=aI.x-aJ.x;var Z=aI.y-aJ.y;an=Math.atan2(ag,Z)*180/Math.PI;if(an<0){an+=360}if(an<0.000001){an=0}}else{var aJ=V(aq,aj.x0_,aj.y0_);aF={x:(aJ.x-aK.x)/j,y:(aJ.y-aK.y)/p};j/=aB*d;p/=aA*d;var aD=ab.max(j,p);ax=2*aj.r0_/aD;am=2*aj.r1_/aD-ax}var av=aj.colors_;av.sort(function(aN,i){return aN.offset-i.offset});var ap=av.length;var au=av[0].color;var at=av[ap-1].color;var az=av[0].alpha*aq.globalAlpha;var ay=av[ap-1].alpha*aq.globalAlpha;var aE=[];for(var aH=0;aH')}else{if(aj instanceof T){if(j&&p){var ah=-aK.x;var aC=-aK.y;ai.push("')}}else{var aL=F(aq.fillStyle);var aw=aL.color;var aG=aL.alpha*aq.globalAlpha;ai.push('')}}}q.fill=function(){this.stroke(true)};q.closePath=function(){this.currentPath_.push({type:"close"})};function V(j,Z,p){var i=j.m_;return{x:d*(Z*i[0][0]+p*i[1][0]+i[2][0])-f,y:d*(Z*i[0][1]+p*i[1][1]+i[2][1])-f}}q.save=function(){var i={};v(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=J(B(),this.m_)};q.restore=function(){if(this.aStack_.length){v(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function h(i){return isFinite(i[0][0])&&isFinite(i[0][1])&&isFinite(i[1][0])&&isFinite(i[1][1])&&isFinite(i[2][0])&&isFinite(i[2][1])}function aa(j,i,p){if(!h(i)){return}j.m_=i;if(p){var Z=i[0][0]*i[1][1]-i[0][1]*i[1][0];j.lineScale_=N(H(Z))}}q.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];aa(this,J(i,this.m_),false)};q.rotate=function(j){var p=A(j);var m=l(j);var i=[[p,m,0],[-m,p,0],[0,0,1]];aa(this,J(i,this.m_),false)};q.scale=function(m,j){this.arcScaleX_*=m;this.arcScaleY_*=j;var i=[[m,0,0],[0,j,0],[0,0,1]];aa(this,J(i,this.m_),true)};q.transform=function(Z,p,ah,ag,j,i){var m=[[Z,p,0],[ah,ag,0],[j,i,1]];aa(this,J(m,this.m_),true)};q.setTransform=function(ag,Z,ai,ah,p,j){var i=[[ag,Z,0],[ai,ah,0],[p,j,1]];aa(this,i,true)};q.drawText_=function(am,ak,aj,ap,ai){var ao=this.m_,at=1000,j=0,ar=at,ah={x:0,y:0},ag=[];var i=u(E(this.font),this.element_);var p=ac(i);var au=this.element_.currentStyle;var Z=this.textAlign.toLowerCase();switch(Z){case"left":case"center":case"right":break;case"end":Z=au.direction=="ltr"?"right":"left";break;case"start":Z=au.direction=="rtl"?"right":"left";break;default:Z="left"}switch(this.textBaseline){case"hanging":case"top":ah.y=i.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":ah.y=-i.size/2.25;break}switch(Z){case"right":j=at;ar=0.05;break;case"center":j=ar=at/2;break}var aq=V(this,ak+ah.x,aj+ah.y);ag.push('');if(ai){w(this,ag)}else{G(this,ag,{x:-j,y:0},{x:ar,y:i.size})}var an=ao[0][0].toFixed(3)+","+ao[1][0].toFixed(3)+","+ao[0][1].toFixed(3)+","+ao[1][1].toFixed(3)+",0,0";var al=n(aq.x/d+1-ao[0][0])+","+n(aq.y/d-2*ao[1][0]);ag.push('','','');this.element_.insertAdjacentHTML("beforeEnd",ag.join(""))};q.fillText=function(m,i,p,j){this.drawText_(m,i,p,j,false)};q.strokeText=function(m,i,p,j){this.drawText_(m,i,p,j,true)};q.measureText=function(m){if(!this.textMeasureEl_){var i='';this.element_.insertAdjacentHTML("beforeEnd",i);this.textMeasureEl_=this.element_.lastChild}var j=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(j.createTextNode(m));return{width:this.textMeasureEl_.offsetWidth}};q.clip=function(){};q.arcTo=function(){};q.createPattern=function(j,i){return new T(j,i)};function U(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}U.prototype.addColorStop=function(j,i){i=F(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function T(j,i){Q(j);switch(i){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=i;break;default:O("SYNTAX_ERR")}this.src_=j.src;this.width_=j.width;this.height_=j.height}function O(i){throw new P(i)}function Q(i){if(!i||i.nodeType!=1||i.tagName!="IMG"){O("TYPE_MISMATCH_ERR")}if(i.readyState!="complete"){O("INVALID_STATE_ERR")}}function P(i){this.code=this[i];this.message=i+": DOM Exception "+this.code}var X=P.prototype=new Error;X.INDEX_SIZE_ERR=1;X.DOMSTRING_SIZE_ERR=2;X.HIERARCHY_REQUEST_ERR=3;X.WRONG_DOCUMENT_ERR=4;X.INVALID_CHARACTER_ERR=5;X.NO_DATA_ALLOWED_ERR=6;X.NO_MODIFICATION_ALLOWED_ERR=7;X.NOT_FOUND_ERR=8;X.NOT_SUPPORTED_ERR=9;X.INUSE_ATTRIBUTE_ERR=10;X.INVALID_STATE_ERR=11;X.SYNTAX_ERR=12;X.INVALID_MODIFICATION_ERR=13;X.NAMESPACE_ERR=14;X.INVALID_ACCESS_ERR=15;X.VALIDATION_ERR=16;X.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=e;CanvasRenderingContext2D=D;CanvasGradient=U;CanvasPattern=T;DOMException=P;G_vmlCanvasManager._version=888})()};ntop-5.0.1+dfsg1/html/jqplot/jquery.jqplot.min.js0000644000000000000000000050335511762677020020442 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * * included jsDate library by Chris Leonello: * * Copyright (c) 2010-2011 Chris Leonello * * jsDate is currently available for use in all personal or commercial projects * under both the MIT and GPL version 2.0 licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * jsDate borrows many concepts and ideas from the Date Instance * Methods by Ken Snyder along with some parts of Ken's actual code. * * Ken's origianl Date Instance Methods and copyright notice: * * Ken Snyder (ken d snyder at gmail dot com) * 2008-09-10 * version 2.0.2 (http://kendsnyder.com/sandbox/date/) * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) * * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. * Larry has generously given permission to adapt his code for inclusion * into jqPlot. * * Larry's original code can be found here: * * https://github.com/lsiden/export-jqplot-to-png * * */ (function(H){var r;H.fn.emptyForce=function(){for(var ab=0,ac;(ac=H(this)[ab])!=null;ab++){if(ac.nodeType===1){jQuery.cleanData(ac.getElementsByTagName("*"))}if(H.jqplot_use_excanvas){ac.outerHTML=""}else{while(ac.firstChild){ac.removeChild(ac.firstChild)}}ac=null}return H(this)};H.fn.removeChildForce=function(ab){while(ab.firstChild){this.removeChildForce(ab.firstChild);ab.removeChild(ab.firstChild)}};H.jqplot=function(ah,ae,ac){var ad,ab;if(ac==null){if(jQuery.isArray(ae)){ad=ae;ab=null}else{if(typeof(ae)==="object"){ad=null;ab=ae}}}else{ad=ae;ab=ac}var ag=new N();H("#"+ah).removeClass("jqplot-error");if(H.jqplot.config.catchErrors){try{ag.init(ah,ad,ab);ag.draw();ag.themeEngine.init.call(ag);return ag}catch(af){var ai=H.jqplot.config.errorMessage||af.message;H("#"+ah).append('
      '+ai+"
      ");H("#"+ah).addClass("jqplot-error");document.getElementById(ah).style.background=H.jqplot.config.errorBackground;document.getElementById(ah).style.border=H.jqplot.config.errorBorder;document.getElementById(ah).style.fontFamily=H.jqplot.config.errorFontFamily;document.getElementById(ah).style.fontSize=H.jqplot.config.errorFontSize;document.getElementById(ah).style.fontStyle=H.jqplot.config.errorFontStyle;document.getElementById(ah).style.fontWeight=H.jqplot.config.errorFontWeight}}else{ag.init(ah,ad,ab);ag.draw();ag.themeEngine.init.call(ag);return ag}};H.jqplot.version="1.0.0b2_r1012";H.jqplot.CanvasManager=function(){if(typeof H.jqplot.CanvasManager.canvases=="undefined"){H.jqplot.CanvasManager.canvases=[];H.jqplot.CanvasManager.free=[]}var ab=[];this.getCanvas=function(){var ae;var ad=true;if(!H.jqplot.use_excanvas){for(var af=0,ac=H.jqplot.CanvasManager.canvases.length;af887){H.jqplot.support_canvas_text.result=true}else{H.jqplot.support_canvas_text.result=!!(document.createElement("canvas").getContext&&typeof document.createElement("canvas").getContext("2d").fillText=="function")}}return H.jqplot.support_canvas_text.result};H.jqplot.use_excanvas=(H.browser.msie&&!H.jqplot.support_canvas())?true:false;H.jqplot.preInitHooks=[];H.jqplot.postInitHooks=[];H.jqplot.preParseOptionsHooks=[];H.jqplot.postParseOptionsHooks=[];H.jqplot.preDrawHooks=[];H.jqplot.postDrawHooks=[];H.jqplot.preDrawSeriesHooks=[];H.jqplot.postDrawSeriesHooks=[];H.jqplot.preDrawLegendHooks=[];H.jqplot.addLegendRowHooks=[];H.jqplot.preSeriesInitHooks=[];H.jqplot.postSeriesInitHooks=[];H.jqplot.preParseSeriesOptionsHooks=[];H.jqplot.postParseSeriesOptionsHooks=[];H.jqplot.eventListenerHooks=[];H.jqplot.preDrawSeriesShadowHooks=[];H.jqplot.postDrawSeriesShadowHooks=[];H.jqplot.ElemContainer=function(){this._elem;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null}};H.jqplot.ElemContainer.prototype.createElement=function(ae,ag,ac,ad,ah){this._offsets=ag;var ab=ac||"jqplot";var af=document.createElement(ae);this._elem=H(af);this._elem.addClass(ab);this._elem.css(ad);this._elem.attr(ah);af=null;return this._elem};H.jqplot.ElemContainer.prototype.getWidth=function(){if(this._elem){return this._elem.outerWidth(true)}else{return null}};H.jqplot.ElemContainer.prototype.getHeight=function(){if(this._elem){return this._elem.outerHeight(true)}else{return null}};H.jqplot.ElemContainer.prototype.getPosition=function(){if(this._elem){return this._elem.position()}else{return{top:null,left:null,bottom:null,right:null}}};H.jqplot.ElemContainer.prototype.getTop=function(){return this.getPosition().top};H.jqplot.ElemContainer.prototype.getLeft=function(){return this.getPosition().left};H.jqplot.ElemContainer.prototype.getBottom=function(){return this._elem.css("bottom")};H.jqplot.ElemContainer.prototype.getRight=function(){return this._elem.css("right")};function s(ab){H.jqplot.ElemContainer.call(this);this.name=ab;this._series=[];this.show=false;this.tickRenderer=H.jqplot.AxisTickRenderer;this.tickOptions={};this.labelRenderer=H.jqplot.AxisLabelRenderer;this.labelOptions={};this.label=null;this.showLabel=true;this.min=null;this.max=null;this.autoscale=false;this.pad=1.2;this.padMax=null;this.padMin=null;this.ticks=[];this.numberTicks;this.tickInterval;this.renderer=H.jqplot.LinearAxisRenderer;this.rendererOptions={};this.showTicks=true;this.showTickMarks=true;this.showMinorTicks=true;this.drawMajorGridlines=true;this.drawMinorGridlines=false;this.drawMajorTickMarks=true;this.drawMinorTickMarks=true;this.useSeriesColor=false;this.borderWidth=null;this.borderColor=null;this._dataBounds={min:null,max:null};this._intervalStats=[];this._offsets={min:null,max:null};this._ticks=[];this._label=null;this.syncTicks=null;this.tickSpacing=75;this._min=null;this._max=null;this._tickInterval=null;this._numberTicks=null;this.__ticks=null;this._options={}}s.prototype=new H.jqplot.ElemContainer();s.prototype.constructor=s;s.prototype.init=function(){this.renderer=new this.renderer();this.tickOptions.axis=this.name;if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTicks}if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTickMarks}if(this.tickOptions.showLabel==null){this.tickOptions.showLabel=this.showTicks}if(this.label==null||this.label==""){this.showLabel=false}else{this.labelOptions.label=this.label}if(this.showLabel==false){this.labelOptions.show=false}if(this.pad==0){this.pad=1}if(this.padMax==0){this.padMax=1}if(this.padMin==0){this.padMin=1}if(this.padMax==null){this.padMax=(this.pad-1)/2+1}if(this.padMin==null){this.padMin=(this.pad-1)/2+1}this.pad=this.padMax+this.padMin-1;if(this.min!=null||this.max!=null){this.autoscale=false}if(this.syncTicks==null&&this.name.indexOf("y")>-1){this.syncTicks=true}else{if(this.syncTicks==null){this.syncTicks=false}}this.renderer.init.call(this,this.rendererOptions)};s.prototype.draw=function(ab,ac){if(this.__ticks){this.__ticks=null}return this.renderer.draw.call(this,ab,ac)};s.prototype.set=function(){this.renderer.set.call(this)};s.prototype.pack=function(ac,ab){if(this.show){this.renderer.pack.call(this,ac,ab)}if(this._min==null){this._min=this.min;this._max=this.max;this._tickInterval=this.tickInterval;this._numberTicks=this.numberTicks;this.__ticks=this._ticks}};s.prototype.reset=function(){this.renderer.reset.call(this)};s.prototype.resetScale=function(ab){H.extend(true,this,{min:null,max:null,numberTicks:null,tickInterval:null,_ticks:[],ticks:[]},ab);this.resetDataBounds()};s.prototype.resetDataBounds=function(){var ai=this._dataBounds;ai.min=null;ai.max=null;var ac,aj,ag;var ad=(this.show)?true:false;for(var af=0;afai.max)||ai.max==null){ai.max=ag[ae][0]}}else{if((ag[ae][ab]!=null&&ag[ae][ab]ai.max)||ai.max==null){ai.max=ag[ae][ah]}}}if(ad&&aj.renderer.constructor!==H.jqplot.BarRenderer){ad=false}else{if(ad&&this._options.hasOwnProperty("forceTickAt0")&&this._options.forceTickAt0==false){ad=false}else{if(ad&&aj.renderer.constructor===H.jqplot.BarRenderer){if(aj.barDirection=="vertical"&&this.name!="xaxis"&&this.name!="x2axis"){if(this._options.pad!=null||this._options.padMin!=null){ad=false}}else{if(aj.barDirection=="horizontal"&&(this.name=="xaxis"||this.name=="x2axis")){if(this._options.pad!=null||this._options.padMin!=null){ad=false}}}}}}}}if(ad&&this.renderer.constructor===H.jqplot.LinearAxisRenderer&&ai.min>=0){this.padMin=1;this.forceTickAt0=true}};function n(ab){H.jqplot.ElemContainer.call(this);this.show=false;this.location="ne";this.labels=[];this.showLabels=true;this.showSwatches=true;this.placement="insideGrid";this.xoffset=0;this.yoffset=0;this.border;this.background;this.textColor;this.fontFamily;this.fontSize;this.rowSpacing="0.5em";this.renderer=H.jqplot.TableLegendRenderer;this.rendererOptions={};this.preDraw=false;this.marginTop=null;this.marginRight=null;this.marginBottom=null;this.marginLeft=null;this.escapeHtml=false;this._series=[];H.extend(true,this,ab)}n.prototype=new H.jqplot.ElemContainer();n.prototype.constructor=n;n.prototype.setOptions=function(ab){H.extend(true,this,ab);if(this.placement=="inside"){this.placement="insideGrid"}if(this.xoffset>0){if(this.placement=="insideGrid"){switch(this.location){case"nw":case"w":case"sw":if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break;case"ne":case"e":case"se":default:if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break}}else{if(this.placement=="outside"){switch(this.location){case"nw":case"w":case"sw":if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break;case"ne":case"e":case"se":default:if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break}}}this.xoffset=0}if(this.yoffset>0){if(this.placement=="outside"){switch(this.location){case"sw":case"s":case"se":if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break;case"ne":case"n":case"nw":default:if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break}}else{if(this.placement=="insideGrid"){switch(this.location){case"sw":case"s":case"se":if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break;case"ne":case"n":case"nw":default:if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break}}}this.yoffset=0}};n.prototype.init=function(){this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions)};n.prototype.draw=function(ac){for(var ab=0;ab');this.target.append(aq);aq.height(av);aq.width(ar);aq.css("top",this.eventCanvas._offsets.top);aq.css("left",this.eventCanvas._offsets.left);var au=H('
      ');aq.append(au);au.html(this.noDataIndicator.indicator);var at=au.height();var ap=au.width();au.height(at);au.width(ap);au.css("top",(av-at)/2+"px")})}}this.data=aj;this.parseOptions(ao);if(this.textColor){this.target.css("color",this.textColor)}if(this.fontFamily){this.target.css("font-family",this.fontFamily)}if(this.fontSize){this.target.css("font-size",this.fontSize)}this.title.init();this.legend.init();this._sumy=0;this._sumx=0;for(var ak=0;ak0){aj._prevPlotData=this.series[ak-1]._plotData}aj._sumy=0;aj._sumx=0;for(ai=aj.data.length-1;ai>-1;ai--){aj._sumy+=aj.data[ai][1];aj._sumx+=aj.data[ai][0]}};this.getNextSeriesColor=(function(ag){var af=0;var ah=ag.seriesColors;return function(){if(af=0&&ah>=0){af.top+=aE;af.bottom+=aE;af.left+=ah;af.right+=ah}}var ag=["top","bottom","left","right"];for(var au in ag){if(this._gridPadding[ag[au]]==null&&af[ag[au]]>0){this._gridPadding[ag[au]]=af[ag[au]]}else{if(this._gridPadding[ag[au]]==null){this._gridPadding[ag[au]]=this._defaultGridPadding[ag[au]]}}}var at=(this.legend.placement=="outsideGrid")?{top:this.title.getHeight(),left:0,right:0,bottom:0}:this._gridPadding;al.xaxis.pack({position:"absolute",bottom:this._gridPadding.bottom-al.xaxis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});al.yaxis.pack({position:"absolute",top:0,left:this._gridPadding.left-al.yaxis.getWidth(),height:this._height},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});al.x2axis.pack({position:"absolute",top:this._gridPadding.top-al.x2axis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});for(aB=8;aB>0;aB--){al[aA[aB-1]].pack({position:"absolute",top:0,right:this._gridPadding.right-ar[aB-1]},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top})}var an=(this._width-this._gridPadding.left-this._gridPadding.right)/2+this._gridPadding.left-al.yMidAxis.getWidth()/2;al.yMidAxis.pack({position:"absolute",top:0,left:an,zIndex:9,textAlign:"center"},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});this.target.append(this.grid.createElement(this._gridPadding,this));this.grid.draw();var ak=this.series;var aD=ak.length;for(aB=0,ay=aD;aBaq)?ao:aq;var al=this.series[ap];var ak=this.series[an];if(ak.renderer.smooth){var aj=ak.renderer._smoothedData.slice(0).reverse()}else{var aj=ak.gridData.slice(0).reverse()}if(al.renderer.smooth){var am=al.renderer._smoothedData.concat(aj)}else{var am=al.gridData.concat(aj)}var ai=(ah.color!==null)?ah.color:this.series[aq].fillColor;var ar=(ah.baseSeries!==null)?ah.baseSeries:ap;var ag=this.series[ar].renderer.shapeRenderer;var af={fillStyle:ai,fill:true,closePath:true};ag.draw(al.shadowCanvas._ctx,am,af)};this.bindCustomEvents=function(){this.eventCanvas._elem.bind("click",{plot:this},this.onClick);this.eventCanvas._elem.bind("dblclick",{plot:this},this.onDblClick);this.eventCanvas._elem.bind("mousedown",{plot:this},this.onMouseDown);this.eventCanvas._elem.bind("mousemove",{plot:this},this.onMouseMove);this.eventCanvas._elem.bind("mouseenter",{plot:this},this.onMouseEnter);this.eventCanvas._elem.bind("mouseleave",{plot:this},this.onMouseLeave);if(this.captureRightClick){this.eventCanvas._elem.bind("mouseup",{plot:this},this.onRightClick);this.eventCanvas._elem.get(0).oncontextmenu=function(){return false}}else{this.eventCanvas._elem.bind("mouseup",{plot:this},this.onMouseUp)}};function ac(ao){var am=ao.data.plot;var ai=am.eventCanvas._elem.offset();var al={x:ao.pageX-ai.left,y:ao.pageY-ai.top};var aj={xaxis:null,yaxis:null,x2axis:null,y2axis:null,y3axis:null,y4axis:null,y5axis:null,y6axis:null,y7axis:null,y8axis:null,y9axis:null,yMidAxis:null};var ak=["xaxis","yaxis","x2axis","y2axis","y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis","yMidAxis"];var af=am.axes;var ag,ah;for(ag=11;ag>0;ag--){ah=ak[ag-1];if(af[ah].show){aj[ah]=af[ah].series_p2u(al[ah.charAt(0)])}}return{offsets:ai,gridPos:al,dataPos:aj}}function ae(af,ag){var ak=ag.series;var aP,aO,aN,aI,aJ,aD,aC,ap,an,at,au,aE;var aM,aQ,aK,al,aB,aG;var ah,aH;for(aN=ag.seriesStack.length-1;aN>=0;aN--){aP=ag.seriesStack[aN];aI=ak[aP];switch(aI.renderer.constructor){case H.jqplot.BarRenderer:case H.jqplot.PyramidRenderer:aD=af.x;aC=af.y;for(aO=0;aOaB[0][0]&&aDaB[2][1]&&aC0&&-aC>=0){ap=2*Math.PI-Math.atan(-aC/aD)}else{if(aD>0&&-aC<0){ap=-Math.atan(-aC/aD)}else{if(aD<0){ap=Math.PI-Math.atan(-aC/aD)}else{if(aD==0&&-aC>0){ap=3*Math.PI/2}else{if(aD==0&&-aC<0){ap=Math.PI/2}else{if(aD==0&&aC==0){ap=0}}}}}}if(at){ap-=at;if(ap<0){ap+=2*Math.PI}else{if(ap>2*Math.PI){ap-=2*Math.PI}}}an=aI.sliceMargin/180*Math.PI;if(aJaI._innerRadius){for(aO=0;aO0)?aI.gridData[aO-1][1]+an:an;aE=aI.gridData[aO][1];if(ap>au&&ap0&&-aC>=0){ap=2*Math.PI-Math.atan(-aC/aD)}else{if(aD>0&&-aC<0){ap=-Math.atan(-aC/aD)}else{if(aD<0){ap=Math.PI-Math.atan(-aC/aD)}else{if(aD==0&&-aC>0){ap=3*Math.PI/2}else{if(aD==0&&-aC<0){ap=Math.PI/2}else{if(aD==0&&aC==0){ap=0}}}}}}if(at){ap-=at;if(ap<0){ap+=2*Math.PI}else{if(ap>2*Math.PI){ap-=2*Math.PI}}}an=aI.sliceMargin/180*Math.PI;if(aJ0)?aI.gridData[aO-1][1]+an:an;aE=aI.gridData[aO][1];if(ap>au&&ap=ar[0][1]&&aC<=ar[3][1]&&aD>=am[0]&&aD<=ay[0]){return{seriesIndex:aI.index,pointIndex:aO,gridData:null,data:aI.data[aO]}}}break;case H.jqplot.LineRenderer:aD=af.x;aC=af.y;aJ=aI.renderer;if(aI.show){if((aI.fill||(aI.renderer.bands.show&&aI.renderer.bands.fill))&&(!ag.plugins.highlighter||!ag.plugins.highlighter.show)){var aq=false;if(aD>aI._boundingBox[0][0]&&aDaI._boundingBox[1][1]&&aC=aC||av[1]=aC){if(aw[0]+(aC-aw[1])/(av[1]-aw[1])*(av[0]-aw[0])0)?aH:0;for(var aO=0;aO=aK[0]-aJ._bodyWidth/2&&aD<=aK[0]+aJ._bodyWidth/2&&aC>=ao(aI.data[aO][2])&&aC<=ao(aI.data[aO][3])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}else{if(!aJ.hlc){var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._tickLength&&aD<=aK[0]+aJ._tickLength&&aC>=ao(aI.data[aO][2])&&aC<=ao(aI.data[aO][3])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}else{var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._tickLength&&aD<=aK[0]+aJ._tickLength&&aC>=ao(aI.data[aO][1])&&aC<=ao(aI.data[aO][2])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}}}else{if(aK[0]!=null&&aK[1]!=null){aQ=Math.sqrt((aD-aK[0])*(aD-aK[0])+(aC-aK[1])*(aC-aK[1]));if(aQ<=ah&&(aQ<=aM||aM==null)){aM=aQ;return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}}}}}break;default:aD=af.x;aC=af.y;aJ=aI.renderer;if(aI.show){aH=aI.markerRenderer.size/2+aI.neighborThreshold;ah=(aH>0)?aH:0;for(var aO=0;aO=aK[0]-aJ._bodyWidth/2&&aD<=aK[0]+aJ._bodyWidth/2&&aC>=ao(aI.data[aO][2])&&aC<=ao(aI.data[aO][3])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}else{if(!aJ.hlc){var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._tickLength&&aD<=aK[0]+aJ._tickLength&&aC>=ao(aI.data[aO][2])&&aC<=ao(aI.data[aO][3])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}else{var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._tickLength&&aD<=aK[0]+aJ._tickLength&&aC>=ao(aI.data[aO][1])&&aC<=ao(aI.data[aO][2])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}}}else{aQ=Math.sqrt((aD-aK[0])*(aD-aK[0])+(aC-aK[1])*(aC-aK[1]));if(aQ<=ah&&(aQ<=aM||aM==null)){aM=aQ;return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}}}break}}return null}this.onClick=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);var af=jQuery.Event("jqplotClick");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])};this.onDblClick=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);var af=jQuery.Event("jqplotDblClick");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])};this.onMouseDown=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);var af=jQuery.Event("jqplotMouseDown");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])};this.onMouseUp=function(ah){var ag=ac(ah);var af=jQuery.Event("jqplotMouseUp");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,null,ah.data.plot])};this.onRightClick=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);if(aj.captureRightClick){if(ah.which==3){var af=jQuery.Event("jqplotRightClick");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])}else{var af=jQuery.Event("jqplotMouseUp");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])}}};this.onMouseMove=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);var af=jQuery.Event("jqplotMouseMove");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])};this.onMouseEnter=function(ah){var ag=ac(ah);var ai=ah.data.plot;var af=jQuery.Event("jqplotMouseEnter");af.pageX=ah.pageX;af.pageY=ah.pageY;af.relatedTarget=ah.relatedTarget;H(this).trigger(af,[ag.gridPos,ag.dataPos,null,ai])};this.onMouseLeave=function(ah){var ag=ac(ah);var ai=ah.data.plot;var af=jQuery.Event("jqplotMouseLeave");af.pageX=ah.pageX;af.pageY=ah.pageY;af.relatedTarget=ah.relatedTarget;H(this).trigger(af,[ag.gridPos,ag.dataPos,null,ai])};this.drawSeries=function(ah,af){var aj,ai,ag;af=(typeof(ah)==="number"&&af==null)?ah:af;ah=(typeof(ah)==="object")?ah:{};if(af!=r){ai=this.series[af];ag=ai.shadowCanvas._ctx;ag.clearRect(0,0,ag.canvas.width,ag.canvas.height);ai.drawShadow(ag,ah,this);ag=ai.canvas._ctx;ag.clearRect(0,0,ag.canvas.width,ag.canvas.height);ai.draw(ag,ah,this);if(ai.renderer.constructor==H.jqplot.BezierCurveRenderer){if(af660)?ab[ad]*0.85:0.73*ab[ad]+90;ab[ad]=parseInt(ab[ad],10);(ab[ad]>255)?255:ab[ad]}ab[3]=0.3+0.35*af[3];ae.push("rgba("+ab[0]+","+ab[1]+","+ab[2]+","+ab[3]+")")}}else{var af=H.jqplot.getColorComponents(ac);var ab=[af[0],af[1],af[2]];var ah=ab[0]+ab[1]+ab[2];for(var ad=0;ad<3;ad++){ab[ad]=(ah>660)?ab[ad]*0.85:0.73*ab[ad]+90;ab[ad]=parseInt(ab[ad],10);(ab[ad]>255)?255:ab[ad]}ab[3]=0.3+0.35*af[3];ae="rgba("+ab[0]+","+ab[1]+","+ab[2]+","+ab[3]+")"}return ae};H.jqplot.ColorGenerator=function(ac){ac=ac||H.jqplot.config.defaultColors;var ab=0;this.next=function(){if(ab0){return ac[ab--]}else{ab=ac.length-1;return ac[ab]}};this.get=function(ae){var ad=ae-ac.length*Math.floor(ae/ac.length);return ac[ad]};this.setColors=function(ad){ac=ad};this.reset=function(){ab=0};this.getIndex=function(){return ab};this.setIndex=function(ad){ab=ad}};H.jqplot.hex2rgb=function(ad,ab){ad=ad.replace("#","");if(ad.length==3){ad=ad.charAt(0)+ad.charAt(0)+ad.charAt(1)+ad.charAt(1)+ad.charAt(2)+ad.charAt(2)}var ac;ac="rgba("+parseInt(ad.slice(0,2),16)+", "+parseInt(ad.slice(2,4),16)+", "+parseInt(ad.slice(4,6),16);if(ab){ac+=", "+ab}ac+=")";return ac};H.jqplot.rgb2hex=function(ag){var ad=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *(?:, *[0-9.]*)?\)/;var ab=ag.match(ad);var af="#";for(var ae=1;ae<4;ae++){var ac;if(ab[ae].search(/%/)!=-1){ac=parseInt(255*ab[ae]/100,10).toString(16);if(ac.length==1){ac="0"+ac}}else{ac=parseInt(ab[ae],10).toString(16);if(ac.length==1){ac="0"+ac}}af+=ac}return af};H.jqplot.normalize2rgb=function(ac,ab){if(ac.search(/^ *rgba?\(/)!=-1){return ac}else{if(ac.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/)!=-1){return H.jqplot.hex2rgb(ac,ab)}else{throw"invalid color spec"}}};H.jqplot.getColorComponents=function(ag){ag=H.jqplot.colorKeywordMap[ag]||ag;var ae=H.jqplot.normalize2rgb(ag);var ad=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *,? *([0-9.]* *)?\)/;var ab=ae.match(ad);var ac=[];for(var af=1;af<4;af++){if(ab[af].search(/%/)!=-1){ac[af-1]=parseInt(255*ab[af]/100,10)}else{ac[af-1]=parseInt(ab[af],10)}}ac[3]=parseFloat(ab[4])?parseFloat(ab[4]):1;return ac};H.jqplot.colorKeywordMap={aliceblue:"rgb(240, 248, 255)",antiquewhite:"rgb(250, 235, 215)",aqua:"rgb( 0, 255, 255)",aquamarine:"rgb(127, 255, 212)",azure:"rgb(240, 255, 255)",beige:"rgb(245, 245, 220)",bisque:"rgb(255, 228, 196)",black:"rgb( 0, 0, 0)",blanchedalmond:"rgb(255, 235, 205)",blue:"rgb( 0, 0, 255)",blueviolet:"rgb(138, 43, 226)",brown:"rgb(165, 42, 42)",burlywood:"rgb(222, 184, 135)",cadetblue:"rgb( 95, 158, 160)",chartreuse:"rgb(127, 255, 0)",chocolate:"rgb(210, 105, 30)",coral:"rgb(255, 127, 80)",cornflowerblue:"rgb(100, 149, 237)",cornsilk:"rgb(255, 248, 220)",crimson:"rgb(220, 20, 60)",cyan:"rgb( 0, 255, 255)",darkblue:"rgb( 0, 0, 139)",darkcyan:"rgb( 0, 139, 139)",darkgoldenrod:"rgb(184, 134, 11)",darkgray:"rgb(169, 169, 169)",darkgreen:"rgb( 0, 100, 0)",darkgrey:"rgb(169, 169, 169)",darkkhaki:"rgb(189, 183, 107)",darkmagenta:"rgb(139, 0, 139)",darkolivegreen:"rgb( 85, 107, 47)",darkorange:"rgb(255, 140, 0)",darkorchid:"rgb(153, 50, 204)",darkred:"rgb(139, 0, 0)",darksalmon:"rgb(233, 150, 122)",darkseagreen:"rgb(143, 188, 143)",darkslateblue:"rgb( 72, 61, 139)",darkslategray:"rgb( 47, 79, 79)",darkslategrey:"rgb( 47, 79, 79)",darkturquoise:"rgb( 0, 206, 209)",darkviolet:"rgb(148, 0, 211)",deeppink:"rgb(255, 20, 147)",deepskyblue:"rgb( 0, 191, 255)",dimgray:"rgb(105, 105, 105)",dimgrey:"rgb(105, 105, 105)",dodgerblue:"rgb( 30, 144, 255)",firebrick:"rgb(178, 34, 34)",floralwhite:"rgb(255, 250, 240)",forestgreen:"rgb( 34, 139, 34)",fuchsia:"rgb(255, 0, 255)",gainsboro:"rgb(220, 220, 220)",ghostwhite:"rgb(248, 248, 255)",gold:"rgb(255, 215, 0)",goldenrod:"rgb(218, 165, 32)",gray:"rgb(128, 128, 128)",grey:"rgb(128, 128, 128)",green:"rgb( 0, 128, 0)",greenyellow:"rgb(173, 255, 47)",honeydew:"rgb(240, 255, 240)",hotpink:"rgb(255, 105, 180)",indianred:"rgb(205, 92, 92)",indigo:"rgb( 75, 0, 130)",ivory:"rgb(255, 255, 240)",khaki:"rgb(240, 230, 140)",lavender:"rgb(230, 230, 250)",lavenderblush:"rgb(255, 240, 245)",lawngreen:"rgb(124, 252, 0)",lemonchiffon:"rgb(255, 250, 205)",lightblue:"rgb(173, 216, 230)",lightcoral:"rgb(240, 128, 128)",lightcyan:"rgb(224, 255, 255)",lightgoldenrodyellow:"rgb(250, 250, 210)",lightgray:"rgb(211, 211, 211)",lightgreen:"rgb(144, 238, 144)",lightgrey:"rgb(211, 211, 211)",lightpink:"rgb(255, 182, 193)",lightsalmon:"rgb(255, 160, 122)",lightseagreen:"rgb( 32, 178, 170)",lightskyblue:"rgb(135, 206, 250)",lightslategray:"rgb(119, 136, 153)",lightslategrey:"rgb(119, 136, 153)",lightsteelblue:"rgb(176, 196, 222)",lightyellow:"rgb(255, 255, 224)",lime:"rgb( 0, 255, 0)",limegreen:"rgb( 50, 205, 50)",linen:"rgb(250, 240, 230)",magenta:"rgb(255, 0, 255)",maroon:"rgb(128, 0, 0)",mediumaquamarine:"rgb(102, 205, 170)",mediumblue:"rgb( 0, 0, 205)",mediumorchid:"rgb(186, 85, 211)",mediumpurple:"rgb(147, 112, 219)",mediumseagreen:"rgb( 60, 179, 113)",mediumslateblue:"rgb(123, 104, 238)",mediumspringgreen:"rgb( 0, 250, 154)",mediumturquoise:"rgb( 72, 209, 204)",mediumvioletred:"rgb(199, 21, 133)",midnightblue:"rgb( 25, 25, 112)",mintcream:"rgb(245, 255, 250)",mistyrose:"rgb(255, 228, 225)",moccasin:"rgb(255, 228, 181)",navajowhite:"rgb(255, 222, 173)",navy:"rgb( 0, 0, 128)",oldlace:"rgb(253, 245, 230)",olive:"rgb(128, 128, 0)",olivedrab:"rgb(107, 142, 35)",orange:"rgb(255, 165, 0)",orangered:"rgb(255, 69, 0)",orchid:"rgb(218, 112, 214)",palegoldenrod:"rgb(238, 232, 170)",palegreen:"rgb(152, 251, 152)",paleturquoise:"rgb(175, 238, 238)",palevioletred:"rgb(219, 112, 147)",papayawhip:"rgb(255, 239, 213)",peachpuff:"rgb(255, 218, 185)",peru:"rgb(205, 133, 63)",pink:"rgb(255, 192, 203)",plum:"rgb(221, 160, 221)",powderblue:"rgb(176, 224, 230)",purple:"rgb(128, 0, 128)",red:"rgb(255, 0, 0)",rosybrown:"rgb(188, 143, 143)",royalblue:"rgb( 65, 105, 225)",saddlebrown:"rgb(139, 69, 19)",salmon:"rgb(250, 128, 114)",sandybrown:"rgb(244, 164, 96)",seagreen:"rgb( 46, 139, 87)",seashell:"rgb(255, 245, 238)",sienna:"rgb(160, 82, 45)",silver:"rgb(192, 192, 192)",skyblue:"rgb(135, 206, 235)",slateblue:"rgb(106, 90, 205)",slategray:"rgb(112, 128, 144)",slategrey:"rgb(112, 128, 144)",snow:"rgb(255, 250, 250)",springgreen:"rgb( 0, 255, 127)",steelblue:"rgb( 70, 130, 180)",tan:"rgb(210, 180, 140)",teal:"rgb( 0, 128, 128)",thistle:"rgb(216, 191, 216)",tomato:"rgb(255, 99, 71)",turquoise:"rgb( 64, 224, 208)",violet:"rgb(238, 130, 238)",wheat:"rgb(245, 222, 179)",white:"rgb(255, 255, 255)",whitesmoke:"rgb(245, 245, 245)",yellow:"rgb(255, 255, 0)",yellowgreen:"rgb(154, 205, 50)"};H.jqplot.AxisLabelRenderer=function(ab){H.jqplot.ElemContainer.call(this);this.axis;this.show=true;this.label="";this.fontFamily=null;this.fontSize=null;this.textColor=null;this._elem;this.escapeHTML=false;H.extend(true,this,ab)};H.jqplot.AxisLabelRenderer.prototype=new H.jqplot.ElemContainer();H.jqplot.AxisLabelRenderer.prototype.constructor=H.jqplot.AxisLabelRenderer;H.jqplot.AxisLabelRenderer.prototype.init=function(ab){H.extend(true,this,ab)};H.jqplot.AxisLabelRenderer.prototype.draw=function(ab,ac){if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=H('
      ');if(Number(this.label)){this._elem.css("white-space","nowrap")}if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}return this._elem};H.jqplot.AxisLabelRenderer.prototype.pack=function(){};H.jqplot.AxisTickRenderer=function(ab){H.jqplot.ElemContainer.call(this);this.mark="outside";this.axis;this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.size=4;this.markSize=6;this.show=true;this.showLabel=true;this.label=null;this.value=null;this._styles={};this.formatter=H.jqplot.DefaultTickFormatter;this.prefix="";this.formatString="";this.fontFamily;this.fontSize;this.textColor;this.escapeHTML=false;this._elem;this._breakTick=false;H.extend(true,this,ab)};H.jqplot.AxisTickRenderer.prototype.init=function(ab){H.extend(true,this,ab)};H.jqplot.AxisTickRenderer.prototype=new H.jqplot.ElemContainer();H.jqplot.AxisTickRenderer.prototype.constructor=H.jqplot.AxisTickRenderer;H.jqplot.AxisTickRenderer.prototype.setTick=function(ab,ad,ac){this.value=ab;this.axis=ad;if(ac){this.isMinorTick=true}return this};H.jqplot.AxisTickRenderer.prototype.draw=function(){if(this.label===null){this.label=this.prefix+this.formatter(this.formatString,this.value)}var ac={position:"absolute"};if(Number(this.label)){ac.whitSpace="nowrap"}if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=H(document.createElement("div"));this._elem.addClass("jqplot-"+this.axis+"-tick");if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}this._elem.css(ac);for(var ab in this._styles){this._elem.css(ab,this._styles[ab])}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}if(this._breakTick){this._elem.addClass("jqplot-breakTick")}return this._elem};H.jqplot.DefaultTickFormatter=function(ab,ac){if(typeof ac=="number"){if(!ab){ab=H.jqplot.config.defaultTickFormatString}return H.jqplot.sprintf(ab,ac)}else{return String(ac)}};H.jqplot.AxisTickRenderer.prototype.pack=function(){};H.jqplot.CanvasGridRenderer=function(){this.shadowRenderer=new H.jqplot.ShadowRenderer()};H.jqplot.CanvasGridRenderer.prototype.init=function(ac){this._ctx;H.extend(true,this,ac);var ab={lineJoin:"miter",lineCap:"round",fill:false,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.shadowWidth,closePath:false,strokeStyle:this.shadowColor};this.renderer.shadowRenderer.init(ab)};H.jqplot.CanvasGridRenderer.prototype.createElement=function(ae){var ad;if(this._elem){if(H.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==r){ad=this._elem.get(0);window.G_vmlCanvasManager.uninitElement(ad);ad=null}this._elem.emptyForce();this._elem=null}ad=ae.canvasManager.getCanvas();var ab=this._plotDimensions.width;var ac=this._plotDimensions.height;ad.width=ab;ad.height=ac;this._elem=H(ad);this._elem.addClass("jqplot-grid-canvas");this._elem.css({position:"absolute",left:0,top:0});ad=ae.canvasManager.initCanvas(ad);this._top=this._offsets.top;this._bottom=ac-this._offsets.bottom;this._left=this._offsets.left;this._right=ab-this._offsets.right;this._width=this._right-this._left;this._height=this._bottom-this._top;ad=null;return this._elem};H.jqplot.CanvasGridRenderer.prototype.draw=function(){this._ctx=this._elem.get(0).getContext("2d");var am=this._ctx;var ap=this._axes;am.save();am.clearRect(0,0,this._plotDimensions.width,this._plotDimensions.height);am.fillStyle=this.backgroundColor||this.background;am.fillRect(this._left,this._top,this._width,this._height);am.save();am.lineJoin="miter";am.lineCap="butt";am.lineWidth=this.gridLineWidth;am.strokeStyle=this.gridLineColor;var at,ar,aj,ak;var ag=["xaxis","yaxis","x2axis","y2axis"];for(var aq=4;aq>0;aq--){var aw=ag[aq-1];var ab=ap[aw];var au=ab._ticks;var al=au.length;if(ab.show){if(ab.drawBaseline){var av={};if(ab.baselineWidth!==null){av.lineWidth=ab.baselineWidth}if(ab.baselineColor!==null){av.strokeStyle=ab.baselineColor}switch(aw){case"xaxis":ai(this._left,this._bottom,this._right,this._bottom,av);break;case"yaxis":ai(this._left,this._bottom,this._left,this._top,av);break;case"x2axis":ai(this._left,this._bottom,this._right,this._bottom,av);break;case"y2axis":ai(this._right,this._bottom,this._right,this._top,av);break}}for(var an=al;an>0;an--){var ah=au[an-1];if(ah.show){var ae=Math.round(ab.u2p(ah.value))+0.5;switch(aw){case"xaxis":if(ah.showGridline&&this.drawGridlines&&((!ah.isMinorTick&&ab.drawMajorGridlines)||(ah.isMinorTick&&ab.drawMinorGridlines))){ai(ae,this._top,ae,this._bottom)}if(ah.showMark&&ah.mark&&((!ah.isMinorTick&&ab.drawMajorTickMarks)||(ah.isMinorTick&&ab.drawMinorTickMarks))){aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;switch(ak){case"outside":at=this._bottom;ar=this._bottom+aj;break;case"inside":at=this._bottom-aj;ar=this._bottom;break;case"cross":at=this._bottom-aj;ar=this._bottom+aj;break;default:at=this._bottom;ar=this._bottom+aj;break}if(this.shadow){this.renderer.shadowRenderer.draw(am,[[ae,at],[ae,ar]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}ai(ae,at,ae,ar)}break;case"yaxis":if(ah.showGridline&&this.drawGridlines&&((!ah.isMinorTick&&ab.drawMajorGridlines)||(ah.isMinorTick&&ab.drawMinorGridlines))){ai(this._right,ae,this._left,ae)}if(ah.showMark&&ah.mark&&((!ah.isMinorTick&&ab.drawMajorTickMarks)||(ah.isMinorTick&&ab.drawMinorTickMarks))){aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;switch(ak){case"outside":at=this._left-aj;ar=this._left;break;case"inside":at=this._left;ar=this._left+aj;break;case"cross":at=this._left-aj;ar=this._left+aj;break;default:at=this._left-aj;ar=this._left;break}if(this.shadow){this.renderer.shadowRenderer.draw(am,[[at,ae],[ar,ae]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ai(at,ae,ar,ae,{strokeStyle:ab.borderColor})}break;case"x2axis":if(ah.showGridline&&this.drawGridlines&&((!ah.isMinorTick&&ab.drawMajorGridlines)||(ah.isMinorTick&&ab.drawMinorGridlines))){ai(ae,this._bottom,ae,this._top)}if(ah.showMark&&ah.mark&&((!ah.isMinorTick&&ab.drawMajorTickMarks)||(ah.isMinorTick&&ab.drawMinorTickMarks))){aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;switch(ak){case"outside":at=this._top-aj;ar=this._top;break;case"inside":at=this._top;ar=this._top+aj;break;case"cross":at=this._top-aj;ar=this._top+aj;break;default:at=this._top-aj;ar=this._top;break}if(this.shadow){this.renderer.shadowRenderer.draw(am,[[ae,at],[ae,ar]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}ai(ae,at,ae,ar)}break;case"y2axis":if(ah.showGridline&&this.drawGridlines&&((!ah.isMinorTick&&ab.drawMajorGridlines)||(ah.isMinorTick&&ab.drawMinorGridlines))){ai(this._left,ae,this._right,ae)}if(ah.showMark&&ah.mark&&((!ah.isMinorTick&&ab.drawMajorTickMarks)||(ah.isMinorTick&&ab.drawMinorTickMarks))){aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;switch(ak){case"outside":at=this._right;ar=this._right+aj;break;case"inside":at=this._right-aj;ar=this._right;break;case"cross":at=this._right-aj;ar=this._right+aj;break;default:at=this._right;ar=this._right+aj;break}if(this.shadow){this.renderer.shadowRenderer.draw(am,[[at,ae],[ar,ae]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ai(at,ae,ar,ae,{strokeStyle:ab.borderColor})}break;default:break}}}ah=null}ab=null;au=null}ag=["y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis","yMidAxis"];for(var aq=7;aq>0;aq--){var ab=ap[ag[aq-1]];var au=ab._ticks;if(ab.show){var ac=au[ab.numberTicks-1];var af=au[0];var ad=ab.getLeft();var ao=[[ad,ac.getTop()+ac.getHeight()/2],[ad,af.getTop()+af.getHeight()/2+1]];if(this.shadow){this.renderer.shadowRenderer.draw(am,ao,{lineCap:"butt",fill:false,closePath:false})}ai(ao[0][0],ao[0][1],ao[1][0],ao[1][1],{lineCap:"butt",strokeStyle:ab.borderColor,lineWidth:ab.borderWidth});for(var an=au.length;an>0;an--){var ah=au[an-1];aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;if(ah.showMark&&ah.mark){switch(ak){case"outside":at=ad;ar=ad+aj;break;case"inside":at=ad-aj;ar=ad;break;case"cross":at=ad-aj;ar=ad+aj;break;default:at=ad;ar=ad+aj;break}ao=[[at,ae],[ar,ae]];if(this.shadow){this.renderer.shadowRenderer.draw(am,ao,{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ai(at,ae,ar,ae,{strokeStyle:ab.borderColor})}ah=null}af=null}ab=null;au=null}am.restore();function ai(aB,aA,ay,ax,az){am.save();az=az||{};if(az.lineWidth==null||az.lineWidth!=0){H.extend(true,am,az);am.beginPath();am.moveTo(aB,aA);am.lineTo(ay,ax);am.stroke();am.restore()}}if(this.shadow){var ao=[[this._left,this._bottom],[this._right,this._bottom],[this._right,this._top]];this.renderer.shadowRenderer.draw(am,ao)}if(this.borderWidth!=0&&this.drawBorder){ai(this._left,this._top,this._right,this._top,{lineCap:"round",strokeStyle:ap.x2axis.borderColor,lineWidth:ap.x2axis.borderWidth});ai(this._right,this._top,this._right,this._bottom,{lineCap:"round",strokeStyle:ap.y2axis.borderColor,lineWidth:ap.y2axis.borderWidth});ai(this._right,this._bottom,this._left,this._bottom,{lineCap:"round",strokeStyle:ap.xaxis.borderColor,lineWidth:ap.xaxis.borderWidth});ai(this._left,this._bottom,this._left,this._top,{lineCap:"round",strokeStyle:ap.yaxis.borderColor,lineWidth:ap.yaxis.borderWidth})}am.restore();am=null;ap=null};H.jqplot.DivTitleRenderer=function(){};H.jqplot.DivTitleRenderer.prototype.init=function(ab){H.extend(true,this,ab)};H.jqplot.DivTitleRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}var ae=this.renderer;var ad=document.createElement("div");this._elem=H(ad);this._elem.addClass("jqplot-title");if(!this.text){this.show=false;this._elem.height(0);this._elem.width(0)}else{if(this.text){var ab;if(this.color){ab=this.color}else{if(this.textColor){ab=this.textColor}}var ac={position:"absolute",top:"0px",left:"0px"};if(this._plotWidth){ac.width=this._plotWidth+"px"}if(this.fontSize){ac.fontSize=this.fontSize}if(typeof this.textAlign==="string"){ac.textAlign=this.textAlign}else{ac.textAlign="center"}if(ab){ac.color=ab}if(this.paddingBottom){ac.paddingBottom=this.paddingBottom}if(this.fontFamily){ac.fontFamily=this.fontFamily}this._elem.css(ac);if(this.escapeHtml){this._elem.text(this.text)}else{this._elem.html(this.text)}}}ad=null;return this._elem};H.jqplot.DivTitleRenderer.prototype.pack=function(){};var o=0.1;H.jqplot.LinePattern=function(ap,ak){var aj={dotted:[o,H.jqplot.config.dotGapLength],dashed:[H.jqplot.config.dashLength,H.jqplot.config.gapLength],solid:null};if(typeof ak==="string"){if(ak[0]==="."||ak[0]==="-"){var aq=ak;ak=[];for(var ai=0,af=aq.length;ai0)&&(aw>0)){au/=av;at/=av;while(true){var ax=aw*al;if(ax=ak.length){ae=0}al=ak[ae]}else{an=ar;am=ay;if((ae&1)==0){ap.lineTo(an,am)}else{ap.moveTo(an,am)}al-=av/aw;break}}}};var ac=function(){ap.beginPath()};var ag=function(){ad(ah,ab)};return{moveTo:ao,lineTo:ad,beginPath:ac,closePath:ag}};H.jqplot.LineRenderer=function(){this.shapeRenderer=new H.jqplot.ShapeRenderer();this.shadowRenderer=new H.jqplot.ShadowRenderer()};H.jqplot.LineRenderer.prototype.init=function(ac,ah){ac=ac||{};this._type="line";this.renderer.animation={show:false,direction:"left",speed:2500,_supported:true};this.renderer.smooth=false;this.renderer.tension=null;this.renderer.constrainSmoothing=true;this.renderer._smoothedData=[];this.renderer._smoothedPlotData=[];this.renderer._hiBandGridData=[];this.renderer._lowBandGridData=[];this.renderer._hiBandSmoothedData=[];this.renderer._lowBandSmoothedData=[];this.renderer.bandData=[];this.renderer.bands={show:false,hiData:[],lowData:[],color:this.color,showLines:false,fill:true,fillColor:null,_min:null,_max:null,interval:"3%"};var af={highlightMouseOver:ac.highlightMouseOver,highlightMouseDown:ac.highlightMouseDown,highlightColor:ac.highlightColor};delete (ac.highlightMouseOver);delete (ac.highlightMouseDown);delete (ac.highlightColor);H.extend(true,this.renderer,ac);this.renderer.options=ac;if(this.renderer.bandData.length>1&&(!ac.bands||ac.bands.show==null)){this.renderer.bands.show=true}else{if(ac.bands&&ac.bands.show==null&&ac.bands.interval!=null){this.renderer.bands.show=true}}if(this.fill){this.renderer.bands.show=false}if(this.renderer.bands.show){this.renderer.initBands.call(this,this.renderer.options,ah)}if(this._stack){this.renderer.smooth=false}var ag={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,strokeStyle:this.color,fillStyle:this.fillColor,lineWidth:this.lineWidth,linePattern:this.linePattern,closePath:this.fill};this.renderer.shapeRenderer.init(ag);var ad=ac.shadowOffset;if(ad==null){if(this.lineWidth>2.5){ad=1.25*(1+(Math.atan((this.lineWidth/2.5))/0.785398163-1)*0.6)}else{ad=1.25*Math.atan((this.lineWidth/2.5))/0.785398163}}var ab={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,angle:this.shadowAngle,offset:ad,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.lineWidth,linePattern:this.linePattern,closePath:this.fill};this.renderer.shadowRenderer.init(ab);this._areaPoints=[];this._boundingBox=[[],[]];if(!this.isTrendline&&this.fill||this.renderer.bands.show){this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColor=null;if(af.highlightMouseDown&&af.highlightMouseOver==null){af.highlightMouseOver=false}H.extend(true,this,{highlightMouseOver:af.highlightMouseOver,highlightMouseDown:af.highlightMouseDown,highlightColor:af.highlightColor});if(!this.highlightColor){var ae=(this.renderer.bands.show)?this.renderer.bands.fillColor:this.fillColor;this.highlightColor=H.jqplot.computeHighlightColors(ae)}if(this.highlighter){this.highlighter.show=false}}if(!this.isTrendline&&ah){ah.plugins.lineRenderer={};ah.postInitHooks.addOnce(v);ah.postDrawHooks.addOnce(Z);ah.eventListenerHooks.addOnce("jqplotMouseMove",g);ah.eventListenerHooks.addOnce("jqplotMouseDown",d);ah.eventListenerHooks.addOnce("jqplotMouseUp",Y);ah.eventListenerHooks.addOnce("jqplotClick",f);ah.eventListenerHooks.addOnce("jqplotRightClick",p)}};H.jqplot.LineRenderer.prototype.initBands=function(ae,ao){var af=ae.bandData||[];var ah=this.renderer.bands;ah.hiData=[];ah.lowData=[];var av=this.data;ah._max=null;ah._min=null;if(af.length==2){if(H.isArray(af[0][0])){var ai;var ab=0,al=0;for(var ap=0,am=af[0].length;apah._max)||ah._max==null){ah._max=ai[1]}if((ai[1]!=null&&ai[1]ah._max)||ah._max==null){ah._max=ai[1];al=1}if((ai[1]!=null&&ai[1]af[1][0])?0:1;var aw=(ad)?0:1;for(var ap=0,am=av.length;ap2&&!H.isArray(af[0][0])){var ad=(af[0][0]>af[0][1])?0:1;var aw=(ad)?0:1;for(var ap=0,am=af.length;apah._max)||ah._max==null){ah._max=ag[ap][1]}}for(var ap=0,am=aj.length;ap0){aL=Math.abs((aj[aK][1]-aj[aK-1][1])/(aj[aK][0]-aj[aK-1][0]))}ag=aL/aA+ay;aG=az*w(ag)-az*w(ay)+aM;aN=(aI+aG)/2}else{aN=aO}for(aE=0;aE2){var ai;if(this.renderer.constrainSmoothing){ai=F.call(this,this.gridData);this.renderer._smoothedData=ai[0];this.renderer._smoothedPlotData=ai[1];if(ae.show){ai=F.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ai[0];ai=F.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ai[0]}ai=null}else{ai=B.call(this,this.gridData);this.renderer._smoothedData=ai[0];this.renderer._smoothedPlotData=ai[1];if(ae.show){ai=B.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ai[0];ai=B.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ai[0]}ai=null}}};H.jqplot.LineRenderer.prototype.makeGridData=function(ai,ak){var ag=this._xaxis.series_u2p;var ab=this._yaxis.series_u2p;var al=[];var ad=[];this.renderer._smoothedData=[];this.renderer._smoothedPlotData=[];this.renderer._hiBandGridData=[];this.renderer._lowBandGridData=[];this.renderer._hiBandSmoothedData=[];this.renderer._lowBandSmoothedData=[];var af=this.renderer.bands;var ac=false;for(var ah=0;ah2){var aj;if(this.renderer.constrainSmoothing){aj=F.call(this,al);this.renderer._smoothedData=aj[0];this.renderer._smoothedPlotData=aj[1];if(af.show){aj=F.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=aj[0];aj=F.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=aj[0]}aj=null}else{aj=B.call(this,al);this.renderer._smoothedData=aj[0];this.renderer._smoothedPlotData=aj[1];if(af.show){aj=B.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=aj[0];aj=B.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=aj[0]}aj=null}}return al};H.jqplot.LineRenderer.prototype.draw=function(aq,aC,ac,av){var aw;var ak=H.extend(true,{},ac);var ae=(ak.shadow!=r)?ak.shadow:this.shadow;var aD=(ak.showLine!=r)?ak.showLine:this.showLine;var au=(ak.fill!=r)?ak.fill:this.fill;var ab=(ak.fillAndStroke!=r)?ak.fillAndStroke:this.fillAndStroke;var al,ar,ao,ay;aq.save();if(aC.length){if(aD){if(au){if(this.fillToZero){var az=this.negativeColor;if(!this.useNegativeColors){az=ak.fillStyle}var ai=false;var aj=ak.fillStyle;if(ab){var aB=aC.slice(0)}if(this.index==0||!this._stack){var ap=[];var aF=(this.renderer.smooth)?this.renderer._smoothedPlotData:this._plotData;this._areaPoints=[];var aA=this._yaxis.series_u2p(this.fillToValue);var ad=this._xaxis.series_u2p(this.fillToValue);ak.closePath=true;if(this.fillAxis=="y"){ap.push([aC[0][0],aA]);this._areaPoints.push([aC[0][0],aA]);for(var aw=0;aw0;aw--){aC.push(an[aw-1])}if(ae){this.renderer.shadowRenderer.draw(aq,aC,ak)}this._areaPoints=aC;this.renderer.shapeRenderer.draw(aq,aC,ak)}}else{if(ab){var aB=aC.slice(0)}if(this.index==0||!this._stack){var af=aq.canvas.height;aC.unshift([aC[0][0],af]);var ax=aC.length;aC.push([aC[ax-1][0],af])}else{var an=this._prevGridData;for(var aw=an.length;aw>0;aw--){aC.push(an[aw-1])}}this._areaPoints=aC;if(ae){this.renderer.shadowRenderer.draw(aq,aC,ak)}this.renderer.shapeRenderer.draw(aq,aC,ak)}if(ab){var at=H.extend(true,{},ak,{fill:false,closePath:false});this.renderer.shapeRenderer.draw(aq,aB,at);if(this.markerRenderer.show){if(this.renderer.smooth){aB=this.gridData}for(aw=0;awam[0]||al==null){al=am[0]}if(ayam[1]||ar==null){ar=am[1]}}if(this.type==="line"&&this.renderer.bands.show){ay=this._yaxis.series_u2p(this.renderer.bands._min);ar=this._yaxis.series_u2p(this.renderer.bands._max)}this._boundingBox=[[al,ay],[ao,ar]];if(this.markerRenderer.show&&!au){if(this.renderer.smooth){aC=this.gridData}for(aw=0;awai){ai=ad}}}af=null;ag=null;if(ab){ac=this._label._elem.outerWidth(true);ah=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){ai=ai+ah;this._elem.css({height:ai+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){ai=ai+ah;this._elem.css({height:ai+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){ai=ai+ac;this._elem.css({width:ai+"px",left:"0px",top:"0px"});if(ab&&this._label.constructor==H.jqplot.AxisLabelRenderer){this._label._elem.css("width",ac+"px")}}else{ai=ai+ac;this._elem.css({width:ai+"px",right:"0px",top:"0px"});if(ab&&this._label.constructor==H.jqplot.AxisLabelRenderer){this._label._elem.css("width",ac+"px")}}}}}};H.jqplot.LinearAxisRenderer.prototype.createTicks=function(ad){var aM=this._ticks;var aD=this.ticks;var at=this.name;var av=this._dataBounds;var ab=(this.name.charAt(0)==="x")?this._plotDimensions.width:this._plotDimensions.height;var ah;var aY,aB;var aj,ai;var aW,aT;var aA=this.min;var aX=this.max;var aP=this.numberTicks;var a2=this.tickInterval;var ag=30;this._scalefact=(Math.max(ab,ag+1)-ag)/300;if(aD.length){for(aT=0;aTthis.breakPoints[0]&&aH[0]<=this.breakPoints[1]){aN.show=false;aN.showGridline=false;aN.label=aH[1]}else{aN.label=aH[1]}}}else{aN.label=aH[1]}aN.setTick(aH[0],this.name);this._ticks.push(aN)}else{if(H.isPlainObject(aH)){H.extend(true,aN,aH);aN.axis=this.name;this._ticks.push(aN)}else{aN.value=aH;if(this.breakPoints){if(aH==this.breakPoints[0]){aN.label=this.breakTickLabel;aN._breakTick=true;aN.showGridline=false;aN.showMark=false}else{if(aH>this.breakPoints[0]&&aH<=this.breakPoints[1]){aN.show=false;aN.showGridline=false}}}aN.setTick(aH,this.name);this._ticks.push(aN)}}}this.numberTicks=aD.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.tickInterval=(this.max-this.min)/(this.numberTicks-1)}else{if(at=="xaxis"||at=="x2axis"){ab=this._plotDimensions.width}else{ab=this._plotDimensions.height}var aq=this.numberTicks;if(this.alignTicks){if(this.name==="x2axis"&&ad.axes.xaxis.show){aq=ad.axes.xaxis.numberTicks}else{if(this.name.charAt(0)==="y"&&this.name!=="yaxis"&&this.name!=="yMidAxis"&&ad.axes.yaxis.show){aq=ad.axes.yaxis.numberTicks}}}aY=((this.min!=null)?this.min:av.min);aB=((this.max!=null)?this.max:av.max);var ao=aB-aY;var aL,ar;var am;if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}if(this.min==null&&this.max==null&&this.tickInterval==null&&!this.autoscale){if(this.forceTickAt0){if(aY>0){aY=0}if(aB<0){aB=0}}if(this.forceTickAt100){if(aY>100){aY=100}if(aB<100){aB=100}}var aI=H.jqplot.LinearTickGenerator(aY,aB,this._scalefact,aq);var ap=aY+ao*(this.padMin-1);var aJ=aB-ao*(this.padMax-1);if(aYaJ){ap=aY-ao*(this.padMin-1);aJ=aB+ao*(this.padMax-1);aI=H.jqplot.LinearTickGenerator(ap,aJ,this._scalefact,aq)}this.min=aI[0];this.max=aI[1];this.numberTicks=aI[2];this._autoFormatString=aI[3];this.tickInterval=aI[4]}else{if(aY==aB){var ac=0.05;if(aY>0){ac=Math.max(Math.log(aY)/Math.LN10,0.05)}aY-=ac;aB+=ac}if(this.autoscale&&this.min==null&&this.max==null){var ae,af,al;var aw=false;var aG=false;var au={min:null,max:null,average:null,stddev:null};for(var aT=0;aTaU){aU=aK[aS]}}}var an=(aU-az)/aU;if(aO.renderer.constructor==H.jqplot.BarRenderer){if(az>=0&&(aO.fillToZero||an>0.1)){aw=true}else{aw=false;if(aO.fill&&aO.fillToZero&&az<0&&aU>0){aG=true}else{aG=false}}}else{if(aO.fill){if(az>=0&&(aO.fillToZero||an>0.1)){aw=true}else{if(az<0&&aU>0&&aO.fillToZero){aw=false;aG=true}else{aw=false;aG=false}}}else{if(az<0){aw=false}}}}}if(aw){this.numberTicks=2+Math.ceil((ab-(this.tickSpacing-1))/this.tickSpacing);this.min=0;aA=0;af=aB/(this.numberTicks-1);am=Math.pow(10,Math.abs(Math.floor(Math.log(af)/Math.LN10)));if(af/am==parseInt(af/am,10)){af+=am}this.tickInterval=Math.ceil(af/am)*am;this.max=this.tickInterval*(this.numberTicks-1)}else{if(aG){this.numberTicks=2+Math.ceil((ab-(this.tickSpacing-1))/this.tickSpacing);var aC=Math.ceil(Math.abs(aY)/ao*(this.numberTicks-1));var a1=this.numberTicks-1-aC;af=Math.max(Math.abs(aY/aC),Math.abs(aB/a1));am=Math.pow(10,Math.abs(Math.floor(Math.log(af)/Math.LN10)));this.tickInterval=Math.ceil(af/am)*am;this.max=this.tickInterval*a1;this.min=-this.tickInterval*aC}else{if(this.numberTicks==null){if(this.tickInterval){this.numberTicks=3+Math.ceil(ao/this.tickInterval)}else{this.numberTicks=2+Math.ceil((ab-(this.tickSpacing-1))/this.tickSpacing)}}if(this.tickInterval==null){af=ao/(this.numberTicks-1);if(af<1){am=Math.pow(10,Math.abs(Math.floor(Math.log(af)/Math.LN10)))}else{am=1}this.tickInterval=Math.ceil(af*am*this.pad)/am}else{am=1/this.tickInterval}ae=this.tickInterval*(this.numberTicks-1);al=(ae-ao)/2;if(this.min==null){this.min=Math.floor(am*(aY-al))/am}if(this.max==null){this.max=this.min+ae}}}var ay=H.jqplot.getSignificantFigures(this.tickInterval);var aF;if(ay.digitsLeft>=ay.significantDigits){aF="%d"}else{var am=Math.max(0,5-ay.digitsLeft);am=Math.min(am,ay.digitsRight);aF="%."+am+"f"}this._autoFormatString=aF}else{aL=(this.min!=null)?this.min:aY-ao*(this.padMin-1);ar=(this.max!=null)?this.max:aB+ao*(this.padMax-1);ao=ar-aL;if(this.numberTicks==null){if(this.tickInterval!=null){this.numberTicks=Math.ceil((ar-aL)/this.tickInterval)+1}else{if(ab>100){this.numberTicks=parseInt(3+(ab-100)/75,10)}else{this.numberTicks=2}}}if(this.tickInterval==null){this.tickInterval=ao/(this.numberTicks-1)}if(this.max==null){ar=aL+this.tickInterval*(this.numberTicks-1)}if(this.min==null){aL=ar-this.tickInterval*(this.numberTicks-1)}var ay=H.jqplot.getSignificantFigures(this.tickInterval);var aF;if(ay.digitsLeft>=ay.significantDigits){aF="%d"}else{var am=Math.max(0,5-ay.digitsLeft);am=Math.min(am,ay.digitsRight);aF="%."+am+"f"}this._autoFormatString=aF;this.min=aL;this.max=ar}if(this.renderer.constructor==H.jqplot.LinearAxisRenderer&&this._autoFormatString==""){ao=this.max-this.min;var aZ=new this.tickRenderer(this.tickOptions);var aE=aZ.formatString||H.jqplot.config.defaultTickFormatString;var aE=aE.match(H.jqplot.sprintf.regex)[0];var aV=0;if(aE){if(aE.search(/[fFeEgGpP]/)>-1){var aR=aE.match(/\%\.(\d{0,})?[eEfFgGpP]/);if(aR){aV=parseInt(aR[1],10)}else{aV=6}}else{if(aE.search(/[di]/)>-1){aV=0}}var ak=Math.pow(10,-aV);if(this.tickIntervalthis.breakPoints[0]&&authis.breakPoints[0]&&authis.breakPoints[0]&&au=this.breakPoints[1]){return(au-an)*ae/af}else{return(au+this.breakPoints[1]-this.breakPoints[0]-an)*ae/af}};this.series_p2u=function(au){return au*af/ae+an}}}else{this.p2u=function(au){return(au-ag)*af/ae+am};this.u2p=function(au){return(au-am)*ae/af+ag};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(au){return(au-am)*ae/af};this.series_p2u=function(au){return au*af/ae+am}}else{this.series_u2p=function(au){return(au-an)*ae/af};this.series_p2u=function(au){return au*af/ae+an}}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(var ao=0;ao0){ab=-aj._textRenderer.height*Math.cos(-aj._textRenderer.angle)/2}else{ab=-aj.getHeight()+aj._textRenderer.height*Math.cos(aj._textRenderer.angle)/2}break;case"middle":ab=-aj.getHeight()/2;break;default:ab=-aj.getHeight()/2;break}}else{ab=-aj.getHeight()/2}var at=this.u2p(aj.value)+ab+"px";aj._elem.css("top",at);aj.pack()}}if(ak){var ap=this._label._elem.outerHeight(true);this._label._elem.css("top",ai-ae/2-ap/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}ar=null};function h(ac){var ab;ac=Math.abs(ac);if(ac>=10){ab="%d"}else{if(ac>1){if(ac===parseInt(ac,10)){ab="%d"}else{ab="%.1f"}}else{var ad=-Math.floor(Math.log(ac)/Math.LN10);ab="%."+ad+"f"}}return ab}var a=[0.1,0.2,0.3,0.4,0.5,0.8,1,2,3,4,5];var b=function(ac){var ab=a.indexOf(ac);if(ab>0){return a[ab-1]}else{return a[a.length-1]/100}};var i=function(ac){var ab=a.indexOf(ac);if(ab5){ab=10*ad}else{if(ag>2){ab=5*ad}else{if(ag>1){ab=2*ad}else{ab=ad}}}}else{if(ag>5){ab=10*ad}else{if(ag>4){ab=5*ad}else{if(ag>3){ab=4*ad}else{if(ag>2){ab=3*ad}else{if(ag>1){ab=2*ad}else{ab=ad}}}}}}return ab}function M(ac,ab){ab=ab||1;var ae=Math.floor(Math.log(ac)/Math.LN10);var ag=Math.pow(10,ae);var af=ac/ag;var ad;af=af/ab;if(af<=0.38){ad=0.1}else{if(af<=1.6){ad=0.2}else{if(af<=4){ad=0.5}else{if(af<=8){ad=1}else{if(af<=16){ad=2}else{ad=5}}}}}return ad*ag}function t(ad,ac){var af=Math.floor(Math.log(ad)/Math.LN10);var ah=Math.pow(10,af);var ag=ad/ah;var ab;var ae;ag=ag/ac;if(ag<=0.38){ae=0.1}else{if(ag<=1.6){ae=0.2}else{if(ag<=4){ae=0.5}else{if(ag<=8){ae=1}else{if(ag<=16){ae=2}else{ae=5}}}}}ab=ae*ah;return[ab,ae,ah]}H.jqplot.LinearTickGenerator=function(ag,ah,ad,ae){if(ag===ah){ah=(ah)?0:1}ad=ad||1;if(aham){am=av}if(ac>au){au=ac}})}ah.width=am+Number(ao);ah.height=au+Number(aq);var ae=ah.getContext("2d");ae.save();ae.fillStyle=af;ae.fillRect(0,0,ah.width,ah.height);ae.restore();ae.translate(an,al);ae.textAlign="left";ae.textBaseline="top";function aw(ay){var az=parseInt(H(ay).css("line-height"),10);if(isNaN(az)){az=parseInt(H(ay).css("font-size"),10)*1.2}return az}function ax(az,ay,aM,aA,aI,aB){var aK=aw(az);var aE=H(az).innerWidth();var aF=H(az).innerHeight();var aH=aM.split(/\s+/);var aL=aH.length;var aJ="";var aG=[];var aO=aI;var aN=aA;for(var aD=0;aDaE){aG.push(aD);aJ=""}}if(aG.length===0){if(H(az).css("textAlign")==="center"){aN=aA+(aB-ay.measureText(aJ).width)/2-an}ay.fillText(aM,aN,aI)}else{aJ=aH.slice(0,aG[0]).join(" ");if(H(az).css("textAlign")==="center"){aN=aA+(aB-ay.measureText(aJ).width)/2-an}ay.fillText(aJ,aN,aO);aO+=aK;for(var aD=1,aC=aG.length;aD0){ae.strokeRect(aC,aF,H(aA).innerWidth(),H(aA).innerHeight())}H(aA).find("div.jqplot-table-legend-swatch-outline").each(function(){var aO=H(this);ae.strokeStyle=aO.css("border-top-color");var aK=aC+aO.position().left;var aL=aF+aO.position().top;ae.strokeRect(aK,aL,aO.innerWidth(),aO.innerHeight());aK+=parseInt(aO.css("padding-left"),10);aL+=parseInt(aO.css("padding-top"),10);var aN=aO.innerHeight()-2*parseInt(aO.css("padding-top"),10);var aJ=aO.innerWidth()-2*parseInt(aO.css("padding-left"),10);var aM=aO.children("div.jqplot-table-legend-swatch");ae.fillStyle=aM.css("background-color");ae.fillRect(aK,aL,aJ,aN)});H(aA).find("td.jqplot-table-legend-label").each(function(){var aL=H(this);var aJ=aC+aL.position().left;var aK=aF+aL.position().top+parseInt(aL.css("padding-top"),10);ae.font=aL.jqplotGetComputedFontStyle();ae.fillStyle=aL.css("color");ae.fillText(aL.text(),aJ,aK)});var aB=null}else{if(aH=="canvas"){ae.drawImage(aA,aC,aF)}}}}H(this).children().each(function(){ap(this,ao,aq)});return ah};H.fn.jqplotToImageStr=function(ac){var ab=H(this).jqplotToImageCanvas(ac);if(ab){return ab.toDataURL("image/png")}else{return null}};H.fn.jqplotToImageElem=function(ab){var ac=document.createElement("img");var ad=H(this).jqplotToImageStr(ab);ac.src=ad;return ac};H.fn.jqplotToImageElemStr=function(ab){var ac="";return ac};H.fn.jqplotSaveImage=function(){var ab=H(this).jqplotToImageStr({});if(ab){window.location.href=ab.replace("image/png","image/octet-stream")}};H.fn.jqplotViewImage=function(){var ac=H(this).jqplotToImageElemStr({});var ad=H(this).jqplotToImageStr({});if(ac){var ab=window.open("");ab.document.open("image/png");ab.document.write(ac);ab.document.close();ab=null}};var aa=function(){this.syntax=aa.config.syntax;this._type="jsDate";this.proxy=new Date();this.options={};this.locale=aa.regional.getLocale();this.formatString="";this.defaultCentury=aa.config.defaultCentury;switch(arguments.length){case 0:break;case 1:if(j(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var ad=this.options=arguments[0];this.syntax=ad.syntax||this.syntax;this.defaultCentury=ad.defaultCentury||this.defaultCentury;this.proxy=aa.createDate(ad.date)}else{this.proxy=aa.createDate(arguments[0])}break;default:var ab=[];for(var ac=0;ac0?"floor":"ceil"](ae))};aa.prototype.getAbbrDayName=function(){return aa.regional[this.locale]["dayNamesShort"][this.proxy.getDay()]};aa.prototype.getAbbrMonthName=function(){return aa.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()]};aa.prototype.getAMPM=function(){return this.proxy.getHours()>=12?"PM":"AM"};aa.prototype.getAmPm=function(){return this.proxy.getHours()>=12?"pm":"am"};aa.prototype.getCentury=function(){return parseInt(this.proxy.getFullYear()/100,10)};aa.prototype.getDate=function(){return this.proxy.getDate()};aa.prototype.getDay=function(){return this.proxy.getDay()};aa.prototype.getDayOfWeek=function(){var ab=this.proxy.getDay();return ab===0?7:ab};aa.prototype.getDayOfYear=function(){var ac=this.proxy;var ab=ac-new Date(""+ac.getFullYear()+"/1/1 GMT");ab+=ac.getTimezoneOffset()*60000;ac=null;return parseInt(ab/60000/60/24,10)+1};aa.prototype.getDayName=function(){return aa.regional[this.locale]["dayNames"][this.proxy.getDay()]};aa.prototype.getFullWeekOfYear=function(){var ae=this.proxy;var ab=this.getDayOfYear();var ad=6-ae.getDay();var ac=parseInt((ab+ad)/7,10);return ac};aa.prototype.getFullYear=function(){return this.proxy.getFullYear()};aa.prototype.getGmtOffset=function(){var ab=this.proxy.getTimezoneOffset()/60;var ac=ab<0?"+":"-";ab=Math.abs(ab);return ac+J(Math.floor(ab),2)+":"+J((ab%1)*60,2)};aa.prototype.getHours=function(){return this.proxy.getHours()};aa.prototype.getHours12=function(){var ab=this.proxy.getHours();return ab>12?ab-12:(ab==0?12:ab)};aa.prototype.getIsoWeek=function(){var ae=this.proxy;var ad=ae.getWeekOfYear();var ab=(new Date(""+ae.getFullYear()+"/1/1")).getDay();var ac=ad+(ab>4||ab<=1?0:1);if(ac==53&&(new Date(""+ae.getFullYear()+"/12/31")).getDay()<4){ac=1}else{if(ac===0){ae=new aa(new Date(""+(ae.getFullYear()-1)+"/12/31"));ac=ae.getIsoWeek()}}ae=null;return ac};aa.prototype.getMilliseconds=function(){return this.proxy.getMilliseconds()};aa.prototype.getMinutes=function(){return this.proxy.getMinutes()};aa.prototype.getMonth=function(){return this.proxy.getMonth()};aa.prototype.getMonthName=function(){return aa.regional[this.locale]["monthNames"][this.proxy.getMonth()]};aa.prototype.getMonthNumber=function(){return this.proxy.getMonth()+1};aa.prototype.getSeconds=function(){return this.proxy.getSeconds()};aa.prototype.getShortYear=function(){return this.proxy.getYear()%100};aa.prototype.getTime=function(){return this.proxy.getTime()};aa.prototype.getTimezoneAbbr=function(){return this.proxy.toString().replace(/^.*\(([^)]+)\)$/,"$1")};aa.prototype.getTimezoneName=function(){var ab=/(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());return ab[1]||ab[2]||"GMT"+this.getGmtOffset()};aa.prototype.getTimezoneOffset=function(){return this.proxy.getTimezoneOffset()};aa.prototype.getWeekOfYear=function(){var ab=this.getDayOfYear();var ad=7-this.getDayOfWeek();var ac=parseInt((ab+ad)/7,10);return ac};aa.prototype.getUnix=function(){return Math.round(this.proxy.getTime()/1000,0)};aa.prototype.getYear=function(){return this.proxy.getYear()};aa.prototype.next=function(ab){ab=ab||"day";return this.clone().add(1,ab)};aa.prototype.set=function(){switch(arguments.length){case 0:this.proxy=new Date();break;case 1:if(j(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var ad=this.options=arguments[0];this.syntax=ad.syntax||this.syntax;this.defaultCentury=ad.defaultCentury||this.defaultCentury;this.proxy=aa.createDate(ad.date)}else{this.proxy=aa.createDate(arguments[0])}break;default:var ab=[];for(var ac=0;ac0?"floor":"ceil"](ab/12));var ac=ad.getMonth()+(ab%12);if(ac==12){ac=0;ad.setYear(ad.getFullYear()+1)}else{if(ac==-1){ac=11;ad.setYear(ad.getFullYear()-1)}}ad.setMonth(ac)},diff:function(af,ad){var ab=af.getFullYear()-ad.getFullYear();var ac=af.getMonth()-ad.getMonth()+(ab*12);var ae=af.getDate()-ad.getDate();return ac+(ae/30)}},year:{add:function(ac,ab){ac.setYear(ac.getFullYear()+Math[ab>0?"floor":"ceil"](ab))},diff:function(ac,ab){return A.month.diff(ac,ab)/12}}};for(var T in A){if(T.substring(T.length-1)!="s"){A[T+"s"]=A[T]}}var D=function(af,ae,ac){if(aa.formats[ac]["shortcuts"][ae]){return aa.strftime(af,aa.formats[ac]["shortcuts"][ae],ac)}else{var ab=(aa.formats[ac]["codes"][ae]||"").split(".");var ad=af["get"+ab[0]]?af["get"+ab[0]]():"";if(ab[1]){ad=J(ad,ab[1])}return ad}};aa.strftime=function(ah,ae,ad,ai){var ac="perl";var ag=aa.regional.getLocale();if(ad&&aa.formats.hasOwnProperty(ad)){ac=ad}else{if(ad&&aa.regional.hasOwnProperty(ad)){ag=ad}}if(ai&&aa.formats.hasOwnProperty(ai)){ac=ai}else{if(ai&&aa.regional.hasOwnProperty(ai)){ag=ai}}if(j(ah)!="[object Object]"||ah._type!="jsDate"){ah=new aa(ah);ah.locale=ag}if(!ae){ae=ah.formatString||aa.regional[ag]["formatString"]}var ab=ae||"%Y-%m-%d",aj="",af;while(ab.length>0){if(af=ab.match(aa.formats[ac].codes.matcher)){aj+=ab.slice(0,af.index);aj+=(af[1]||"")+D(ah,af[2],ac);ab=ab.slice(af.index+af[0].length)}else{aj+=ab;ab=""}}return aj};aa.formats={ISO:"%Y-%m-%dT%H:%M:%S.%N%G",SQL:"%Y-%m-%d %H:%M:%S"};aa.formats.perl={codes:{matcher:/()%(#?(%|[a-z]))/i,Y:"FullYear",y:"ShortYear.2",m:"MonthNumber.2","#m":"MonthNumber",B:"MonthName",b:"AbbrMonthName",d:"Date.2","#d":"Date",e:"Date",A:"DayName",a:"AbbrDayName",w:"Day",H:"Hours.2","#H":"Hours",I:"Hours12.2","#I":"Hours12",p:"AMPM",M:"Minutes.2","#M":"Minutes",S:"Seconds.2","#S":"Seconds",s:"Unix",N:"Milliseconds.3","#N":"Milliseconds",O:"TimezoneOffset",Z:"TimezoneName",G:"GmtOffset"},shortcuts:{F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",D:"%m/%d/%y","#c":"%a %b %e %H:%M:%S %Y",v:"%e-%b-%Y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};aa.formats.php={codes:{matcher:/()%((%|[a-z]))/i,a:"AbbrDayName",A:"DayName",d:"Date.2",e:"Date",j:"DayOfYear.3",u:"DayOfWeek",w:"Day",U:"FullWeekOfYear.2",V:"IsoWeek.2",W:"WeekOfYear.2",b:"AbbrMonthName",B:"MonthName",m:"MonthNumber.2",h:"AbbrMonthName",C:"Century.2",y:"ShortYear.2",Y:"FullYear",H:"Hours.2",I:"Hours12.2",l:"Hours12",p:"AMPM",P:"AmPm",M:"Minutes.2",S:"Seconds.2",s:"Unix",O:"TimezoneOffset",z:"GmtOffset",Z:"TimezoneAbbr"},shortcuts:{D:"%m/%d/%y",F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};aa.createDate=function(ad){if(ad==null){return new Date()}if(ad instanceof Date){return ad}if(typeof ad=="number"){return new Date(ad)}var ai=String(ad).replace(/^\s*(.+)\s*$/g,"$1");ai=ai.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/,"$1/$2/$3");ai=ai.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i,"$1 $2 $3");var ah=ai.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i);if(ah&&ah.length>3){var am=parseFloat(ah[3]);var ag=aa.config.defaultCentury+am;ag=String(ag);ai=ai.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i,ah[1]+" "+ah[2]+" "+ag)}ah=ai.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/);function al(aq,ap){var aw=parseFloat(ap[1]);var av=parseFloat(ap[2]);var au=parseFloat(ap[3]);var at=aa.config.defaultCentury;var ao,an,ax,ar;if(aw>31){an=au;ax=av;ao=at+aw}else{an=av;ax=aw;ao=at+au}ar=ax+"/"+an+"/"+ao;return aq.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/,ar)}if(ah&&ah.length>3){ai=al(ai,ah)}var ah=ai.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/);if(ah&&ah.length>3){ai=al(ai,ah)}var af=0;var ac=aa.matchers.length;var ak,ab,aj=ai,ae;while(af31){ab=ah;ac=ag+ai}else{ab=ai;ac=ag+ah}var aj=W(ad[2],aa.regional[aa.regional.getLocale()]["monthNamesShort"]);if(aj==-1){aj=W(ad[2],aa.regional[aa.regional.getLocale()]["monthNames"])}ae.setFullYear(ac,aj,ab);ae.setHours(0,0,0,0);return ae}else{return af}}];function W(ad,ae){if(ae.indexOf){return ae.indexOf(ad)}for(var ab=0,ac=ae.length;ab=aj)?"":Array(1+aj-an.length>>>0).join(ak);return am?an+al:al+an}function ae(al){var ak=new String(al);for(var aj=10;aj>0;aj--){if(ak==(ak=ak.replace(/^(\d+)(\d{3})/,"$1"+H.jqplot.sprintf.thousandsSeparator+"$2"))){break}}return ak}function ad(ao,an,aq,al,am,ak){var ap=al-ao.length;if(ap>0){var aj=" ";if(ak){aj=" "}if(aq||!am){ao=ah(ao,al,aj,aq)}else{ao=ao.slice(0,an.length)+ah("",ap,"0",true)+ao.slice(an.length)}}return ao}function ai(ar,ak,ap,al,aj,ao,aq,an){var am=ar>>>0;ap=ap&&am&&{"2":"0b","8":"0","16":"0x"}[ak]||"";ar=ap+ah(am.toString(ak),ao||0,"0",false);return ad(ar,ap,al,aj,aq,an)}function ab(an,ao,al,aj,am,ak){if(aj!=null){an=an.slice(0,aj)}return ad(an,"",ao,al,am,ak)}var ac=arguments,af=0,ag=ac[af++];return ag.replace(H.jqplot.sprintf.regex,function(aF,aq,ar,av,aH,aC,ao){if(aF=="%%"){return"%"}var aw=false,at="",au=false,aE=false,ap=false,an=false;for(var aB=0;ar&&aB-1?6:(ao=="d")?0:void (0)}else{if(aC=="*"){aC=+ac[af++]}else{if(aC.charAt(0)=="*"){aC=+ac[aC.slice(1,-1)]}else{aC=+aC}}}var ay=aq?ac[aq.slice(0,-1)]:ac[af++];switch(ao){case"s":if(ay==null){return""}return ab(String(ay),aw,av,aC,au,ap);case"c":return ab(String.fromCharCode(+ay),aw,av,aC,au,ap);case"b":return ai(ay,2,aE,aw,av,aC,au,ap);case"o":return ai(ay,8,aE,aw,av,aC,au,ap);case"x":return ai(ay,16,aE,aw,av,aC,au,ap);case"X":return ai(ay,16,aE,aw,av,aC,au,ap).toUpperCase();case"u":return ai(ay,10,aE,aw,av,aC,au,ap);case"i":var al=parseInt(+ay,10);if(isNaN(al)){return""}var aA=al<0?"-":at;var aD=an?ae(String(Math.abs(al))):String(Math.abs(al));ay=aA+ah(aD,aC,"0",false);return ad(ay,aA,aw,av,au,ap);case"d":var al=Math.round(+ay);if(isNaN(al)){return""}var aA=al<0?"-":at;var aD=an?ae(String(Math.abs(al))):String(Math.abs(al));ay=aA+ah(aD,aC,"0",false);return ad(ay,aA,aw,av,au,ap);case"e":case"E":case"f":case"F":case"g":case"G":var al=+ay;if(isNaN(al)){return""}var aA=al<0?"-":at;var am=["toExponential","toFixed","toPrecision"]["efg".indexOf(ao.toLowerCase())];var aG=["toString","toUpperCase"]["eEfFgG".indexOf(ao)%2];var aD=Math.abs(al)[am](aC);aD=an?ae(aD):aD;ay=aA+aD;return ad(ay,aA,aw,av,au,ap)[aG]();case"p":case"P":var al=+ay;if(isNaN(al)){return""}var aA=al<0?"-":at;var ax=String(Number(Math.abs(al)).toExponential()).split(/e|E/);var ak=(ax[0].indexOf(".")!=-1)?ax[0].length-1:ax[0].length;var az=(ax[1]<0)?-ax[1]-1:0;if(Math.abs(al)<1){if(ak+az<=aC){ay=aA+Math.abs(al).toPrecision(ak)}else{if(ak<=aC-1){ay=aA+Math.abs(al).toExponential(ak-1)}else{ay=aA+Math.abs(al).toExponential(aC-1)}}}else{var aj=(ak<=aC)?ak:aC;ay=aA+Math.abs(al).toPrecision(aj)}var aG=["toString","toUpperCase"]["pP".indexOf(ao)%2];return ad(ay,aA,aw,av,au,ap)[aG]();case"n":return"";default:return aF}})};H.jqplot.sprintf.thousandsSeparator=",";H.jqplot.sprintf.regex=/%%|%(\d+\$)?([-+#0&\' ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([nAscboxXuidfegpEGP])/g;H.jqplot.getSignificantFigures=function(af){var ah=String(Number(Math.abs(af)).toExponential()).split(/e|E/);var ag=(ah[0].indexOf(".")!=-1)?ah[0].length-1:ah[0].length;var ac=(ah[1]<0)?-ah[1]-1:0;var ab=parseInt(ah[1],10);var ad=(ab+1>0)?ab+1:0;var ae=(ag<=ad)?0:ag-ab-1;return{significantDigits:ag,digitsLeft:ad,digitsRight:ae,zeros:ac,exponent:ab}};H.jqplot.getPrecision=function(ab){return H.jqplot.getSignificantFigures(ab).digitsRight}})(jQuery);var backCompat=$.uiBackCompat!==false;$.jqplot.effects={effect:{}};var dataSpace="jqplot.storage.";$.extend($.jqplot.effects,{version:"1.9pre",save:function(b,c){for(var a=0;a").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),a={width:b.width(),height:b.height()},d=document.activeElement;b.wrap(e);if(b[0]===d||$.contains(b[0],d)){$(d).focus()}e=b.parent();if(b.css("position")==="static"){e.css({position:"relative"});b.css({position:"relative"})}else{$.extend(c,{position:b.css("position"),zIndex:b.css("z-index")});$.each(["top","left","bottom","right"],function(f,g){c[g]=b.css(g);if(isNaN(parseInt(c[g],10))){c[g]="auto"}});b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}b.css(a);return e.css(c).show()},removeWrapper:function(a){var b=document.activeElement;if(a.parent().is(".ui-effects-wrapper")){a.parent().replaceWith(a);if(a[0]===b||$.contains(a[0],b)){$(b).focus()}}return a}});function _normalizeArguments(b,a,c,d){if($.isPlainObject(b)){return b}b={effect:b};if(a===undefined){a={}}if($.isFunction(a)){d=a;c=null;a={}}if($.type(a)==="number"||$.fx.speeds[a]){d=c;c=a;a={}}if($.isFunction(c)){d=c;c=null}if(a){$.extend(b,a)}c=c||a.duration;b.duration=$.fx.off?0:typeof c==="number"?c:c in $.fx.speeds?$.fx.speeds[c]:$.fx.speeds._default;b.complete=d||a.complete;return b}function standardSpeed(a){if(!a||typeof a==="number"||$.fx.speeds[a]){return true}if(typeof a==="string"&&!$.jqplot.effects.effect[a]){if(backCompat&&$.jqplot.effects[a]){return false}return true}return false}$.fn.extend({jqplotEffect:function(i,j,b,h){var g=_normalizeArguments.apply(this,arguments),d=g.mode,e=g.queue,f=$.jqplot.effects.effect[g.effect],a=!f&&backCompat&&$.jqplot.effects[g.effect];if($.fx.off||!(f||a)){if(d){return this[d](g.duration,g.complete)}else{return this.each(function(){if(g.complete){g.complete.call(this)}})}}function c(m){var n=$(this),l=g.complete,o=g.mode;function k(){if($.isFunction(l)){l.call(n[0])}if($.isFunction(m)){m()}}if(n.is(":hidden")?o==="hide":o==="show"){k()}else{f.call(n[0],g,k)}}if(f){return e===false?this.each(c):this.queue(e||"fx",c)}else{return a.call(this,{options:g,duration:g.duration,callback:g.complete,mode:g.mode})}}});var rvertical=/up|down|vertical/,rpositivemotion=/up|left|vertical|horizontal/;$.jqplot.effects.effect.blind=function(c,h){var d=$(this),k=["position","top","bottom","left","right","height","width"],i=$.jqplot.effects.setMode(d,c.mode||"hide"),m=c.direction||"up",f=rvertical.test(m),e=f?"height":"width",j=f?"top":"left",p=rpositivemotion.test(m),g={},n=i==="show",b,a,l;if(d.parent().is(".ui-effects-wrapper")){$.jqplot.effects.save(d.parent(),k)}else{$.jqplot.effects.save(d,k)}d.show();l=parseInt(d.css("top"),10);b=$.jqplot.effects.createWrapper(d).css({overflow:"hidden"});a=f?b[e]()+l:b[e]();g[e]=n?String(a):"0";if(!p){d.css(f?"bottom":"right",0).css(f?"top":"left","").css({position:"absolute"});g[j]=n?"0":String(a)}if(n){b.css(e,0);if(!p){b.css(j,a)}}b.animate(g,{duration:c.duration,easing:c.easing,queue:false,complete:function(){if(i==="hide"){d.hide()}$.jqplot.effects.restore(d,k);$.jqplot.effects.removeWrapper(d);h()}})};ntop-5.0.1+dfsg1/html/jqplot/plugins/0000755000000000000000000000000012012127277016132 5ustar rootrootntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.pieRenderer.min.js0000644000000000000000000003651711762677020023051 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * * included jsDate library by Chris Leonello: * * Copyright (c) 2010-2011 Chris Leonello * * jsDate is currently available for use in all personal or commercial projects * under both the MIT and GPL version 2.0 licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * jsDate borrows many concepts and ideas from the Date Instance * Methods by Ken Snyder along with some parts of Ken's actual code. * * Ken's origianl Date Instance Methods and copyright notice: * * Ken Snyder (ken d snyder at gmail dot com) * 2008-09-10 * version 2.0.2 (http://kendsnyder.com/sandbox/date/) * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) * * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. * Larry has generously given permission to adapt his code for inclusion * into jqPlot. * * Larry's original code can be found here: * * https://github.com/lsiden/export-jqplot-to-png * * */ (function(e){e.jqplot.PieRenderer=function(){e.jqplot.LineRenderer.call(this)};e.jqplot.PieRenderer.prototype=new e.jqplot.LineRenderer();e.jqplot.PieRenderer.prototype.constructor=e.jqplot.PieRenderer;e.jqplot.PieRenderer.prototype.init=function(q,u){this.diameter=null;this.padding=20;this.sliceMargin=0;this.fill=true;this.shadowOffset=2;this.shadowAlpha=0.07;this.shadowDepth=5;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.dataLabels="percent";this.showDataLabels=false;this.dataLabelFormatString=null;this.dataLabelThreshold=3;this.dataLabelPositionFactor=0.52;this.dataLabelNudge=2;this.dataLabelCenterOn=true;this.startAngle=0;this.tickRenderer=e.jqplot.PieTickRenderer;this._drawData=true;this._type="pie";if(q.highlightMouseDown&&q.highlightMouseOver==null){q.highlightMouseOver=false}e.extend(true,this,q);if(this.sliceMargin<0){this.sliceMargin=0}this._diameter=null;this._radius=null;this._sliceAngles=[];this._highlightedPoint=null;if(this.highlightColors.length==0){for(var s=0;s570)?o[p]*0.8:o[p]+0.3*(255-o[p]);o[p]=parseInt(o[p],10)}this.highlightColors.push("rgb("+o[0]+","+o[1]+","+o[2]+")")}}this.highlightColorGenerator=new e.jqplot.ColorGenerator(this.highlightColors);u.postParseOptionsHooks.addOnce(m);u.postInitHooks.addOnce(g);u.eventListenerHooks.addOnce("jqplotMouseMove",b);u.eventListenerHooks.addOnce("jqplotMouseDown",a);u.eventListenerHooks.addOnce("jqplotMouseUp",l);u.eventListenerHooks.addOnce("jqplotClick",f);u.eventListenerHooks.addOnce("jqplotRightClick",n);u.postDrawHooks.addOnce(i)};e.jqplot.PieRenderer.prototype.setGridData=function(t){var p=[];var u=[];var o=this.startAngle/180*Math.PI;var s=0;this._drawData=false;for(var r=0;r0){p[r]+=p[r-1]}s+=this.data[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r0){p[r]+=p[r-1]}s+=t[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r0&&s>0.01&&s<6.282){w=parseFloat(p)/2/h(q)}return w}e.jqplot.PieRenderer.prototype.drawSlice=function(B,z,y,u,w){if(this._drawData){var p=this._radius;var A=this.fill;var x=this.lineWidth;var s=this.sliceMargin;if(this.fill==false){s+=this.lineWidth}B.save();B.translate(this._center[0],this._center[1]);var D=j(z,y,this.sliceMargin,this.fill,this.lineWidth);var o=D*Math.cos((z+y)/2);var C=D*Math.sin((z+y)/2);if((y-z)<=Math.PI){p-=D}else{p+=D}B.translate(o,C);if(w){for(var v=0,t=this.shadowDepth;v6.282+this.startAngle){y=6.282+this.startAngle;if(z>y){z=6.281+this.startAngle}}if(z>=y){return}B.beginPath();B.fillStyle=u;B.strokeStyle=u;B.lineWidth=x;B.arc(0,0,r,z,y,false);B.lineTo(0,0);B.closePath();if(A){B.fill()}else{B.stroke()}}};e.jqplot.PieRenderer.prototype.draw=function(B,z,E,o){var W;var H=(E!=undefined)?E:{};var t=0;var s=0;var N=1;var L=new e.jqplot.ColorGenerator(this.seriesColors);if(E.legendInfo&&E.legendInfo.placement=="insideGrid"){var J=E.legendInfo;switch(J.location){case"nw":t=J.width+J.xoffset;break;case"w":t=J.width+J.xoffset;break;case"sw":t=J.width+J.xoffset;break;case"ne":t=J.width+J.xoffset;N=-1;break;case"e":t=J.width+J.xoffset;N=-1;break;case"se":t=J.width+J.xoffset;N=-1;break;case"n":s=J.height+J.yoffset;break;case"s":s=J.height+J.yoffset;N=-1;break;default:break}}var K=(H.shadow!=undefined)?H.shadow:this.shadow;var A=(H.fill!=undefined)?H.fill:this.fill;var C=B.canvas.width;var I=B.canvas.height;var Q=C-t-2*this.padding;var X=I-s-2*this.padding;var M=Math.min(Q,X);var Y=M;this._sliceAngles=[];var v=this.sliceMargin;if(this.fill==false){v+=this.lineWidth}var q;var G=0;var R,aa,Z,ab;var D=this.startAngle/180*Math.PI;for(var W=0,V=z.length;WMath.PI){G=Math.max(q,G)}}if(this.diameter!=null&&this.diameter>0){this._diameter=this.diameter-2*G}else{this._diameter=Y-2*G}if(this._diameter<6){e.jqplot.log("Diameter of pie too small, not rendering.");return}var S=this._radius=this._diameter/2;this._center=[(C-N*t)/2+N*t+G*Math.cos(D),(I-N*s)/2+N*s+G*Math.sin(D)];if(this.shadow){for(var W=0,V=z.length;W=this.dataLabelThreshold){var F,U=(this._sliceAngles[W][0]+this._sliceAngles[W][1])/2,T;if(this.dataLabels=="label"){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,z[W][0])}else{if(this.dataLabels=="value"){F=this.dataLabelFormatString||"%d";T=e.jqplot.sprintf(F,this.data[W][1])}else{if(this.dataLabels=="percent"){F=this.dataLabelFormatString||"%d%%";T=e.jqplot.sprintf(F,z[W][2]*100)}else{if(this.dataLabels.constructor==Array){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,this.dataLabels[W])}}}}var p=(this._radius)*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var P=this._center[0]+Math.cos(U)*p+this.canvas._offsets.left;var O=this._center[1]+Math.sin(U)*p+this.canvas._offsets.top;var u=e('
      '+T+"
      ").insertBefore(o.eventCanvas._elem);if(this.dataLabelCenterOn){P-=u.width()/2;O-=u.height()/2}else{P-=u.width()*Math.sin(U/2);O-=u.height()/2}P=Math.round(P);O=Math.round(O);u.css({left:P,top:O})}}};e.jqplot.PieAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.PieAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.PieAxisRenderer.prototype.constructor=e.jqplot.PieAxisRenderer;e.jqplot.PieAxisRenderer.prototype.init=function(o){this.tickRenderer=e.jqplot.PieTickRenderer;e.extend(true,this,o);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.PieLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.PieLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.PieLegendRenderer.prototype.constructor=e.jqplot.PieLegendRenderer;e.jqplot.PieLegendRenderer.prototype.init=function(o){this.numberRows=null;this.numberColumns=null;e.extend(true,this,o)};e.jqplot.PieLegendRenderer.prototype.draw=function(){var r=this;if(this.show){var B=this._series;this._elem=e(document.createElement("table"));this._elem.addClass("jqplot-table-legend");var E={position:"absolute"};if(this.background){E.background=this.background}if(this.border){E.border=this.border}if(this.fontSize){E.fontSize=this.fontSize}if(this.fontFamily){E.fontFamily=this.fontFamily}if(this.textColor){E.textColor=this.textColor}if(this.marginTop!=null){E.marginTop=this.marginTop}if(this.marginBottom!=null){E.marginBottom=this.marginBottom}if(this.marginLeft!=null){E.marginLeft=this.marginLeft}if(this.marginRight!=null){E.marginRight=this.marginRight}this._elem.css(E);var I=false,A=false,o,y;var C=B[0];var p=new e.jqplot.ColorGenerator(C.seriesColors);if(C.show){var J=C.data;if(this.numberRows){o=this.numberRows;if(!this.numberColumns){y=Math.ceil(J.length/o)}else{y=this.numberColumns}}else{if(this.numberColumns){y=this.numberColumns;o=Math.ceil(J.length/this.numberColumns)}else{o=J.length;y=1}}var H,G;var q,w,v;var x,z,F;var D=0;var u,t;for(H=0;H0){I=true}else{I=false}}else{if(H==o-1){I=false}else{I=true}}z=(I)?this.rowSpacing:"0";w=e(document.createElement("td"));w.addClass("jqplot-table-legend jqplot-table-legend-swatch");w.css({textAlign:"center",paddingTop:z});u=e(document.createElement("div"));u.addClass("jqplot-table-legend-swatch-outline");t=e(document.createElement("div"));t.addClass("jqplot-table-legend-swatch");t.css({backgroundColor:F,borderColor:F});w.append(u.append(t));v=e(document.createElement("td"));v.addClass("jqplot-table-legend jqplot-table-legend-label");v.css("paddingTop",z);if(this.escapeHtml){v.text(x)}else{v.html(x)}if(A){v.prependTo(q);w.prependTo(q)}else{w.appendTo(q);v.appendTo(q)}I=true}D++}}}}return this._elem};e.jqplot.PieRenderer.prototype.handleMove=function(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];r.target.trigger("jqplotDataMouseOver",o);if(r.series[o[0]].highlightMouseOver&&!(o[0]==r.plugins.pieRenderer.highlightedSeriesIndex&&o[1]==r.series[o[0]]._highlightedPoint)){r.target.trigger("jqplotDataHighlight",o);d(r,o[0],o[1])}}else{if(s==null){k(r)}}};function c(s,r,p){p=p||{};p.axesDefaults=p.axesDefaults||{};p.legend=p.legend||{};p.seriesDefaults=p.seriesDefaults||{};var o=false;if(p.seriesDefaults.renderer==e.jqplot.PieRenderer){o=true}else{if(p.series){for(var q=0;q= 1 or will often miss point intersections. this.intersectionThreshold = 2; // prop: showCursorLegend // Replace the plot legend with an enhanced legend displaying intersection information. this.showCursorLegend = false; // prop: cursorLegendFormatString // Format string used in the cursor legend. If showTooltipDataPosition is true, // this will also be the default format string used by tooltipFormatString. this.cursorLegendFormatString = $.jqplot.Cursor.cursorLegendFormatString; // whether the cursor is over the grid or not. this._oldHandlers = {onselectstart: null, ondrag: null, onmousedown: null}; // prop: constrainOutsideZoom // True to limit actual zoom area to edges of grid, even when zooming // outside of plot area. That is, can't zoom out by mousing outside plot. this.constrainOutsideZoom = true; // prop: showTooltipOutsideZoom // True will keep updating the tooltip when zooming of the grid. this.showTooltipOutsideZoom = false; // true if mouse is over grid, false if not. this.onGrid = false; $.extend(true, this, options); }; $.jqplot.Cursor.cursorLegendFormatString = '%s x:%s, y:%s'; // called with scope of plot $.jqplot.Cursor.init = function (target, data, opts){ // add a cursor attribute to the plot var options = opts || {}; this.plugins.cursor = new $.jqplot.Cursor(options.cursor); var c = this.plugins.cursor; if (c.show) { $.jqplot.eventListenerHooks.push(['jqplotMouseEnter', handleMouseEnter]); $.jqplot.eventListenerHooks.push(['jqplotMouseLeave', handleMouseLeave]); $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMouseMove]); if (c.showCursorLegend) { opts.legend = opts.legend || {}; opts.legend.renderer = $.jqplot.CursorLegendRenderer; opts.legend.formatString = this.plugins.cursor.cursorLegendFormatString; opts.legend.show = true; } if (c.zoom) { $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleMouseDown]); if (c.clickReset) { $.jqplot.eventListenerHooks.push(['jqplotClick', handleClick]); } if (c.dblClickReset) { $.jqplot.eventListenerHooks.push(['jqplotDblClick', handleDblClick]); } } this.resetZoom = function() { var axes = this.axes; if (!c.zoomProxy) { for (var ax in axes) { axes[ax].reset(); axes[ax]._ticks = []; // fake out tick creation algorithm to make sure original auto // computed format string is used if _overrideFormatString is true if (c._zoom.axes[ax] !== undefined) { axes[ax]._autoFormatString = c._zoom.axes[ax].tickFormatString; } } this.redraw(); } else { var ctx = this.plugins.cursor.zoomCanvas._ctx; ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); ctx = null; } this.plugins.cursor._zoom.isZoomed = false; this.target.trigger('jqplotResetZoom', [this, this.plugins.cursor]); }; if (c.showTooltipDataPosition) { c.showTooltipUnitPosition = false; c.showTooltipGridPosition = false; if (options.cursor.tooltipFormatString == undefined) { c.tooltipFormatString = $.jqplot.Cursor.cursorLegendFormatString; } } } }; // called with context of plot $.jqplot.Cursor.postDraw = function() { var c = this.plugins.cursor; // Memory Leaks patch if (c.zoomCanvas) { c.zoomCanvas.resetCanvas(); c.zoomCanvas = null; } if (c.cursorCanvas) { c.cursorCanvas.resetCanvas(); c.cursorCanvas = null; } if (c._tooltipElem) { c._tooltipElem.emptyForce(); c._tooltipElem = null; } if (c.zoom) { c.zoomCanvas = new $.jqplot.GenericCanvas(); this.eventCanvas._elem.before(c.zoomCanvas.createElement(this._gridPadding, 'jqplot-zoom-canvas', this._plotDimensions, this)); c.zoomCanvas.setContext(); } var elem = document.createElement('div'); c._tooltipElem = $(elem); elem = null; c._tooltipElem.addClass('jqplot-cursor-tooltip'); c._tooltipElem.css({position:'absolute', display:'none'}); if (c.zoomCanvas) { c.zoomCanvas._elem.before(c._tooltipElem); } else { this.eventCanvas._elem.before(c._tooltipElem); } if (c.showVerticalLine || c.showHorizontalLine) { c.cursorCanvas = new $.jqplot.GenericCanvas(); this.eventCanvas._elem.before(c.cursorCanvas.createElement(this._gridPadding, 'jqplot-cursor-canvas', this._plotDimensions, this)); c.cursorCanvas.setContext(); } // if we are showing the positions in unit coordinates, and no axes groups // were specified, create a default set. if (c.showTooltipUnitPosition){ if (c.tooltipAxisGroups.length === 0) { var series = this.series; var s; var temp = []; for (var i=0; i 6 && Math.abs(gridpos.y - c._zoom.start[1]) > 6) || (c.constrainZoomTo == 'x' && Math.abs(gridpos.x - c._zoom.start[0]) > 6) || (c.constrainZoomTo == 'y' && Math.abs(gridpos.y - c._zoom.start[1]) > 6)) { if (!plot.plugins.cursor.zoomProxy) { for (var ax in datapos) { // make a copy of the original axes to revert back. if (c._zoom.axes[ax] == undefined) { c._zoom.axes[ax] = {}; c._zoom.axes[ax].numberTicks = axes[ax].numberTicks; c._zoom.axes[ax].tickInterval = axes[ax].tickInterval; // for date axes... c._zoom.axes[ax].daTickInterval = axes[ax].daTickInterval; c._zoom.axes[ax].min = axes[ax].min; c._zoom.axes[ax].max = axes[ax].max; c._zoom.axes[ax].tickFormatString = (axes[ax].tickOptions != null) ? axes[ax].tickOptions.formatString : ''; } if ((c.constrainZoomTo == 'none') || (c.constrainZoomTo == 'x' && ax.charAt(0) == 'x') || (c.constrainZoomTo == 'y' && ax.charAt(0) == 'y')) { dp = datapos[ax]; if (dp != null) { if (dp > start[ax]) { newmin = start[ax]; newmax = dp; } else { span = start[ax] - dp; newmin = dp; newmax = start[ax]; } curax = axes[ax]; _numberTicks = null; // if aligning this axis, use number of ticks from previous axis. // Do I need to reset somehow if alignTicks is changed and then graph is replotted?? if (curax.alignTicks) { if (curax.name === 'x2axis' && plot.axes.xaxis.show) { _numberTicks = plot.axes.xaxis.numberTicks; } else if (curax.name.charAt(0) === 'y' && curax.name !== 'yaxis' && curax.name !== 'yMidAxis' && plot.axes.yaxis.show) { _numberTicks = plot.axes.yaxis.numberTicks; } } if (this.looseZoom && (axes[ax].renderer.constructor === $.jqplot.LinearAxisRenderer || axes[ax].renderer.constructor === $.jqplot.LogAxisRenderer )) { //} || axes[ax].renderer.constructor === $.jqplot.DateAxisRenderer)) { ret = $.jqplot.LinearTickGenerator(newmin, newmax, curax._scalefact, _numberTicks); // if new minimum is less than "true" minimum of axis display, adjust it if (axes[ax].tickInset && ret[0] < axes[ax].min + axes[ax].tickInset * axes[ax].tickInterval) { ret[0] += ret[4]; ret[2] -= 1; } // if new maximum is greater than "true" max of axis display, adjust it if (axes[ax].tickInset && ret[1] > axes[ax].max - axes[ax].tickInset * axes[ax].tickInterval) { ret[1] -= ret[4]; ret[2] -= 1; } // for log axes, don't fall below current minimum, this will look bad and can't have 0 in range anyway. if (axes[ax].renderer.constructor === $.jqplot.LogAxisRenderer && ret[0] < axes[ax].min) { // remove a tick and shift min up ret[0] += ret[4]; ret[2] -= 1; } axes[ax].min = ret[0]; axes[ax].max = ret[1]; axes[ax]._autoFormatString = ret[3]; axes[ax].numberTicks = ret[2]; axes[ax].tickInterval = ret[4]; // for date axes... axes[ax].daTickInterval = [ret[4]/1000, 'seconds']; } else { axes[ax].min = newmin; axes[ax].max = newmax; axes[ax].tickInterval = null; axes[ax].numberTicks = null; // for date axes... axes[ax].daTickInterval = null; } axes[ax]._ticks = []; } } // if ((c.constrainZoomTo == 'x' && ax.charAt(0) == 'y' && c.autoscaleConstraint) || (c.constrainZoomTo == 'y' && ax.charAt(0) == 'x' && c.autoscaleConstraint)) { // dp = datapos[ax]; // if (dp != null) { // axes[ax].max == null; // axes[ax].min = null; // } // } } ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); plot.redraw(); c._zoom.isZoomed = true; ctx = null; } plot.target.trigger('jqplotZoom', [gridpos, datapos, plot, cursor]); } }; $.jqplot.preInitHooks.push($.jqplot.Cursor.init); $.jqplot.postDrawHooks.push($.jqplot.Cursor.postDraw); function updateTooltip(gridpos, datapos, plot) { var c = plot.plugins.cursor; var s = ''; var addbr = false; if (c.showTooltipGridPosition) { s = gridpos.x+', '+gridpos.y; addbr = true; } if (c.showTooltipUnitPosition) { var g; for (var i=0; i0; n--) { axis = an[n-1]; if (ax[axis].show) { dataPos[axis] = ax[axis].series_p2u(gridPos[axis.charAt(0)]); } } return {offsets:go, gridPos:gridPos, dataPos:dataPos}; } function handleZoomMove(ev) { var plot = ev.data.plot; var c = plot.plugins.cursor; // don't do anything if not on grid. if (c.show && c.zoom && c._zoom.started && !c.zoomTarget) { var ctx = c.zoomCanvas._ctx; var positions = getEventPosition(ev); var gridpos = positions.gridPos; var datapos = positions.dataPos; c._zoom.gridpos = gridpos; c._zoom.datapos = datapos; c._zoom.zooming = true; var xpos = gridpos.x; var ypos = gridpos.y; var height = ctx.canvas.height; var width = ctx.canvas.width; if (c.showTooltip && !c.onGrid && c.showTooltipOutsideZoom) { updateTooltip(gridpos, datapos, plot); if (c.followMouse) { moveTooltip(gridpos, plot); } } if (c.constrainZoomTo == 'x') { c._zoom.end = [xpos, height]; } else if (c.constrainZoomTo == 'y') { c._zoom.end = [width, ypos]; } else { c._zoom.end = [xpos, ypos]; } var sel = window.getSelection; if (document.selection && document.selection.empty) { document.selection.empty(); } else if (sel && !sel().isCollapsed) { sel().collapse(); } drawZoomBox.call(c); ctx = null; } } function handleMouseDown(ev, gridpos, datapos, neighbor, plot) { var c = plot.plugins.cursor; $(document).one('mouseup.jqplot_cursor', {plot:plot}, handleMouseUp); var axes = plot.axes; if (document.onselectstart != undefined) { c._oldHandlers.onselectstart = document.onselectstart; document.onselectstart = function () { return false; }; } if (document.ondrag != undefined) { c._oldHandlers.ondrag = document.ondrag; document.ondrag = function () { return false; }; } if (document.onmousedown != undefined) { c._oldHandlers.onmousedown = document.onmousedown; document.onmousedown = function () { return false; }; } if (c.zoom) { if (!c.zoomProxy) { var ctx = c.zoomCanvas._ctx; ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); ctx = null; } if (c.constrainZoomTo == 'x') { c._zoom.start = [gridpos.x, 0]; } else if (c.constrainZoomTo == 'y') { c._zoom.start = [0, gridpos.y]; } else { c._zoom.start = [gridpos.x, gridpos.y]; } c._zoom.started = true; for (var ax in datapos) { // get zoom starting position. c._zoom.axes.start[ax] = datapos[ax]; } $(document).bind('mousemove.jqplotCursor', {plot:plot}, handleZoomMove); } } function handleMouseUp(ev) { var plot = ev.data.plot; var c = plot.plugins.cursor; if (c.zoom && c._zoom.zooming && !c.zoomTarget) { var xpos = c._zoom.gridpos.x; var ypos = c._zoom.gridpos.y; var datapos = c._zoom.datapos; var height = c.zoomCanvas._ctx.canvas.height; var width = c.zoomCanvas._ctx.canvas.width; var axes = plot.axes; if (c.constrainOutsideZoom && !c.onGrid) { if (xpos < 0) { xpos = 0; } else if (xpos > width) { xpos = width; } if (ypos < 0) { ypos = 0; } else if (ypos > height) { ypos = height; } for (var axis in datapos) { if (datapos[axis]) { if (axis.charAt(0) == 'x') { datapos[axis] = axes[axis].series_p2u(xpos); } else { datapos[axis] = axes[axis].series_p2u(ypos); } } } } if (c.constrainZoomTo == 'x') { ypos = height; } else if (c.constrainZoomTo == 'y') { xpos = width; } c._zoom.end = [xpos, ypos]; c._zoom.gridpos = {x:xpos, y:ypos}; c.doZoom(c._zoom.gridpos, datapos, plot, c); } c._zoom.started = false; c._zoom.zooming = false; $(document).unbind('mousemove.jqplotCursor', handleZoomMove); if (document.onselectstart != undefined && c._oldHandlers.onselectstart != null){ document.onselectstart = c._oldHandlers.onselectstart; c._oldHandlers.onselectstart = null; } if (document.ondrag != undefined && c._oldHandlers.ondrag != null){ document.ondrag = c._oldHandlers.ondrag; c._oldHandlers.ondrag = null; } if (document.onmousedown != undefined && c._oldHandlers.onmousedown != null){ document.onmousedown = c._oldHandlers.onmousedown; c._oldHandlers.onmousedown = null; } } function drawZoomBox() { var start = this._zoom.start; var end = this._zoom.end; var ctx = this.zoomCanvas._ctx; var l, t, h, w; if (end[0] > start[0]) { l = start[0]; w = end[0] - start[0]; } else { l = end[0]; w = start[0] - end[0]; } if (end[1] > start[1]) { t = start[1]; h = end[1] - start[1]; } else { t = end[1]; h = start[1] - end[1]; } ctx.fillStyle = 'rgba(0,0,0,0.2)'; ctx.strokeStyle = '#999999'; ctx.lineWidth = 1.0; ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); ctx.fillRect(0,0,ctx.canvas.width, ctx.canvas.height); ctx.clearRect(l, t, w, h); // IE won't show transparent fill rect, so stroke a rect also. ctx.strokeRect(l,t,w,h); ctx = null; } $.jqplot.CursorLegendRenderer = function(options) { $.jqplot.TableLegendRenderer.call(this, options); this.formatString = '%s'; }; $.jqplot.CursorLegendRenderer.prototype = new $.jqplot.TableLegendRenderer(); $.jqplot.CursorLegendRenderer.prototype.constructor = $.jqplot.CursorLegendRenderer; // called in context of a Legend $.jqplot.CursorLegendRenderer.prototype.draw = function() { if (this._elem) { this._elem.emptyForce(); this._elem = null; } if (this.show) { var series = this._series, s; // make a table. one line label per row. var elem = document.createElement('div'); this._elem = $(elem); elem = null; this._elem.addClass('jqplot-legend jqplot-cursor-legend'); this._elem.css('position', 'absolute'); var pad = false; for (var i = 0; i< series.length; i++) { s = series[i]; if (s.show && s.showLabel) { var lt = $.jqplot.sprintf(this.formatString, s.label.toString()); if (lt) { var color = s.color; if (s._stack && !s.fill) { color = ''; } addrow.call(this, lt, color, pad, i); pad = true; } // let plugins add more rows to legend. Used by trend line plugin. for (var j=0; j<$.jqplot.addLegendRowHooks.length; j++) { var item = $.jqplot.addLegendRowHooks[j].call(this, s); if (item) { addrow.call(this, item.label, item.color, pad); pad = true; } } } } series = s = null; delete series; delete s; } function addrow(label, color, pad, idx) { var rs = (pad) ? this.rowSpacing : '0'; var tr = $('').appendTo(this._elem); tr.data('seriesIndex', idx); $(''+ '
      '+ '
      '+ '
      ').appendTo(tr); var td = $(''); td.appendTo(tr); td.data('seriesIndex', idx); if (this.escapeHtml) { td.text(label); } else { td.html(label); } tr = null; td = null; } return this._elem; }; })(jQuery);ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.canvasAxisTickRenderer.min.js0000644000000000000000000001212711762677020025176 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * * included jsDate library by Chris Leonello: * * Copyright (c) 2010-2011 Chris Leonello * * jsDate is currently available for use in all personal or commercial projects * under both the MIT and GPL version 2.0 licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * jsDate borrows many concepts and ideas from the Date Instance * Methods by Ken Snyder along with some parts of Ken's actual code. * * Ken's origianl Date Instance Methods and copyright notice: * * Ken Snyder (ken d snyder at gmail dot com) * 2008-09-10 * version 2.0.2 (http://kendsnyder.com/sandbox/date/) * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) * * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. * Larry has generously given permission to adapt his code for inclusion * into jqPlot. * * Larry's original code can be found here: * * https://github.com/lsiden/export-jqplot-to-png * * */ (function(a){a.jqplot.CanvasAxisTickRenderer=function(b){this.mark="outside";this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.angle=0;this.markSize=4;this.show=true;this.showLabel=true;this.labelPosition="auto";this.label="";this.value=null;this._styles={};this.formatter=a.jqplot.DefaultTickFormatter;this.formatString="";this.prefix="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="10pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisTickRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisTickRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisTickRenderer.prototype.setTick=function(b,d,c){this.value=b;if(c){this.isMinorTick=true}return this};a.jqplot.CanvasAxisTickRenderer.prototype.draw=function(c,f){if(!this.label){this.label=this.prefix+this.formatter(this.formatString,this.value)}if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e.style.textAlign="left";e.style.position="absolute";e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css(this._styles);this._elem.addClass("jqplot-"+this.axis+"-tick");e=null;return this._elem};a.jqplot.CanvasAxisTickRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery);ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.canvasOverlay.min.js0000644000000000000000000003434611762677020023420 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * * included jsDate library by Chris Leonello: * * Copyright (c) 2010-2011 Chris Leonello * * jsDate is currently available for use in all personal or commercial projects * under both the MIT and GPL version 2.0 licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * jsDate borrows many concepts and ideas from the Date Instance * Methods by Ken Snyder along with some parts of Ken's actual code. * * Ken's origianl Date Instance Methods and copyright notice: * * Ken Snyder (ken d snyder at gmail dot com) * 2008-09-10 * version 2.0.2 (http://kendsnyder.com/sandbox/date/) * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) * * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. * Larry has generously given permission to adapt his code for inclusion * into jqPlot. * * Larry's original code can be found here: * * https://github.com/lsiden/export-jqplot-to-png * * */ (function(d){var f=0;d.jqplot.CanvasOverlay=function(o){var l=o||{};this.options={show:d.jqplot.config.enablePlugins,deferDraw:false};this.objects=[];this.objectNames=[];this.canvas=null;this.markerRenderer=new d.jqplot.MarkerRenderer({style:"line"});this.markerRenderer.init();this.highlightObjectIndex=null;if(l.objects){var q=l.objects,p;for(var m=0;m=0){i=/^\/Date\((-?[0-9]+)\)\/$/.exec(k);if(i){return parseInt(i[1],10)}}return k}}for(var b in g){o=[];n=g[b];switch(b){case"PriceTicks":for(h=0;h-1){return c/this.pt2px}else{if(b.indexOf("pt")>-1){return c}else{if(b.indexOf("em")>-1){return c*12}else{if(b.indexOf("%")>-1){return c*12/100}else{return c/this.pt2px}}}}};a.jqplot.CanvasTextRenderer.prototype.fontWeight2Float=function(b){if(Number(b)){return b/400}else{switch(b){case"normal":return 1;break;case"bold":return 1.75;break;case"bolder":return 2.25;break;case"lighter":return 0.75;break;default:return 1;break}}};a.jqplot.CanvasTextRenderer.prototype.getText=function(){return this.text};a.jqplot.CanvasTextRenderer.prototype.setText=function(c,b){this.text=c;this.setWidth(b);return this};a.jqplot.CanvasTextRenderer.prototype.getWidth=function(b){return this.width};a.jqplot.CanvasTextRenderer.prototype.setWidth=function(c,b){if(!b){this.width=this.measure(c,this.text)}else{this.width=b}return this};a.jqplot.CanvasTextRenderer.prototype.getHeight=function(b){return this.height};a.jqplot.CanvasTextRenderer.prototype.setHeight=function(b){if(!b){this.height=this.normalizedFontSize*this.pt2px}else{this.height=b}return this};a.jqplot.CanvasTextRenderer.prototype.letter=function(b){return this.letters[b]};a.jqplot.CanvasTextRenderer.prototype.ascent=function(){return this.normalizedFontSize};a.jqplot.CanvasTextRenderer.prototype.descent=function(){return 7*this.normalizedFontSize/25};a.jqplot.CanvasTextRenderer.prototype.measure=function(d,g){var f=0;var b=g.length;for(var e=0;e30)?2:2+(30-this.normalizedFontSize)/20;s.lineWidth=t*k*this.fontWeight2Float(this.fontWeight);for(var g=0;g":{width:24,points:[[4,18],[20,9],[4,0]]},"?":{width:18,points:[[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]]},"@":{width:27,points:[[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]]},A:{width:18,points:[[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]]},B:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]]},C:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]]},D:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]]},E:{width:19,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]]},F:{width:18,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]]},G:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]]},H:{width:22,points:[[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]]},I:{width:8,points:[[4,21],[4,0]]},J:{width:16,points:[[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]]},K:{width:21,points:[[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]]},L:{width:17,points:[[4,21],[4,0],[-1,-1],[4,0],[16,0]]},M:{width:24,points:[[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]]},N:{width:22,points:[[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]]},O:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]]},P:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]]},Q:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]]},R:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]]},S:{width:20,points:[[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]]},T:{width:16,points:[[8,21],[8,0],[-1,-1],[1,21],[15,21]]},U:{width:22,points:[[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]]},V:{width:18,points:[[1,21],[9,0],[-1,-1],[17,21],[9,0]]},W:{width:24,points:[[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]]},X:{width:20,points:[[3,21],[17,0],[-1,-1],[17,21],[3,0]]},Y:{width:18,points:[[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]]},Z:{width:20,points:[[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]]},"[":{width:14,points:[[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]]},"\\":{width:14,points:[[0,21],[14,-3]]},"]":{width:14,points:[[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]]},"^":{width:16,points:[[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]]},_:{width:16,points:[[0,-2],[16,-2]]},"`":{width:10,points:[[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]]},a:{width:19,points:[[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},b:{width:19,points:[[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},c:{width:18,points:[[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},d:{width:19,points:[[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},e:{width:18,points:[[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},f:{width:12,points:[[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]]},g:{width:19,points:[[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},h:{width:19,points:[[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},i:{width:8,points:[[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]]},j:{width:10,points:[[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]]},k:{width:17,points:[[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]]},l:{width:8,points:[[4,21],[4,0]]},m:{width:30,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]]},n:{width:19,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},o:{width:19,points:[[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]]},p:{width:19,points:[[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},q:{width:19,points:[[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},r:{width:13,points:[[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]]},s:{width:17,points:[[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]]},t:{width:12,points:[[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]]},u:{width:19,points:[[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]]},v:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0]]},w:{width:22,points:[[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]]},x:{width:17,points:[[3,14],[14,0],[-1,-1],[14,14],[3,0]]},y:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]]},z:{width:17,points:[[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]]},"{":{width:14,points:[[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]]},"|":{width:8,points:[[4,25],[4,-7]]},"}":{width:14,points:[[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]]},"~":{width:24,points:[[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]]}};a.jqplot.CanvasFontRenderer=function(b){b=b||{};if(!b.pt2px){b.pt2px=1.5}a.jqplot.CanvasTextRenderer.call(this,b)};a.jqplot.CanvasFontRenderer.prototype=new a.jqplot.CanvasTextRenderer({});a.jqplot.CanvasFontRenderer.prototype.constructor=a.jqplot.CanvasFontRenderer;a.jqplot.CanvasFontRenderer.prototype.measure=function(c,e){var d=this.fontSize+" "+this.fontFamily;c.save();c.font=d;var b=c.measureText(e).width;c.restore();return b};a.jqplot.CanvasFontRenderer.prototype.draw=function(e,g){var c=0;var h=this.height*0.72;e.save();var d,b;if((-Math.PI/2<=this.angle&&this.angle<=0)||(Math.PI*3/2<=this.angle&&this.angle<=Math.PI*2)){d=0;b=-Math.sin(this.angle)*this.width}else{if((0c.max||c.max==null){c.max=k[e][0]}}else{if(k[e][1]c.max||c.max==null){c.max=k[e][1]}}}}else{if(this.name=="xaxis"||this.name=="x2axis"){if(k[0][0]c.max||c.max==null){c.max=k[0][0]}for(var e=0;e<5;e+=2){if(k[1][e]c.max||c.max==null){c.max=k[1][e]}}}else{if(k[0][1]c.max||c.max==null){c.max=k[0][1]}for(var e=1;e<6;e+=2){if(k[1][e]c.max||c.max==null){c.max=k[1][e]}}}}}};function a(g,f,d){d=d||{};d.axesDefaults=b.extend(true,{pad:0},d.axesDefaults);d.legend=b.extend(true,{placement:"outside"},d.legend);var c=false;if(d.seriesDefaults.renderer==b.jqplot.BezierCurveRenderer){c=true}else{if(d.series){for(var e=0;e class. $.jqplot.PyramidGridRenderer = function(){ $.jqplot.CanvasGridRenderer.call(this); }; $.jqplot.PyramidGridRenderer.prototype = new $.jqplot.CanvasGridRenderer(); $.jqplot.PyramidGridRenderer.prototype.constructor = $.jqplot.PyramidGridRenderer; // called with context of Grid object $.jqplot.CanvasGridRenderer.prototype.init = function(options) { this._ctx; this.plotBands = { show: false, color: 'rgb(230, 219, 179)', axis: 'y', start: null, interval: 10 }; $.extend(true, this, options); // set the shadow renderer options var sopts = {lineJoin:'miter', lineCap:'round', fill:false, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.shadowWidth, closePath:false, strokeStyle:this.shadowColor}; this.renderer.shadowRenderer.init(sopts); }; $.jqplot.PyramidGridRenderer.prototype.draw = function() { this._ctx = this._elem.get(0).getContext("2d"); var ctx = this._ctx; var axes = this._axes; var xp = axes.xaxis.u2p; var yp = axes.yMidAxis.u2p; var xnudge = axes.xaxis.max/1000.0; var xp0 = xp(0); var xpn = xp(xnudge); var ax = ['xaxis', 'yaxis', 'x2axis', 'y2axis','yMidAxis']; // Add the grid onto the grid canvas. This is the bottom most layer. ctx.save(); ctx.clearRect(0, 0, this._plotDimensions.width, this._plotDimensions.height); ctx.fillStyle = this.backgroundColor || this.background; ctx.fillRect(this._left, this._top, this._width, this._height); if (this.plotBands.show) { ctx.save(); var pb = this.plotBands; ctx.fillStyle = pb.color; var axis; var x, y, w, h; // find axis to work with if (pb.axis.charAt(0) === 'x') { if (axes.xaxis.show) { axis = axes.xaxis; } } else if (pb.axis.charAt(0) === 'y') { if (axes.yaxis.show) { axis = axes.yaxis; } else if (axes.y2axis.show) { axis = axes.y2axis; } else if (axes.yMidAxis.show) { axis = axes.yMidAxis; } } if (axis !== undefined) { // draw some rectangles var start = pb.start; if (start === null) { start = axis.min; } for (var i = start; i < axis.max; i += 2 * pb.interval) { if (axis.name.charAt(0) === 'y') { x = this._left; y = axis.series_u2p(i + pb.interval) + this._top; w = this._right - this._left; h = axis.series_u2p(start) - axis.series_u2p(start + pb.interval); ctx.fillRect(x, y, w, h); } // else { // y = 0; // x = axis.series_u2p(i); // h = this._height; // w = axis.series_u2p(start + pb.interval) - axis.series_u2p(start); // } } } ctx.restore(); } ctx.save(); ctx.lineJoin = 'miter'; ctx.lineCap = 'butt'; ctx.lineWidth = this.gridLineWidth; ctx.strokeStyle = this.gridLineColor; var b, e, s, m; for (var i=5; i>0; i--) { var name = ax[i-1]; var axis = axes[name]; var ticks = axis._ticks; var numticks = ticks.length; if (axis.show) { if (axis.drawBaseline) { var bopts = {}; if (axis.baselineWidth !== null) { bopts.lineWidth = axis.baselineWidth; } if (axis.baselineColor !== null) { bopts.strokeStyle = axis.baselineColor; } switch (name) { case 'xaxis': if (axes.yMidAxis.show) { drawLine (this._left, this._bottom, xp0, this._bottom, bopts); drawLine (xpn, this._bottom, this._right, this._bottom, bopts); } else { drawLine (this._left, this._bottom, this._right, this._bottom, bopts); } break; case 'yaxis': drawLine (this._left, this._bottom, this._left, this._top, bopts); break; case 'yMidAxis': drawLine(xp0, this._bottom, xp0, this._top, bopts); drawLine(xpn, this._bottom, xpn, this._top, bopts); break; case 'x2axis': if (axes.yMidAxis.show) { drawLine (this._left, this._top, xp0, this._top, bopts); drawLine (xpn, this._top, this._right, this._top, bopts); } else { drawLine (this._left, this._bottom, this._right, this._bottom, bopts); } break; case 'y2axis': drawLine (this._right, this._bottom, this._right, this._top, bopts); break; } } for (var j=numticks; j>0; j--) { var t = ticks[j-1]; if (t.show) { var pos = Math.round(axis.u2p(t.value)) + 0.5; switch (name) { case 'xaxis': // draw the grid line if we should if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { drawLine(pos, this._top, pos, this._bottom); } // draw the mark if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { s = t.markSize; m = t.mark; var pos = Math.round(axis.u2p(t.value)) + 0.5; switch (m) { case 'outside': b = this._bottom; e = this._bottom+s; break; case 'inside': b = this._bottom-s; e = this._bottom; break; case 'cross': b = this._bottom-s; e = this._bottom+s; break; default: b = this._bottom; e = this._bottom+s; break; } // draw the shadow if (this.shadow) { this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false}); } // draw the line drawLine(pos, b, pos, e); } break; case 'yaxis': // draw the grid line if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { drawLine(this._right, pos, this._left, pos); } // draw the mark if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { s = t.markSize; m = t.mark; var pos = Math.round(axis.u2p(t.value)) + 0.5; switch (m) { case 'outside': b = this._left-s; e = this._left; break; case 'inside': b = this._left; e = this._left+s; break; case 'cross': b = this._left-s; e = this._left+s; break; default: b = this._left-s; e = this._left; break; } // draw the shadow if (this.shadow) { this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); } drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); } break; case 'yMidAxis': // draw the grid line if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { drawLine(this._left, pos, xp0, pos); drawLine(xpn, pos, this._right, pos); } // draw the mark if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { s = t.markSize; m = t.mark; var pos = Math.round(axis.u2p(t.value)) + 0.5; b = xp0; e = xp0 + s; // draw the shadow if (this.shadow) { this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); } drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); b = xpn - s; e = xpn; // draw the shadow if (this.shadow) { this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); } drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); } break; case 'x2axis': // draw the grid line if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { drawLine(pos, this._bottom, pos, this._top); } // draw the mark if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { s = t.markSize; m = t.mark; var pos = Math.round(axis.u2p(t.value)) + 0.5; switch (m) { case 'outside': b = this._top-s; e = this._top; break; case 'inside': b = this._top; e = this._top+s; break; case 'cross': b = this._top-s; e = this._top+s; break; default: b = this._top-s; e = this._top; break; } // draw the shadow if (this.shadow) { this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false}); } drawLine(pos, b, pos, e); } break; case 'y2axis': // draw the grid line if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { drawLine(this._left, pos, this._right, pos); } // draw the mark if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { s = t.markSize; m = t.mark; var pos = Math.round(axis.u2p(t.value)) + 0.5; switch (m) { case 'outside': b = this._right; e = this._right+s; break; case 'inside': b = this._right-s; e = this._right; break; case 'cross': b = this._right-s; e = this._right+s; break; default: b = this._right; e = this._right+s; break; } // draw the shadow if (this.shadow) { this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); } drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); } break; default: break; } } } t = null; } axis = null; ticks = null; } ctx.restore(); function drawLine(bx, by, ex, ey, opts) { ctx.save(); opts = opts || {}; if (opts.lineWidth == null || opts.lineWidth != 0){ $.extend(true, ctx, opts); ctx.beginPath(); ctx.moveTo(bx, by); ctx.lineTo(ex, ey); ctx.stroke(); } ctx.restore(); } if (this.shadow) { if (axes.yMidAxis.show) { var points = [[this._left, this._bottom], [xp0, this._bottom]]; this.renderer.shadowRenderer.draw(ctx, points); var points = [[xpn, this._bottom], [this._right, this._bottom], [this._right, this._top]]; this.renderer.shadowRenderer.draw(ctx, points); var points = [[xp0, this._bottom], [xp0, this._top]]; this.renderer.shadowRenderer.draw(ctx, points); } else { var points = [[this._left, this._bottom], [this._right, this._bottom], [this._right, this._top]]; this.renderer.shadowRenderer.draw(ctx, points); } } // Now draw border around grid. Use axis border definitions. start at // upper left and go clockwise. if (this.borderWidth != 0 && this.drawBorder) { if (axes.yMidAxis.show) { drawLine (this._left, this._top, xp0, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth}); drawLine (xpn, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth}); drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth}); drawLine (this._right, this._bottom, xpn, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth}); drawLine (xp0, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth}); drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth}); drawLine (xp0, this._bottom, xp0, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth}); drawLine (xpn, this._bottom, xpn, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth}); } else { drawLine (this._left, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth}); drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth}); drawLine (this._right, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth}); drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth}); } } // ctx.lineWidth = this.borderWidth; // ctx.strokeStyle = this.borderColor; // ctx.strokeRect(this._left, this._top, this._width, this._height); ctx.restore(); ctx = null; axes = null; }; })(jQuery); ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.meterGaugeRenderer.js0000644000000000000000000012354711762677020023577 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * */ (function($) { /** * Class: $.jqplot.MeterGaugeRenderer * Plugin renderer to draw a meter gauge chart. * * Data consists of a single series with 1 data point to position the gauge needle. * * To use this renderer, you need to include the * meter gauge renderer plugin, for example: * * > * * Properties described here are passed into the $.jqplot function * as options on the series renderer. For example: * * > plot0 = $.jqplot('chart0',[[18]],{ * > title: 'Network Speed', * > seriesDefaults: { * > renderer: $.jqplot.MeterGaugeRenderer, * > rendererOptions: { * > label: 'MB/s' * > } * > } * > }); * * A meterGauge plot does not support events. */ $.jqplot.MeterGaugeRenderer = function(){ $.jqplot.LineRenderer.call(this); }; $.jqplot.MeterGaugeRenderer.prototype = new $.jqplot.LineRenderer(); $.jqplot.MeterGaugeRenderer.prototype.constructor = $.jqplot.MeterGaugeRenderer; // called with scope of a series $.jqplot.MeterGaugeRenderer.prototype.init = function(options) { // Group: Properties // // prop: diameter // Outer diameter of the meterGauge, auto computed by default this.diameter = null; // prop: padding // padding between the meterGauge and plot edges, auto // calculated by default. this.padding = null; // prop: shadowOffset // offset of the shadow from the gauge ring and offset of // each succesive stroke of the shadow from the last. this.shadowOffset = 2; // prop: shadowAlpha // transparency of the shadow (0 = transparent, 1 = opaque) this.shadowAlpha = 0.07; // prop: shadowDepth // number of strokes to apply to the shadow, // each stroke offset shadowOffset from the last. this.shadowDepth = 4; // prop: background // background color of the inside of the gauge. this.background = "#efefef"; // prop: ringColor // color of the outer ring, hub, and needle of the gauge. this.ringColor = "#BBC6D0"; // needle color not implemented yet. this.needleColor = "#C3D3E5"; // prop: tickColor // color of the tick marks around the gauge. this.tickColor = "989898"; // prop: ringWidth // width of the ring around the gauge. Auto computed by default. this.ringWidth = null; // prop: min // Minimum value on the gauge. Auto computed by default this.min; // prop: max // Maximum value on the gauge. Auto computed by default this.max; // prop: ticks // Array of tick values. Auto computed by default. this.ticks = []; // prop: showTicks // true to show ticks around gauge. this.showTicks = true; // prop: showTickLabels // true to show tick labels next to ticks. this.showTickLabels = true; // prop: label // A gauge label like 'kph' or 'Volts' this.label = null; // prop: labelHeightAdjust // Number of Pixels to offset the label up (-) or down (+) from its default position. this.labelHeightAdjust = 0; // prop: labelPosition // Where to position the label, either 'inside' or 'bottom'. this.labelPosition = 'inside'; // prop: intervals // Array of ranges to be drawn around the gauge. // Array of form: // > [value1, value2, ...] // indicating the values for the first, second, ... intervals. this.intervals = []; // prop: intervalColors // Array of colors to use for the intervals. this.intervalColors = [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"]; // prop: intervalInnerRadius // Radius of the inner circle of the interval ring. this.intervalInnerRadius = null; // prop: intervalOuterRadius // Radius of the outer circle of the interval ring. this.intervalOuterRadius = null; this.tickRenderer = $.jqplot.MeterGaugeTickRenderer; // ticks spaced every 1, 2, 2.5, 5, 10, 20, .1, .2, .25, .5, etc. this.tickPositions = [1, 2, 2.5, 5, 10]; // prop: tickSpacing // Degrees between ticks. This is a target number, if // incompatible span and ticks are supplied, a suitable // spacing close to this value will be computed. this.tickSpacing = 30; this.numberMinorTicks = null; // prop: hubRadius // Radius of the hub at the bottom center of gauge which the needle attaches to. // Auto computed by default this.hubRadius = null; // prop: tickPadding // padding of the tick marks to the outer ring and the tick labels to marks. // Auto computed by default. this.tickPadding = null; // prop: needleThickness // Maximum thickness the needle. Auto computed by default. this.needleThickness = null; // prop: needlePad // Padding between needle and inner edge of the ring when the needle is at the min or max gauge value. this.needlePad = 6; // prop: pegNeedle // True will stop needle just below/above the min/max values if data is below/above min/max, // as if the meter is "pegged". this.pegNeedle = true; this._type = 'meterGauge'; $.extend(true, this, options); this.type = null; this.numberTicks = null; this.tickInterval = null; // span, the sweep (in degrees) from min to max. This gauge is // a semi-circle. this.span = 180; // get rid of this nonsense // this.innerSpan = this.span; if (this.type == 'circular') { this.semiCircular = false; } else if (this.type != 'circular') { this.semiCircular = true; } else { this.semiCircular = (this.span <= 180) ? true : false; } this._tickPoints = []; // reference to label element. this._labelElem = null; // start the gauge at the beginning of the span this.startAngle = (90 + (360 - this.span)/2) * Math.PI/180; this.endAngle = (90 - (360 - this.span)/2) * Math.PI/180; this.setmin = !!(this.min == null); this.setmax = !!(this.max == null); // if given intervals and is an array of values, create labels and colors. if (this.intervals.length) { if (this.intervals[0].length == null || this.intervals.length == 1) { for (var i=0; i= this.data[0][1]) { this.max = this.intervals[this.intervals.length-1][0]; this.setmax = false; } } else { this.setmax = false; } } else { // no ticks and no intervals supplied, put needle in middle this.min = (this.min == null) ? 0 : this.min; this.setmin = false; if (this.max == null) { this.max = this.data[0][1] * 1.25; this.setmax = true; } else { this.setmax = false; } } }; $.jqplot.MeterGaugeRenderer.prototype.setGridData = function(plot) { // set gridData property. This will hold angle in radians of each data point. var stack = []; var td = []; var sa = this.startAngle; for (var i=0; i0) { stack[i] += stack[i-1]; } } var fact = Math.PI*2/stack[stack.length - 1]; for (var i=0; i0) { stack[i] += stack[i-1]; } } var fact = Math.PI*2/stack[stack.length - 1]; for (var i=0; i=0; i--) { temp = interval/(pos[i] * Math.pow(10, fact)); if (temp == 4 || temp == 5) { return temp - 1; } } return null; } // called with scope of series $.jqplot.MeterGaugeRenderer.prototype.draw = function (ctx, gd, options) { var i; var opts = (options != undefined) ? options : {}; // offset and direction of offset due to legend placement var offx = 0; var offy = 0; var trans = 1; if (options.legendInfo && options.legendInfo.placement == 'inside') { var li = options.legendInfo; switch (li.location) { case 'nw': offx = li.width + li.xoffset; break; case 'w': offx = li.width + li.xoffset; break; case 'sw': offx = li.width + li.xoffset; break; case 'ne': offx = li.width + li.xoffset; trans = -1; break; case 'e': offx = li.width + li.xoffset; trans = -1; break; case 'se': offx = li.width + li.xoffset; trans = -1; break; case 'n': offy = li.height + li.yoffset; break; case 's': offy = li.height + li.yoffset; trans = -1; break; default: break; } } // pre-draw so can get it's dimensions. if (this.label) { this._labelElem = $('
      '+this.label+'
      '); this.canvas._elem.after(this._labelElem); } var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine; var fill = (opts.fill != undefined) ? opts.fill : this.fill; var cw = ctx.canvas.width; var ch = ctx.canvas.height; if (this.padding == null) { this.padding = Math.round(Math.min(cw, ch)/30); } var w = cw - offx - 2 * this.padding; var h = ch - offy - 2 * this.padding; if (this.labelPosition == 'bottom' && this.label) { h -= this._labelElem.outerHeight(true); } var mindim = Math.min(w,h); var d = mindim; if (!this.diameter) { if (this.semiCircular) { if ( w >= 2*h) { if (!this.ringWidth) { this.ringWidth = 2*h/35; } this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8); this.innerPad = this.ringWidth/2 + this.needleThickness/2 + this.needlePad; this.diameter = 2 * (h - 2*this.innerPad); } else { if (!this.ringWidth) { this.ringWidth = w/35; } this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8); this.innerPad = this.ringWidth/2 + this.needleThickness/2 + this.needlePad; this.diameter = w - 2*this.innerPad - this.ringWidth - this.padding; } // center taking into account legend and over draw for gauge bottom below hub. // this will be center of hub. this._center = [(cw - trans * offx)/2 + trans * offx, (ch + trans*offy - this.padding - this.ringWidth - this.innerPad)]; } else { if (!this.ringWidth) { this.ringWidth = d/35; } this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8); this.innerPad = 0; this.diameter = d - this.ringWidth; // center in middle of canvas taking into account legend. // will be center of hub. this._center = [(cw-trans*offx)/2 + trans * offx, (ch-trans*offy)/2 + trans * offy]; } } if (this._labelElem && this.labelPosition == 'bottom') { this._center[1] -= this._labelElem.outerHeight(true); } this._radius = this.diameter/2; this.tickSpacing = 6000/this.diameter; if (!this.hubRadius) { this.hubRadius = this.diameter/18; } this.shadowOffset = 0.5 + this.ringWidth/9; this.shadowWidth = this.ringWidth*1; this.tickPadding = 3 + Math.pow(this.diameter/20, 0.7); this.tickOuterRadius = this._radius - this.ringWidth/2 - this.tickPadding; this.tickLength = (this.showTicks) ? this._radius/13 : 0; if (this.ticks.length == 0) { // no ticks, lets make some. var max = this.max, min = this.min, setmax = this.setmax, setmin = this.setmin, ti = (max - min) * this.tickSpacing / this.span; var tf = Math.floor(parseFloat((Math.log(ti)/Math.log(10)).toFixed(11))); var tp = (ti/Math.pow(10, tf)); (tp > 2 && tp <= 2.5) ? tp = 2.5 : tp = Math.ceil(tp); var t = this.tickPositions; var tpindex, nt; for (i=0; i 0) ? min - min % ti : min - min % ti - ti; if (!this.forceZero) { var diff = Math.min(min - tmin, 0.8*ti); var ntp = Math.floor(diff/t[tpindex]); if (ntp > 1) { tmin = tmin + t[tpindex] * (ntp-1); if (parseInt(tmin, 10) != tmin && parseInt(tmin-t[tpindex], 10) == tmin-t[tpindex]) { tmin = tmin - t[tpindex]; } } } if (min == tmin) { min -= ti; } else { // tmin should always be lower than dataMin if (min - tmin > 0.23*ti) { min = tmin; } else { min = tmin -ti; nt += 1; } } nt += 1; var tmax = min + (nt - 1) * ti; if (max >= tmax) { tmax += ti; nt += 1; } // now tmax should always be mroe than dataMax if (tmax - max < 0.23*ti) { tmax += ti; nt += 1; } this.max = max = tmax; this.min = min; this.tickInterval = ti; this.numberTicks = nt; var it; for (i=0; i= tmax) { max = tmax + ti; nt += 1; } else { max = tmax; } this.tickInterval = this.tickInterval || ti; this.numberTicks = this.numberTicks || nt; var it; for (i=0; i 1) { var rstr = String(range); if (rstr.search(/\./) == -1) { var pos = rstr.search(/0+$/); nonSigDigits = (pos > 0) ? rstr.length - pos - 1 : 0; } } sigRange = range/Math.pow(10, nonSigDigits); for (i=0; i'+this.ticks[i][1]+''); this.canvas._elem.after(elem); ew = elem.outerWidth(true); eh = elem.outerHeight(true); l = this._tickPoints[i][0] - ew * (this._tickPoints[i][2]-Math.PI)/Math.PI - tp * Math.cos(this._tickPoints[i][2]); t = this._tickPoints[i][1] - eh/2 + eh/2 * Math.pow(Math.abs((Math.sin(this._tickPoints[i][2]))), 0.5) + tp/3 * Math.pow(Math.abs((Math.sin(this._tickPoints[i][2]))), 0.5) ; // t = this._tickPoints[i][1] - eh/2 - eh/2 * Math.sin(this._tickPoints[i][2]) - tp/2 * Math.sin(this._tickPoints[i][2]); elem.css({left:l, top:t}); dim = ew*Math.cos(this._tickPoints[i][2]) + eh*Math.sin(Math.PI/2+this._tickPoints[i][2]/2); maxdim = (dim > maxdim) ? dim : maxdim; } } // draw the gauge label if (this.label && this.labelPosition == 'inside') { var l = this._center[0] + this.canvas._offsets.left; var tp = this.tickPadding * (1 - 1/(this.diameter/80+1)); var t = 0.5*(this._center[1] + this.canvas._offsets.top - this.hubRadius) + 0.5*(this._center[1] + this.canvas._offsets.top - this.tickOuterRadius + this.tickLength + tp) + this.labelHeightAdjust; // this._labelElem = $('
      '+this.label+'
      '); // this.canvas._elem.after(this._labelElem); l -= this._labelElem.outerWidth(true)/2; t -= this._labelElem.outerHeight(true)/2; this._labelElem.css({left:l, top:t}); } else if (this.label && this.labelPosition == 'bottom') { var l = this._center[0] + this.canvas._offsets.left - this._labelElem.outerWidth(true)/2; var t = this._center[1] + this.canvas._offsets.top + this.innerPad + + this.ringWidth + this.padding + this.labelHeightAdjust; this._labelElem.css({left:l, top:t}); } // draw the intervals ctx.save(); var inner = this.intervalInnerRadius || this.hubRadius * 1.5; if (this.intervalOuterRadius == null) { if (this.showTickLabels) { var outer = (this.tickOuterRadius - this.tickLength - this.tickPadding - this.diameter/8); } else { var outer = (this.tickOuterRadius - this.tickLength - this.diameter/16); } } else { var outer = this.intervalOuterRadius; } var range = this.max - this.min; var intrange = this.intervals[this.intervals.length-1] - this.min; var start, end, span = this.span*Math.PI/180; for (i=0; i this.max + dataspan*3/this.span) { datapoint = this.max + dataspan*3/this.span; } if (this.data[0][1] < this.min - dataspan*3/this.span) { datapoint = this.min - dataspan*3/this.span; } } var dataang = (datapoint - this.min)/dataspan * this.span * Math.PI/180 + this.startAngle; ctx.save(); ctx.beginPath(); ctx.fillStyle = this.ringColor; ctx.strokeStyle = this.ringColor; this.needleLength = (this.tickOuterRadius - this.tickLength) * 0.85; this.needleThickness = (this.needleThickness < 2) ? 2 : this.needleThickness; var endwidth = this.needleThickness * 0.4; var dl = this.needleLength/10; var dt = (this.needleThickness - endwidth)/10; var templ; for (var i=0; i<10; i++) { templ = this.needleThickness - i*dt; ctx.moveTo(dl*i*Math.cos(dataang), dl*i*Math.sin(dataang)); ctx.lineWidth = templ; ctx.lineTo(dl*(i+1)*Math.cos(dataang), dl*(i+1)*Math.sin(dataang)); ctx.stroke(); } ctx.restore(); } else { this._center = [(cw - trans * offx)/2 + trans * offx, (ch - trans*offy)/2 + trans * offy]; } }; $.jqplot.MeterGaugeAxisRenderer = function() { $.jqplot.LinearAxisRenderer.call(this); }; $.jqplot.MeterGaugeAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); $.jqplot.MeterGaugeAxisRenderer.prototype.constructor = $.jqplot.MeterGaugeAxisRenderer; // There are no traditional axes on a gauge chart. We just need to provide // dummy objects with properties so the plot will render. // called with scope of axis object. $.jqplot.MeterGaugeAxisRenderer.prototype.init = function(options){ // this.tickRenderer = $.jqplot.MeterGaugeTickRenderer; $.extend(true, this, options); // I don't think I'm going to need _dataBounds here. // have to go Axis scaling in a way to fit chart onto plot area // and provide u2p and p2u functionality for mouse cursor, etc. // for convienence set _dataBounds to 0 and 100 and // set min/max to 0 and 100. this._dataBounds = {min:0, max:100}; this.min = 0; this.max = 100; this.showTicks = false; this.ticks = []; this.showMark = false; this.show = false; }; $.jqplot.MeterGaugeLegendRenderer = function(){ $.jqplot.TableLegendRenderer.call(this); }; $.jqplot.MeterGaugeLegendRenderer.prototype = new $.jqplot.TableLegendRenderer(); $.jqplot.MeterGaugeLegendRenderer.prototype.constructor = $.jqplot.MeterGaugeLegendRenderer; /** * Class: $.jqplot.MeterGaugeLegendRenderer *Meter gauges don't typically have a legend, this overrides the default legend renderer. */ $.jqplot.MeterGaugeLegendRenderer.prototype.init = function(options) { // Maximum number of rows in the legend. 0 or null for unlimited. this.numberRows = null; // Maximum number of columns in the legend. 0 or null for unlimited. this.numberColumns = null; $.extend(true, this, options); }; // called with context of legend $.jqplot.MeterGaugeLegendRenderer.prototype.draw = function() { if (this.show) { var series = this._series; var ss = 'position:absolute;'; ss += (this.background) ? 'background:'+this.background+';' : ''; ss += (this.border) ? 'border:'+this.border+';' : ''; ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : ''; ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : ''; ss += (this.textColor) ? 'color:'+this.textColor+';' : ''; ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : ''; ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : ''; ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : ''; ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : ''; this._elem = $('
      '); // MeterGauge charts legends don't go by number of series, but by number of data points // in the series. Refactor things here for that. var pad = false, reverse = false, nr, nc; var s = series[0]; if (s.show) { var pd = s.data; if (this.numberRows) { nr = this.numberRows; if (!this.numberColumns){ nc = Math.ceil(pd.length/nr); } else{ nc = this.numberColumns; } } else if (this.numberColumns) { nc = this.numberColumns; nr = Math.ceil(pd.length/this.numberColumns); } else { nr = pd.length; nc = 1; } var i, j, tr, td1, td2, lt, rs, color; var idx = 0; for (i=0; i').prependTo(this._elem); } else{ tr = $('').appendTo(this._elem); } for (j=0; j0){ pad = true; } else{ pad = false; } } else{ if (i == nr -1){ pad = false; } else{ pad = true; } } rs = (pad) ? this.rowSpacing : '0'; td1 = $(''+ '
      '+ '
      '); td2 = $(''); if (this.escapeHtml){ td2.text(lt); } else { td2.html(lt); } if (reverse) { td2.prependTo(tr); td1.prependTo(tr); } else { td1.appendTo(tr); td2.appendTo(tr); } pad = true; } idx++; } } } } return this._elem; }; // setup default renderers for axes and legend so user doesn't have to // called with scope of plot function preInit(target, data, options) { // debugger options = options || {}; options.axesDefaults = options.axesDefaults || {}; options.legend = options.legend || {}; options.seriesDefaults = options.seriesDefaults || {}; options.grid = options.grid || {}; // only set these if there is a gauge series var setopts = false; if (options.seriesDefaults.renderer == $.jqplot.MeterGaugeRenderer) { setopts = true; } else if (options.series) { for (var i=0; i < options.series.length; i++) { if (options.series[i].renderer == $.jqplot.MeterGaugeRenderer) { setopts = true; } } } if (setopts) { options.axesDefaults.renderer = $.jqplot.MeterGaugeAxisRenderer; options.legend.renderer = $.jqplot.MeterGaugeLegendRenderer; options.legend.preDraw = true; options.grid.background = options.grid.background || 'white'; options.grid.drawGridlines = false; options.grid.borderWidth = (options.grid.borderWidth != null) ? options.grid.borderWidth : 0; options.grid.shadow = (options.grid.shadow != null) ? options.grid.shadow : false; } } // called with scope of plot function postParseOptions(options) { // } $.jqplot.preInitHooks.push(preInit); $.jqplot.postParseOptionsHooks.push(postParseOptions); $.jqplot.MeterGaugeTickRenderer = function() { $.jqplot.AxisTickRenderer.call(this); }; $.jqplot.MeterGaugeTickRenderer.prototype = new $.jqplot.AxisTickRenderer(); $.jqplot.MeterGaugeTickRenderer.prototype.constructor = $.jqplot.MeterGaugeTickRenderer; })(jQuery); ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.pieRenderer.js0000644000000000000000000010507411762677020022262 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * */ (function($) { /** * Class: $.jqplot.PieRenderer * Plugin renderer to draw a pie chart. * x values, if present, will be used as slice labels. * y values give slice size. * * To use this renderer, you need to include the * pie renderer plugin, for example: * * > * * Properties described here are passed into the $.jqplot function * as options on the series renderer. For example: * * > plot2 = $.jqplot('chart2', [s1, s2], { * > seriesDefaults: { * > renderer:$.jqplot.PieRenderer, * > rendererOptions:{ * > sliceMargin: 2, * > startAngle: -90 * > } * > } * > }); * * A pie plot will trigger events on the plot target * according to user interaction. All events return the event object, * the series index, the point (slice) index, and the point data for * the appropriate slice. * * 'jqplotDataMouseOver' - triggered when user mouseing over a slice. * 'jqplotDataHighlight' - triggered the first time user mouses over a slice, * if highlighting is enabled. * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of * a highlighted slice. * 'jqplotDataClick' - triggered when the user clicks on a slice. * 'jqplotDataRightClick' - tiggered when the user right clicks on a slice if * the "captureRightClick" option is set to true on the plot. */ $.jqplot.PieRenderer = function(){ $.jqplot.LineRenderer.call(this); }; $.jqplot.PieRenderer.prototype = new $.jqplot.LineRenderer(); $.jqplot.PieRenderer.prototype.constructor = $.jqplot.PieRenderer; // called with scope of a series $.jqplot.PieRenderer.prototype.init = function(options, plot) { // Group: Properties // // prop: diameter // Outer diameter of the pie, auto computed by default this.diameter = null; // prop: padding // padding between the pie and plot edges, legend, etc. this.padding = 20; // prop: sliceMargin // angular spacing between pie slices in degrees. this.sliceMargin = 0; // prop: fill // true or false, wether to fil the slices. this.fill = true; // prop: shadowOffset // offset of the shadow from the slice and offset of // each succesive stroke of the shadow from the last. this.shadowOffset = 2; // prop: shadowAlpha // transparency of the shadow (0 = transparent, 1 = opaque) this.shadowAlpha = 0.07; // prop: shadowDepth // number of strokes to apply to the shadow, // each stroke offset shadowOffset from the last. this.shadowDepth = 5; // prop: highlightMouseOver // True to highlight slice when moused over. // This must be false to enable highlightMouseDown to highlight when clicking on a slice. this.highlightMouseOver = true; // prop: highlightMouseDown // True to highlight when a mouse button is pressed over a slice. // This will be disabled if highlightMouseOver is true. this.highlightMouseDown = false; // prop: highlightColors // an array of colors to use when highlighting a slice. this.highlightColors = []; // prop: dataLabels // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices. // Defaults to percentage of each pie slice. this.dataLabels = 'percent'; // prop: showDataLabels // true to show data labels on slices. this.showDataLabels = false; // prop: dataLabelFormatString // Format string for data labels. If none, '%s' is used for "label" and for arrays, '%d' for value and '%d%%' for percentage. this.dataLabelFormatString = null; // prop: dataLabelThreshold // Threshhold in percentage (0-100) of pie area, below which no label will be displayed. // This applies to all label types, not just to percentage labels. this.dataLabelThreshold = 3; // prop: dataLabelPositionFactor // A Multiplier (0-1) of the pie radius which controls position of label on slice. // Increasing will slide label toward edge of pie, decreasing will slide label toward center of pie. this.dataLabelPositionFactor = 0.52; // prop: dataLabelNudge // Number of pixels to slide the label away from (+) or toward (-) the center of the pie. this.dataLabelNudge = 2; // prop: dataLabelCenterOn // True to center the data label at its position. // False to set the inside facing edge of the label at its position. this.dataLabelCenterOn = true; // prop: startAngle // Angle to start drawing pie in degrees. // According to orientation of canvas coordinate system: // 0 = on the positive x axis // -90 = on the positive y axis. // 90 = on the negaive y axis. // 180 or - 180 = on the negative x axis. this.startAngle = 0; this.tickRenderer = $.jqplot.PieTickRenderer; // Used as check for conditions where pie shouldn't be drawn. this._drawData = true; this._type = 'pie'; // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver if (options.highlightMouseDown && options.highlightMouseOver == null) { options.highlightMouseOver = false; } $.extend(true, this, options); if (this.sliceMargin < 0) { this.sliceMargin = 0; } this._diameter = null; this._radius = null; // array of [start,end] angles arrays, one for each slice. In radians. this._sliceAngles = []; // index of the currenty highlighted point, if any this._highlightedPoint = null; // set highlight colors if none provided if (this.highlightColors.length == 0) { for (var i=0; i 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]); newrgb[j] = parseInt(newrgb[j], 10); } this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')'); } } this.highlightColorGenerator = new $.jqplot.ColorGenerator(this.highlightColors); plot.postParseOptionsHooks.addOnce(postParseOptions); plot.postInitHooks.addOnce(postInit); plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove); plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown); plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp); plot.eventListenerHooks.addOnce('jqplotClick', handleClick); plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick); plot.postDrawHooks.addOnce(postPlotDraw); }; $.jqplot.PieRenderer.prototype.setGridData = function(plot) { // set gridData property. This will hold angle in radians of each data point. var stack = []; var td = []; var sa = this.startAngle/180*Math.PI; var tot = 0; // don't know if we have any valid data yet, so set plot to not draw. this._drawData = false; for (var i=0; i0) { stack[i] += stack[i-1]; } tot += this.data[i][1]; } var fact = Math.PI*2/stack[stack.length - 1]; for (var i=0; i0) { stack[i] += stack[i-1]; } tot += data[i][1]; } var fact = Math.PI*2/stack[stack.length - 1]; for (var i=0; i 0 && absang > 0.01 && absang < 6.282) { rprime = parseFloat(sm) / 2.0 / calcRadiusAdjustment(ang); } return rprime; } $.jqplot.PieRenderer.prototype.drawSlice = function (ctx, ang1, ang2, color, isShadow) { if (this._drawData) { var r = this._radius; var fill = this.fill; var lineWidth = this.lineWidth; var sm = this.sliceMargin; if (this.fill == false) { sm += this.lineWidth; } ctx.save(); ctx.translate(this._center[0], this._center[1]); var rprime = calcRPrime(ang1, ang2, this.sliceMargin, this.fill, this.lineWidth); var transx = rprime * Math.cos((ang1 + ang2) / 2.0); var transy = rprime * Math.sin((ang1 + ang2) / 2.0); if ((ang2 - ang1) <= Math.PI) { r -= rprime; } else { r += rprime; } ctx.translate(transx, transy); if (isShadow) { for (var i=0, l=this.shadowDepth; i 6.282 + this.startAngle) { ang2 = 6.282 + this.startAngle; if (ang1 > ang2) { ang1 = 6.281 + this.startAngle; } } // Fix for IE, where it can't seem to handle 0 degree angles. Also avoids // ugly line on unfilled pies. if (ang1 >= ang2) { return; } ctx.beginPath(); ctx.fillStyle = color; ctx.strokeStyle = color; ctx.lineWidth = lineWidth; ctx.arc(0, 0, rad, ang1, ang2, false); ctx.lineTo(0,0); ctx.closePath(); if (fill) { ctx.fill(); } else { ctx.stroke(); } } }; // called with scope of series $.jqplot.PieRenderer.prototype.draw = function (ctx, gd, options, plot) { var i; var opts = (options != undefined) ? options : {}; // offset and direction of offset due to legend placement var offx = 0; var offy = 0; var trans = 1; var colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors); if (options.legendInfo && options.legendInfo.placement == 'insideGrid') { var li = options.legendInfo; switch (li.location) { case 'nw': offx = li.width + li.xoffset; break; case 'w': offx = li.width + li.xoffset; break; case 'sw': offx = li.width + li.xoffset; break; case 'ne': offx = li.width + li.xoffset; trans = -1; break; case 'e': offx = li.width + li.xoffset; trans = -1; break; case 'se': offx = li.width + li.xoffset; trans = -1; break; case 'n': offy = li.height + li.yoffset; break; case 's': offy = li.height + li.yoffset; trans = -1; break; default: break; } } var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; var fill = (opts.fill != undefined) ? opts.fill : this.fill; var cw = ctx.canvas.width; var ch = ctx.canvas.height; var w = cw - offx - 2 * this.padding; var h = ch - offy - 2 * this.padding; var mindim = Math.min(w,h); var d = mindim; // Fixes issue #272. Thanks hugwijst! // reset slice angles array. this._sliceAngles = []; var sm = this.sliceMargin; if (this.fill == false) { sm += this.lineWidth; } var rprime; var maxrprime = 0; var ang, ang1, ang2, shadowColor; var sa = this.startAngle / 180 * Math.PI; // have to pre-draw shadows, so loop throgh here and calculate some values also. for (var i=0, l=gd.length; i Math.PI) { maxrprime = Math.max(rprime, maxrprime); } } if (this.diameter != null && this.diameter > 0) { this._diameter = this.diameter - 2*maxrprime; } else { this._diameter = d - 2*maxrprime; } // Need to check for undersized pie. This can happen if // plot area too small and legend is too big. if (this._diameter < 6) { $.jqplot.log('Diameter of pie too small, not rendering.'); return; } var r = this._radius = this._diameter/2; this._center = [(cw - trans * offx)/2 + trans * offx + maxrprime * Math.cos(sa), (ch - trans*offy)/2 + trans * offy + maxrprime * Math.sin(sa)]; if (this.shadow) { for (var i=0, l=gd.length; i= this.dataLabelThreshold) { var fstr, avgang = (this._sliceAngles[i][0] + this._sliceAngles[i][1])/2, label; if (this.dataLabels == 'label') { fstr = this.dataLabelFormatString || '%s'; label = $.jqplot.sprintf(fstr, gd[i][0]); } else if (this.dataLabels == 'value') { fstr = this.dataLabelFormatString || '%d'; label = $.jqplot.sprintf(fstr, this.data[i][1]); } else if (this.dataLabels == 'percent') { fstr = this.dataLabelFormatString || '%d%%'; label = $.jqplot.sprintf(fstr, gd[i][2]*100); } else if (this.dataLabels.constructor == Array) { fstr = this.dataLabelFormatString || '%s'; label = $.jqplot.sprintf(fstr, this.dataLabels[i]); } var fact = (this._radius ) * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge; var x = this._center[0] + Math.cos(avgang) * fact + this.canvas._offsets.left; var y = this._center[1] + Math.sin(avgang) * fact + this.canvas._offsets.top; var labelelem = $('
      ' + label + '
      ').insertBefore(plot.eventCanvas._elem); if (this.dataLabelCenterOn) { x -= labelelem.width()/2; y -= labelelem.height()/2; } else { x -= labelelem.width() * Math.sin(avgang/2); y -= labelelem.height()/2; } x = Math.round(x); y = Math.round(y); labelelem.css({left: x, top: y}); } } }; $.jqplot.PieAxisRenderer = function() { $.jqplot.LinearAxisRenderer.call(this); }; $.jqplot.PieAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); $.jqplot.PieAxisRenderer.prototype.constructor = $.jqplot.PieAxisRenderer; // There are no traditional axes on a pie chart. We just need to provide // dummy objects with properties so the plot will render. // called with scope of axis object. $.jqplot.PieAxisRenderer.prototype.init = function(options){ // this.tickRenderer = $.jqplot.PieTickRenderer; $.extend(true, this, options); // I don't think I'm going to need _dataBounds here. // have to go Axis scaling in a way to fit chart onto plot area // and provide u2p and p2u functionality for mouse cursor, etc. // for convienence set _dataBounds to 0 and 100 and // set min/max to 0 and 100. this._dataBounds = {min:0, max:100}; this.min = 0; this.max = 100; this.showTicks = false; this.ticks = []; this.showMark = false; this.show = false; }; $.jqplot.PieLegendRenderer = function(){ $.jqplot.TableLegendRenderer.call(this); }; $.jqplot.PieLegendRenderer.prototype = new $.jqplot.TableLegendRenderer(); $.jqplot.PieLegendRenderer.prototype.constructor = $.jqplot.PieLegendRenderer; /** * Class: $.jqplot.PieLegendRenderer * Legend Renderer specific to pie plots. Set by default * when user creates a pie plot. */ $.jqplot.PieLegendRenderer.prototype.init = function(options) { // Group: Properties // // prop: numberRows // Maximum number of rows in the legend. 0 or null for unlimited. this.numberRows = null; // prop: numberColumns // Maximum number of columns in the legend. 0 or null for unlimited. this.numberColumns = null; $.extend(true, this, options); }; // called with context of legend $.jqplot.PieLegendRenderer.prototype.draw = function() { var legend = this; if (this.show) { var series = this._series; this._elem = $(document.createElement('table')); this._elem.addClass('jqplot-table-legend'); var ss = {position:'absolute'}; if (this.background) { ss['background'] = this.background; } if (this.border) { ss['border'] = this.border; } if (this.fontSize) { ss['fontSize'] = this.fontSize; } if (this.fontFamily) { ss['fontFamily'] = this.fontFamily; } if (this.textColor) { ss['textColor'] = this.textColor; } if (this.marginTop != null) { ss['marginTop'] = this.marginTop; } if (this.marginBottom != null) { ss['marginBottom'] = this.marginBottom; } if (this.marginLeft != null) { ss['marginLeft'] = this.marginLeft; } if (this.marginRight != null) { ss['marginRight'] = this.marginRight; } this._elem.css(ss); // Pie charts legends don't go by number of series, but by number of data points // in the series. Refactor things here for that. var pad = false, reverse = false, nr, nc; var s = series[0]; var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors); if (s.show) { var pd = s.data; if (this.numberRows) { nr = this.numberRows; if (!this.numberColumns){ nc = Math.ceil(pd.length/nr); } else{ nc = this.numberColumns; } } else if (this.numberColumns) { nc = this.numberColumns; nr = Math.ceil(pd.length/this.numberColumns); } else { nr = pd.length; nc = 1; } var i, j; var tr, td1, td2; var lt, rs, color; var idx = 0; var div0, div1; for (i=0; i0){ pad = true; } else{ pad = false; } } else{ if (i == nr -1){ pad = false; } else{ pad = true; } } rs = (pad) ? this.rowSpacing : '0'; td1 = $(document.createElement('td')); td1.addClass('jqplot-table-legend jqplot-table-legend-swatch'); td1.css({textAlign: 'center', paddingTop: rs}); div0 = $(document.createElement('div')); div0.addClass('jqplot-table-legend-swatch-outline'); div1 = $(document.createElement('div')); div1.addClass('jqplot-table-legend-swatch'); div1.css({backgroundColor: color, borderColor: color}); td1.append(div0.append(div1)); td2 = $(document.createElement('td')); td2.addClass('jqplot-table-legend jqplot-table-legend-label'); td2.css('paddingTop', rs); if (this.escapeHtml){ td2.text(lt); } else { td2.html(lt); } if (reverse) { td2.prependTo(tr); td1.prependTo(tr); } else { td1.appendTo(tr); td2.appendTo(tr); } pad = true; } idx++; } } } } return this._elem; }; $.jqplot.PieRenderer.prototype.handleMove = function(ev, gridpos, datapos, neighbor, plot) { if (neighbor) { var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; plot.target.trigger('jqplotDataMouseOver', ins); if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.pieRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { plot.target.trigger('jqplotDataHighlight', ins); highlight (plot, ins[0], ins[1]); } } else if (neighbor == null) { unhighlight (plot); } }; // this.eventCanvas._elem.bind($.jqplot.eventListenerHooks[i][0], {plot:this}, $.jqplot.eventListenerHooks[i][1]); // setup default renderers for axes and legend so user doesn't have to // called with scope of plot function preInit(target, data, options) { options = options || {}; options.axesDefaults = options.axesDefaults || {}; options.legend = options.legend || {}; options.seriesDefaults = options.seriesDefaults || {}; // only set these if there is a pie series var setopts = false; if (options.seriesDefaults.renderer == $.jqplot.PieRenderer) { setopts = true; } else if (options.series) { for (var i=0; i < options.series.length; i++) { if (options.series[i].renderer == $.jqplot.PieRenderer) { setopts = true; } } } if (setopts) { options.axesDefaults.renderer = $.jqplot.PieAxisRenderer; options.legend.renderer = $.jqplot.PieLegendRenderer; options.legend.preDraw = true; options.seriesDefaults.pointLabels = {show: false}; } } function postInit(target, data, options) { for (var i=0; i6&&Math.abs(G.y-I._zoom.start[1])>6)||(I.constrainZoomTo=="x"&&Math.abs(G.x-I._zoom.start[0])>6)||(I.constrainZoomTo=="y"&&Math.abs(G.y-I._zoom.start[1])>6)){if(!C.plugins.cursor.zoomProxy){for(var y in t){if(I._zoom.axes[y]==undefined){I._zoom.axes[y]={};I._zoom.axes[y].numberTicks=F[y].numberTicks;I._zoom.axes[y].tickInterval=F[y].tickInterval;I._zoom.axes[y].daTickInterval=F[y].daTickInterval;I._zoom.axes[y].min=F[y].min;I._zoom.axes[y].max=F[y].max;I._zoom.axes[y].tickFormatString=(F[y].tickOptions!=null)?F[y].tickOptions.formatString:""}if((I.constrainZoomTo=="none")||(I.constrainZoomTo=="x"&&y.charAt(0)=="x")||(I.constrainZoomTo=="y"&&y.charAt(0)=="y")){z=t[y];if(z!=null){if(z>w[y]){v=w[y];x=z}else{D=w[y]-z;v=z;x=w[y]}q=F[y];H=null;if(q.alignTicks){if(q.name==="x2axis"&&C.axes.xaxis.show){H=C.axes.xaxis.numberTicks}else{if(q.name.charAt(0)==="y"&&q.name!=="yaxis"&&q.name!=="yMidAxis"&&C.axes.yaxis.show){H=C.axes.yaxis.numberTicks}}}if(this.looseZoom&&(F[y].renderer.constructor===j.jqplot.LinearAxisRenderer||F[y].renderer.constructor===j.jqplot.LogAxisRenderer)){J=j.jqplot.LinearTickGenerator(v,x,q._scalefact,H);if(F[y].tickInset&&J[0]F[y].max-F[y].tickInset*F[y].tickInterval){J[1]-=J[4];J[2]-=1}if(F[y].renderer.constructor===j.jqplot.LogAxisRenderer&&J[0]"}if(G.useAxesFormatters){var A=B.axes[D[0]]._ticks[0].formatter;var q=B.axes[D[1]]._ticks[0].formatter;var H=B.axes[D[0]]._ticks[0].formatString;var v=B.axes[D[1]]._ticks[0].formatString;w+=A(H,r[D[0]])+", "+q(v,r[D[1]])}else{w+=j.jqplot.sprintf(G.tooltipFormatString,r[D[0]],r[D[1]])}K=true}}if(G.showTooltipDataPosition){var u=B.series;var J=d(B,E.x,E.y);var K=false;for(var C=0;C"}w+=j.jqplot.sprintf(G.tooltipFormatString,t,z,x);K=true}}}}G._tooltipElem.html(w)}function g(C,A){var E=A.plugins.cursor;var z=E.cursorCanvas._ctx;z.clearRect(0,0,z.canvas.width,z.canvas.height);if(E.showVerticalLine){E.shapeRenderer.draw(z,[[C.x,0],[C.x,z.canvas.height]])}if(E.showHorizontalLine){E.shapeRenderer.draw(z,[[0,C.y],[z.canvas.width,C.y]])}var G=d(A,C.x,C.y);if(E.showCursorLegend){var r=j(A.targetId+" td.jqplot-cursor-legend-label");for(var B=0;B0;r--){s=v[r-1];if(q[s].show){u[s]=q[s].series_p2u(w[s.charAt(0)])}}return{offsets:t,gridPos:w,dataPos:u}}function h(z){var x=z.data.plot;var y=x.plugins.cursor;if(y.show&&y.zoom&&y._zoom.started&&!y.zoomTarget){var B=y.zoomCanvas._ctx;var v=o(z);var w=v.gridPos;var t=v.dataPos;y._zoom.gridpos=w;y._zoom.datapos=t;y._zoom.zooming=true;var u=w.x;var s=w.y;var A=B.canvas.height;var q=B.canvas.width;if(y.showTooltip&&!y.onGrid&&y.showTooltipOutsideZoom){e(w,t,x);if(y.followMouse){n(w,x)}}if(y.constrainZoomTo=="x"){y._zoom.end=[u,A]}else{if(y.constrainZoomTo=="y"){y._zoom.end=[q,s]}else{y._zoom.end=[u,s]}}var r=window.getSelection;if(document.selection&&document.selection.empty){document.selection.empty()}else{if(r&&!r().isCollapsed){r().collapse()}}l.call(y);B=null}}function a(w,s,r,x,t){var v=t.plugins.cursor;j(document).one("mouseup.jqplot_cursor",{plot:t},p);var u=t.axes;if(document.onselectstart!=undefined){v._oldHandlers.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!=undefined){v._oldHandlers.ondrag=document.ondrag;document.ondrag=function(){return false}}if(document.onmousedown!=undefined){v._oldHandlers.onmousedown=document.onmousedown;document.onmousedown=function(){return false}}if(v.zoom){if(!v.zoomProxy){var y=v.zoomCanvas._ctx;y.clearRect(0,0,y.canvas.width,y.canvas.height);y=null}if(v.constrainZoomTo=="x"){v._zoom.start=[s.x,0]}else{if(v.constrainZoomTo=="y"){v._zoom.start=[0,s.y]}else{v._zoom.start=[s.x,s.y]}}v._zoom.started=true;for(var q in r){v._zoom.axes.start[q]=r[q]}j(document).bind("mousemove.jqplotCursor",{plot:t},h)}}function p(y){var v=y.data.plot;var x=v.plugins.cursor;if(x.zoom&&x._zoom.zooming&&!x.zoomTarget){var u=x._zoom.gridpos.x;var r=x._zoom.gridpos.y;var t=x._zoom.datapos;var z=x.zoomCanvas._ctx.canvas.height;var q=x.zoomCanvas._ctx.canvas.width;var w=v.axes;if(x.constrainOutsideZoom&&!x.onGrid){if(u<0){u=0}else{if(u>q){u=q}}if(r<0){r=0}else{if(r>z){r=z}}for(var s in t){if(t[s]){if(s.charAt(0)=="x"){t[s]=w[s].series_p2u(u)}else{t[s]=w[s].series_p2u(r)}}}}if(x.constrainZoomTo=="x"){r=z}else{if(x.constrainZoomTo=="y"){u=q}}x._zoom.end=[u,r];x._zoom.gridpos={x:u,y:r};x.doZoom(x._zoom.gridpos,t,v,x)}x._zoom.started=false;x._zoom.zooming=false;j(document).unbind("mousemove.jqplotCursor",h);if(document.onselectstart!=undefined&&x._oldHandlers.onselectstart!=null){document.onselectstart=x._oldHandlers.onselectstart;x._oldHandlers.onselectstart=null}if(document.ondrag!=undefined&&x._oldHandlers.ondrag!=null){document.ondrag=x._oldHandlers.ondrag;x._oldHandlers.ondrag=null}if(document.onmousedown!=undefined&&x._oldHandlers.onmousedown!=null){document.onmousedown=x._oldHandlers.onmousedown;x._oldHandlers.onmousedown=null}}function l(){var y=this._zoom.start;var u=this._zoom.end;var s=this.zoomCanvas._ctx;var r,v,x,q;if(u[0]>y[0]){r=y[0];q=u[0]-y[0]}else{r=u[0];q=y[0]-u[0]}if(u[1]>y[1]){v=y[1];x=u[1]-y[1]}else{v=u[1];x=y[1]-u[1]}s.fillStyle="rgba(0,0,0,0.2)";s.strokeStyle="#999999";s.lineWidth=1;s.clearRect(0,0,s.canvas.width,s.canvas.height);s.fillRect(0,0,s.canvas.width,s.canvas.height);s.clearRect(r,v,q,x);s.strokeRect(r,v,q,x);s=null}j.jqplot.CursorLegendRenderer=function(q){j.jqplot.TableLegendRenderer.call(this,q);this.formatString="%s"};j.jqplot.CursorLegendRenderer.prototype=new j.jqplot.TableLegendRenderer();j.jqplot.CursorLegendRenderer.prototype.constructor=j.jqplot.CursorLegendRenderer;j.jqplot.CursorLegendRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}if(this.show){var w=this._series,A;var r=document.createElement("div");this._elem=j(r);r=null;this._elem.addClass("jqplot-legend jqplot-cursor-legend");this._elem.css("position","absolute");var q=false;for(var x=0;x').appendTo(this._elem);E.data("seriesIndex",s);j('
      ').appendTo(E);var G=j('');G.appendTo(E);G.data("seriesIndex",s);if(this.escapeHtml){G.text(D)}else{G.html(D)}E=null;G=null}return this._elem}})(jQuery);ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.ciParser.js0000644000000000000000000001002711762677020021557 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * */ (function($) { /** * Class: $.jqplot.ciParser * Data Renderer function which converts a custom JSON data object into jqPlot data format. * Set this as a callable on the jqplot dataRenderer plot option: * * > plot = $.jqplot('mychart', [data], { dataRenderer: $.jqplot.ciParser, ... }); * * Where data is an object in JSON format or a JSON encoded string conforming to the * City Index API spec. * * Note that calling the renderer function is handled internally by jqPlot. The * user does not have to call the function. The parameters described below will * automatically be passed to the ciParser function. * * Parameters: * data - JSON encoded string or object. * plot - reference to jqPlot Plot object. * * Returns: * data array in jqPlot format. * */ $.jqplot.ciParser = function (data, plot) { var ret = [], line, temp, i, j, k, kk; if (typeof(data) == "string") { data = $.jqplot.JSON.parse(data, handleStrings); } else if (typeof(data) == "object") { for (k in data) { for (i=0; i= 0) { //here we will try to extract the ticks from the Date string in the "value" fields of JSON returned data a = /^\/Date\((-?[0-9]+)\)\/$/.exec(value); if (a) { return parseInt(a[1], 10); } } return value; } } for (var prop in data) { line = []; temp = data[prop]; switch (prop) { case "PriceTicks": for (i=0; i 2.5) { shadow_offset = 1.25 * (1 + (Math.atan((this.lineWidth/2.5))/0.785398163 - 1)*0.6); // var shadow_offset = this.shadowOffset; } // for skinny lines, don't make such a big shadow. else { shadow_offset = 1.25 * Math.atan((this.lineWidth/2.5))/0.785398163; } } var sopts = {lineJoin:'miter', lineCap:'butt', fill:this.fill, fillRect:this.fill, isarc:false, angle:this.shadowAngle, offset:shadow_offset, alpha:this.shadowAlpha, depth:this.shadowDepth, closePath:this.fill, lineWidth: this.lineWidth}; this.renderer.shadowRenderer.init(sopts); plot.postDrawHooks.addOnce(postPlotDraw); plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove); // if this is the left side of pyramid, set y values to negative. if (this.side === 'left') { for (var i=0, l=this.data.length; i= 0) { // xstart = this._xaxis.series_u2p(this._xnudge); w = gridData[i][0] - xstart; h = this.barWidth; points = [xstart, base - bw2 - yadj, w, h]; } else { // xstart = this._xaxis.series_u2p(0); w = xstart - gridData[i][0]; h = this.barWidth; points = [gridData[i][0], base - bw2 - yadj, w, h]; } this._barPoints.push([[points[0], points[1] + h], [points[0], points[1]], [points[0] + w, points[1]], [points[0] + w, points[1] + h]]); if (shadow) { this.renderer.shadowRenderer.draw(ctx, points); } var clr = opts.fillStyle || this.color; this._dataColors.push(clr); this.renderer.shapeRenderer.draw(ctx, points, opts); } else { if (i === 0) { points =[[xstart, ystart], [gridData[i][0], ystart], [gridData[i][0], gridData[i][1] - bw2 - yadj]]; } else if (i < l-1) { points = points.concat([[gridData[i-1][0], gridData[i-1][1] - bw2 - yadj], [gridData[i][0], gridData[i][1] + bw2 - yadj], [gridData[i][0], gridData[i][1] - bw2 - yadj]]); } // finally, draw the line else { points = points.concat([[gridData[i-1][0], gridData[i-1][1] - bw2 - yadj], [gridData[i][0], gridData[i][1] + bw2 - yadj], [gridData[i][0], yend], [xstart, yend]]); if (shadow) { this.renderer.shadowRenderer.draw(ctx, points); } var clr = opts.fillStyle || this.color; this._dataColors.push(clr); this.renderer.shapeRenderer.draw(ctx, points, opts); } } } } if (this.highlightColors.length == 0) { this.highlightColors = $.jqplot.computeHighlightColors(this._dataColors); } else if (typeof(this.highlightColors) == 'string') { this.highlightColors = []; for (var i=0; i -1) { return n/this.pt2px; } else if (sz.indexOf('pt') > -1) { return n; } else if (sz.indexOf('em') > -1) { return n*12; } else if (sz.indexOf('%') > -1) { return n*12/100; } // default to pixels; else { return n/this.pt2px; } }; $.jqplot.CanvasTextRenderer.prototype.fontWeight2Float = function(w) { // w = normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 // return values adjusted for Hershey font. if (Number(w)) { return w/400; } else { switch (w) { case 'normal': return 1; break; case 'bold': return 1.75; break; case 'bolder': return 2.25; break; case 'lighter': return 0.75; break; default: return 1; break; } } }; $.jqplot.CanvasTextRenderer.prototype.getText = function() { return this.text; }; $.jqplot.CanvasTextRenderer.prototype.setText = function(t, ctx) { this.text = t; this.setWidth(ctx); return this; }; $.jqplot.CanvasTextRenderer.prototype.getWidth = function(ctx) { return this.width; }; $.jqplot.CanvasTextRenderer.prototype.setWidth = function(ctx, w) { if (!w) { this.width = this.measure(ctx, this.text); } else { this.width = w; } return this; }; // return height in pixels. $.jqplot.CanvasTextRenderer.prototype.getHeight = function(ctx) { return this.height; }; // w - height in pt // set heigh in px $.jqplot.CanvasTextRenderer.prototype.setHeight = function(w) { if (!w) { //height = this.fontSize /0.75; this.height = this.normalizedFontSize * this.pt2px; } else { this.height = w; } return this; }; $.jqplot.CanvasTextRenderer.prototype.letter = function (ch) { return this.letters[ch]; }; $.jqplot.CanvasTextRenderer.prototype.ascent = function() { return this.normalizedFontSize; }; $.jqplot.CanvasTextRenderer.prototype.descent = function() { return 7.0*this.normalizedFontSize/25.0; }; $.jqplot.CanvasTextRenderer.prototype.measure = function(ctx, str) { var total = 0; var len = str.length; for (var i = 0; i < len; i++) { var c = this.letter(str.charAt(i)); if (c) { total += c.width * this.normalizedFontSize / 25.0 * this.fontStretch; } } return total; }; $.jqplot.CanvasTextRenderer.prototype.draw = function(ctx,str) { var x = 0; // leave room at bottom for descenders. var y = this.height*0.72; var total = 0; var len = str.length; var mag = this.normalizedFontSize / 25.0; ctx.save(); var tx, ty; // 1st quadrant if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) { tx = 0; ty = -Math.sin(this.angle) * this.width; } // 4th quadrant else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) { tx = Math.sin(this.angle) * this.height; ty = 0; } // 2nd quadrant else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) { tx = -Math.cos(this.angle) * this.width; ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height; } // 3rd quadrant else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) { tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width; ty = -Math.cos(this.angle) * this.height; } ctx.strokeStyle = this.fillStyle; ctx.fillStyle = this.fillStyle; ctx.translate(tx, ty); ctx.rotate(this.angle); ctx.lineCap = "round"; // multiplier was 2.0 var fact = (this.normalizedFontSize > 30) ? 2.0 : 2 + (30 - this.normalizedFontSize)/20; ctx.lineWidth = fact * mag * this.fontWeight2Float(this.fontWeight); for ( var i = 0; i < len; i++) { var c = this.letter( str.charAt(i)); if ( !c) { continue; } ctx.beginPath(); var penUp = 1; var needStroke = 0; for ( var j = 0; j < c.points.length; j++) { var a = c.points[j]; if ( a[0] == -1 && a[1] == -1) { penUp = 1; continue; } if ( penUp) { ctx.moveTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag); penUp = false; } else { ctx.lineTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag); } } ctx.stroke(); x += c.width*mag*this.fontStretch; } ctx.restore(); return total; }; $.jqplot.CanvasTextRenderer.prototype.letters = { ' ': { width: 16, points: [] }, '!': { width: 10, points: [[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] }, '"': { width: 16, points: [[4,21],[4,14],[-1,-1],[12,21],[12,14]] }, '#': { width: 21, points: [[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]] }, '$': { width: 20, points: [[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] }, '%': { width: 24, points: [[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]] }, '&': { width: 26, points: [[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]] }, '\'': { width: 10, points: [[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]] }, '(': { width: 14, points: [[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]] }, ')': { width: 14, points: [[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]] }, '*': { width: 16, points: [[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]] }, '+': { width: 26, points: [[13,18],[13,0],[-1,-1],[4,9],[22,9]] }, ',': { width: 10, points: [[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] }, '-': { width: 18, points: [[6,9],[12,9]] }, '.': { width: 10, points: [[5,2],[4,1],[5,0],[6,1],[5,2]] }, '/': { width: 22, points: [[20,25],[2,-7]] }, '0': { width: 20, points: [[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]] }, '1': { width: 20, points: [[6,17],[8,18],[11,21],[11,0]] }, '2': { width: 20, points: [[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]] }, '3': { width: 20, points: [[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] }, '4': { width: 20, points: [[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]] }, '5': { width: 20, points: [[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] }, '6': { width: 20, points: [[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]] }, '7': { width: 20, points: [[17,21],[7,0],[-1,-1],[3,21],[17,21]] }, '8': { width: 20, points: [[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]] }, '9': { width: 20, points: [[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]] }, ':': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] }, ';': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] }, '<': { width: 24, points: [[20,18],[4,9],[20,0]] }, '=': { width: 26, points: [[4,12],[22,12],[-1,-1],[4,6],[22,6]] }, '>': { width: 24, points: [[4,18],[20,9],[4,0]] }, '?': { width: 18, points: [[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]] }, '@': { width: 27, points: [[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]] }, 'A': { width: 18, points: [[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]] }, 'B': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]] }, 'C': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]] }, 'D': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]] }, 'E': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]] }, 'F': { width: 18, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]] }, 'G': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]] }, 'H': { width: 22, points: [[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]] }, 'I': { width: 8, points: [[4,21],[4,0]] }, 'J': { width: 16, points: [[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]] }, 'K': { width: 21, points: [[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]] }, 'L': { width: 17, points: [[4,21],[4,0],[-1,-1],[4,0],[16,0]] }, 'M': { width: 24, points: [[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]] }, 'N': { width: 22, points: [[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]] }, 'O': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]] }, 'P': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]] }, 'Q': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]] }, 'R': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]] }, 'S': { width: 20, points: [[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] }, 'T': { width: 16, points: [[8,21],[8,0],[-1,-1],[1,21],[15,21]] }, 'U': { width: 22, points: [[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]] }, 'V': { width: 18, points: [[1,21],[9,0],[-1,-1],[17,21],[9,0]] }, 'W': { width: 24, points: [[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]] }, 'X': { width: 20, points: [[3,21],[17,0],[-1,-1],[17,21],[3,0]] }, 'Y': { width: 18, points: [[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]] }, 'Z': { width: 20, points: [[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]] }, '[': { width: 14, points: [[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]] }, '\\': { width: 14, points: [[0,21],[14,-3]] }, ']': { width: 14, points: [[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]] }, '^': { width: 16, points: [[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]] }, '_': { width: 16, points: [[0,-2],[16,-2]] }, '`': { width: 10, points: [[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]] }, 'a': { width: 19, points: [[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, 'b': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] }, 'c': { width: 18, points: [[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, 'd': { width: 19, points: [[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, 'e': { width: 18, points: [[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, 'f': { width: 12, points: [[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]] }, 'g': { width: 19, points: [[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, 'h': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] }, 'i': { width: 8, points: [[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]] }, 'j': { width: 10, points: [[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]] }, 'k': { width: 17, points: [[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]] }, 'l': { width: 8, points: [[4,21],[4,0]] }, 'm': { width: 30, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]] }, 'n': { width: 19, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] }, 'o': { width: 19, points: [[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]] }, 'p': { width: 19, points: [[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] }, 'q': { width: 19, points: [[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, 'r': { width: 13, points: [[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]] }, 's': { width: 17, points: [[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]] }, 't': { width: 12, points: [[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]] }, 'u': { width: 19, points: [[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]] }, 'v': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0]] }, 'w': { width: 22, points: [[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]] }, 'x': { width: 17, points: [[3,14],[14,0],[-1,-1],[14,14],[3,0]] }, 'y': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]] }, 'z': { width: 17, points: [[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]] }, '{': { width: 14, points: [[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]] }, '|': { width: 8, points: [[4,25],[4,-7]] }, '}': { width: 14, points: [[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]] }, '~': { width: 24, points: [[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]] } }; $.jqplot.CanvasFontRenderer = function(options) { options = options || {}; if (!options.pt2px) { options.pt2px = 1.5; } $.jqplot.CanvasTextRenderer.call(this, options); }; $.jqplot.CanvasFontRenderer.prototype = new $.jqplot.CanvasTextRenderer({}); $.jqplot.CanvasFontRenderer.prototype.constructor = $.jqplot.CanvasFontRenderer; $.jqplot.CanvasFontRenderer.prototype.measure = function(ctx, str) { // var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily; var fstyle = this.fontSize+' '+this.fontFamily; ctx.save(); ctx.font = fstyle; var w = ctx.measureText(str).width; ctx.restore(); return w; }; $.jqplot.CanvasFontRenderer.prototype.draw = function(ctx, str) { var x = 0; // leave room at bottom for descenders. var y = this.height*0.72; //var y = 12; ctx.save(); var tx, ty; // 1st quadrant if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) { tx = 0; ty = -Math.sin(this.angle) * this.width; } // 4th quadrant else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) { tx = Math.sin(this.angle) * this.height; ty = 0; } // 2nd quadrant else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) { tx = -Math.cos(this.angle) * this.width; ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height; } // 3rd quadrant else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) { tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width; ty = -Math.cos(this.angle) * this.height; } ctx.strokeStyle = this.fillStyle; ctx.fillStyle = this.fillStyle; // var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily; var fstyle = this.fontSize+' '+this.fontFamily; ctx.font = fstyle; ctx.translate(tx, ty); ctx.rotate(this.angle); ctx.fillText(str, x, y); // ctx.strokeText(str, x, y); ctx.restore(); }; })(jQuery);ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.logAxisRenderer.js0000644000000000000000000005216411762677020023114 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * */ (function($) { /** * class: $.jqplot.LogAxisRenderer * A plugin for a jqPlot to render a logarithmic axis. * * To use this renderer, include the plugin in your source * > * * and supply the appropriate options to your plot * * > {axes:{xaxis:{renderer:$.jqplot.LogAxisRenderer}}} **/ $.jqplot.LogAxisRenderer = function() { $.jqplot.LinearAxisRenderer.call(this); // prop: axisDefaults // Default properties which will be applied directly to the series. // // Group: Properties // // Properties // // base - the logarithmic base, commonly 2, 10 or Math.E // tickDistribution - Deprecated. "power" distribution of ticks // always used. Option has no effect. this.axisDefaults = { base : 10, tickDistribution :'power' }; }; $.jqplot.LogAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); $.jqplot.LogAxisRenderer.prototype.constructor = $.jqplot.LogAxisRenderer; $.jqplot.LogAxisRenderer.prototype.init = function(options) { // prop: drawBaseline // True to draw the axis baseline. this.drawBaseline = true; // prop: minorTicks // Number of ticks to add between "major" ticks. // Major ticks are ticks supplied by user or auto computed. // Minor ticks cannot be created by user. this.minorTicks = 'auto'; this._scalefact = 1.0; $.extend(true, this, options); this._autoFormatString = '%d'; this._overrideFormatString = false; for (var d in this.renderer.axisDefaults) { if (this[d] == null) { this[d] = this.renderer.axisDefaults[d]; } } this.resetDataBounds(); }; $.jqplot.LogAxisRenderer.prototype.createTicks = function(plot) { // we're are operating on an axis here var ticks = this._ticks; var userTicks = this.ticks; var name = this.name; var db = this._dataBounds; var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height; var interval; var min, max; var pos1, pos2; var tt, i; var threshold = 30; // For some reason scalefactor is screwing up ticks. this._scalefact = (Math.max(dim, threshold+1) - threshold)/300; // if we already have ticks, use them. // ticks must be in order of increasing value. if (userTicks.length) { // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed for (i=0; i 140) { numberTicks = Math.round(Math.log(this.max/this.min)/Math.log(this.base) + 1); if (numberTicks < 2) { numberTicks = 2; } if (minorTicks === 0) { var temp = dim/(numberTicks - 1); if (temp < 100) { minorTicks = 0; } else if (temp < 190) { minorTicks = 1; } else if (temp < 250) { minorTicks = 3; } else if (temp < 600) { minorTicks = 4; } else { minorTicks = 9; } } } else { numberTicks = 2; if (minorTicks === 0) { minorTicks = 1; } minorTicks = 0; } } else { numberTicks = this.numberTicks; } if (order >= 0 && minorTicks !== 3) { this._autoFormatString = '%d'; } // Adjust format string for case with 3 ticks where we'll have like 1, 2.5, 5, 7.5, 10 else if (order <= 0 && minorTicks === 3) { var temp = -(order - 1); this._autoFormatString = '%.'+ Math.abs(order-1) + 'f'; } // Adjust format string for values less than 1. else if (order < 0) { var temp = -order; this._autoFormatString = '%.'+ Math.abs(order) + 'f'; } else { this._autoFormatString = '%d'; } var to, t, val, tt1, spread, interval; for (var i=0; i=0; j--) { val = tt1-interval*(j+1); t = new this.tickRenderer(this.tickOptions); if (this._overrideFormatString && this._autoFormatString != '') { t.formatString = this._autoFormatString; } if (!this.showTicks) { t.showLabel = false; t.showMark = false; } else if (!this.showTickMarks) { t.showMark = false; } t.setTick(val, this.name); this._ticks.push(t); } } } } // min and max are set as would be the case with zooming else if (this.min != null && this.max != null) { var opts = $.extend(true, {}, this.tickOptions, {name: this.name, value: null}); var nt, ti; // don't have an interval yet, pick one that gives the most // "round" ticks we can get. if (this.numberTicks == null && this.tickInterval == null) { // var threshold = 30; var tdim = Math.max(dim, threshold+1); var nttarget = Math.ceil((tdim-threshold)/35 + 1); var ret = $.jqplot.LinearTickGenerator.bestConstrainedInterval(this.min, this.max, nttarget); this._autoFormatString = ret[3]; nt = ret[2]; ti = ret[4]; for (var i=0; i 0) { shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; } else { shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; } break; case 'middle': // if (t.angle > 0) { // shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; // } // else { // shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; // } shim = -t.getHeight()/2; break; default: shim = -t.getHeight()/2; break; } } else { shim = -t.getHeight()/2; } var val = this.u2p(t.value) + shim + 'px'; t._elem.css('top', val); t.pack(); } } if (lshow) { var h = this._label._elem.outerHeight(true); this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px'); if (this.name == 'yaxis') { this._label._elem.css('left', '0px'); } else { this._label._elem.css('right', '0px'); } this._label.pack(); } } } }; })(jQuery);ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.dragable.js0000644000000000000000000002240511762677020021553 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * */ (function($) { /** * Class: $.jqplot.Dragable * Plugin to make plotted points dragable by the user. */ $.jqplot.Dragable = function(options) { // Group: Properties this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false}); this.shapeRenderer = new $.jqplot.ShapeRenderer(); this.isDragging = false; this.isOver = false; this._ctx; this._elem; this._point; this._gridData; // prop: color // CSS color spec for the dragged point (and adjacent line segment or bar). this.color; // prop: constrainTo // Constrain dragging motion to an axis or to none. // Allowable values are 'none', 'x', 'y' this.constrainTo = 'none'; // 'x', 'y', or 'none'; $.extend(true, this, options); }; function DragCanvas() { $.jqplot.GenericCanvas.call(this); this.isDragging = false; this.isOver = false; this._neighbor; this._cursors = []; } DragCanvas.prototype = new $.jqplot.GenericCanvas(); DragCanvas.prototype.constructor = DragCanvas; // called within scope of series $.jqplot.Dragable.parseOptions = function (defaults, opts) { var options = opts || {}; this.plugins.dragable = new $.jqplot.Dragable(options.dragable); // since this function is called before series options are parsed, // we can set this here and it will be overridden if needed. this.isDragable = $.jqplot.config.enablePlugins; }; // called within context of plot // create a canvas which we can draw on. // insert it before the eventCanvas, so eventCanvas will still capture events. // add a new DragCanvas object to the plot plugins to handle drawing on this new canvas. $.jqplot.Dragable.postPlotDraw = function() { // Memory Leaks patch if (this.plugins.dragable && this.plugins.dragable.highlightCanvas) { this.plugins.dragable.highlightCanvas.resetCanvas(); this.plugins.dragable.highlightCanvas = null; } this.plugins.dragable = {previousCursor:'auto', isOver:false}; this.plugins.dragable.dragCanvas = new DragCanvas(); this.eventCanvas._elem.before(this.plugins.dragable.dragCanvas.createElement(this._gridPadding, 'jqplot-dragable-canvas', this._plotDimensions, this)); var dctx = this.plugins.dragable.dragCanvas.setContext(); }; //$.jqplot.preInitHooks.push($.jqplot.Dragable.init); $.jqplot.preParseSeriesOptionsHooks.push($.jqplot.Dragable.parseOptions); $.jqplot.postDrawHooks.push($.jqplot.Dragable.postPlotDraw); $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMove]); $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleDown]); $.jqplot.eventListenerHooks.push(['jqplotMouseUp', handleUp]); function initDragPoint(plot, neighbor) { var s = plot.series[neighbor.seriesIndex]; var drag = s.plugins.dragable; // first, init the mark renderer for the dragged point var smr = s.markerRenderer; var mr = drag.markerRenderer; mr.style = smr.style; mr.lineWidth = smr.lineWidth + 2.5; mr.size = smr.size + 5; if (!drag.color) { var rgba = $.jqplot.getColorComponents(smr.color); var newrgb = [rgba[0], rgba[1], rgba[2]]; var alpha = (rgba[3] >= 0.6) ? rgba[3]*0.6 : rgba[3]*(2-rgba[3]); drag.color = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+alpha+')'; } mr.color = drag.color; mr.init(); var start = (neighbor.pointIndex > 0) ? neighbor.pointIndex - 1 : 0; var end = neighbor.pointIndex+2; drag._gridData = s.gridData.slice(start, end); } function handleMove(ev, gridpos, datapos, neighbor, plot) { if (plot.plugins.dragable.dragCanvas.isDragging) { var dc = plot.plugins.dragable.dragCanvas; var dp = dc._neighbor; var s = plot.series[dp.seriesIndex]; var drag = s.plugins.dragable; var gd = s.gridData; // compute the new grid position with any constraints. var x = (drag.constrainTo == 'y') ? dp.gridData[0] : gridpos.x; var y = (drag.constrainTo == 'x') ? dp.gridData[1] : gridpos.y; // compute data values for any listeners. var xu = s._xaxis.series_p2u(x); var yu = s._yaxis.series_p2u(y); // clear the canvas then redraw effect at new position. var ctx = dc._ctx; ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); // adjust our gridData for the new mouse position if (dp.pointIndex > 0) { drag._gridData[1] = [x, y]; } else { drag._gridData[0] = [x, y]; } plot.series[dp.seriesIndex].draw(dc._ctx, {gridData:drag._gridData, shadow:false, preventJqPlotSeriesDrawTrigger:true, color:drag.color, markerOptions:{color:drag.color, shadow:false}, trendline:{show:false}}); plot.target.trigger('jqplotSeriesPointChange', [dp.seriesIndex, dp.pointIndex, [xu,yu], [x,y]]); } else if (neighbor != null) { var series = plot.series[neighbor.seriesIndex]; if (series.isDragable) { var dc = plot.plugins.dragable.dragCanvas; if (!dc.isOver) { dc._cursors.push(ev.target.style.cursor); ev.target.style.cursor = "pointer"; } dc.isOver = true; } } else if (neighbor == null) { var dc = plot.plugins.dragable.dragCanvas; if (dc.isOver) { ev.target.style.cursor = dc._cursors.pop(); dc.isOver = false; } } } function handleDown(ev, gridpos, datapos, neighbor, plot) { var dc = plot.plugins.dragable.dragCanvas; dc._cursors.push(ev.target.style.cursor); if (neighbor != null) { var s = plot.series[neighbor.seriesIndex]; var drag = s.plugins.dragable; if (s.isDragable && !dc.isDragging) { dc._neighbor = neighbor; dc.isDragging = true; initDragPoint(plot, neighbor); drag.markerRenderer.draw(s.gridData[neighbor.pointIndex][0], s.gridData[neighbor.pointIndex][1], dc._ctx); ev.target.style.cursor = "move"; plot.target.trigger('jqplotDragStart', [neighbor.seriesIndex, neighbor.pointIndex, gridpos, datapos]); } } // Just in case of a hickup, we'll clear the drag canvas and reset. else { var ctx = dc._ctx; ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); dc.isDragging = false; } } function handleUp(ev, gridpos, datapos, neighbor, plot) { if (plot.plugins.dragable.dragCanvas.isDragging) { var dc = plot.plugins.dragable.dragCanvas; // clear the canvas var ctx = dc._ctx; ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); dc.isDragging = false; // redraw the series canvas at the new point. var dp = dc._neighbor; var s = plot.series[dp.seriesIndex]; var drag = s.plugins.dragable; // compute the new grid position with any constraints. var x = (drag.constrainTo == 'y') ? dp.data[0] : datapos[s.xaxis]; var y = (drag.constrainTo == 'x') ? dp.data[1] : datapos[s.yaxis]; // var x = datapos[s.xaxis]; // var y = datapos[s.yaxis]; s.data[dp.pointIndex][0] = x; s.data[dp.pointIndex][1] = y; plot.drawSeries({preventJqPlotSeriesDrawTrigger:true}, dp.seriesIndex); dc._neighbor = null; ev.target.style.cursor = dc._cursors.pop(); plot.target.trigger('jqplotDragStop', [gridpos, datapos]); } } })(jQuery);ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.mekkoRenderer.js0000644000000000000000000004476711762677020022626 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * */ (function($) { /** * Class: $.jqplot.MekkoRenderer * Draws a Mekko style chart which shows 3 dimensional data on a 2 dimensional graph. * the <$.jqplot.MekkoAxisRenderer> should be used with mekko charts. The mekko renderer * overrides the default legend renderer with it's own $.jqplot.MekkoLegendRenderer * which allows more flexibility to specify number of rows and columns in the legend. * * Data is specified per bar in the chart. You can specify data as an array of y values, or as * an array of [label, value] pairs. Note that labels are used only on the first series. * Labels on subsequent series are ignored: * * > bar1 = [['shirts', 8],['hats', 14],['shoes', 6],['gloves', 16],['dolls', 12]]; * > bar2 = [15,6,9,13,6]; * > bar3 = [['grumpy',4],['sneezy',2],['happy',7],['sleepy',9],['doc',7]]; * * If you want to place labels for each bar under the axis, you use the barLabels option on * the axes. The bar labels can be styled with the ".jqplot-mekko-barLabel" css class. * * > barLabels = ['Mickey Mouse', 'Donald Duck', 'Goofy']; * > axes:{xaxis:{barLabels:barLabels}} * */ $.jqplot.MekkoRenderer = function(){ this.shapeRenderer = new $.jqplot.ShapeRenderer(); // prop: borderColor // color of the borders between areas on the chart this.borderColor = null; // prop: showBorders // True to draw borders lines between areas on the chart. // False will draw borders lines with the same color as the area. this.showBorders = true; }; // called with scope of series. $.jqplot.MekkoRenderer.prototype.init = function(options, plot) { this.fill = false; this.fillRect = true; this.strokeRect = true; this.shadow = false; // width of bar on x axis. this._xwidth = 0; this._xstart = 0; $.extend(true, this.renderer, options); // set the shape renderer options var opts = {lineJoin:'miter', lineCap:'butt', isarc:false, fillRect:this.fillRect, strokeRect:this.strokeRect}; this.renderer.shapeRenderer.init(opts); plot.axes.x2axis._series.push(this); this._type = 'mekko'; }; // Method: setGridData // converts the user data values to grid coordinates and stores them // in the gridData array. Will convert user data into appropriate // rectangles. // Called with scope of a series. $.jqplot.MekkoRenderer.prototype.setGridData = function(plot) { // recalculate the grid data var xp = this._xaxis.series_u2p; var yp = this._yaxis.series_u2p; var data = this._plotData; this.gridData = []; // figure out width on x axis. // this._xwidth = this._sumy / plot._sumy * this.canvas.getWidth(); this._xwidth = xp(this._sumy) - xp(0); if (this.index>0) { this._xstart = plot.series[this.index-1]._xstart + plot.series[this.index-1]._xwidth; } var totheight = this.canvas.getHeight(); var sumy = 0; var cury; var curheight; for (var i=0; i'); // Mekko charts legends don't go by number of series, but by number of data points // in the series. Refactor things here for that. var pad = false, reverse = true, // mekko charts are always stacked, so reverse nr, nc; var s = series[0]; var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors); if (s.show) { var pd = s.data; if (this.numberRows) { nr = this.numberRows; if (!this.numberColumns){ nc = Math.ceil(pd.length/nr); } else{ nc = this.numberColumns; } } else if (this.numberColumns) { nc = this.numberColumns; nr = Math.ceil(pd.length/this.numberColumns); } else { nr = pd.length; nc = 1; } var i, j, tr, td1, td2, lt, rs, color; var idx = 0; for (i=0; i').prependTo(this._elem); } else{ tr = $('').appendTo(this._elem); } for (j=0; j0){ pad = true; } else{ pad = false; } } else{ if (i == nr -1){ pad = false; } else{ pad = true; } } rs = (pad) ? this.rowSpacing : '0'; td1 = $(''+ '
      '+ '
      '); td2 = $(''); if (this.escapeHtml){ td2.text(lt); } else { td2.html(lt); } if (reverse) { td2.prependTo(tr); td1.prependTo(tr); } else { td1.appendTo(tr); td2.appendTo(tr); } pad = true; } idx++; } } tr = null; td1 = null; td2 = null; } } return this._elem; }; $.jqplot.MekkoLegendRenderer.prototype.pack = function(offsets) { if (this.show) { // fake a grid for positioning var grid = {_top:offsets.top, _left:offsets.left, _right:offsets.right, _bottom:this._plotDimensions.height - offsets.bottom}; if (this.placement == 'insideGrid') { switch (this.location) { case 'nw': var a = grid._left + this.xoffset; var b = grid._top + this.yoffset; this._elem.css('left', a); this._elem.css('top', b); break; case 'n': var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; var b = grid._top + this.yoffset; this._elem.css('left', a); this._elem.css('top', b); break; case 'ne': var a = offsets.right + this.xoffset; var b = grid._top + this.yoffset; this._elem.css({right:a, top:b}); break; case 'e': var a = offsets.right + this.xoffset; var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; this._elem.css({right:a, top:b}); break; case 'se': var a = offsets.right + this.xoffset; var b = offsets.bottom + this.yoffset; this._elem.css({right:a, bottom:b}); break; case 's': var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; var b = offsets.bottom + this.yoffset; this._elem.css({left:a, bottom:b}); break; case 'sw': var a = grid._left + this.xoffset; var b = offsets.bottom + this.yoffset; this._elem.css({left:a, bottom:b}); break; case 'w': var a = grid._left + this.xoffset; var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; this._elem.css({left:a, top:b}); break; default: // same as 'se' var a = grid._right - this.xoffset; var b = grid._bottom + this.yoffset; this._elem.css({right:a, bottom:b}); break; } } else { switch (this.location) { case 'nw': var a = this._plotDimensions.width - grid._left + this.xoffset; var b = grid._top + this.yoffset; this._elem.css('right', a); this._elem.css('top', b); break; case 'n': var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; var b = this._plotDimensions.height - grid._top + this.yoffset; this._elem.css('left', a); this._elem.css('bottom', b); break; case 'ne': var a = this._plotDimensions.width - offsets.right + this.xoffset; var b = grid._top + this.yoffset; this._elem.css({left:a, top:b}); break; case 'e': var a = this._plotDimensions.width - offsets.right + this.xoffset; var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; this._elem.css({left:a, top:b}); break; case 'se': var a = this._plotDimensions.width - offsets.right + this.xoffset; var b = offsets.bottom + this.yoffset; this._elem.css({left:a, bottom:b}); break; case 's': var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; var b = this._plotDimensions.height - offsets.bottom + this.yoffset; this._elem.css({left:a, top:b}); break; case 'sw': var a = this._plotDimensions.width - grid._left + this.xoffset; var b = offsets.bottom + this.yoffset; this._elem.css({right:a, bottom:b}); break; case 'w': var a = this._plotDimensions.width - grid._left + this.xoffset; var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; this._elem.css({right:a, top:b}); break; default: // same as 'se' var a = grid._right - this.xoffset; var b = grid._bottom + this.yoffset; this._elem.css({right:a, bottom:b}); break; } } } }; // setup default renderers for axes and legend so user doesn't have to // called with scope of plot function preInit(target, data, options) { options = options || {}; options.axesDefaults = options.axesDefaults || {}; options.legend = options.legend || {}; options.seriesDefaults = options.seriesDefaults || {}; var setopts = false; if (options.seriesDefaults.renderer == $.jqplot.MekkoRenderer) { setopts = true; } else if (options.series) { for (var i=0; i < options.series.length; i++) { if (options.series[i].renderer == $.jqplot.MekkoRenderer) { setopts = true; } } } if (setopts) { options.axesDefaults.renderer = $.jqplot.MekkoAxisRenderer; options.legend.renderer = $.jqplot.MekkoLegendRenderer; options.legend.preDraw = true; } } $.jqplot.preInitHooks.push(preInit); })(jQuery); ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.pointLabels.js0000644000000000000000000003300211762677020022261 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * */ (function($) { /** * Class: $.jqplot.PointLabels * Plugin for putting labels at the data points. * * To use this plugin, include the js * file in your source: * * > * * By default, the last value in the data ponit array in the data series is used * for the label. For most series renderers, extra data can be added to the * data point arrays and the last value will be used as the label. * * For instance, * this series: * * > [[1,4], [3,5], [7,2]] * * Would, by default, use the y values in the labels. * Extra data can be added to the series like so: * * > [[1,4,'mid'], [3 5,'hi'], [7,2,'low']] * * And now the point labels would be 'mid', 'low', and 'hi'. * * Options to the point labels and a custom labels array can be passed into the * "pointLabels" option on the series option like so: * * > series:[{pointLabels:{ * > labels:['mid', 'hi', 'low'], * > location:'se', * > ypadding: 12 * > } * > }] * * A custom labels array in the options takes precendence over any labels * in the series data. If you have a custom labels array in the options, * but still want to use values from the series array as labels, set the * "labelsFromSeries" option to true. * * By default, html entities (<, >, etc.) are escaped in point labels. * If you want to include actual html markup in the labels, * set the "escapeHTML" option to false. * */ $.jqplot.PointLabels = function(options) { // Group: Properties // // prop: show // show the labels or not. this.show = $.jqplot.config.enablePlugins; // prop: location // compass location where to position the label around the point. // 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw' this.location = 'n'; // prop: labelsFromSeries // true to use labels within data point arrays. this.labelsFromSeries = false; // prop: seriesLabelIndex // array index for location of labels within data point arrays. // if null, will use the last element of the data point array. this.seriesLabelIndex = null; // prop: labels // array of arrays of labels, one array for each series. this.labels = []; // actual labels that will get displayed. // needed to preserve user specified labels in labels array. this._labels = []; // prop: stackedValue // true to display value as stacked in a stacked plot. // no effect if labels is specified. this.stackedValue = false; // prop: ypadding // vertical padding in pixels between point and label this.ypadding = 6; // prop: xpadding // horizontal padding in pixels between point and label this.xpadding = 6; // prop: escapeHTML // true to escape html entities in the labels. // If you want to include markup in the labels, set to false. this.escapeHTML = true; // prop: edgeTolerance // Number of pixels that the label must be away from an axis // boundary in order to be drawn. Negative values will allow overlap // with the grid boundaries. this.edgeTolerance = -5; // prop: formatter // A class of a formatter for the tick text. sprintf by default. this.formatter = $.jqplot.DefaultTickFormatter; // prop: formatString // string passed to the formatter. this.formatString = ''; // prop: hideZeros // true to not show a label for a value which is 0. this.hideZeros = false; this._elems = []; $.extend(true, this, options); }; var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w']; var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7}; var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e']; // called with scope of a series $.jqplot.PointLabels.init = function (target, data, seriesDefaults, opts, plot){ var options = $.extend(true, {}, seriesDefaults, opts); options.pointLabels = options.pointLabels || {}; if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal' && !options.pointLabels.location) { options.pointLabels.location = 'e'; } // add a pointLabels attribute to the series plugins this.plugins.pointLabels = new $.jqplot.PointLabels(options.pointLabels); this.plugins.pointLabels.setLabels.call(this); }; // called with scope of series $.jqplot.PointLabels.prototype.setLabels = function() { var p = this.plugins.pointLabels; var labelIdx; if (p.seriesLabelIndex != null) { labelIdx = p.seriesLabelIndex; } else if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal') { labelIdx = 0; } else { labelIdx = (this._plotData.length === 0) ? 0 : this._plotData[0].length -1; } p._labels = []; if (p.labels.length === 0 || p.labelsFromSeries) { if (p.stackedValue) { if (this._plotData.length && this._plotData[0].length){ // var idx = p.seriesLabelIndex || this._plotData[0].length -1; for (var i=0; i scr || elb + et > scb) { elem.remove(); } elem = null; helem = null; } // finally, animate them if the series is animated // if (this.renderer.animation && this.renderer.animation._supported && this.renderer.animation.show && plot._drawCount < 2) { // var sel = '.jqplot-point-label.jqplot-series-'+this.index; // $(sel).hide(); // $(sel).fadeIn(1000); // } } }; $.jqplot.postSeriesInitHooks.push($.jqplot.PointLabels.init); $.jqplot.postDrawSeriesHooks.push($.jqplot.PointLabels.draw); })(jQuery);ntop-5.0.1+dfsg1/html/jqplot/plugins/jqplot.bubbleRenderer.js0000644000000000000000000007431611762677020022744 0ustar rootroot/** * jqPlot * Pure JavaScript plotting plugin using jQuery * * Version: 1.0.0b2_r1012 * * Copyright (c) 2009-2011 Chris Leonello * jqPlot is currently available for use in all personal or commercial projects * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can * choose the license that best suits your project and use it accordingly. * * Although not required, the author would appreciate an email letting him * know of any substantial use of jqPlot. You can reach the author at: * chris at jqplot dot com or see http://www.jqplot.com/info.php . * * If you are feeling kind and generous, consider supporting the project by * making a donation at: http://www.jqplot.com/donate.php . * * sprintf functions contained in jqplot.sprintf.js by Ash Searle: * * version 2007.04.27 * author Ash Searle * http://hexmen.com/blog/2007/03/printf-sprintf/ * http://hexmen.com/js/sprintf.js * The author (Ash Searle) has placed this code in the public domain: * "This code is unrestricted: you are free to use it however you like." * */ (function($) { var arrayMax = function( array ){ return Math.max.apply( Math, array ); }; var arrayMin = function( array ){ return Math.min.apply( Math, array ); }; /** * Class: $.jqplot.BubbleRenderer * Plugin renderer to draw a bubble chart. A Bubble chart has data points displayed as * colored circles with an optional text label inside. To use * the bubble renderer, you must include the bubble renderer like: * * > * * Data must be supplied in * the form: * * > [[x1, y1, r1,