diff options
author | korgoth1 <vladislav.stakhov@gmail.com> | 2020-11-10 23:55:30 +0300 |
---|---|---|
committer | korgoth1 <vladislav.stakhov@gmail.com> | 2020-11-10 23:55:30 +0300 |
commit | 9e83fca7a46e7255006cfe3215b5e2fa2ca0e78a (patch) | |
tree | d52e85ead168d9b2c59dcc41e9b0e803538acefd /test/functional | |
parent | 086efa8bfbfef6e65c2d70ad952f94ba1c469a27 (diff) | |
parent | 7b8171fa979d8a2b394616352856b03a49b9db48 (diff) | |
download | rspamd-9e83fca7a46e7255006cfe3215b5e2fa2ca0e78a.tar.gz rspamd-9e83fca7a46e7255006cfe3215b5e2fa2ca0e78a.zip |
[TEST] ARC_ALLOW
Diffstat (limited to 'test/functional')
-rw-r--r-- | test/functional/cases/101_lua.robot | 8 | ||||
-rw-r--r-- | test/functional/cases/102_multimap.robot | 2 | ||||
-rw-r--r-- | test/functional/cases/109_composites.robot | 67 | ||||
-rw-r--r-- | test/functional/cases/120_fuzzy/lib.robot | 6 | ||||
-rw-r--r-- | test/functional/cases/160_antivirus.robot | 25 | ||||
-rw-r--r-- | test/functional/cases/300_rbl.robot | 18 | ||||
-rw-r--r-- | test/functional/configs/composites.conf | 10 | ||||
-rw-r--r-- | test/functional/configs/multimap.conf | 4 | ||||
-rw-r--r-- | test/functional/configs/plugins.conf | 15 | ||||
-rw-r--r-- | test/functional/configs/rbl.conf | 32 | ||||
-rw-r--r-- | test/functional/lib/rspamd.robot | 24 | ||||
-rw-r--r-- | test/functional/lib/vars.py | 8 | ||||
-rw-r--r-- | test/functional/lua/conditions.lua | 22 | ||||
-rw-r--r-- | test/functional/lua/mapreload.lua | 8 | ||||
-rw-r--r-- | test/functional/messages/content_url.eml | 202 |
15 files changed, 401 insertions, 50 deletions
diff --git a/test/functional/cases/101_lua.robot b/test/functional/cases/101_lua.robot index 6e40c7300..215ecd086 100644 --- a/test/functional/cases/101_lua.robot +++ b/test/functional/cases/101_lua.robot @@ -61,6 +61,14 @@ Option Order Expect Symbol With Exact Options OPTION_ORDER one two three 4 5 a Expect Symbol With Exact Options TBL_OPTION_ORDER one two three 4 5 a +Rule conditions + [Setup] Lua Replace Setup ${TESTDIR}/lua/conditions.lua + [Teardown] Lua Replace Teardown + Scan File ${MESSAGE} + Expect Symbol With Option ANY_A hello3 + Expect Symbol With Option ANY_A hello1 + Expect Symbol With Option ANY_A hello2 + *** Keywords *** Lua Setup [Arguments] ${LUA_SCRIPT} diff --git a/test/functional/cases/102_multimap.robot b/test/functional/cases/102_multimap.robot index 09bc9e205..701714264 100644 --- a/test/functional/cases/102_multimap.robot +++ b/test/functional/cases/102_multimap.robot @@ -67,7 +67,7 @@ MAP - FROM MAP - COMBINED IP MASK FROM Scan File ${MESSAGE} IP=10.1.0.10 From=user@example.com - Expect Symbol COMBINED_MAP_AND + Expect Symbol With Score COMBINED_MAP_AND 10 Expect Symbol COMBINED_MAP_OR MAP - COMBINED IP MASK ONLY diff --git a/test/functional/cases/109_composites.robot b/test/functional/cases/109_composites.robot index 8da18fe97..3aeb009ed 100644 --- a/test/functional/cases/109_composites.robot +++ b/test/functional/cases/109_composites.robot @@ -14,31 +14,31 @@ ${RSPAMD_SCOPE} Suite *** Test Cases *** Composites - All in One Scan File ${MESSAGE} - Expect Symbol With Score EXPRESSIONS 5 - Expect Symbol With Score EXPRESSIONS_B 0 - Expect Symbol With Score POLICY_REMOVE_WEIGHT 5 - Expect Symbol With Score POLICY_REMOVE_WEIGHT_B 0 - Do Not Expect Symbol POLICY_REMOVE_WEIGHT_A - Expect Symbol With Score POLICY_FORCE_REMOVE 5.00 - Expect Symbol With Score POLICY_FORCE_REMOVE_A 1.00 - Do Not Expect Symbol POLICY_FORCE_REMOVE_B - Expect Symbol With Score POLICY_LEAVE 5.00 - Do Not Expect Symbol POLICY_LEAVE_A - Expect Symbol With Score POLICY_LEAVE_B 1.00 - Expect Symbol With Score DEFAULT_POLICY_REMOVE_WEIGHT 5.00 - Expect Symbol With Score DEFAULT_POLICY_REMOVE_WEIGHT_A 0.00 - Expect Symbol With Score DEFAULT_POLICY_REMOVE_WEIGHT_B 0.00 - Expect Symbol With Score DEFAULT_POLICY_REMOVE_SYMBOL 5.00 - Do Not Expect Symbol DEFAULT_POLICY_REMOVE_SYMBOL_A - Do Not Expect Symbol DEFAULT_POLICY_REMOVE_SYMBOL_B - Expect Symbol With Score DEFAULT_POLICY_LEAVE 5.00 - Expect Symbol With Score DEFAULT_POLICY_LEAVE_A 1.00 - Expect Symbol With Score DEFAULT_POLICY_LEAVE_B 1.00 - Expect Symbol With Score SYMBOL_GROUPS 5.00 - Expect Symbol With Score POSITIVE_A -1.00 - Expect Symbol With Score ANY_A -1.00 - Expect Symbol With Score NEGATIVE_B 1.00 - Do Not Expect Symbol NEGATIVE_A + Expect Symbols With Scores EXPRESSIONS=5 + ... EXPRESSIONS_B=0 + ... POLICY_REMOVE_WEIGHT=5 + ... POLICY_REMOVE_WEIGHT_B=0 + ... POLICY_FORCE_REMOVE=5.00 + ... POLICY_FORCE_REMOVE_A=1.00 + ... POLICY_LEAVE=5.00 + ... POLICY_LEAVE_B=1.00 + ... DEFAULT_POLICY_REMOVE_WEIGHT=5.00 + ... DEFAULT_POLICY_REMOVE_WEIGHT_A=0.00 + ... DEFAULT_POLICY_REMOVE_WEIGHT_B=0.00 + ... DEFAULT_POLICY_REMOVE_SYMBOL=5.00 + ... DEFAULT_POLICY_LEAVE=5.00 + ... DEFAULT_POLICY_LEAVE_A=1.00 + ... DEFAULT_POLICY_LEAVE_B=1.00 + ... SYMBOL_GROUPS=5.00 + ... POSITIVE_A=-1.00 + ... ANY_A=-1.00 + ... NEGATIVE_B=1.00 + Do Not Expect Symbols DEFAULT_POLICY_REMOVE_SYMBOL_A + ... DEFAULT_POLICY_REMOVE_SYMBOL_B + ... NEGATIVE_A + ... POLICY_REMOVE_WEIGHT_A + ... POLICY_FORCE_REMOVE_B + ... POLICY_LEAVE_A Expect Score 50 Expect Required Score To Be Null @@ -51,13 +51,28 @@ Composites - Opts RE Miss one Scan File ${MESSAGE} opts=sym1,foo1 Expect Symbol With Score SYMOPTS1 5.00 Do Not Expect Symbol SYMOPTS2 + Do Not Expect Symbol SYMOPTS3 Composites - Opts RE Miss both Scan File ${MESSAGE} opts=sym2 Do Not Expect Symbol SYMOPTS1 Do Not Expect Symbol SYMOPTS2 + Do Not Expect Symbol SYMOPTS3 Composites - Opts RE Hit - Scan File ${MESSAGE} opts=sym2,foo1 + Scan File ${MESSAGE} opts=foo1,sym2 Expect Symbol With Score SYMOPTS2 6.00 Do Not Expect Symbol SYMOPTS1 + Do Not Expect Symbol SYMOPTS3 + +Composites - Opts RE Hit 2 + Scan File ${MESSAGE} opts=foo/,sym2 + Expect Symbol With Score SYMOPTS3 6.00 + Do Not Expect Symbol SYMOPTS2 + Do Not Expect Symbol SYMOPTS1 + +Composites - Opts RE Hit 3 + Scan File ${MESSAGE} opts=example.com->app.link + Expect Symbol With Score SYMOPTS4 6.00 + Do Not Expect Symbol SYMOPTS2 + Do Not Expect Symbol SYMOPTS1
\ No newline at end of file diff --git a/test/functional/cases/120_fuzzy/lib.robot b/test/functional/cases/120_fuzzy/lib.robot index 2aa8034d1..ca6143253 100644 --- a/test/functional/cases/120_fuzzy/lib.robot +++ b/test/functional/cases/120_fuzzy/lib.robot @@ -28,10 +28,10 @@ Fuzzy Skip Add Test Base Check Rspamc ${result} Sync Fuzzy Storage Scan File ${message} - Create File ${TMPDIR}/test.map Expect Symbol R_TEST_FUZZY_DENIED - Append To File ${TMPDIR}/skip_hash.map.tmp 670cfcba72a87bab689958a8af5c22593dc17c907836c7c26a74d1bb49add25adfa45a5f172e3af82c9c638e8eb5fc860c22c7e966e61a459165ef0b9e1acc89 - Hard Link ${TMPDIR}/skip_hash.map.tmp ${TMPDIR}/skip_hash.map + Create File ${TMPDIR}/skip_hash.map.tmp 2d875d4737c59c4822fd01dadeba52a329de3933f766c6f167904c6a426bbfa7ea63a66bf807b25c5ee853baee58bfb18d3b423fcd13cfa7c3d77a840039a1ea + Move File ${TMPDIR}/skip_hash.map.tmp ${TMPDIR}/skip_hash.map + Sleep 1s Wait for reload Scan File ${message} Do Not Expect Symbol R_TEST_FUZZY_DENIED diff --git a/test/functional/cases/160_antivirus.robot b/test/functional/cases/160_antivirus.robot index 5752f5355..8ad9d2bce 100644 --- a/test/functional/cases/160_antivirus.robot +++ b/test/functional/cases/160_antivirus.robot @@ -124,17 +124,26 @@ Shutdown avast ${avast_pid} = Get File if exists /tmp/dummy_avast.pid Run Keyword if ${avast_pid} Shutdown Process With Children ${avast_pid} +Run Dummy + [Arguments] @{varargs} + ${process} = Start Process @{varargs} + ${pid} = Get From List ${varargs} -1 + ${pass} = Run Keyword And Return Status Wait Until Created ${pid} + Run Keyword If ${pass} Return From Keyword + Wait For Process ${process} + ${res} = Get Process Result ${process} + Log To Console ${res.stdout} + Log To Console ${res.stderr} + Fail Dummy server failed to start + Run Dummy Clam - [Arguments] ${port} ${found}= - ${result} = Start Process ${TESTDIR}/util/dummy_clam.py ${port} ${found} - Wait Until Created /tmp/dummy_clamav.pid + [Arguments] ${port} ${found}= ${pid}=/tmp/dummy_clamav.pid + Run Dummy ${TESTDIR}/util/dummy_clam.py ${port} ${found} ${pid} Run Dummy Fprot [Arguments] ${port} ${found}= ${pid}=/tmp/dummy_fprot.pid - Start Process ${TESTDIR}/util/dummy_fprot.py ${port} ${found} ${pid} - Wait Until Created ${pid} + Run Dummy ${TESTDIR}/util/dummy_fprot.py ${port} ${found} ${pid} Run Dummy Avast - [Arguments] ${port} ${found}= - ${result} = Start Process ${TESTDIR}/util/dummy_avast.py ${port} ${found} - Wait Until Created /tmp/dummy_avast.pid + [Arguments] ${port} ${found}= ${pid}=/tmp/dummy_avast.pid + Run Dummy ${TESTDIR}/util/dummy_avast.py ${port} ${found} ${pid} diff --git a/test/functional/cases/300_rbl.robot b/test/functional/cases/300_rbl.robot index 74b55f4b2..55f46e5fd 100644 --- a/test/functional/cases/300_rbl.robot +++ b/test/functional/cases/300_rbl.robot @@ -50,6 +50,24 @@ EMAILBL Compose Map 3 Scan File ${TESTDIR}/messages/url16.eml Expect Symbol With Exact Options RSPAMD_EMAILBL 41.black.sanchez.com:email +CONTENT URLS + Scan File ${TESTDIR}/messages/content_url.eml + Expect Symbol With Exact Options URIBL_NOCONTENT example.org:url + Expect Symbol With Option URIBL_WITHCONTENT example.com:url + Expect Symbol With Option URIBL_WITHCONTENT example.org:url + Expect Symbol With Option URIBL_WITHCONTENT 8.8.8.8:url + Expect Symbol With Exact Options URIBL_CONTENTONLY example.com:url + +SELECTORS + Scan File ${TESTDIR}/messages/btc.eml From=user@example.com Helo=example.org + Expect Symbol With Exact Options RBL_SELECTOR_SINGLE example.org:selector + Expect Symbol With Option RBL_SELECTOR_MULTIPLE example.com:sel_from + Expect Symbol With Option RBL_SELECTOR_MULTIPLE example.org:sel_helo + +SELECTORS COMBINED + Scan File ${TESTDIR}/messages/btc.eml From=user@example.org Helo=example.org + Expect Symbol With Option RBL_SELECTOR_MULTIPLE example.org:sel_from + Expect Symbol With Option RBL_SELECTOR_MULTIPLE example.org:sel_helo *** Keywords *** Rbl Setup diff --git a/test/functional/configs/composites.conf b/test/functional/configs/composites.conf index 932b25fc1..71e453def 100644 --- a/test/functional/configs/composites.conf +++ b/test/functional/configs/composites.conf @@ -73,7 +73,15 @@ composites { } SYMOPTS2 { - expression = "OPTS[/foo.*/,sym2]"; + expression = 'OPTS[/foo[0-9]/,sym2]'; + score = 6.0; + } + SYMOPTS3 { + expression = 'OPTS[sym2,/FoO\\//i]'; + score = 6.0; + } + SYMOPTS4 { + expression = 'POSITIVE_A & OPTS[/>app.link$/i] & EXPRESSIONS'; score = 6.0; } } diff --git a/test/functional/configs/multimap.conf b/test/functional/configs/multimap.conf index 36f2514e7..d4fad0e16 100644 --- a/test/functional/configs/multimap.conf +++ b/test/functional/configs/multimap.conf @@ -179,7 +179,9 @@ multimap { selector = "from:domain"; } } - expression = "from & ip" + expression = "from & ip"; + score = 10; + prefilter = true; } COMBINED_MAP_OR { type = "combined"; diff --git a/test/functional/configs/plugins.conf b/test/functional/configs/plugins.conf index b1885eeb6..35a2ce347 100644 --- a/test/functional/configs/plugins.conf +++ b/test/functional/configs/plugins.conf @@ -710,6 +710,21 @@ options = { type = a; replies = ["127.0.0.2"]; }, + { + name = "example.com.test9.uribl"; + type = a; + replies = ["127.0.0.2"]; + }, + { + name = "example.org.test9.uribl"; + type = a; + replies = ["127.0.0.2"]; + }, + { + name = "8.8.8.8.test9.uribl"; + type = a; + replies = ["127.0.0.2"]; + }, # TODO: add IPv6 tests ]; } diff --git a/test/functional/configs/rbl.conf b/test/functional/configs/rbl.conf index 2318f5b81..4999e60d7 100644 --- a/test/functional/configs/rbl.conf +++ b/test/functional/configs/rbl.conf @@ -41,5 +41,35 @@ rbl { RSPAMD_EMAILBL = "127.0.0.2"; } } + URIBL_NOCONTENT { + rbl = "test9.uribl"; + ignore_defaults = true; + urls = true; + } + URIBL_WITHCONTENT { + rbl = "test9.uribl"; + ignore_defaults = true; + urls = true; + content_urls = true; + } + URIBL_CONTENTONLY { + rbl = "test9.uribl"; + ignore_defaults = true; + content_urls = true; + no_ip = true; + } + RBL_SELECTOR_SINGLE { + rbl = "test9.uribl"; + ignore_defaults = true; + selector = "helo()"; + } + RBL_SELECTOR_MULTIPLE { + rbl = "test9.uribl"; + ignore_defaults = true; + selector = { + sel_from = "from('smtp'):domain"; + sel_helo = "helo()"; + } + } } -}
\ No newline at end of file +} diff --git a/test/functional/lib/rspamd.robot b/test/functional/lib/rspamd.robot index fccf2e429..53d4e70f9 100644 --- a/test/functional/lib/rspamd.robot +++ b/test/functional/lib/rspamd.robot @@ -46,7 +46,15 @@ Check Rspamc Match String Do Not Expect Symbol [Arguments] ${symbol} - Run Keyword And Expect Error * Expect Symbol ${symbol} + Dictionary Should Not Contain Key ${SCAN_RESULT}[symbols] ${symbol} + ... msg=Symbol ${symbol} was not expected to be found in result + +Do Not Expect Symbols + [Arguments] @{symbols} + FOR ${symbol} IN @{symbols} + Dictionary Should Not Contain Key ${SCAN_RESULT}[symbols] ${symbol} + ... msg=Symbol ${symbol} was not expected to be found in result + END Generic Setup [Arguments] @{vargs} &{kwargs} @@ -102,10 +110,20 @@ Expect Symbol With Option Expect Symbol With Score [Arguments] ${symbol} ${score} - Expect Symbol ${symbol} + Dictionary Should Contain Key ${SCAN_RESULT}[symbols] ${symbol} + ... msg=Symbol ${symbol} wasn't found in result Should Be Equal As Numbers ${SCAN_RESULT}[symbols][${symbol}][score] ${score} ... msg="Symbol ${symbol} has score of ${SCAN_RESULT}[symbols][${symbol}][score] but expected ${score}" +Expect Symbols With Scores + [Arguments] &{symscores} + FOR ${key} ${value} IN &{symscores} + Dictionary Should Contain Key ${SCAN_RESULT}[symbols] ${key} + ... msg=Symbol ${key} wasn't found in result + Should Be Equal As Numbers ${SCAN_RESULT}[symbols][${key}][score] ${value} + ... msg="Symbol ${key} has score of ${SCAN_RESULT}[symbols][${key}][score] but expected ${value}" + END + Expect Symbol With Score And Exact Options [Arguments] ${symbol} ${score} @{options} Expect Symbol With Exact Options ${symbol} @{options} @@ -200,7 +218,7 @@ Run Rspamd Log ${config} Create File ${tmpdir}/rspamd.conf ${config} ${result} = Run Process ${RSPAMD} -u ${RSPAMD_USER} -g ${RSPAMD_GROUP} - ... -c ${tmpdir}/rspamd.conf env:TMPDIR=${tmpdir} env:DBDIR=${tmpdir} env:LD_LIBRARY_PATH=${TESTDIR}/../../contrib/aho-corasick + ... -c ${tmpdir}/rspamd.conf env:TMPDIR=${tmpdir} env:DBDIR=${tmpdir} env:LD_LIBRARY_PATH=${TESTDIR}/../../contrib/aho-corasick stdout=DEVNULL stderr=DEVNULL Run Keyword If ${result.rc} != 0 Log ${result.stderr} Should Be Equal As Integers ${result.rc} 0 Wait Until Keyword Succeeds 10x 1 sec Check Pidfile ${tmpdir}/rspamd.pid timeout=0.5s diff --git a/test/functional/lib/vars.py b/test/functional/lib/vars.py index 3cec9767a..51690e591 100644 --- a/test/functional/lib/vars.py +++ b/test/functional/lib/vars.py @@ -12,10 +12,10 @@ PORT_FUZZY_SLAVE = 56792 PORT_NORMAL = 56789 PORT_NORMAL_SLAVE = 56794 PORT_PROXY = 56795 -PORT_CLAM = 56796 -PORT_FPROT = 56797 -PORT_FPROT2_DUPLICATE = 56798 -PORT_AVAST = 56799 +PORT_CLAM = 2100 +PORT_FPROT = 2101 +PORT_FPROT2_DUPLICATE = 2102 +PORT_AVAST = 2103 P0F_SOCKET = '/tmp/p0f.sock' REDIS_ADDR = '127.0.0.1' REDIS_PORT = 56379 diff --git a/test/functional/lua/conditions.lua b/test/functional/lua/conditions.lua new file mode 100644 index 000000000..2baa04bfe --- /dev/null +++ b/test/functional/lua/conditions.lua @@ -0,0 +1,22 @@ +local logger = require 'rspamd_logger' + +rspamd_config:register_symbol({ + name = 'ANY_A', + score = -1.0, + group = "any", + callback = function() + return true, 'hello3' + end +}) + +rspamd_config:add_condition('ANY_A', function(task) + logger.infox(task, 'hello from condition1') + task:insert_result('ANY_A', 1.0, 'hello1') + return true +end) + +rspamd_config:add_condition('ANY_A', function(task) + logger.infox(task, 'hello from condition2') + task:insert_result('ANY_A', 1.0, 'hello2') + return true +end) diff --git a/test/functional/lua/mapreload.lua b/test/functional/lua/mapreload.lua index 572da10de..ae20120fe 100644 --- a/test/functional/lua/mapreload.lua +++ b/test/functional/lua/mapreload.lua @@ -7,10 +7,14 @@ rspamd_config:register_symbol({ name = 'MAP_SET_HIT_AND_MISS', score = 1.0, callback = function() - if (test_map:get_key('example.com') and not test_map:get_key('rspamd-test.com')) then + local has_example = test_map:get_key('example.com') + local has_rspamdtest = test_map:get_key('rspamd-test.com') + if has_example and not has_rspamdtest then return true, 'example.com' - elseif (test_map:get_key('rspamd-test.com') and not test_map:get_key('example.com')) then + elseif has_rspamdtest and not has_example then return true, 'rspamd.com' + else + return true, string.format('invalid: has_example=%s, has_rspamdtest=%s', has_example, has_rspamdtest) end end }) diff --git a/test/functional/messages/content_url.eml b/test/functional/messages/content_url.eml new file mode 100644 index 000000000..c559d2f3a --- /dev/null +++ b/test/functional/messages/content_url.eml @@ -0,0 +1,202 @@ +Subject: lo
+Content-Type: multipart/mixed; boundary="=_BFgoT7oi_t2JDLtlkNV7Zzc"
+MIME-Version: 1.0
+
+This message is in MIME format.
+
+--=_BFgoT7oi_t2JDLtlkNV7Zzc
+Content-Type: text/plain; charset=utf-8; format=flowed; DelSp=Yes
+Content-Disposition: inline
+
+
+lo http://www.example.org bye
+
+--=_BFgoT7oi_t2JDLtlkNV7Zzc
+Content-Type: application/pdf; name=spam3.pdf
+Content-Disposition: attachment; size=10322; filename=spam3.pdf
+Content-Transfer-Encoding: base64
+
+JVBERi0xLjUKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURl
+Y29kZT4+CnN0cmVhbQp4nI2RTUsDMRCG7/kVcxY2zpvNJ4RAq13BW3XBQ/HkF4gV7KV/39lsrV1w
+qYTMMExmeN43rEF79UVMrNlEcslpExxFCx09aPeiHi7oc3whZ/emlr1yXkcKodUpJuqf6bIDwVD/
+usmMYjKb0oTMbXnsb9WqV+ufee0YyR+2yLyZ22LZDXtq8BxK4zLHoaghleYkept5wcuCzFd8PaTV
+ONbVsdpYgIdkpHXChEoFmpA8bRXrQPsJ8d2NYmogbm2FEfK8Fh90/yvuIAvJajunqx0BOwEEKr85
+Z5NBEpz/+FRND0eXhgAj0o/3L+3T9WfFe0h7VruJmNEu0tHCwsl/9O8jxJq+AQdrhoQKZW5kc3Ry
+ZWFtCmVuZG9iagoKMyAwIG9iagoyNjQKZW5kb2JqCgo3IDAgb2JqCjw8L0xlbmd0aCA4IDAgUi9G
+aWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoMSAxMjYxNj4+CnN0cmVhbQp4nOV6a3hb1bXgXufoadmW
+ji3JUhRJR1GcxPFDtuU8DEl8ktiy85ZfwUpILNmSLYNtKZLiNEAaU8KjDikGcml4fIOnk8vQXmaQ
+SaApl1vcDtDpcLnkzg20lHKbuYR27pSUlKZMhxJ51t46suU0pd/MN//myOectddrr73W2mvvLTmV
+OBghhWSc8ETqHwnFu9evrSeE/D0hUNI/lhLX7zLdjPBFQrj/OhAfHHniu7deJURxlhD12cHhwwPf
+/eUHKUIKo4QYz0UjofBU2UMeQlwi6lgdRUQgc1iN7R5sL42OpL7ya6ViI7bvwnbHcKw/ROon67B9
+Hts1I6GvxFcqtnOELMEmEUdDI5ElTao2bKM+3Vg8lkyFydJZQqpPUXo8EYlvf6LvdWyfI4SfRBzg
+h16FCKpom+MVSpVaoy3QFRYV6w1CSanRRP4/upQniIm0KdcTPYmz54KLf45YyeOEzH5MW/PPzPbZ
+z/9fWqHJvk6RZ8hZcoK8R/bJBB/xkyFyEDH51w/IPyKWXn6yh3yHTPwZtc+Rc0jP8gXJQ3QkN7z8
+5JvkDPnRgl78ZITciba8SN6DOvJjTJUY+RQ05G7yOmr9FHE7bqSKK8bHAAMH8rDvkye542Qrdwkb
+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
+INkJvaQbNpL1IOFbQtomfG/GNn3XwHoyjnzrEb8B2+sQfzMWTyc+m/DehfdDeCvwznLUIocH3x65
+XY3tKpR4G5/AboptQix9b8V2G75b5bcP8S34bpHbW7CNbxIENW7Em9jzVVBIZ+DiNXj7GojX4Ogf
+wf9HGP908lPut1cqnM9fefUKt+uT3k+e/4Sv/QT0n4CGXDZc9l8OXo5fnrqsKtB/DIXk1yB8eHGt
+8xfrP+j+5/U/7yYf4Mg+qP3A/8H4B+kPlB8A3/1z3uw0zIgztTPxmfGZ8zMXZ67MaMa/P/l97u9e
+8Tj1rzhf4Zxndp05eoYPPgv6Z53Pcv4ng09yk0+B/innU56n+Ccer3E+3upwfvOx5c6Lj115jKNf
+/DxWJPhegV2wnaxHH+48w886n99ogh04LD0+nXh78N6Fdwzvh/DGcw+yO/H2wHZpLd/7V6B7xPZI
+5SN3PnL8EWX8vvH7Ju/jx++dvJd7fuzVMS7pr3DGRiudo60rnVavpVvt5btV2A39umlLX/kKX7BX
+cvYi0949tc49rRXOUm9JtxIHrEBGPe/km/hdfIx/iH+VV2s6/A5nO94X/Vf8nOTXFvr0u5y7PLv4
+c7MXpcg2F2rbGt86vpXf4qtwtrWudepbna2e1rdbf9H6SauqtxWexj/f875Xfbzkq/D4JJ/D5Vvc
+Zus2e03dAui7DV59NwcYaC/p9uhn9Zxe36s/qqdfexFu3AxKOAeT012dlZXbzqlnO7alNf69aXgg
+Xd5Jn1L7nrTqgTTp3rO3ZxrgG4F7T5wgm+zb0vWdPemgPbAtHUZAosA4Agb7tJlsCiSTqUp2QWUl
+wgfxSSoPViJyfzKLJXN0UpmEJNaoJBOCSsqQbQM+KykNEVQOUHp/ktAHJVZmhah0UlbHhLMPBlj2
+/28b/Cp6CmVuZHN0cmVhbQplbmRvYmoKCjggMCBvYmoKNzU0NgplbmRvYmoKCjkgMCBvYmoKPDwv
+VHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9CQUFBQUErTGliZXJhdGlvblNlcmlmCi9GbGFn
+cyA0Ci9Gb250QkJveFstNTQzIC0zMDMgMTI3NyA5ODFdL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA4
+OTEKL0Rlc2NlbnQgLTIxNgovQ2FwSGVpZ2h0IDk4MQovU3RlbVYgODAKL0ZvbnRGaWxlMiA3IDAg
+Ugo+PgplbmRvYmoKCjEwIDAgb2JqCjw8L0xlbmd0aCAzMTgvRmlsdGVyL0ZsYXRlRGVjb2RlPj4K
+c3RyZWFtCnicXZLLboMwEEX3fIWX6SLilYREQkgJCRKLPlTSDyD2kFoqxjJkwd/XM0NbqQusM+O5
+o6trwrI+10ZP4ZsbZAOT6LRRDsbh4SSIG9y1CeJEKC2npaJT9q0NQq9t5nGCvjbdkOdB+O7vxsnN
+YnVUww2egvDVKXDa3MXqo2x83Tys/YIezCSioCiEgs7veW7tS9tDSKp1rfy1nua1l/wNXGcLIqE6
+ZityUDDaVoJrzR2CPIoKkVdVEYBR/+6SRXLr5Gfr/GjsR6NoUxaeE+JdhZwSJxHyhvt75C1xtkHe
+MdNMRpwekfespT0HnsmQj9y/IJ945xa55Bnaf+Z+jHxhPiNXzOgzjphTZPafEbP/FPfE7H93Ql78
+J8iL/wOFs6SAMeE7/sQv5MM5Hz09NmWOaWsDv/+DHSyq6PsGy4GcewplbmRzdHJlYW0KZW5kb2Jq
+CgoxMSAwIG9iago8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9CYXNlRm9udC9CQUFBQUEr
+TGliZXJhdGlvblNlcmlmCi9GaXJzdENoYXIgMAovTGFzdENoYXIgMjEKL1dpZHRoc1s3NzcgNjEw
+IDUwMCAyNTAgNTAwIDI3NyA1MDAgMjc3IDI3NyA3MjIgMjUwIDQ0MyA1MDAgNDQzIDc3NyAyNzcK
+NDQzIDM4OSA1MDAgNTAwIDUwMCA1MDAgXQovRm9udERlc2NyaXB0b3IgOSAwIFIKL1RvVW5pY29k
+ZSAxMCAwIFIKPj4KZW5kb2JqCgoxMiAwIG9iago8PC9GMSAxMSAwIFIKPj4KZW5kb2JqCgoxMyAw
+IG9iago8PC9Gb250IDEyIDAgUgovUHJvY1NldFsvUERGL1RleHRdCj4+CmVuZG9iagoKMSAwIG9i
+ago8PC9UeXBlL1BhZ2UvUGFyZW50IDYgMCBSL1Jlc291cmNlcyAxMyAwIFIvTWVkaWFCb3hbMCAw
+IDU5NS4zMDM5MzcwMDc4NzQgODQxLjg4OTc2Mzc3OTUyOF0vQW5ub3RzWwo0IDAgUiA1IDAgUiBd
+Ci9Hcm91cDw8L1MvVHJhbnNwYXJlbmN5L0NTL0RldmljZVJHQi9JIHRydWU+Pi9Db250ZW50cyAy
+IDAgUj4+CmVuZG9iagoKNiAwIG9iago8PC9UeXBlL1BhZ2VzCi9SZXNvdXJjZXMgMTMgMCBSCi9N
+ZWRpYUJveFsgMCAwIDU5NSA4NDEgXQovS2lkc1sgMSAwIFIgXQovQ291bnQgMT4+CmVuZG9iagoK
+NCAwIG9iago8PC9UeXBlL0Fubm90L1N1YnR5cGUvTGluay9Cb3JkZXJbMCAwIDBdL1JlY3RbNzMu
+MDQzIDc3MS4zODkgMTk0LjMwNyA3ODUuMTg5XS9BPDwvVHlwZS9BY3Rpb24vUy9VUkkvVVJJKGh0
+dHA6Ly93d3cuZXhhbXBsZS5jb20vKT4+Cj4+CmVuZG9iagoKNSAwIG9iago8PC9UeXBlL0Fubm90
+L1N1YnR5cGUvTGluay9Cb3JkZXJbMCAwIDBdL1JlY3RbMjE5LjU5MyA3NzEuMzg5IDI4MS4zMDcg
+Nzg1LjE4OV0vQTw8L1R5cGUvQWN0aW9uL1MvVVJJL1VSSShodHRwOi8vOC44LjguOC8pPj4KPj4K
+ZW5kb2JqCgoxNCAwIG9iago8PC9UeXBlL0NhdGFsb2cvUGFnZXMgNiAwIFIKL09wZW5BY3Rpb25b
+MSAwIFIgL1hZWiBudWxsIG51bGwgMF0KL0xhbmcoZW4tWkEpCj4+CmVuZG9iagoKMTUgMCBvYmoK
+PDwvQ3JlYXRvcjxGRUZGMDA1NzAwNzIwMDY5MDA3NDAwNjUwMDcyPgovUHJvZHVjZXI8RkVGRjAw
+NEMwMDY5MDA2MjAwNzIwMDY1MDA0RjAwNjYwMDY2MDA2OTAwNjMwMDY1MDAyMDAwMzYwMDJFMDAz
+MT4KL0NyZWF0aW9uRGF0ZShEOjIwMjAxMDAyMTI1MjU0KzAyJzAwJyk+PgplbmRvYmoKCnhyZWYK
+MCAxNgowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDg5NDMgMDAwMDAgbiAKMDAwMDAwMDAxOSAw
+MDAwMCBuIAowMDAwMDAwMzU0IDAwMDAwIG4gCjAwMDAwMDkyMzQgMDAwMDAgbiAKMDAwMDAwOTM4
+NCAwMDAwMCBuIAowMDAwMDA5MTM1IDAwMDAwIG4gCjAwMDAwMDAzNzQgMDAwMDAgbiAKMDAwMDAw
+ODAwNSAwMDAwMCBuIAowMDAwMDA4MDI2IDAwMDAwIG4gCjAwMDAwMDgyMjEgMDAwMDAgbiAKMDAw
+MDAwODYwOSAwMDAwMCBuIAowMDAwMDA4ODU1IDAwMDAwIG4gCjAwMDAwMDg4ODggMDAwMDAgbiAK
+MDAwMDAwOTUyNyAwMDAwMCBuIAowMDAwMDA5NjI0IDAwMDAwIG4gCnRyYWlsZXIKPDwvU2l6ZSAx
+Ni9Sb290IDE0IDAgUgovSW5mbyAxNSAwIFIKL0lEIFsgPDY4MUNCQ0JEMzlFNEVCM0RBNUE2RjQw
+NkM0OEE3NkQzPgo8NjgxQ0JDQkQzOUU0RUIzREE1QTZGNDA2QzQ4QTc2RDM+IF0KL0RvY0NoZWNr
+c3VtIC9DMjBCNTdGMTc5QTgxMTNDMjAwNEVFNDk0MTM2ODMwRAo+PgpzdGFydHhyZWYKOTc5OQol
+JUVPRgo=
+--=_BFgoT7oi_t2JDLtlkNV7Zzc--
+
|