From b485aab7e71c1625cfc27e0f92c9509f42378458 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 5 May 2024 13:19:16 +0200 Subject: Adding upstream version 1.45.3+dfsg. Signed-off-by: Daniel Baumann --- src/fluent-bit/lib/monkey/qa/README.txt | 20 ++ src/fluent-bit/lib/monkey/qa/TEMPLATE | 26 ++ src/fluent-bit/lib/monkey/qa/__CONFIG | 10 + src/fluent-bit/lib/monkey/qa/__MACROS | 51 ++++ src/fluent-bit/lib/monkey/qa/checklog | 239 +++++++++++++++++ .../lib/monkey/qa/connection_http10_01.htt | 26 ++ .../lib/monkey/qa/connection_http10_02.htt | 28 ++ .../lib/monkey/qa/connection_http10_03.htt | 27 ++ .../lib/monkey/qa/connection_http11_01.htt | 27 ++ .../lib/monkey/qa/connection_http11_02.htt | 28 ++ .../lib/monkey/qa/connection_http11_03.htt | 30 +++ .../lib/monkey/qa/directory_redirect_01.htt | 33 +++ .../lib/monkey/qa/directory_redirect_02.htt | 33 +++ .../lib/monkey/qa/directory_redirect_03.htt | 33 +++ src/fluent-bit/lib/monkey/qa/docs_httest.txt | 181 +++++++++++++ src/fluent-bit/lib/monkey/qa/error_400_test01.htt | 26 ++ src/fluent-bit/lib/monkey/qa/error_404.htt | 26 ++ src/fluent-bit/lib/monkey/qa/error_411.htt | 26 ++ src/fluent-bit/lib/monkey/qa/error_413_01.htt | 28 ++ src/fluent-bit/lib/monkey/qa/error_413_02.htt | 297 +++++++++++++++++++++ src/fluent-bit/lib/monkey/qa/error_501.htt | 26 ++ src/fluent-bit/lib/monkey/qa/error_505.htt | 27 ++ src/fluent-bit/lib/monkey/qa/head_01.htt | 23 ++ src/fluent-bit/lib/monkey/qa/head_02.htt | 29 ++ .../lib/monkey/qa/headers_case_insensitive.htt | 36 +++ src/fluent-bit/lib/monkey/qa/hexa.htt | 26 ++ src/fluent-bit/lib/monkey/qa/host_port_01.htt | 27 ++ src/fluent-bit/lib/monkey/qa/host_port_02.htt | 25 ++ src/fluent-bit/lib/monkey/qa/host_port_03.htt | 25 ++ src/fluent-bit/lib/monkey/qa/http_parse_01.htt | 23 ++ .../lib/monkey/qa/if_modified_since_test01.htt | 32 +++ .../lib/monkey/qa/if_modified_since_test02.htt | 38 +++ .../lib/monkey/qa/if_modified_since_test03.htt | 50 ++++ .../lib/monkey/qa/if_modified_since_test04.htt | 38 +++ src/fluent-bit/lib/monkey/qa/keepalive_01.htt | 30 +++ src/fluent-bit/lib/monkey/qa/keepalive_02.htt | 32 +++ src/fluent-bit/lib/monkey/qa/last_modified_01.htt | 30 +++ src/fluent-bit/lib/monkey/qa/path_traversal01.htt | 27 ++ src/fluent-bit/lib/monkey/qa/path_traversal02.htt | 27 ++ src/fluent-bit/lib/monkey/qa/path_traversal03.htt | 27 ++ src/fluent-bit/lib/monkey/qa/post_test01.htt | 26 ++ src/fluent-bit/lib/monkey/qa/post_test02.htt | 33 +++ src/fluent-bit/lib/monkey/qa/post_test03.htt | 28 ++ src/fluent-bit/lib/monkey/qa/protocol_01.htt | 26 ++ src/fluent-bit/lib/monkey/qa/protocol_02.htt | 25 ++ src/fluent-bit/lib/monkey/qa/protocol_03.htt | 25 ++ src/fluent-bit/lib/monkey/qa/protocol_04.htt | 25 ++ src/fluent-bit/lib/monkey/qa/protocol_05.htt | 25 ++ src/fluent-bit/lib/monkey/qa/query.htt | 25 ++ src/fluent-bit/lib/monkey/qa/ranges_test01.htt | 37 +++ src/fluent-bit/lib/monkey/qa/ranges_test02.htt | 37 +++ src/fluent-bit/lib/monkey/qa/ranges_test03.htt | 45 ++++ src/fluent-bit/lib/monkey/qa/ranges_test04.htt | 45 ++++ src/fluent-bit/lib/monkey/qa/ranges_test05.htt | 46 ++++ src/fluent-bit/lib/monkey/qa/run_tests.sh | 119 +++++++++ src/fluent-bit/lib/monkey/qa/simple.htt | 26 ++ src/fluent-bit/lib/monkey/qa/uri_01.htt | 26 ++ src/fluent-bit/lib/monkey/qa/uri_02.htt | 27 ++ 58 files changed, 2439 insertions(+) create mode 100644 src/fluent-bit/lib/monkey/qa/README.txt create mode 100644 src/fluent-bit/lib/monkey/qa/TEMPLATE create mode 100644 src/fluent-bit/lib/monkey/qa/__CONFIG create mode 100644 src/fluent-bit/lib/monkey/qa/__MACROS create mode 100755 src/fluent-bit/lib/monkey/qa/checklog create mode 100644 src/fluent-bit/lib/monkey/qa/connection_http10_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/connection_http10_02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/connection_http10_03.htt create mode 100644 src/fluent-bit/lib/monkey/qa/connection_http11_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/connection_http11_02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/connection_http11_03.htt create mode 100644 src/fluent-bit/lib/monkey/qa/directory_redirect_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/directory_redirect_02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/directory_redirect_03.htt create mode 100644 src/fluent-bit/lib/monkey/qa/docs_httest.txt create mode 100644 src/fluent-bit/lib/monkey/qa/error_400_test01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/error_404.htt create mode 100644 src/fluent-bit/lib/monkey/qa/error_411.htt create mode 100644 src/fluent-bit/lib/monkey/qa/error_413_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/error_413_02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/error_501.htt create mode 100644 src/fluent-bit/lib/monkey/qa/error_505.htt create mode 100644 src/fluent-bit/lib/monkey/qa/head_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/head_02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/headers_case_insensitive.htt create mode 100644 src/fluent-bit/lib/monkey/qa/hexa.htt create mode 100644 src/fluent-bit/lib/monkey/qa/host_port_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/host_port_02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/host_port_03.htt create mode 100644 src/fluent-bit/lib/monkey/qa/http_parse_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/if_modified_since_test01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/if_modified_since_test02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/if_modified_since_test03.htt create mode 100644 src/fluent-bit/lib/monkey/qa/if_modified_since_test04.htt create mode 100644 src/fluent-bit/lib/monkey/qa/keepalive_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/keepalive_02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/last_modified_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/path_traversal01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/path_traversal02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/path_traversal03.htt create mode 100644 src/fluent-bit/lib/monkey/qa/post_test01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/post_test02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/post_test03.htt create mode 100644 src/fluent-bit/lib/monkey/qa/protocol_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/protocol_02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/protocol_03.htt create mode 100644 src/fluent-bit/lib/monkey/qa/protocol_04.htt create mode 100644 src/fluent-bit/lib/monkey/qa/protocol_05.htt create mode 100644 src/fluent-bit/lib/monkey/qa/query.htt create mode 100644 src/fluent-bit/lib/monkey/qa/ranges_test01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/ranges_test02.htt create mode 100644 src/fluent-bit/lib/monkey/qa/ranges_test03.htt create mode 100644 src/fluent-bit/lib/monkey/qa/ranges_test04.htt create mode 100644 src/fluent-bit/lib/monkey/qa/ranges_test05.htt create mode 100755 src/fluent-bit/lib/monkey/qa/run_tests.sh create mode 100644 src/fluent-bit/lib/monkey/qa/simple.htt create mode 100644 src/fluent-bit/lib/monkey/qa/uri_01.htt create mode 100644 src/fluent-bit/lib/monkey/qa/uri_02.htt (limited to 'src/fluent-bit/lib/monkey/qa') diff --git a/src/fluent-bit/lib/monkey/qa/README.txt b/src/fluent-bit/lib/monkey/qa/README.txt new file mode 100644 index 000000000..12c8c9e41 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/README.txt @@ -0,0 +1,20 @@ +Monkey QA Test scripts +====================== +This QA test script package has been written by +Carlos Ghan (charlie.brown.uy@gmail.com) and is +maintained by the Monkey developers team. + +In order to run this test you will need the +HTTP Test Tool installed in your system, you can +get the latest version from http://htt.sf.net/ + +Running the tests +================= +To run all tests: + ./run-tests.sh + +[Variables in run-tests.sh] +CONFIG_FILE Server parameters file (don't forget to set TEST_DOC_ROOT) +LOGFILE Log errors to this file +STOP_AT_ERRORS Stop at first error +WITH_COLOR Enable/Disable color in output diff --git a/src/fluent-bit/lib/monkey/qa/TEMPLATE b/src/fluent-bit/lib/monkey/qa/TEMPLATE new file mode 100644 index 000000000..0303d9868 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/TEMPLATE @@ -0,0 +1,26 @@ +############################################################################### +# DESCRIPTION +# Test description +# +# AUTHOR +# Author Name +# +# DATE +# Month_text Day_number Year_number +# +# COMMENTS +# Anything pertinent. +############################################################################### + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 200 OK" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/__CONFIG b/src/fluent-bit/lib/monkey/qa/__CONFIG new file mode 100644 index 000000000..74b9f117c --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/__CONFIG @@ -0,0 +1,10 @@ +# Global server settings +SET HOST=localhost +SET PORT=2001 +SET HTTPVER=HTTP/1.1 +SET HTTPVER10=HTTP/1.0 + +SET DOC_ROOT=../htdocs +SET TEST_DOC=index.html + +SET TEST_LOG_LEVEL=4 diff --git a/src/fluent-bit/lib/monkey/qa/__MACROS b/src/fluent-bit/lib/monkey/qa/__MACROS new file mode 100644 index 000000000..5e0352fef --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/__MACROS @@ -0,0 +1,51 @@ +# ---------------------------------------------------------------------------- +# INIT: Common client-initialization +# ---------------------------------------------------------------------------- +BLOCK INIT +_LOG_LEVEL $TEST_LOG_LEVEL +END + + +# ---------------------------------------------------------------------------- +# FMT_DATE: Format given time in seconds to RFC 1123 format +# Param 1: time in seconds +# Param 2: where to store result (variable-name) +# +# (note: httest' STRFTIME works with msec instead of sec) +# ---------------------------------------------------------------------------- +BLOCK FMT_DATE +_OP $1 MUL 1000 aux +_STRFTIME $aux "%a, %d %b %Y %H:%M:%S GMT" $2 +END + + +# ---------------------------------------------------------------------------- +# TESTDOC_GETSIZE: Get TEST_DOC's file size & store it in TEST_DOC_LEN variable +# ---------------------------------------------------------------------------- +BLOCK TESTDOC_GETSIZE +_MATCH EXEC "(.*)" TEST_DOC_LEN +_SH #!/bin/bash +_SH stat -c %s $DOC_ROOT/$TEST_DOC +_SH END +END + + +# ---------------------------------------------------------------------------- +# TESTDOC_GETEPOCH: Get TEST_DOC's Epoch time & store it in TEST_DOC_EPOCH +# variable +# ---------------------------------------------------------------------------- +BLOCK TESTDOC_GETEPOCH +_MATCH EXEC "(.*)" TEST_DOC_EPOCH +_SH #!/bin/bash +_SH stat -c %Y $DOC_ROOT/$TEST_DOC +_SH END +END + + +# ---------------------------------------------------------------------------- +# TESTDOC_GETDATE: Get TEST_DOC's date & store it in TEST_DOC_HTTPDATE variable +# ---------------------------------------------------------------------------- +BLOCK TESTDOC_GETDATE +_CALL TESTDOC_GETEPOCH +_CALL FMT_DATE $TEST_DOC_EPOCH TEST_DOC_HTTPDATE +END diff --git a/src/fluent-bit/lib/monkey/qa/checklog b/src/fluent-bit/lib/monkey/qa/checklog new file mode 100755 index 000000000..f1df314aa --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/checklog @@ -0,0 +1,239 @@ +#!/usr/bin/env python + +# Copyright (C) 2010, Eduardo Silva +# +# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import os +import sys +import re +import getopt +import ConfigParser + +RULES_PATH = 'log_rules' +ACCESS_FILE = '../logs/access.log' +ERROR_FILE = '../logs/error.log' + +class AccessRule: + def __init__(self, + ip = None, time = None, + method = None, uri = None, + protocol = None, status = None, + size = None): + + self.type = 'access' + self.ip = ip + self.time = time + self.method = method + self.uri = uri + self.status = status + self.protocol = protocol + self.status = status + + if size is not None: + if size.isdigit(): + self.size = size + else: + if size[:8] == 'FILESIZE': + target = size[8:].strip() + self.size = os.path.getsize(target) + else: + self.size = size + else: + self.size = size + +class ErrorRule: + def __init__(self, + ip = None, time = None, + error = None, message = None): + + self.type = 'error' + self.ip = ip + self.time = time + self.error = error + self.message = message + +class Config(ConfigParser.ConfigParser): + def __init__(self): + ConfigParser.ConfigParser.__init__(self) + + def _get_value(self, section, key): + try: + value = self.get(section, key) + except: + value = None + + return value + + def get_rules(self, path): + self.read(path) + + rules = [] + for section in self.sections(): + if section == 'access': + ip = self._get_value(section, 'ip') + time = self._get_value(section, 'time') + method = self._get_value(section, 'method') + uri = self._get_value(section, 'uri') + protocol = self._get_value(section, 'protocol') + status = self._get_value(section, 'status') + size = self._get_value(section, 'size') + + rule = AccessRule(ip, time, method, uri, protocol, status, size) + + elif section == 'error': + ip = self._get_value(section, 'ip') + time = self._get_value(section, 'time') + error = self._get_value(section, 'error') + message = self._get_value(section, 'message') + + rule = ErrorRule(ip, time, error, message) + + # Add rule to list + rules.append(rule) + + return rules + +class Logfile: + + def __init__(self): + self.silent_mode = False + self.target_logfile = None + + self.check_arguments() + + # Check if file exists + if os.path.isfile(self.target_logfile) is False: + # No rules exists for this test + if self.silent_mode is False: + print "No rules for target" + exit(2) + + # Read rules + config = Config() + rules = config.get_rules(self.target_logfile) + + if len(rules) == 0: + if self.silent_mode is False: + print "Error, no rules found on target file" + exit(2) + + # Check rules + self.check_rules(rules) + + def check_arguments(self): + optlist, args = getopt.getopt(sys.argv[1:], 'shl:') + for key, val in optlist: + if key == '-s': + self.silent_mode = True + elif key == '-l': + self.target_logfile = val + elif key == '-h': + self.help() + + if self.target_logfile is None: + self.help() + + def help(self): + print "** Monkey QA Checklog **" + print "Usage: ./checklog [-s] [-l logfile_rules]" + print "\nAvailable options" + print " -s Run checklog in silent mode, no messages to stdout" + print " -l logfile Specify the logfile rule" + print " -h Show this help" + print + exit(1) + + def get_last_file_line(self, file): + f = open(file, 'r') + lines = f.readlines() + f.close() + + if len(lines) < 1: + + return None + + # get last file line + last = lines[len(lines) - 1] + return last + + def check_field(self, rule, log): + if rule is not None: + if str(rule) != str(log): + if self.silent_mode is False: + print "Rule does not match, expect '" + str(rule) + '\' got \'' + log + '\'' + exit(1) + else: + return 0 + else: + return 0 + + def check_rules(self, rules): + # Parse access log format, anyone is invited to fix this nasty regex + access_re = re.compile("^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})( - )(\[.*\])( .* ){1,4}(/.* )(.*/.* )(\d.* )(.*)\n$") + error_re = re.compile("^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})( - )(\[.*\])( \[.*\])(.*)$") + + for r in rules: + if r.type == 'access': + line = self.get_last_file_line(ACCESS_FILE) + fields = access_re.split(line) + + data = {'ip': fields[1], + 'time': fields[3], + 'method': fields[4].strip(), + 'uri': fields[5].strip(), + 'protocol': fields[6].strip(), + 'status': fields[7].strip(), + 'size': fields[8] + } + + self.check_field(r.ip, data['ip']) + self.check_field(r.time, data['time']) + self.check_field(r.method, data['method']) + self.check_field(r.uri, data['uri']) + self.check_field(r.protocol, data['protocol']) + self.check_field(r.status, data['status']) + self.check_field(r.size, data['size']) + + elif r.type == 'error': + line = self.get_last_file_line(ERROR_FILE) + fields = error_re.split(line) + + # We always expect at least 4 fields + if len(fields) < 4: + if self.silent_mode is False: + print "Error: we did not find the expected fields" + print "Logfile line" + print " %s " % line + exit(1) + + data = {'ip': fields[1], + 'time': fields[3], + 'error': fields[4].strip('[error (\d)]'), + 'message': fields[5].strip() + } + + self.check_field(r.ip, data['ip']) + self.check_field(r.time, data['time']) + self.check_field(r.error, data['error']) + self.check_field(r.message, data['message']) + + + if self.silent_mode is False: + print "Check passed :)" + +if __name__ == '__main__': + Logfile() + diff --git a/src/fluent-bit/lib/monkey/qa/connection_http10_01.htt b/src/fluent-bit/lib/monkey/qa/connection_http10_01.htt new file mode 100644 index 000000000..125c519ed --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/connection_http10_01.htt @@ -0,0 +1,26 @@ +############################################################################### +# DESCRIPTION +# HTTP/1.0 request expect 'Connection: close' +# +# AUTHOR +# Eduardo Silva +# +# DATE +# March 16 2010 +# +# COMMENTS +# Server must return a 200 response. +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER10 +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "Connection: Close" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/connection_http10_02.htt b/src/fluent-bit/lib/monkey/qa/connection_http10_02.htt new file mode 100644 index 000000000..be17928e9 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/connection_http10_02.htt @@ -0,0 +1,28 @@ +############################################################################### +# DESCRIPTION +# HTTP/1.0 Request with 'Connection: Keep-Alive'. +# +# AUTHOR +# Eduardo Silva +# +# DATE +# March 16 2010 +# +# COMMENTS +# Do not expect header response with keep-alive header +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER10 +__Connection: Keep-Alive +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "!Keep-Alive: timeout=5, max=1000" +_EXPECT . "Connection: Keep-Alive" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/connection_http10_03.htt b/src/fluent-bit/lib/monkey/qa/connection_http10_03.htt new file mode 100644 index 000000000..4fbaa7bdc --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/connection_http10_03.htt @@ -0,0 +1,27 @@ +############################################################################### +# DESCRIPTION +# HTTP/1.0 Request with an invalid 'Connection' header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# March 16 2010 +# +# COMMENTS +# Expect 'Connection: closed' from server +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER10 +__Connection: an invalid value +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "Connection: Close" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/connection_http11_01.htt b/src/fluent-bit/lib/monkey/qa/connection_http11_01.htt new file mode 100644 index 000000000..f8a32f576 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/connection_http11_01.htt @@ -0,0 +1,27 @@ +############################################################################### +# DESCRIPTION +# Server must not send connection header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# March 17 2010 +# +# COMMENTS +# Do not Expect 'Connection:' from server +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "!Connection:" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/connection_http11_02.htt b/src/fluent-bit/lib/monkey/qa/connection_http11_02.htt new file mode 100644 index 000000000..f120fbcb2 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/connection_http11_02.htt @@ -0,0 +1,28 @@ +############################################################################### +# DESCRIPTION +# Server must not send connection header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# March 17 2011 +# +# COMMENTS +# Do Expect 'Connection:' from server +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "Connection: Close" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/connection_http11_03.htt b/src/fluent-bit/lib/monkey/qa/connection_http11_03.htt new file mode 100644 index 000000000..e032a9455 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/connection_http11_03.htt @@ -0,0 +1,30 @@ +############################################################################### +# DESCRIPTION +# HTTP/1.1 Request with an invalid connection header, server must +# not send a connection header, must assume keepalive by default +# +# AUTHOR +# Eduardo Silva +# +# DATE +# March 17 2010 +# +# COMMENTS +# Do not Expect 'Connection:' header +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__Connection: an invalid value +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "!Connection:" +_EXPECT . "!Keep-Alive:" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/directory_redirect_01.htt b/src/fluent-bit/lib/monkey/qa/directory_redirect_01.htt new file mode 100644 index 000000000..3af2181f9 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/directory_redirect_01.htt @@ -0,0 +1,33 @@ +############################################################################### +# DESCRIPTION +# Check directory redirect +# +# AUTHOR +# Eduardo Silva +# +# DATE +# Jun 2 2010 +# +# COMMENTS +# Server must return a 301 moved permanently header. +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT +_CALL TESTDOC_GETDATE + +_REQ $HOST $PORT +__GET /img $HTTPVER +__Host: $HOST:$PORT +__If-Modified-Since: $TEST_DOC_HTTPDATE +__Connection: close +__ +_EXPECT . "HTTP/1.1 301 Moved Permanently" +_EXPECT . "Content-Length: 0" +_EXPECT . "Location: http://$HOST:$PORT/img/ +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/directory_redirect_02.htt b/src/fluent-bit/lib/monkey/qa/directory_redirect_02.htt new file mode 100644 index 000000000..959a15b9e --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/directory_redirect_02.htt @@ -0,0 +1,33 @@ +############################################################################### +# DESCRIPTION +# Check directory redirect, we do not set port in the Host header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# May 19 2012 +# +# COMMENTS +# Server must return a 301 moved permanently header. +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT +_CALL TESTDOC_GETDATE + +_REQ $HOST $PORT +__GET /img $HTTPVER +__Host: $HOST +__If-Modified-Since: $TEST_DOC_HTTPDATE +__Connection: close +__ +_EXPECT . "HTTP/1.1 301 Moved Permanently" +_EXPECT . "Content-Length: 0" +_EXPECT . "Location: http://$HOST/img/ +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/directory_redirect_03.htt b/src/fluent-bit/lib/monkey/qa/directory_redirect_03.htt new file mode 100644 index 000000000..1ff1f9321 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/directory_redirect_03.htt @@ -0,0 +1,33 @@ +############################################################################### +# DESCRIPTION +# Check directory redirect, we set a different port in the Host header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# May 19 2012 +# +# COMMENTS +# Server must return a 301 moved permanently header. +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT +_CALL TESTDOC_GETDATE + +_REQ $HOST $PORT +__GET /img $HTTPVER +__Host: $HOST:12345 +__If-Modified-Since: $TEST_DOC_HTTPDATE +__Connection: close +__ +_EXPECT . "HTTP/1.1 301 Moved Permanently" +_EXPECT . "Content-Length: 0" +_EXPECT . "Location: http://$HOST:12345/img/ +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/docs_httest.txt b/src/fluent-bit/lib/monkey/qa/docs_httest.txt new file mode 100644 index 000000000..07556c955 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/docs_httest.txt @@ -0,0 +1,181 @@ +Global Commands +--------------- +BLOCK +Store a block of commands to call it from a CLIENT/SERVER/BLOCK + +CLIENT [] +Client body start, close it with END and a newline + +DAEMON +Daemon body start, close it with END and a newline. +A daemon will not join CLIENT/SERVER and could therefore be used +for supervisor jobs + +END +Close CLIENT|SERVER body + +EXEC +Execute a shell command, attention executes will not join CLIENT/SERVER + +GO +Starts all client in sync mode + +INCLUDE +Load and execute defined include file, +current path is taken the callers current path + +SERVER [:] [] +Server body start, close it with END and a newline, +Do load server.cert.pem and server.key.pem if found in local directory, +number of concurrent servers, -1 for unlimited, +: SSL, SSL2, SSL3, TLS + +SET = +Store a value in a global variable + +TIMEOUT +Defines global socket timeout + + +Local Commands +------------- +-__ +Send to the socket with a CRLF at the end of line + +_- +Same like __ but no CRLF at the end of line + +_ADD_HEADER
+Add additional header to received headers to force forexample chunked encoding + +_BPS +Send not more than defined Bytes per second +close body with _END BPS + +_CALL +Call a defined block + +_CERT [] +Sets cert for the current ssl connection, mainly used for server cert + +_CHUNK +Mark the end of a chunk block, all data after last _FLUSH are counted, +does automatic add chunk info + +_CLOSE +Close the current connection and set the connection state to CLOSED + +_DEBUG +Prints to stderr for debugging reasons + +_DOWN +Shutdown listener + +_EXEC +Execute a shell command, _EXEC| will pipe the incoming stream on the +socket in to the called shell command + +_EXIT [OK|FAILED] +Exits with OK or FAILED default is FAILED + +_EXPECT . "[!]" +Define what data we do or do not expect on a WAIT command. +Negation with a leading '!' in the + +_FLUSH +Flush the cached lines, +the AUTO Content-Length calculation will take place here + +_HEADER ALLOW|FILTER
+Defines allowed headers or headers to filter, +default all headers are allowed and no headers are filtered. +Filter only for receive mechanisme + +_IF "" MATCH "[!]" +Test if variable do or do not match the regex, close body with _END IF, +negation with a leading '!' in the , + must not be empty + +_IGNORE_ERR +This command is Depreciated, do not use it +Ignores errors specified in , +i.e. ".*" would ignore all errors, only .* is implemented + +_LOG_LEVEL +Level is a number 0-4 + +_LOOP +Do loop the body times, +close body with _END LOOP + +_MATCH (headers|body|error) "" +Define a regex with a match which should be stored in + +_MATCH EXEC "" +_EXEC algun_comando +(No documentado; aparece en los ejemplos de la página web) +Hace lo mismo que _MATCH pero con la salida del comando ejecutado en _EXEC + +_ONLY_PRINTABLE on|off +Replace all chars below 32 and above 127 with a space + +_OP ADD|SUB|DIV|MUL +Store evaluated expression + +_PIPE [chunked []] +Start a pipe for stream the output of EXEC to the socket stream, +wiht optional chunk support + +_RAND +Generates a number between and + +_RECV |POLL +Receive an amount of bytes, either specified by a number +or as much until socket timeout will in POLL mode + +_REQ [:][:] [ []] +Start a request to defined host:port, with SSL support. +Does only open a new connection if we are in connection state CLOSED +: SSL, SSL2, SSL3, TLS:Additional tag info do support multiple connection to one target +, and are optional for client/server authentication + +_RES +Wait for a connection accept + +_SENDFILE +Send file over http + +_SET = +Store a value in a local variable + +_SH shell script line or END +Embedded shell script within a tmp file, execute if END is found + +_SLEEP +Sleep for defined amount of time + +_SOCKSTATE +Stores connection state CLOSED or CONNECTED in the + +_SYNC +Synchronise to the next full second + +_TIME +Store time in variable [ms] + +_TIMEOUT +Set socket timeout of current socket + +_UP +Setup listener + +_VERIFY_PEER +Gets peer cert and validate it + +_WAIT [] +Wait for data and receive them. +EXPECT and MATCH definitions will be checked here on the incoming data. +Optional you could receive a specific amount of bytes + +_WHICH +Stores the concurrency number of current thread diff --git a/src/fluent-bit/lib/monkey/qa/error_400_test01.htt b/src/fluent-bit/lib/monkey/qa/error_400_test01.htt new file mode 100644 index 000000000..e6d7e7fa0 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/error_400_test01.htt @@ -0,0 +1,26 @@ +################################################################################ +# DESCRIPTION +# Exercise error 400 +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +# +# COMMENTS +# Sending a bad request. In this case, one with missing "Host" header. +# ("Host" header is required in HTTP v1.1) +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__Connection: close +__ +_EXPECT . "HTTP/1.1 400 Bad Request" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/error_404.htt b/src/fluent-bit/lib/monkey/qa/error_404.htt new file mode 100644 index 000000000..2860048cb --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/error_404.htt @@ -0,0 +1,26 @@ +################################################################################ +# DESCRIPTION +# Exercise error 404 +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +# +# COMMENTS +# Requesting an inexistent object should return "Not Found" +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET /a_file_that_doesnt_exists.html $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 404 Not Found" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/error_411.htt b/src/fluent-bit/lib/monkey/qa/error_411.htt new file mode 100644 index 000000000..95c8d22b4 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/error_411.htt @@ -0,0 +1,26 @@ +################################################################################ +# DESCRIPTION +# Exercise error 411 +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +# +# COMMENTS +# A POST request without "Content-Length" should return "Length Required" +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__POST / $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 411 Length Required" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/error_413_01.htt b/src/fluent-bit/lib/monkey/qa/error_413_01.htt new file mode 100644 index 000000000..d9b519d23 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/error_413_01.htt @@ -0,0 +1,28 @@ +################################################################################ +# DESCRIPTION +# Exercise error 413 +# +# AUTHOR +# Eduardo Silva +# +# DATE +# July 11 2010 +# +# COMMENTS +# A POST request with a higher content-lengt header, it should +# return "413 Request Entity Too Large" +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__POST / $HTTPVER +__Host: $HOST +__Content-Length: 999999999999999999999 +__Connection: close +__ +_EXPECT . "HTTP/1.1 413 Request Entity Too Large" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/error_413_02.htt b/src/fluent-bit/lib/monkey/qa/error_413_02.htt new file mode 100644 index 000000000..7a5b6af25 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/error_413_02.htt @@ -0,0 +1,297 @@ +################################################################################ +# DESCRIPTION +# Exercise error 413 +# +# AUTHOR +# Eduardo Silva +# +# DATE +# July 11 2010 +# +# COMMENTS +# A very long request, it should return "413 Request Entity Too Large" +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__Header1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +__Header2: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +__Header3: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +__Header4: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__HeaderD: mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm +__HeaderE: nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn +__HeaderF: oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +__Header1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +__Header2: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +__Header3: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +__Header4: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__HeaderD: mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm +__HeaderE: nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn +__HeaderF: oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo +__Header1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +__Header2: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +__Header3: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +__Header4: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg +__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj +__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk +__Connection: close +__ +_EXPECT . "HTTP/1.1 413 Request Entity Too Large" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/error_501.htt b/src/fluent-bit/lib/monkey/qa/error_501.htt new file mode 100644 index 000000000..275bca4f3 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/error_501.htt @@ -0,0 +1,26 @@ +################################################################################ +# DESCRIPTION +# Exercise error 501 +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +# +# COMMENTS +# Requesting an unsupported method should return "Not Implemented" +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__1234 / $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 501 Not Implemented" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/error_505.htt b/src/fluent-bit/lib/monkey/qa/error_505.htt new file mode 100644 index 000000000..f50fafe3d --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/error_505.htt @@ -0,0 +1,27 @@ +################################################################################ +# DESCRIPTION +# Exercise error 505 +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +# +# COMMENTS +# Requesting an unsupported HTTP version should return "HTTP Version Not +# Supported" +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET / HTTP/1.9 +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 505 HTTP Version Not Supported" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/head_01.htt b/src/fluent-bit/lib/monkey/qa/head_01.htt new file mode 100644 index 000000000..6956c4746 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/head_01.htt @@ -0,0 +1,23 @@ +################################################################################ +# DESCRIPTION +# HEAD method. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__HEAD / $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 200 OK" +_WAIT 0 +END diff --git a/src/fluent-bit/lib/monkey/qa/head_02.htt b/src/fluent-bit/lib/monkey/qa/head_02.htt new file mode 100644 index 000000000..149cbce9d --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/head_02.htt @@ -0,0 +1,29 @@ +################################################################################ +# DESCRIPTION +# HEAD method must return content length +# +# AUTHOR +# Eduardo Silva +# +# DATE +# February 17 2011 +# +# COMMENTS +# In some recent versions (0.12.x), the content-length is not being +# sent for HEAD request method, adding this QA file to avoid regressions. +# +################################################################################ + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__HEAD / $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "Content-Length" +_EXPECT . "Content-Type" +_WAIT 0 +END diff --git a/src/fluent-bit/lib/monkey/qa/headers_case_insensitive.htt b/src/fluent-bit/lib/monkey/qa/headers_case_insensitive.htt new file mode 100644 index 000000000..d2154bfaf --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/headers_case_insensitive.htt @@ -0,0 +1,36 @@ +################################################################################ +# DESCRIPTION +# Test that headers are treated as case insensitive. (RFC2616 Section 4.2) +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +################################################################################ + + +INCLUDE __CONFIG +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__HOST: $HOST +__CONNECTION: close +__ +_EXPECT . "HTTP/1.1 200 OK" +_WAIT +_CLOSE + +_REQ $HOST $PORT +__POST / $HTTPVER +__HOST: $HOST +__CONNECTION: close +__CONTENT-TYPE: text/plain +__CONTENT-LENGTH: AUTO +__ +_-This is a test entity body. +_EXPECT . "HTTP/1.1 200 OK" +_WAIT +_CLOSE + +END diff --git a/src/fluent-bit/lib/monkey/qa/hexa.htt b/src/fluent-bit/lib/monkey/qa/hexa.htt new file mode 100644 index 000000000..059df4fb8 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/hexa.htt @@ -0,0 +1,26 @@ +################################################################################ +# DESCRIPTION +# Test request in hexadecimal format. +# +# AUTHOR +# Eduardo Silva +# +# DATE +# March 16 2010 +# +# COMMENTS +# Simple "index.html" +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET /%69%6E%64%65%78.%68%74%6D%6C $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 200 OK" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/host_port_01.htt b/src/fluent-bit/lib/monkey/qa/host_port_01.htt new file mode 100644 index 000000000..9dd58cf6b --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/host_port_01.htt @@ -0,0 +1,27 @@ +################################################################################ +# DESCRIPTION +# Validation for TCP port in the Host header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# Jun 15 2012 +# +# COMMENTS +# It send a valid host TCP port with the max length allowed +# +################################################################################ + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__HEAD / $HTTPVER +__Host: $HOST:20000 +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "Content-Length" +_EXPECT . "Content-Type" +_WAIT 0 +END diff --git a/src/fluent-bit/lib/monkey/qa/host_port_02.htt b/src/fluent-bit/lib/monkey/qa/host_port_02.htt new file mode 100644 index 000000000..56172db6a --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/host_port_02.htt @@ -0,0 +1,25 @@ +################################################################################ +# DESCRIPTION +# Validation for TCP port in the Host header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# Jun 15 2012 +# +# COMMENTS +# It send an invalid host TCP port, length >= 6 +# +################################################################################ + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__HEAD / $HTTPVER +__Host: $HOST:202001 +__ +_EXPECT . "HTTP/1.1 400 Bad Request" +_WAIT 0 +END diff --git a/src/fluent-bit/lib/monkey/qa/host_port_03.htt b/src/fluent-bit/lib/monkey/qa/host_port_03.htt new file mode 100644 index 000000000..f78e2ea05 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/host_port_03.htt @@ -0,0 +1,25 @@ +################################################################################ +# DESCRIPTION +# Validation for TCP port in the Host header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# Jun 15 2012 +# +# COMMENTS +# It send a valid host TCP port using not numeric values +# +################################################################################ + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__HEAD / $HTTPVER +__Host: $HOST:2000a +__ +_EXPECT . "HTTP/1.1 400 Bad Request" +_WAIT 0 +END diff --git a/src/fluent-bit/lib/monkey/qa/http_parse_01.htt b/src/fluent-bit/lib/monkey/qa/http_parse_01.htt new file mode 100644 index 000000000..ec11658b7 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/http_parse_01.htt @@ -0,0 +1,23 @@ +################################################################################ +# DESCRIPTION +# It sends an invalid Host header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# April 04 2012 +################################################################################ + + +INCLUDE __CONFIG +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: [::1]:AABB +__Connection: close +__ +_EXPECT . "HTTP/1.1 400 Bad Request" +_WAIT +_CLOSE +END diff --git a/src/fluent-bit/lib/monkey/qa/if_modified_since_test01.htt b/src/fluent-bit/lib/monkey/qa/if_modified_since_test01.htt new file mode 100644 index 000000000..3124e700d --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/if_modified_since_test01.htt @@ -0,0 +1,32 @@ +############################################################################### +# DESCRIPTION +# Trivial test for If-Modified-Since header. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# January 27 2010 +# +# COMMENTS +# Server must return a 304 response, since we are passing the requested file's +# date as If-Modified-Since's parameter. +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT +_CALL TESTDOC_GETDATE + +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__If-Modified-Since: $TEST_DOC_HTTPDATE +__Connection: close +__ +_EXPECT . "HTTP/1.1 304 Not Modified" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/if_modified_since_test02.htt b/src/fluent-bit/lib/monkey/qa/if_modified_since_test02.htt new file mode 100644 index 000000000..45a4f87a2 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/if_modified_since_test02.htt @@ -0,0 +1,38 @@ +############################################################################### +# DESCRIPTION +# Trivial test for If-Modified-Since header. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# January 27 2010 +# +# COMMENTS +# Server must return a 304 response, since we are passing a date 1-week after +# requested file's date as If-Modified-Since's parameter. +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT +_CALL TESTDOC_GETEPOCH + +# 604800 seconds = 1 week +_OP $TEST_DOC_EPOCH ADD 604800 TEST_DOC_EPOCH + +# Format date +_CALL FMT_DATE $TEST_DOC_EPOCH TEST_DOC_HTTPDATE + +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__If-Modified-Since: $TEST_DOC_HTTPDATE +__Connection: close +__ +_EXPECT . "HTTP/1.1 304 Not Modified" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/if_modified_since_test03.htt b/src/fluent-bit/lib/monkey/qa/if_modified_since_test03.htt new file mode 100644 index 000000000..90f3cd036 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/if_modified_since_test03.htt @@ -0,0 +1,50 @@ +############################################################################### +# DESCRIPTION +# Test server's response against invalid If-Modified-Since header values. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# January 27 2010 +# +# COMMENTS +# Server must return a 200 response (RFC 2616 Section 14.25a) +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT + +# Garbage in If-Modified-Since header +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__If-Modified-Since: i'm a bad monkey }:] +__Connection: Keep-Alive +__ +_EXPECT . "HTTP/1.1 200 OK" +_WAIT + +# Some invalid dates +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__If-Modified-Since: Sat, 30 Feb 2009 14:40:57 GMT +__Connection: Keep-Alive +__ +_EXPECT . "HTTP/1.1 200 OK" +_WAIT + +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__If-Modified-Since: Sat, 21 Nov 9999 14:40:57 GMT +__Connection: close +__ +_EXPECT . "HTTP/1.1 304 Not Modified" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/if_modified_since_test04.htt b/src/fluent-bit/lib/monkey/qa/if_modified_since_test04.htt new file mode 100644 index 000000000..ca5e593d5 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/if_modified_since_test04.htt @@ -0,0 +1,38 @@ +############################################################################### +# DESCRIPTION +# Trivial test for If-Modified-Since header. +# +# AUTHOR +# Sonny Karlsson +# +# DATE +# July 10 2013 +# +# COMMENTS +# Server must return a 200 response, since we are passing a time 1 +# min before requested file's date as If-Modified-Since's parameter. +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT +_CALL TESTDOC_GETEPOCH + +# Test +_OP $TEST_DOC_EPOCH SUB 60 TEST_DOC_EPOCH + +# Format date +_CALL FMT_DATE $TEST_DOC_EPOCH TEST_DOC_HTTPDATE + +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__If-Modified-Since: $TEST_DOC_HTTPDATE +__Connection: close +__ +_EXPECT . "HTTP/1.1 200 OK" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/keepalive_01.htt b/src/fluent-bit/lib/monkey/qa/keepalive_01.htt new file mode 100644 index 000000000..dd61649f1 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/keepalive_01.htt @@ -0,0 +1,30 @@ +############################################################################### +# DESCRIPTION +# HTTP/1.1 Request requesting Keep-Alive, we expect the server keeps the +# keep-alive open and send proper header responses for that. +# +# AUTHOR +# Eduardo Silva +# +# DATE +# February 26 2011 +# +# COMMENTS +# Do not Expect 'Connection: Close' +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__Connection: Keep-Alive +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "!Connection: Closed" +_WAIT + +END diff --git a/src/fluent-bit/lib/monkey/qa/keepalive_02.htt b/src/fluent-bit/lib/monkey/qa/keepalive_02.htt new file mode 100644 index 000000000..e618a01de --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/keepalive_02.htt @@ -0,0 +1,32 @@ +############################################################################### +# DESCRIPTION +# HTTP/1.0 Request requesting Keep-Alive, we expect the server keeps the +# keep-alive open and send proper header responses for that. +# +# AUTHOR +# Eduardo Silva +# +# DATE +# December 14 2014 +# +# COMMENTS +# This is a HTTP/1.0 test +# Do not Expect 'Connection: Close' +# Do Expect 'Connection: Keep-Alive' +############################################################################### + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER10 +__Host: $HOST +__Connection: Keep-Alive +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "!Connection: Closed" +_EXPECT . "Connection: Keep-Alive" +_WAIT + +END diff --git a/src/fluent-bit/lib/monkey/qa/last_modified_01.htt b/src/fluent-bit/lib/monkey/qa/last_modified_01.htt new file mode 100644 index 000000000..dfc4c51a0 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/last_modified_01.htt @@ -0,0 +1,30 @@ +############################################################################### +# DESCRIPTION +# Trivial test to check Last-Modified header +# +# AUTHOR +# Eduardo Silva +# +# DATE +# Jun 26 2010 +# +# COMMENTS +# Server must return the Last-Modified header. +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT + +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__ +_EXPECT . "HTTP/1.1 200 OK" +_EXPECT . "Last-Modified:" +_EXPECT . "Content-Length:" +_WAIT 0 +END diff --git a/src/fluent-bit/lib/monkey/qa/path_traversal01.htt b/src/fluent-bit/lib/monkey/qa/path_traversal01.htt new file mode 100644 index 000000000..19a40abcf --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/path_traversal01.htt @@ -0,0 +1,27 @@ +################################################################################ +# DESCRIPTION +# Test against directory traversal (client must not be allowed to "get out" of +# DocumentRoot. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# March 08 2010 +# +# COMMENTS +# Simple "../" +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET /../conf/monkey.conf $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 403 Forbidden" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/path_traversal02.htt b/src/fluent-bit/lib/monkey/qa/path_traversal02.htt new file mode 100644 index 000000000..793c383a5 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/path_traversal02.htt @@ -0,0 +1,27 @@ +################################################################################ +# DESCRIPTION +# Test against directory traversal (client must not be allowed to "get out" of +# DocumentRoot. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# March 08 2010 +# +# COMMENTS +# Using URL-encoded hex values +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET /%2e%2e/conf/monkey.conf $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 403 Forbidden" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/path_traversal03.htt b/src/fluent-bit/lib/monkey/qa/path_traversal03.htt new file mode 100644 index 000000000..37e165330 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/path_traversal03.htt @@ -0,0 +1,27 @@ +################################################################################ +# DESCRIPTION +# Test against directory traversal (client must not be allowed to "get out" of +# DocumentRoot. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# March 08 2010 +# +# COMMENTS +# Mixing dots and %2e +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET /%2e%2e/../%2e./.%2e/../%2e%2e/../../%2e./.%2e/etc/motd $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 403 Forbidden" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/post_test01.htt b/src/fluent-bit/lib/monkey/qa/post_test01.htt new file mode 100644 index 000000000..856afdc5d --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/post_test01.htt @@ -0,0 +1,26 @@ +################################################################################ +# DESCRIPTION +# POST method. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +############################################################################### + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__POST / $HTTPVER +__Host: $HOST +__Content-Type: text/plain +__Content-Length: AUTO +__Connection: close +__ +_-someVariable=1234&daemon=monkeyd&SESSION=e1d83283d597ca88f599e34c8ef2e8c3 +_EXPECT . "HTTP/1.1 200 OK" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/post_test02.htt b/src/fluent-bit/lib/monkey/qa/post_test02.htt new file mode 100644 index 000000000..b323be884 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/post_test02.htt @@ -0,0 +1,33 @@ +################################################################################ +# DESCRIPTION +# An incomplete POST request. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +# +# COMMENTS +# A POST request with missing Content-Length.(Should return "Length Required") +################################################################################ + +# Why post_test02.htt sometimes fail ? +# ------------------------------------ +# it fails because the httest tool catch the close connection from Monkey before it +# finish to send the whole request, Monkey will not continue working in a request +# which will not work properly, bad monkey >:D + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__POST / $HTTPVER +__Host: $HOST +__Content-Type: text/plain +__Connection: close +__ +_-someVariable=1234&daemon=monkeyd&SESSION=e1d83283d597ca88f599e34c8ef2e8c3 +_EXPECT . "HTTP/1.1 411 Length Required" +_WAIT 0 +END diff --git a/src/fluent-bit/lib/monkey/qa/post_test03.htt b/src/fluent-bit/lib/monkey/qa/post_test03.htt new file mode 100644 index 000000000..7604c8234 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/post_test03.htt @@ -0,0 +1,28 @@ +################################################################################ +# DESCRIPTION +# An incomplete POST request. +# +# AUTHOR +# Eduardo Silva +# +# DATE +# July 25, 2010 +# +# COMMENTS +# A POST request with missing post data, the server must close the +# connection due to timeout +################################################################################ + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__POST / $HTTPVER +__Host: $HOST +__Content-Length: 10 +__Content-Type: text/plain +__Connection: close +__ +_EXPECT ERROR "End of file found\(70014\)" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/protocol_01.htt b/src/fluent-bit/lib/monkey/qa/protocol_01.htt new file mode 100644 index 000000000..6040a5c8f --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/protocol_01.htt @@ -0,0 +1,26 @@ +################################################################################ +# DESCRIPTION +# Exercise error 400 +# +# AUTHOR +# Eduardo Silva +# +# DATE +# June 23 2010 +# +# COMMENTS +# Sending a bad request. This request contain double \\ and an +# unsupported protocol. +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET /\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ a +__Connection: close +__ +_EXPECT . "HTTP/1.1 505 HTTP Version Not Supported" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/protocol_02.htt b/src/fluent-bit/lib/monkey/qa/protocol_02.htt new file mode 100644 index 000000000..a94b62e20 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/protocol_02.htt @@ -0,0 +1,25 @@ +################################################################################ +# DESCRIPTION +# Exercise error 400 +# +# AUTHOR +# Eduardo Silva +# +# DATE +# June 23 2010 +# +# COMMENTS +# Sending protocol in lower case. +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET / http/1.0 +__Connection: close +__ +_EXPECT . "HTTP/1.1 505 HTTP Version Not Supported" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/protocol_03.htt b/src/fluent-bit/lib/monkey/qa/protocol_03.htt new file mode 100644 index 000000000..89258ddf9 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/protocol_03.htt @@ -0,0 +1,25 @@ +################################################################################ +# DESCRIPTION +# Exercise error 400 +# +# AUTHOR +# Eduardo Silva +# +# DATE +# June 23 2010 +# +# COMMENTS +# Request without HTTP protocol version (nothing after URI) +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET / +__Connection: close +__ +_EXPECT . "HTTP/1.1 400 Bad Request" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/protocol_04.htt b/src/fluent-bit/lib/monkey/qa/protocol_04.htt new file mode 100644 index 000000000..bdbde90b1 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/protocol_04.htt @@ -0,0 +1,25 @@ +################################################################################ +# DESCRIPTION +# Exercise error 400 +# +# AUTHOR +# Eduardo Silva +# +# DATE +# June 23 2010 +# +# COMMENTS +# Request without HTTP protocol version +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET / +__Connection: close +__ +_EXPECT . "HTTP/1.1 505 HTTP Version Not Supported" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/protocol_05.htt b/src/fluent-bit/lib/monkey/qa/protocol_05.htt new file mode 100644 index 000000000..91462803f --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/protocol_05.htt @@ -0,0 +1,25 @@ +################################################################################ +# DESCRIPTION +# Exercise error 400 +# +# AUTHOR +# Eduardo Silva +# +# DATE +# June 23 2010 +# +# COMMENTS +# Request with a Query String without HTTP protocol version, +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET /?a=1 +__Connection: close +__ +_EXPECT . "HTTP/1.1 400 Bad Request" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/query.htt b/src/fluent-bit/lib/monkey/qa/query.htt new file mode 100644 index 000000000..eec3bd20e --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/query.htt @@ -0,0 +1,25 @@ +################################################################################ +# DESCRIPTION +# A simple GET query. +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +################################################################################ + + +INCLUDE __CONFIG + +SET QUERY=server=monkeyd&version=0.10git&someVariable=someValue&num=1234 + +CLIENT +_REQ $HOST $PORT +__GET /?$QUERY $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 200 OK" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/ranges_test01.htt b/src/fluent-bit/lib/monkey/qa/ranges_test01.htt new file mode 100644 index 000000000..cb5b577a5 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/ranges_test01.htt @@ -0,0 +1,37 @@ +############################################################################### +# DESCRIPTION +# Test partial content request. Range type: 0- (from offset 0 to end) +# +# AUTHOR +# Carlos Ghan +# +# DATE +# February 02 2010 +# +# COMMENTS +# RFC 2616 Section 14.35 +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT +_CALL TESTDOC_GETSIZE + +# Last offset = document_length - 1 +_OP $TEST_DOC_LEN SUB 1 TEST_DOC_LAST + +_REQ $HOST $PORT +__GET /$TEST_DOC $HTTPVER +__Host: $HOST +__Range: bytes=0- +__Connection: close +__ +_EXPECT . "HTTP/1.1 206 Partial Content" +_EXPECT . "Date:" +_EXPECT . "Content-Range: bytes 0-${TEST_DOC_LAST}/${TEST_DOC_LEN}" +_EXPECT . "Content-Length: $TEST_DOC_LEN" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/ranges_test02.htt b/src/fluent-bit/lib/monkey/qa/ranges_test02.htt new file mode 100644 index 000000000..bdad83f93 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/ranges_test02.htt @@ -0,0 +1,37 @@ +############################################################################### +# DESCRIPTION +# Test partial content request. Range type: -1 (last byte) +# +# AUTHOR +# Carlos Ghan +# +# DATE +# February 02 2010 +# +# COMMENTS +# RFC 2616 Section 14.35 +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +CLIENT +_CALL INIT +_CALL TESTDOC_GETSIZE + +# Last offset = document_length - 1 +_OP $TEST_DOC_LEN SUB 1 TEST_DOC_LAST + +_REQ $HOST $PORT +__GET /$TEST_DOC $HTTPVER +__Host: $HOST +__Range: bytes=-1 +__Connection: close +__ +_EXPECT . "HTTP/1.1 206 Partial Content" +_EXPECT . "Date:" +_EXPECT . "Content-Range: bytes ${TEST_DOC_LAST}-${TEST_DOC_LAST}/${TEST_DOC_LEN}" +_EXPECT . "Content-Length: 1" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/ranges_test03.htt b/src/fluent-bit/lib/monkey/qa/ranges_test03.htt new file mode 100644 index 000000000..6cbfeee31 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/ranges_test03.htt @@ -0,0 +1,45 @@ +############################################################################### +# DESCRIPTION +# Test partial content request. Range type: x-y (between offsets x and y inc.) +# +# AUTHOR +# Carlos Ghan +# +# DATE +# February 02 2010 +# +# COMMENTS +# RFC 2616 Section 14.35 +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +# Start offset +SET OFF_START=100 + +# End offset +SET OFF_END=200 + +CLIENT +_CALL INIT +_CALL TESTDOC_GETSIZE + +_REQ $HOST $PORT +__GET /$TEST_DOC $HTTPVER +__Host: $HOST +__Range: bytes=${OFF_START}-${OFF_END} +__Connection: close +__ + +# Content length = end_offset - start_offset + 1 +_OP $OFF_END SUB $OFF_START CLEN +_OP $CLEN ADD 1 CLEN + +_EXPECT . "HTTP/1.1 206 Partial Content" +_EXPECT . "Date:" +_EXPECT . "Content-Range: bytes ${OFF_START}-${OFF_END}/${TEST_DOC_LEN}" +_EXPECT . "Content-Length: $CLEN" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/ranges_test04.htt b/src/fluent-bit/lib/monkey/qa/ranges_test04.htt new file mode 100644 index 000000000..8bb26d073 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/ranges_test04.htt @@ -0,0 +1,45 @@ +############################################################################### +# DESCRIPTION +# Test partial content request. Range type is equal to the file size. +# We expect this test to fail from server side as the file size is an +# invalid offset, ranges starts from byte zero. +# +# AUTHOR +# Eduardo Silva +# +# DATE +# Jun 19 2013 +# +# COMMENTS +# RFC 2616 Section 10.4.17 +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +# Start offset +SET OFF_START=79718 + +# End offset +SET OFF_END=79718 + +CLIENT +_CALL INIT +_CALL TESTDOC_GETSIZE + +_REQ $HOST $PORT +__GET /img/mk_logo.png $HTTPVER +__Host: $HOST +__Range: bytes=${OFF_START}-${OFF_END} +__Connection: close +__ + +# Content length = end_offset - start_offset + 1 +_OP $OFF_END SUB $OFF_START CLEN +_OP $CLEN ADD 1 CLEN + +_EXPECT . "416 Requested Range Not Satisfiable" +_EXPECT . "Date:" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/ranges_test05.htt b/src/fluent-bit/lib/monkey/qa/ranges_test05.htt new file mode 100644 index 000000000..0e2ab1d83 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/ranges_test05.htt @@ -0,0 +1,46 @@ +############################################################################### +# DESCRIPTION +# This test request one specific byte using the ranges HTTP feature, +# the target file is imgs/monkey_logo.png, the byte number 3 contains +# a value of 0x47 which is the letter 'G'. +# +# AUTHOR +# Eduardo Silva +# +# DATE +# Jun 19 2013 +# +# COMMENTS +# RFC 2616 Section 10.4.17 +############################################################################### + + +INCLUDE __CONFIG +INCLUDE __MACROS + +# Start offset +SET OFF_START=3 + +# End offset +SET OFF_END=3 + +CLIENT +_CALL INIT +_CALL TESTDOC_GETSIZE + +_REQ $HOST $PORT +__GET /img/mk_logo.png $HTTPVER +__Host: $HOST +__Range: bytes=${OFF_START}-${OFF_END} +__Connection: close +__ + +# Content length = end_offset - start_offset + 1 +_OP $OFF_END SUB $OFF_START CLEN +_OP $CLEN ADD 1 CLEN + +_EXPECT . "HTTP/1.1 206 Partial Content" +_EXPECT . "Date:" +_EXPECT . "G" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/run_tests.sh b/src/fluent-bit/lib/monkey/qa/run_tests.sh new file mode 100755 index 000000000..4c0b9fa75 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/run_tests.sh @@ -0,0 +1,119 @@ + +#!/bin/sh +TEST_FILES=`ls *.htt` +TOTAL_TESTS=`echo $TEST_FILES | wc -w` + +# Server parameters file +CONFIG_FILE='__CONFIG' + +LOGFILE='errors.log' + +# Clear log file +:>$LOGFILE + +# Should we stop at the first error? (yes | no) +STOP_AT_ERRORS=no + +# httest error code for 'Connection refused' +CONN_REFUSED=111 + +# Enable colors in output :) (yes | no) +WITH_COLOR=yes + +# httest command +HTTEST_CMD='httest' + +NTEST=1 +TESTS_FAILED=0 +TESTS_OK=0 +TESTS_AVOIDED=0 +CHECKLOGS=0 + +if [ "$1" = "-l" ]; then + CHECKLOGS=1 + TOTAL_TESTS=`expr $TOTAL_TESTS \* 2` +fi + +for test_file in $TEST_FILES; do +# echo -ne "[TEST $NTEST/$TOTAL_TESTS]\t""case: $test_file\t\t" + printf "[%3d/%d] %-32s " $NTEST $TOTAL_TESTS "$test_file" + + OUTPUT=`$HTTEST_CMD "$test_file" 2>&1` + ERRCODE=$? + + case $ERRCODE in + 0) + TESTS_OK=$((TESTS_OK+1)) + [ $WITH_COLOR = yes ] && echo -n "" + echo -n "=> [OK]" + [ $WITH_COLOR = yes ] && echo -n "" + ;; + + $CONN_REFUSED) + echo + echo "Connection refused... (Is monkey running?)" >&2 + exit $CONN_REFUSED + ;; + + *) + TESTS_FAILED=$((TESTS_FAILED+1)) + [ $WITH_COLOR = yes ] && echo -n "" + echo -n "=> [FAILED]" + [ $WITH_COLOR = yes ] && echo -n "" + + perl -e 'print "-" x 78, "\n"' >>"$LOGFILE" + echo "$OUTPUT" >>"$LOGFILE" + perl -e 'print "-" x 78, "\n"' >>"$LOGFILE" + + [ $STOP_AT_ERRORS = yes ] && exit 1 + esac + + # Check for logfiles rules + NTEST=$((NTEST+1)) + + if [ $CHECKLOGS = 0 ]; then + echo + continue + fi + + echo + test_file=`echo $test_file | sed 's/\.htt/\.log/g'` + printf "[%3d/%d] %-32s " $NTEST $TOTAL_TESTS "$test_file" + + if [ ! -e "log_rules/$test_file" ]; then + ERRCODE=2 + else + # We need to sleep for a while as Monkey needs to flush + # the logs, that happens every 3 seconds + sleep 2 + CHECKLOG=`./checklog -l log_rules/$test_file` + ERRCODE=$? + fi + + case $ERRCODE in + 0) + [ $WITH_COLOR = yes ] && echo -n "" + echo "=> [OK]" + [ $WITH_COLOR = yes ] && echo -n "" + TESTS_OK=$((TESTS_OK+1)) + ;; + 1) + [ $WITH_COLOR = yes ] && echo -n "" + echo "=> [FAILED]" + echo $CHECKLOG + [ $WITH_COLOR = yes ] && echo -n "" + TESTS_FAILED=$((TESTS_FAILED+1)) + [ $STOP_AT_ERRORS = yes ] && exit 1 + ;; + + 2) [ $WITH_COLOR = yes ] && echo -n "" + echo "=> [NO RULES]" + [ $WITH_COLOR = yes ] && echo -n "" + TESTS_AVOIDED=$((TESTS_AVOIDED+1)) + ;; + esac + + NTEST=$((NTEST+1)) +done + +echo -e "\n$TESTS_OK test(s) succeeded, $TESTS_FAILED test(s) failed, $TESTS_AVOIDED test(s) avoided." diff --git a/src/fluent-bit/lib/monkey/qa/simple.htt b/src/fluent-bit/lib/monkey/qa/simple.htt new file mode 100644 index 000000000..a1538db1b --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/simple.htt @@ -0,0 +1,26 @@ +################################################################################ +# DESCRIPTION +# The most basic request: GET / +# +# AUTHOR +# Carlos Ghan +# +# DATE +# June 29 2009 +# +# COMMENTS +# This test shouldn't fail ;) +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET / $HTTPVER +__Host: $HOST +__Connection: close +__ +_EXPECT . "HTTP/1.1 200 OK" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/uri_01.htt b/src/fluent-bit/lib/monkey/qa/uri_01.htt new file mode 100644 index 000000000..a7c66f51c --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/uri_01.htt @@ -0,0 +1,26 @@ +################################################################################ +# DESCRIPTION +# Exercise error 400 +# +# AUTHOR +# Eduardo Silva +# +# DATE +# June 23 2010 +# +# COMMENTS +# Sending a bad request. The URI should contains a / at the beginning +# This Bug was reported by Rodrigo Escobar +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA HTTP/1.0 +__Connection: close +__ +_EXPECT . "HTTP/1.1 400 Bad Request" +_WAIT +END diff --git a/src/fluent-bit/lib/monkey/qa/uri_02.htt b/src/fluent-bit/lib/monkey/qa/uri_02.htt new file mode 100644 index 000000000..3ab165689 --- /dev/null +++ b/src/fluent-bit/lib/monkey/qa/uri_02.htt @@ -0,0 +1,27 @@ +################################################################################ +# DESCRIPTION +# Exercise error 400 +# +# AUTHOR +# Eduardo Silva +# +# DATE +# June 23 2010 +# +# COMMENTS +# Sending a bad request. This request contain double \\ and miss the protocol +# field. +# This Bug was reported by Rodrigo Escobar +################################################################################ + + +INCLUDE __CONFIG + +CLIENT +_REQ $HOST $PORT +__GET /\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +__Connection: close +__ +_EXPECT . "HTTP/1.1 400 Bad Request" +_WAIT +END -- cgit v1.2.3