diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-09-11 12:49:01 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-09-11 12:49:01 +0100 |
commit | 57c3dd72006a31a1aa0707e68bda09b6294a60bc (patch) | |
tree | de70d4fdeb32ca11a4cf7086c9fc9cbaa9e6ef37 /doc | |
parent | 5383a5b80fae73cbc082962e4c4123b2b368f1a1 (diff) | |
download | rspamd-57c3dd72006a31a1aa0707e68bda09b6294a60bc.tar.gz rspamd-57c3dd72006a31a1aa0707e68bda09b6294a60bc.zip |
Remove pre-historic documentation.
Diffstat (limited to 'doc')
-rwxr-xr-x | doc/lua_api.pl | 274 | ||||
-rw-r--r-- | doc/markdown/migration.md (renamed from doc/migration.md) | 0 | ||||
-rw-r--r-- | doc/rspamd.lyx | 4299 | ||||
-rw-r--r-- | doc/rspamd.pdf | 10845 | ||||
-rw-r--r-- | doc/rspamd.texi | 1969 | ||||
-rw-r--r-- | doc/why-rspamd.html | 392 | ||||
-rw-r--r-- | doc/why-rspamd.pod | 333 | ||||
-rw-r--r-- | doc/why-rspamd.txt | 240 |
8 files changed, 0 insertions, 18352 deletions
diff --git a/doc/lua_api.pl b/doc/lua_api.pl deleted file mode 100755 index e4225b40a..000000000 --- a/doc/lua_api.pl +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env perl - -use strict; -use warnings; -use Data::Dumper; -use Digest::MD5 qw(md5_hex); - -use constant { - STATE_READ_SKIP => 0, - STATE_READ_CONTENT => 1, -}; - -my $state = STATE_READ_SKIP; -my $content; -my %modules = (); -my $cur_module; - -sub print_module_markdown { - my ( $mname, $m ) = @_; - - print <<EOD; -## Module `$mname` {#$m->{'id'}} - -$m->{'data'} -EOD - if ( $m->{'example'} ) { - print <<EOD; - -Example: - -~~~lua -$m->{'example'} -~~~ -EOD - } - - sub print_func { - my ($f) = @_; - - my $name = $f->{'name'}; - my $id = $f->{'id'}; - print "> [`$name`](#$id)\n\n"; - } - - print "\n###Brief content:\n\n"; - print "**Functions**:\n\n"; - foreach ( @{ $m->{'functions'} } ) { - print_func($_); - } - print "\n\n**Methods**:\n\n"; - foreach ( @{ $m->{'methods'} } ) { - print_func($_); - } -} - -sub print_function_markdown { - my ( $type, $fname, $f ) = @_; - - print <<EOD; -### $type `$fname` {#$f->{'id'}} - -$f->{'data'} -EOD - print "\n**Parameters:**\n\n"; - if ( $f->{'params'} && scalar @{ $f->{'params'} } > 0 ) { - foreach ( @{ $f->{'params'} } ) { - if ( $_->{'type'} ) { - print - "- `$_->{'name'} \{$_->{'type'}\}`: $_->{'description'}\n"; - } - else { - print "- `$_->{'name'}`: $_->{'description'}\n"; - } - } - } - else { - print "\tnothing\n"; - } - print "\n**Returns:**\n\n"; - if ( $f->{'return'} && $f->{'return'}->{'description'} ) { - $_ = $f->{'return'}; - if ( $_->{'type'} ) { - print "- `\{$_->{'type'}\}`: $_->{'description'}\n"; - } - else { - print "- $_->{'description'}\n"; - } - } - else { - print "\tnothing\n"; - } - if ( $f->{'example'} ) { - print <<EOD; - -Example: - -~~~lua -$f->{'example'} -~~~ -EOD - } -} - -sub print_markdown { - while ( my ( $mname, $m ) = each %modules ) { - print_module_markdown( $mname, $m ); - - print -"\n## Functions\n\nThe module `$mname` defines the following functions.\n\n"; - foreach ( @{ $m->{'functions'} } ) { - print_function_markdown( "Function", $_->{'name'}, $_ ); - print "\nBack to [module description](#$m->{'id'}).\n\n"; - - } - print -"\n## Methods\n\nThe module `$mname` defines the following methods.\n\n"; - foreach ( @{ $m->{'methods'} } ) { - print_function_markdown( "Method", $_->{'name'}, $_ ); - print "\nBack to [module description](#$m->{'id'}).\n\n"; - - } - print "\nBack to [top](#).\n\n"; - } -} - -sub make_id { - my ( $name, $prefix ) = @_; - - if ( !$prefix ) { - $prefix = "f"; - } - $name =~ /^(\S+).*$/; - return substr( $prefix . md5_hex($1), 0, 6 ); -} - -sub substitute_data_keywords { - my ($line) = @_; - - if ( $line =~ /^.*\@see\s+(\S+)\s*.*$/ ) { - my $name = $1; - my $id = make_id($name); - return $line =~ s/\@see\s+\S+/[`$name`](#$id)/r; - } - - return $line; -} - -sub parse_function { - my ( $func, @data ) = @_; - - my ( $type, $name ) = ( $func =~ /^\@(\w+)\s*(.+)\s*$/ ); - - my $f = { - name => $name, - data => '', - example => undef, - id => make_id($name), - }; - my $example = 0; - - foreach (@data) { - if (/^\@param\s*(?:\{([^}]+)\})?\s*(\S+)\s*(.+)?\s*$/) { - my $p = { name => $2, type => $1, description => $3 }; - push @{ $f->{'params'} }, $p; - } - elsif (/^\@return\s*(?:\{([^}]+)\})?\s*(.+)?\s*$/) { - my $r = { type => $1, description => $2 }; - $f->{'return'} = $r; - } - elsif (/^\@example$/) { - $example = 1; - } - elsif ( $_ ne $func ) { - if ($example) { - $f->{'example'} .= $_; - } - else { - $f->{'data'} .= substitute_data_keywords($_); - } - } - } - if ( $f->{'data'} ) { - chomp $f->{'data'}; - } - if ( $f->{'example'} ) { - chomp $f->{'example'}; - } - - if ( $type eq "function" ) { - push @{ $cur_module->{'functions'} }, $f; - } - else { - push @{ $cur_module->{'methods'} }, $f; - } -} - -sub parse_module { - my ( $module, @data ) = @_; - - my ($name) = ( $module =~ /^\@module\s*(.+)\s*$/ ); - - $modules{$name} = { - functions => [], - methods => [], - data => '', - example => undef, - id => make_id( $name, 'm' ), - }; - my $f = $modules{$name}; - my $example = 0; - - foreach (@data) { - if (/^\@example$/) { - $example = 1; - } - elsif ( $_ ne $module ) { - if ($example) { - $f->{'example'} .= $_; - } - else { - $f->{'data'} .= substitute_data_keywords($_); - } - } - } - if ( $f->{'data'} ) { - chomp $f->{'data'}; - } - if ( $f->{'example'} ) { - chomp $f->{'example'}; - } - $cur_module = $f; -} - -sub parse_content { - my @func = grep /^\@function|method.+$/, @_; - if ( scalar @func > 0 ) { - parse_function( $func[0], @_ ); - } - else { - my @module = grep /^\@module.+$/, @_; - if ( scalar @module > 0 ) { - parse_module( $module[0], @_ ); - } - } -} - -while (<>) { - if ( $state == STATE_READ_SKIP ) { - if ( $_ =~ /^\s*\/\*\*\*$/ ) { - $state = STATE_READ_CONTENT; - $content = ""; - } - } - elsif ( $state == STATE_READ_CONTENT ) { - if ( $_ =~ /^\s*\*\/$/ ) { - $state = STATE_READ_SKIP; - parse_content( split /^/, $content ); - $content = ""; - } - else { - my ($line) = ( $_ =~ /^(?:\s*\*\s)?(.+)\s*$/ ); - if ($line) { - $content .= $line . "\n"; - } - else { - # Preserve empty lines - $content .= "\n"; - } - } - } -} - -#print Dumper( \%modules ); -print_markdown; diff --git a/doc/migration.md b/doc/markdown/migration.md index 954c60f6d..954c60f6d 100644 --- a/doc/migration.md +++ b/doc/markdown/migration.md diff --git a/doc/rspamd.lyx b/doc/rspamd.lyx deleted file mode 100644 index 420d1446c..000000000 --- a/doc/rspamd.lyx +++ /dev/null @@ -1,4299 +0,0 @@ -#LyX 1.6.4 created this file. For more info see http://www.lyx.org/ -\lyxformat 345 -\begin_document -\begin_header -\textclass book -\begin_preamble -\usepackage{indentfirst} -\frenchspacing -\end_preamble -\use_default_options false -\language russian -\inputencoding utf8 -\font_roman cmr -\font_sans cmss -\font_typewriter cmtt -\font_default_family sfdefault -\font_sc false -\font_osf false -\font_sf_scale 100 -\font_tt_scale 100 - -\graphics default -\paperfontsize default -\spacing single -\use_hyperref true -\pdf_title "Rspamd" -\pdf_author "Vsevolod Stakhov" -\pdf_bookmarks true -\pdf_bookmarksnumbered true -\pdf_bookmarksopen false -\pdf_bookmarksopenlevel 1 -\pdf_breaklinks false -\pdf_pdfborder true -\pdf_colorlinks true -\pdf_backref false -\pdf_pdfusetitle true -\papersize a4paper -\use_geometry false -\use_amsmath 0 -\use_esint 0 -\cite_engine basic -\use_bibtopic false -\paperorientation portrait -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\defskip medskip -\quotes_language french -\papercolumns 1 -\papersides 1 -\paperpagestyle fancy -\tracking_changes false -\output_changes false -\author "" -\author "" -\end_header - -\begin_body - -\begin_layout Title -Руководство по системе фильтрации спама rspamd. -\end_layout - -\begin_layout Date -22.03.2010 -\end_layout - -\begin_layout Author -Стахов Всеволод. -\end_layout - -\begin_layout Standard -\begin_inset CommandInset toc -LatexCommand tableofcontents - -\end_inset - - -\end_layout - -\begin_layout Standard - -\end_layout - -\begin_layout Chapter -Общая информация и возможности rspamd -\end_layout - -\begin_layout Standard -Rspamd - это система, предназначенная для фильтрации спама. - Изначально rspamd разрабатывался как фильтр для электронной почты, но он - может применяться и для другого типа сообщений (например, для jabber или - icq сообщений). - В основе rspamd лежит концепция асинхронной обработки входящих сообщений. - Для этого применяется библиотека libevent. - Это накладывает определенные ограничения на возможности rspamd, так как - для любой блокирующей операции (например, чтение из сетевого сокета) необходимо - регистрировать отдельное событие и его обработчика, но дает преимущества - в скорости работы системы и уменьшает различные служебные затраты (например, - на создание процессов или потоков). - Rspamd поддерживает встроенные фильтры на языке lua, что позволяет писать - собственные фильтры без необходимости пересборки системы. - Rspamd настраивается путем редактирования конфигурационного файла. - Также имеется управляющий интерфейс, посредством которого можно различным - образом управлять работой системы и получать ее текущее состояние. - Rspamd поддерживает различные типы фильтров: фильтры на основе регулярных - выражений, фильтры на основе DNS запросов, фильтры на основе статистики, - фильтры по различным спискам и другие типы фильтров (например, фильтры, - написанные на языке lua и выполняющие различные действия по анализу сообщений). - Rspamd имеет протокол, совместимый с системой spamassassin (в дальнейшем - протокол spamc), а также его расширение - rspamc, позволяющее передавать - больше информации фильтру, что ускоряет обработку сообщений. - Система rspamd состоит из двух основных частей: монитор процессов и процессы, - осуществляющие обработку (workers). - Монитор процессов отвечает за старт системы, открытие/закрытие журналов - работы, а также обеспечивает непрерывную работу рабочих процессов и их - перезапуск при необходимости. -\end_layout - -\begin_layout Chapter -Установка rspamd -\end_layout - -\begin_layout Section -Требования -\end_layout - -\begin_layout Itemize -GNU C компилятор (работоспособность проверялась на gcc 4.2.1) -\end_layout - -\begin_layout Itemize -cmake - -\begin_inset CommandInset href -LatexCommand href -name "http://cmake.org/" -target "http://cmake.org/" - -\end_inset - - используется для конфигурации сборки и генерации Makefile. - Необходимая версия - не менее 2.6. -\end_layout - -\begin_layout Itemize -glib - -\begin_inset CommandInset href -LatexCommand href -name "http://ftp.gnome.org/" -target "http://ftp.gnome.org/pub/GNOME/sources/glib/2.20/" - -\end_inset - - используется для различного рода утилит и структур хранения данных (хеши, - деревья, списки). - Необходимая версия - не менее 2.16. -\end_layout - -\begin_layout Itemize -gmime - -\begin_inset CommandInset href -LatexCommand href -name "http://ftp.acc.umu.se" -target "http://ftp.acc.umu.se/pub/GNOME/sources/gmime/2.2/" - -\end_inset - - используется для разбора mime структуры сообщений. - Необходимая версия 2.2. - Работа с gmime 2.4 и старше не проверялась. -\end_layout - -\begin_layout Itemize -lua - -\begin_inset CommandInset href -LatexCommand href -name "http://www.lua.org/" -target "http://www.lua.org/download.html" - -\end_inset - - используется для работы lua плагинов (без liblua работа rspamd возможна, - но без поддержки lua плагинов). - Версия необходима не меньше, чем 5.1. -\end_layout - -\begin_layout Itemize -libevent - -\begin_inset CommandInset href -LatexCommand href -name "http://www.monkey.org/~provos/libevent/" -target "http://www.monkey.org/~provos/libevent/" - -\end_inset - - используется для кросс-платформенной обработки асинхронных событий, а также - для определения DNS имен (также асинхронного). -\end_layout - -\begin_layout Section -Установка -\end_layout - -\begin_layout Standard -Для сборки rspamd необходимо скачать архив (самая свежая версия может быть - найдена на -\begin_inset CommandInset href -LatexCommand href -name "http://cebka.pp.ru/distfiles/" -target "http://cebka.pp.ru/distfiles/" - -\end_inset - -). - После этого необходимо распаковать архив и скомпилировать код: -\end_layout - -\begin_layout LyX-Code -$ tar xzf rspamd-x.x.x.tar.gz -\end_layout - -\begin_layout LyX-Code -$ cd rspamd-x.x.x -\end_layout - -\begin_layout LyX-Code -$ cmake . -\end_layout - -\begin_layout LyX-Code -$ make -\end_layout - -\begin_layout Standard -Установка осуществляется стандартным -\end_layout - -\begin_layout LyX-Code -# make install -\end_layout - -\begin_layout Standard -В процессе установки копируются исполняемые файлы rspamd: bin/rspamd и bin/rspam -c, а также примеры конфигурации и плагины, устанавливающиеся в каталог etc/rspam -d/. - Также для ОС FreeBSD устанавливается стартовый скрипт rspamd.sh в каталог - etc/rc.d. - -\end_layout - -\begin_layout Section -Запуск -\end_layout - -\begin_layout Standard -Rspamd запускается либо из стартового скрипта, либо непосредственно вызовом - rspamd. - Доступные опции командной строки: -\end_layout - -\begin_layout Code --h: Показать справочную информацию и выйти -\end_layout - -\begin_layout Code --t: Проверить конфигурационный файл и выйти -\end_layout - -\begin_layout Code --C: Показать содержимое кеша символов и выйти -\end_layout - -\begin_layout Code --V Показать все переменные rspamd и выйти -\end_layout - -\begin_layout Code --f: Не выполнять демонизацию -\end_layout - -\begin_layout Code --c: Указать путь до конфигурационного файла (по умолчанию используется - /usr/local/etc/rspamd.conf) -\end_layout - -\begin_layout Code --u: Пользователь, под которым осуществлять работу rspamd -\end_layout - -\begin_layout Code --g: Группа, под которой осуществять работу rspamd -\end_layout - -\begin_layout Standard -Если rspamd запускается от суперпользователя, то после создания лог-файла, - PID-файла, а также сокетов, принимающих соединения, осуществляется сброс - привиллегий до пользователя и группы, указанных в опциях командной строки - (таким образом, все рабочие процессы работают от указанного пользователя - и группы). -\end_layout - -\begin_layout Chapter -Общие принципы работы -\end_layout - -\begin_layout Standard -Прежде чем приступать к настройке rspamd необходимо понять основные принципы - функционирования системы. -\end_layout - -\begin_layout Section -Планирование и запуск рабочих процессов -\end_layout - -\begin_layout Standard -При запуске rspamd происходят следующие действия: -\end_layout - -\begin_layout Enumerate -Запускается главный процесс (rspamd main) -\end_layout - -\begin_layout Enumerate -Инициализируются конфигурационные параметры по умолчанию -\end_layout - -\begin_layout Enumerate -Читаются параметры командной строки -\end_layout - -\begin_layout Enumerate -Настраивается журналирование ошибок в терминал -\end_layout - -\begin_layout Enumerate -Читается и парсится конфигурационный файл -\end_layout - -\begin_layout Enumerate -Инициализируются модули -\end_layout - -\begin_layout Enumerate -Модули читают свои конфигурационные параметры -\end_layout - -\begin_layout Enumerate -Устанавливаются лимиты -\end_layout - -\begin_layout Enumerate -Настраивается журналирование, указанное в конфигурационном файле -\end_layout - -\begin_layout Enumerate -Происходит демонизация (если не указан флаг -f) -\end_layout - -\begin_layout Enumerate -Настраивается обработка сигналов головным процессом -\end_layout - -\begin_layout Enumerate -Записывается PID-файл -\end_layout - -\begin_layout Enumerate -Инициализируются lua плагины -\end_layout - -\begin_layout Enumerate -Инициализируется подсистема событий и mime парсер -\end_layout - -\begin_layout Enumerate -Загружается кеш символов -\end_layout - -\begin_layout Enumerate -Порождаются рабочие процессы (сброс привиллегий осуществляется сразу же - после вызова fork) -\end_layout - -\begin_layout Enumerate -Начинается цикл обработки сигналов -\end_layout - -\begin_layout Standard -Головной процесс rspamd реагирует на следующие сигналы: -\end_layout - -\begin_layout Itemize -SIGTERM - послать всем рабочим процессам SIGTERM, дождаться их завершения - и выйти -\end_layout - -\begin_layout Itemize -SIGINT - то же, что и SIGTERM -\end_layout - -\begin_layout Itemize -SIGHUP - переинициализировать журналирование и породить новые рабочие процессы, - завершив старые (при этом, существующие рабочие процессы завершают работу, - обработав уже полученные соединения) -\end_layout - -\begin_layout Itemize -SIGCHLD - головной процесс получает этот сигнал при завершении работы рабочего - процесса. - Если рабочий процесс завершился некорректно, то планируется его перезапуск - через 2 секунды. -\end_layout - -\begin_layout Itemize -SIGUSR2 - приходит от рабочего процесса, когда тот успешно инициализируется -\end_layout - -\begin_layout Itemize -SIGALARM - сигнализирует о необходимости запуска рабочего процесса, который - был запланирован после получения SIGCHLD -\end_layout - -\begin_layout Standard -Таким образом, головной процесс отвечает за инициализацию, конфигурацию, - работу с PID-файлом, работу с журналированием, а также за порождение рабочих - процессов. - В ходе работы головной процесс постоянно следит за работой рабочих процессов - и обеспечивает перезапуск некорректно завершившихся рабочих процессов. - Для ротации файлов журналирования рабочему процессу необходимо послать - сигнал SIGHUP. -\end_layout - -\begin_layout Section -Логика обработки сообщений -\end_layout - -\begin_layout Standard -Инициализация рабочего процесса предельно проста: происходит переинициализация - libevent, а также инициализация DNS resolver'а. - После этого рабочий процесс устанавливает обработчик готовности к чтению - слушающего сокета (этот сокет создается в головном процессе и передается - рабочему процессу как параметр). - При готовности к чтению на слущающем сокете рабочий процесс создает новый - объект типа worker_task и делается accept на слушающем сокете. - После этого rspamd обрабатывает протокол rspamc (или же spamc) и читает - сообщение. - После окончания получения сообщения rspamd декодирует его содержимое и - начинает обработку. - Для более простого изложения принципов работы rspamd необходимо описать - некоторые понятия: -\end_layout - -\begin_layout Itemize -Символ - это правило фильтрации rspamd, например, некоторое регулярное выражение - или же запрос к DNS или же любое другое действие. - Символ имеет собственный вес и имя. - Таким образом, символ можно считать результатом работы одного правила фильтраци -и. - Если это правило сработало, то оно добавляет символ с определенным весом - и атрибутами, если нет, то символ не добавляется. -\end_layout - -\begin_layout Itemize -Метрика - это набор логически связанных правил и связанных с ними символов. - Такая группа имеет свой предел очков, после набора которых сообщение считается - по этой метрике спамом. - Очки формируются после подсчета весов символов, добавленных в метрику (при - этом, разумеется, несработавшие правила символов не добавляют и их вес - равен нулю) и обработки этих весов функцией консолидации. - По умолчанию такой функцией является функция-факторизатор, которая просто - считает вес каждого символа равным константе, заданной в конфигурационном - файле для этого символа, например, следующие параметры в конфигурационном - файле задают вес символа MIME_HTML_ONLY равный одному, а вес символа FAKE_HTML - - восьми: -\end_layout - -\begin_layout LyX-Code -"MIME_HTML_ONLY" = 1; -\end_layout - -\begin_layout LyX-Code -"FAKE_HTML" = 8; -\end_layout - -\begin_layout Itemize -Модуль - это набор правил rspamd, который обеспечивает общие проверки. - Например, модуль проверки регулярных выражений или модуль проверки URL'ей - по -\begin_inset Quotes eld -\end_inset - -черным -\begin_inset Quotes erd -\end_inset - - спискам. - Модули также могут быть написаны на языке LUA. - Каждый модуль регистрирует символы, соответствующие сконфигурированным - в нем правилам, в таблице символов заданной метрики (или метрики по умолчанию - -\begin_inset Quotes eld -\end_inset - -default -\begin_inset Quotes erd -\end_inset - -). -\end_layout - -\begin_layout Itemize -Таблица символов метрики - это таблица, хранящая данные о зарегистрированных - символах, таблица отсортирована, чтобы обеспечить проверку самых -\begin_inset Quotes eld -\end_inset - -удобных -\begin_inset Quotes erd -\end_inset - - правил в первую очередь. - Критерий -\begin_inset Quotes eld -\end_inset - -удобности -\begin_inset Quotes erd -\end_inset - - составляется из трех составляющих: веса правила, частоты его срабатывания - и времени его выполнения. - Чем больше вес, частота срабатывания и меньше время выполнения, тем раньше - будет проверено это правило. -\end_layout - -\begin_layout Itemize -Классификатор - это алгоритм, обеспечивающий определение принадлежности - сообщения к какому-либо классу. - Класс определяется символом (например символ SPAM, имеющий вес 5 и символ - HAM, имеющий вес -5). - Принадлежность к классу обеспечивается либо статистически, путем разбора - текста сообщения на токены и сравнения с известными токенами, хранящимися - на диске в виде файла токенов (statfile), либо же иным алгоритмом (например, - нейросетью). - В результате работы классификатора определяется соответствие сообщения - какому-либо классу и добавления соответствующего этому классу символа. - Классификатор отличается от обычного модуля тем, что он не просто проверяет - какие-либо характеристики сообщения, а сравнивает содержание сообщения - с известными ему наборами. - То есть, классификатор для его работы необходимо обучать на различных наборах. - В настоящее время в rspamd реализован алгоритм классификации winnow и разбора - на токены OSB. - О них будет написано в дальнейшем. -\end_layout - -\begin_layout Standard -Обработка осуществляется по следующей логике: -\end_layout - -\begin_layout Itemize -для каждой метрики выбирается таблица символов и выбираются по очереди символы - (по степени -\begin_inset Quotes eld -\end_inset - -удобности -\begin_inset Quotes erd -\end_inset - -) -\end_layout - -\begin_layout Itemize -для каждого символа вызывается соответствующее правило -\end_layout - -\begin_layout Itemize -после вызова очередного правила проверяется, не превысил ли результат метрики - порогового результата -\end_layout - -\begin_layout Itemize -при превышении порога сообщение считается по этой метрике спамом и больше - символов из этой метрики не проверяется -\end_layout - -\begin_layout Itemize -для сообщения проверяется принадлежность к какому-либо классу для корректировки - результата -\end_layout - -\begin_layout Itemize -после определения принадлежности к классу происходит окончательный пересчет - очков по метрике и при совпадении критериев автообучения происходит автообучени -е классификатора -\end_layout - -\begin_layout Standard -После обработки сообщений для каждой из метрик выводится результат. - Если используется протокол spamc, то считается только метрика -\begin_inset Quotes eld -\end_inset - -default -\begin_inset Quotes erd -\end_inset - -, а дополнительные метрики добавляются как заголовки вида X-Spam-Status: - metric; result. - Для протокола rspamc выводятся результаты всех метрик, что позволяет настраиват -ь различные группы правил и осуществлять фильтрацию сообщений не только - как spam/ham, а задавать различные критерии оценки. -\end_layout - -\begin_layout Chapter -Настройка rspamd -\end_layout - -\begin_layout Section -Общие правила настройки -\end_layout - -\begin_layout Standard -Файл конфигурации rspamd имеет следующий синтаксис: -\end_layout - -\begin_layout LyX-Code -param = value; -\end_layout - -\begin_layout Standard -Точка с запятой является обязательной в конце каждой директивы. - Некоторые директивы являются составными и обрамляются фигурными скобками, - например: -\end_layout - -\begin_layout LyX-Code -section { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -param = value; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -Также позволяется включать другие файлы (точка с запятой в конце директивы - не нужна): -\end_layout - -\begin_layout LyX-Code -.include /path/to/file -\end_layout - -\begin_layout Standard -В конфигурационном файле допускается определять и использовать переменные: -\end_layout - -\begin_layout LyX-Code -$var = "some text"; -\end_layout - -\begin_layout LyX-Code -param = "${var}"; -\end_layout - -\begin_layout Standard -Приведенный фрагмент определяет переменную $var и присваивает параметру - -\begin_inset Quotes eld -\end_inset - -param -\begin_inset Quotes erd -\end_inset - - значение -\begin_inset Quotes eld -\end_inset - -some text -\begin_inset Quotes erd -\end_inset - -. - Переменные имеют глобальную область действия, обрамление переменных фигурными - скобками при использовании (вида ${some_variable}) обязательно. - Большинство строк конфигурационного файла обрамляется двойными кавычками. - Одинарные кавычки применяются только при конфигурации модуля (это поведение - подлежит пересмотру в следующих версиях): -\end_layout - -\begin_layout LyX-Code -.module 'name' { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -param = "value"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Subsection -Определения списков -\end_layout - -\begin_layout Standard -В rspamd многие параметры задаются в виде списков. - Списки задаются ссылкой на файл или же http ресурс. - Основное отличие таких файлов в том, что rspamd проверяет изменения в таких - файлах (примерно раз в минуту, используя случайный разброс) и перегружает - списки при их модификации. - Таким же образом организована загрузка списков через http, только вместо - modification time используется HTTP 1.1 заголовок If-Modified-Since, в ответ - на который http сервер может выдать ответ 304: Not modified, в таком случае - rspamd не перечитывает список. - Списками задаются те параметры, которые могут содержать много значений - и которые могут часто меняться. - Для того, чтобы не приходилось выполнять перезапуск rspamd списки перечитываютс -я по мере их обновления. - Определения списков выглядят следующим образом: -\end_layout - -\begin_layout Itemize -http список: -\end_layout - -\begin_layout LyX-Code -param = "http://test.ru:81/some/path.php"; -\end_layout - -\begin_layout LyX-Code -param = "http://test.ru/some/other.txt"; -\end_layout - -\begin_layout Itemize -file список: -\end_layout - -\begin_layout LyX-Code -param = "file:///var/run/rspamd/some.file"; -\end_layout - -\begin_layout Section -Общие параметры конфигурации -\end_layout - -\begin_layout Standard -Общие параметры не принадлежат никакой секции и позволяют задавать общие - настройки системы. -\end_layout - -\begin_layout Itemize -pidfile - путь до PID-файла: -\end_layout - -\begin_layout LyX-Code -pidfile = "/var/run/rspamd.pid"; -\end_layout - -\begin_layout Itemize -statfile_pool_size - размер пула файлов статистики в памяти. - Может быть с суффиксом, определяющим единицы измерение (по умолчанию байты): - K - килобайты, M - мегабайты, G - гигабайты. -\end_layout - -\begin_layout LyX-Code -statfile_pool_size = 40M; -\end_layout - -\begin_layout Itemize -raw_mode - если этот параметр равен -\begin_inset Quotes eld -\end_inset - -yes -\begin_inset Quotes erd -\end_inset - -, то rspamd не осуществляет перекодировку сообщений в utf8, в этом режиме - проверка сообщений осуществляется быстрее, но при этом одинаковые сообщения - в разных кодировках будут обрабатываться как разные. -\end_layout - -\begin_layout LyX-Code -raw_mode = yes; -\end_layout - -\begin_layout Itemize -filters - строка, содержащая список включенных модулей, имена модулей разделяютс -я запятыми и/или пробелами. -\end_layout - -\begin_layout LyX-Code -filters = "surbl,regexp,chartable,emails"; -\end_layout - -\begin_layout Section -Настройка процессов -\end_layout - -\begin_layout Standard -Данные секции служат для определения параметров рабочих процессов. - Общие параметры рабочего процесса: -\end_layout - -\begin_layout Itemize -type - тип рабочего процесса: -\end_layout - -\begin_deeper -\begin_layout Itemize -normal - обычный процесс обработки сообщений -\end_layout - -\begin_layout Itemize -controller - управляющий процесс -\end_layout - -\begin_layout Itemize -lmtp - процесс обработки сообщений по протоколу lmtp -\end_layout - -\begin_layout Itemize -fuzzy - хранилище хешей -\end_layout - -\end_deeper -\begin_layout LyX-Code -type = "normal"; -\end_layout - -\begin_layout Itemize -bind_socket - параметры слушающего сокета процесса, может определять либо - tcp сокет, либо unix сокет: -\end_layout - -\begin_deeper -\begin_layout Itemize -host:port - осуществляет bind на указанные host и port -\end_layout - -\begin_layout Itemize -*:port - осуществляет bind на указанные port на всех локальных адресах -\end_layout - -\begin_layout Itemize -/path/to/socket - осуществляет bind на указанный unix socket -\end_layout - -\end_deeper -\begin_layout LyX-Code -bind_socket = localhost:11334; -\end_layout - -\begin_layout Itemize -count - количество процессов данного типа. - По умолчанию это число равно числу логических процессоров в системе. -\end_layout - -\begin_layout LyX-Code -count = 1; -\end_layout - -\begin_layout Standard -Для процессов типа -\begin_inset Quotes eld -\end_inset - -controller -\begin_inset Quotes erd -\end_inset - - можно также указать пароль для привиллегированных команд параметром password, - а для процессов типа -\begin_inset Quotes eld -\end_inset - -fuzzy -\begin_inset Quotes erd -\end_inset - - необходимо указать путь к файлу, который будет использован как хранилище - хешей параметром hashfile. - Пример настройки рабочих процессов: -\end_layout - -\begin_layout LyX-Code -worker { -\end_layout - -\begin_deeper -\begin_layout LyX-Code - type = "normal"; -\end_layout - -\begin_layout LyX-Code - count = 1; -\end_layout - -\begin_layout LyX-Code - bind_socket = *:11333; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code -worker { -\end_layout - -\begin_deeper -\begin_layout LyX-Code - type = "controller"; -\end_layout - -\begin_layout LyX-Code - bind_socket = localhost:11334; -\end_layout - -\begin_layout LyX-Code - count = 1; -\end_layout - -\begin_layout LyX-Code - password = "q1"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout LyX-Code -worker { -\end_layout - -\begin_deeper -\begin_layout LyX-Code - type = "fuzzy"; -\end_layout - -\begin_layout LyX-Code - bind_socket = localhost:11335; -\end_layout - -\begin_layout LyX-Code - count = 1; -\end_layout - -\begin_layout LyX-Code - hashfile = "/tmp/fuzzy.db"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Section -Настройки журналирования -\end_layout - -\begin_layout Standard -Данные настройки определяют тип журналирования и его параметры. -\end_layout - -\begin_layout Itemize -log_type - тип журналирования: -\end_layout - -\begin_deeper -\begin_layout Itemize -console - журналирование в stderr -\end_layout - -\begin_layout Itemize -syslog - журналирование через syslog -\end_layout - -\begin_layout Itemize -file - журналирование в файл -\end_layout - -\end_deeper -\begin_layout LyX-Code -log_type = console; -\end_layout - -\begin_layout Itemize -log_level - уровень ведения журнала -\end_layout - -\begin_deeper -\begin_layout Itemize -DEBUG - журналирование отладочной информации -\end_layout - -\begin_layout Itemize -INFO - журналирование информационных событий -\end_layout - -\begin_layout Itemize -WARN - журналирование только предупреждений -\end_layout - -\begin_layout Itemize -ERROR - журналирование только ошибок -\end_layout - -\end_deeper -\begin_layout LyX-Code -log_level = INFO; -\end_layout - -\begin_layout Itemize -log_facility - используется для журналирования в syslog и определяет назначение - сообщений. - Более подробно об этом можно узнать из man syslog. -\end_layout - -\begin_layout LyX-Code -log_facility = "LOG_MAIL"; -\end_layout - -\begin_layout Itemize -log_file - используется для журналирования в файл и путь к файлу журнала. -\end_layout - -\begin_layout LyX-Code -log_file = "/var/log/rspamd.log"; -\end_layout - -\begin_layout Standard -Пример настройки журналирования: -\end_layout - -\begin_layout LyX-Code -logging { -\end_layout - -\begin_deeper -\begin_layout LyX-Code - log_type = file; -\end_layout - -\begin_layout LyX-Code - log_level = INFO; -\end_layout - -\begin_layout LyX-Code - log_file = "/var/log/rspamd.log" -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Section -Настройки метрики -\end_layout - -\begin_layout Standard -Для настроек метрик используются секции -\begin_inset Quotes eld -\end_inset - -metric -\begin_inset Quotes erd -\end_inset - -. - Основные параметры метрик: -\end_layout - -\begin_layout Itemize -name - имя метрики. -\end_layout - -\begin_layout LyX-Code -name = "default"; -\end_layout - -\begin_layout Itemize -required_score - минимальное число очков, необходимое, чтобы сообщение считалось - спамом по данной метрике. -\end_layout - -\begin_layout LyX-Code -required_score = 10; -\end_layout - -\begin_layout Itemize -cache_file - путь до файла, содержащего кеш символов метрики (используется, - чтобы сохранить статистику -\begin_inset Quotes eld -\end_inset - -удобности -\begin_inset Quotes erd -\end_inset - - символов метрики, чтобы при перезапуске rspamd не терять накопленных данных). -\end_layout - -\begin_layout LyX-Code -cache_file = "/var/run/rspamd/metric.cache"; -\end_layout - -\begin_layout Standard -Пример настройки метрики: -\end_layout - -\begin_layout LyX-Code -metric { -\end_layout - -\begin_deeper -\begin_layout LyX-Code - name = "default"; -\end_layout - -\begin_layout LyX-Code - required_score = 10.1; -\end_layout - -\begin_layout LyX-Code - cache_file = "/tmp/symbols.cache"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Section -Настройка классификаторов -\end_layout - -\begin_layout Standard -Для настройки классификаторов используются секции -\begin_inset Quotes eld -\end_inset - -classifier -\begin_inset Quotes erd -\end_inset - -. - Общие настройки классфикатора: -\end_layout - -\begin_layout Itemize -type - алгоритм классификатора (в настоящее время определен только -\begin_inset Quotes eld -\end_inset - -winnow -\begin_inset Quotes erd -\end_inset - -). -\end_layout - -\begin_layout LyX-Code -type = "winnow"; -\end_layout - -\begin_layout Itemize -tokenizer - алгоритм разбиения сообщения на токены (в настоящее время определен - только -\begin_inset Quotes eld -\end_inset - -osb-text -\begin_inset Quotes erd -\end_inset - -). -\end_layout - -\begin_layout LyX-Code -tokenizer = "osb-text"; -\end_layout - -\begin_layout Standard -Также каждый классификатор может содержать определения классов и соответствующих - им файлов токенов. - Для этого используется подсекция statfile, содержащая следующие параметры: -\end_layout - -\begin_layout Itemize -symbol - имя класса и имя символа, используемого для данного класса. -\end_layout - -\begin_layout LyX-Code -symbol = "WINNOW_SPAM"; -\end_layout - -\begin_layout Itemize -path - путь до файла. -\end_layout - -\begin_layout LyX-Code -path = "/var/run/rspamd/winnow.spam"; -\end_layout - -\begin_layout Itemize -size - размер данного файла. - Также может иметь суффикс размерности. -\end_layout - -\begin_layout LyX-Code -size = 100M; -\end_layout - -\begin_layout Standard -Внутри каждого определения класса можно использовать подсекцию autolearn, - определяющую условия, при которых происходит автоматическое обучение данного - класса. - Секция имеет следующие параметры: -\end_layout - -\begin_layout Itemize -min_mark - минимальное число очков, при котором осуществляется обучение. -\end_layout - -\begin_layout LyX-Code -min_mark = 10.1; -\end_layout - -\begin_layout Itemize -max_mark - максимальное число очков, при котором осуществляется обучение. -\end_layout - -\begin_layout LyX-Code -max_mark = 0.1; -\end_layout - -\begin_layout Standard -Автообучение происходит, если данное сообщение отвечает данным критериям. - То есть, логично обучать класификатор HAM сообщениями, указав максимальное - количество очков, близкое к нулю и SPAM сообщениями, указав минимальное - число очков, близкое к срабатыванию триггера SPAM для данной метрики. - Таким образом, классифицируемые как спам сообщения обучают класс SPAM, - а классифицируемые как HAM (то есть, на них не сработали правила метрики) - - обучают класс HAM. -\end_layout - -\begin_layout Standard -Пример определения классификатора: -\end_layout - -\begin_layout LyX-Code -classifier { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -type = "winnow"; -\end_layout - -\begin_layout LyX-Code -tokenizer = "osb-text"; -\end_layout - -\end_deeper -\begin_layout LyX-Code - -\end_layout - -\begin_deeper -\begin_layout LyX-Code -statfile { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -symbol = "WINNOW_SPAM"; -\end_layout - -\begin_layout LyX-Code -path = "/tmp/test.spam"; -\end_layout - -\begin_layout LyX-Code -size = 10M; -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code -autolearn { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -min_mark = 10.0; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code -statfile { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -symbol = "WINNOW_HAM"; -\end_layout - -\begin_layout LyX-Code -path = "/tmp/test.ham"; -\end_layout - -\begin_layout LyX-Code -size = 10M; -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code -autolearn { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -max_mark = 0.1; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Subsection -Настройка синхронизации статистики -\end_layout - -\begin_layout Standard -Статистические данные можно синхронизировать между несколькими rspamd. - Для этого используется master/slave синхронизация и бинарный лог изменений - в статистическом файле. - Для настройки синхронизации используются следующие параметры при определении - статистического файла: -\end_layout - -\begin_layout LyX-Code -statfile { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -... -\end_layout - -\begin_layout LyX-Code -binlog = "slave"; -\end_layout - -\begin_layout LyX-Code -binlog_master = "somehost:11334"; -\end_layout - -\begin_layout LyX-Code -... -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout LyX-Code -... -\end_layout - -\begin_layout LyX-Code -statfile { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -... -\end_layout - -\begin_layout LyX-Code -binlog = "master"; -\end_layout - -\begin_layout LyX-Code -... -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -При настройке slave для синхронизации указывается адрес master для данного - файла. - Этот адрес фактически является адресом контроллера, который сконфигурирован - работать с данным файлом как master. - Если rspamd настроен работать с данным файлом статистики как master, то - создается специальный файл с таким же именем, как файл статистики, но имеющим - суффикс .binlog. - В данный файл записываются ревизии и изменения, внесенные в файл статистики. - Данный файл хранит фиксированное число изменений и ротируется при переполнении. - Синхронизация производится всеми slave хостами с промежутком от 1-й до - 2-х минут. - При этом, нет разницы, в каком состоянии был файл статистики на slave хосте - - после синхронизации файл статистики на slave будет в точности совпадать - с файлом статистики на master'е. - Обновления файлов статистики являются инкрементальными, то есть передаются - только изменения, а не файлы целиком. - Синхронизация файлов статистики позволяет легко построить кластер rspamd, - которые работают и обучаются идентично (хотя обучение должно производиться - через контроллер мастера). -\end_layout - -\begin_layout Section -Настройка коэффициентов символов -\end_layout - -\begin_layout Standard -Для настройки коэффициентов применяется секция -\begin_inset Quotes eld -\end_inset - -factors -\begin_inset Quotes erd -\end_inset - -. - Данная секция состоит из набора определений вида -\end_layout - -\begin_layout LyX-Code -"СИМВОЛ" = вес; -\end_layout - -\begin_layout Standard -например: -\end_layout - -\begin_layout LyX-Code -"R_UNDISC_RCPT" = 5; -\end_layout - -\begin_layout LyX-Code -"MISSING_MID" = 3; -\end_layout - -\begin_layout LyX-Code -"R_RCVD_SPAMBOTS" = 3; -\end_layout - -\begin_layout LyX-Code -"R_TO_SEEMS_AUTO" = 3; -\end_layout - -\begin_layout LyX-Code -"R_MISSING_CHARSET" = 5; -\end_layout - -\begin_layout Standard -В секции -\begin_inset Quotes fld -\end_inset - -factors -\begin_inset Quotes frd -\end_inset - - также можно задать параметр grow_factor, который задает коэффициент приращения - при добавлении символов в метрику. - Работает это так: допустим, добавляется первый символ - его реальный вес - будет равен 1 * factor (то есть, если factor равен 1, то и реальный вес - будет равен 1), после чего следующий символ будет иметь реальный вес grow_facto -r * factor (например, если grow_factor = 1.1, то реальный вес будет 1.1 * - factor), далее следующий будет иметь вес (1 + ((grow_factor) - 1)*2)*factor - (то есть, при предыдущем grow_factor, реальный вес будет 1.2 * factor, следующий - символ 1.3, затем 1.4 и.т.д.). - Данная возможность позволяет увеличивать вес письмам, проходящим по нескольким - правилам. - Правила с отрицательным весом не увеличивают grow_factor и не модифицируются - им (то есть, реальный вес таких правил равен 1 * factor). - Пример задания параметра grow_factor: -\end_layout - -\begin_layout LyX-Code -grow_factor = 1.1; -\end_layout - -\begin_layout Standard -Также существует возможность создавать -\begin_inset Quotes fld -\end_inset - -составные -\begin_inset Quotes frd -\end_inset - - символы - символы, которые являются комбинацией других символов. - Это нужно для возможности указывать, что комбинация определенных символов - имеет больший (или, наоборот, меньший) вес, чем сумма весов нескольких - символов. - Составные символы представляют собой логические выражения из других символов, - например: -\end_layout - -\begin_layout LyX-Code -composites { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -COMPOSITE_SYMBOL1 = -\begin_inset Quotes fld -\end_inset - -SYMBOL1 & (SYMBOL2 | SYMBOL3) -\begin_inset Quotes frd -\end_inset - -; -\end_layout - -\begin_layout LyX-Code -COMPOSITE_SYMBOL2 = -\begin_inset Quotes fld -\end_inset - -SYMBOL3 & !SYMBOL4 -\begin_inset Quotes frd -\end_inset - -; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -При добавлении составного символа все символы, входящие в него, удаляются - из результата. - То есть, при срабатывании COMPOSITE_SYMBOL1 из предыдущего примера символы - SYMBOL1, SYMBOL2 и SYMBOL3 в ответе не появятся. -\end_layout - -\begin_layout Section -Представления и настройки -\end_layout - -\begin_layout Subsection -Представления -\end_layout - -\begin_layout Standard -В rspamd существует возможность настройки правил, которые будут проверяться, - исходя из определенных критериев. - Представления настраиваются в конфигурационном файле rspamd и позволяют - разделить правила, исходя из входящих данных, например, заголовок From - письма или же по ip, откуда нам пришло данное письмо. - Представления проверяются при проверке любого правила и при совпадении - данных письма проверяются не все символы, а те, которые заданы данным представл -ением. - При настройки представлений задаются входные данные письма (from и ip) - и символы, которые должны проверяться. - Входные данные могут дублироваться, то есть, можно задать несколько from - и несколько ip, задаются эти параметры либо в виде регулярных выражений: -\end_layout - -\begin_layout LyX-Code -from = -\begin_inset Quotes fld -\end_inset - -/^.*@somedomain.com$ -\begin_inset Quotes frd -\end_inset - -; -\end_layout - -\begin_layout LyX-Code -from = -\begin_inset Quotes fld -\end_inset - -/^.*@otherdoma[a-z]+.com$ -\begin_inset Quotes frd -\end_inset - -; -\end_layout - -\begin_layout Standard -либо в виде map: -\end_layout - -\begin_layout LyX-Code -from = -\begin_inset Quotes fld -\end_inset - -file:///usr/local/etc/rspamd/from.map -\begin_inset Quotes frd -\end_inset - -; -\end_layout - -\begin_layout LyX-Code -ip = -\begin_inset Quotes fld -\end_inset - -http://somehost:81/ip.map -\begin_inset Quotes frd -\end_inset - -; -\end_layout - -\begin_layout Standard -Символы также могут быть заданы несколькими директивами symbols (которые - будут объединены в список): -\end_layout - -\begin_layout LyX-Code -symbols = -\begin_inset Quotes fld -\end_inset - -/^.*URIBL.*$/ -\begin_inset Quotes frd -\end_inset - -; -\end_layout - -\begin_layout Standard -Пример задания представления в конфигурационном файле: -\end_layout - -\begin_layout LyX-Code -view { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -ip = "file:///usr/local/etc/rspamd/ip_internal.inc"; -\end_layout - -\begin_layout LyX-Code -skip_check = yes; -\end_layout - -\begin_layout LyX-Code -from = "file:///usr/local/etc/rspamd/from_internal.inc"; -\end_layout - -\begin_layout LyX-Code -symbols = "/^.*URIBL.*$/"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -Директива -\begin_inset Quotes fld -\end_inset - -skip_check -\begin_inset Quotes frd -\end_inset - - используется для пропуска всех проверок rspamd для данного представлений. - В результате при использовании протокола rspamc 1.1 вместо маркера спама - (True или False) будет маркер пропуска (Skip). - При использовании spamc или же rspamc 1.0 будет стандартный маркер False - (так как реально у письма будет 0 баллов). -\end_layout - -\begin_layout Subsection -Пользовательские настройки -\end_layout - -\begin_layout Standard -Пользовательские настройки, в отличие от представлений, дают возможность - выбора правил, а также настройки граничных значений баллов письма, исходя - из получателя письма. - При этом, настройки можно задавать индивидуально пользователю или же всему - домену пользователя. - Индивидуальные настройки пользователя перекрывают настройки домена. - При выборе настроек используются следующие данные (учитывая последовательность) -: -\end_layout - -\begin_layout Enumerate -проверяется заголовок Deliver-To, передаваемый при использовании протокола - rspamc; -\end_layout - -\begin_layout Enumerate -проверяется заголовок User, передаваемый MTA exim при использовании любого - протокола; -\end_layout - -\begin_layout Enumerate -проверяется первый получатель письма из заголовка rspamc Rcpt; -\end_layout - -\begin_layout Enumerate -проверяется первый получатель письма из заголовка mime To. -\end_layout - -\begin_layout Standard -Необходимо обратить внимание , что при наличии нескольких получателей, будет - проверяться только первый из них, чтобы избегать двусмысленного поведения. - Сами настройки задаются в json файлах, так как данные файлы могут содержать - очень много информации о пользователях, и хранить это все в конфигурационном - файле нецелесообразно. - Для задания пользовательских настроек используется секция -\begin_inset Quotes fld -\end_inset - -settings -\begin_inset Quotes frd -\end_inset - -, которая содержит всего два параметра: user_settings и domain_settings. - Например: -\end_layout - -\begin_layout LyX-Code -settings { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -user_settings = "http://somehost/users.php"; -\end_layout - -\begin_layout LyX-Code -domain_settings = "http://somehost/domains.php"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -Формат соответствующих json файлов достаточно прост - это массив объектов, - задающих настройки. - Объект настройки содержит следующие параметры: -\end_layout - -\begin_layout Itemize -name - имя пользователя или домена; -\end_layout - -\begin_layout Itemize -metrics - объект, задающий предельные очки по метрикам, вида -\begin_inset Quotes fld -\end_inset - -metric_name -\begin_inset Quotes frd -\end_inset - - -> score; -\end_layout - -\begin_layout Itemize -factors - объект, задающий индивидуальные настройки множителей вида -\begin_inset Quotes fld -\end_inset - -symbol -\begin_inset Quotes frd -\end_inset - - -> score; -\end_layout - -\begin_layout Itemize -want_spam - булево значение, при задании его как true, rspamd отключает - проверки для данного пользователя. -\end_layout - -\begin_layout Standard -Пример json настроек: -\end_layout - -\begin_layout LyX-Code -[ -\end_layout - -\begin_deeper -\begin_layout LyX-Code -{ -\end_layout - -\begin_deeper -\begin_layout LyX-Code -"name":"somedomain.ru", -\end_layout - -\begin_layout LyX-Code -"metrics":{"default":11}, -\end_layout - -\begin_layout LyX-Code -"factors":{"R_FUZZY":10.1}, -\end_layout - -\begin_layout LyX-Code -"want_spam":false -\end_layout - -\end_deeper -\begin_layout LyX-Code -}, -\end_layout - -\begin_layout LyX-Code -{ -\end_layout - -\begin_deeper -\begin_layout LyX-Code -"name":"some.other.domain.com", -\end_layout - -\begin_layout LyX-Code -"metrics":{"default":5.5}, -\end_layout - -\begin_layout LyX-Code -"factors":{"URIBL":20.3}, -\end_layout - -\begin_layout LyX-Code -"want_spam":false -\end_layout - -\end_deeper -\begin_layout LyX-Code -} -\end_layout - -\end_deeper -\begin_layout LyX-Code -] -\end_layout - -\begin_layout Standard -Файлы настроек перезагружаются по мере обновления, как и любые другие файлы - списков. -\end_layout - -\begin_layout Chapter -Настройка модулей -\end_layout - -\begin_layout Section -Настройка модуля surbl -\end_layout - -\begin_layout Standard -Модуль surbl служит для проверки URL'ей в письме на различных -\begin_inset Quotes eld -\end_inset - -черных -\begin_inset Quotes erd -\end_inset - - списках. - Модуль делает следующее: для каждого из url, найденных в сообщении, извлекает - доменный компонент (2-го или 3-го уровня), добавляет суффикс имени surbl - и делает dns запрос. - При успешном определении такого имени добавляется символ. - Пример работы: -\end_layout - -\begin_layout LyX-Code -URL (http://some.test.ru/index.html) -> test.ru + (insecure-bl.rambler.ru) -> -\end_layout - -\begin_layout LyX-Code -resolve test.ru.insecure-bl.rambler.ru -> 127.0.0.1 -> add symbol -\end_layout - -\begin_layout Standard -Параметры настройки: -\end_layout - -\begin_layout LyX-Code -.module 'surbl' { -\end_layout - -\begin_deeper -\begin_layout LyX-Code - # Определение суффикса SURBL -\end_layout - -\begin_layout LyX-Code - # Символы '%b' заменяются на значение определенного бита -\end_layout - -\begin_layout LyX-Code - suffix_%b_SURBL_MULTI = "multi.surbl.org"; -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code - # Суффикс для каждого из бит -\end_layout - -\begin_layout LyX-Code - bit_2 = "SC"; # sc.surbl.org -\end_layout - -\begin_layout LyX-Code - bit_4 = "WS"; # ws.surbl.org -\end_layout - -\begin_layout LyX-Code - bit_8 = "PH"; # ph.surbl.org -\end_layout - -\begin_layout LyX-Code - bit_16 = "OB"; # ob.surbl.org -\end_layout - -\begin_layout LyX-Code - bit_32 = "AB"; # ab.surbl.org -\end_layout - -\begin_layout LyX-Code - bit_64 = "JP"; # jp.surbl.org -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code - # Имя метрики -\end_layout - -\begin_layout LyX-Code - metric = "default"; -\end_layout - -\begin_layout LyX-Code - # Список доменов, для которых необходимо использовать 3 доменных -\end_layout - -\begin_layout LyX-Code - # компонента, вместо двух -\end_layout - -\begin_layout LyX-Code - 2tld = "file:///etc/rspamd/2tld.inc"; -\end_layout - -\begin_layout LyX-Code - # Список URL'ей, которые не будут проверяться этим модулем -\end_layout - -\begin_layout LyX-Code - whitelist = "file:///etc/rspamd/surbl-whitelist.inc"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -Некоторые пояснения по данной конфигурации. - Модуль SURBL может осуществлять проверку битов в полученном от DNS сервера - ответе, и вставлять соответствующий символ. - Это используется для проверки сразу нескольких списков одним DNS запросе. - Тогда ответ сервера содержит списки, в которых встретился данный URL в - виде битов адреса. - Более подробно с этим можно ознакомиться тут: -\begin_inset CommandInset href -LatexCommand href -name "http://www.surbl.org/lists.html#multi" -target "http://www.surbl.org/lists.html#multi" - -\end_inset - -. - Список 2tld используется для задания списка доменов, для которых необходимо - проверять не два уровня доменного имени, а три. - Например, это актуально для виртуальных хостингов или же специальных зон - для доменов третьего уровня, например org.ru или pp.ru. -\end_layout - -\begin_layout Section -Настройка модуля regexp -\end_layout - -\begin_layout Standard -Модуль regexp является очень важным в работе rspamd, так как определяет - все правила фильтрации сообщений по регулярным выражениям. - Модуль работает с логическими выражениями из регулярных выражений, поэтому - его настройка выглядит достаточно запутанной. - Однако, если пользоваться переменными, то логика работы становится более - понятной. - При настройке самого модуля используются простые директивы вида: -\end_layout - -\begin_layout Code -ИМЯ_СИМВОЛА = "логическое выражение" -\end_layout - -\begin_layout Standard -Само логическое выражение содержит различные регулярные выражения и функции, - объединенные символами логики: -\end_layout - -\begin_layout Itemize -& - логическое -\begin_inset Quotes eld -\end_inset - -И -\begin_inset Quotes erd -\end_inset - - -\end_layout - -\begin_layout Itemize -| - логическое -\begin_inset Quotes eld -\end_inset - -ИЛИ -\begin_inset Quotes erd -\end_inset - - -\end_layout - -\begin_layout Itemize -! - логическое отрицание -\end_layout - -\begin_layout Standard -Приоритет операций может изменяться скобками, например: -\end_layout - -\begin_layout LyX-Code -A & B | C - выполняется слева направо A & B затем | C -\end_layout - -\begin_layout LyX-Code -A & (B | C) - выполняется как (B | C) затем & A -\end_layout - -\begin_layout Standard -Сами регулярные выражения совместимы с perl regular expressions. - Их синтаксис можно изучить в соответствующей литературе: -\begin_inset CommandInset href -LatexCommand href -name "http://perldoc.perl.org/perlre.html" -target "http://perldoc.perl.org/perlre.html" - -\end_inset - -. - У rspamd есть дополнительные флаги, определяющие, в какой части сообщения - искать заданное регулярное выражение: -\end_layout - -\begin_layout Itemize -r - "сырой" незакодированный в utf8 regexp -\end_layout - -\begin_layout Itemize -H - ищет по заголовкам сообщения -\end_layout - -\begin_layout Itemize -M - ищет по всему сообщению (в "сыром" виде, то есть без mime декодинга) - -\end_layout - -\begin_layout Itemize -P - ищет по всем текстовым mime частям -\end_layout - -\begin_layout Itemize -U - ищет по url -\end_layout - -\begin_layout Itemize -X - ищет по "сырым" хедерам (опять же без декодирования) -\end_layout - -\begin_layout Standard -Если в регулярном выражении встречаются символы двойной кавычки ( -\begin_inset Quotes eld -\end_inset - -) или же слэша (/), то их необходимо экранировать обратным слэшем (при этом - сам обратный слэш экранировать необязательно): -\end_layout - -\begin_layout LyX-Code - -\backslash -" -\backslash -/ -\end_layout - -\begin_layout Standard -Для поиска по заголовкам формат регулярного выражения несколько меняется: -\end_layout - -\begin_layout LyX-Code -Имя_заголовка=/регулярное_выражение/H -\end_layout - -\begin_layout Standard -При поиске по заголовкам происходит поиск заголовков с таким именем и сравнение - их значений с регулярным выражением, пока это выражение не будет найдено, - либо пока не будут проверены все заголовки с таким именем. - Для multipart сообщений происходит поиск заголовков по всем частям сообщения. - Это справедливо для всех функций, работающих с заголовками. - Поиск по -\begin_inset Quotes eld -\end_inset - -сырым -\begin_inset Quotes erd -\end_inset - - заголовкам происходит без учета mime частей - только по заголовкам самого - сообщения. - При этом, хотя и не происходит декодирования заголовков, но происходит - их де-фолдинг (фолдинг - перенос заголовков по строчкам). - Модуль regexp также может использовать внутри логических выражений встроенные - функции rspamd. - Встроенные функции всегда возвращат логическое значение (истина или ложь) - и могут принимать аргументы (в том числе аргументы, являющиеся логическими - выражениями). - Список встроенных функций: -\end_layout - -\begin_layout Itemize -header_exists - принимает в качестве аргумента имя хедера, возвращает true, - если такой заголовок существует -\end_layout - -\begin_layout Itemize -compare_parts_distance - принимает в качестве аргумента число от 0 до 100, - которое отражает разницу в процентах между частями письма. - Функция работает с сообщениями, содержащими 2 текстовые части (text/plain - и text/html) и возвращает true тогда, когда эти части различаются более - чем на n процентов. - Если аргумент не указан, то по умолчанию ищется различие в 100% (полностью - разные части). -\end_layout - -\begin_layout Itemize -compare_transfer_encoding - сравнивает Content-Transfer-Encoding с заданной - строкой -\end_layout - -\begin_layout Itemize -content_type_compare_param - сравнивает параметр content-type заголовка - с регулярным выражением или строкой: -\end_layout - -\begin_layout LyX-Code -content_type_compare_param(Charset, /windows- -\backslash -d+/) -\end_layout - -\begin_layout LyX-Code -content_type_compare_param(Charset, ascii) -\end_layout - -\begin_layout Itemize -content_type_has_param - проверяет, есть ли в заголовке content-type определенны -й параметр -\end_layout - -\begin_layout Itemize -content_type_is_subtype - сравнивает подтип content-type с регулярным выражением - или строкой -\end_layout - -\begin_layout Itemize -content_type_is_type - сравнивает тип content-type с регулярным выражением - или строкой -\end_layout - -\begin_layout LyX-Code -content_type_is_type(text) -\end_layout - -\begin_layout LyX-Code -content_type_is_subtype(/?.html/) -\end_layout - -\begin_layout Itemize -regexp_match_number - принимает в качестве первого параметра число, которое - означает порог сработавших регэкспов и список регэкспов или функций, которые - должны проверяться. - Если число сработавших регэкспов или функций больше порога, функция возвращает - TRUE, иначе - FALSE, например: -\end_layout - -\begin_layout LyX-Code -regexp_match_number(2, ${__RE1}, ${__RE2}, header_exists(Subject)) -\end_layout - -\begin_layout Itemize -has_only_html_part - функция возвращает TRUE, если в сообщении есть только - одна HTML часть -\end_layout - -\begin_layout Itemize -compare_recipients_distance - вычисляет процент схожих получателей письма. - Принимает аргумент - порог в процентах похожести. - -\end_layout - -\begin_layout Itemize -is_recipients_sorted - возвращает TRUE, если список получателей сортирован - (работает только если число получателей >= 5). - -\end_layout - -\begin_layout Itemize -is_html_balanced - возвращает TRUE, если теги всех html частей сбалансированы - -\end_layout - -\begin_layout Itemize -has_html_tag - возвращает TRUE, если заданный html тег найден -\end_layout - -\begin_layout Standard -Данные функции были созданы для решения задач, которые сложно или же невозможно - решить при помощи обычных регулярных выражений. - При конфигурации модуля regexp целесообразно определить все логические - выражения в отдельных переменных, подключить их при помощи директивы .include - и задавать символы как: -\end_layout - -\begin_layout LyX-Code -СИМВОЛ="${переменная}"; -\end_layout - -\begin_layout Standard -иначе конфигурация модуля будет практически нечитаемой из-за обилия регулярных - выражений. -\end_layout - -\begin_layout Section -Настройка модуля spf -\end_layout - -\begin_layout Standard -Модуль spf предназначен для проверки spf записей для отправителя письма. - Технология SPF позволяет определить в DNS TXT запись для данного домена - с определениями, с каких ip адресов или сетей допустима отправка почты - для данного домена. - Также spf позволяет создавать -\begin_inset Quotes fld -\end_inset - -черные списки -\begin_inset Quotes frd -\end_inset - - для данного домена - адреса, с которых запрещена отправка почты для домена. - Rspamd может получать spf записи, и проверять, возможна ли отправка почты - данного домена с данного ip. - При этом возможно добавление 3-х символов: -\end_layout - -\begin_layout Itemize -FAIL - отправка запрещена -\end_layout - -\begin_layout Itemize -SOFTFAIL - отправка явно не разрешена, но и явно не запрещена -\end_layout - -\begin_layout Itemize -ALLOW - отправка явно разрешена -\end_layout - -\begin_layout Standard -Для задания этих символов можно использовать настройки модуля spf: -\end_layout - -\begin_layout LyX-Code -.module 'spf' { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -symbol_fail = "SPF_FAIL"; -\end_layout - -\begin_layout LyX-Code -symbol_softfail = "SPF_SOFTFAIL"; -\end_layout - -\begin_layout LyX-Code -symbol_allow = "SPF_ALLOW"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -Коэффициенты для данных символов лучше определить следующим образом: высокий - вес для символа FAIL, достаточно низкий вес для символа SOFTFAIL и отрицательны -й вес для символа ALLOW. -\end_layout - -\begin_layout Chapter -Cтатистические алгоритмы -\end_layout - -\begin_layout Section -Winnow и OSB -\end_layout - -\begin_layout Standard -В rspamd используется алгоритм ортогональных разреженных биграмм (OSB), - который основан на следующем принципе: -\end_layout - -\begin_layout Code -\begin_inset listings -inline false -status open - -\begin_layout Quotation - -\end_layout - -\begin_layout Quotation - -\end_layout - -\begin_layout Quotation - - н ----------------------------------- -\end_layout - -\begin_layout Quotation - - а ----------------------------------- -\end_layout - -\begin_layout Quotation - - б ----------------------------------- -\end_layout - -\begin_layout Quotation - - о | w1 | w2 | w3 | w4 | w5 | -\end_layout - -\begin_layout Quotation - - р | | | | | | --> выходные токены -\end_layout - -\begin_layout Quotation - - ы ----------------------------------- -\end_layout - -\begin_layout Quotation - - / Текущий набор хешей и весов -\end_layout - -\begin_layout Quotation - - / -\end_layout - -\begin_layout Quotation - -Входные токены -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -То есть, процесс преобразования можно представить следующим образом: для - каждого набора весов (w1..w5) составляется набор хешей. - Токены образуются из текста. - Например, возьмем некое письмо и наложим на него окно: -\end_layout - -\begin_layout LyX-Code -"Мама мыла раму." -\end_layout - -\begin_layout LyX-Code -|________| -\end_layout - -\begin_layout Standard -В данном окне создаются 2 токена: -\end_layout - -\begin_layout Standard -h("Мама"), h("мыла"), где h - хеш функция. -\end_layout - -\begin_layout Standard -Дальше окно двигается вправо на один токен и опять создаются 2 токена: h("мыла") -, h("раму") -\end_layout - -\begin_layout Standard -В rspamd используется окно в 5 токенов и используются пары: -\end_layout - -\begin_layout LyX-Code -1 - 5 -- h1 -\end_layout - -\begin_layout LyX-Code -2 - 5 -- h2 -\end_layout - -\begin_layout LyX-Code -3 - 5 -- h3 -\end_layout - -\begin_layout LyX-Code -4 - 5 -- h4 -\end_layout - -\begin_layout Standard -Каждый такой токен состоит из двух хешей (h1 и h2). - То есть каждое слово текста может давать до 5-ти токенов. - Это делается для того, чтобы в статистических алгоритмах учитывать не индивидуа -льные слова, и их сочетания, чтобы уменьшить ошибку. -\end_layout - -\begin_layout Standard -После этого мы должны вычислить принадлежность потока выходных токенов к - некоторому классу. - Для этого используется алгоритм Winnow. - Идея алгоритма очень проста: -\end_layout - -\begin_layout Enumerate -Каждый возможный входной токен имеет вес 1.0 (то есть, нас интересуют только - те токены, которые не равны 1.0) -\end_layout - -\begin_layout Enumerate -Для обучения проделываем следующие шаги: -\end_layout - -\begin_deeper -\begin_layout Enumerate -генерируем набор токенов путем OSB алгоритма -\end_layout - -\begin_layout Enumerate -удаляем все дупликаты -\end_layout - -\begin_layout Enumerate -если данный входной набор принадлежит классу (например, спам или неспам), - то умножаем вес каждого встреченного токена на т.н. - Promotion Constant, которая равна 1,23 -\end_layout - -\begin_layout Enumerate -если данный входной набор не принадлежит классу, то умножаем каждый найденный - токен на Demotion Constant в данном классе, которая равна 0,83 -\end_layout - -\begin_layout Enumerate -абсолютно неважно, сколько раз встречался данный токен во входном потоке, - мы его умножаем на promotion или demotion только один раз -\end_layout - -\end_deeper -\begin_layout Enumerate -Для классификации потока мы поступаем следующим образом: -\end_layout - -\begin_deeper -\begin_layout Enumerate -генерируем набор токенов путем OSB алгоритма -\end_layout - -\begin_layout Enumerate -удаляем все дупликаты -\end_layout - -\begin_layout Enumerate -суммируем веса всех токенов, найденных в каждом из файлов данных статистики - (при этом те токены, которые мы не нашли, имеют вес 1) -\end_layout - -\begin_layout Enumerate -затем мы делим полученную сумму на число токенов и смотрим, какой из классов - (файлов данных) набрал больше очков и делаем заключение о принадлежности - входного текста к классу -\end_layout - -\end_deeper -\begin_layout Standard -Файлы данных статистики представляют собой следующие структуры: -\end_layout - -\begin_layout LyX-Code -{ -\end_layout - -\begin_deeper -\begin_layout LyX-Code -Header, -\end_layout - -\begin_layout LyX-Code -{ feature_block1..feature_blockN } -\end_layout - -\end_deeper -\begin_layout LyX-Code -} -\end_layout - -\begin_layout Standard -Заголовок файла очень прост: -\end_layout - -\begin_layout LyX-Code -struct { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -char magic[3] = { 'r', 's', 'd' }; -\end_layout - -\begin_layout LyX-Code -u_char version[2] = { '1', '0' }; -\end_layout - -\begin_layout LyX-Code -uint64_t create_time; -\end_layout - -\end_deeper -\begin_layout LyX-Code -} -\end_layout - -\begin_layout Standard -Каждый feature_block состоит из 4-х полей: -\end_layout - -\begin_layout LyX-Code -struct { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -uint32_t hash1; -\end_layout - -\begin_layout LyX-Code -uint32_t hash2; -\end_layout - -\begin_layout LyX-Code -double value; -\end_layout - -\begin_layout LyX-Code -uint32_t last_access; -\end_layout - -\end_deeper -\begin_layout LyX-Code -} -\end_layout - -\begin_layout Standard -Итого 16 байт на каждый feature. - 0-е значения показывают свободную ячейку. - Значение hash1 используется в качестве индекса: -\end_layout - -\begin_layout LyX-Code -idx = hash1 % filesize; -\end_layout - -\begin_layout Standard -Где filesize - размер в количестве feature_block'ов. - При этом данный токен должен помещаться в заданную ячейку или ячейку за - ним. - При этом образуется цепочка токенов: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -idx -\end_layout - -\begin_layout Plain Layout - - -\backslash - -\end_layout - -\begin_layout Plain Layout - -| занят | занят | занят | свободен | -\end_layout - -\begin_layout Plain Layout - - -\backslash ------^ -\backslash ------^ -\backslash ------^ -\end_layout - -\end_inset - -При этом, длина такой цепочки должна быть лимитирована некоторым разумным - числом, например 128. - Тогда максимальное время доступа будет не более 128-и итераций. - Если мы не нашли за 128 итераций свободную ячейку, то мы можем поместить - новый токен на место того, который меньше всего использовался (min (last_access -)). - При этом при доступе к ячейке необходимо обновлять last_access: -\end_layout - -\begin_layout Code -last_access = now - creation_time. - -\end_layout - -\begin_layout Standard -Такая организация позволяет замещать только наименее используемые токены. -\end_layout - -\begin_layout Chapter -Протокол rspamc -\end_layout - -\begin_layout Standard -Формат запроса схож с http: -\end_layout - -\begin_layout LyX-Code -COMMAND RSPAMC/1.0 -\end_layout - -\begin_layout Standard -При этом допустимы следующие команды: -\end_layout - -\begin_layout Itemize -CHECK - проверить сообщение и выдать результат по каждой из метрик (не выводя - символов) -\end_layout - -\begin_layout Itemize -SYMBOLS - проверить сообщение, выдать результат по каждой из метрик и символы - по каждой из метрик -\end_layout - -\begin_layout Itemize -PROCESS - проверить сообщение, выдать результат по каждой из метрик, а затем - вывести исходное сообщение -\end_layout - -\begin_layout Itemize -PING - не принимая сообщение выдать готовность к работе -\end_layout - -\begin_layout Standard -Также в зависимости от подключенных плагинов могут быть доступны другие - команды протокола, например URLS (вывести все найденные в сообщении url'и) - или EMAILS. -\end_layout - -\begin_layout Standard -Формат ответа: -\end_layout - -\begin_layout LyX-Code -SPAMD/1.1 0 EX_OK -\end_layout - -\begin_layout LyX-Code - -\backslash - / -\backslash -/ -\end_layout - -\begin_layout LyX-Code -Версия Код ошибки -\end_layout - -\begin_layout LyX-Code -Spam: False ; 2 / 5 -\end_layout - -\begin_layout Standard -Это формат совместимости с sa-spamd (без метрик). - Новый формат ответа: -\end_layout - -\begin_layout LyX-Code -RSPAMD/1.0 0 EX_OK -\end_layout - -\begin_layout LyX-Code -Metric: Name; Spam_Result; Spam_Mark / Spam_Mark_Required -\end_layout - -\begin_layout LyX-Code -Metric: Name2 ; Spam_Result2 ; Spam_Mark2 / Spam_Mark_Required2 -\end_layout - -\begin_layout Standard -Заголовков типа metric может быть несколько. - Формат вывода символов: -\end_layout - -\begin_layout LyX-Code -SYMBOL1, SYMBOL2, SYMBOL3 -- формат совместимости с sa-spamd -\end_layout - -\begin_layout LyX-Code -Symbol: Name; Param1,Param2,Param3 -- формат rspamd -\end_layout - -\begin_layout Standard -Формат ответа зависит от формата запроса: -\end_layout - -\begin_layout LyX-Code -PROCESS SPAMC/1.2 -\end_layout - -\begin_layout LyX-Code - -\backslash - / -\backslash - / -\end_layout - -\begin_layout LyX-Code -Команда Версия -\end_layout - -\begin_layout Standard -В любом из режимов работы поддерживаются следующие заголовки: -\end_layout - -\begin_layout Itemize -Content-Length - длина сообщения -\end_layout - -\begin_layout Itemize -Helo - HELO, полученный от клиента -\end_layout - -\begin_layout Itemize -From - MAIL FROM -\end_layout - -\begin_layout Itemize -IP - IP клиента -\end_layout - -\begin_layout Itemize -Recipient-Number - число реципиентов -\end_layout - -\begin_layout Itemize -Rcpt - реципиент -\end_layout - -\begin_layout Itemize -Queue-ID - идентификатор очереди -\end_layout - -\begin_layout Standard -Эти значения могут использоваться в фильтрах rspamd. -\end_layout - -\begin_layout Chapter -Клиент rspamc -\end_layout - -\begin_layout Standard -Клиент rspamc представляет собой программу, написанную на perl и предназначенную - для работы с системой rspamd. - Rspamc принимает следующие аргументы: -\end_layout - -\begin_layout Itemize --с: определяет путь к конфигурационному файлу rspamd, используется для работы - с локальным rspamd -\end_layout - -\begin_layout Itemize --h: определяет адрес удаленного rspamd сервера -\end_layout - -\begin_layout Itemize --p: определяет порт для удаленного rspamd сервера -\end_layout - -\begin_layout Itemize --P: определяет пароль для работы с привиллегированными командами rspamd -\end_layout - -\begin_layout Itemize --s: определяет имя символа для обучения классификатора -\end_layout - -\begin_layout Standard -Последним аргументом rspamc принимает команду. - Если команда не задана, то используется команда SYMBOLS. - Команды, принимаемые rspamc: -\end_layout - -\begin_layout Itemize -команды по обработке сообщений: -\end_layout - -\begin_deeper -\begin_layout Itemize -symbols - по данной команде проверяется сообщение, переданное через stdin - rspamc -\end_layout - -\begin_layout Itemize -check - по данной команде выводится только результат по метрикам без символов -\end_layout - -\begin_layout Itemize -process - возвращает не только символы, но и исходное сообщение -\end_layout - -\begin_layout Itemize -urls - выводит все найденные url'и -\end_layout - -\begin_layout Itemize -emails - выводит все найденные адреса e-mail в сообщении -\end_layout - -\end_deeper -\begin_layout Itemize -команды по работе с управляющим интерфейсом -\end_layout - -\begin_deeper -\begin_layout Itemize -stat - выводит статистику работы -\end_layout - -\begin_layout Itemize -learn - обучает классификатор по определенному классу (указанному опцией - -s) -\end_layout - -\begin_layout Itemize -shutdown - останавливает систему rspamd -\end_layout - -\begin_layout Itemize -uptime - выводит время работы rspamd -\end_layout - -\begin_layout Itemize -counters - выводит значения счетчиков символов -\end_layout - -\begin_layout Itemize -fuzzy_add - добавляет fuzzy hash в хранилище -\end_layout - -\begin_layout Itemize -fuzzy_del - удаляет fuzzy hash из хранилища -\end_layout - -\end_deeper -\begin_layout Chapter -LUA API плагинов -\end_layout - -\begin_layout Standard -Rspamd позволяет реализовывать различную логику в виде lua плагинов, для - чего используется директива modules. - Данная директива позволяет задавать пути к каталогам, содержащим скрипты - на lua: -\end_layout - -\begin_layout LyX-Code -modules { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -module_path = -\begin_inset Quotes fld -\end_inset - -/some/path/ -\begin_inset Quotes frd -\end_inset - -; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -При инициализации rspamd загружает все файлы вида *.lua и выполняет их (при - ошибке в коде плагинов rspamd запускаться не будет, выдавая ошибку конфигурации -, при указанной опции -t будет проверяться не только синтаксис конфигурационного - файла, но и синтаксис плагинов). - При этом, определяется глобальная переменная rspamd_config, позволяющая - извлекать опции конфигурации и регистрировать правила и соответствующие - им символы. - Таким образом, каждый lua плагин условно можно разделить на две части: - исполняемый код, выполняющий настройку опций модуля, регистрирующий функции - правил (callbacks), и собственно обработчики правил. - -\end_layout - -\begin_layout Section -Настройка lua модуля -\end_layout - -\begin_layout Standard -Для извлечения параметров конфигурации и регистрации обработчиков правил - применяется глобальная переменная rspamd_config, которая обладает рядом - полезных методов: -\end_layout - -\begin_layout Itemize -get_module_opt (module_name, option_name) - возвращает значение опции option_nam -e для модуля с именем module_name. - То есть, если в конфигурационном файле есть следующая запись: -\end_layout - -\begin_layout LyX-Code -module 'test' { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -param = -\begin_inset Quotes fld -\end_inset - -value -\begin_inset Quotes frd -\end_inset - -; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_deeper -\begin_layout Standard -То вызов rspamd_config:get_module_opt('test', 'param') вернет строку 'value'; -\end_layout - -\end_deeper -\begin_layout Itemize -get_all_opts (module_name) - возвращает таблицу из всех опций для данного - модуля, ключом служит имя опции: -\end_layout - -\begin_layout LyX-Code -local opts = rspamd_config:get_all_opts('test') -\end_layout - -\begin_layout LyX-Code -if opts then -\end_layout - -\begin_deeper -\begin_layout LyX-Code -var = opts['param'] -\end_layout - -\begin_layout LyX-Code -for k,v in pairs opts do -\end_layout - -\begin_deeper -\begin_layout LyX-Code -print ( -\begin_inset Quotes fld -\end_inset - -Param: -\begin_inset Quotes frd -\end_inset - - .. - k .. - -\begin_inset Quotes fld -\end_inset - - Value: -\begin_inset Quotes frd -\end_inset - - .. - v) -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\begin_layout Itemize -get_metric (name) - возвращает объект метрики с данным именем -\end_layout - -\begin_layout Itemize -register_function(name, callback) - регистрирует функцию lua для использования - в логических выражениях rspamd, callback в данном случае - строка с именем - функции, пример применения: -\end_layout - -\begin_layout LyX-Code -function some_func(task, arg1, arg2) -\end_layout - -\begin_deeper -\begin_layout LyX-Code -return false -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\begin_layout LyX-Code -rspamd_config:register_function('lua_func', 'some_func') -\end_layout - -\begin_layout Standard -Объект метрики используется для регистрации символов: -\end_layout - -\begin_layout Itemize -register_symbol (symbol, initial_weight, callback) - symbol определяет имя - символа, initial_weight - изначальный вес, callback - строка с именем функции: -\end_layout - -\begin_layout LyX-Code -local m = rspamd_config:get_metric('default') -\end_layout - -\begin_layout LyX-Code -if m then -\end_layout - -\begin_deeper -\begin_layout LyX-Code -m:register_symbol('TEST', 1.0, 'some_callback') -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\begin_layout Standard -После регистрации обработчика символа этот обработчик будет вызываться rspamd - обычным образом, используя планировщик символов (это подробно описано в - 3.2). -\end_layout - -\begin_layout Section -Обработчик правила -\end_layout - -\begin_layout Standard -Обработчик правила - это функция, реализующая логику правила. - В качестве параметра она принимает объект task, из которого можно извлечь - различную информацию о сообщении. - После выполнения логики работы обработчик может вставить символ, используя - тот же объект task. - Таким образом типичная функция-обработчик выглядит следующим образом: -\end_layout - -\begin_layout LyX-Code -function some_callback(task) -\end_layout - -\begin_deeper -\begin_layout LyX-Code -if some_condition(task) then -\end_layout - -\begin_deeper -\begin_layout LyX-Code -task:insert_result(metric, symbol, 1) -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\begin_layout Standard -Функция insert_result принимает в качестве параметров имя метрики, имя символа, - вес и необязательный список строковых параметров, которые будут ассоциированы - с этим символом. - Объект task предоставляет ряд функций, позволяющих создать логику правила - фильтрации: -\end_layout - -\begin_layout Itemize -get_received_headers() - возвращает массив из обработанных заголовков Received - в виде таблицы: -\end_layout - -\begin_deeper -\begin_layout Itemize -h['from_hostname'] - hostname, откуда получено сообщение -\end_layout - -\begin_layout Itemize -h['from_ip'] - ip, откуда получено сообщение -\end_layout - -\begin_layout Itemize -h['real_hostname'] - hostname, распознанное самим релеем -\end_layout - -\begin_layout Itemize -h['real_ip'] - ip, который соответствует real_hostname -\end_layout - -\begin_layout Itemize -h['by_hostname'] - hostname самого релея -\end_layout - -\begin_layout Standard -received заголовки в массиве идут в обратном порядке, то есть, первые релеи - письма будут первыми элементами массива -\end_layout - -\end_deeper -\begin_layout Itemize -get_raw_headers() - возвращает строку, содержащую все заголовки сообщения - в неразобранном виде -\end_layout - -\begin_layout Itemize -get_text_parts() - возвращает массив объектов типа text_part -\end_layout - -\begin_layout Itemize -get_urls() - возвращает массив строк, содержащих извлеченные из сообщения - URL'и -\end_layout - -\begin_layout Itemize -get_message() - возвращает объект типа сообщение -\end_layout - -\begin_layout Itemize -get_recipients() - возвращает массив получателей письма, переданных в ходе - smtp диалога (командами RCPT TO:) -\end_layout - -\begin_layout Itemize -get_from() - возвращает адрес отправителя письма, переданных в ходе smtp - диалога (команда MAIL FROM:) -\end_layout - -\begin_layout Itemize -get_helo() - возвращает значение HELO -\end_layout - -\begin_layout Itemize -get_from_ip() - возвращает ip адрес, откуда нам пришло данное письмо -\end_layout - -\begin_layout Standard -Объект -\begin_inset Quotes fld -\end_inset - -message -\begin_inset Quotes frd -\end_inset - - применяется для манипуляций с заголовками: -\end_layout - -\begin_layout Itemize -get_header(headername) - возвращает массив всех значений заголовков с таким - именем (может быть массив из одного элемента, если такой заголовок в сообщении - представлен единожды) -\end_layout - -\begin_layout Itemize -set_header(headername, headervalue) - устанавливает заданный заголовок -\end_layout - -\begin_layout Standard -Объект text_part предназначен для манипуляций с текстовым содержимым сообщения: -\end_layout - -\begin_layout Itemize -get_content() - возвращает текстовое содержимое части -\end_layout - -\begin_layout Itemize -is_html() - возвращает true, если данная часть представляет собой HTML -\end_layout - -\begin_layout Itemize -is_empty() - возвращает true, если данная часть не содержит текста -\end_layout - -\begin_layout Itemize -get_fuzzy() - возвращает строку с нечетким хешем для данного сообщения -\end_layout - -\begin_layout Standard -Пример функции-обработчика: -\end_layout - -\begin_layout LyX-Code -function received_cb (task) -\end_layout - -\begin_deeper -\begin_layout LyX-Code -local recvh = task:get_received_headers() -\end_layout - -\begin_layout LyX-Code -for _,rh in ipairs(recvh) do -\end_layout - -\begin_deeper -\begin_layout LyX-Code -if rh['real_ip'] then -\end_layout - -\begin_deeper -\begin_layout LyX-Code -local parts = task:get_text_parts() -\end_layout - -\begin_layout LyX-Code -for _,part in ipairs(parts) do -\end_layout - -\begin_deeper -\begin_layout LyX-Code -if not part:is_empty() then -\end_layout - -\begin_deeper -\begin_layout LyX-Code -local text = part:get_content() -\end_layout - -\begin_layout LyX-Code -if some_filter(text) then -\end_layout - -\begin_layout LyX-Code -task:insert_result(metric, symbol, 1) -\end_layout - -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\begin_layout Section -Использование DNS -\end_layout - -\begin_layout Standard -Для многих задач фильтрации сообщений используются различные DNS запросы, - поэтому lua интерфейс предоставляет возможность планирования DNS запросов, - используя объект task: -\end_layout - -\begin_layout Itemize -resolve_dns_a(host, callback) - выполняет прямое преобразование имени host, - после чего вызывает обработчик callback -\end_layout - -\begin_layout Itemize -resolve_dns_ptr(ip, callback) - то же, что и предыдущее, но выполняет обратное - преобразование ip -\end_layout - -\begin_layout Standard -Так как DNS преобразования осуществляются асинхронно, то необходимо задавать - обработчик, который будет вызываться по завершению DNS запроса. - Обработчик имеет следующий вид: -\end_layout - -\begin_layout LyX-Code -function dns_cb(task, to_resolve, results, err) -\end_layout - -\begin_layout Itemize -task - объект task -\end_layout - -\begin_layout Itemize -to_resolve - строка, содержащая имя хоста или ip, для которого выполнялось - преобразование -\end_layout - -\begin_layout Itemize -results - массив, содержащий ip адреса (для прямого преобразования) или - же имя хоста (для обратного). - В случае ошибки этот параметр имеет значение nil -\end_layout - -\begin_layout Itemize -err - строка, описывающая ошибку (или nil, если преобразование успешно завершило -сь) -\end_layout - -\begin_layout Standard -Пример функции-обработчика результатов DNS запроса: -\end_layout - -\begin_layout LyX-Code -function dns_cb(task, to_resolve, results, err) -\end_layout - -\begin_deeper -\begin_layout LyX-Code -if results then -\end_layout - -\begin_deeper -\begin_layout LyX-Code -local _,_,rbl = string.find(to_resolve, '%d+ -\backslash -.%d+ -\backslash -.%d+ -\backslash -.%d+ -\backslash -.(.+)') -\end_layout - -\begin_layout LyX-Code -task:insert_result(metric, symbol, 1, rbl) -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\begin_layout Section -Использование файлов-списков -\end_layout - -\begin_layout Standard -В lua плагинах можно задавать и использовать файлы списков, как это описано - в п. - 4.1. - Это полезно, когда в lua необходимо использовать некоторые данные, которые - бы асинхронно обновлялись в процессе работы rspamd. - API по работе со списками сожержит следующие функции: -\end_layout - -\begin_layout Itemize -rspamd_config:add_radix_map (string) - добавляет определение списка, содержащего - ip адреса и сети. - При удачном добавлении возвращается объект типа rspamd_radix, который может - использоваться в обработчиках символов для определения наличия в каком-либо - списке заданного ip; -\end_layout - -\begin_layout Itemize -rspamd_config:add_hash_map (string) - добавляет определение списка строк - (доменов), при успешном добавлении возвращает объект типа rspamd_hash. -\end_layout - -\begin_layout Standard -Использовать списки целесообразно в функциях-обработчкиках, так как сразу - же после добавления эти списки могут оказаться пустыми. - Объекты, возвращаемые функциями, регистрирующими файлы списков, имеют метод - get_key, позволяющий определить наличие какого-либо элемента в списке. - Для списков ip адресов этот объект принимает целое число, для списка строк - - строку. - Простой пример использования списков. -\end_layout - -\begin_layout Standard -Регистрация: -\end_layout - -\begin_layout LyX-Code -local radix_list = nil -\end_layout - -\begin_layout LyX-Code -local host_list = nil -\end_layout - -\begin_layout LyX-Code -radix_list = rspamd_config:add_radix_map ('http://somehost/ip.list') -\end_layout - -\begin_layout LyX-Code -host_list = rspamd_config:add_hash_map ('http://otherhost/host.list') -\end_layout - -\begin_layout Standard -Использование в обработчике символа: -\end_layout - -\begin_layout LyX-Code -function check_whitelist (task) -\end_layout - -\begin_deeper -\begin_layout LyX-Code --- check client's ip -\end_layout - -\begin_layout LyX-Code -local ipn = task:get_from_ip_num() -\end_layout - -\begin_layout LyX-Code -if ipn and radix_list then -\end_layout - -\begin_deeper -\begin_layout LyX-Code -local key = radix_list:get_key(ipn) -\end_layout - -\begin_layout LyX-Code -if key then -\end_layout - -\begin_deeper -\begin_layout LyX-Code -task:insert_result(metric, symbol_ip, 1) -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code --- check client's from domain -\end_layout - -\begin_layout LyX-Code -local from = task:get_from() -\end_layout - -\begin_layout LyX-Code -if from and host_list then -\end_layout - -\begin_deeper -\begin_layout LyX-Code --- extract domain part -\end_layout - -\begin_layout LyX-Code -local _,_,domain = string.find(from, '@(.+)>?$') -\end_layout - -\begin_layout LyX-Code -local key = host_list:get_key(domain) -\end_layout - -\begin_layout LyX-Code -if key then -\end_layout - -\begin_deeper -\begin_layout LyX-Code -task:insert_result(metric, symbol_from, 1) -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\end_deeper -\begin_layout LyX-Code -end -\end_layout - -\begin_layout Chapter -Perl API rspamd -\end_layout - -\begin_layout Standard -Для обработки сообщений системой rspamd было создано простое perl api для - проверки сообщений системой rspamd и обучения системы rspamd. - Данное API содержится в модуле Mail::Rspamd::Client. - Использование API достаточно тривиально: -\end_layout - -\begin_layout LyX-Code -#!/usr/bin/perl -w -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code -use Mail::Rspamd::Client; -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code -my $testmsg; -\end_layout - -\begin_layout LyX-Code -while (<>) { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -$testmsg .= $_; -\end_layout - -\end_deeper -\begin_layout LyX-Code -} -\end_layout - -\begin_layout LyX-Code -my $client = new Mail::Rspamd::Client( -\end_layout - -\begin_deeper -\begin_layout LyX-Code -{ -\end_layout - -\begin_deeper -\begin_layout LyX-Code -port => 11333, -\end_layout - -\begin_layout LyX-Code -hosts => ['localhost:11333',], -\end_layout - -\begin_layout LyX-Code -ip => '127.0.0.1' -\end_layout - -\end_deeper -\begin_layout LyX-Code -} -\end_layout - -\end_deeper -\begin_layout LyX-Code -); -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code -if ($client->ping()) { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -print "Ping is ok -\backslash -n"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -} -\end_layout - -\begin_layout LyX-Code -my $result = $client->check($testmsg); -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout LyX-Code -if ($result && $result->{'default'}->{'isspam'} eq 'True') { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -print "spam -\backslash -n"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -} else { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -print "ham -\backslash -n"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -} -\end_layout - -\begin_layout Standard -Результаты обработки сообщения возвращаются в виде ссылки на хеш, который - индексирован по метрикам. - Каждая из метрик, в свою очередь, также является ссылкой на хеш, содержащий - поля: -\end_layout - -\begin_layout Itemize -isspam - строка 'True' или 'False' -\end_layout - -\begin_layout Itemize -score - вес сообщения -\end_layout - -\begin_layout Itemize -threshold - предельный вес данной метрики -\end_layout - -\begin_layout Itemize -symbols - массив символов для данного сообщения -\end_layout - -\begin_layout Standard -Модуль имеет внутреннюю логику работы с несколькими серверами rspamd, выбирая - каждый раз случайный сервер, а также помечая долго не работающие сервера, - исключая их из списка активных на некоторое время. - При создании Mail::Rspamd::Client также можно указать параметр from (значение - SMTP команды mail from), параметр rcpt (массив SMTP команд rcpt to) и user - (авторизированный пользователь SMTP). - Полный список параметров: -\end_layout - -\begin_layout Itemize -username - имя пользователя (строка) -\end_layout - -\begin_layout Itemize -ip - ip адрес, с которого пришло сообщение (строка) -\end_layout - -\begin_layout Itemize -subject - тема письма (для не mime сообщений) -\end_layout - -\begin_layout Itemize -timeout - время ожидания в секундах (число) -\end_layout - -\begin_layout Itemize -password - пароль для команд котроллера (строка) -\end_layout - -\begin_layout Itemize -statfile - имя символа файла статистики для обучения (строка) -\end_layout - -\begin_layout Itemize -weight - вес сообщения для команд fuzzy_add и learn (число) -\end_layout - -\begin_layout Itemize -imap_search - строка поиска по IMAP (строка) -\end_layout - -\begin_layout Standard -Для выполнения команды на всех серверах используется команда do_all_cmd, - возвращающая хеш вида host => %results. - -\end_layout - -\begin_layout Chapter -Использование HTTP Redirector -\end_layout - -\begin_layout Standard -HTTP редиректор представляет собой утилиту, которая умеет проверять различные - способы HTTP редиректов и выдавать реальный URL для любого заданного. - Данная утилита предназначена для проверки URL'ей вида tinyurl.com, youfrog.com - и прочих сервисов -\begin_inset Quotes fld -\end_inset - -коротких -\begin_inset Quotes frd -\end_inset - - URL'ей. - HTTP редиректор работает как обычный HTTP сервер и принимает стандартные - запросы вида: -\end_layout - -\begin_layout LyX-Code -GET /url_to_resolve HTTP/1.0 -\end_layout - -\begin_layout LyX-Code - -\end_layout - -\begin_layout Standard -Для работы URL редиректор требует ряд perl модулей: -\end_layout - -\begin_layout Itemize -HTTP::Request - обработка HTTP запросов; -\end_layout - -\begin_layout Itemize -POE (Component::Server::TCP Filter::HTTPD Component::Client::HTTP) - для - асинхронной обработки соединений; -\end_layout - -\begin_layout Itemize -HTML::HeadParser - для парсинга HTTP заголовков; -\end_layout - -\begin_layout Itemize -SWF::Element - для обработки SWF (adobe flash) редиректов; -\end_layout - -\begin_layout Itemize -Cache::Memcached::Fast - для хранения кеша URL'ей; -\end_layout - -\begin_layout Itemize -Digest::SHA256 - для индексации хеша; -\end_layout - -\begin_layout Itemize -Proc::Daemon, Proc::PidUtil - для демонизации и управления процессом; -\end_layout - -\begin_layout Itemize -URI::Escape - для нормализации URL'ей. -\end_layout - -\begin_layout Standard -Настройка утилиты осуществляется правкой скрипта rspamd-redirector, конфигурацио -нные параметры находятся в хеше %cfg: -\end_layout - -\begin_layout LyX-Code -our %cfg = ( -\end_layout - -\begin_deeper -\begin_layout LyX-Code -port => 8080, # Порт для приема соединений -\end_layout - -\begin_layout LyX-Code -max_size => 102400, # Максимальный размер принимаемых - данных -\end_layout - -\begin_layout LyX-Code -http_timeout => 5, # Таймаут соединений (секунды) -\end_layout - -\begin_layout LyX-Code -max_rec => 5, # Максимум подзапросов -\end_layout - -\begin_layout LyX-Code -pidfile => '/var/run/rspamd/redirector.pid',# Путь до файла pid'а -\end_layout - -\begin_layout LyX-Code -logfile => '/var/log/rspamd-redirector.log',# Путь до log файла -\end_layout - -\begin_layout LyX-Code -do_log => 0, # Включить логирование запросов -\end_layout - -\begin_layout LyX-Code -debug => 0, # Включить отладочную информацию -\end_layout - -\begin_layout LyX-Code -memcached_servers => # Сервера кеша URL'ей -\end_layout - -\begin_deeper -\begin_layout LyX-Code -[ -\end_layout - -\begin_deeper -\begin_layout LyX-Code -{ address => 'localhost:11211', weight => 2.5 }, -\end_layout - -\end_deeper -\begin_layout LyX-Code -], -\end_layout - -\end_deeper -\begin_layout LyX-Code -digest_bits => 256, # Число бит в ключе кеша -\end_layout - -\begin_layout LyX-Code -cache_expire => 3600, # Время в секундах хранения - записи кеша -\end_layout - -\begin_layout LyX-Code -user => '@RSPAMD_USER@', # Пользователь -\end_layout - -\begin_layout LyX-Code -group => '@RSPAMD_GROUP@', # Группа -\end_layout - -\end_deeper -\begin_layout LyX-Code -); -\end_layout - -\begin_layout Standard -Для работы с redirector'ом необходимо учитывать следующее: при определенни - редиректа rspamd-redirector делает полноценный http запрос, то есть, если - мы будем пытаться разрешить запросы с различными GET параметрами в URL - (например http://some_evil_host/unsubscribe?email=good@email.com), то тем - самым можем занести -\begin_inset Quotes fld -\end_inset - -хорошие -\begin_inset Quotes frd -\end_inset - - адреса в списки спамеров. - Кроме этого, появляется возможность организовать атаку на некоторый http - сервер, послав много писем, содержащих его адрес. - Поэтому проверять редиректы можно только у проверенных доменов. - Для этого используются настройки модуля surbl в самом rspamd (так как именно - модуль surbl отвечает за работу с редиректором): -\end_layout - -\begin_layout LyX-Code -.module 'surbl' { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -... -\end_layout - -\begin_layout LyX-Code -redirector = "localhost:8080"; -\end_layout - -\begin_layout LyX-Code -# Connect timeout for redirector -\end_layout - -\begin_layout LyX-Code -redirector_connect_timeout = "1s"; -\end_layout - -\begin_layout LyX-Code -# IO timeout for redirector -\end_layout - -\begin_layout LyX-Code -redirector_read_timeout = "10s"; -\end_layout - -\begin_layout LyX-Code -# Maps for hosts that should be checked with redirector -\end_layout - -\begin_layout LyX-Code -redirector_hosts_map = "http://some_host/redirector.hosts"; -\end_layout - -\begin_layout LyX-Code -... -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -При этом список redirector_hosts_map содержит домены, которые будут перед - проверкой по surbl листам проверяться на наличие редиректов (то есть, именно - в том виде, что будет при surbl запросе - 2 или 3 компонента имени хоста). - Кеш URL'ей обязателен для работы редиректора, так как в противном случае - массовая рассылка с одинаковым URL'ем приведет к большому числу http запросов. - Кроме этого, кеш URL'ей существенно ускоряет работу редиректора. - Лог файл редиректора позволяет увидеть, какие редиректы были распознаны - и их тип: HTTP редирект, HTML редирект (тег meta refresh), JavaScript редирект - (location = ...), SWF редирект или же кешированный редирект (найденный в memcached -). - Взаимодействие с редиректором возможно не только из rspamd, но и из любого - другого приложения, работающего по HTTP протоколу. -\end_layout - -\begin_layout Chapter -Хранилище нечетких хешей -\end_layout - -\begin_layout Standard -Нечеткий хеш (fuzzy hash) отличается от обычного тем, что при небольшом - изменении в исходном тексте, он также меняется незначительно. - Традиционный (криптографический) хеш в таком случае меняется сильно. - Эта особенность позволяет использовать нечеткие хеши для определения степени - похожести текстов (у похожих текстов будут похожие нечеткие хеши). - Эта операция является более быстрой, чем сравнение текстов, кроме этого, - нечеткие хеши можно хранить, сравнивая с ними впоследствие полученные сообщения. - В rspamd есть возможность использования хранилища нечетких хешей для проверки - сообщений. - При этом считаются хеши всех текстовых частей сообщения, а затем эти хеши - проверяются на наличие в хранилище (с определенным процентом ошибки). - Для хранилища хешей создается специальный процесс fuzzy, который работает - с рабочим процессом rspamd по UDP протоколу. - Несколько хранилищ создают общее хранилище хешей, каждый из элементов которого - содержит часть хешей. - При добавлении или удалении нового хранилища в общее хранилище, все данные - хешей теряются (возможно, это будет устранено в будущем). - При проверке хеша выбирается одно из хранилищ (соответственно хешу) и на - него шлется запрос. - При записи хеша выбирается то же самое хранилище, что и при проверке. - Запись и удаление хеша из общего хранилища обеспечивается командами fuzzy_add - и fuzzy_del на любом из контроллеров, использующих данное хранилище. - Это можно делать, например, используя клиент rspamc: -\end_layout - -\begin_layout LyX-Code -rspamc fuzzy_add < message_to_add.eml -\end_layout - -\begin_layout LyX-Code -rspamd fuzzy_del < message_to_del.eml -\end_layout - -\begin_layout Standard -Настройка хранилища обеспечивается созданием записи для процесса fuzzy storage: -\end_layout - -\begin_layout LyX-Code -worker { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -type = "fuzzy"; -\end_layout - -\begin_layout LyX-Code -# Bind socket for fuzzy interface -\end_layout - -\begin_layout LyX-Code -bind_socket = *:11335; -\end_layout - -\begin_layout LyX-Code -count = 1; -\end_layout - -\begin_layout LyX-Code -# Path to filesystem storage -\end_layout - -\begin_layout LyX-Code -hashfile = "/tmp/fuzzy.db"; -\end_layout - -\begin_layout LyX-Code -# Expire time for hashes in storage (h - for hours, d - for days) -\end_layout - -\begin_layout LyX-Code -expire = "10d"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -Для увеличения производительности хранилища можно заменить нечеткий поиск - на поиск точного соответствия, а также установкой libJudy ( -\begin_inset CommandInset href -LatexCommand href -name "judy arrays" -target "http://judy.sourceforge.net" - -\end_inset - -). - После этого необходимо пересобрать rspamd (libJudy обнаруживается автоматически -) и указать в настройках fuzzy worker'а параметр: -\end_layout - -\begin_layout LyX-Code -use_judy = "yes"; -\end_layout - -\begin_layout Standard -Настройка hashfile используется для указания файла, в который периодически - будут записываться полученные в хранилище хеши (частота синхронизации с - файлом зависит от интенсивности модификаций в хранилище, также синхронизация - происходит при завершении процесса fuzzy storage). - Для настройки клиентской части хранилища используется модуль fuzzy_check: -\end_layout - -\begin_layout LyX-Code -.module 'fuzzy_check' { -\end_layout - -\begin_deeper -\begin_layout LyX-Code -metric = "default"; -\end_layout - -\begin_layout LyX-Code -symbol = "R_FUZZY"; -\end_layout - -\begin_layout LyX-Code -# List of fuzzy storage servers, separated by ',' or ';' or simple by spaces - -\end_layout - -\begin_layout LyX-Code -servers = "localhost:11335;some_host:11335"; -\end_layout - -\end_deeper -\begin_layout LyX-Code -}; -\end_layout - -\begin_layout Standard -После настройки клиентской части с указанными серверами начинает работать - как рабочий процесс (для проверки сообщений), так и контроллер (для записи/удал -ения хешей из хранилища). - -\end_layout - -\begin_layout Chapter -CGI интерфейс rspamd -\end_layout - -\begin_layout Standard -Rspamd имеет простой интерфейс для управления кластером серверов при помощи - веб браузера. - Интерфейс позволяет выполнять основные команды (проверка сообщений, обучение - rspamd, операции с fuzzy хешами, статистика) на выбранных серверах. - Для передачи сообщения rspamd используется либо поле текстового ввода, - либо непосредственная загрузка файла. - Если используется поле текстового ввода и сообщение вводится в него без - mime заголовков (например, для обучения), то интерфейс автоматически вставляет - заголовки по умолчанию и передает составленное таким образом сообщение - для обработки rspamd. - Запуск CGI интерфейса возможен двумя способами: как standalone сервера - и как cgi скрипта. - Первый способ подходит для тестовой работы или же для использования в один - поток. - Второй способ лишен этиго недостатка, но требует наличия настроенного веб - сервера. - Для работы с rspamd используется модуль Mail::Rspamd::Client, описанный - ранее. - Аргументы запуска CGI интерфейса: -\end_layout - -\begin_layout Itemize --standalone - запуск в виде standalone http сервера -\end_layout - -\begin_layout Itemize --port - порт для запуска -\end_layout - -\begin_layout Itemize --host - имя хоста для запуска standalone сервера -\end_layout - -\begin_layout Itemize --cfg - имя файла, содержащего список серверов, с которыми будет работать - CGI интерфейс -\end_layout - -\end_body -\end_document diff --git a/doc/rspamd.pdf b/doc/rspamd.pdf deleted file mode 100644 index c230a3435..000000000 --- a/doc/rspamd.pdf +++ /dev/null @@ -1,10845 +0,0 @@ -%PDF-1.4 -% -5 0 obj -<< /S /GoTo /D (chapter.1) >> -endobj -8 0 obj -(\376\377\0001\000\040\004\036\004\061\004\111\004\060\004\117\000\040\004\070\004\075\004\104\004\076\004\100\004\074\004\060\004\106\004\070\004\117\000\040\004\070\000\040\004\062\004\076\004\067\004\074\004\076\004\066\004\075\004\076\004\101\004\102\004\070\000\040\000r\000s\000p\000a\000m\000d) -endobj -9 0 obj -<< /S /GoTo /D (chapter.2) >> -endobj -12 0 obj -(\376\377\0002\000\040\004\043\004\101\004\102\004\060\004\075\004\076\004\062\004\072\004\060\000\040\000r\000s\000p\000a\000m\000d) -endobj -13 0 obj -<< /S /GoTo /D (section.2.1) >> -endobj -16 0 obj -(\376\377\0002\000.\0001\000\040\004\042\004\100\004\065\004\061\004\076\004\062\004\060\004\075\004\070\004\117) -endobj -17 0 obj -<< /S /GoTo /D (section.2.2) >> -endobj -20 0 obj -(\376\377\0002\000.\0002\000\040\004\043\004\101\004\102\004\060\004\075\004\076\004\062\004\072\004\060) -endobj -21 0 obj -<< /S /GoTo /D (section.2.3) >> -endobj -24 0 obj -(\376\377\0002\000.\0003\000\040\004\027\004\060\004\077\004\103\004\101\004\072) -endobj -25 0 obj -<< /S /GoTo /D (chapter.3) >> -endobj -28 0 obj -(\376\377\0003\000\040\004\036\004\061\004\111\004\070\004\065\000\040\004\077\004\100\004\070\004\075\004\106\004\070\004\077\004\113\000\040\004\100\004\060\004\061\004\076\004\102\004\113) -endobj -29 0 obj -<< /S /GoTo /D (section.3.1) >> -endobj -32 0 obj -(\376\377\0003\000.\0001\000\040\004\037\004\073\004\060\004\075\004\070\004\100\004\076\004\062\004\060\004\075\004\070\004\065\000\040\004\070\000\040\004\067\004\060\004\077\004\103\004\101\004\072\000\040\004\100\004\060\004\061\004\076\004\107\004\070\004\105\000\040\004\077\004\100\004\076\004\106\004\065\004\101\004\101\004\076\004\062) -endobj -33 0 obj -<< /S /GoTo /D (section.3.2) >> -endobj -36 0 obj -(\376\377\0003\000.\0002\000\040\004\033\004\076\004\063\004\070\004\072\004\060\000\040\004\076\004\061\004\100\004\060\004\061\004\076\004\102\004\072\004\070\000\040\004\101\004\076\004\076\004\061\004\111\004\065\004\075\004\070\004\071) -endobj -37 0 obj -<< /S /GoTo /D (chapter.4) >> -endobj -40 0 obj -(\376\377\0004\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\000r\000s\000p\000a\000m\000d) -endobj -41 0 obj -<< /S /GoTo /D (section.4.1) >> -endobj -44 0 obj -(\376\377\0004\000.\0001\000\040\004\036\004\061\004\111\004\070\004\065\000\040\004\077\004\100\004\060\004\062\004\070\004\073\004\060\000\040\004\075\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\070) -endobj -45 0 obj -<< /S /GoTo /D (subsection.4.1.1) >> -endobj -48 0 obj -(\376\377\0004\000.\0001\000.\0001\000\040\004\036\004\077\004\100\004\065\004\064\004\065\004\073\004\065\004\075\004\070\004\117\000\040\004\101\004\077\004\070\004\101\004\072\004\076\004\062) -endobj -49 0 obj -<< /S /GoTo /D (section.4.2) >> -endobj -52 0 obj -(\376\377\0004\000.\0002\000\040\004\036\004\061\004\111\004\070\004\065\000\040\004\077\004\060\004\100\004\060\004\074\004\065\004\102\004\100\004\113\000\040\004\072\004\076\004\075\004\104\004\070\004\063\004\103\004\100\004\060\004\106\004\070\004\070) -endobj -53 0 obj -<< /S /GoTo /D (section.4.3) >> -endobj -56 0 obj -(\376\377\0004\000.\0003\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\004\077\004\100\004\076\004\106\004\065\004\101\004\101\004\076\004\062) -endobj -57 0 obj -<< /S /GoTo /D (section.4.4) >> -endobj -60 0 obj -(\376\377\0004\000.\0004\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\070\000\040\004\066\004\103\004\100\004\075\004\060\004\073\004\070\004\100\004\076\004\062\004\060\004\075\004\070\004\117) -endobj -61 0 obj -<< /S /GoTo /D (section.4.5) >> -endobj -64 0 obj -(\376\377\0004\000.\0005\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\070\000\040\004\074\004\065\004\102\004\100\004\070\004\072\004\070) -endobj -65 0 obj -<< /S /GoTo /D (section.4.6) >> -endobj -68 0 obj -(\376\377\0004\000.\0006\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\004\072\004\073\004\060\004\101\004\101\004\070\004\104\004\070\004\072\004\060\004\102\004\076\004\100\004\076\004\062) -endobj -69 0 obj -<< /S /GoTo /D (subsection.4.6.1) >> -endobj -72 0 obj -(\376\377\0004\000.\0006\000.\0001\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\004\101\004\070\004\075\004\105\004\100\004\076\004\075\004\070\004\067\004\060\004\106\004\070\004\070\000\040\004\101\004\102\004\060\004\102\004\070\004\101\004\102\004\070\004\072\004\070) -endobj -73 0 obj -<< /S /GoTo /D (section.4.7) >> -endobj -76 0 obj -(\376\377\0004\000.\0007\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\004\072\004\076\004\115\004\104\004\104\004\070\004\106\004\070\004\065\004\075\004\102\004\076\004\062\000\040\004\101\004\070\004\074\004\062\004\076\004\073\004\076\004\062) -endobj -77 0 obj -<< /S /GoTo /D (section.4.8) >> -endobj -80 0 obj -(\376\377\0004\000.\0008\000\040\004\037\004\100\004\065\004\064\004\101\004\102\004\060\004\062\004\073\004\065\004\075\004\070\004\117\000\040\004\070\000\040\004\075\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\070) -endobj -81 0 obj -<< /S /GoTo /D (subsection.4.8.1) >> -endobj -84 0 obj -(\376\377\0004\000.\0008\000.\0001\000\040\004\037\004\100\004\065\004\064\004\101\004\102\004\060\004\062\004\073\004\065\004\075\004\070\004\117) -endobj -85 0 obj -<< /S /GoTo /D (subsection.4.8.2) >> -endobj -88 0 obj -(\376\377\0004\000.\0008\000.\0002\000\040\004\037\004\076\004\073\004\114\004\067\004\076\004\062\004\060\004\102\004\065\004\073\004\114\004\101\004\072\004\070\004\065\000\040\004\075\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\070) -endobj -89 0 obj -<< /S /GoTo /D (chapter.5) >> -endobj -92 0 obj -(\376\377\0005\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\004\074\004\076\004\064\004\103\004\073\004\065\004\071) -endobj -93 0 obj -<< /S /GoTo /D (section.5.1) >> -endobj -96 0 obj -(\376\377\0005\000.\0001\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\004\074\004\076\004\064\004\103\004\073\004\117\000\040\000s\000u\000r\000b\000l) -endobj -97 0 obj -<< /S /GoTo /D (section.5.2) >> -endobj -100 0 obj -(\376\377\0005\000.\0002\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\004\074\004\076\004\064\004\103\004\073\004\117\000\040\000r\000e\000g\000e\000x\000p) -endobj -101 0 obj -<< /S /GoTo /D (section.5.3) >> -endobj -104 0 obj -(\376\377\0005\000.\0003\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\004\074\004\076\004\064\004\103\004\073\004\117\000\040\000s\000p\000f) -endobj -105 0 obj -<< /S /GoTo /D (chapter.6) >> -endobj -108 0 obj -(\376\377\0006\000\040\000C\004\102\004\060\004\102\004\070\004\101\004\102\004\070\004\107\004\065\004\101\004\072\004\070\004\065\000\040\004\060\004\073\004\063\004\076\004\100\004\070\004\102\004\074\004\113) -endobj -109 0 obj -<< /S /GoTo /D (section.6.1) >> -endobj -112 0 obj -(\376\377\0006\000.\0001\000\040\000W\000i\000n\000n\000o\000w\000\040\004\070\000\040\000O\000S\000B) -endobj -113 0 obj -<< /S /GoTo /D (chapter.7) >> -endobj -116 0 obj -(\376\377\0007\000\040\004\037\004\100\004\076\004\102\004\076\004\072\004\076\004\073\000\040\000r\000s\000p\000a\000m\000c) -endobj -117 0 obj -<< /S /GoTo /D (chapter.8) >> -endobj -120 0 obj -(\376\377\0008\000\040\004\032\004\073\004\070\004\065\004\075\004\102\000\040\000r\000s\000p\000a\000m\000c) -endobj -121 0 obj -<< /S /GoTo /D (chapter.9) >> -endobj -124 0 obj -(\376\377\0009\000\040\000L\000U\000A\000\040\000A\000P\000I\000\040\004\077\004\073\004\060\004\063\004\070\004\075\004\076\004\062) -endobj -125 0 obj -<< /S /GoTo /D (section.9.1) >> -endobj -128 0 obj -(\376\377\0009\000.\0001\000\040\004\035\004\060\004\101\004\102\004\100\004\076\004\071\004\072\004\060\000\040\000l\000u\000a\000\040\004\074\004\076\004\064\004\103\004\073\004\117) -endobj -129 0 obj -<< /S /GoTo /D (section.9.2) >> -endobj -132 0 obj -(\376\377\0009\000.\0002\000\040\004\036\004\061\004\100\004\060\004\061\004\076\004\102\004\107\004\070\004\072\000\040\004\077\004\100\004\060\004\062\004\070\004\073\004\060) -endobj -133 0 obj -<< /S /GoTo /D (section.9.3) >> -endobj -136 0 obj -(\376\377\0009\000.\0003\000\040\004\030\004\101\004\077\004\076\004\073\004\114\004\067\004\076\004\062\004\060\004\075\004\070\004\065\000\040\000D\000N\000S) -endobj -137 0 obj -<< /S /GoTo /D (section.9.4) >> -endobj -140 0 obj -(\376\377\0009\000.\0004\000\040\004\030\004\101\004\077\004\076\004\073\004\114\004\067\004\076\004\062\004\060\004\075\004\070\004\065\000\040\004\104\004\060\004\071\004\073\004\076\004\062\000-\004\101\004\077\004\070\004\101\004\072\004\076\004\062) -endobj -141 0 obj -<< /S /GoTo /D (chapter.10) >> -endobj -144 0 obj -(\376\377\0001\0000\000\040\000P\000e\000r\000l\000\040\000A\000P\000I\000\040\000r\000s\000p\000a\000m\000d) -endobj -145 0 obj -<< /S /GoTo /D (chapter.11) >> -endobj -148 0 obj -(\376\377\0001\0001\000\040\004\030\004\101\004\077\004\076\004\073\004\114\004\067\004\076\004\062\004\060\004\075\004\070\004\065\000\040\000H\000T\000T\000P\000\040\000R\000e\000d\000i\000r\000e\000c\000t\000o\000r) -endobj -149 0 obj -<< /S /GoTo /D (chapter.12) >> -endobj -152 0 obj -(\376\377\0001\0002\000\040\004\045\004\100\004\060\004\075\004\070\004\073\004\070\004\111\004\065\000\040\004\075\004\065\004\107\004\065\004\102\004\072\004\070\004\105\000\040\004\105\004\065\004\110\004\065\004\071) -endobj -153 0 obj -<< /S /GoTo /D (chapter.13) >> -endobj -156 0 obj -(\376\377\0001\0003\000\040\000C\000G\000I\000\040\004\070\004\075\004\102\004\065\004\100\004\104\004\065\004\071\004\101\000\040\000r\000s\000p\000a\000m\000d) -endobj -157 0 obj -<< /S /GoTo /D [158 0 R /Fit ] >> -endobj -160 0 obj << -/Length 234 -/Filter /FlateDecode ->> -stream -xuQ=kAWX|lROM8*p$)y x0Ea+RR{qӚ\R
fUȧٙmGz -N_bX=(iLwfzgmͯX9QHbp[q;!i.p+ev:^{۴6:]6IE2 -= d' -endstream -endobj -158 0 obj << -/Type /Page -/Contents 160 0 R -/Resources 159 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 165 0 R ->> endobj -161 0 obj << -/D [158 0 R /XYZ 124.802 735.021 null] ->> endobj -162 0 obj << -/D [158 0 R /XYZ 124.802 717.021 null] ->> endobj -159 0 obj << -/Font << /F19 163 0 R /F20 164 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -200 0 obj << -/Length 1221 -/Filter /FlateDecode ->> -stream -xZM6Q:X%g隢
K@&YhEˏ!EK:}XHkQJ5j^)9}=Lf|PpM{`-s@έ;?~pUē^{;ЌH@ތjv{&tJv=6 -wto(neLy?V<OxxCH0_$7;݉G^ҿ~Z^0LFC?Ψ|8ਡ5GC6hp?Z+g -X(!O@Tsp @B@ e`旯IפGLb<\2Vs S.DKHUZiW =s\g1uf]sո -endstream -endobj -199 0 obj << -/Type /Page -/Contents 200 0 R -/Resources 198 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 165 0 R -/Annots [ 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R ] ->> endobj -166 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 562.658 351.142 573.781] -/Subtype /Link -/A << /S /GoTo /D (chapter.1) >> ->> endobj -167 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 540.742 225.81 551.865] -/Subtype /Link -/A << /S /GoTo /D (chapter.2) >> ->> endobj -168 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 528.787 215.163 539.91] -/Subtype /Link -/A << /S /GoTo /D (section.2.1) >> ->> endobj -169 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 518.769 208.081 527.678] -/Subtype /Link -/A << /S /GoTo /D (section.2.2) >> ->> endobj -170 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 504.877 193.279 515.723] -/Subtype /Link -/A << /S /GoTo /D (section.2.3) >> ->> endobj -171 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 482.962 263 494.084] -/Subtype /Link -/A << /S /GoTo /D (chapter.3) >> ->> endobj -172 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 471.006 351.314 482.129] -/Subtype /Link -/A << /S /GoTo /D (section.3.1) >> ->> endobj -173 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 459.051 293.144 470.174] -/Subtype /Link -/A << /S /GoTo /D (section.3.2) >> ->> endobj -174 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 437.136 227.082 448.259] -/Subtype /Link -/A << /S /GoTo /D (chapter.4) >> ->> endobj -175 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 425.181 280.015 436.303] -/Subtype /Link -/A << /S /GoTo /D (section.4.1) >> ->> endobj -176 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [161.655 413.226 289.713 424.072] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.1.1) >> ->> endobj -177 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 401.27 310.034 412.393] -/Subtype /Link -/A << /S /GoTo /D (section.4.2) >> ->> endobj -178 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 389.315 256.305 400.161] -/Subtype /Link -/A << /S /GoTo /D (section.4.3) >> ->> endobj -179 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 377.36 286.337 388.206] -/Subtype /Link -/A << /S /GoTo /D (section.4.4) >> ->> endobj -180 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 365.405 249.748 376.251] -/Subtype /Link -/A << /S /GoTo /D (section.4.5) >> ->> endobj -181 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 353.45 288.468 364.572] -/Subtype /Link -/A << /S /GoTo /D (section.4.6) >> ->> endobj -182 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [161.655 341.495 361.509 352.341] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.6.1) >> ->> endobj -183 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 329.539 326.427 340.662] -/Subtype /Link -/A << /S /GoTo /D (section.4.7) >> ->> endobj -184 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 317.584 286.005 328.43] -/Subtype /Link -/A << /S /GoTo /D (section.4.8) >> ->> endobj -185 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [161.655 305.629 261.257 316.475] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.8.1) >> ->> endobj -186 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [161.655 293.674 322.499 304.52] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.8.2) >> ->> endobj -187 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 271.759 234.378 282.605] -/Subtype /Link -/A << /S /GoTo /D (chapter.5) >> ->> endobj -188 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 259.803 266.901 270.926] -/Subtype /Link -/A << /S /GoTo /D (section.5.1) >> ->> endobj -189 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 247.848 273.984 258.694] -/Subtype /Link -/A << /S /GoTo /D (section.5.2) >> ->> endobj -190 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 235.893 259.016 247.016] -/Subtype /Link -/A << /S /GoTo /D (section.5.3) >> ->> endobj -191 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 213.978 272.172 224.824] -/Subtype /Link -/A << /S /GoTo /D (chapter.6) >> ->> endobj -192 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 203.959 228.734 212.869] -/Subtype /Link -/A << /S /GoTo /D (section.6.1) >> ->> endobj -193 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 180.107 222.061 190.953] -/Subtype /Link -/A << /S /GoTo /D (chapter.7) >> ->> endobj -194 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 158.192 211.63 169.038] -/Subtype /Link -/A << /S /GoTo /D (chapter.8) >> ->> endobj -202 0 obj << -/D [199 0 R /XYZ 124.802 587.506 null] ->> endobj -198 0 obj << -/Font << /F31 201 0 R /F32 203 0 R /F18 204 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -213 0 obj << -/Length 622 -/Filter /FlateDecode ->> -stream -xVKo1{Xc{8GK+JP*D@ -&_8xGg&i3xu7:n8DhN-s MNVN2khDɦ#gX/Y{j%J6!9O -a( }m -endstream -endobj -212 0 obj << -/Type /Page -/Contents 213 0 R -/Resources 211 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 165 0 R -/Annots [ 195 0 R 196 0 R 197 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R ] ->> endobj -195 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 706.062 229.564 714.971] -/Subtype /Link -/A << /S /GoTo /D (chapter.9) >> ->> endobj -196 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 692.17 259.32 703.292] -/Subtype /Link -/A << /S /GoTo /D (section.9.1) >> ->> endobj -197 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 680.215 254.575 691.337] -/Subtype /Link -/A << /S /GoTo /D (section.9.2) >> ->> endobj -205 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 670.196 252.168 679.105] -/Subtype /Link -/A << /S /GoTo /D (section.9.3) >> ->> endobj -206 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.746 656.304 302.218 667.427] -/Subtype /Link -/A << /S /GoTo /D (section.9.4) >> ->> endobj -207 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 634.389 216.569 645.512] -/Subtype /Link -/A << /S /GoTo /D (chapter.10) >> ->> endobj -208 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 614.41 296.477 623.596] -/Subtype /Link -/A << /S /GoTo /D (chapter.11) >> ->> endobj -209 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 590.558 275.063 601.404] -/Subtype /Link -/A << /S /GoTo /D (chapter.12) >> ->> endobj -210 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.806 568.643 249.742 579.765] -/Subtype /Link -/A << /S /GoTo /D (chapter.13) >> ->> endobj -214 0 obj << -/D [212 0 R /XYZ 124.802 735.021 null] ->> endobj -211 0 obj << -/Font << /F33 215 0 R /F32 203 0 R /F18 204 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -219 0 obj << -/Length 2045 -/Filter /FlateDecode ->> -stream -xڥZIDWf&#b8pF8,@ Zcό@J4^
?n/=:!s)!?
>Pb88
oW<-9-G>4÷^~Xשz
4'e_UvuY=Gw˙,i^(<KDY -xǤ@Sչ"'!pe4~~[RO|K(htSN/F)%~2XIH,Rm(WR^Dq\T^
w>A:~xИdhq(HгlWBUJ'9gq L=I -I -!z~y3uV7%d}g=|0,K -b.&yf?nR#
dfqU
V Kˋ!2қ^#55}m19*j]ٛFwS9צc;(
WѬALPb.0j`]bz }ٗffRLu@ĢrJsYꇵkI#ci}[A"=N a2BEgX[wE`+Vz=cpUڭڪbp -n84ӥa -)*5I#=QntkkM{կW.H$WUYWE&ʶ!1(?QXl/?vD}n90+_7# a -@tHLo5e\F-TtEG%iʣ2)7Ujbp܁[8XUR`6ҷQbQWBLr
5w
Txu1Wrv(iE_nZ{=\5iu>2s.5.2+e]\v0n+Ѓ"] 9bF,v6wbao՜L6ph{kuťoln45:m1 -(N=({_Nh?[PbKs|߀euR5j@O$F9ӄ.mIS4'涗3]%j㍲Ҟ{)).A<_S.ߜr|l9n"I7)] . >k,66\D7e4)'sR힕bwT`kZ V-m30uMz D~<Q?(a(ݑDNT ]2
f{`i6 TΣH+LÓ|HH^)D'jSK]z -^YF*4$ok\ʵtX۾:Z ƱƘL`N7e"iW" -endstream -endobj -218 0 obj << -/Type /Page -/Contents 219 0 R -/Resources 217 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 165 0 R ->> endobj -220 0 obj << -/D [218 0 R /XYZ 124.802 735.021 null] ->> endobj -6 0 obj << -/D [218 0 R /XYZ 124.802 717.021 null] ->> endobj -217 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F18 204 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -230 0 obj << -/Length 1538 -/Filter /FlateDecode ->> -stream -xڵXKo7W,V@sc Т=%=(lÖ4y,J]t83|֕ޟhtz2jն6T畱^uVʹ:=>֟vopi=k\vo Th,]5Wq"źsm
,I -~m_K(bsƢx|kYtpʀ>&A7Yp|cLB;_om6j,uf+x\ -u袂tj]3mN@( -@dRTеp;N[: T"2E>_t2ڥrEs(hq /BRBrqIiOEPHM\lRbubTuځ=3(rNmBj)Iη8΄F]F3,"Ƈ -O~4IኽH.wYhM0]civ//V"B0R0MіXX$K1V~'=4xL(VI44^Rqs%m{S+&X[Q}cH] -V4
+ -=eNg-;mRmn29 -R/-̝x\S7u -(3]fR5|'4g7_n#-w"Aܣ4Y\ŭ|HhL'ې,mH¨XJLfuuNmd$(]r!z 6}[D4(.YXyl(bJԿ=QzurGK a0XTe$ -Nt -S~:) ((
kP)T -endstream -endobj -229 0 obj << -/Type /Page -/Contents 230 0 R -/Resources 228 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 165 0 R -/Annots [ 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R ] ->> endobj -222 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [185.706 479.731 264.89 491.684] -/Subtype/Link/A<</Type/Action/S/URI/URI(http://cmake.org/)>> ->> endobj -223 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [174.5 448.389 269.538 460.342] -/Subtype/Link/A<</Type/Action/S/URI/URI(http://ftp.gnome.org/pub/GNOME/sources/glib/2.20/)>> ->> endobj -224 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [186.263 405.091 278.645 417.044] -/Subtype/Link/A<</Type/Action/S/URI/URI(http://ftp.acc.umu.se/pub/GNOME/sources/gmime/2.2/)>> ->> endobj -225 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [168.994 361.794 257.53 373.747] -/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.lua.org/download.html)>> ->> endobj -226 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [188.83 318.496 372.598 330.449] -/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.monkey.org/~provos/libevent/)>> ->> endobj -227 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [200.567 227.307 321.39 239.26] -/Subtype/Link/A<</Type/Action/S/URI/URI(http://cebka.pp.ru/distfiles/)>> ->> endobj -231 0 obj << -/D [229 0 R /XYZ 124.802 735.021 null] ->> endobj -10 0 obj << -/D [229 0 R /XYZ 124.802 717.021 null] ->> endobj -14 0 obj << -/D [229 0 R /XYZ 124.802 537.915 null] ->> endobj -18 0 obj << -/D [229 0 R /XYZ 124.802 280.328 null] ->> endobj -228 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F38 232 0 R /F14 233 0 R /F18 204 0 R /F39 234 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -237 0 obj << -/Length 1357 -/Filter /FlateDecode ->> -stream -xڥXKo7WqhW$oM
P \RN -Ik'/3Ç 7CS/+n3nƎ2]i*t۫}oF.KpaiB|umfJ2 >5\ -9<c4zq'IYS,-LYKq"k9lW=$ -%C-eqcm73j`|cBJN\.v.=-2ŞRGW7MMWo<7170avȰ|-*! 1kТp -e!bT=®5YDT`kfg j|>d0D34:2 -p2uR'Lahj8ǜ -!'d$7:}Cnυ5;5Mu(nL҃)p -O-f;;#O}b٘M]vp=zĵ\44L,jWt$!YAJ,-:}Tv$[Jdh}Jt(`Z2#l߫x=oXVkr5*/ -endstream -endobj -236 0 obj << -/Type /Page -/Contents 237 0 R -/Resources 235 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 165 0 R ->> endobj -238 0 obj << -/D [236 0 R /XYZ 124.802 735.021 null] ->> endobj -22 0 obj << -/D [236 0 R /XYZ 124.802 653.209 null] ->> endobj -235 0 obj << -/Font << /F33 215 0 R /F18 204 0 R /F38 232 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -241 0 obj << -/Length 1154 -/Filter /FlateDecode ->> -stream -xXˎ4WdّH]e;axV,zwHAW0.?:I.b1]:uT9fy0÷Fy}3s: -:=O+_h( -Wa6L`vŅGc~;,g7xmFKc諷Ս.C|7<o"G==635yWF5i{+vȄ0)Ϋ -~ -0g-B -e)E=Ο\F]@xNs↵QN)b93㘣Ȭqqf89HPu2ul;xй@Lؑiդʐ+&3*NSEyCH,L8a5&oLV.YD -ZpeGѺRh0gLk]dQ}y[zf[$t1ٚs,U5e+ъSUVfх$hFu -&rۻiLAiY+S_1RxWz!}5Dx^AS-=^wG*-+.UP/ct}LݨuTx^&i9Eߡ -BIWě8]_D -'JG%b*|jb9`i,L\
)f`Bɪ7D{[Jq}6,ރ8GAVwj^[qi_nu"S#0"obEz2 -endstream -endobj -240 0 obj << -/Type /Page -/Contents 241 0 R -/Resources 239 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 259 0 R ->> endobj -242 0 obj << -/D [240 0 R /XYZ 124.802 735.021 null] ->> endobj -26 0 obj << -/D [240 0 R /XYZ 124.802 717.021 null] ->> endobj -30 0 obj << -/D [240 0 R /XYZ 124.802 501.334 null] ->> endobj -243 0 obj << -/D [240 0 R /XYZ 124.802 457.279 null] ->> endobj -244 0 obj << -/D [240 0 R /XYZ 124.802 436.8 null] ->> endobj -245 0 obj << -/D [240 0 R /XYZ 124.802 417.429 null] ->> endobj -246 0 obj << -/D [240 0 R /XYZ 124.802 397.503 null] ->> endobj -247 0 obj << -/D [240 0 R /XYZ 124.802 377.578 null] ->> endobj -248 0 obj << -/D [240 0 R /XYZ 124.802 357.653 null] ->> endobj -249 0 obj << -/D [240 0 R /XYZ 124.802 337.727 null] ->> endobj -250 0 obj << -/D [240 0 R /XYZ 124.802 317.802 null] ->> endobj -251 0 obj << -/D [240 0 R /XYZ 124.802 299.814 null] ->> endobj -252 0 obj << -/D [240 0 R /XYZ 124.802 277.952 null] ->> endobj -253 0 obj << -/D [240 0 R /XYZ 124.802 257.473 null] ->> endobj -254 0 obj << -/D [240 0 R /XYZ 124.802 238.101 null] ->> endobj -255 0 obj << -/D [240 0 R /XYZ 124.802 218.176 null] ->> endobj -256 0 obj << -/D [240 0 R /XYZ 124.802 198.25 null] ->> endobj -257 0 obj << -/D [240 0 R /XYZ 124.802 178.325 null] ->> endobj -258 0 obj << -/D [240 0 R /XYZ 124.802 158.4 null] ->> endobj -239 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F18 204 0 R /F38 232 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -262 0 obj << -/Length 2722 -/Filter /FlateDecode ->> -stream -xڵZKo7WmG7{rˮA6.7YH~z AVw,ֻ>3~{ٗ1κ0dOn>}L}k`=}}2->wU:)}X4-GSIarO*VMT'QL[O+Uد\t۫_"5JJW~2w7;3H?슠lW2$zU`g_&6y2qF<<dۍ 7Wsl!"eH -ٛZ3lkyfr9',D2bhyN -[Fn3YAz -qĵx587+kׂG_-nkN2$eiL,-e^Y\4kEDVuK.s^.+Q4vPr)ơB.3'2+-`Yi@D<Tf4+7r}+
=.;nmwaQE1Z{oqOk'Ȕ$50CFEaPo![%?1囆&<\)4BJ}Ý[DKZB1~P+n7홳p5U!V),EpuI+<u}8j1k1>GWJLS\p-SJ~i
hf[W!UxC(?,s*z?P02̆: bxva\ld8}hz/)pQ椨8f<+ yw$֙ڲF"Г9wrńK
?3>-Sl_Ͼ{w{ߨ;i- VSCˊ'8H[ÑT,S[^5Irgs٢]Ӂ[h `a7N[#a'H=֯N')0WY7+T07O]X0y# -o+2Shn'X^\[k -W5|3_!*+ey<9t==a4 -]BAV:' -GaZ0K.y9dKvIӮQ8Rbϡ(L[~bAm5lRjpEJ䘚&=6,_&P}Z_/Pv9C,9" --)rR&odx6̞C<1zȡ%'F-; -ZvK
0Sn_f'] $a.}%]^߇;ǜ)Y -6kGĠl7GADObm4Juf%d5K - - p?l<tpp8@
>34#Mn9;D1+ʁуOu]UoFQ7 -z?9vk-N?rylw -͖w2]Gr&VP-7Ƽw_p0xܕur^N -endstream -endobj -261 0 obj << -/Type /Page -/Contents 262 0 R -/Resources 260 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 259 0 R ->> endobj -263 0 obj << -/D [261 0 R /XYZ 124.802 735.021 null] ->> endobj -264 0 obj << -/D [261 0 R /XYZ 124.802 717.021 null] ->> endobj -34 0 obj << -/D [261 0 R /XYZ 124.802 390.063 null] ->> endobj -260 0 obj << -/Font << /F33 215 0 R /F18 204 0 R /F14 233 0 R /F38 232 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -267 0 obj << -/Length 2829 -/Filter /FlateDecode ->> -stream -xڵَ} -Gkyͫ?z^_^[(_/n;!9\К_M ϋYr=_f4ڳDJ. :tiI()\D>H5T̓ʖ[bͷOg8G?ɋg_²iCCʥmKqF_Dc[])xznSrZ7dR1f'jD"#EtnUx
rR
`:0}ۓ1sK"4#Z-VQ((YjWwQMCu#)}뗟p[PK% -nՏ|fM6[8Ȏ3mI?OX,_mtoG?cҕK@r7P[LgamF%E.ZdTzDX$m<6CDhî-C59[В -\UhJ:AXF,/TB0eCB3z#]Jbt!b?_Cv%-@75*V6
1"-km`_O l@ގ ܣ#WX
܀%^7E-hr.o3F\3$=ڥoSgB`$Nt"KmDhȟ.+@Db`Z*lXG'("^kGU-sAHD*w$FD]c.%p2Ebr{^"RzҸlʥ*qjP94B1m*Z O^ t)5,$b0zN#q6.osm"7T$wGA__5٫KkEyޔ26.ó!N?h*dm.'>@:TN+u܉f!rإ&yBsۖwVTًjRW^Ԧo9QM*by$wsYg h*c0 -(:)V5g֖^/65w -endstream -endobj -266 0 obj << -/Type /Page -/Contents 267 0 R -/Resources 265 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 259 0 R ->> endobj -268 0 obj << -/D [266 0 R /XYZ 124.802 735.021 null] ->> endobj -265 0 obj << -/Font << /F33 215 0 R /F18 204 0 R /F39 234 0 R /F14 233 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -271 0 obj << -/Length 1175 -/Filter /FlateDecode ->> -stream -xڝXKo6QX -ߔ[@nP a;m,;Ù!)V79+S7OoÛΩeZYY[<EA}dcθ<jx&X8:j.j\w\QK$#w`$lܱQ[]aChTY0#zr(Ӈû -fV"wuP -~`R-R] -%ovk<'v$gPz9ӥׅrӜ]{uKu\˵0l#'8LΫ{0Ps-S98\meșЍj⑮<Ţ; -endstream -endobj -270 0 obj << -/Type /Page -/Contents 271 0 R -/Resources 269 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 259 0 R ->> endobj -272 0 obj << -/D [270 0 R /XYZ 124.802 735.021 null] ->> endobj -269 0 obj << -/Font << /F33 215 0 R /F14 233 0 R /F18 204 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -275 0 obj << -/Length 1290 -/Filter /FlateDecode ->> -stream -xڭXoF~_!jr?yҊok1x qA$KA89"?ȏ<^TO/l..P_m>WڸSkZkjsU`.~Nԍ^{خ_揈KUN[AўA'{OMm n}p=\1lWiZa}Fֵ:]"`M!hjHO|LJDnwji
c-h#1ՄJ؞^GRx+*~A304o80Dkt"hrt+ #kLO_lvp/LH^~)9{o6ih?=[~]GD'>$)Fml1-O%RajHB`NmET{R7Vm1e:˚HN#`d'LE0c,ZMe -35o8bNB#(-z̸"AU5s}:^P<͢T&:Q/w/[,W"$,G)Zϭ6P&"$)T2RSCĬz5IYM|&|bqR?ŴT -,oK0ׯfX{}ix#\m^b<I0v/i,;i"StXcST> z +p<-s0\ڿƛ gI_x/kY'ԑ_7_z=psO;SDz^}CEtf`_4`,`8g -@&b̐KBeӁ45p@rJ#|$T6ʨ;g{?p0;>?(s(-LY'e?.O4:n,x2AՎT0)@-3wuc<ee.Cd|,OLx@;g ,J@[RB̴^: -&pxBԿ=Q,|ܢJ
`1tr'4|pUړptIQxS
n|S M
+aFh|iUջ>rafzMX#6a'zHB,[۟=1pG75Սe/Z^ͺe
MOJJU?s'ծaCeLo/cjdxzf{ؽU^NUΑV#_7-T -endstream -endobj -274 0 obj << -/Type /Page -/Contents 275 0 R -/Resources 273 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 259 0 R ->> endobj -276 0 obj << -/D [274 0 R /XYZ 124.802 735.021 null] ->> endobj -38 0 obj << -/D [274 0 R /XYZ 124.802 717.021 null] ->> endobj -42 0 obj << -/D [274 0 R /XYZ 124.802 537.915 null] ->> endobj -273 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F38 232 0 R /F18 204 0 R /F39 234 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -279 0 obj << -/Length 2207 -/Filter /FlateDecode ->> -stream -xڽYK7W4r -iSX%V愌Bv &20\hcgFӋ)AB> ³zȡйmӛqWxd-^|PS\O[&[BxE@T:7DtɂLYJX#9 4ng1?8fT1CxN .j5%$5093"brӘye -/u}ōsDh9b;ZM#Nk
(َu,BRgET]ƙ}bN*֬=Uy3t)!;)F{Nq"ݻtZ
iQFA"=UlNUcJg{ķ$ ^.|:ax)C8"ӷʪe9#Pngx9o7Ϙ,F~2Zqb$F;=-a/^)fM+Ɲq*\C1jэJ;=79ѕjU~z<m9p娐/=\ 2w$r9J*Fї_XU3(f4ŷԜq.]0XuibKdA4gYxNxUKs -Z.pñ,w]w1f,#fǻ;=vxB'[$uZrÒno}!l#s&,L$iL(%չ
P.t56j9T
/S%M~Ȣ4bf\E)Nc;$]0ܘ*0ö#T378tp:1wt0gUiXڹD Pv7EX_L]./z1֒?7c|_%-Dq}$Dz<Nj%^ r((g>i~frC3ag䑈˔hqq"xW+ht5&Y[Jx,%Sݜ7'* v^NI#DĘ "{N_aAϔepMZ!{9&5S_hW0?U3 -tH_ߤn<ݠ'ne,7_8v GqNkwkhjCCn-fؓD/ -=i.9lңz[qPRQ?\vgfK]Oυ+Nn ܰ%J; #1Azk.P2`0wP=BEEG<NT̡qCoo*:<ˌc=QjO> ^2푝RI?.%Q敲]k VA xfڒy $/5Ğ~}s:fH)Nrӑ`1'ϬbNla~ژ1_#>UL=lOL'+)C6YFJgc24u3Z\ŵYA
nJd>|0߃mo~[6v}%u5``uo7ד?( -endstream -endobj -278 0 obj << -/Type /Page -/Contents 279 0 R -/Resources 277 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 259 0 R ->> endobj -280 0 obj << -/D [278 0 R /XYZ 124.802 735.021 null] ->> endobj -46 0 obj << -/D [278 0 R /XYZ 124.802 717.021 null] ->> endobj -50 0 obj << -/D [278 0 R /XYZ 124.802 453.57 null] ->> endobj -277 0 obj << -/Font << /F33 215 0 R /F40 281 0 R /F18 204 0 R /F14 233 0 R /F39 234 0 R /F38 232 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -284 0 obj << -/Length 1508 -/Filter /FlateDecode ->> -stream -xڽXKoFW>IAH{I=hR @- -Ykò2'rIAz D33ɲ26e22M3.TQ2YYl2>U!QnHOb'pw w{mk1vGi[Sw)89>SbW*)R A)rXsᅫL>O_2~f׃_X6w/?fU{L*YXkWfhlt圫ReOaL=J,28С`J@ @ҷ<0B)h3gp@ϒWy
Y9px6Q -ާەJ%=T=Ec}j<4gܶY@;^x
a=ꓓZ`H'UauG}px*2hnT:Zɝ2JݖA`X -Bo:)8fO5..UW(@CёF,<Cjjڑ-+._ts1ެƝ|NR[RCa^QSE(ܳ+06il -G.|&sA:luaJ2o武7
=~ _<E=eAmIlhqiJ#4D~ڣ8%R#3t#3h~PԖ`dAY<~ҝ9;kS4OfH۲mc̶B%KA!Eqyg2Sq_
_05 Qs(mв"OP,bG0bXNCJEt^OooA [ǻJsv O?\
hB6; -:'s9X-NX|
O)VW7Wa*ᏭB,mw6]=6 -3/pyS˯hB@.z}RrRn^e1?=S:bƗZa*+L0r`y?F7 -endstream -endobj -283 0 obj << -/Type /Page -/Contents 284 0 R -/Resources 282 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 286 0 R ->> endobj -285 0 obj << -/D [283 0 R /XYZ 124.802 735.021 null] ->> endobj -54 0 obj << -/D [283 0 R /XYZ 124.802 717.021 null] ->> endobj -282 0 obj << -/Font << /F33 215 0 R /F38 232 0 R /F18 204 0 R /F14 233 0 R /F32 203 0 R /F39 234 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -289 0 obj << -/Length 1359 -/Filter /FlateDecode ->> -stream -xڵXKo8W9@EMZ4 Zu1Ij-_Rg87!i6hvy3τJRjuƸ$dI+$\kݽL] -I/fE{ΔvT0#H)3*)øu -!8 STP.sМ/ߠǷaGYh훳l|N>DEM]fB -b./ZȘ$w^CBUh:Ziퟱ"$Y9a"آ-Q@]yܪݍ?CtzuV^so28Җ;, -,tQ=$T(3)Knvvu|5&QhA/ FisFSy)эv4~TCVtCʙ"mX?m86|6?matI<b\\%sjXUzeiV2S˃;kEV}9%,[fbkhfhPlX\9 ҳ+e-Gʷoq>+_.aMp@UzYXba=#g»Og`7*Φ`׳U/&k>;2g`mGnீD:v^mLcP?: C> `g=2TQKxV -h1 !nP<+-6` tؾ@hgaE;Z~6JaӌI7W)O2'8 -BgSbn#d9tѨGڊ -nՒ5oO
V&ۦDhQӐzѫ_ A8&ťIpϱ}f:%]֖vMGU{^ԋԸqZ_.v|lb:*n{UH|HƦ*tT7+E-_Vh'ڔ)dzsqͨhj|5\Ƿ@͵s+͓҃'ؘb8!^y]xʋ,0 -<P킊}de_j&N}Th^)݊5ZrƓBr:b!M}SFd#79xw`Qײz6T[Npj -endstream -endobj -288 0 obj << -/Type /Page -/Contents 289 0 R -/Resources 287 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 286 0 R ->> endobj -290 0 obj << -/D [288 0 R /XYZ 124.802 735.021 null] ->> endobj -58 0 obj << -/D [288 0 R /XYZ 124.802 717.021 null] ->> endobj -62 0 obj << -/D [288 0 R /XYZ 124.802 246.417 null] ->> endobj -287 0 obj << -/Font << /F33 215 0 R /F38 232 0 R /F18 204 0 R /F14 233 0 R /F32 203 0 R /F39 234 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -293 0 obj << -/Length 1737 -/Filter /FlateDecode ->> -stream -xXKoFW>QI{=hR4@G"+=I%ڴz(rgfggy-),HNjE[}A -͛Z]\\oJQz\)KN%+j~ϼK6fs^/KexZ$D잴5˄'7F5ecLW㊖Q>yӋѧ5!MLa[R\ywtUpkM-x5}D}Ow[&mlv~}Y7L?؇(Hw3*ˋњ'Pi`!@<>̯. KhyYهNƴL~֣ -HNL1xĒJ-DF<5SffELR -_D-m5ja.Avw3]]WXgxZ'Irg[FC+٪aeG-2<|n-.&9YŬvIò ʤdvCN<Cc5sN` -DmR"<y͔ -7ef`mGk!FMVSXDMJb <lϝgl -oR4#7"voB<e8KE%y甊 -M{_寯ɋo\\o$ -&89yw&Oh2jrm/vDR0e%|Z$8Z&,}2^~b(-64
L -endstream -endobj -292 0 obj << -/Type /Page -/Contents 293 0 R -/Resources 291 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 286 0 R ->> endobj -294 0 obj << -/D [292 0 R /XYZ 124.802 735.021 null] ->> endobj -66 0 obj << -/D [292 0 R /XYZ 124.802 523.324 null] ->> endobj -291 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F14 233 0 R /F18 204 0 R /F38 232 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -297 0 obj << -/Length 1553 -/Filter /FlateDecode ->> -stream -xڭX[oG~Xi-e7s]>PJBiCXqoh̜9sYƗ>Xwܾs_R}HNjSΫS2vUw"^עUQJK.%W|R/ٔڞOymO(-[jrʤ9&|9v`(DU#SZOZv~|ɓj!M0ߌVVoHumW}Wݻjj >[&}n -LReӊZg(Sl`}x.@ XrV -Q҆R@bzBv -"pu(n'َl~8CM}x-sAO4_M9AB>9s߈f2ʎI%mI
P2W%-d"NC:h,AƞGaY%. -$`SSBV/͂̇cऄy - -"2Կ7H9R4qpCBw+ǝN0x51CICCbB[ڀ>`BU:AR3NzAMwƥc )f~1A"멝Tsγ~qs?:-ywX,F1H\5ay8:-&0/Rtqjq6_VWe.//^-,0ʪΆ9ɰ=曡٪L1vR˟9n, -*jۊC@NSg
y0l/,vߋ\gw-#7wah:˖ۮS(er-q1ܖqIߑ%Vv섿0PUV=Tgvc[xAT'B-F|2\Wix"Sәݏ,(dc -2v'X&ZgT5-"pk5&7d5GI
t<DC wR#oiyp;|1:( -)W5w HA]4\aSSPav%xCJꕅb߶m r!.*D}jqQj\QfI_w0idLxéH\L<M -endstream -endobj -296 0 obj << -/Type /Page -/Contents 297 0 R -/Resources 295 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 286 0 R ->> endobj -298 0 obj << -/D [296 0 R /XYZ 124.802 735.021 null] ->> endobj -70 0 obj << -/D [296 0 R /XYZ 124.802 260.486 null] ->> endobj -295 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F14 233 0 R /F18 204 0 R /F40 281 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -301 0 obj << -/Length 2552 -/Filter /FlateDecode ->> -stream -xڭr_1ŋgio:,ю\EKs\,ZRe%">@cC.;Eoۍ;\wxIeIitw7/s+-+m+d օOmV>ZV |t>6ۄukaga3"5qJMR0U$- &~,S_./O.m=9?lAbLB[/Mxc'F?N=zoQ}nv? -;xzw8ۻwnnlD7Gߝ -D7Iݻo~v+||{d;^҆ɹ{91 ̝Өv -H<A~=z(NDEH)523j24deRú(9hP<cn>)|{$=͕MpJr3ii$AՠMV -X`RkדdKFbQک>2zfb |\2
}b}m7CuSh1'+Ṷ{F'=F-1gqY-伈BM,IX!-HpIY^iO[:VE+~7m"TkN]L>xq; -hM,, -)p {~`3Uut,jtr\\;Kk<AI섣2l$Ml8c˖SiWW]\%9c&/~ӫhFO_jbmst}r|W#ֳcGq..哈sþ>kj~~xWO~>8LQS8DQ֭N{c;;*MUzk
9YOra^".tI^2>CY0@i7uʾleѬaSQn>/2S*r+4<i(Ji^/z`
(KUc!aUb+WEo|ͷ.Fq=%<.Uo'(A|z-V-nSkb˳?ӮyNFs|-&E"CpeWY'kzV+Y`֭&Q?UYStVg JclJύ-u5y=D1''ґׁBEʯKQY](`o) -RSXޓ($3%yik%%Ce/p^gNJ#cCk8HE!<~H}M}J-ɕYӲf_u fYi(7=ޕitSgJ`""O˵G{fJx7r%]D_g%+i\ -FX+I738(d'
-<RG8:/Oi\Hi[35Rx5Rx+@(7ad/U=P${l2m@o/tzd3EX -endstream -endobj -300 0 obj << -/Type /Page -/Contents 301 0 R -/Resources 299 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 286 0 R ->> endobj -302 0 obj << -/D [300 0 R /XYZ 124.802 735.021 null] ->> endobj -74 0 obj << -/D [300 0 R /XYZ 124.802 423.274 null] ->> endobj -299 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F18 204 0 R /F38 232 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -305 0 obj << -/Length 2097 -/Filter /FlateDecode ->> -stream -xڭYYo7~ׯA!֊7wh&ENc*r%93<V,Aΐbw칔U[FB
Mmήwc7TOƘ\v.v~ssZ3?nTJ5/9g^z}ڸH&cr҄)2PT uY:'D9~{kg/GFU<}^].F=|YZM).*dmx[1D
(9ʪ-k+lt(r~y7j_Ssd:n;pZs) -kTsJM)cZSJ1M&,b%k<кcr^ZD$)kp4j=&&@VuEЂ?8R$L> -0 -[M1
%txx2'aJs`FCwu2bRXt8Ilj0QNed1=Au$?$ -;TDwM>sް'!vS^'b\אUT)-SZ78oNN_=O'x3}N)?qu0.`1 t>b,,*ָRzĻJC8T%iű"iMO,AřbñH/\b@+̪<9 -I/:֨1ڌSl}Y[)Rb%ކS&Kcդf`8RDhD%xݬ'Pv)U#,#3$H wiRxGrUŁc7r
_0I²g(= -vYxtEcV*C%` -v7KaQu/a(4hS#em%@CuQeƻbq*UO!naCbk:N;T4Qf>&2;/C߰]T.O#1#yY#*Q~eJP^RO#-aHnDw_9 -B!2Dִ!ΖShÏktf:a?mGfjTG"tqZt7̴0 oVc)ca2Ƕ6qՄT)Ը`(Yɦ\6pB2%1(,鴱8sjҗ?`l/tOUBGߋ@>(fB3bz:S@( -[@I*v=";L@f/,nmZK4d"`6TXn/{'uhL!VC불Sxџ2[̀(~nVw5%JpNc1m_iZEbkMa}\i~hhSrq}9\\/GwQZ6+__:f~{d6.//ng3g7a|M0vW?߯bǀIgUhϗnۮCUDɅ^Y8f
H;l[m{,T,]WH>^v]2ouԺpD= Ho³ -Ϗ=lxu~h@Vi(p(rWxȃoK77Ep-GSk)LZ0㶘l{/( -endstream -endobj -304 0 obj << -/Type /Page -/Contents 305 0 R -/Resources 303 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 286 0 R ->> endobj -306 0 obj << -/D [304 0 R /XYZ 124.802 735.021 null] ->> endobj -78 0 obj << -/D [304 0 R /XYZ 124.802 473.439 null] ->> endobj -82 0 obj << -/D [304 0 R /XYZ 124.802 442.542 null] ->> endobj -303 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F18 204 0 R /F38 232 0 R /F40 281 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -309 0 obj << -/Length 2312 -/Filter /FlateDecode ->> -stream -xY[
~ׯX}Xge$.4@k<٩q*˱SInsӮ"%y냠C~а揳/f˗R6~ei>4\~`r
M>ӾܾJr{ܿ0}vIZdcz~ڸ{(cr>)2-Ts"ϹZ(W~ル}u7nj;g -p7yiX/WC@k~CzCUe{hVLON}>l/OüaXnNt{Oﶏ>;rv+ӻb6ǒ -`H2[aMR{f{YCu\w:0ֻHS.yxuy>sUZ:A 22O -ƽOig'i'|3F{?Ջ1@B @[ٶ6%&ل8)\3#ST*%ڴ 7iv&rd /=s"R?/T8G_4Iż(=m-ލ#&Z̪֒RtS2zF"Olsk \7=E.4˖MTpxUX-L6NSȜV[R 1[36(|v⊡Jyc\h%[C(H&f`Pih1G~9 -ѲD
KxTy>OsY[nOzLG26cat!C,f{R1o)^ewJQW,:*+UjA^_wQYs@9* -]v6Lqv|"MLuq?-4dAoTE\E&,byE(Y 9qMc}I\^ʴDv.W=yv۽EYE\ -XY:Sm='n ?SIm/&Ac{뼵;ons:lGJCH.A1t,{QD/-<xsxST#Q%In"H&Gu -Ʊ7SF? -endstream -endobj -308 0 obj << -/Type /Page -/Contents 309 0 R -/Resources 307 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 315 0 R ->> endobj -310 0 obj << -/D [308 0 R /XYZ 124.802 735.021 null] ->> endobj -86 0 obj << -/D [308 0 R /XYZ 124.802 556.022 null] ->> endobj -311 0 obj << -/D [308 0 R /XYZ 124.802 460.225 null] ->> endobj -312 0 obj << -/D [308 0 R /XYZ 124.802 429.236 null] ->> endobj -313 0 obj << -/D [308 0 R /XYZ 124.802 397.694 null] ->> endobj -314 0 obj << -/D [308 0 R /XYZ 124.802 378.107 null] ->> endobj -307 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F18 204 0 R /F40 281 0 R /F14 233 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -318 0 obj << -/Length 876 -/Filter /FlateDecode ->> -stream -xڥVn1}WXw -@6}MU\(@BΌl-=3x{;j*^9h2y]r'<y"/sXK?NKQմgBk -g:=OXg|4]_a4}<G}U hWQ'd -m; - wbb"j1%R8ftzØƷN)A"߸`$Gou(٥ZiP=Ȃ -ym=uJZ*X7TI=φfU#٪\]M6 -bVϷ&ޡz6/&7m6W7 tu8<<=; -$ɰwʴ66?2h[fɡA)LԂhtR;Bµ"r?-#/eԖdu5jZK, -endstream -endobj -317 0 obj << -/Type /Page -/Contents 318 0 R -/Resources 316 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 315 0 R ->> endobj -319 0 obj << -/D [317 0 R /XYZ 124.802 735.021 null] ->> endobj -316 0 obj << -/Font << /F33 215 0 R /F14 233 0 R /F18 204 0 R /F39 234 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -323 0 obj << -/Length 1348 -/Filter /FlateDecode ->> -stream -xڝWmkF_!i$kߥ
4oGJC?Jcb'{WJ{wvgvWIgfy[Ǭ̾?*z>?}'tBk]Ƹ,gZB*/_'D)ueJ|>ꉚ6kXfMe`Y.bPҚ?{gŧBb-AjﵘjM6(BUd!Tk*U2YD'%7jw[.j͵cQYy {D^EDQNs)*DtPxc0 )AeS{3Y/w8GHRd'AVy6@v`N]&oOe9qXQ+EEa+f
Ti6ZL0zL:%?BVM9z+k4i -VR `n\3v9n> 똟H5 `rȞ3^Nv(\Ze'8rw#j,#D*ȠV61TN4̧_{; $i;CEc'C{߯(T@;c
~*A&p~*ŊS
---ڰ`$ŬYAxr^%E[t$`s49Hy4#3E1촸*$D=F2ZTU*8#uKY28Jl+]t:}StMll>[^CN|~e]=nu@YJXjm߂pl:iqS7˥i,Ǧ]NlqkgLakJ8!)hq[#+Ǯ2_ `L/w0NatR4:^/io!v(6|y Q><ADQ}
`UȊk3cYV_/acވfV6^ۏۏތ# xGh:FQznXu7zw}Ñ}_.8p>λ8O/tnAbC@?;PlXdIMmW}ݍMg0iltOq
!OgL7;xM:C]ӽ}J鰻LNԹ$v~P0.$)TQtL -#1<~C۰azُjCvmn6lS,_v'C5Q, irCJ= sGm8Wr3"-РDak֫gPys{rތoz災z+,ق=oG -endstream -endobj -322 0 obj << -/Type /Page -/Contents 323 0 R -/Resources 321 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 315 0 R ->> endobj -324 0 obj << -/D [322 0 R /XYZ 124.802 735.021 null] ->> endobj -90 0 obj << -/D [322 0 R /XYZ 124.802 717.021 null] ->> endobj -94 0 obj << -/D [322 0 R /XYZ 124.802 537.915 null] ->> endobj -321 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F38 232 0 R /F18 204 0 R /F39 234 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -328 0 obj << -/Length 2461 -/Filter /FlateDecode ->> -stream -xڵZob]wPn4)R[AFcT' C3pw:+Ճ\r83\X<fmܴVfv=OfZ!;;;t3/!woV&.hM_WfG`W>Sv5gz]n\Vv7s3VP+x<#O[jW.tRPJz=xx.ǯ5zSu^^/PRzӴkt#,I -I|FAXOPfYx?
9uj_ykK.gP,ΎxJG˒bb`y_|Qؕ/8-FH/6gu>(O -(i.q!9kWxg' -TW
]݄FRYPp^@-F\m"q -a/D*3fW8F
L gUUɈfW[jܠtw(34ʌB4AG[UWkI_>`Zf
T'bL~]_6K"u`- -3YK*=<߈Ǎ*!9M8f*f{v[%Z45嗍DL=[o<_%9vc_2;Y9(g9O$1 -ӜpEj(␑Qݨ)EEɄYUӋmix[p*)4#])λd0@ ne1PicԠl92JCs,S#Da4roF*#J+Dr*G噲u$`߳s4ݱY]9'nc~=/M0@ZMI&DəQZkz0Ŝ4kw7F[=i03ixx -3Yn|k-5cW=WX`:Z-+Y&~bmk4'B^XJofm"Sz&B8]
RP 0P&v_S;b8]QB%WZ7/1C?9hb5BʠĂ*H&zg}798DŽ;`٧lp#HAy|'K:<wCKdA|8k+HZ8dlmcm1bn| "DiȐJ +/>/pDѪ0nex2#lGs(D~?Ǩw'9Q=W+VIc@j8ާɽj#\lSt8Ӏ[v]>X$NTOnIL -\q5z㳛|?cG
N2呜ўe /2k3|U G˃NViIS^LC7E}>/RfxFt˙ފL`T+u7".v[w8C -sDd*LeRӵb07Q ɍH1WPH?ްNJÚ}1#pGvWoaZ>\GmݚtVp@+I -:oցa%n|xuz0%q10PҾi BQ[FFXy{
{?ϗ{]NOv
\8+16r+4e;D56員Q6""F`XiV54Hg.'# -df>BHl˛z]i39}0DCao=rgD='&RXht8q+^r Vqt|?-<7`s6ldCd.JBۄzAݓOwelf3>_czmlHP&ŚNIڭXt -ձ//"D -endstream -endobj -327 0 obj << -/Type /Page -/Contents 328 0 R -/Resources 326 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 315 0 R -/Annots [ 320 0 R 325 0 R ] ->> endobj -320 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [205.353 643.796 368.977 655.748] -/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.surbl.org/lists.html#multi)>> ->> endobj -325 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [346.306 297.324 493.468 309.276] -/Subtype/Link/A<</Type/Action/S/URI/URI(http://perldoc.perl.org/perlre.html)>> ->> endobj -329 0 obj << -/D [327 0 R /XYZ 124.802 735.021 null] ->> endobj -98 0 obj << -/D [327 0 R /XYZ 124.802 582.031 null] ->> endobj -326 0 obj << -/Font << /F33 215 0 R /F18 204 0 R /F38 232 0 R /F14 233 0 R /F39 234 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -332 0 obj << -/Length 2481 -/Filter /FlateDecode ->> -stream -xZݏ_!(`ߔ%6Ed -䂅8kߗ̐C7
`Xp>~!}#-nulroTf xmcnf:ﴴﴓ/\[~ު8jʚ8R]|^ٸիVoUքB4]fFEmXU{Gqw/dh$JWy8.~U4aFlk$cx'~l~^\Ҳa;t8F~lZm"F{'xzSQ3NoZNRsF*aw\ -Q{ȕu8\OIEWg3IP, VZh9oe<x֡~^}:mwr DhF&:iתY.;M/Sf%,X.QϲQ!ktH-fXlrjS6Ͳ,$=y@/i<nk58&$2
-xeпfN3C~+ޮ3®CTPq*j+"CnĘ)1
)63k("`q -RRV4\tL`3Xd`7rB.?^OK|j(˭]ϳ̾gx6_)JF!I-aQTё>*f>O(~y,6J$/6P,1,U΅$li)3tu&MtdM1)%1B`ɂ/;Rd9 pKga8pf21C# -3
xd !x83],]xFScp{yZrd@s xRE=&9&lNs(4Pk^raΆ$'iހ8`mSŔ i*^j9<%ɼ5iW^6m<qb(+T EW7#b~/':0TO4NQŚ:~Y+Ii~0_;%&̢4rNeMd.yX3՛qZf@J%Bi"P=v
M
uUn*Gj^ӲgrS7#Mϔ a}MZrb9W%d_W1ĦG23~á_9jO=&JOcG3_cv:/v]Q6)5cT)lx]C`%s5Z0]`R]aą?0ԓI]ݫ%P-/mx@"=_JJ)#Ĥ:0)UV99+RU
eIVK -endstream -endobj -331 0 obj << -/Type /Page -/Contents 332 0 R -/Resources 330 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 315 0 R ->> endobj -333 0 obj << -/D [331 0 R /XYZ 124.802 735.021 null] ->> endobj -330 0 obj << -/Font << /F33 215 0 R /F18 204 0 R /F39 234 0 R /F14 233 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -336 0 obj << -/Length 2231 -/Filter /FlateDecode ->> -stream -xڵZmo#_A=s"-RnMzV -ݺmLi͵͚8:S]ޝ٨\ yl0FoBϺ4W%FXGwpl8krЈF2(S~Ï 4Ջ978{"^p͢bx[a;v]my0WVltΥl֎|xCS_}CHE^ګ3iغU7sK\֥?cs` -3ɘɐWʂiK ƅapx%}OnbΑG]P{۲֨bY7Nb>K' p< *b^#I\h@Yg*b
z<Z*~8>H9?H`0q`IyA[ -:W` ?-/' +A"`fat˯V*GZ)K:6Ki -FLV8]9FR 5!=Mq4fSnGW.'Cj#iJ'aŞ\p|oD~/9vQןO/Ώ\8xa03 -r:N8_wo-=UBAn08q 1WӣF.(KCtIKsmB|{E"`ǹT!K){}4)$jIpk^߫=jC;uhZ]E+Sy
ċl -YإZ=! Eҗ^v+qzj鲰z[SX/A1fT5du{zm$"F(5+8"-V~{qPD)ل]<6*-_x~>hcKGQ}ovT'T<d@IK2$E LWe=߾]G[AOS(zm62&P2a$|9j0y|㛖3@"M= 9tg$Fa]z.! -
0*ua84.o~Ԓć5Ug|Ϟ!*<^.էJ^Ht;6˓~y:
]LQxex1b1@}s〦ǁ/M$dk2~5i$å
RzNuS3;)#E~G#@K.=[>c2+BnCn[ -endstream -endobj -335 0 obj << -/Type /Page -/Contents 336 0 R -/Resources 334 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 315 0 R ->> endobj -337 0 obj << -/D [335 0 R /XYZ 124.802 735.021 null] ->> endobj -102 0 obj << -/D [335 0 R /XYZ 124.802 299.092 null] ->> endobj -334 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F14 233 0 R /F18 204 0 R /F38 232 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -340 0 obj << -/Length 669 -/Filter /FlateDecode ->> -stream -xڭUKAϯhip~Uwϊv%=l#(QULtH<xhzR]UWHIzưF4N;0R3opҳŚO@kdi,Kߠz1+ׁBkIs~VLI!!p6(>zV -L
[+a[?Hk&i{[f^aջJUa_酄ŜmQM7PhX(sN4Lt:(DSD`ƤQZ\vM%\M¤X)6خVQVݭwy
&t>hʋg"Bl3ܑL0[vvv@VpdmHtɶhWvqb4hOBĘf7wKW|1pr^p8:\R^rh] ԡ\&-8:s>>ԙ.GAt5 S(Vűryz~j*҈I3"&kP֜ i_A~LF:iEIlh,9N`=V/դS"Mii^-SkCZwh+सvNtJD#
w -endstream -endobj -339 0 obj << -/Type /Page -/Contents 340 0 R -/Resources 338 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 342 0 R ->> endobj -341 0 obj << -/D [339 0 R /XYZ 124.802 735.021 null] ->> endobj -338 0 obj << -/Font << /F33 215 0 R /F18 204 0 R /F39 234 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -345 0 obj << -/Length 1358 -/Filter /FlateDecode ->> -stream -xXOo%5S4Oqb'3=p($.{J(BH+(^;y3}*$Xē؎ywW7_4R -48@@70\p~v|>G=iQ)˘NͲ``<gY~pq3*Bed<;kkH"W47uDFQǫÇ3.b -eNI>za|D9'Ua0[RHND+8B~y_yf-S<<= -/534˅" h,pN"TD[sb\dl9;eR#439ˠ6_[p -Ca= -endstream -endobj -344 0 obj << -/Type /Page -/Contents 345 0 R -/Resources 343 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 342 0 R ->> endobj -346 0 obj << -/D [344 0 R /XYZ 124.802 735.021 null] ->> endobj -106 0 obj << -/D [344 0 R /XYZ 124.802 717.021 null] ->> endobj -110 0 obj << -/D [344 0 R /XYZ 124.802 508.027 null] ->> endobj -347 0 obj << -/D [344 0 R /XYZ 124.802 452.975 null] ->> endobj -348 0 obj << -/D [344 0 R /XYZ 124.802 454.912 null] ->> endobj -349 0 obj << -/D [344 0 R /XYZ 124.802 442.957 null] ->> endobj -350 0 obj << -/D [344 0 R /XYZ 124.802 431.002 null] ->> endobj -351 0 obj << -/D [344 0 R /XYZ 124.802 419.047 null] ->> endobj -352 0 obj << -/D [344 0 R /XYZ 124.802 407.091 null] ->> endobj -353 0 obj << -/D [344 0 R /XYZ 124.802 395.136 null] ->> endobj -354 0 obj << -/D [344 0 R /XYZ 124.802 383.181 null] ->> endobj -355 0 obj << -/D [344 0 R /XYZ 124.802 371.226 null] ->> endobj -356 0 obj << -/D [344 0 R /XYZ 124.802 359.271 null] ->> endobj -357 0 obj << -/D [344 0 R /XYZ 124.802 347.316 null] ->> endobj -358 0 obj << -/D [344 0 R /XYZ 124.802 335.36 null] ->> endobj -343 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F38 232 0 R /F18 204 0 R /F14 233 0 R /F39 234 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -361 0 obj << -/Length 2152 -/Filter /FlateDecode ->> -stream -xZKs7ﯘU-i6T. -Qƕ\D[ %w&CYqqX/%Ҭ 'ۣϏ-T4i*l/oEskD7}5^6~0szBps~\uh-f<\ҟmۨ[ -
$C@X,P6]v`
*o%ʯzAsʞ6s9ǂ -tYE
#h/ґin0tt0L2`fpD5ζd<ܖH*મut( -r,
2`P.l0(Vt;I!svhtцU4RΊJG]?] UҬv@ރFjrzMQݴ^=cXM.]Vȼ)DEM;<v/U*NQMMLi4!&VYi> ;=@鼆 N6r
F,9ѢEk˲qDnӲrR!/>,0>N2Ww!L4gٙiZXc6_\_!]_Ϯ)BKI]2z?,Yn¡ -zDi -wj<4WT=,7*zCflU%ԓāy/H,]̠Ӥ(9b9knޫXB٣4+1~--_C] E{~h
Gt}%c+R.r<*^av`:.}:9K紣8MՉ7JI9`s);r~JÖpo'uT"@cܭY|sGsT Al4nvZiOv+:;j S#k{;VN1j6*Uokك:%u*7U]*gVO(ĽN[^.;lP%&
;p!z]5a]/}Vm95ӷy7FhЧ/jߖkSOػ(rl849/^koaa#`|QX;z']}#<yJnGO|,"Xl -endstream -endobj -360 0 obj << -/Type /Page -/Contents 361 0 R -/Resources 359 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 342 0 R ->> endobj -362 0 obj << -/D [360 0 R /XYZ 124.802 735.021 null] ->> endobj -363 0 obj << -/D [360 0 R /XYZ 124.802 630.082 null] ->> endobj -364 0 obj << -/D [360 0 R /XYZ 124.802 598.099 null] ->> endobj -365 0 obj << -/D [360 0 R /XYZ 124.802 575.419 null] ->> endobj -366 0 obj << -/D [360 0 R /XYZ 124.802 559.376 null] ->> endobj -367 0 obj << -/D [360 0 R /XYZ 124.802 543.887 null] ->> endobj -368 0 obj << -/D [360 0 R /XYZ 124.802 505.041 null] ->> endobj -369 0 obj << -/D [360 0 R /XYZ 124.802 465.642 null] ->> endobj -370 0 obj << -/D [360 0 R /XYZ 124.802 422.483 null] ->> endobj -371 0 obj << -/D [360 0 R /XYZ 124.802 399.249 null] ->> endobj -372 0 obj << -/D [360 0 R /XYZ 124.802 383.207 null] ->> endobj -373 0 obj << -/D [360 0 R /XYZ 124.802 367.718 null] ->> endobj -374 0 obj << -/D [360 0 R /XYZ 124.802 328.318 null] ->> endobj -359 0 obj << -/Font << /F33 215 0 R /F18 204 0 R /F39 234 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -377 0 obj << -/Length 1529 -/Filter /FlateDecode ->> -stream -xXnFWvM&Ł`9,AF%6{z( Ӭ}y]%ճՓte]02tݻ%{߿ի׃a4'I|{0N^j8f7sb?H瓤sbSU9<stf+\I89T"=1_~^)TvZuWwew_vRy>%ҫ䊠"{~%pu, np?yp3sJ̊OXp&n^nק7è'v?W~ -_r\ zv+;.wp~?NE!]"6l4=l>%ƏgwQ(F<?F[Z7kl^j%nӳr'U`B=TQ
+J15$8=@PPy%G4%s7ųX!d-\,gl]*Da o"Be -&S-H)H_w3R -_f5hYVBe A:((H Q9%abw(yԾR҂u]/x\v6[b>C];\E5Ķ+u@o25,TXJoBczDuk3t}љ=FrVƜx+u}]b{OfR UQ#~)}\/:%3X_s"sBWx[+a% 3[6#LILn:L&f -LG]M4̤ *'_\x'.`0$$)場{;'XeZцpHMtҨdѣN^wKE+OPK]ZoLJxf -OA%y˜J\{ðǑ3!}ցx4. -yz0UHlT1='ⴎ
Oj-Q8[B*蒡1gTўۮ]GBm38חq%MuKw |]=6DG1ԗbdR
22Xf\ۈUjJ -,aK,g{tVϕVYn7)vf9Bɮ?(9v#46sm8C[k;b2m6&Ui1
vsv\[0, -K
@xU'`<ٛH<:ܫ2NSd\LUK# -\UhR`qɉ+24qvam&V'1vj}` S)υM5E2]sW\"=;`,ЄT^%X.:LAk2]Ύ.,8/S5oq)Wxf#b -I텵TA:4<ϏWrwo -endstream -endobj -376 0 obj << -/Type /Page -/Contents 377 0 R -/Resources 375 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 342 0 R ->> endobj -378 0 obj << -/D [376 0 R /XYZ 124.802 735.021 null] ->> endobj -379 0 obj << -/D [376 0 R /XYZ 124.802 482.281 null] ->> endobj -380 0 obj << -/D [376 0 R /XYZ 124.802 483.895 null] ->> endobj -381 0 obj << -/D [376 0 R /XYZ 124.802 471.94 null] ->> endobj -382 0 obj << -/D [376 0 R /XYZ 124.802 459.984 null] ->> endobj -383 0 obj << -/D [376 0 R /XYZ 124.802 448.029 null] ->> endobj -375 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F18 204 0 R /F14 233 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -386 0 obj << -/Length 1287 -/Filter /FlateDecode ->> -stream -xڵXKoFWV0}/ID!@0mZ+ه>HQ2m aŊ?V|8b]1FbGjZ& -#E#e[,o_kdյnZ*~y U-ۮo.^tV]rp{-ۭ[ZTRt-NjUSMTQk4APT+48W,>LWª+4*I+U!+YԂ7 ]fZ]W"o؈c,;[RE)$iIq0Y#d54ںݖAҡE!Jִ~hGj;v # -ygcЋj%qJ? JR%tÙ&c2E͛86SfFar39 G2C"S|OXy5Lqnagώ7Qj|M;Q\P%:Cu ?s8tJT"\l=mY{i!g?;`K!W1-Djv o8o.?\.a]r''ՙe)YCiP Yb/ -endstream -endobj -385 0 obj << -/Type /Page -/Contents 386 0 R -/Resources 384 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 342 0 R ->> endobj -387 0 obj << -/D [385 0 R /XYZ 124.802 735.021 null] ->> endobj -114 0 obj << -/D [385 0 R /XYZ 124.802 717.021 null] ->> endobj -384 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F18 204 0 R /F39 234 0 R /F14 233 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -390 0 obj << -/Length 769 -/Filter /FlateDecode ->> -stream -xVN@+8bk! 3s 8BS՛L `K{7BŻUs`h4WaZAX]مl\+<1fuY *0@hat,pbݓr_EPBi[7R -gA7C~T[Ye6s)2ER||<ZT|ѹ%8TP -endstream -endobj -389 0 obj << -/Type /Page -/Contents 390 0 R -/Resources 388 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 342 0 R ->> endobj -391 0 obj << -/D [389 0 R /XYZ 124.802 735.021 null] ->> endobj -388 0 obj << -/Font << /F33 215 0 R /F18 204 0 R /F39 234 0 R /F14 233 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -394 0 obj << -/Length 1390 -/Filter /FlateDecode ->> -stream -xXo4"od&x$@B PhU'=ٽ -Mx7ߌ?|Fۋ7_~m|Uv
hJ7ޘj~ie6yo?Mϛc;l~6&CK5hM\Ɍ}?\mI
؏^{M 2 J&8RgHi IC_.pnfYw<ؤ贼ƺ -a=f5rM'`s`<otk+qU@I0G<_j0I -tէ_wh%-h1V`U*G$$M蓡9='S<M%f]L{o+UslNO&pL?^hh,AY:h_u1Fie,W/yϔʬ3Y^tKA!Lwx~ƘQܡI -Wgp$04XrG!KQ?%b!&ii}5#MOd|@0 gP<$Tv9E"0h`la?P1q -&U0g^,dX.iM̥Xƚlq""/6Ԭd˫N9+mr]DJX.rb_60+Vd_*h;SGJ,uՑu%W$Uiؐb4D"%`M6*u#g]y[Nz(ݻ^^,WcFAfg8a;[8=ͱ@]9d2+t;9ht#
q@(>j#8g'->r_PmG/z-\e'JNgɺz\ݲ/~>~tuμtp. -endstream -endobj -393 0 obj << -/Type /Page -/Contents 394 0 R -/Resources 392 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 396 0 R ->> endobj -395 0 obj << -/D [393 0 R /XYZ 124.802 735.021 null] ->> endobj -118 0 obj << -/D [393 0 R /XYZ 124.802 717.021 null] ->> endobj -392 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F18 204 0 R /F14 233 0 R /F32 203 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -399 0 obj << -/Length 389 -/Filter /FlateDecode ->> -stream -xڝMO@+H]gv=ހBAQ$F~ZE¡f睝yEx{qS!3B6JjEฐT5LSF -5O<(d[|TR0>Ϫz?-nY5w@ e77_ldPPrYwn5KGpc$!:""KN)"T&]
8.BM3Qx߿}-?w$O!!96SEXɂݯd,* -JZ.kU -2bԯSǬNӄl<\,%˼\-}OU 3?Tz[w ƴIkT{\ܜH ؆Tt4#a -&ȍ+%)NC3j;0 -endstream -endobj -398 0 obj << -/Type /Page -/Contents 399 0 R -/Resources 397 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 396 0 R ->> endobj -400 0 obj << -/D [398 0 R /XYZ 124.802 735.021 null] ->> endobj -397 0 obj << -/Font << /F33 215 0 R /F32 203 0 R /F18 204 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -403 0 obj << -/Length 1666 -/Filter /FlateDecode ->> -stream -xڕXKo#7W-3[3 zmѢHOM7hH1:cd=(hx&5J)\l2 TFF~jګNc;9ȒMX/Ah:3(?ɣn?4kmG*fG\1MgePӡ^7{X$, ۰AS< -mnxuX5~aSٴyT^.iIN5*h:a2 -l5>R>6
ޑ5 ǽ201xΠ
a2."5ϥ,ano/=/a>(ӓ-]8Z&gTz*+L#$fӣ*YI.yI7b#I/K -.ᤉw,,(|ө`
I4G:lﬔ&GuϛW -Ǥ4O6O,;
KQ#C -' - -Bl-)ky@({ZRx[XӬYofr -ݸ(Rʼ,B;w{gl0r -VdN[26 -ER5'PV:UUEI9X>/bP.}X"R$!' -k<>zjQkY`N6n0
-endstream -endobj -402 0 obj << -/Type /Page -/Contents 403 0 R -/Resources 401 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 396 0 R ->> endobj -404 0 obj << -/D [402 0 R /XYZ 124.802 735.021 null] ->> endobj -122 0 obj << -/D [402 0 R /XYZ 124.802 717.021 null] ->> endobj -126 0 obj << -/D [402 0 R /XYZ 124.802 313.483 null] ->> endobj -401 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F18 204 0 R /F39 234 0 R /F38 232 0 R /F14 233 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -407 0 obj << -/Length 1787 -/Filter /FlateDecode ->> -stream -xڥYK6W6`|!ҢA)
e-o P-:aAC͐+Ld~~].jl6[fR*s*pl}ׅ*&v|Fi+(sV?\&Ư.]RUI.EkFI<뀮ANz'~ G1jqfz6w$QE&Q~3QdO|BU-,d_$l\gFKv&gl+DYtA7U&Ҟ?y^w$77(f7U5^<ٴ~N"5EhW8odgXSN` -61+gqmXrE121#sRuYqݰq.67 -dnPD='vuL<%)x}*Q,;vzMn9=o̷Z2?~nf^Z:{:7;ـ蛏CB;e?V[pb7آ-Jg~=60r-(sKs -_EA*Y?}Y
i -+kT.8d3"b@M{ܯ)!t811)WUN!&^a(>[9҄2D
n.Xm>v?_>mݖA91yA+*'0ʮ| - 猻ފ-ƙc"Vߛ]D$sɥy#X$2$(rLLes';p[TSlSA IhP}jRaD!u={nX" -G:C+akWW - -kR(T^5e٫{WR/@kyYۂ+j9F9]RX|4,ՈNi'6<?#O2 PTQ3spq@F -endstream -endobj -406 0 obj << -/Type /Page -/Contents 407 0 R -/Resources 405 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 396 0 R ->> endobj -408 0 obj << -/D [406 0 R /XYZ 124.802 735.021 null] ->> endobj -130 0 obj << -/D [406 0 R /XYZ 124.802 245.367 null] ->> endobj -405 0 obj << -/Font << /F33 215 0 R /F14 233 0 R /F18 204 0 R /F39 234 0 R /F38 232 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -411 0 obj << -/Length 2041 -/Filter /FlateDecode ->> -stream -xڽYKs6WjFR[IdI:8ql%ԯJJ]`I9xD ->\{VMZzRSΥht=mtMa]|opWpg=϶ Q'/&LdPUT~N.'?4<|]n[ZzY^ƍ_?'~X(+/B9^j\mjr9V\.7tn/?^_?2<Qj.Z_h#WPE+}xm@?|R6Lyп
P+ hSz?V 7 - 6z4*xjmޒJ𞄻o-(j\ABDv7ES``k2QWÅ#kk9.;6z5Ő?JGH3D>+ 10Rld_lk'{β0ePMD6A?rjؚ EϬp'E+͇*twkt1'+pHP:h);[\L# ``)^elh }>TGpQsbE2oayySKMd:SURP]g0%Ζhsn)RZHi,^ -t<<=:[.Wȫ<ʩzt]G$Q 9mj"3)х)>%+CS|Gd :mUUK6@}ԛ01\|0SL6>NZqdFqRvNR=-uɧzsu||ĚݞxG%G5yt@%P*Qܖe6\~~f@.GYS_A>Pbg3gHw7!we|"Jz5Q}+[2kJGH` -EWݱ+1 -}mċ+\uU译w)f
D_M&R>G QKG^ g u9vFK%R>fFTsRAXT=. -endstream -endobj -410 0 obj << -/Type /Page -/Contents 411 0 R -/Resources 409 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 396 0 R ->> endobj -412 0 obj << -/D [410 0 R /XYZ 124.802 735.021 null] ->> endobj -409 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F18 204 0 R /F14 233 0 R /F32 203 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -415 0 obj << -/Length 1694 -/Filter /FlateDecode ->> -stream -xڵXYoF~ׯ[$@b. -_qU)/p -Rx} -{s;ЫqеE!v(/WJ)x:4h8%Pa!2x\N:SF]8WRGNf3LZbw+ly|*0g NOgk#<Ν|Rkebn){)Ӗ7D(MX!r*x{DBnbkdr=ŝ9 6X*T IGIÂT&EOIMy&ͦ,h"=\a -endstream -endobj -414 0 obj << -/Type /Page -/Contents 415 0 R -/Resources 413 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 396 0 R ->> endobj -416 0 obj << -/D [414 0 R /XYZ 124.802 735.021 null] ->> endobj -134 0 obj << -/D [414 0 R /XYZ 124.802 364.715 null] ->> endobj -413 0 obj << -/Font << /F33 215 0 R /F14 233 0 R /F18 204 0 R /F39 234 0 R /F38 232 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -419 0 obj << -/Length 2179 -/Filter /FlateDecode ->> -stream -xڭYo#
_/IvogER$-EOq ,,,]$]>jW<Zc?RX7yrS%iZ* _ݭg]cy휛k)kCߍ -y-
&<k7gDN,^U;c\X -=oAԆһG?s9UG̦QIOw|{w,<>_n~ITJ4k_#K5^7+J7KSYw77¶{!}`'^De{:kcY/y: -y^.Lvk: ʡ ӧ6})ZTKc(CjTP IrҒ,)lj2C$ǽQD::D:%8ĘHrLnU)*n?O59uW#On^[egq!X_ː_ִxLlr`mjzN+Tyʞq2Tw-iEl[d\.78GZ٭]Cceս&R'p6_EٻdM -LDصn(NMШȔ[aVR$Y+Hi5V.<pLyLi - -d"%S2VF:GNGHmbfRX</&:wFi&>YidË:Idzg(rHJ&ZJCB0Y'bGo< vi~
Z*P 0u0iS.WƊ^V
B2Z=8Lkf]@+|tɩ@rg@T -=o^.HK^>wB|yfFXaI2~ -^=A (9A$tBPS&}Pqpq0նΌڶntغŷ1IkF% -c0JL|Rְ)or
7SC915zycy$Q5% -^NKB(_7Jn|bLu,]Od"'HȠ&DF&@%f!|Į#g*)ϫx:kꜲ
lMI -"RPD
NεٽEg~ǢŨ=(i%_ݔxPDi(s._N?'E2b]q|oqYg8o\?}[@O$^qETA!dװ`haS6HqJT@mEwm9)x4MƳYٰY$iXry긮C,* -,!~~{3{3hJ:WMz bLv'Ҵ~n?ԛN%M}AyO^`ֻ"g
H}7.ΨЛiR $vz^/:y -endstream -endobj -418 0 obj << -/Type /Page -/Contents 419 0 R -/Resources 417 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 421 0 R ->> endobj -420 0 obj << -/D [418 0 R /XYZ 124.802 735.021 null] ->> endobj -138 0 obj << -/D [418 0 R /XYZ 124.802 502.274 null] ->> endobj -417 0 obj << -/Font << /F33 215 0 R /F14 233 0 R /F18 204 0 R /F39 234 0 R /F38 232 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -424 0 obj << -/Length 612 -/Filter /FlateDecode ->> -stream -xTMo@+PX5]"#QB(`%ebǩ+;;3o{ h[:gҗhB8 >R,(еb瞔ҍ%4bB#aS<b1(8s83 Ri; -`8 -B1NaQͩ{a{0Cژ$8fy_:? -D'Nۧ(2H^!YB5%|qHoNV" -X=o _&OocY䵞6*v.@zPVnӤ -j{xe_:io6$^5*.vq}WE\ +VXICdC\掻zc|<ԍ(,qq@GĐ2O}#<KGIah;͛NU]*M.,hX}ߖ)v)yTh'W`VIQXmlPƝl[+1t՝wIO(k1kˤδ^UQgFQ[s_ߘFs1Y]މb/9R?r#lS{=O -endstream -endobj -423 0 obj << -/Type /Page -/Contents 424 0 R -/Resources 422 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 421 0 R ->> endobj -425 0 obj << -/D [423 0 R /XYZ 124.802 735.021 null] ->> endobj -422 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -428 0 obj << -/Length 1025 -/Filter /FlateDecode ->> -stream -xڝVmo6_eE-wJn+aE%J,Ա]A0* -I^{;&,7i -cNf7 (He2N>sdVnr.sr>eYef:c<qli9cI\fRnT*62ݵ52㱨R*5wLE!k -
Pè{FfڄD_f5OVM -=,3^FK.nQE\bF㳐|Xx kaHg. -]=/.kBDE.@s)XMo'b -}5`5#B{qx4Ǭ{^,; -R<!/hRW8]r+;:X[MRgajN 7(v.,BN@ -endstream -endobj -427 0 obj << -/Type /Page -/Contents 428 0 R -/Resources 426 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 421 0 R ->> endobj -429 0 obj << -/D [427 0 R /XYZ 124.802 735.021 null] ->> endobj -142 0 obj << -/D [427 0 R /XYZ 124.802 717.021 null] ->> endobj -426 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F18 204 0 R /F39 234 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -432 0 obj << -/Length 1404 -/Filter /FlateDecode ->> -stream -xXo6~_iMd[:X,[S68d__ǣ(EvYGCB?'&?<J1'˂h^dLޤל.5\sRRdR:8^^˫xzGvzr6;fiЄ2Q̝dyK:!$\BSX'W'O8⠼*Av~Q*#%'nv5]2˘N;,^ljHIx2/95w&~څv(II\<k -RZ Us+BxZkڂJtCW-dڋ4=kV>me˶nz(x$X/IK1
Ic1PNqOrSi9ΖR<2Le2<|Jw,+{;<g̬m9]QX)kOsԵ - įhtqaq.AI -g@y3ٖIÚ0/=}+cKctTC#+izDNB LP$;ŰtDVe,|#Mڣ;]okF+2]i>NWBUu=^:O땱qä2n -S%]uM/O|8 -؎
r{3#{83N=j7!4nwۦ_~7?V;nbHGJ&%)=&_ -endstream -endobj -431 0 obj << -/Type /Page -/Contents 432 0 R -/Resources 430 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 421 0 R ->> endobj -433 0 obj << -/D [431 0 R /XYZ 124.802 735.021 null] ->> endobj -430 0 obj << -/Font << /F33 215 0 R /F14 233 0 R /F18 204 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -436 0 obj << -/Length 1373 -/Filter /FlateDecode ->> -stream -xڵXKoFWR"z+#n#TvHK;C.IM SZ|c-LdD|:;;.SpNlvIePӪz͖_{-X}4֓2rwP&3P'^2MYLf5: j<|FzkXP_f6QI4^zߎ2AN(rSdc++G1r:[0)2 FSHt{3dt.>lx<Y&:F*RXSeDz-68|NNocLʢƧ85}itɼk"r_?r[Ѝp7uaQ@]woX< S:&rc^AmH! -6,P'):FL9ґu).R28O(z1D5(슉ׇگ??7b ?#
-(}NXT߬@:²
e+ڌSQ]Ļ,yځn-ŲAh{j:M)YbD$6tmFdj<gOL~xk"Q'_kٔV=k;Hд(Ή^$"ȹ6zlPY^S&N)<tP$=)z}5D9~wkO5@e!t1kԺ$k>H,uZ*.Wt(2t8VC1t͚~R<vTYmD>9A%,)~'ixѶ۪}w{|0a]/: -endstream -endobj -435 0 obj << -/Type /Page -/Contents 436 0 R -/Resources 434 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 421 0 R ->> endobj -437 0 obj << -/D [435 0 R /XYZ 124.802 735.021 null] ->> endobj -146 0 obj << -/D [435 0 R /XYZ 124.802 717.021 null] ->> endobj -434 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F18 204 0 R /F39 234 0 R /F14 233 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -440 0 obj << -/Length 2315 -/Filter /FlateDecode ->> -stream -xڕYYs7~篘JDV#ܘqʻMoRI+OEc6 -8{wf[i0uӶOX0pn܇v8>.mK[*Fqj}u8sUj -95z~0*A#9 -oxSѱYub7Ml6MM¨ -Jr -MxIVYݯ%b7xRdH'>6گ
`@r eN1aFV0Y[LNg҈ɣh@iɊ5'S%I!!'p堰!=xwmFC℀K;U4RO$;B
e_)ERX;| LԚ -r8gdf">c"5OT̝LJ,ѯ2tt=YRdԋfe
d[ / ->.Y^oC)2d>` E*08O\E0#ѲqN1TR, g3D1WڎƿL=FeRn`l[vqo((hj[bi'V-dMۇ*( -@2d -Le|p%YePoݭNB"{ޮ$HBz7//|WڏǏ"ۺxS!{|ljgq a {GFaӫ";((T}XTίÀ*x~wnVx3>2 vg -M$\PK -"+razw8 EoL-/)85L{?v~AF4|,}4ABA.RϊŘ%Yi=UOnZ]!m5K@ǗTJܡ-hWioq.&"i"26 I&(2)7^邜}g
? -<<݉(Aa/_by=PKoDZ6!©fp3
]bOԍծZU>z6?I -endstream -endobj -439 0 obj << -/Type /Page -/Contents 440 0 R -/Resources 438 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 421 0 R ->> endobj -441 0 obj << -/D [439 0 R /XYZ 124.802 735.021 null] ->> endobj -438 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F18 204 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -444 0 obj << -/Length 756 -/Filter /FlateDecode ->> -stream -xڍUKo1])Yl$.@Tt(Ii<lU+f>CJջz}f,ؠKengQ6:ACi, -@$_yXbˡHr}~JNrA#7EX/
hl4 s-1D,)ћ)<@C٤0!>ҋ!SLI4 Kp7PYoeG_؆$žKݤKtcvH%b18وqqpQ JF&)oH(]pӹzNT)7)Qt~Xv}]_IG?)"dʱ ★X@[zx}#BVmI_S -O-C%a&7=+Z=v>\ylbK!{wtvWl֛by^/غt;rZv&]le}kWd5˅0FC_$f4x~b<SQ %"<b:|KASpd`D"9r!yHqv5fړ+y&<Xfo4ȩ#x8+xVvѫ<6
KI#v2m -endstream -endobj -443 0 obj << -/Type /Page -/Contents 444 0 R -/Resources 442 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 446 0 R ->> endobj -445 0 obj << -/D [443 0 R /XYZ 124.802 735.021 null] ->> endobj -442 0 obj << -/Font << /F33 215 0 R /F18 204 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -449 0 obj << -/Length 1927 -/Filter /FlateDecode ->> -stream -xڥYIo7We\H$%hSSS,vP$%>8#=ȷ-{Fm~~m5`F7kFk˛ŴON?sC~i_0I>,Lmvnڒ_ؠ@O߽3
2uOPe&I߳i裂O0LL(tfu:k v2ٙ`@ٳ\U^oߤ%f!6:mQa?咇⽼sdj!^ ->rсoW|#i=Nޓ\ʡ}') q[,z¤9t9(ȥimB3oDёhޕȎhD>%~(P6X?B0tP{Gy=rJtCA1fXp"<x4hxNQp]Iஆ+3vt4,TǑ zd -M+$,&#ǒ("FS*TRq$]5.U@ՆqIX!B.j -`R^EeQr-8ėj~bM*`6K<sb1;2U{tdS=t
R$څrj s-ņ.)W<m%W)M6{a*ĊFc%2/5;GBD$"mά#X58a7t-t|USRtҔZ\2)6I*5!'z#*7ƚ6>^;5YwF0@5p8_@`B9S#pK-g9?/\@W,GbL6V%bgWƳXHuEvd2aW11pN
9Hd
_mT{{Mf-q$>#5i=g>rˇ.,*~MWH,uv*Ӊ]v -ښF<ɹkJԢRǜ3(
xL䐒H-hrbZ -endstream -endobj -448 0 obj << -/Type /Page -/Contents 449 0 R -/Resources 447 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 446 0 R ->> endobj -450 0 obj << -/D [448 0 R /XYZ 124.802 735.021 null] ->> endobj -150 0 obj << -/D [448 0 R /XYZ 124.802 717.021 null] ->> endobj -447 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F18 204 0 R /F39 234 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -454 0 obj << -/Length 1483 -/Filter /FlateDecode ->> -stream -xڕXKO#GW[C{fQ. !r.+d81xtuU?f/p@ݞwW}U
+>~Bʢ.k#Lqu_HJuaeUfya|-TҭZ^Kܟu2R('Sc;ZGo͐
VݙF6<UaiuB@JNTcW'.GWFy -^pʊ g[/VY1w+e]=骐JuuQg̖LWo&S-w5em-f{)e<`Aoq9:ݮN~˾
1<-6$aX~
hZ/|np4#O}nӞ~>L2['w4hdYlNM#ֱزYgʮavوUJeQԐ,rS1Qk
(P)I$9)iY@GJ2=&T*^( w!Lr`LA(l -OScRfPyzzCT"]CrPyP -?@eAa:i^]`*栺oڣ7 -HBź_v,kWhC[qܦYӲW%Z2.Iz;"6| g)AEMU5!8{zRY,C}=D\28q|KG$\EmN|=j`1/g/Z#NiBu@&+laLluc*T}dWp3 "9K(v
~W
=mlr 5G=4woo3#zOcz^tzVvys?- uWe闛0~\[ܭE/i
Hymfۆ<u|B~YCX=.7T5{v[f0hnq.>kaP|jh"UJ9ʈN׆2l)_Aܳ ^exj¯3f&{*·$/A0!{
Drw" -0NȐS3Ԥiw'M)A ep2!eFƔծLUFǔ_I -endstream -endobj -453 0 obj << -/Type /Page -/Contents 454 0 R -/Resources 452 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 446 0 R -/Annots [ 451 0 R ] ->> endobj -451 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [415.067 615.9 462.869 627.853] -/Subtype/Link/A<</Type/Action/S/URI/URI(http://judy.sourceforge.net)>> ->> endobj -455 0 obj << -/D [453 0 R /XYZ 124.802 735.021 null] ->> endobj -452 0 obj << -/Font << /F33 215 0 R /F39 234 0 R /F18 204 0 R /F16 216 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -458 0 obj << -/Length 1453 -/Filter /FlateDecode ->> -stream -xڭXnF+x -{H%QQ -J(kªA --ȔYOt,SZPn3)Aߙ89'3j*%eE -tV"=0ƗG{̀N@XE25@BAC-!GK],O"/OqA|%Nk(C0@ɠ%iY~$2%ZiӯyR
cݸY&rQ<d}F,{"<,^D/5,ֱz/:"9J ZU")+"(2\FC^:"Z<&lHyc9E.;법kC#sӎ9kQ,ګ6^Iq>LFrx{fv;`rXiR
XuB -քy=P[&,թS"&V`G - % -S~?BpĈBcM5E`}@jLf
r5ά9Gp߳>&yfF:RC)X2nQR.'Wa'()ar,)Ydtuֵ6ׁSZUam" -5Z2^Ф͆iFHSvHSN}_pW˞+ ٶk"tR -(7~WDq]P'!37k|'ûk#tPi -vD - -endstream -endobj -457 0 obj << -/Type /Page -/Contents 458 0 R -/Resources 456 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 446 0 R ->> endobj -459 0 obj << -/D [457 0 R /XYZ 124.802 735.021 null] ->> endobj -154 0 obj << -/D [457 0 R /XYZ 124.802 717.021 null] ->> endobj -456 0 obj << -/Font << /F36 221 0 R /F31 201 0 R /F18 204 0 R /F14 233 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -460 0 obj << -/Length 119 -/Filter /FlateDecode ->> -stream -x373T0Pb33KCB.S - -endstream -endobj -461 0 obj << -/Length 290 -/Filter /FlateDecode ->> -stream -x͒1N0Ebir "0]eH -()@P'GQr)D5Ig{s{9_ٖe[kAds^;/ﴫ({bSveʪ{~lpe{~.8?PgcL*g-"R@X=F -endstream -endobj -462 0 obj << -/Length 117 -/Filter /FlateDecode ->> -stream -x373T0Pb33KCB.S -endstream -endobj -463 0 obj << -/Length 228 -/Filter /FlateDecode ->> -stream -xڕбn1`#$"y#_ӥ(zRءQ@2t8z2JƥĩęɱBp"qwEa#0f%;듔E7K!:]ȩ&Z#R
<a*?#7EZRZۡ$6jZg&6wD˵IjZhcD[m=T -endstream -endobj -464 0 obj << -/Length 189 -/Filter /FlateDecode ->> -stream -xuб@ -@'Dc%i,ňOb7|˵Kdmq^@'%zS<p#d)DR9X*NTts2:2>uW!V}kR%khi*8bNҋk@6`,< -endstream -endobj -465 0 obj << -/Length 160 -/Filter /FlateDecode ->> -stream -x33ҳ4V0P0V54S03P01SH1*25(As<L=\ -%E\N -\. -ц -\. -D5~ -endstream -endobj -466 0 obj << -/Length 226 -/Filter /FlateDecode ->> -stream -x}j0pl3 !NJcdMG!zr*ćttR<TKjd*Z6dvl-w-i6|:,o\Yg5+ -endstream -endobj -467 0 obj << -/Length 233 -/Filter /FlateDecode ->> -stream -xuNAPZ -#wA1 -(ZZ`}{ -r㿃hOWוr%y+y~_*<-ŏ=@fW/NJvsy.xz.kKDn ( -endstream -endobj -468 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xM1@%&x.6QL0XFhk,,=, K_g?fcqf2c2s7HbC8]ac_+l|]b<CEΘVR1OZ1:{=U6Zr%) -TNw43秶V䷵$I:s+s6=kkEʒcB*u -endstream -endobj -469 0 obj << -/Length 243 -/Filter /FlateDecode ->> -stream -xڍнJ19R,L7f8y[ZY^yu">[nvmJOBۅ)͖za6\\R鈻Y-^sm}c^hwB7) -"Tl&&KNW"3.3ɳATQ,wk'}9L~d/~vh+ʳN6I2c}':m; -endstream -endobj -470 0 obj << -/Length 232 -/Filter /FlateDecode ->> -stream -xM1N@б(<'`cbGt * -DAI>SQr.),fSPI릾j*Y
Z굼UzҖ7'Wˡa+<cw;i{*@@%Xl-!Ⱌv2㯉8 q/I'AT䎮Q9洰SF?1s%{JXo^f.vgS bێ< -endstream -endobj -471 0 obj << -/Length 153 -/Filter /FlateDecode ->> -stream -x333P0P0bS#3CB.K -e - -endstream -endobj -472 0 obj << -/Length 114 -/Filter /FlateDecode ->> -stream -x3533V0P -@-\. -
00oO;v^r - -endstream -endobj -473 0 obj << -/Length 210 -/Filter /FlateDecode ->> -stream -xڵ1@EXLB -endstream -endobj -474 0 obj << -/Length 111 -/Filter /FlateDecode ->> -stream -x3533V0P -@-\. -D6E``d=o`` -endstream -endobj -475 0 obj << -/Length 214 -/Filter /FlateDecode ->> -stream -xڵ=@XLa b"VJ--4ZG(c!q&:W̛¨QD=Ha@ADhzu+wdhTʦt<و|T)-}V"L\_k`|fY.t-7'kln_zk6nM^Io,|-Э%<8pC> -endstream -endobj -476 0 obj << -/Length 203 -/Filter /FlateDecode ->> -stream -xڵ= -@GX&G\@BLL!he!Vjih-G)-KMҌiOLD!s`Qۑ[Z8+6JЕOhz$ -}~' -endstream -endobj -477 0 obj << -/Length 116 -/Filter /FlateDecode ->> -stream -x3533V0P -endstream -endobj -478 0 obj << -/Length 233 -/Filter /FlateDecode ->> -stream -xej0/xܢG=Am7ɐ&v25;4$h~=G
w -OOzQffAPJoVU廜:.G,WTc]M5aw 0OPېc&+em曰M7r+cA I83geHQَ{N֙T9̯:!8D5aai/[bg
p~0: -endstream -endobj -479 0 obj << -/Length 128 -/Filter /FlateDecode ->> -stream -x3331W0PP54S0T01SH1*25P -endstream -endobj -480 0 obj << -/Length 161 -/Filter /FlateDecode ->> -stream -x3537T0P -endstream -endobj -481 0 obj << -/Length 207 -/Filter /FlateDecode ->> -stream -xuα@ -@Qk;OiBcJtI*q>hh֒ESnq^%h -:,*cub߶:osmn[u.܉ℛPkjQdZ*w|VPE)W[W%GI -endstream -endobj -482 0 obj << -/Length 87 -/Filter /FlateDecode ->> -stream -x3634R0P04 - -)\\@$2ɹ\N\@.}0PRTʥ -endstream -endobj -483 0 obj << -/Length 144 -/Filter /FlateDecode ->> -stream -x3530T0Pb3sCB.c -endstream -endobj -484 0 obj << -/Length 247 -/Filter /FlateDecode ->> -stream -x}j0@
h}upB3کCtءG;۟O'x`NR'!ݴmm/}ݳ9nx_wt[ۡ;n -endstream -endobj -485 0 obj << -/Length 209 -/Filter /FlateDecode ->> -stream -xڵѱ -0 -#__/"zwB\ tԙ;%72ӥh];xZX%h]7=]5CSv%| -endstream -endobj -486 0 obj << -/Length 263 -/Filter /FlateDecode ->> -stream -xڅбJ@ )Gȼ&K*p` -A+J--ͣݣV,Lq5 -WӞVTə4T+H//蹼y^s3K\J=pu*!c3hЧLtg5T{nݾShw ,|u/0 -endstream -endobj -487 0 obj << -/Length 243 -/Filter /FlateDecode ->> -stream -xڝn0b@%{ A"Q*N*D(y]H0$}K^PN' -*gSAĜWFIӀ~)2zE|F} -endstream -endobj -281 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F40 -/FontMatrix [0.01004 0 0 0.01004 0 0] -/FontBBox [ 2 -19 77 71 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 46 -/LastChar 255 -/Widths 488 0 R -/Encoding 489 0 R -/CharProcs 490 0 R ->> endobj -488 0 obj -[31.12 0 0 56.01 56.01 0 56.01 0 56.01 0 56.01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77.1 82.75 77.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53.71 0 53.71 0 62.93 50.88 0 49.79 59.82 59.82 54.51 60.28 0 57.63 56.01 57.63 57.63 49.79 51.63 0 0 51.4 62.47 0 0 0 0 0 53.71 0 0 57.74 ] -endobj -489 0 obj << -/Type /Encoding -/Differences [46/a46 47/.notdef 49/a49/a50 51/.notdef 52/a52 53/.notdef 54/a54 55/.notdef 56/a56 57/.notdef 205/a205/a206/a207 208/.notdef 224/a224 225/.notdef 226/a226 227/.notdef 228/a228/a229 230/.notdef 231/a231/a232/a233/a234/a235 236/.notdef 237/a237/a238/a239/a240/a241/a242 243/.notdef 245/a245/a246 247/.notdef 252/a252 253/.notdef 255/a255] ->> endobj -490 0 obj << -/a46 482 0 R -/a49 483 0 R -/a50 484 0 R -/a52 485 0 R -/a54 486 0 R -/a56 487 0 R -/a205 460 0 R -/a206 461 0 R -/a207 462 0 R -/a224 463 0 R -/a226 464 0 R -/a228 465 0 R -/a229 466 0 R -/a231 467 0 R -/a232 468 0 R -/a233 469 0 R -/a234 470 0 R -/a235 471 0 R -/a237 472 0 R -/a238 473 0 R -/a239 474 0 R -/a240 475 0 R -/a241 476 0 R -/a242 477 0 R -/a245 478 0 R -/a246 479 0 R -/a252 480 0 R -/a255 481 0 R ->> endobj -491 0 obj << -/Length 184 -/Filter /FlateDecode ->> -stream -xm=`.߁1D'㤎]ċ8p
n #~$(}L<L6y6-<vf{Ś\(]p9%ED-4 -,iu8q/aoM -endstream -endobj -492 0 obj << -/Length 190 -/Filter /FlateDecode ->> -stream -x}0K:#pO`i1NI4 -Kd0FMj\ijx@½%\PPGL2P[2;|=7P~K<Ls 9y|9#lK#vӜ_[ZCN_CF,a8[NXTQ -endstream -endobj -493 0 obj << -/Length 218 -/Filter /FlateDecode ->> -stream -xڝ1N@4 -AT -( -o̤/`tR27V֯ifhh`+-RN]dvg9 -endstream -endobj -494 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -x313T0P0bCSCCB.c -endstream -endobj -495 0 obj << -/Length 147 -/Filter /FlateDecode ->> -stream -x313T0P0b#SCCB.cHrW0 -ц -\. - -endstream -endobj -496 0 obj << -/Length 145 -/Filter /FlateDecode ->> -stream -x313T0P0bCSCCB.c - -endstream -endobj -497 0 obj << -/Length 227 -/Filter /FlateDecode ->> -stream -xڍ=N@\4 -AT(PR$ގk
7eUI"Q|{;5袥aC]8<r@HaV;z~__S~EO-5kVE*#TPˎaa'\Bكoҝ\Q4pf<`2ߔO$̘gD<gTIcfKo=uӖ -endstream -endobj -498 0 obj << -/Length 120 -/Filter /FlateDecode ->> -stream -x313T0P0b#SCCB.cHrW0 -ц -\. -?c4
N%'W -endstream -endobj -499 0 obj << -/Length 108 -/Filter /FlateDecode ->> -stream -x313T0P0bcSCCB.crAɹ\N\ -\@Q.}O_T.} -endstream -endobj -500 0 obj << -/Length 156 -/Filter /FlateDecode ->> -stream -x313T0P0U5T0҆ -)\\&@A "ɥ`l¥U()*Mw -pV0wQ6T0tQ``HX`'$@DD?`AH?`@OjhPՓ+ -endstream -endobj -501 0 obj << -/Length 218 -/Filter /FlateDecode ->> -stream -xE=n@E.,MvNmM,#EPR%)SB9QPr.]lȢOLt&c&FRf1K~|<MәDH%_whPK}O4|3Eӵs|@F -āA֤Ha8pn\]ϭGН-8j<\ -8hPHF=a,o>U.k9s -endstream -endobj -502 0 obj << -/Length 123 -/Filter /FlateDecode ->> -stream -x313T0P0bCSCCB.cs -endstream -endobj -503 0 obj << -/Length 177 -/Filter /FlateDecode ->> -stream -x313T0P0b#SCCB.cHrW0 -ц -\. - B`W${1y01h͇q|Fa l?`!'W -endstream -endobj -504 0 obj << -/Length 194 -/Filter /FlateDecode ->> -stream -xU-@%&c 迨 -P$u -endstream -endobj -505 0 obj << -/Length 170 -/Filter /FlateDecode ->> -stream -xŐ1 -@ERxt)R-n!he!VB9EqW7seϨxAƘxң3U5ݮr 쀾"h `,T'uIDx -Zpqol -endstream -endobj -506 0 obj << -/Length 174 -/Filter /FlateDecode ->> -stream -x313T0P0bSCCB.cs I$r9yr+s{ -endstream -endobj -507 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xڕС0jrf{::"#a -֤FscT,r0ʖSiNfEN -endstream -endobj -508 0 obj << -/Length 236 -/Filter /FlateDecode ->> -stream -xu1N@E"a|$H" * -DH$*\!G2HQwmT -娔DJsՠg?x#Um<>r\Iq+wn24wC0MLNLtA9 -endstream -endobj -509 0 obj << -/Length 124 -/Filter /FlateDecode ->> -stream -x313T0P0b#SCCB.cHrW0 -ц -\. -@H0z(QՓ+ -endstream -endobj -510 0 obj << -/Length 167 -/Filter /FlateDecode ->> -stream -x1@G(LtYY -+D -,ZZhq@IaGhf'_Ϭgɂ#}SqblF.b27+e=Z3bÏB&.ْ`9:Rs)U*H]J^w¤%HRQC -endstream -endobj -511 0 obj << -/Length 189 -/Filter /FlateDecode ->> -stream -xe;@!$p,1q,ZZh.F5\5o2s? q98^}G|9^0vV2#kgdfAYL{NELiiww?>, -ʐ -]
xBi -endstream -endobj -512 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xڍϯ -P#)>t &5m.b_CYNwzto,NvE69Wh.-rZeD/@sL@56Mo%n}
:} -endstream -endobj -513 0 obj << -/Length 226 -/Filter /FlateDecode ->> -stream -xE1n@б\ M<'mJHqT)"*L(iRZt)GLᏱEW23ɢ}ɟ\YV>>xUs&Ւg9pzy^Jz-NS={kg`g?EJEAJ>.dt -&JI0r熻qM5.M_f[݆{GZ>_?WKq{ -endstream -endobj -514 0 obj << -/Length 192 -/Filter /FlateDecode ->> -stream -xڭ= -@ )"U F0XmbaҔ)®p)6 -GqBQ@O[SQ6{ -t&NExޡ9OA -q@#~8 -endstream -endobj -515 0 obj << -/Length 182 -/Filter /FlateDecode ->> -stream -xڥϱ -@Y| j;:9::(}{{3!HŔĔ'tIio
_Q[z>^WnEWtL(>a]Q3-c'4 -endstream -endobj -516 0 obj << -/Length 191 -/Filter /FlateDecode ->> -stream -xm= -@ x Ղ?` -A+RKE[)S,;h%Xfh< -}:ex\T:8^pVQ>EmqF;)C}FE$ -endstream -endobj -517 0 obj << -/Length 187 -/Filter /FlateDecode ->> -stream -xڝ= -@g"#Xraˀ!N;GYg!BR@[]/w%ܔ|q&?,Lƹ --0遍~*?um -endstream -endobj -518 0 obj << -/Length 182 -/Filter /FlateDecode ->> -stream -xڍ1 -@EIk9 -n!he!Vjihh%GL2Φօ}g?ofǜlS>'t#k5?;2{Zd܆L]rBC\"iJzD=[5/jLAOQ~ߏ@B_Zh4J5Ϋ^RMuZ9uEJ -endstream -endobj -519 0 obj << -/Length 193 -/Filter /FlateDecode ->> -stream -xڕα@.<}L &`qRG;[pqᾤ5)+H+9s<^&|XLפ*L,r0S⺡MNMC -endstream -endobj -520 0 obj << -/Length 201 -/Filter /FlateDecode ->> -stream -xmPE4KBBrmM>}}V́;ܹiԥS=T'u9&a+NFF⻥OK+VZ[(
f#2;܃J>PDCv@Z }cC -7'*4u.7mpb2rcZI_ -endstream -endobj -521 0 obj << -/Length 154 -/Filter /FlateDecode ->> -stream -x313T0P0asSCCB.c -%E\N -@BA,@Az H?*; -endstream -endobj -522 0 obj << -/Length 253 -/Filter /FlateDecode ->> -stream -x}J@#E`}!k.p` -A+RKE#U(y[,gǰzqꜟJz`;볟Z.(wk~x|ws%{/xv -endstream -endobj -523 0 obj << -/Length 161 -/Filter /FlateDecode ->> -stream -x313T0P0bcSCCB. -%E\N -@B4Pe,B @d ? B~o -endstream -endobj -524 0 obj << -/Length 132 -/Filter /FlateDecode ->> -stream -x313T0P0bcKS#CB.cC -@-\. - @x@@?C1;}pA|.WO@. -endstream -endobj -525 0 obj << -/Length 169 -/Filter /FlateDecode ->> -stream -x͏= -@_#d.͟ -B Fp!VbnxKq\`eW~2c!G<h͞rCjaJj<)3#֤ -^id -: -endstream -endobj -526 0 obj << -/Length 198 -/Filter /FlateDecode ->> -stream -xڝ;@%$p.H)L0VjiVW(x[_~0E_cƃ=2b4gA΄Sp)-8l<g]AaQ+?Pc4 oLu5ZԌ0v-L!skܶͅM2^deADW>sQy -endstream -endobj -527 0 obj << -/Length 115 -/Filter /FlateDecode ->> -stream -x313T0P0b ebUel䃹 \.'O.pc.}(BIQi*Sm`Pz<7 -endstream -endobj -528 0 obj << -/Length 171 -/Filter /FlateDecode ->> -stream -xڽ= -@[&G\@7!Q1#X^,7[n8ȃW3r9Al&]'-\,cx`s0
n ==Cbq1
SeKvI'mr/)T8R`5zf -endstream -endobj -529 0 obj << -/Length 155 -/Filter /FlateDecode ->> -stream -x313T0P0bcc3CB. -%E\N -@QhX.O$$PD2` -endstream -endobj -530 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -x}=@XLvNBLH0XF[٣Q8ab^2}KJ)*%Kw4
+@@)juE]VQzB[_ -endstream -endobj -531 0 obj << -/Length 200 -/Filter /FlateDecode ->> -stream -xڥ= -@gfI"SZYZZ(ښͣ[.(wS|7q4HRYs_8
LWCNv?$#(%p:lHj&5pGٌs V,S*7;(&A]t,-GT@8=F> -$_ȥF<5ޯ -endstream -endobj -532 0 obj << -/Length 211 -/Filter /FlateDecode ->> -stream -xڭ= -@4 وVVb&7J{
Lig -Z -6_Bq;QH1.#ܡ$
)ѯO-3#ƒcM?n0O$!Wɾb|31P_6rilxz+=Տ>jO=]quBVŴ~[)D\|kse8'vG -endstream -endobj -533 0 obj << -/Length 158 -/Filter /FlateDecode ->> -stream -xڭ1 -@ПJuj!FpA+RKAEh9JAqc![̃I`4-ØԈmjw쎜{Vky\Y\/|9êe_Hx+5C8#$RC\B" -endstream -endobj -534 0 obj << -/Length 185 -/Filter /FlateDecode ->> -stream -xM1 -@4!s7q5@T0XErr,,2ԎgDM&rv=pr^ًYMyaoY!RrGB7
}KD#"eZSW!("PBCa}96A=<Uīwy^A -endstream -endobj -535 0 obj << -/Length 155 -/Filter /FlateDecode ->> -stream -x313T0P0bc3CB.cS -endstream -endobj -536 0 obj << -/Length 148 -/Filter /FlateDecode ->> -stream -x313T0P0bcc3CB. -%E\N -@QhX.O` -endstream -endobj -537 0 obj << -/Length 186 -/Filter /FlateDecode ->> -stream -x5= -0W:oN`B`A'qRGE7^̭
ء4ؔ? ,&Q@>0[}pb*Q)QzܟvI>>yG:J^]S|-,ZH -endstream -endobj -538 0 obj << -/Length 174 -/Filter /FlateDecode ->> -stream -x313T0P0bcc3CB. -%E\N -@QhX.O`? -endstream -endobj -539 0 obj << -/Length 202 -/Filter /FlateDecode ->> -stream -xE; -PEoH!LUBBBN!۲t@!L@,a̻{ېlfOÄܒZrɌOp>ܘW!kJ/LnRQ;H(+ -O -endstream -endobj -540 0 obj << -/Length 237 -/Filter /FlateDecode ->> -stream -xEαj@dz)CB=ҩCɔdnvj:t&=$%p!:d-"zX!ZnhyxDQd}LKႲ)ֳ[{vȭ+OPy5
@U-G[;z[* -endstream -endobj -541 0 obj << -/Length 176 -/Filter /FlateDecode ->> -stream -x}1 -PS2Y<9*BV
N⤎G(Ϥc|?!?'S3>gt#͔+^wr~ÏB.9#W!H"Px+"B
I/ -endstream -endobj -542 0 obj << -/Length 190 -/Filter /FlateDecode ->> -stream -x}0K:#pO`i1NI4 -Kd0FMj\ijx@½%\PPGL2P[2;|=7P~K<Ls 9y|9#lK#vӜ_[ZCN_CF,a8[NXTQ -endstream -endobj -543 0 obj << -/Length 122 -/Filter /FlateDecode ->> -stream -x313T0P0bSCCB.c3 I$r9yr+q{ -endstream -endobj -544 0 obj << -/Length 181 -/Filter /FlateDecode ->> -stream -x313T0P0b#SCCB.cHrW0 -ц -\. - -endstream -endobj -545 0 obj << -/Length 218 -/Filter /FlateDecode ->> -stream -xE=n@E.,MvNmM,#EPR%)SB9QPr.]lȢOLt&c&FRf1K~|<MәDH%_whPK}O4|3Eӵs|@F -āA֤Ha8pn\]ϭGН-8j<\ -8hPHF=a,o>U.k9s -endstream -endobj -546 0 obj << -/Length 156 -/Filter /FlateDecode ->> -stream -x313T0P0T5T01R05TH1*21P -endstream -endobj -547 0 obj << -/Length 177 -/Filter /FlateDecode ->> -stream -x313T0P0b#SCCB.cHrW0 -ц -\. - B`W${1y01h͇q|Fa l?`!'W -endstream -endobj -548 0 obj << -/Length 170 -/Filter /FlateDecode ->> -stream -xŐ1 -@ERxt)R-n!he!VB9EqW7seϨxAƘxң3U5ݮr 쀾"h `,T'uIDx -Zpqol -endstream -endobj -549 0 obj << -/Length 119 -/Filter /FlateDecode ->> -stream -x313T0P0b#SCCB.cHrW0 -ц -\. -!Å -endstream -endobj -550 0 obj << -/Length 218 -/Filter /FlateDecode ->> -stream -xڝ1N@4 -AT -( -o̤/`tR27V֯ifhh`+-RN]dvg9 -endstream -endobj -551 0 obj << -/Length 124 -/Filter /FlateDecode ->> -stream -x313T0P0b#SCCB.cHrW0 -ц -\. -@H0z(QՓ+ -endstream -endobj -552 0 obj << -/Length 149 -/Filter /FlateDecode ->> -stream -x313T0P0b#SCCB.cHrW0 -ц -\. -?c '?@<` Yj00 -endstream -endobj -553 0 obj << -/Length 191 -/Filter /FlateDecode ->> -stream -xm= -@ x Ղ?` -A+RKE[)S,;h%Xfh< -}:ex\T:8^pVQ>EmqF;)C}FE$ -endstream -endobj -554 0 obj << -/Length 219 -/Filter /FlateDecode ->> -stream -x}1nPDQ mHؒ),9U(2E"s4(]Xwt)vg̬U]Zz*Gepu+V;J{=K>,v@<0w ё
,!]`&pwŦh[ܳY3t{$xA`V
M_@Ơ cֈXʶwy -endstream -endobj -555 0 obj << -/Length 178 -/Filter /FlateDecode ->> -stream -xe1 -@D7X'pV
1[ZYZZ(Z'GQr)@3vS8Rv>t# q8])dku
?|lM\FD:
QO5e -/3Ⱦ%tuC$3jUfZC+O; -endstream -endobj -556 0 obj << -/Length 121 -/Filter /FlateDecode ->> -stream -x313T0P0b ebU
\Dr.'~8ϥ&=}JJS]
b<] -endstream -endobj -557 0 obj << -/Length 159 -/Filter /FlateDecode ->> -stream -x313T0 -endstream -endobj -558 0 obj << -/Length 201 -/Filter /FlateDecode ->> -stream -xmPE4KBBrmM>}}V́;ܹiԥS=T'u9&a+NFF⻥OK+VZ[(
f#2;܃J>PDCv@Z }cC -7'*4u.7mpb2rcZI_ -endstream -endobj -559 0 obj << -/Length 230 -/Filter /FlateDecode ->> -stream -x=J@'LGyBV᪅SZYgiݑMc*6,|;tγñ3^U>}
[5Kh+~Y>Y\sfwYA:t[~$9|ll| -endstream -endobj -560 0 obj << -/Length 187 -/Filter /FlateDecode ->> -stream -xM -@,}x-WNI* -nGGrPQ ܟMg%eTHܜN9ϴUvG@)fM,(G[>MM- -+Uya4P
ADlp/XZ
-endstream -endobj -561 0 obj << -/Length 181 -/Filter /FlateDecode ->> -stream -x313T0P0bcc3CB. -%E\N -@QhX.Og
$D&=A$wDIRDڃͩ@0 -endstream -endobj -562 0 obj << -/Length 223 -/Filter /FlateDecode ->> -stream -xڅ1kP-~s1$ -63ک8c&_+5BwTqǻ?8zHG8$I3i'3>(1HAJ_3IPn0K -endstream -endobj -563 0 obj << -/Length 200 -/Filter /FlateDecode ->> -stream -xUα -@ -YUp* - N%Jcr]t%GF#܅pX@BljW8tك.&\;5I]ީERӊn#z+~!&hjŷC"C*fueNlɪjM:
۳r"!4aa _om -endstream -endobj -564 0 obj << -/Length 145 -/Filter /FlateDecode ->> -stream -x313T0P0bcc3CB. -%E\N -@QhX.O@"I8&!dALɃLн
@ -endstream -endobj -565 0 obj << -/Length 172 -/Filter /FlateDecode ->> -stream -x313T0 -%E\N -\. -ц -\. -?ad=<A -endstream -endobj -566 0 obj << -/Length 121 -/Filter /FlateDecode ->> -stream -x313T0P0bcc3CB. -%E\N -@QhX.Og
$D!3r.WO@. -endstream -endobj -567 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -x}=@XLvNBLH0XF[٣Q8ab^2}KJ)*%Kw4
+@@)juE]VQzB[_ -endstream -endobj -568 0 obj << -/Length 117 -/Filter /FlateDecode ->> -stream -x313T0P0bcc3CB. -%E\N -@QhX.O@ -endstream -endobj -569 0 obj << -/Length 200 -/Filter /FlateDecode ->> -stream -xڥ= -@gfI"SZYZZ(ښͣ[.(wS|7q4HRYs_8
LWCNv?$#(%p:lHj&5pGٌs V,S*7;(&A]t,-GT@8=F> -$_ȥF<5ޯ -endstream -endobj -570 0 obj << -/Length 182 -/Filter /FlateDecode ->> -stream -xڍ1 -@EIk9 -n!he!Vjihh%GL2Φօ}g?ofǜlS>'t#k5?;2{Zd܆L]rBC\"iJzD=[5/jLAOQ~ߏ@B_Zh4J5Ϋ^RMuZ9uEJ -endstream -endobj -571 0 obj << -/Length 126 -/Filter /FlateDecode ->> -stream -x313T0P0b#c3CB.cHrW0 -endstream -endobj -572 0 obj << -/Length 237 -/Filter /FlateDecode ->> -stream -xEαj@dz)CB=ҩCɔdnvj:t&=$%p!:d-"zX!ZnhyxDQd}LKႲ)ֳ[{vȭ+OPy5
@U-G[;z[* -endstream -endobj -573 0 obj << -/Length 219 -/Filter /FlateDecode ->> -stream -xڥ=126V?VbģGXZ#
ΛZoQMF7){Zx\cFiNnB!B7:xHn3Gףap*ڧ ߵ'(Po`.|͒,IֆvnmMV{巶0vю]h*Mi5uɧ8E -endstream -endobj -574 0 obj << -/Length 202 -/Filter /FlateDecode ->> -stream -xE; -PEoH!LUBBBN!۲t@!L@,a̻{ېlfOÄܒZrɌOp>ܘW!kJ/LnRQ;H(+ -O -endstream -endobj -575 0 obj << -/Length 138 -/Filter /FlateDecode ->> -stream -x313T0P0T54R01Q06SH1*21(X@s<L=\ -%E\N -\. -ц -\. -I8Z 8L0 -endstream -endobj -576 0 obj << -/Length 149 -/Filter /FlateDecode ->> -stream -x313T0P0bcc3CB. -%E\N -@QhX.Og
$D &`RLIf0 -endstream -endobj -577 0 obj << -/Length 123 -/Filter /FlateDecode ->> -stream -x313T0 -%E\N -\. -ц -\. -? q5@H$DՓ+ -endstream -endobj -578 0 obj << -/Length 174 -/Filter /FlateDecode ->> -stream -x313T0P0bc3CB.# -endstream -endobj -579 0 obj << -/Length 161 -/Filter /FlateDecode ->> -stream -xڕ= -1 LB` -A+--Gۣ -endstream -endobj -580 0 obj << -/Length 186 -/Filter /FlateDecode ->> -stream -xm1 -1EgB#U -+BBRPQx4#XZ -` /u?JzHz@5\,6{,%ijSTvFe@UӪ| -endstream -endobj -581 0 obj << -/Length 178 -/Filter /FlateDecode ->> -stream -x313T0 -%E\N -\. -ц -\. -nH? )D6I{Y -endstream -endobj -582 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -xUα -0['0SV08ͣQ$]A}]r2[)WUb9s7,VNWh=V̚S0n. -endstream -endobj -583 0 obj << -/Length 117 -/Filter /FlateDecode ->> -stream -x313T0PT02W06U05RH1*22 -( - -endstream -endobj -584 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -x313T0P0acsCB.c -?
PX,V6Y
45`@Ԁv)\\\ -endstream -endobj -585 0 obj << -/Length 182 -/Filter /FlateDecode ->> -stream -x313T0P0bCcsCB.c -~?
00``?A3005u ,Xl -\t MR\= -endstream -endobj -586 0 obj << -/Length 113 -/Filter /FlateDecode ->> -stream -x313T0P04F -F -)\\@IrW04 -s{*r;8+ -endstream -endobj -587 0 obj << -/Length 168 -/Filter /FlateDecode ->> -stream -x313T0P0bCSCCB.cs -endstream -endobj -588 0 obj << -/Length 251 -/Filter /FlateDecode ->> -stream -xڅJA'\!Lsޱƅ+,J--;y4B[O"hWf,4s n,͡c%:IRc{l3yz|c;9?Tj -fDTP&E{h+9G2D~>/BGE$E7~ }KvmV:$,H@%j}W}azHO#bA=b2~|0 -endstream -endobj -589 0 obj << -/Length 247 -/Filter /FlateDecode ->> -stream -x5ϱN0`G"y#/ -!0Z6 sI1{ -endstream -endobj -590 0 obj << -/Length 148 -/Filter /FlateDecode ->> -stream -x313T0P04U02R06P05TH1*24(YBs<M=\ -%E\N -\. -ц -\. -
?0`77g.`r - -endstream -endobj -591 0 obj << -/Length 192 -/Filter /FlateDecode ->> -stream -xڅ1PDPlĊ1D+cmq@IA;WL0vxlagnEt4'g'Ty!n{<c Z-VS!)Q -):)j`?`Hju^Lv{F -endstream -endobj -592 0 obj << -/Length 187 -/Filter /FlateDecode ->> -stream -xڅO; -Pl{I*L!he!Vj)h-G,-$q̃T;LNuihuɗV'/2O4Ĭxq7$$M -| -,G\W{F9^ـ"J[|rY"ֱ4nT?pGrjݬc_e*[M* -endstream -endobj -593 0 obj << -/Length 171 -/Filter /FlateDecode ->> -stream -x313T0P0S0W0P01VH1*26(%s<
=\ -%E\N -@QhX.OXǏ?1
ɁԀԂ -endstream -endobj -594 0 obj << -/Length 116 -/Filter /FlateDecode ->> -stream -x313T0P0V0S01T01QH1*26E-ɹ\N\ -\@Q.}O_T.} -endstream -endobj -595 0 obj << -/Length 136 -/Filter /FlateDecode ->> -stream -x313T0P04U54R0R -M -F0\.'O.pC.}BIQi*S!BA,???PP'W -endstream -endobj -596 0 obj << -/Length 103 -/Filter /FlateDecode ->> -stream -x313T0P0W04S06W02TH1*2 (B$s<,=L=}JJS]
b<]0szrr -endstream -endobj -597 0 obj << -/Length 99 -/Filter /FlateDecode ->> -stream -x313T0P04F - -)\\@ -p{IO_T.} -endstream -endobj -598 0 obj << -/Length 157 -/Filter /FlateDecode ->> -stream -x313T0P0U5W0T0PH1*26 -(Bds<=\ -%E\N -\. -ц -\. -@ -endstream -endobj -599 0 obj << -/Length 107 -/Filter /FlateDecode ->> -stream -x313T0P04F -f -)\\@IrW04 -s{*r;8+ -endstream -endobj -600 0 obj << -/Length 155 -/Filter /FlateDecode ->> -stream -x313T0P04U54R06P06SH1*24 -(Xs<M=\ -%E\N -\. -ц -\. -
A -endstream -endobj -601 0 obj << -/Length 167 -/Filter /FlateDecode ->> -stream -x313T0P0U0Q0T01SH1*26(%s<=\ -%E\N -\. -ц -\. -L@ -endstream -endobj -602 0 obj << -/Length 162 -/Filter /FlateDecode ->> -stream -x] -0->KNZN⤎>cbMN8>] yGGbO%T2[0YFK&pOdLSA<MB +bJʰ_Z>ZZFHW 2"L}Tߩoﻭ "Іֺ? -endstream -endobj -603 0 obj << -/Length 110 -/Filter /FlateDecode ->> -stream -x313T0P0V04U01T06UH1*26 -(Aes<=\ -%E\N -\. -ц -\. - - -endstream -endobj -604 0 obj << -/Length 239 -/Filter /FlateDecode ->> -stream -xڍ1N0Dg"o|$Q6ZZHPQ *!p!eU8 -endstream -endobj -605 0 obj << -/Length 114 -/Filter /FlateDecode ->> -stream -x313T0P04W5W01T0PH1*22(Bs<=\ -%E\N -\. -ц -\. -a`?r - -endstream -endobj -606 0 obj << -/Length 152 -/Filter /FlateDecode ->> -stream -x313T0P0U5W0T0PH1*26 -(Bds<=\ -%E\N -\. -ц -\. -@N5 D{! ?8 - -endstream -endobj -607 0 obj << -/Length 116 -/Filter /FlateDecode ->> -stream -x313T0P0V5W02W0PH1*22 -(Bds<=\ -%E\N -\. -ц -\. -c``pzrr -endstream -endobj -608 0 obj << -/Length 137 -/Filter /FlateDecode ->> -stream -x%; -1F;]]hL!he!Vjih7eIY@5`NKnn;[.>Yʬz8nQuĥ>W#D*L"QCĶ5e"ьwO)B -endstream -endobj -609 0 obj << -/Length 104 -/Filter /FlateDecode ->> -stream -x313T0P0UеP0T5RH1*26 -(A$s<≠=}JJS]
b<] -endstream -endobj -610 0 obj << -/Length 175 -/Filter /FlateDecode ->> -stream -xڵ
0DQXK -D h%##6HWYM0psfTz2{XKf1)Kd*rdGR/RA-%a|ݠЂV$QoeUG+O;a -endstream -endobj -611 0 obj << -/Length 96 -/Filter /FlateDecode ->> -stream -x313T0P0T5W02S0PH1*2 -(Bes≮=\ -%E\N -\. -ц -\. -(\\\ -endstream -endobj -612 0 obj << -/Length 171 -/Filter /FlateDecode ->> -stream -xڵ
0EQ miCp - (0i~ϧ{~37<& -~9JϓJu }s7&xܟnK(4^Jq^.JNQr?)F#PQ1H)3R;;J~.؆xC?ZOYb -endstream -endobj -613 0 obj << -/Length 263 -/Filter /FlateDecode ->> -stream -xuνJ@YRoyMry),J--$ba#*Āb8Gi+9/w]iFftQ5 sʟjN\`v 1f!]b:ڣ5a&Hz -endstream -endobj -614 0 obj << -/Length 191 -/Filter /FlateDecode ->> -stream -xڍ1 -@EGR2'pa!F0Xr!E8I33;MR(oSJb:xEk%GU/hvd-Lkg4fAs \102w{(` UO\+rBZt%p#'*=J@ҿϫFa;Whn
I -endstream -endobj -615 0 obj << -/Length 203 -/Filter /FlateDecode ->> -stream -xڝ= -@_L#8MLRL!he!Vjih'({!q-6߲`}t!'<8 91ũpiNfqJf)c2ot=̜w{@ -endstream -endobj -616 0 obj << -/Length 141 -/Filter /FlateDecode ->> -stream -x313T0P -endstream -endobj -617 0 obj << -/Length 222 -/Filter /FlateDecode ->> -stream -xe1N1E*i| .-V -Ab$(U -endstream -endobj -618 0 obj << -/Length 226 -/Filter /FlateDecode ->> -stream -xEнN0J^@ZHHCL @>ZlDZTe}9W|Qps}ů}PYkP|N#5[
Sj~??ScNzDDFM&4=:4WL -endstream -endobj -619 0 obj << -/Length 181 -/Filter /FlateDecode ->> -stream -xڕ=@!$p. b&ZY+hpJLh$%^5Y(xTHN)74
U[QcL uM -endstream -endobj -620 0 obj << -/Length 207 -/Filter /FlateDecode ->> -stream -xڥ= -@4{t&)!BBB,xxqFE惝}ov)ZRGk;Sʱڬ)Nюe6aܠOi(Zb>$\Cǹ.5Tº)7 -P \)'ߘ'-,e$9ґ
i `AY֚ - -endstream -endobj -621 0 obj << -/Length 241 -/Filter /FlateDecode ->> -stream -xm1N0E"4@TE"Th+)S -endstream -endobj -622 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -xڕͽ -0 -'`010%p1 iBt*Rt 2;nB)4_T+~Ѭ.:\M -endstream -endobj -623 0 obj << -/Length 213 -/Filter /FlateDecode ->> -stream -x}O -@`qM>!zI -0XɧSW؈pw3s3Y:'sÄ1P{~s8Ӵ$4'tcot=w {*(D`D:y#jAԠBQS -ժ?|R3{6nR}Zn -endstream -endobj -234 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F39 -/FontMatrix [0.01204 0 0 0.01204 0 0] -/FontBBox [ -1 -19 45 58 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 33 -/LastChar 255 -/Widths 624 0 R -/Encoding 625 0 R -/CharProcs 626 0 R ->> endobj -624 0 obj -[43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43.59 43.59 0 0 43.59 43.59 0 0 0 0 43.59 0 43.59 43.59 43.59 0 43.59 43.59 0 43.59 43.59 0 0 0 0 43.59 0 0 0 0 0 0 0 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 0 43.59 43.59 43.59 43.59 43.59 ] -endobj -625 0 obj << -/Type /Encoding -/Differences [33/a33/a34/a35/a36/a37/a38/a39/a40/a41/a42/a43/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56 57/.notdef 58/a58/a59/a60/a61/a62/a63/a64/a65/a66/a67/a68/a69/a70/a71/a72/a73/a74/a75/a76/a77/a78/a79/a80 81/.notdef 82/a82/a83/a84/a85/a86/a87/a88/a89/a90/a91/a92/a93/a94/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121/a122/a123/a124/a125 126/.notdef 190/a190/a191 192/.notdef 194/a194/a195 196/.notdef 200/a200 201/.notdef 202/a202/a203/a204 205/.notdef 206/a206/a207 208/.notdef 209/a209/a210 211/.notdef 215/a215 216/.notdef 224/a224/a225/a226/a227/a228/a229/a230/a231/a232/a233/a234/a235/a236/a237/a238/a239/a240/a241/a242/a243/a244/a245/a246/a247/a248 249/.notdef 251/a251/a252/a253/a254/a255] ->> endobj -626 0 obj << -/a33 586 0 R -/a34 583 0 R -/a35 587 0 R -/a36 588 0 R -/a37 589 0 R -/a38 613 0 R -/a39 590 0 R -/a40 591 0 R -/a41 592 0 R -/a42 593 0 R -/a43 594 0 R -/a44 595 0 R -/a45 596 0 R -/a46 597 0 R -/a47 598 0 R -/a48 615 0 R -/a49 616 0 R -/a50 617 0 R -/a51 618 0 R -/a52 619 0 R -/a53 620 0 R -/a54 621 0 R -/a55 622 0 R -/a56 623 0 R -/a58 599 0 R -/a59 600 0 R -/a60 601 0 R -/a61 603 0 R -/a62 602 0 R -/a63 614 0 R -/a64 604 0 R -/a65 491 0 R -/a66 492 0 R -/a67 493 0 R -/a68 494 0 R -/a69 495 0 R -/a70 496 0 R -/a71 497 0 R -/a72 498 0 R -/a73 499 0 R -/a74 500 0 R -/a75 501 0 R -/a76 502 0 R -/a77 503 0 R -/a78 504 0 R -/a79 505 0 R -/a80 506 0 R -/a82 507 0 R -/a83 508 0 R -/a84 509 0 R -/a85 510 0 R -/a86 511 0 R -/a87 512 0 R -/a88 513 0 R -/a89 514 0 R -/a90 515 0 R -/a91 605 0 R -/a92 606 0 R -/a93 607 0 R -/a94 608 0 R -/a95 609 0 R -/a97 516 0 R -/a98 517 0 R -/a99 518 0 R -/a100 519 0 R -/a101 520 0 R -/a102 521 0 R -/a103 522 0 R -/a104 523 0 R -/a105 524 0 R -/a106 525 0 R -/a107 526 0 R -/a108 527 0 R -/a109 528 0 R -/a110 529 0 R -/a111 530 0 R -/a112 531 0 R -/a113 532 0 R -/a114 533 0 R -/a115 534 0 R -/a116 535 0 R -/a117 536 0 R -/a118 537 0 R -/a119 538 0 R -/a120 539 0 R -/a121 540 0 R -/a122 541 0 R -/a123 610 0 R -/a124 611 0 R -/a125 612 0 R -/a190 584 0 R -/a191 585 0 R -/a194 542 0 R -/a195 543 0 R -/a200 544 0 R -/a202 545 0 R -/a203 546 0 R -/a204 547 0 R -/a206 548 0 R -/a207 549 0 R -/a209 550 0 R -/a210 551 0 R -/a215 552 0 R -/a224 553 0 R -/a225 554 0 R -/a226 555 0 R -/a227 556 0 R -/a228 557 0 R -/a229 558 0 R -/a230 559 0 R -/a231 560 0 R -/a232 561 0 R -/a233 562 0 R -/a234 563 0 R -/a235 564 0 R -/a236 565 0 R -/a237 566 0 R -/a238 567 0 R -/a239 568 0 R -/a240 569 0 R -/a241 570 0 R -/a242 571 0 R -/a243 572 0 R -/a244 573 0 R -/a245 574 0 R -/a246 575 0 R -/a247 576 0 R -/a248 577 0 R -/a251 578 0 R -/a252 579 0 R -/a253 580 0 R -/a254 581 0 R -/a255 582 0 R ->> endobj -627 0 obj -[777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8] -endobj -628 0 obj << -/Length 277 -/Filter /FlateDecode ->> -stream -xڝұN02XP?i"DR)`b@L -(y#GHı~y_^F宒%p[
O<X<mŽ}E XoeQؙX"{i -endstream -endobj -629 0 obj << -/Length 252 -/Filter /FlateDecode ->> -stream -xӱn0`GH'1S$Jfb ã(y\/:[2BxH>;g+[159#,]eg|@ϗ_h@/pÕ[Fq+:QŢyDUT*jyrWBT)WxS!4 -T:!UHI%jF'/~>
TFODD>9&>u>(
"sJw+ -endstream -endobj -630 0 obj << -/Length 272 -/Filter /FlateDecode ->> -stream -xmӱN0aG"ݒG=nZR)`b@L -endstream -endobj -631 0 obj << -/Length 329 -/Filter /FlateDecode ->> -stream -xՓN@!$(pwH3D+cGQxJ -8;Kstˢ8;anr_JxjNv_77?`ݐ7 - -KXb#H-#[/ZO,RI:Y}y-*%"ckqtvQ[h`t#Ix3'F5cqf#3vHF^ao8
1ꪏ,z -15u`vBuԮh
V6CIUZC8ғ'H/SnXYr -endstream -endobj -632 0 obj << -/Length 321 -/Filter /FlateDecode ->> -stream -xڅJ@'layx\<ZYZZ(ںy<J!e -ɺ;zBLfv^TgιӒK^.0*}0e7nLUi[6YϏW﮹0نΟLa9 -vn$y@
6c0%9_>֞}ْO_3Wdd@: tl1]:PN-i!i*PJAJe-zapHD92cr -\VQo8z܉^vfw?ēޟx+jA,ܛ_8@5 -endstream -endobj -633 0 obj << -/Length 440 -/Filter /FlateDecode ->> -stream -x}?n0ppD38
کC)!A;S[)AW?RCGdwj7~ܙz+4~n>= -˦jLxnkS]/|5u^LxQÈ<^4ER(OknMtORF7dbUjޢ2ף~0y4"=qaΡt؛z"7b.1z˱@.1Hz5cVz+ݣhpF!AZLq!HS/#K>vs;Wčc1zi|4$1KO.݉A.ឞ鯇sً/4w7J/YbŎGw[Aa`8'f.[c -endstream -endobj -634 0 obj << -/Length 257 -/Filter /FlateDecode ->> -stream -xڝJ@ba<Btν<VrZZ(Z'Q%?mllcgvfU<ݬ39%n$gK+뜹]V%+y}y{䰻>^j셨#-T:bEޠ3ޣ5tT'+ܘ94Dat4 -, -endstream -endobj -635 0 obj << -/Length 232 -/Filter /FlateDecode ->> -stream -xݒ;@R #$EH<$R[mJ -r"g"jK$|#f{xSAㄲ6 1),D;h~(,ōE3QfN +,d@~9VFW5[g+`ouh=<+iD -endstream -endobj -636 0 obj << -/Length 256 -/Filter /FlateDecode ->> -stream -xڍбJ@9R,LGyDU<Vbh<Z%2őM@+\~dwL -9˥ל߹,Iyypxpe͝|~|q_Ka'Od(с0Z1oT'r`$`"3 U|^{NQKv8=ԊxVڕv'Lvc_ӞD#:G2o~6cjYE~L,PjhB#Bj]\j!Viu -endstream -endobj -637 0 obj << -/Length 171 -/Filter /FlateDecode ->> -stream -x31ԳT0P0b3CB. -endstream -endobj -638 0 obj << -/Length 303 -/Filter /FlateDecode ->> -stream -xڭN@PL#ܼr\<)L0VjiG!0ع |3?-wۜtF'-=Fv״Cϸ1r٥cV_fs1;НHc} 3;RfN]d~N 졙@ur䛪zh=κz٧߇BиN)OWU%ÂMs2ʆ']! 6g!]j\:P&<h/r8O6s7zc7yf*=Ԟ^m#D5)Q -endstream -endobj -639 0 obj << -/Length 114 -/Filter /FlateDecode ->> -stream -x3635T0P -endstream -endobj -640 0 obj << -/Length 99 -/Filter /FlateDecode ->> -stream -x3635T0P -endstream -endobj -641 0 obj << -/Length 178 -/Filter /FlateDecode ->> -stream -x? -PC!K`NkT NzGPgDǗFL"kMIS9|4% vٔkg6f!1BD.! -endstream -endobj -642 0 obj << -/Length 234 -/Filter /FlateDecode ->> -stream -xڽ -0O[|4-MAAAѹ}>JAz%Ċ&zbG4ԏ&X:xF$͆lf!h%]/#jJ1m:%'\8|w65ESWG4] -endstream -endobj -643 0 obj << -/Length 246 -/Filter /FlateDecode ->> -stream -x͒n1ƍh@gDA
کbj;v -آ:+"jh
4;1<|_c߇Z|i}f|VQ9tZCQ:Uxw3 -endstream -endobj -644 0 obj << -/Length 163 -/Filter /FlateDecode ->> -stream -x1 -@a9lj!FpA+RKEh%G2Śu!
,QNsJi)4iMSr/XYT;KT+^Q5o3jUMښ -endstream -endobj -645 0 obj << -/Length 252 -/Filter /FlateDecode ->> -stream -xMбN@`W"yKPҲE*E"L02`C\%pc#A3|IˋV*i伖v#/5sZюۥƻã4-[+sZj{y:pZ鑈֪#QT`Pc )lnS43 - -endstream -endobj -646 0 obj << -/Length 170 -/Filter /FlateDecode ->> -stream -xС@&=}p -endstream -endobj -647 0 obj << -/Length 324 -/Filter /FlateDecode ->> -stream -xuұN0 -endstream -endobj -648 0 obj << -/Length 281 -/Filter /FlateDecode ->> -stream -xuN@XL#OH3D+cuZZhG7\'agMB;|</VpU+\W+oڰA}s>?_o\~KW<qsLDZbj#j)3(:R*G^b$VkRt=rB*R@! -Ms(h4M
x̋uyԁۆ>os9(oe(}&PkމO<gG[/iΒg ]{$8 -endstream -endobj -649 0 obj << -/Length 350 -/Filter /FlateDecode ->> -stream -xڍJ0,KymWSa]=yOу(y{(gIvAL1iiZ^TMmiz2M;VUo~U}1U/ -endstream -endobj -650 0 obj << -/Length 273 -/Filter /FlateDecode ->> -stream -xmұN0aYxr\\&:9'ut\WMP9i!24_[p\4؉6KۈRݼñQPݚc;ZPēySb)bNYPQQ$#RA藔Cʂr,^r䥂pdJ4{rKM\8L -endstream -endobj -651 0 obj << -/Length 205 -/Filter /FlateDecode ->> -stream -xڳ3V0P0b#CB.S -endstream -endobj -652 0 obj << -/Length 122 -/Filter /FlateDecode ->> -stream -xڳ43P0P04 -F -)\\@IrW07 -s{*r;8+r(DUry(a -'W -endstream -endobj -653 0 obj << -/Length 329 -/Filter /FlateDecode ->> -stream -xՓN@!$(pwH3D+cGQxJ -8;Kstˢ8;anr_JxjNv_77?`ݐ7 - -KXb#H-#[/ZO,RI:Y}y-*%"ckqtvQ[h`t#Ix3'F5cqf#3vHF^ao8
1ꪏ,z -15u`vBuԮh
V6CIUZC8ғ'H/SnXYr -endstream -endobj -654 0 obj << -/Length 121 -/Filter /FlateDecode ->> -stream -xڳ43P0P04 -F -)\\@IrW07 -s{*r;8+r(DUry(z?Y@~5jz8%Փ+ -endstream -endobj -655 0 obj << -/Length 123 -/Filter /FlateDecode ->> -stream -xڳ4ҳT0P0bs#CB.C -@-\. -alO#f?@k䁶@=e2G\= -endstream -endobj -656 0 obj << -/Length 359 -/Filter /FlateDecode ->> -stream -xmMN@!,Hf:'0I,Lt¸.]ht
G(sa0O&6i
7ʕnzKZ[%n-\ܵE{>lq-rm.L>iaffa#{lpU(saPDRrR.DQFb< -aQΓ3Gބ7p06 -{#yP"01NI75S.HRƬCu"nM^C_Lrl!c59`4\3=bYhF*Fkߗ0k1y"}dpe%mx2M -endstream -endobj -657 0 obj << -/Length 257 -/Filter /FlateDecode ->> -stream -xڝJ@ba<Btν<VrZZ(Z'Q%?mllcgvfU<ݬ39%n$gK+뜹]V%+y}y{䰻>^j셨#-T:bEޠ3ޣ5tT'+ܘ94Dat4 -, -endstream -endobj -658 0 obj << -/Length 315 -/Filter /FlateDecode ->> -stream -xڽ=NP -U%[W\A]^=秗{W/Nr)эk7OBG1A57jbfnw$IV(ńc^L3(i|縫~@|OeRvQd(|c^'OT#KpR49vfK/1%?`k_ou{g1~3GF3y^3/FZqL=Ű+Ƹ]o7Gt -endstream -endobj -659 0 obj << -/Length 208 -/Filter /FlateDecode ->> -stream -x}б0 - -d)DTP.N%S3@B_OS5VC]6u,3*
NGc:eebD7)|`5 Xg/a: -endstream -endobj -660 0 obj << -/Length 114 -/Filter /FlateDecode ->> -stream -x3530W0P -endstream -endobj -661 0 obj << -/Length 179 -/Filter /FlateDecode ->> -stream -x3733W0P0Q5T07Q05QH1*2(Cs<,=\ -%E\N -\. -ц -\. -C=|FB$1Pр`3A?P( (A)@/° -endstream -endobj -662 0 obj << -/Length 256 -/Filter /FlateDecode ->> -stream -xڍбJ@9R,LGyDU<Vbh<Z%2őM@+\~dwL -9˥ל߹,Iyypxpe͝|~|q_Ka'Od(с0Z1oT'r`$`"3 U|^{NQKv8=ԊxVڕv'Lvc_ӞD#:G2o~6cjYE~L,PjhB#Bj]\j!Viu -endstream -endobj -663 0 obj << -/Length 360 -/Filter /FlateDecode ->> -stream -xe1N@Eri{ *R.@T@Iږbc?3:wθ-]]ܖ}pWZLw]Q秗{W/N|銍V̍7>G+"z+Q7sDaNv:lM=c\x3Ϡ14,E0A)#ІP" E "0u(HBI$:u;zF9Ymb>_ݠcΘ4ƻ$J:$4KZC/4mou[qӝ: /];=rv/=FV6Gw6d:\M+w0_oߞn]/\> -endstream -endobj -664 0 obj << -/Length 258 -/Filter /FlateDecode ->> -stream -xuMJAKF]ОN+*tzh}9,g|tWeVT
]WT/-'.VR-g﹌}ﯟw[ -7zvCP -endstream -endobj -665 0 obj << -/Length 217 -/Filter /FlateDecode ->> -stream -xUϱj@Zlk M -ɔ!dj;fhi˛ՏGct@n?h< -_<4sȇ,{4oA7o z} -5VGhVh{nP*<P$ Vp c2!'{G1!ꅎhL,(LR0\PcBgA11a.eX_߆u;L1 -endstream -endobj -666 0 obj << -/Length 267 -/Filter /FlateDecode ->> -stream -xڝұJ0S:Ghh)pIs>JcŐxI$INJىԖ6[;3Flo0`{I؎W ݫ^u8U1@=Om&^n+p -endstream -endobj -667 0 obj << -/Length 260 -/Filter /FlateDecode ->> -stream -xU1N0EJi9IAҲH@Q%jrH\ 2`-[OOvZVh{H`_qˋgRjHyS)+}{}rs}[~)ama6 -endstream -endobj -668 0 obj << -/Length 171 -/Filter /FlateDecode ->> -stream -x3734W0P0b3SSCB.3 -%E\N -\. -ц -\. -<C
[5;]O, -endstream -endobj -669 0 obj << -/Length 274 -/Filter /FlateDecode ->> -stream -xu1N0PG)"M#'eH -()@P;+- -;R"jR6*2I~"ӧ[~)gn#AdHY&NJzL?^e2WP{e|;#m|Q LPIetP$NࠁqfU -endstream -endobj -670 0 obj << -/Length 120 -/Filter /FlateDecode ->> -stream -x373P0Pb3#SCB.S# -endstream -endobj -671 0 obj << -/Length 234 -/Filter /FlateDecode ->> -stream -xڽ -0O[|4-MAAAѹ}>JAz%Ċ&zbG4ԏ&X:xF$͆lf!h%]/#jJ1m:%'\8|w65ESWG4] -endstream -endobj -672 0 obj << -/Length 118 -/Filter /FlateDecode ->> -stream -x373P0Pb3#SCB.S# -endstream -endobj -673 0 obj << -/Length 246 -/Filter /FlateDecode ->> -stream -x͒n1ƍh@gDA
کbj;v -آ:+"jh
4;1<|_c߇Z|i}f|VQ9tZCQ:Uxw3 -endstream -endobj -674 0 obj << -/Length 221 -/Filter /FlateDecode ->> -stream -xڽ+@gSdLй -r#[<"换59\d.rBNi#5[S nao,xkn`" $\*@)J@FU)HC
/n?VVLw_smݮNKڻz9X?தj{y\} -endstream -endobj -675 0 obj << -/Length 122 -/Filter /FlateDecode ->> -stream -x3336W0P0bSKSCB.SS -I;bՓ+ -endstream -endobj -676 0 obj << -/Length 292 -/Filter /FlateDecode ->> -stream -xeѱN@%$;/yvg"VJ--4Z=#`.{gDk<(6Xj>5xy5?zyM#V5|Es_oPlqVh٢RD&71vfr䱂cv̨АSIhȨczR7ÏUi]'8$Iz,@;(|UȁN/q{Cd6#*l* %_b$ȂeGw?2!-FYϔO}'cPVBi.' -endstream -endobj -677 0 obj << -/Length 310 -/Filter /FlateDecode ->> -stream -x;N0RDr#d. -D
Bόzh(vЧ]4Ut|ZR]ӢB=Zj*bRF7T*7*_mAN5+0DO`kxˀ -endstream -endobj -678 0 obj << -/Length 281 -/Filter /FlateDecode ->> -stream -xuN@XL#OH3D+cuZZhG7\'agMB;|</VpU+\W+oڰA}s>?_o\~KW<qsLDZbj#j)3(:R*G^b$VkRt=rB*R@! -Ms(h4M
x̋uyԁۆ>os9(oe(}&PkމO<gG[/iΒg ]{$8 -endstream -endobj -679 0 obj << -/Length 130 -/Filter /FlateDecode ->> -stream -x3736Q0PT5T07V05QH1*23D Rɹ\N\ -f\@q.}O_T.} -endstream -endobj -680 0 obj << -/Length 144 -/Filter /FlateDecode ->> -stream -x37ֳ0Q0Pb3SSCB.SS -endstream -endobj -681 0 obj << -/Length 147 -/Filter /FlateDecode ->> -stream -x3435V0PT5T040Q05QH1*4 -(Cs<,M=\ -%E\N -\. -ц -\. -300`bealC mfaʖ -endstream -endobj -682 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xڳ43P0PbSCB.s -endstream -endobj -683 0 obj << -/Length 179 -/Filter /FlateDecode ->> -stream -x33ճ0W0Pb3CSCB.SC -@-\. -@?(( 8 -endstream -endobj -684 0 obj << -/Length 239 -/Filter /FlateDecode ->> -stream -xڍJAD+xOHpBL=!(-||J>a{ikҮ"2𘚭~>\O$h1H!ȋbOdTIvE슲dյ?J6Tc3j8Jt̬
#X&DQcAY
H+^D\$Α8ݾz-_t[[t YϞh><-äMPOd>yej7ֻn6mdRT>Ė -endstream -endobj -685 0 obj << -/Length 238 -/Filter /FlateDecode ->> -stream -xڅбn0`G"# -]f%K,ЮИIǘ 8%MTBoh-yU;q]mhĄ[!ט7W3fW҉b."DH ̦W@N\Wǜ]ƾr=xbTNgxma -endstream -endobj -686 0 obj << -/Length 102 -/Filter /FlateDecode ->> -stream -x31ճP0P0T02Q0T06TH1*26 -(C$s<=BIQi*S!BA,B? -endstream -endobj -687 0 obj << -/Length 89 -/Filter /FlateDecode ->> -stream -x334W0P04F -& -)\\@ -p{IO_T.} -endstream -endobj -688 0 obj << -/Length 157 -/Filter /FlateDecode ->> -stream -x337T0P04 -& -)\\& - ,ɥ`bɥU()*Mw -pV0wQ` -endstream -endobj -689 0 obj << -/Length 298 -/Filter /FlateDecode ->> -stream -xڍ1N0Eg"49B|Adw;K" * -D.SX<G -DJ^$žW[Rkg4'^8bN}~|awV=v'jq<)"Q~Fdt0ēt *
t7dSib
6aڙWnO0]FPJ -endstream -endobj -690 0 obj << -/Length 318 -/Filter /FlateDecode ->> -stream -xڥJ0SȥyV[a]=yAP}>JBHa#2 -1'XWtګm[Wƻ]^Ǔ+WgPrε;0b0iq;јdD^_ KvĐSCql1#rSNV8٠+EX_7RE30:cXmVS] AҋtZlAFo˞$%ق >'/*S3|)Ê呕RXTWSԑbFz -Nk{Yg"Hcel|p筻v? - -endstream -endobj -691 0 obj << -/Length 233 -/Filter /FlateDecode ->> -stream -xѱn0`#[x b
)M2TjUcVI^%oRq5HeY'۲b]`K?nO(sߎ#lkX`) ~>n -endstream -endobj -692 0 obj << -/Length 258 -/Filter /FlateDecode ->> -stream -xŒJ@S -r#4/-VXWAOēzÊG#̡4&U*|L2I=(iC5VTV\Fjϭmݵ7n{{I%=#;JXçs;gwA<Ba5aLBY5SH$d<F/)"Y#t ĶcD7;xztҜ ;t<w16D?!zT#Fc3-;2& -endstream -endobj -693 0 obj << -/Length 303 -/Filter /FlateDecode ->> -stream -xڅ;N@E.,MG\ -|&ؓWXP*@}P7Po=BA\I=:!b*#)G7*#[Q -i -isf 7#ⳒC<Ȕȼ%ؖ2uq=
R]( &'}$KxmjoS["||q]RzkcVI6gp| ; -endstream -endobj -694 0 obj << -/Length 220 -/Filter /FlateDecode ->> -stream -xڭѱ -PA8KyZxs hƆf{4Gpto^5!ADg.:q"?x}?;31-zز>v9"A{#LJ8lH˫!2)REŃhB -AYfK#m"PDRRhNAN -N]Ju*ۡZ'Զ_b}?6atV -endstream -endobj -695 0 obj << -/Length 283 -/Filter /FlateDecode ->> -stream -xڭN@2%P -endstream -endobj -696 0 obj << -/Length 322 -/Filter /FlateDecode ->> -stream -xڍ=N0mmM -|!e()g<?old)gؘ8\Skl{Sƚ -ǦۛjL=ݛ~GJ>3% -<*>Z0'G2CwB`c5xrs/`^[)=/x4 -;"Bx'BIvCBj_U! -7d2JUkQ:կ&#.- HḂ!,Хw"F -eonF& -endstream -endobj -232 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F38 -/FontMatrix [0.00836 0 0 0.00836 0 0] -/FontBBox [ 1 -25 127 86 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 45 -/LastChar 255 -/Widths 697 0 R -/Encoding 698 0 R -/CharProcs 699 0 R ->> endobj -697 0 obj -[45.8 38.17 0 0 68.71 68.71 68.71 68.71 68.71 68.71 68.71 68.71 68.71 0 0 0 0 0 0 0 0 91.69 0 99.32 0 0 0 0 0 0 0 0 0 98.1 100.54 0 0 0 76.34 0 0 0 129.93 0 0 0 0 0 0 0 0 0 65.87 70.68 0 0 62.66 41.99 68.71 0 32.51 0 0 32.51 0 70.68 68.71 70.68 0 46.79 52.67 0 70.68 0 93.58 63.04 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 83.97 95.58 0 0 99.3 0 95.58 100.54 95.58 0 0 92.9 91.76 0 0 0 0 0 0 0 0 0 0 0 0 65.87 68.71 65.87 55.07 77.67 62.66 101.21 61.07 73.84 73.84 66.86 74.17 92.28 70.68 68.71 70.68 70.68 61.07 62.37 63.04 105.03 63.04 77.34 73.84 0 108.53 0 93.58 65.87 61.07 0 70.34 ] -endobj -698 0 obj << -/Type /Encoding -/Differences [45/a45/a46 47/.notdef 49/a49/a50/a51/a52/a53/a54/a55/a56/a57 58/.notdef 66/a66 67/.notdef 68/a68 69/.notdef 78/a78/a79 80/.notdef 83/a83 84/.notdef 87/a87 88/.notdef 97/a97/a98 99/.notdef 101/a101/a102/a103 104/.notdef 105/a105 106/.notdef 108/a108 109/.notdef 110/a110/a111/a112 113/.notdef 114/a114/a115 116/.notdef 117/a117 118/.notdef 119/a119/a120 121/.notdef 199/a199/a200 201/.notdef 203/a203 204/.notdef 205/a205/a206/a207 208/.notdef 210/a210/a211 212/.notdef 224/a224/a225/a226/a227/a228/a229/a230/a231/a232/a233/a234/a235/a236/a237/a238/a239/a240/a241/a242/a243/a244/a245/a246/a247 248/.notdef 249/a249 250/.notdef 251/a251/a252/a253 254/.notdef 255/a255] ->> endobj -699 0 obj << -/a45 686 0 R -/a46 687 0 R -/a49 688 0 R -/a50 689 0 R -/a51 690 0 R -/a52 691 0 R -/a53 692 0 R -/a54 693 0 R -/a55 694 0 R -/a56 695 0 R -/a57 696 0 R -/a66 628 0 R -/a68 629 0 R -/a78 630 0 R -/a79 631 0 R -/a83 632 0 R -/a87 633 0 R -/a97 634 0 R -/a98 635 0 R -/a101 636 0 R -/a102 637 0 R -/a103 638 0 R -/a105 639 0 R -/a108 640 0 R -/a110 641 0 R -/a111 642 0 R -/a112 643 0 R -/a114 644 0 R -/a115 645 0 R -/a117 646 0 R -/a119 647 0 R -/a120 648 0 R -/a199 649 0 R -/a200 650 0 R -/a203 651 0 R -/a205 652 0 R -/a206 653 0 R -/a207 654 0 R -/a210 655 0 R -/a211 656 0 R -/a224 657 0 R -/a225 658 0 R -/a226 659 0 R -/a227 660 0 R -/a228 661 0 R -/a229 662 0 R -/a230 663 0 R -/a231 664 0 R -/a232 665 0 R -/a233 666 0 R -/a234 667 0 R -/a235 668 0 R -/a236 669 0 R -/a237 670 0 R -/a238 671 0 R -/a239 672 0 R -/a240 673 0 R -/a241 674 0 R -/a242 675 0 R -/a243 676 0 R -/a244 677 0 R -/a245 678 0 R -/a246 679 0 R -/a247 680 0 R -/a249 681 0 R -/a251 682 0 R -/a252 683 0 R -/a253 684 0 R -/a255 685 0 R ->> endobj -700 0 obj << -/Length 131 -/Filter /FlateDecode ->> -stream -x34431W0P0 - -)\\@0,ɥ`ḁU()*Mw -pV0wQ6T0tQ|v Q(sIef=i -endstream -endobj -701 0 obj << -/Length 319 -/Filter /FlateDecode ->> -stream -x͒1N0E4M -endstream -endobj -702 0 obj << -/Length 265 -/Filter /FlateDecode ->> -stream -xڕұ@5&{V$&Rhea+rh<p%qw gѰa8h Q.2}Y{qBzŦOz&I's/>9"=uᆒ zR'*atRtlڽnԂR^(P 4HUOZ|oO\r(|nz
_&R̪\]-$^꾲/ʾ*A6ԁd![vxcP/mg<suP4MhIvħ -endstream -endobj -703 0 obj << -/Length 208 -/Filter /FlateDecode ->> -stream -x -@ -endstream -endobj -704 0 obj << -/Length 342 -/Filter /FlateDecode ->> -stream -x픱N@!$7/JNH3D+cGG().M [3(NP@'gpyR"ŻJ\-p{obR7f]-|~||wwR{xP<fZȎTab$=fudP>S
N,Xm,fU{#l$]) -3z=Iɱ=vxz(:Q=u=!f23}حr_WgpGpaXs-Z{V.:
MF.P*rfm;53@Y$ -f VpbƔĸyv5 -endstream -endobj -705 0 obj << -/Length 170 -/Filter /FlateDecode ->> -stream -xӱ -1 - vtr'utPt 7:ڦe/ $SHʉP"4hGoPEUX>~ѬH Z=>G:2r%,#wQ6}"+MG,>{`a`oD^ -endstream -endobj -706 0 obj << -/Length 384 -/Filter /FlateDecode ->> -stream -xڵN0Fe%?+eTD$02`-G!cmiU?绷r*|IυBrA{Kolհ/Ӭjn+V\jY
3%(ўRCcnaGkEy:2f$(p -;Q:Ej[ag]詂hz>]5B/%dq=?ъC%sЫcD ,uo1\|&OaH`&e(-0\~V?l#Zm]#\.b7)9%2Vp
\Q ic.uĥQ -endstream -endobj -707 0 obj << -/Length 429 -/Filter /FlateDecode ->> -stream -xڽN0e%P -endstream -endobj -708 0 obj << -/Length 297 -/Filter /FlateDecode ->> -stream -xӱJ0,} l+xSz;:9A9wktsfKIsCTze4QϪmFhֽnu۪mү/oZ_FU}^` DdA,"
g$D -dN`Y2Α!aJP9=!KbYip NHARmMV@9VUU,9wHW!](e>waG܅g1?1ǿ?uѫ
bp -endstream -endobj -709 0 obj << -/Length 339 -/Filter /FlateDecode ->> -stream -x1N0E4M -D=bbp.poGᭅXb\ȷ{XU_r)C^cbq
U9h=n~[B%KJ2 ҍn'&vaUS1v4KRi(\QGt䩚F,7_l?TPD3LۈKƚeۈXz=0fM@/as^%;^*1aMaCsJmpF]GS^n="9yPwH*"'\ -endstream -endobj -710 0 obj << -/Length 439 -/Filter /FlateDecode ->> -stream -xڭԽN@%Wl
z9ϊD -,ZZh>
ca##PRƝ@*%9wDZ&ϲՑZCK}'^o3yզT^/Uz߫/ϯ*\\&٭*O#^ -X-9n])f*l\مͳai?,)8BC -G@0*fa^f8;h&gokdD+sp逭䔝.SUlg̱IBF42`FDP"B3[z~>pa=!!",sBwHM3F@ЌZN-|7 -=TgR; -endstream -endobj -711 0 obj << -/Length 275 -/Filter /FlateDecode ->> -stream -x͓N0et{V%LJȀDed -Q+c0<2
@Y_kw$&Tg79,={ -endstream -endobj -712 0 obj << -/Length 403 -/Filter /FlateDecode ->> -stream -x͔?N0[e%G/ -4y.]@kYpev(0!B/)eL+@,TShO)D sP=&C)'oIQ]G,z.;u> -endstream -endobj -713 0 obj << -/Length 444 -/Filter /FlateDecode ->> -stream -xڥN0Su+@J"" & 7#G!qF:4CrytB__<_\}W3^?ԦT^/UzG*-ϻJ77:WV?:{QVG -BY@r䖰KbDÀN45mDVQ#;e#\f/jc=0#DHĖhG8ۋb@,aN1LVNk$-bAC(ebDK( -q9Y\pf9.W#@8U'1xh'^=uAhj:" 4T!
XErз?L$D%4F7E(nK -endstream -endobj -221 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F36 -/FontMatrix [0.00581 0 0 0.00581 0 0] -/FontBBox [ 3 -2 103 117 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 48 -/LastChar 235 -/Widths 714 0 R -/Encoding 715 0 R -/CharProcs 716 0 R ->> endobj -714 0 obj -[100.67 100.67 100.67 100.67 100.67 100.67 100.67 100.67 100.67 100.67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 110.47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96.87 0 96.87 0 0 0 0 0 0 0 0 107.52 ] -endobj -715 0 obj << -/Type /Encoding -/Differences [48/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57 58/.notdef 195/a195 196/.notdef 224/a224 225/.notdef 226/a226 227/.notdef 235/a235] ->> endobj -716 0 obj << -/a48 704 0 R -/a49 705 0 R -/a50 706 0 R -/a51 707 0 R -/a52 708 0 R -/a53 709 0 R -/a54 710 0 R -/a55 711 0 R -/a56 712 0 R -/a57 713 0 R -/a195 700 0 R -/a224 701 0 R -/a226 702 0 R -/a235 703 0 R ->> endobj -717 0 obj << -/Length 121 -/Filter /FlateDecode ->> -stream -x3135R0P0bc3SSCB.# -endstream -endobj -718 0 obj << -/Length 228 -/Filter /FlateDecode ->> -stream -xmαJ@o"0M^ป'pWSZY `eh>J+5E~;Yct_^iC-/+9u'Zst}{}<ZFojn(-~ـ8#J^Q0Cc0D_:sNar$_[-> ,, -%s'l"aAZқMY'W
Tc| -endstream -endobj -719 0 obj << -/Length 235 -/Filter /FlateDecode ->> -stream -xu1N0ЉRX`3 -endstream -endobj -720 0 obj << -/Length 188 -/Filter /FlateDecode ->> -stream -xڕν -@+At-('kotrP?Q_ I+F!=ړ,o)$G$'KROt8oH&{$S^zVSBĢ -i -endstream -endobj -721 0 obj << -/Length 226 -/Filter /FlateDecode ->> -stream -xڕϿjAnas=b!j WJ!`R -nGG8̜EH:_1;dySpnyΟ9)_6[d?9oR&[}";YL9#;e銊ҺpQ*+j .+xs7xĕ\ }rR
/:tKuNTc'ې'jiT2Dׂ+X -endstream -endobj -722 0 obj << -/Length 243 -/Filter /FlateDecode ->> -stream -xmJ@O"p}dXW0j)h()SDm>{uuVZjG+9}Mjag"VNbkx|JV+-*@ Ps&[D>#E@rI~2<vKi6 bD1 FŞ~ 00!?*B~I&)=d5!y"`;e+
Mo -endstream -endobj -723 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xڕα -@HB}Ѽ]`A'u(GQ|TZ?$w#3ihdȎhC!s8cТZp*Yz?WS2f5wHPQY 4a:B@81n --SQR-8 -d_Ѯ+J_<!t<5~ -endstream -endobj -724 0 obj << -/Length 265 -/Filter /FlateDecode ->> -stream -xMJ@Eo[8м$AB`B]W҅E ;#Ǜ*y{wquLZZj}%OR7KmN~&wlֺ₲<>H\i%Jo*-o])L O[ -`;d1a3X`LpM6{{x<P#zz[\6&GiHl]>SHp|tO01l6 i4,e3zwgRS@v -endstream -endobj -725 0 obj << -/Length 237 -/Filter /FlateDecode ->> -stream -xu1N0бRD@\ - -endstream -endobj -216 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F16 -/FontMatrix [0.01204 0 0 0.01204 0 0] -/FontBBox [ 2 -2 41 56 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 49 -/LastChar 57 -/Widths 726 0 R -/Encoding 727 0 R -/CharProcs 728 0 R ->> endobj -726 0 obj -[41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 ] -endobj -727 0 obj << -/Type /Encoding -/Differences [49/a49/a50/a51/a52/a53/a54/a55/a56/a57] ->> endobj -728 0 obj << -/a49 717 0 R -/a50 718 0 R -/a51 719 0 R -/a52 720 0 R -/a53 721 0 R -/a54 722 0 R -/a55 723 0 R -/a56 724 0 R -/a57 725 0 R ->> endobj -729 0 obj << -/Length 235 -/Filter /FlateDecode ->> -stream -xUбj0`['lf2.C2Li-jM*~<fVN*I_XbNȱx`:Οp]0|_>^0S1uSN:&^B;grA3pU9IF2x&UB$)n Ќ'( #GҾ$t5
" -endstream -endobj -730 0 obj << -/Length 247 -/Filter /FlateDecode ->> -stream -x}нJ@ -(F#8r ?laɚ='_Hyt[}@Mm}Ɗf1`HGgͥ -endstream -endobj -731 0 obj << -/Length 246 -/Filter /FlateDecode ->> -stream -xڍj@e5hHޠwΟB!NJct(~JTt~gt|4ѽD(ڽFD
o*-$ -endstream -endobj -732 0 obj << -/Length 235 -/Filter /FlateDecode ->> -stream -xڅѱN@`W"y#O%TvTD$P'`d -vY~ç̚JdD$G[o=Cܙ -endstream -endobj -733 0 obj << -/Length 159 -/Filter /FlateDecode ->> -stream -x33T0P -%E\N -\. -ц -\. - -endstream -endobj -734 0 obj << -/Length 147 -/Filter /FlateDecode ->> -stream -x313P0P0bS3SCB.HrW0 -endstream -endobj -735 0 obj << -/Length 250 -/Filter /FlateDecode ->> -stream -x};N0 )"M#x. -VK-GR@;R,$Rdi..[ro:z#Mnz~mFh[:?^nȣѣ' -endstream -endobj -736 0 obj << -/Length 166 -/Filter /FlateDecode ->> -stream -x3г0R0P -endstream -endobj -737 0 obj << -/Length 127 -/Filter /FlateDecode ->> -stream -x3230W0P -F\@Q.}O_T.} -B
BdpY -endstream -endobj -738 0 obj << -/Length 144 -/Filter /FlateDecode ->> -stream -x31ѳP0P0bcSCB.cS -endstream -endobj -739 0 obj << -/Length 292 -/Filter /FlateDecode ->> -stream -xeAN -endstream -endobj -740 0 obj << -/Length 233 -/Filter /FlateDecode ->> -stream -xuбn0`[H'
$P:Dڎ%k!OGȫPAֱ "w|.n[130· -7Cd}ʷ -endstream -endobj -741 0 obj << -/Length 272 -/Filter /FlateDecode ->> -stream -xڅ1N@E&G_ -endstream -endobj -742 0 obj << -/Length 207 -/Filter /FlateDecode ->> -stream -xڅ= -@ )xdN+PG(9B!̮ED4oxv44yD1ZC&$q8,G%kP/9EvPsJQgK15 -č'= -endstream -endobj -743 0 obj << -/Length 230 -/Filter /FlateDecode ->> -stream -xmб0#LnX h`"QLd08Fg}4G`thkELL(_zG'I"G25siN{ -F9UQUKyQrRBhb -endstream -endobj -744 0 obj << -/Length 257 -/Filter /FlateDecode ->> -stream -xu1N@E4{BpED)9Z#t0;QDiVfvW%ׁovT*znsuKgj*U{Ϗw*W\&n -m0jVgfS&B9E1)V19O_jLoFAvH$jL)59هK?]GOTR{~ -endstream -endobj -745 0 obj << -/Length 145 -/Filter /FlateDecode ->> -stream -x3535T0P04f - -)\\ - es<L
=\ -%E\N -\. -@b<] - -endstream -endobj -746 0 obj << -/Length 216 -/Filter /FlateDecode ->> -stream -x}бj0x0ܒG@+)झPh!S1CC:ۏG#xtbl_ٲs͚rCe=|ʓ9paɼ=η7cǎLGDf -e#}
e5 -endstream -endobj -747 0 obj << -/Length 299 -/Filter /FlateDecode ->> -stream -xeѱN0`G,ݒG$@2E*E"L02`C# o7V#zRLْ뮚\{D9WBUbSo.o`@v.c<9wאOEB\"_BkXKt7J֨tDE:TBu9_AɇfhP5P-*ߖ*U[-#mԒF9R&YR*'R "E%|Q#IDx(3ԆG_^$%GV#ܒ"a$Ɇb$'Qgv< -endstream -endobj -748 0 obj << -/Length 294 -/Filter /FlateDecode ->> -stream -xMN@\A2
>.^Er&ZY+h<o!?Xl>fv>;߹mqv[W_Jߴ#.c/^jqj-*W>j{tD$$M:I@;EI:lZȀC&D)<Jfr(Qʠ e$)ƔAcʀџʹp4+%/`LmV^c̾Oe}@?P}ð!!뚲ĵ̔a.jzѫVPDt -endstream -endobj -749 0 obj << -/Length 143 -/Filter /FlateDecode ->> -stream -x31ѳP0P0bSSCB.3 -endstream -endobj -750 0 obj << -/Length 268 -/Filter /FlateDecode ->> -stream -xuNP`Ls^y=5HheaBh< -%afNA4|9sg/ -ʨ%3z
3Z,=7F_r;z){zG -endstream -endobj -751 0 obj << -/Length 272 -/Filter /FlateDecode ->> -stream -xUбJ@ W#>I<[8O0Xm6oGM4ba+vn93 N~iVWzEJ_x͒_-;,uXv'顮ZWm4@$jy&_BN 5 -TI1OlQE4 d,SԚ -B1ƹ/\bc\Q8Qk47/8ƌˌxY=lLxa~}P -endstream -endobj -752 0 obj << -/Length 261 -/Filter /FlateDecode ->> -stream -xE1N@G(H^vk"VJ--4Z8#}b,_3{uvXkp?8h^[zu_Z\=y"Y"y$JEY -dIzz`=x@o7Kdo7Kd/1mř2fD|ў6VOo{)Tdp4m(W m<l윿 -endstream -endobj -753 0 obj << -/Length 213 -/Filter /FlateDecode ->> -stream -x}ѽ0[x ,@t"ALd08FWxP&>˯w_/\]%+yݶmD M'{|>wa4L7/iX6cNAl06z^&PS[2*uf>.Ɵ(kd*v!Օ]ȔL(ki#ȥM?) -endstream -endobj -754 0 obj << -/Length 164 -/Filter /FlateDecode ->> -stream -x3533S0P -endstream -endobj -755 0 obj << -/Length 272 -/Filter /FlateDecode ->> -stream -xڅ1N@E&G_ -endstream -endobj -756 0 obj << -/Length 163 -/Filter /FlateDecode ->> -stream -x3533S0P -endstream -endobj -757 0 obj << -/Length 254 -/Filter /FlateDecode ->> -stream -xM1N0A)"M#' #H" * -D hqfD5rM"Yv7dOgNZ<ֺF֫D=5\_6x|z}{iewcM$W5 -endstream -endobj -758 0 obj << -/Length 294 -/Filter /FlateDecode ->> -stream -xMN@\A2
>.^Er&ZY+h<o!?Xl>fv>;߹mqv[W_Jߴ#.c/^jqj-*W>j{tD$$M:I@;EI:lZȀC&D)<Jfr(Qʠ e$)ƔAcʀџʹp4+%/`LmV^c̾Oe}@?P}ð!!뚲ĵ̔a.jzѫVPDt -endstream -endobj -759 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xm1 -@/4!s݄"U F0Xuy=GHg@qQYx]NSyă㔷(N4-yl'+g|:w#r"TTJd.j\ -endstream -endobj -760 0 obj << -/Length 264 -/Filter /FlateDecode ->> -stream -xuнJ@ -endstream -endobj -761 0 obj << -/Length 189 -/Filter /FlateDecode ->> -stream -xUα -0 -endstream -endobj -762 0 obj << -/Length 129 -/Filter /FlateDecode ->> -stream -x3635S0P -endstream -endobj -763 0 obj << -/Length 199 -/Filter /FlateDecode ->> -stream -xuб03$B@ILtr0Nx4G`d k!Kk5&)4xȟ+5֎;rɚeY2G -h}Q
aѪ:_t -0r)J]*U23\
AG
cH n$t -endstream -endobj -764 0 obj << -/Length 196 -/Filter /FlateDecode ->> -stream -xڅ1 -@RIkn`L!he!Vj)hf9GHi!'A+Wa
<~ÔZ
6[Kf1b@&_N8#3m2< $H@
%§H?jRvH/J\:VDj"BNYA+zоX, -endstream -endobj -765 0 obj << -/Length 261 -/Filter /FlateDecode ->> -stream -x-1N0mi>hPZZHPQ *}`ndl -6fF*,6S;k+OHAh* -endstream -endobj -766 0 obj << -/Length 198 -/Filter /FlateDecode ->> -stream -x]= -@_*axt
U0X٣y=BJq' -|y{l;t&;bD̆"d%_/#j)oá3F$%K
d""(|T" -?E$R)z+_ -E-#mQ;Z -<5^"Ci3sZvPQ -endstream -endobj -767 0 obj << -/Length 201 -/Filter /FlateDecode ->> -stream -x== -@ir .I -+P4<G&`5^ b8kT)~]ie - -K&^'Q3XwmCٹ}#UNRH?S/kF_?U7đ"MXIAɉ2c) -endstream -endobj -768 0 obj << -/Length 245 -/Filter /FlateDecode ->> -stream -xڅбJ@?L}sn<VbYZ(Zz -A:9ϷW} -endstream -endobj -769 0 obj << -/Length 194 -/Filter /FlateDecode ->> -stream -x=; -@ )vN&W+PN+6[FoŌTR 1H>KwІƋA9
lʭ<+n)3IO\z;\QbAтbap;倶hI٪H{Gp@wECZݒn@Q'bGUxh45K;W -endstream -endobj -770 0 obj << -/Length 175 -/Filter /FlateDecode ->> -stream -xmν@.<}n$7`Ah< -p#0ۦ)OEsJth3@#.2yAV#7O(r?6kXFL+n\8o#ʘZK0ViT5q-poXt -endstream -endobj -771 0 obj << -/Length 220 -/Filter /FlateDecode ->> -stream -xUͱN02X%{ҨrJPN ;jdMjR$cZN'兼Mx/5ʚ(Ƹx^dX5zxjvCO@;-@2|; 6;&RT0LD;1O.'c܁vPP~TvD[fNm3Q0L x -endstream -endobj -772 0 obj << -/Length 152 -/Filter /FlateDecode ->> -stream -x31ҳT0P0bScsCB.c -endstream -endobj -773 0 obj << -/Length 208 -/Filter /FlateDecode ->> -stream -xm1N04 -$(PRv.]X&Q - -Wfp-sswo>;jrO^?4{HNcr=;=ܰ'wg
gl`DZdD#2!aFuNU&+uBU62S1YRcg٘0ꖈ0A45lV$ZhF?ہ*\ -endstream -endobj -774 0 obj << -/Length 151 -/Filter /FlateDecode ->> -stream -x31ҳT0P0bScsCB.c -endstream -endobj -775 0 obj << -/Length 224 -/Filter /FlateDecode ->> -stream -x}1n@б(,MG\ -)."*JPRAm߄X|tay, -GZ=jgh&c0zd*%]cI؈g/6& ]9] -s% -Qk8AK3'y;]54DxկW/\ʠ$SSVӜǨ7nUMHݲfm+$lL -endstream -endobj -776 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xu= -@_&2uI),J--d)qJxxܳYNGt4p;Ҹ 4#3טLz 3^NؒFTLH -endstream -endobj -777 0 obj << -/Length 133 -/Filter /FlateDecode ->> -stream -x330S0PbcsCB.c -endstream -endobj -778 0 obj << -/Length 230 -/Filter /FlateDecode ->> -stream -xM=N@RD&G\ -endstream -endobj -779 0 obj << -/Length 286 -/Filter /FlateDecode ->> -stream -xڍҽJ@ -endstream -endobj -780 0 obj << -/Length 222 -/Filter /FlateDecode ->> -stream -x51j@EB09A֒+@T*qetaYC.&EԥUJkRcgv):NUV* FVo|z{zBZ7JVu \/.6m2.뀴[ -endstream -endobj -781 0 obj << -/Length 170 -/Filter /FlateDecode ->> -stream -xu100KmZI;`A3pFBE
)=ך-h&#R1E1%P zGS|OJ _;ryAn$gt$h2 Zn߀jvIa"HO_ -endstream -endobj -782 0 obj << -/Length 152 -/Filter /FlateDecode ->> -stream -x3133V0P04& - -)\\Ʀ@IrW06 -s{*r;8+r(DUry(` -endstream -endobj -783 0 obj << -/Length 153 -/Filter /FlateDecode ->> -stream -x3333S0P -endstream -endobj -784 0 obj << -/Length 173 -/Filter /FlateDecode ->> -stream -x333P0P0S54V03S06WH1*2(¤s<L-=\ -%E\N -\. -ц -\. -0?ь?0EC7`@ `@G`ЀNC0:"?ь?\= -endstream -endobj -785 0 obj << -/Length 194 -/Filter /FlateDecode ->> -stream -xm=0p ,D&Ltr0NUf#024TC4/7I#L$3dxILudK;8!.WxO[A4c,hxj Qe1CQ&-`kZOICq_~PRuԄ1t66oop -endstream -endobj -786 0 obj << -/Length 170 -/Filter /FlateDecode ->> -stream -xu1 -PH!K`N{ҩP+A'qRGEWۣ(=BD1 ĥ,M'܌ ^9ɯsfKΡY_z?sJKAKa~AbN -endstream -endobj -787 0 obj << -/Length 194 -/Filter /FlateDecode ->> -stream -xu= -Pa!l#d//1U0X`9G)SI+f?Y7!y҉\aQsh]4&rɎcNxEJ'#H$DJ"<LDE?$"@}ZxE`t --pDDTy -endstream -endobj -788 0 obj << -/Length 198 -/Filter /FlateDecode ->> -stream -x]αJ@?Xf!IqX-'BB,->Z%2EȺZi13];jmn74)s!^܋v4?]Nq'}m~q<-bedP*P+3d'ZŸ6ke6]C$7Z\͜v'@7ZBL*<'\ -endstream -endobj -789 0 obj << -/Length 94 -/Filter /FlateDecode ->> -stream -xMɻ@PE|c&#q BT(xU]mixtԄiI1.v̐ɩ2 -^e@m -endstream -endobj -790 0 obj << -/Length 89 -/Filter /FlateDecode ->> -stream -x3230W0P -\ -\ -%E\N -\. -ц -\. - 'W -endstream -endobj -791 0 obj << -/Length 233 -/Filter /FlateDecode ->> -stream -xmпN0?I۔lJȀbF͏GȘ!T]~'OW|'^YcM/lYq&ϴ%{)m?\sMvw5Wm( -R0*Y=P~u/贛c\8qd:ǐT>.3Y̒Ke o -endstream -endobj -792 0 obj << -/Length 161 -/Filter /FlateDecode ->> -stream -x3135R0P -endstream -endobj -793 0 obj << -/Length 227 -/Filter /FlateDecode ->> -stream -xe= -@ )D+T,h9GL!Afn&^bJ;^v 0~څG9]43t9_hF1%h&N(`>! -r%N/e -endstream -endobj -794 0 obj << -/Length 246 -/Filter /FlateDecode ->> -stream -x]1N@Eei#$("*L>#"aƎ)j_zɁ+ZrUs}o% -l^M=m\LyϏw[.oyWrxf -endstream -endobj -795 0 obj << -/Length 217 -/Filter /FlateDecode ->> -stream -xu1nP`G"yy`OKȋD -*`N TÞ(#P*WokT(XqE+]4}'ޭ -endstream -endobj -796 0 obj << -/Length 216 -/Filter /FlateDecode ->> -stream -xڕ= -@ ira6V?` -A+RKE[r"8ά6 -B ;//6d)uR;%ۣ&=D]zϓ9 cOx8m1̆$-eg_D -ISjU+{\9Ҩ;BM3Us5חMUBۗw}
8fY5̲
_?&89> -endstream -endobj -797 0 obj << -/Length 253 -/Filter /FlateDecode ->> -stream -xUбN02G -(3@%z)^IcR* ~3O`ߢeۂ]nT)(57k=II2THR_p
x_z -endstream -endobj -798 0 obj << -/Length 184 -/Filter /FlateDecode ->> -stream -x3135R0P04R5T05P05QH1*26P\.'O.pcs.}8BIQi*S!BA,`#f - -endstream -endobj -799 0 obj << -/Length 258 -/Filter /FlateDecode ->> -stream -xeN0]u% -VLMtpW=7!~s -endstream -endobj -800 0 obj << -/Length 256 -/Filter /FlateDecode ->> -stream -x]1N@YXisqw+ -()@ƾW
ov<!(d]eqVe&r:Jʕ< -3)3kη82?q2z#D~ 0ՖjGjOjl"M -endstream -endobj -215 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F33 -/FontMatrix [0.01204 0 0 0.01204 0 0] -/FontBBox [ -1 -17 89 60 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 45 -/LastChar 255 -/Widths 801 0 R -/Encoding 802 0 R -/CharProcs 803 0 R ->> endobj -801 0 obj -[27.68 23.07 0 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 0 0 0 0 0 0 0 55.36 55.36 53.05 59.97 49.59 47.28 55.36 58.82 23.07 0 0 44.98 72.66 58.82 61.12 53.05 0 53.63 46.13 56.51 57.09 0 78.42 55.36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44.98 0 0 0 50.74 57.66 0 57.66 59.05 0 57.66 61.12 57.66 0 0 0 55.36 0 55.36 0 0 0 0 0 0 0 0 0 0 39.9 41.52 39.9 33.56 44.75 36.91 61.35 36.91 44.63 44.63 40.6 43.82 55.59 42.9 41.52 42.9 42.9 36.91 38.06 38.29 63.66 38.29 45.55 44.63 63.66 64.58 0 56.74 39.9 36.91 0 42.79 ] -endobj -802 0 obj << -/Type /Encoding -/Differences [45/a45/a46 47/.notdef 48/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57 58/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73 74/.notdef 76/a76/a77/a78/a79/a80 81/.notdef 82/a82/a83/a84/a85 86/.notdef 87/a87/a88 89/.notdef 195/a195 196/.notdef 199/a199/a200 201/.notdef 202/a202/a203 204/.notdef 205/a205/a206/a207 208/.notdef 211/a211 212/.notdef 213/a213 214/.notdef 224/a224/a225/a226/a227/a228/a229/a230/a231/a232/a233/a234/a235/a236/a237/a238/a239/a240/a241/a242/a243/a244/a245/a246/a247/a248/a249 250/.notdef 251/a251/a252/a253 254/.notdef 255/a255] ->> endobj -803 0 obj << -/a45 789 0 R -/a46 790 0 R -/a48 791 0 R -/a49 792 0 R -/a50 793 0 R -/a51 794 0 R -/a52 795 0 R -/a53 796 0 R -/a54 797 0 R -/a55 798 0 R -/a56 799 0 R -/a57 800 0 R -/a65 729 0 R -/a66 730 0 R -/a67 731 0 R -/a68 732 0 R -/a69 733 0 R -/a70 734 0 R -/a71 735 0 R -/a72 736 0 R -/a73 737 0 R -/a76 738 0 R -/a77 739 0 R -/a78 740 0 R -/a79 741 0 R -/a80 742 0 R -/a82 743 0 R -/a83 744 0 R -/a84 745 0 R -/a85 746 0 R -/a87 747 0 R -/a88 748 0 R -/a195 749 0 R -/a199 750 0 R -/a200 751 0 R -/a202 752 0 R -/a203 753 0 R -/a205 754 0 R -/a206 755 0 R -/a207 756 0 R -/a211 757 0 R -/a213 758 0 R -/a224 759 0 R -/a225 760 0 R -/a226 761 0 R -/a227 762 0 R -/a228 763 0 R -/a229 764 0 R -/a230 765 0 R -/a231 766 0 R -/a232 767 0 R -/a233 768 0 R -/a234 769 0 R -/a235 770 0 R -/a236 771 0 R -/a237 772 0 R -/a238 773 0 R -/a239 774 0 R -/a240 775 0 R -/a241 776 0 R -/a242 777 0 R -/a243 778 0 R -/a244 779 0 R -/a245 780 0 R -/a246 781 0 R -/a247 782 0 R -/a248 783 0 R -/a249 784 0 R -/a251 785 0 R -/a252 786 0 R -/a253 787 0 R -/a255 788 0 R ->> endobj -804 0 obj << -/Length 244 -/Filter /FlateDecode ->> -stream -x]1N@qf0nXI&ZY+؍vh#PR>:L^g.\pɯ)<ꇗw6T<r(T4wq|b{;~|fYfLnNZPwꄶ _+sO~ -endstream -endobj -805 0 obj << -/Length 210 -/Filter /FlateDecode ->> -stream -xuν -@B>yV -~I(}$$ -ijOQ2s7Ƕ=c4k{&oY!ْ
`-ZWbb*ѯEO'?ruU;MNum2ԝlT~7U7O-yY04E_UiR- -endstream -endobj -806 0 obj << -/Length 226 -/Filter /FlateDecode ->> -stream -xڭ=nAF=@rGX_ - wQh(!]'4Q5M{Jn:g
7J/F۬x8m^T]{A<^1F -endstream -endobj -807 0 obj << -/Length 196 -/Filter /FlateDecode ->> -stream -xڥб0[x ,$a"AL`qRGh< -@6/k"]+0G ^Cx@:..w%#F1;|=7~!O!g**ƴ7X3ˆZH'gdOi̸Gftnmz:Lq̜F6[lMiHIR - O -endstream -endobj -808 0 obj << -/Length 110 -/Filter /FlateDecode ->> -stream -x33T0P -%E\N -\. -ц -\. -nhH -endstream -endobj -809 0 obj << -/Length 107 -/Filter /FlateDecode ->> -stream -x313P0P0bSCB.c3 -endstream -endobj -810 0 obj << -/Length 232 -/Filter /FlateDecode ->> -stream -xڝбn0Cn(Nh*کCvN͏#xd@'@iթ','H.c$JyYfEێˊdg+^sf_N%e?TW3!kCDL -Akq"4#^]y"wlEtF8[ߢ,4k%w^#O]į]D0@Kƴlb^$i-a -endstream -endobj -811 0 obj << -/Length 104 -/Filter /FlateDecode ->> -stream -x3г0R0P -endstream -endobj -812 0 obj << -/Length 88 -/Filter /FlateDecode ->> -stream -x3230W0P -endstream -endobj -813 0 obj << -/Length 132 -/Filter /FlateDecode ->> -stream -x332T0P0V5R06R0PH1*2 -(Aes<,=\ -%E\N -\. -@b<]?}, -endstream -endobj -814 0 obj << -/Length 249 -/Filter /FlateDecode ->> -stream -xE;N0`G),M#' EZHPQ * -Ea ʰޡݠS%H 1͐'Qr5rf:뛁>BgBwd
y$чIZXTZ^lQӪ|N:+/ܜ7Xt?3uv -endstream -endobj -815 0 obj << -/Length 99 -/Filter /FlateDecode ->> -stream -x31ѳP0P0b#SCB.c -endstream -endobj -816 0 obj << -/Length 231 -/Filter /FlateDecode ->> -stream -xm̱jP#Y|jAI!IvP:;4$!skutWv8|fe.=/NMhO^%XݣeU>n`z\Kj#/į\nDD+: D -endstream -endobj -817 0 obj << -/Length 188 -/Filter /FlateDecode ->> -stream -xM1PP6=$#AL0XF[&^()Ȳżdfb!/!aI[@
ʹʷ| -CPCNg86?[agza!,g"}We[a;f{ba)L*_=!]%#m'-i!,gMBctG#:=|xb -endstream -endobj -818 0 obj << -/Length 249 -/Filter /FlateDecode ->> -stream -xڭ1n0Eix0G0/H2` -1?|& =T6L2@&fivщ^v8!3@KkE3b3uif@=֎МUn/K= -endstream -endobj -819 0 obj << -/Length 168 -/Filter /FlateDecode ->> -stream -x3530U0P0bKSCB.C -@-\. -? -endstream -endobj -820 0 obj << -/Length 281 -/Filter /FlateDecode ->> -stream -xڭ1N0E4 - -endstream -endobj -821 0 obj << -/Length 209 -/Filter /FlateDecode ->> -stream -xeϱ -@+B>B^kIG:v7HO.!$'C^؛L9Y%;D|,'}YLzc-?+l'Wl)]
Ja@7*8n>S_Wf9s7p,"Fz"KA=7cڙw`P:=} -endstream -endobj -822 0 obj << -/Length 247 -/Filter /FlateDecode ->> -stream -x}=JAK&hd0uc6lYWpA#Yphs9,SqM>U)ZZR*sBxݳfe|~|_?H~#ϕ[7BQQԙ.T5eL:)RHRg9Q0Y"5V:+ Fhr 7(?
/ohq%8IfS|#| -endstream -endobj -823 0 obj << -/Length 104 -/Filter /FlateDecode ->> -stream -x3535T0P0bScSCB.K - -endstream -endobj -824 0 obj << -/Length 168 -/Filter /FlateDecode ->> -stream -x1 -@EX;݄hB"Xh9GL! -Y>qsv8q6cLJL'4!RM֯vȖd+cv{ -endstream -endobj -825 0 obj << -/Length 244 -/Filter /FlateDecode ->> -stream -xm;N1ᱶ4a}
8-@T@Iv)o#d2ffG - -?vzafn5%ni?-_}Bl=kv2%ڵyXMj - GNPE4@ƳABa^?ᒃP(G%:]O)vh -endstream -endobj -826 0 obj << -/Length 301 -/Filter /FlateDecode ->> -stream -xe?K0,'WystPtӶ~_$q0`>Mٻ!y}99\r~˂Jl\EͳsY<;U'gCl)/%gTA -ZFuTyABytşvT{5PF\/ʱhTD`b&(TQ у4Ԑ 5RlH"HCjѡ
YW=$HD/v6[AA Y}Q=ZՍֈfv LJ -endstream -endobj -827 0 obj << -/Length 277 -/Filter /FlateDecode ->> -stream -xM1N0E'4Ml,)@T@Ijf({)?c#xy;w~;u]ׁ8o(/n-w?'eYΐBdfTP6Q|$ -¤qߨ$ ,!H̔Ex|NXU-,`zPRBE7&"mTV)fӗ$p$ QZԔ2X%!#7u'@S>{Ё -endstream -endobj -828 0 obj << -/Length 229 -/Filter /FlateDecode ->> -stream -x=N@\XG9ѭ$(LJuGɕ|27h8KYI+\H8q^Qyӳf;9w7ұ|~+e f69MqRF#nip'ZPUAPU:A![DJi2h-B٨:#SjYM"P/#~7h5 b?Il -endstream -endobj -829 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -xu -PES:Ah~@_KB`A'qRGEBcZD.g=.%Kh.>ɷ91/lhzFSv9Y4,{,_B:yDvA;5R`dV~Yj2Ͱ}s O: -endstream -endobj -830 0 obj << -/Length 180 -/Filter /FlateDecode ->> -stream -xڽ -084NZN⤎Q;J\lI -h)?;#I u_90dQ-=+|":jJNh :Âk
0vY\ըiah@_xZUD -$u} -endstream -endobj -831 0 obj << -/Length 179 -/Filter /FlateDecode ->> -stream -x36ӳ4T0P0V5T06U0TH1*2 (@es<
=\ -%E\N -@QhX.O00!8̱?4
h:?t[>Փ+ -endstream -endobj -832 0 obj << -/Length 187 -/Filter /FlateDecode ->> -stream -xڽ10E]uG$1E*E"L @077G;4$p0!I2I{'ڋ2쎘[k(.E([qCZ{q6a6^
T2 -endstream -endobj -833 0 obj << -/Length 193 -/Filter /FlateDecode ->> -stream -xm1@E?RL!G`.+HHaRKv8Gd!R:k=/Bpģ!=HGNxo.wJRRGĤdԚORtt 0@nҵZk+ JAO\ e.d?:+azqw"B_c(/,]o鹭k@ UH -endstream -endobj -834 0 obj << -/Length 133 -/Filter /FlateDecode ->> -stream -x3236W0P0b#3CCB.#3 -endstream -endobj -835 0 obj << -/Length 234 -/Filter /FlateDecode ->> -stream -x}J14yh6\pVrZZ(ښ<Z%re$?Ɲo7/vm/OWڏdD@Fd[x|!bG#J݄a6R殔2&itR:N0AGܼ-E"T)
,f$ -endstream -endobj -836 0 obj << -/Length 142 -/Filter /FlateDecode ->> -stream -x31ҳT0P0bcs3CB.c4H$r9yr+p{ -endstream -endobj -837 0 obj << -/Length 95 -/Filter /FlateDecode ->> -stream -x3Գ0Q0P0bCSsCB. -endstream -endobj -838 0 obj << -/Length 128 -/Filter /FlateDecode ->> -stream -x3234Q0P5U54W04S05WH1*22P - -endstream -endobj -839 0 obj << -/Length 196 -/Filter /FlateDecode ->> -stream -xڽ;@%$p.bKVJ--4ZGÛx:)?M| ̱$|NFYtԇӕJGvYFv[nÏB.9%[!H`D=;Pnx38=:h@`'@|,o兿E3RxEJu# TfPڤ'<'w -endstream -endobj -840 0 obj << -/Length 89 -/Filter /FlateDecode ->> -stream -x3Գ0Q0P0bC3CB.s -endstream -endobj -841 0 obj << -/Length 165 -/Filter /FlateDecode ->> -stream -xL;@\BA;!V$[heaB{= -GX;̎b2̔d>)3>ft"cǢ=SHI|JRvH֛g$gH5,{b%0{O[Yt`bBG:z -endstream -endobj -842 0 obj << -/Length 137 -/Filter /FlateDecode ->> -stream -x31ҳT0P0bcscCB.crAɹ\N\ -\@Q.}O_T.} -endstream -endobj -843 0 obj << -/Length 190 -/Filter /FlateDecode ->> -stream -xڍ1PDPlX &RheaBp4()w-hm^1Md6刧<DdJq諨sP^qY9Lq&ol,@ 5I PAMV#h -endstream -endobj -844 0 obj << -/Length 189 -/Filter /FlateDecode ->> -stream -xڭ;@!$pD+D -,ZZhq@IAv5cibxNb1ĚN!^jF}x4G#cP*_8J7 -QeI0,$\e&i@(0<+vJ! -endstream -endobj -845 0 obj << -/Length 189 -/Filter /FlateDecode ->> -stream -xڭ;@XL肋jD -,ZZh#PRi(MlţC48&hhfx -H8nG$z%9l:,0> -\P?`>xm -endstream -endobj -846 0 obj << -/Length 133 -/Filter /FlateDecode ->> -stream -x336W0P0b#scCB.#rAɹ\N\ -F\@Q.}O_T.} -endstream -endobj -847 0 obj << -/Length 188 -/Filter /FlateDecode ->> -stream -xM; -@ irt"1),DBQrh{!dcW")(AT]g¼D8E5UvD/Qm,LgE)m} -endstream -endobj -848 0 obj << -/Length 133 -/Filter /FlateDecode ->> -stream -x3ԳT0P0T5T0P01WH1*22 -(X@ds≮=\ -%E\N -\. -ц -\. -ch` -endstream -endobj -849 0 obj << -/Length 127 -/Filter /FlateDecode ->> -stream -x31ҳT0P0S5T06CB.c4$r9yr+p{ -endstream -endobj -850 0 obj << -/Length 182 -/Filter /FlateDecode ->> -stream -xM; -@?X&G=kV-,J--měh#L BUlCQ4J!WєF=dT!TxH&U_ r@%r2K7 juqZfD
>D@oϋoKLjօVvg9H -endstream -endobj -851 0 obj << -/Length 236 -/Filter /FlateDecode ->> -stream -xEαN0<D%oMX*E"LSۑT$
} ~=XwO}g]ϧfbj^Ͷwl$V6oоfSݣ|.Lve^rPLx5W?Jr}%i/K_ gW<GAg[*AṶ"I<(: -EdR櫈@?97s̄6 -endstream -endobj -852 0 obj << -/Length 205 -/Filter /FlateDecode ->> -stream -x5;0D'ri>! TH@Q%j&\7!GH"2zf<U=8TKϴӕ
{SNl6q^obYj [㠼0^Nv;>
D|x+[<q -endstream -endobj -853 0 obj << -/Length 220 -/Filter /FlateDecode ->> -stream -xU1j@oT4pVkYĮ"W.B*'e -t*{#T!̮`g?kX\s#T3.6%='*||ڼ<&W[R1R -Bܢf=nCGfWZ`=
iTL Kw"'d
kxc]T X!2KrׁK?Vv -endstream -endobj -854 0 obj << -/Length 148 -/Filter /FlateDecode ->> -stream -x363T0P0bccsCB.cHrW06 -endstream -endobj -855 0 obj << -/Length 244 -/Filter /FlateDecode ->> -stream -x]1N@qf0nXI&ZY+؍vh#PR>:L^g.\pɯ)<ꇗw6T<r(T4wq|b{;~|fYfLnNZPwꄶ _+sO~ -endstream -endobj -856 0 obj << -/Length 185 -/Filter /FlateDecode ->> -stream -x3536S0P0bSCSCB.c -endstream -endobj -857 0 obj << -/Length 210 -/Filter /FlateDecode ->> -stream -xuν -@B>yV -~I(}$$ -ijOQ2s7Ƕ=c4k{&oY!ْ
`-ZWbb*ѯEO'?ruU;MNum2ԝlT~7U7O-yY04E_UiR- -endstream -endobj -858 0 obj << -/Length 99 -/Filter /FlateDecode ->> -stream -x31ѳP0P0b#SCB.c -endstream -endobj -859 0 obj << -/Length 167 -/Filter /FlateDecode ->> -stream -x3331V0P0T54S05W0PH1*25(@s<LM=\ -%E\N -\. -ц -\. -(C 3bR)~(u -endstream -endobj -860 0 obj << -/Length 110 -/Filter /FlateDecode ->> -stream -x33T0P -%E\N -\. -ц -\. -nhH -endstream -endobj -861 0 obj << -/Length 254 -/Filter /FlateDecode ->> -stream -xڍJPϒ"2M| -zrbTy~mM+nTϏWʶwW\Pǂ'w -endstream -endobj -862 0 obj << -/Length 186 -/Filter /FlateDecode ->> -stream -xe -@\| 2A˛`!ST;uQ|DفfAIBe7ѓKw#M n!T[|滕m!X&
,K˞uȎu[kXрЌDz4uuɖ֯ـL;t$ۉ
k{+ -endstream -endobj -863 0 obj << -/Length 249 -/Filter /FlateDecode ->> -stream -xE;N0`G),M#' EZHPQ * -Ea ʰޡݠS%H 1͐'Qr5rf:뛁>BgBwd
y$чIZXTZ^lQӪ|N:+/ܜ7Xt?3uv -endstream -endobj -864 0 obj << -/Length 151 -/Filter /FlateDecode ->> -stream -x330U0P0bSCSCB.K -endstream -endobj -865 0 obj << -/Length 231 -/Filter /FlateDecode ->> -stream -xm̱jP#Y|jAI!IvP:;4$!skutWv8|fe.=/NMhO^%XݣeU>n`z\Kj#/į\nDD+: D -endstream -endobj -866 0 obj << -/Length 100 -/Filter /FlateDecode ->> -stream -x3533S0P -endstream -endobj -867 0 obj << -/Length 249 -/Filter /FlateDecode ->> -stream -xڭ1n0Eix0G0/H2` -1?|& =T6L2@&fivщ^v8!3@KkE3b3uif@=֎МUn/K= -endstream -endobj -868 0 obj << -/Length 97 -/Filter /FlateDecode ->> -stream -x3533S0P -endstream -endobj -869 0 obj << -/Length 168 -/Filter /FlateDecode ->> -stream -x3530U0P0bKSCB.C -@-\. -? -endstream -endobj -870 0 obj << -/Length 226 -/Filter /FlateDecode ->> -stream -xڭ=nAF=@rGX_ - wQh(!]'4Q5M{Jn:g
7J/F۬x8m^T]{A<^1F -endstream -endobj -871 0 obj << -/Length 104 -/Filter /FlateDecode ->> -stream -x3535T0P0bSSCB.SrAɹ\N\ -\@Q.}O_T.} - -endstream -endobj -872 0 obj << -/Length 257 -/Filter /FlateDecode ->> -stream -xUбN02X%?n -," &Eb?Zx ^ R2T
&`}r|bkWz,{~hxv"n[67.\+R<>Y_FߢۍGwԝ:3 -endstream -endobj -873 0 obj << -/Length 219 -/Filter /FlateDecode ->> -stream -xڥ= -@'XD4*L!he!Vjiht^+G)Bձew>w.ԗ&= -ۍџؘMx8mOgC -2`و -endstream -endobj -874 0 obj << -/Length 125 -/Filter /FlateDecode ->> -stream -x3533S0P -endstream -endobj -875 0 obj << -/Length 229 -/Filter /FlateDecode ->> -stream -x}=@FQ&G/;PĂD -$(.%per3c7Od_v@rS^_;3ZuQfIyfc4ՌhC)1Rk? -endstream -endobj -876 0 obj << -/Length 219 -/Filter /FlateDecode ->> -stream -xuл -0z8s}>JEBA`cC128Ck)? &
9x`')f`g0A5Cc =NEIxC/6ѳeco׳=?Xv6&6g͋
)vl$ƒ
ZMCmH$0`
o?f -endstream -endobj -877 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -xu -PES:Ah~@_KB`A'qRGEBcZD.g=.%Kh.>ɷ91/lhzFSv9Y4,{,_B:yDvA;5R`dV~Yj2Ͱ}s O: -endstream -endobj -878 0 obj << -/Length 241 -/Filter /FlateDecode ->> -stream -xڍ=N@ria$K!pEDDYx.%f-b?iޛ^H!{YrSțO^Do*ΟeiΫ:|sy[{)^ -Z"- -8CiPՐvwD: !&Qi3HPgvzڧN=52"-Zn#Jpf`ff>5R[(p~<P<*~__ -endstream -endobj -879 0 obj << -/Length 165 -/Filter /FlateDecode ->> -stream -xMͱ -0+ -'0 P+AA>ZG蘡\|C˟ռ"Ma\
j)
kHVJxN]C!x!Dщ/JzB^ݥ~'=ϐ
0rQȼq9 -endstream -endobj -880 0 obj << -/Length 100 -/Filter /FlateDecode ->> -stream -x3635S0P - -endstream -endobj -881 0 obj << -/Length 140 -/Filter /FlateDecode ->> -stream -x3137U0 -endstream -endobj -882 0 obj << -/Length 193 -/Filter /FlateDecode ->> -stream -xm1@E?RL!G`.+HHaRKv8Gd!R:k=/Bpģ!=HGNxo.wJRRGĤdԚORtt 0@nҵZk+ JAO\ e.d?:+azqw"B_c(/,]o鹭k@ UH -endstream -endobj -883 0 obj << -/Length 271 -/Filter /FlateDecode ->> -stream -xM1N@EmM9hE[YZHPQ *eMF"|
RۣU疮Żn[~nzi]unpM^F
;'$z* p+&JA$J@Te$-,V`BU?Uc{/Mу2hP{f2w"!oLc&*sΉ{k(?:iϗk| -endstream -endobj -884 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -x]1 -`_P#SV: -*:<JбC1""#$;1GlMئD6bWG(/,Fd&Sr1d -^њʂ=&J
(^Q -endstream -endobj -885 0 obj << -/Length 155 -/Filter /FlateDecode ->> -stream -xE1 -0C-=B LҔZNIݤhGء@,[ -DP-**.qCPw{|=7axg]e81dM`f7i|yM!.h'p?b -endstream -endobj -886 0 obj << -/Length 187 -/Filter /FlateDecode ->> -stream -xm1@!$"
$&ZY+hGq%a͒W$"J
kTs#[rUHjrk(~M1ʂN1Eg, -uL*c0zғ7%Tv -endstream -endobj -887 0 obj << -/Length 195 -/Filter /FlateDecode ->> -stream -x==0` H +# & [nVnRt<w`ȧ8q7ʆc(?cu_ӒVg)r%nIn.\=s -AiT
К@t mAрj-FL(T6=67YȢ
,$Qռ(y?a -endstream -endobj -888 0 obj << -/Length 132 -/Filter /FlateDecode ->> -stream -x31ֳ0R0P0bccsCB.c3 -endstream -endobj -889 0 obj << -/Length 196 -/Filter /FlateDecode ->> -stream -xE1 -PЕmr 1` -A+RKE"7JW@FPw`f°ɣ&'(h56ec8A5Fj+dHn*uGգOQ.\C{žJ`]DM+YtF::w!OK/zSKBeh<D`5 -endstream -endobj -890 0 obj << -/Length 100 -/Filter /FlateDecode ->> -stream -x31ҳT0P0bcsJ1*26P0$s<
=\ -%E\N -\. -ц -\. -5szrr -endstream -endobj -891 0 obj << -/Length 190 -/Filter /FlateDecode ->> -stream -xڍ1PDPlX &RheaBp4()w-hm^1Md6刧<DdJq諨sP^qY9Lq&ol,@ 5I PAMV#h -endstream -endobj -892 0 obj << -/Length 96 -/Filter /FlateDecode ->> -stream -x31ҳT0P0bcsJ1*26P0$s<
=\ -%E\N -\. -ц -\. -10(r - -endstream -endobj -893 0 obj << -/Length 189 -/Filter /FlateDecode ->> -stream -xڭ;@!$pD+D -,ZZhq@IAv5cibxNb1ĚN!^jF}x4G#cP*_8J7 -QeI0,$\e&i@(0<+vJ! -endstream -endobj -894 0 obj << -/Length 179 -/Filter /FlateDecode ->> -stream -x36ӳ4T0P0V5T06U0TH1*2 (@es<
=\ -%E\N -@QhX.O00!8̱?4
h:?t[>Փ+ -endstream -endobj -895 0 obj << -/Length 101 -/Filter /FlateDecode ->> -stream -x330S0P0bc3csCB.cc -endstream -endobj -896 0 obj << -/Length 220 -/Filter /FlateDecode ->> -stream -xU1j@oT4pVkYĮ"W.B*'e -t*{#T!̮`g?kX\s#T3.6%='*||ڼ<&W[R1R -Bܢf=nCGfWZ`=
iTL Kw"'d
kxc]T X!2KrׁK?Vv -endstream -endobj -897 0 obj << -/Length 235 -/Filter /FlateDecode ->> -stream -xՑj0x0ܢG@+y)C :Li),?ŏQCD!tz}dgRE3z2![ѧkVTn;koGݬbB>U[l -endstream -endobj -898 0 obj << -/Length 205 -/Filter /FlateDecode ->> -stream -x5;0D'ri>! TH@Q%j&\7!GH"2zf<U=8TKϴӕ
{SNl6q^obYj [㠼0^Nv;>
D|x+[<q -endstream -endobj -899 0 obj << -/Length 109 -/Filter /FlateDecode ->> -stream -x3135U0P0S54V01Q06WH1*@h -Jr* - -endstream -endobj -900 0 obj << -/Length 119 -/Filter /FlateDecode ->> -stream -x3133V0P0bcKcsCB.c# -endstream -endobj -901 0 obj << -/Length 100 -/Filter /FlateDecode ->> -stream -x3333S0P -@-\. -0?0Kqzrr -endstream -endobj -902 0 obj << -/Length 111 -/Filter /FlateDecode ->> -stream -x333P0P0S54V03V06WH1*25(¤s<L=\ -%E\N -\. -ц -\. -0?iAqzrr -endstream -endobj -903 0 obj << -/Length 157 -/Filter /FlateDecode ->> -stream -x330T0P0b3csCB.c -endstream -endobj -904 0 obj << -/Length 152 -/Filter /FlateDecode ->> -stream -x3537Q0P0bScsCB.c I$r9yr+s{ -endstream -endobj -905 0 obj << -/Length 145 -/Filter /FlateDecode ->> -stream -x3ԳT0P0bcsJ1*26P0$s<
=\ -%E\N -\. -ц -\. - -endstream -endobj -906 0 obj << -/Length 176 -/Filter /FlateDecode ->> -stream -x]1 -@E'Xf -n!he!Vjih-GRngA +7y)%C3M&#Y
MJatҢړIQEFe7?/4btD[Q -endstream -endobj -907 0 obj << -/Length 206 -/Filter /FlateDecode ->> -stream -x}б -0 -endstream -endobj -908 0 obj << -/Length 182 -/Filter /FlateDecode ->> -stream -xU1 -0 T NG:v(*\̊oV\SzP;$ܩd:l9%cw|TNēg{' -endstream -endobj -909 0 obj << -/Length 106 -/Filter /FlateDecode ->> -stream -x3135R0PT06P06V03PH1*22 -2ɹ\N\ -F\@.}O_T.} -endstream -endobj -910 0 obj << -/Length 179 -/Filter /FlateDecode ->> -stream -x3536S0PbscsCB. m -$ɥs{IO_T.} -<`; -endstream -endobj -911 0 obj << -/Length 181 -/Filter /FlateDecode ->> -stream -xu0ҁ> bb::htG;c9g\7i1},sNW|KI>4
*-{~>w2a aj -endstream -endobj -912 0 obj << -/Length 123 -/Filter /FlateDecode ->> -stream -x323P0P0T01V02W03PH1*22 -!2ɹ\N\ -F\@a.}O_T.} -98 -endstream -endobj -913 0 obj << -/Length 123 -/Filter /FlateDecode ->> -stream -x323P0P0T01V02W03PH1*22 -!2ɹ\N\ -F\@a.}O_T.} -endstream -endobj -914 0 obj << -/Length 93 -/Filter /FlateDecode ->> -stream -x3235V0P04 -f -)\\ - 3Dr.'~9PKW4K)YKE!P E |.WO@. -endstream -endobj -915 0 obj << -/Length 217 -/Filter /FlateDecode ->> -stream -xڝб -@Z\IDh}>BG=zJo w%;O-ORХ%W]fabID1:hFy"C1G1@,( -SNjRCpa^P7%؉uQ_vb*cNjtbK*]ϯHh$> -endstream -endobj -916 0 obj << -/Length 238 -/Filter /FlateDecode ->> -stream -xڅϽJA+#,\}/kl-XYH bB^dYp]V,ɤBcɤ7O<m8}VcN;x|t:ә<- Ky+ja -endstream -endobj -917 0 obj << -/Length 317 -/Filter /FlateDecode ->> -stream -x]J@gba}h>0l8O0X`q\([nq\M3`9?LajsR4y*-7/13 -+Zc_g7|cKS<`1 -endstream -endobj -918 0 obj << -/Length 102 -/Filter /FlateDecode ->> -stream -x3230W0PP01V04S03PH1*(C$s<̹=\ -%E\N -\. -ц -\. - @Ƣ'W -endstream -endobj -919 0 obj << -/Length 193 -/Filter /FlateDecode ->> -stream -xڝ1 -@E'L#8MVDBBB6h9JBĿnkvvϛD2D'2r̸ٓḭڈX-PgerLbVlcvlr!!^IS zZ -endstream -endobj -920 0 obj << -/Length 193 -/Filter /FlateDecode ->> -stream -xڝ= -@_L2MI F0Xh)SHp6-efw7辞CiǚInLt?QڰI-Tv$fJx4 -! 9\@48 DBf/oZ/$-u^:Du7\f -MYLZT -endstream -endobj -921 0 obj << -/Length 168 -/Filter /FlateDecode ->> -stream -x3135R0P0U02U06W03RH1*26 -D2ɹ\N\ -Ɔ\@a.}O_T.} -endstream -endobj -922 0 obj << -/Length 115 -/Filter /FlateDecode ->> -stream -x333P0P0U5S03P0PH1*25 -M 2ɹ\N\@.}0PRTʥ`ȥm`` -r.WO@. -endstream -endobj -923 0 obj << -/Length 101 -/Filter /FlateDecode ->> -stream -x3230W0PP54P04S0WH1*P\.'O.ps.}0BIQi*S!BA,?(( -endstream -endobj -924 0 obj << -/Length 94 -/Filter /FlateDecode ->> -stream -xM=@PEx$^!R -{ T߱4J2:*54`ƴ"f@BJJ7"i -endstream -endobj -925 0 obj << -/Length 85 -/Filter /FlateDecode ->> -stream -x3230W0P -%E\N -\. -ц -\. - Փ+ -endstream -endobj -926 0 obj << -/Length 148 -/Filter /FlateDecode ->> -stream -x3135R0P0U52T06W03RH1*26(XCs<
=\ -%E\N -@QhX.O Cu@\3f X ؞rih4ƃqszrr -endstream -endobj -927 0 obj << -/Length 93 -/Filter /FlateDecode ->> -stream -x3230W0P -r{*r;8+r(D*ry( -endstream -endobj -928 0 obj << -/Length 108 -/Filter /FlateDecode ->> -stream -x3230W0PP54P04S06WH1* (Ces<̹=\ -%E\N -\. -ц -\. - ;XTT|r - -endstream -endobj -929 0 obj << -/Length 205 -/Filter /FlateDecode ->> -stream -xmP101T'RS!" &T@0O)}#J)Rp/;;Mf*CsؾO1\AI]S^ $u[7x= cbGȝ7%h* 849HH=LՉ-W_.n<#r\S{<iCH[2VvV -endstream -endobj -930 0 obj << -/Length 109 -/Filter /FlateDecode ->> -stream -x333P0P0UT03P06VH1*25(%s<LM=\ -%E\N -\. -ц -\. -A+@sv\= -endstream -endobj -931 0 obj << -/Length 271 -/Filter /FlateDecode ->> -stream -xڝ1N0D'JM --^133M34@@@σzS=UV=8eխ
;@ZT<:;^&c-X
"J.:B:|cZxE[
S%,vٴжL&L1"R6G_~ʼn+\q8HDCn<5iAU^7i{VSieB]^ -endstream -endobj -932 0 obj << -/Length 104 -/Filter /FlateDecode ->> -stream -x32ֳT0P0W52T02V03RH1*24(XCs<M=\ -%E\N -\. -ц -\. -?nr - -endstream -endobj -933 0 obj << -/Length 146 -/Filter /FlateDecode ->> -stream -x3135R0P0U52T06W03RH1*26(XCs<
=\ -%E\N -@QhX.OH@qA=p?```0bM
r - -endstream -endobj -934 0 obj << -/Length 103 -/Filter /FlateDecode ->> -stream -x32ֳT0P0T52T04W03RH1*24(XCs<M=\ -%E\N -\. -ц -\. - àqzrr -endstream -endobj -935 0 obj << -/Length 148 -/Filter /FlateDecode ->> -stream -x3537Q0P04T06W01P05RH1*2 -F\@q.}O_T.} -endstream -endobj -936 0 obj << -/Length 103 -/Filter /FlateDecode ->> -stream -x333P0P0W52T -L
@*ɥ`j`¥PRTʥ`ȥm`PP -* -endstream -endobj -937 0 obj << -/Length 185 -/Filter /FlateDecode ->> -stream -x3135R0P0Q52T0P03RH1*26(XCs<=\ -%E\N -\. -ц -\. -A=Xa -endstream -endobj -938 0 obj << -/Length 96 -/Filter /FlateDecode ->> -stream -x3230W0PT52T04Q03RH1*2 -(XCes<L=\ -%E\N -\. -ц -\. -
\= -endstream -endobj -939 0 obj << -/Length 185 -/Filter /FlateDecode ->> -stream -x3135R0P0Q52T0P03RH1*26(XCs<=\ -%E\N -\. -ц -\. -000"`Dd -]P8C -.WO@. -endstream -endobj -940 0 obj << -/Length 316 -/Filter /FlateDecode ->> -stream -x}1N1EgJn|$` PY -Ab$RQ * -|Inϴփ
̲02LCNubq\Lo^x* @`Eō`<4Q1$+ytd)WDQyÉ\T'Z/z: -endstream -endobj -941 0 obj << -/Length 177 -/Filter /FlateDecode ->> -stream -xڍ1 -P_: lkUp* -vtr'uTl#tPyI&|Cij(*4cDWC
gJs -,uKAq ]YwfOy(*A!bD/xns -endstream -endobj -942 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xڵ1@O(LtYqV$&ZY+h+pJ -ú,?5CO9\EҝBeErQ8pHl̘Du%V,I$|(Mn
׆L%+WcTx+/!2f;E4|38ņl@Ն"l%m9NiO_v -endstream -endobj -943 0 obj << -/Length 118 -/Filter /FlateDecode ->> -stream -x3135R0P0bc3S3CB.# -endstream -endobj -944 0 obj << -/Length 219 -/Filter /FlateDecode ->> -stream -xu1nP(C$/
& &"R:TRh9J1µ#U?Y2>r̩Ř#^%4< -
Mrof\aMn:ܜ?3@)'RiE:DmtBTgZT' :çb`5_T=4pӑmUO{s8Z)z
уe -endstream -endobj -945 0 obj << -/Length 241 -/Filter /FlateDecode ->> -stream -x}J@` -2/\\*r` -,DRP:hy}+S3O,c:K.%NwKg+Zw\Z&+k|vX -endstream -endobj -946 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -xڥ= -@
) -6Mb\a~{X'T +K -Ba#c^cq-ލ-%s91
&p
O3 ̙)*a>4/C
S>Gq# -endstream -endobj -947 0 obj << -/Length 204 -/Filter /FlateDecode ->> -stream -xڥ= -@i;MD),J--hA2E8Oi!6[fm>yd'Q=@Bf$E H:pڢNfCQh铷tD -endstream -endobj -948 0 obj << -/Length 241 -/Filter /FlateDecode ->> -stream -xmJ@ƿpaM.hp` -A+RKE<Z%pa;,|.;>[pwZ.hpS^?hٓ.2~/n%疛W (d8@edTEJQ$AHJ* EN2#g![(`;ԣ)6#6=j\
̸RZ!j4Ʃ -endstream -endobj -949 0 obj << -/Length 176 -/Filter /FlateDecode ->> -stream -x3135R0P0V5T0T05QH1*26 -(Bds<M=\ -%E\N -\. -ц -\. -ND -endstream -endobj -950 0 obj << -/Length 229 -/Filter /FlateDecode ->> -stream -xڍ1N0E4>dWPEZHPQ *-r!e -+$-
+͜aW|ÖKz*hXp8O/O5 -5&%PrH͞O -endstream -endobj -951 0 obj << -/Length 248 -/Filter /FlateDecode ->> -stream -xu1N0oE"4>dCTE"T[ *vK -$7*W
H"0D@A[Q+>\qu Jzf[[j&^˞K-v& -endstream -endobj -952 0 obj << -/Length 131 -/Filter /FlateDecode ->> -stream -x3135R0P0bc3CCB.c3 -?lPvP\\\ -endstream -endobj -953 0 obj << -/Length 133 -/Filter /FlateDecode ->> -stream -x3135R0P0bc3CCB.c3 -endstream -endobj -204 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F18 -/FontMatrix [0.01204 0 0 0.01204 0 0] -/FontBBox [ -5 -21 77 62 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 16 -/LastChar 255 -/Widths 954 0 R -/Encoding 955 0 R -/CharProcs 956 0 R ->> endobj -954 0 obj -[27.68 27.68 0 0 0 0 0 0 0 0 0 0 44.52 44.52 0 0 0 26.53 41.52 69.2 41.52 69.2 62.97 23.07 32.29 32.29 41.52 64.58 23.07 27.68 23.07 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 23.07 23.07 0 64.58 64.58 39.21 55.36 55.36 55.36 53.05 59.97 49.59 47.28 55.36 58.82 23.07 39.21 57.66 44.98 72.66 58.82 61.12 53.05 61.12 53.63 46.13 56.51 57.09 55.36 78.42 55.36 55.36 0 23.99 41.52 23.99 50.74 64.58 0 39.9 42.9 36.91 42.9 36.91 25.37 41.52 42.9 19.84 22.14 40.6 19.84 65.97 42.9 41.52 42.9 42.9 28.37 31.83 29.99 42.9 38.29 56.74 38.29 38.29 36.1 41.52 23.07 41.52 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55.36 55.36 55.36 55.36 55.36 44.98 60.43 49.59 0 50.74 57.66 0 57.66 59.05 72.66 57.66 61.12 57.66 53.05 53.05 56.51 55.36 69.2 0 0 57.66 0 0 0 0 0 53.05 0 53.63 39.9 41.52 39.9 33.56 44.75 36.91 61.35 36.91 44.63 44.63 40.6 43.82 55.59 42.9 41.52 42.9 42.9 36.91 38.06 38.29 63.66 38.29 45.55 44.63 63.66 64.58 49.01 56.74 39.9 36.91 60.66 42.79 ] -endobj -955 0 obj << -/Type /Encoding -/Differences [16/a16/a17 18/.notdef 28/a28/a29 30/.notdef 33/a33/a34/a35/a36/a37/a38/a39/a40/a41/a42/a43/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58/a59 60/.notdef 61/a61/a62/a63/a64/a65/a66/a67/a68/a69/a70/a71/a72/a73/a74/a75/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85/a86/a87/a88/a89 90/.notdef 91/a91/a92/a93/a94/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121/a122/a123/a124/a125 126/.notdef 190/a190/a191/a192/a193/a194/a195/a196/a197 198/.notdef 199/a199/a200 201/.notdef 202/a202/a203/a204/a205/a206/a207/a208/a209/a210/a211/a212 213/.notdef 215/a215 216/.notdef 221/a221 222/.notdef 223/a223/a224/a225/a226/a227/a228/a229/a230/a231/a232/a233/a234/a235/a236/a237/a238/a239/a240/a241/a242/a243/a244/a245/a246/a247/a248/a249/a250/a251/a252/a253/a254/a255] ->> endobj -956 0 obj << -/a16 912 0 R -/a17 913 0 R -/a28 952 0 R -/a29 953 0 R -/a33 914 0 R -/a34 909 0 R -/a35 915 0 R -/a36 916 0 R -/a37 917 0 R -/a38 940 0 R -/a39 918 0 R -/a40 919 0 R -/a41 920 0 R -/a42 921 0 R -/a43 922 0 R -/a44 923 0 R -/a45 924 0 R -/a46 925 0 R -/a47 926 0 R -/a48 942 0 R -/a49 943 0 R -/a50 944 0 R -/a51 945 0 R -/a52 946 0 R -/a53 947 0 R -/a54 948 0 R -/a55 949 0 R -/a56 950 0 R -/a57 951 0 R -/a58 927 0 R -/a59 928 0 R -/a61 930 0 R -/a62 929 0 R -/a63 941 0 R -/a64 931 0 R -/a65 804 0 R -/a66 805 0 R -/a67 806 0 R -/a68 807 0 R -/a69 808 0 R -/a70 809 0 R -/a71 810 0 R -/a72 811 0 R -/a73 812 0 R -/a74 813 0 R -/a75 814 0 R -/a76 815 0 R -/a77 816 0 R -/a78 817 0 R -/a79 818 0 R -/a80 819 0 R -/a81 820 0 R -/a82 821 0 R -/a83 822 0 R -/a84 823 0 R -/a85 824 0 R -/a86 825 0 R -/a87 826 0 R -/a88 827 0 R -/a89 828 0 R -/a91 932 0 R -/a92 933 0 R -/a93 934 0 R -/a94 935 0 R -/a95 936 0 R -/a97 829 0 R -/a98 830 0 R -/a99 831 0 R -/a100 832 0 R -/a101 833 0 R -/a102 834 0 R -/a103 835 0 R -/a104 836 0 R -/a105 837 0 R -/a106 838 0 R -/a107 839 0 R -/a108 840 0 R -/a109 841 0 R -/a110 842 0 R -/a111 843 0 R -/a112 844 0 R -/a113 845 0 R -/a114 846 0 R -/a115 847 0 R -/a116 848 0 R -/a117 849 0 R -/a118 850 0 R -/a119 851 0 R -/a120 852 0 R -/a121 853 0 R -/a122 854 0 R -/a123 937 0 R -/a124 938 0 R -/a125 939 0 R -/a190 910 0 R -/a191 911 0 R -/a192 855 0 R -/a193 856 0 R -/a194 857 0 R -/a195 858 0 R -/a196 859 0 R -/a197 860 0 R -/a199 861 0 R -/a200 862 0 R -/a202 863 0 R -/a203 864 0 R -/a204 865 0 R -/a205 866 0 R -/a206 867 0 R -/a207 868 0 R -/a208 869 0 R -/a209 870 0 R -/a210 871 0 R -/a211 872 0 R -/a212 873 0 R -/a215 874 0 R -/a221 875 0 R -/a223 876 0 R -/a224 877 0 R -/a225 878 0 R -/a226 879 0 R -/a227 880 0 R -/a228 881 0 R -/a229 882 0 R -/a230 883 0 R -/a231 884 0 R -/a232 885 0 R -/a233 886 0 R -/a234 887 0 R -/a235 888 0 R -/a236 889 0 R -/a237 890 0 R -/a238 891 0 R -/a239 892 0 R -/a240 893 0 R -/a241 894 0 R -/a242 895 0 R -/a243 896 0 R -/a244 897 0 R -/a245 898 0 R -/a246 899 0 R -/a247 900 0 R -/a248 901 0 R -/a249 902 0 R -/a250 903 0 R -/a251 904 0 R -/a252 905 0 R -/a253 906 0 R -/a254 907 0 R -/a255 908 0 R ->> endobj -957 0 obj << -/Length 238 -/Filter /FlateDecode ->> -stream -xeѱN0D"ݒG - - -endstream -endobj -958 0 obj << -/Length 228 -/Filter /FlateDecode ->> -stream -xڵбJ@?Fys3 )@@+RKE;!y4GHbfV0yZsYpcN/T~3jNdn\m2voOd
d|svOv@$#F;!QS="HO],Kd -EusJpǿ\γ3L~kSMz947!vj9mrVaigL -endstream -endobj -959 0 obj << -/Length 237 -/Filter /FlateDecode ->> -stream -xڝѽn0 -endstream -endobj -960 0 obj << -/Length 116 -/Filter /FlateDecode ->> -stream -x33ճ4W0P -@-\. -KԠF -endstream -endobj -961 0 obj << -/Length 99 -/Filter /FlateDecode ->> -stream -x32ӳT0P0b#SCB.C# I$r9yr+q{ -endstream -endobj -962 0 obj << -/Length 113 -/Filter /FlateDecode ->> -stream -x332T0P0bSCB.c3 -endstream -endobj -963 0 obj << -/Length 176 -/Filter /FlateDecode ->> -stream -xα03nXTٚ &v08)Fgx4G`d 1͡_r2YQDkwtB:[L#_sDFs]TvOD6*StA[a -endstream -endobj -964 0 obj << -/Length 213 -/Filter /FlateDecode ->> -stream -x}Ͻ -0 -endstream -endobj -965 0 obj << -/Length 117 -/Filter /FlateDecode ->> -stream -x33гT0P0bSJ1*25" \.'O.pS.}(BIQi*S!BA,Q'habP'W -endstream -endobj -966 0 obj << -/Length 172 -/Filter /FlateDecode ->> -stream -x=@' #.# b&ZY*hͣpJ -¸kW|o2˓y Ys7N+#tJ: -XmfxܟVnUca]숼D5Lfe9c9iI@z߭s|cKFĞ"繭ּ7 -endstream -endobj -967 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xu= -@
)Av.IH` -A+RKEh9J0esֿBfvͦ`8ǜFb:S2Ҧf,pɈ
)̗|f)k=mю -endstream -endobj -968 0 obj << -/Length 182 -/Filter /FlateDecode ->> -stream -xڥ= -@F'L2e*#Xuh{"dU<z2%MƆ -MG59vdKTK)r+]'TzN{t
A eCEط! UYD' HB
:qasպhyJ
-endstream -endobj -969 0 obj << -/Length 176 -/Filter /FlateDecode ->> -stream -x313T0P0V5T01R03PH1*2 -(Bds<-=\ -%E\N -@BA, a Q0v"7cP=B@
w,:4#TLr - -endstream -endobj -970 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xuA -P_ZJ-Pj"ZUˠ<Gqy&('< -9 -{J؆pYF1K~{ȟl9]1T\8T14 -WZz-UR#7xojb/PA -endstream -endobj -971 0 obj << -/Length 112 -/Filter /FlateDecode ->> -stream -x3232R0P0bCs3CCB.CHrW04 -ц -\. -?
>?? -.WO@. -endstream -endobj -972 0 obj << -/Length 99 -/Filter /FlateDecode ->> -stream -x3232R0P0bCs3CB.CHrW04 -endstream -endobj -973 0 obj << -/Length 176 -/Filter /FlateDecode ->> -stream -xՋ1 -@D'&G?*#BBBz=$ bK
6^1t?30،eNMrŮXĤfʪtٳ*ѬJYkI6\By굔j
@7Uk aRɶtd/i>)n(r<x -endstream -endobj -974 0 obj << -/Length 188 -/Filter /FlateDecode ->> -stream -xڝ1 -@EG,irfITRb+PNya-BqӤy0ϛt>[,)҄Ҙ.dƔ~saaQ(Po$Fm|݊d.h(>- \(v -endstream -endobj -975 0 obj << -/Length 186 -/Filter /FlateDecode ->> -stream -xڥ; -@a0͒IL!he!Vjihͣ,L2A-bvgodKEm_2w
ՁlF樒-=+h"*&IL -۾Q -endstream -endobj -976 0 obj << -/Length 137 -/Filter /FlateDecode ->> -stream -x36г4T0P0bc TH1*22\Dr.'~)PKW4K)YKE!hL,?@# -endstream -endobj -977 0 obj << -/Length 189 -/Filter /FlateDecode ->> -stream -x51 -0[zhSSB`A'uTl֣3(!YtΚ<.4_rzN=Mcʚ
+evɸ|@ёUU$"6)6q\۫@j-8@*e -endstream -endobj -978 0 obj << -/Length 147 -/Filter /FlateDecode ->> -stream -x3635S0P0R5T06R0TH1*2 -(Bes<,=\ -%E\N -\. -ц -\. -70?PH?N~ .`` -endstream -endobj -979 0 obj << -/Length 207 -/Filter /FlateDecode ->> -stream -xMϿ@i'ptSxbwZ|
t"캓@fLq6?\9NܧYzB#Jߘ W -Ŀl=7)&[(*!"oB:U3{ɨIƞiّ
Æ-5l\ꊵ!-l<k;sVNϖ
j!
f^ -endstream -endobj -980 0 obj << -/Length 264 -/Filter /FlateDecode ->> -stream -xUѱN02D{"" &T@0(b`$#C~+)֧8mdqt(63<5?s%>xq&rYݕ=rX^Ka%w{VDn7;R{5*݂3W_P -endstream -endobj -981 0 obj << -/Length 116 -/Filter /FlateDecode ->> -stream -x3331V0P0bS3SCB. - -endstream -endobj -982 0 obj << -/Length 245 -/Filter /FlateDecode ->> -stream -xڽj@<hC4zSҩ!G#x>
{@I__+wKJ -(YH#_ټlfSfV^K) -Q4zjK()SP:S$zd 2%}6<ϧM7 -endstream -endobj -983 0 obj << -/Length 114 -/Filter /FlateDecode ->> -stream -x3331V0P0bS3SCB. -endstream -endobj -984 0 obj << -/Length 253 -/Filter /FlateDecode ->> -stream -xe?N0T"%GO!vTD$02P=#d=;I?<禹tq؝[Yu#KI̳=Afx[2f_E9 -DA[!Jh5]crKA@+rbL~5/e+?dh_@;|o&|.ߩrr%fLșzz_ -endstream -endobj -985 0 obj << -/Length 278 -/Filter /FlateDecode ->> -stream -xU1N0Em4M -+;^W&3=\V_ީ_;uGݯܢKfӟ_d#OniiػY3ORP5{!AazG"V'Py)Lv,{ -endstream -endobj -986 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xu= -@
)Av.IH` -A+RKEh9J0esֿBfvͦ`8ǜFb:S2Ҧf,pɈ
)̗|f)k=mю -endstream -endobj -987 0 obj << -/Length 237 -/Filter /FlateDecode ->> -stream -xڝбN0C*ݒG -endstream -endobj -988 0 obj << -/Length 173 -/Filter /FlateDecode ->> -stream -xmα -0 -'D -endstream -endobj -989 0 obj << -/Length 114 -/Filter /FlateDecode ->> -stream -x36ճP0P0bccCB.#K -endstream -endobj -990 0 obj << -/Length 146 -/Filter /FlateDecode ->> -stream -x35ҳ0R0P0R54V05T0PH1*2 -&\@q.}O_T.} -endstream -endobj -991 0 obj << -/Length 197 -/Filter /FlateDecode ->> -stream -xuA -P_ZJ-Pj"ZUˠ<Gqy&('< -9 -{J؆pYF1K~{ȟl9]1T\8T14 -WZz-UR#7xojb/PA -endstream -endobj -992 0 obj << -/Length 254 -/Filter /FlateDecode ->> -stream -xMN0/P<B$QQT&KHd@1QF2_͏rLxL(G?>n^~vi"L7v\=\uwxxj{vq3w;| 2hf*# \Y(
,E[#"(jH4%|Y *M'*Vf/^2:>dD{/dȦ~G%N;bE3GL!
J\(!W -endstream -endobj -993 0 obj << -/Length 196 -/Filter /FlateDecode ->> -stream -x] -PE#,~{!BI)~ciL"r ɽ7יE4,1r4l{ٟ0n(r.d_r;bf$sF[Kf>#`f~+jC^p1U -endstream -endobj -994 0 obj << -/Length 179 -/Filter /FlateDecode ->> -stream -x=̱ -0C>t - -ftr'utPtNW881Ci[~~.ENh)\2pR|KҫVxOw=eFFL6`aAϰ'p=/!=%=OyaSOE:ڞa]b
-endstream -endobj -995 0 obj << -/Length 221 -/Filter /FlateDecode ->> -stream -xu1j@1*#hNN8r\.]$$҆)}QBh2y`?0M^PFlYRU!,aUfK̓hGz{}?Y=QfM9e;ה8PNy^GZHf# -u`btmAx_ -endstream -endobj -996 0 obj << -/Length 198 -/Filter /FlateDecode ->> -stream -x=ν -0p=iiV08shGACo.C~܅a2G)g>tLDR 'ZFᗴ]r;f.xr#[)J=~ -endstream -endobj -997 0 obj << -/Length 144 -/Filter /FlateDecode ->> -stream -x337T0P -endstream -endobj -998 0 obj << -/Length 202 -/Filter /FlateDecode ->> -stream -x]ϱ -@B>BUj;:9::(:_G>BJ\8?!^ -endstream -endobj -999 0 obj << -/Length 114 -/Filter /FlateDecode ->> -stream -x313T0P0b#cCB.c3 -endstream -endobj -1000 0 obj << -/Length 188 -/Filter /FlateDecode ->> -stream -xڝ1 -@EG,irfITRb+PNya-BqӤy0ϛt>[,)҄Ҙ.dƔ~saaQ(Po$Fm|݊d.h(>- \(v -endstream -endobj -1001 0 obj << -/Length 114 -/Filter /FlateDecode ->> -stream -x313T0P0b#cCB.c3 -endstream -endobj -1002 0 obj << -/Length 186 -/Filter /FlateDecode ->> -stream -xڥ; -@a0͒IL!he!Vjihͣ,L2A-bvgodKEm_2w
ՁlF樒-=+h"*&IL -۾Q -endstream -endobj -1003 0 obj << -/Length 182 -/Filter /FlateDecode ->> -stream -xڥ= -@F'L2e*#Xuh{"dU<z2%MƆ -MG59vdKTK)r+]'TzN{t
A eCEط! UYD' HB
:qasպhyJ
-endstream -endobj -1004 0 obj << -/Length 116 -/Filter /FlateDecode ->> -stream -x313S0P0bcKcCB.cHrW06 -endstream -endobj -1005 0 obj << -/Length 228 -/Filter /FlateDecode ->> -stream -xUϽj@p-c͐tP -&cK_С᭫B|F)hj -BҔ|(qQ~@ubsGX-w܀rBl( &unzp>&5 -endstream -endobj -1006 0 obj << -/Length 220 -/Filter /FlateDecode ->> -stream -x͒ -0O -д*N⤎Q|>1B陶q#KQD=jǒˈv1Qv]5|_m8JPHvQ\E2G1Z)F1uL 2PhRw-4|
+-qC1pdr`BmMezrŌMA=|sGΗ7+{{IV+&L5
-endstream -endobj -1007 0 obj << -/Length 218 -/Filter /FlateDecode ->> -stream -x1N0Dgo|,Z:K" * -D JnE)xƳ/.c;k~铆MAǑ -wzKaﯟw -LJ)1STdnF&:wN"Hhhe6L -endstream -endobj -1008 0 obj << -/Length 123 -/Filter /FlateDecode ->> -stream -x3532Q0P0U54V05P0PH1*2
Rɹ\N\ -&&\@q.}O_T.} -endstream -endobj -1009 0 obj << -/Length 131 -/Filter /FlateDecode ->> -stream -x334V0P0bcCB. m -$ɥs{IO_T.} -endstream -endobj -1010 0 obj << -/Length 117 -/Filter /FlateDecode ->> -stream -x331V0P0b3cCB.S -endstream -endobj -1011 0 obj << -/Length 132 -/Filter /FlateDecode ->> -stream -x3735Q0P0S54V0T0PH1*23(Bs<̌=\ -%E\N -@BA,}C=?3?8hPiL3r - -endstream -endobj -1012 0 obj << -/Length 160 -/Filter /FlateDecode ->> -stream -x33Գ0R0P0ascCB.SC -@-\. -
-U%T;0 -a{?9\= -endstream -endobj -1013 0 obj << -/Length 159 -/Filter /FlateDecode ->> -stream -x313T0P0bCcCB.c - -endstream -endobj -1014 0 obj << -/Length 182 -/Filter /FlateDecode ->> -stream -xm10 $/=B| -uTD$02`nQz;TLycXM)x1p3y-c|AzMmx]!v+4x4ը4WDfB"hFeCȰļUj<C
ꄷ.7N|I -endstream -endobj -1015 0 obj << -/Length 100 -/Filter /FlateDecode ->> -stream -x3133W0 -endstream -endobj -1016 0 obj << -/Length 196 -/Filter /FlateDecode ->> -stream -xڽ1 -@E'X;dc$U F0Xu/Qr-SM!kWͦiiNl(YrG:A1bM2,(@> u"' -endstream -endobj -1017 0 obj << -/Length 136 -/Filter /FlateDecode ->> -stream -x3133W0P0b ebUel䃹 \.'O.pcc.}(BIQi*S!BA,ԃ@" a"A8
+B O
p" -endstream -endobj -1018 0 obj << -/Length 233 -/Filter /FlateDecode ->> -stream -xuN1}!t/P?8Ā -#QnPa0SlNz#p.eKDE፷GYn8Yp/_7qS'3;HDQUժU%
c^'auT4_X^ -endstream -endobj -1019 0 obj << -/Length 238 -/Filter /FlateDecode ->> -stream -xڍJ@GB&+L!he!ɣRnqwfZ 6?IR9-W^Y^^y۱՚w~{u&VRqf" -endstream -endobj -1020 0 obj << -/Length 184 -/Filter /FlateDecode ->> -stream -xڝϽ -0 -cv+tǟDH>rF -endstream -endobj -1021 0 obj << -/Length 210 -/Filter /FlateDecode ->> -stream -xڝ;j@ )a/⹀znA*N"rRHk97Qt-N惙fbI1e4Ii<0ev9|bQ},G5jKbmIo {J1B7?p^5$ڛ -endstream -endobj -1022 0 obj << -/Length 235 -/Filter /FlateDecode ->> -stream -xڍбN@`G"YHy4IHd@bFA(yCPn@'o>iR9-g^X_xձbR+y}y{d>Zn+)[D[
(±2Q4c24? O7݁_>0`J0b"ELJ#΄!B
Rβcl*]>C[⋎o=J -endstream -endobj -1023 0 obj << -/Length 183 -/Filter /FlateDecode ->> -stream -xڕ1@!&xhEVJ--4Z/G(¸JcH,&?0c)pDфpS4m6 -ņ(ԒEDVC6ƔvLM} -M, -endstream -endobj -1024 0 obj << -/Length 212 -/Filter /FlateDecode ->> -stream -xڕ1PKHxz}# b"NI4:?Q8#־8
m̧iF!%4))
gbHi:24+)t=h͂"4%# -X>@- -U64q3fku -endstream -endobj -1025 0 obj << -/Length 234 -/Filter /FlateDecode ->> -stream -xڕ=N@\4 -endstream -endobj -203 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F32 -/FontMatrix [0.01204 0 0 0.01204 0 0] -/FontBBox [ 0 -17 69 61 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 21 -/LastChar 255 -/Widths 1026 0 R -/Encoding 1027 0 R -/CharProcs 1028 0 R ->> endobj -1026 0 obj -[45.67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45.67 45.67 45.67 45.67 45.67 45.67 45.67 45.67 45.67 45.67 0 0 0 0 0 0 0 60.89 0 58.36 0 0 0 60.89 65.97 26.99 0 0 48.21 0 0 0 58.36 0 58.36 0 60.89 63.43 0 0 0 0 0 0 0 0 0 0 0 43.59 0 40.6 46.59 42.44 0 0 0 21.22 0 0 21.22 71.96 0 45.67 46.59 0 30.91 35.01 33.56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63.43 0 63.43 0 0 63.43 65.97 63.43 0 0 0 60.89 0 60.89 0 0 0 0 0 0 0 0 0 0 43.59 45.67 43.59 35.98 52.82 42.44 66.89 40.6 49.13 49.13 44.06 49.71 61.82 46.59 45.67 46.59 46.59 40.6 40.6 41.52 69.43 41.52 52.24 49.13 69.43 72.54 0 61.82 43.59 0 0 46.13 ] -endobj -1027 0 obj << -/Type /Encoding -/Differences [21/a21 22/.notdef 48/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57 58/.notdef 65/a65 66/.notdef 67/a67 68/.notdef 71/a71/a72/a73 74/.notdef 76/a76 77/.notdef 80/a80 81/.notdef 82/a82 83/.notdef 84/a84/a85 86/.notdef 97/a97 98/.notdef 99/a99/a100/a101 102/.notdef 105/a105 106/.notdef 108/a108/a109 110/.notdef 111/a111/a112 113/.notdef 114/a114/a115/a116 117/.notdef 200/a200 201/.notdef 202/a202 203/.notdef 205/a205/a206/a207 208/.notdef 211/a211 212/.notdef 213/a213 214/.notdef 224/a224/a225/a226/a227/a228/a229/a230/a231/a232/a233/a234/a235/a236/a237/a238/a239/a240/a241/a242/a243/a244/a245/a246/a247/a248/a249 250/.notdef 251/a251/a252 253/.notdef 255/a255] ->> endobj -1028 0 obj << -/a21 1015 0 R -/a48 1016 0 R -/a49 1017 0 R -/a50 1018 0 R -/a51 1019 0 R -/a52 1020 0 R -/a53 1021 0 R -/a54 1022 0 R -/a55 1023 0 R -/a56 1024 0 R -/a57 1025 0 R -/a65 957 0 R -/a67 958 0 R -/a71 959 0 R -/a72 960 0 R -/a73 961 0 R -/a76 962 0 R -/a80 963 0 R -/a82 964 0 R -/a84 965 0 R -/a85 966 0 R -/a97 967 0 R -/a99 968 0 R -/a100 969 0 R -/a101 970 0 R -/a105 971 0 R -/a108 972 0 R -/a109 973 0 R -/a111 974 0 R -/a112 975 0 R -/a114 976 0 R -/a115 977 0 R -/a116 978 0 R -/a200 979 0 R -/a202 980 0 R -/a205 981 0 R -/a206 982 0 R -/a207 983 0 R -/a211 984 0 R -/a213 985 0 R -/a224 986 0 R -/a225 987 0 R -/a226 988 0 R -/a227 989 0 R -/a228 990 0 R -/a229 991 0 R -/a230 992 0 R -/a231 993 0 R -/a232 994 0 R -/a233 995 0 R -/a234 996 0 R -/a235 997 0 R -/a236 998 0 R -/a237 999 0 R -/a238 1000 0 R -/a239 1001 0 R -/a240 1002 0 R -/a241 1003 0 R -/a242 1004 0 R -/a243 1005 0 R -/a244 1006 0 R -/a245 1007 0 R -/a246 1008 0 R -/a247 1009 0 R -/a248 1010 0 R -/a249 1011 0 R -/a251 1012 0 R -/a252 1013 0 R -/a255 1014 0 R ->> endobj -1029 0 obj << -/Length 557 -/Filter /FlateDecode ->> -stream -xڝ1n0apT$ Mz(NNi ڙ:Z#h %R$tF@I,%;3ުW?(᷸;>9|PA?^s9!YƘ}ҖאGՎWPI3jͲGҬ#kX&ȞHfiYC;NNv6
kX:טҙQifT!SWzZi -!=FBCX MЧA!ϾG,P@aDy0F+'t`zYSxG@a@2k(˺MM
7jfFuQu{CneSq@#h唲t:6cH%I#i҉bT.fMT@n9-H^1'+fXZ!*Q(?tN|] 7pN-҂WL`UY+hbkz`700e~.eEVCY4"zȽč]
7]ʨ%pʦǓ*W -endstream -endobj -1030 0 obj << -/Length 477 -/Filter /FlateDecode ->> -stream -xJ0Sr(/ 4/º=z ԣEQ=M3SiYXvLv2$x9=_dsX<kiOl7&]k¢%Y1_<tI7*2L5(3[T*!zʎLL+^0D@=Gf8Á5;SaKxm -\f,qLw\G),9ALMxssOLNEo̵t\Nq
L8eyg#j?şgvy}c|s:zyjAHrH}#X1s"`*^ GDr_k/ˠmn[OVس;5Dz-HK~A~BF -39w*x&6v;)i( -endstream -endobj -1031 0 obj << -/Length 486 -/Filter /FlateDecode ->> -stream -xֱN0 -CA\gz($^a.!P^67D - rMAv -endstream -endobj -1032 0 obj << -/Length 140 -/Filter /FlateDecode ->> -stream -x34732U0P02&@lbUehd2 - -endstream -endobj -1033 0 obj << -/Length 105 -/Filter /FlateDecode ->> -stream -x332Q0P02& -& -)\\F@0,ɥ`dȥU()*Mw -pV -(Dury(PQ4(0j -endstream -endobj -1034 0 obj << -/Length 140 -/Filter /FlateDecode ->> -stream -x34636S0P02F& -& -)\\ - -%E\N -\. -ц -\. -?0AQ(g3r(0 -endstream -endobj -1035 0 obj << -/Length 303 -/Filter /FlateDecode ->> -stream -xԱN0Tn#Om -ELJȀ@0'G#d&]b`IŊ},/ v6w7y>w`/H+H
-3̍ij;J|y${L)[1eL|
F,5A-nM2Sw3RRωϺE@tsH7u0ap9<f3@p8}oMtRTfQbFwT8][EM=аY!F@
GnDȑ#n2z/$ -endstream -endobj -1036 0 obj << -/Length 443 -/Filter /FlateDecode ->> -stream -xڵ1O0 -endstream -endobj -1037 0 obj << -/Length 149 -/Filter /FlateDecode ->> -stream -x= -@w9g@VbseK+"
d<uٱZ8>)heHxA J k]gHYBj+Beϣг7J_D+(ϦO2ȨvH2`7< -endstream -endobj -1038 0 obj << -/Length 300 -/Filter /FlateDecode ->> -stream -x햱N02T%{HDhH01 &`d(y<J!cϱ/i/w퓜JeW;PQu/ixD#P4w[|RX>CEME9Y1bĈ
o>zohZ?cFzJ3\uS|KNMyjVdDntБy:,:CB-VK/m~uye(ї6HI:{qZJSAhJuu6+̂#/p|V -endstream -endobj -1039 0 obj << -/Length 367 -/Filter /FlateDecode ->> -stream -xӱN0`["y#/ -Q#RIX: -3#rD)~cK')"E+SD7R6.(kܢԑSBᬞXry.B.1ārzZj
˜#;~2nReҹ#=QxL234$YSuoHʪG9IkXόqN]// -endstream -endobj -1040 0 obj << -/Length 352 -/Filter /FlateDecode ->> -stream -xݔJ0SzGym*lOu{AA=zP<Z%cL&i.GL&Ua -T9%Et54'I;Q]CչUw/oZ_nԷ -QlnCq鷕9Ȓ4}_wK/Pj牸.NLcRsA2.Bt'vW<l)ԫ}eJrKZbz+M!7ItۚY:/5%#7%%E_3ߍ֞vy<7}}z7|N\w裡 -endstream -endobj -1041 0 obj << -/Length 378 -/Filter /FlateDecode ->> -stream -xձN0 -mU -endstream -endobj -1042 0 obj << -/Length 379 -/Filter /FlateDecode ->> -stream -xڵj0m<hm֓ M -ԡ -m-<Eу;HP';[Y{}\і^FYho|na-Vv{<nA;&MO~I~4h%f037aaP5j1<ZeSXvXFa -f"9F7y gD$(`[r\hWUص7 6ZOX4$<3Ox>8̷v.ˣO -\dJyLy</ES&+m ?pyL#A̜IJk'.2=<ѨV6?*7&=y$" -endstream -endobj -1043 0 obj << -/Length 117 -/Filter /FlateDecode ->> -stream -x337S0P0 -%E\N -@ahX.O^{?"00@\= -endstream -endobj -1044 0 obj << -/Length 102 -/Filter /FlateDecode ->> -stream -x337S0P0 -%E\N -@ahX.O?F0ʸ\= -endstream -endobj -1045 0 obj << -/Length 351 -/Filter /FlateDecode ->> -stream -xJ0 --!<,8IBۀHWuU2i'-DslB̋36+us)Z&nf<mfM~%;B'Sj?F+&?>N/}?[(a -endstream -endobj -1046 0 obj << -/Length 364 -/Filter /FlateDecode ->> -stream -xݔN0SetK!~HNJȀbFɣQ3D1qܪ*+llG.kQBʕ0&d6ۥجvO@qg;!؋g)"#:#Z*8HAXi4fΐذvNMj֞grI䲧+#m*N4_kaSZ"tl}Jg'*)R -S4BS1|Cjc?Iw:]s)G=I^OLYƈ^k@w -iBr:{ݫJ]*-ei7HN/9z1$a=M{-q -</4:% -endstream -endobj -1047 0 obj << -/Length 372 -/Filter /FlateDecode ->> -stream -x=N0Ji -D (9YmC@
ϱNΏRD8:U(J<E -Ije>:N$1WZ}<Cqdɖ>b=cBF6c -#A$@eS:{\'Fg -Ue@N$ih-4D{h -هQc܄[y]_^0\iuYxnwJ>];:p.RjHغ[OKS - w!ՙ\fp4 -endstream -endobj -1048 0 obj << -/Length 215 -/Filter /FlateDecode ->> -stream -xѱ10<AZBBh(>X3ߜ vV"ކ9َ-;[}R62e
ewꔗ2r&/ItޅZbAAldval,l-$BmmrGhW@kx;_l}
JtH -endstream -endobj -1049 0 obj << -/Length 374 -/Filter /FlateDecode ->> -stream -xmӽN0pG"y)_ -N1~S?fY,.8M0)xXls(:?(+ -)c3,Iʡl_gx]@rR}ԋ!v[ߕ9CCR:Q&A -%+à7J[ ýۻ?~g}2 -endstream -endobj -1050 0 obj << -/Length 206 -/Filter /FlateDecode ->> -stream -xڳ30W0P0Q5T0R04PH1*2 -endstream -endobj -1051 0 obj << -/Length 418 -/Filter /FlateDecode ->> -stream -xڅսN0aI.^N$GMd08Fg4.(P@x6Z.w4'ӥ8=Μl(g+= n$n+w },hD+ZB#hkK4׆;pd8pb8pi0!^Gp@-ȉMx]CY '{p9`ȵai#rd8<stt>Cہn1=fY,_3Xnt/n/KKv)k-4ϗN|i4ϗ.-w<i/,]"e#KͮZ+7Ȁ-G|rj5-qwX[?ȿ2ڎ6Ԏpc8{4<l`pg]k{9*o^h"on6 -endstream -endobj -1052 0 obj << -/Length 625 -/Filter /FlateDecode ->> -stream -xeֽn@p[.VƏ}|&! -$@Q%E"m/+]n؝~ߝzy1u}생oh.ܱxÎǷ㏯v{Mvw'wdn?_âC`` -!rȩ - -%B*(ZaΩZ³tyjZ`(jjM2ԩ055fjHR -@+W-&` $-R, -GA<Ty$4x>>:
> }V64ME08
UNET Nݡynz *`/5XExu[>?⛁ -endstream -endobj -1053 0 obj << -/Length 139 -/Filter /FlateDecode ->> -stream -x34Գ0S0P02&@lbUe2 -@.}BIQi*S!BA,0?|GC 4>GQ>Aopzrr -endstream -endobj -1054 0 obj << -/Length 571 -/Filter /FlateDecode ->> -stream -x;n0%l!A@,6 pl [HAeI-MGX Ȉ)bWF%>gw@);7n(;7F~vs[x_>-Dw&B{'2xKgFm<Be -V:qll0"]JLt܉@+P^vڋ.iS]҇'eTjx %OٻgZNL-Xe=gaO@U6[kfg] -endstream -endobj -1055 0 obj << -/Length 134 -/Filter /FlateDecode ->> -stream -x34Գ0S0P02&@lbUe2 -@.}BIQi*S!BA,p`Q(?GC_ƷgW\= -endstream -endobj -1056 0 obj << -/Length 603 -/Filter /FlateDecode ->> -stream -xڅ10m&GHN@APEZ)@T@I:(RnR8v=#FZieb<ǏUS]_{yVOSkrPs5;;Sڸ~|6Uk}[5觰smh娷Pрhr֎nMh -f2r;4gn&φVI_yѠPhqig+(@\-W:<Z!cG -"Q]D4c\݅٩:CtqwD+'{O$EE9DEs}=NI,{FtJLBP˒hƍF0EV;m)%$Rl?c^hUloӣH\@p51@\(^0Ɏ+!5&q NaI(74CG3~2:&vZ)/v~3yÐW»yۧ)gDeMJ`Ib
Kr-N"%)ʄʅ;w}rY|*Bf4K4I4H$P $ZY$6ռ5 -endstream -endobj -1057 0 obj << -/Length 651 -/Filter /FlateDecode ->> -stream -xڅֽn@\XƏylDe)-@T@Iy3QRl<sΜ3cFYex?oφWvxҎ/u4?x3X廹;~`.77߽mGO>m_SmK2]_Rt=5۶hsQ?hR.=B6B`^{"뤹$ZC]U`ZkdmNSJLA6b+kNQUzi*tIm_m(h)iN#V`pv&XkVbmp)*Vu.(7NZ^$+IJRTYJI=Rc4DEm9+IJ`%X/TxX9ÖG_<(8<PU9uم?`S9}0'.tbk%k[ե)fSVwTl5ݧb=>B]WdO)LUhofjX--hAlÁU˂5<Y#1YgmLX"Z+>BJxĤקUa -=V_mQGU+{v"ܮùE{pbY+GJ
@|+wEtxhUIKve[M+Q7gj -endstream -endobj -1058 0 obj << -/Length 367 -/Filter /FlateDecode ->> -stream -xӱN0`["y#/ -Q#RIX: -3#rD)~cK')"E+SD7R6.(kܢԑSBᬞXry.B.1ārzZj
˜#;~2nReҹ#=QxL234$YSuoHʪG9IkXόqN]// -endstream -endobj -1059 0 obj << -/Length 526 -/Filter /FlateDecode ->> -stream -xݕn1ƽraɍ~3 -9QY -AH@ %QvrpFֱ3p'%%W|3fGѯ]ڪWZiVKM\o&>._?xǏ透WiIЉHrTH 2$H , -0d`n
ZtN5m%ac"ۉ 2PeHK fH?I6 a(y&{ĊȚZ
e3er.H'6z0xhdp"ٌ.f3Nf25ԸicZ2RH)?4VU\Kvf#w$&R\ܾ(E8(!:GQS,ڟ"ɽ;Mg/%n=K@I -endstream -endobj -1060 0 obj << -/Length 312 -/Filter /FlateDecode ->> -stream -xڭ=N0T#' 1LJȀb* (=BQvD_~yQJR'/dq!_}.eOrSPvg)eۇ(g%v%檝`<{0717ڜm={5,
.䟼?)y|kWNzj9˚kpwS
=1i
Ba:_lri"&,~`\<@}[OTCΧ1*CSsG.2h]>B=? -endstream -endobj -1061 0 obj << -/Length 124 -/Filter /FlateDecode ->> -stream -xڳԳ0R0P0& -F -)\\&@IrW07 -s{*r;8+r(D*ry(z~00m`5٬z8(Փ+ -endstream -endobj -1062 0 obj << -/Length 239 -/Filter /FlateDecode ->> -stream -xӽ -0[4
~M?N⤎|ѡxVJSR/\UBX_ǖs+༙{]MugKhƘ` -endstream -endobj -1063 0 obj << -/Length 379 -/Filter /FlateDecode ->> -stream -xڵj0m<hm֓ M -ԡ -m-<Eу;HP';[Y{}\і^FYho|na-Vv{<nA;&MO~I~4h%f037aaP5j1<ZeSXvXFa -f"9F7y gD$(`[r\hWUص7 6ZOX4$<3Ox>8̷v.ˣO -\dJyLy</ES&+m ?pyL#A̜IJk'.2=<ѨV6?*7&=y$" -endstream -endobj -1064 0 obj << -/Length 618 -/Filter /FlateDecode ->> -stream -xڅ@![L3 -[R &r·0
xݧ1|
y>~ wпsпCE7{?vÇpN)ݪ5iOM⣘v -endstream -endobj -1065 0 obj << -/Length 384 -/Filter /FlateDecode ->> -stream -xڭ;N0'rM -D GQ|)~ĞV"6Wgjԥ:iU4;Wڽu˻eokYתN=y -{D֣@l -L+yK*K<۸kfLс;Jx줃0uՒ=S
ڄ C&|EyL20
}W!tBR\Om%c<0q6i3@qUԫ=gBb_yN&Y5!G>w9: H)y)@?*[Dyg -endstream -endobj -1066 0 obj << -/Length 314 -/Filter /FlateDecode ->> -stream -xuӱN0aI>kLd"^Ltr0N^Ga}ym@;eOKyyvqK+O!v(Bi+7xUɊ2+[8G'x
*2#PZْ48&ÈatGMСk%(4x :ܣ34q:+48-4gΉMΖ1[GtBls=:9AhYm_6gY,_ݦ۹yx ]-Z,nYsa̤ -endstream -endobj -1067 0 obj << -/Length 436 -/Filter /FlateDecode ->> -stream -xԽn0p?AT,JeLLI~4<2 N9)g@kPIMp-,nx8ZT_ݸo˯:|h2JI -mNٮL1йFtpYS#pk*iK; -endstream -endobj -1068 0 obj << -/Length 410 -/Filter /FlateDecode ->> -stream -xu;N@`G."m#'q -67[p|H4.Vv^iHaq3/j.u}曕ݫkN=>J_i]uSW]Ǯjdz67v~ڭ_C_g
Pt@b\&9A -ffh♙#Rf3jܥK3cܥ+bQ!i.[w -endstream -endobj -1069 0 obj << -/Length 224 -/Filter /FlateDecode ->> -stream -xӱ -0 -endstream -endobj -1070 0 obj << -/Length 395 -/Filter /FlateDecode ->> -stream -xڍ1O0pI>r3759Ltr0Nѹ$0dsM³}BV,т\8|9緂=0!gfc7la%,;,ۜ;Ώ`ٚ_Gf%@4 -L -endstream -endobj -1071 0 obj << -/Length 126 -/Filter /FlateDecode ->> -stream -x3423U0P02 -F -)\\ Q,ɥ`aʥU()*Mw -pV0wQ6T0tQ -endstream -endobj -1072 0 obj << -/Length 364 -/Filter /FlateDecode ->> -stream -xݔN0SetK!~HNJȀbFɣQ3D1qܪ*+llG.kQBʕ0&d6ۥجvO@qg;!؋g)"#:#Z*8HAXi4fΐذvNMj֞grI䲧+#m*N4_kaSZ"tl}Jg'*)R -S4BS1|Cjc?Iw:]s)G=I^OLYƈ^k@w -iBr:{ݫJ]*-ei7HN/9z1$a=M{-q -</4:% -endstream -endobj -1073 0 obj << -/Length 125 -/Filter /FlateDecode ->> -stream -x3423U0P02 -F -)\\ Q,ɥ`aʥU()*Mw -pV0wQ6T0tQ< -endstream -endobj -1074 0 obj << -/Length 372 -/Filter /FlateDecode ->> -stream -x=N0Ji -D (9YmC@
ϱNΏRD8:U(J<E -Ije>:N$1WZ}<Cqdɖ>b=cBF6c -#A$@eS:{\'Fg -Ue@N$ih-4D{h -هQc܄[y]_^0\iuYxnwJ>];:p.RjHغ[OKS - w!ՙ\fp4 -endstream -endobj -1075 0 obj << -/Length 352 -/Filter /FlateDecode ->> -stream -xݔJ0SzGym*lOu{AA=zP<Z%cL&i.GL&Ua -T9%Et54'I;Q]CչUw/oZ_nԷ -QlnCq鷕9Ȓ4}_wK/Pj牸.NLcRsA2.Bt'vW<l)ԫ}eJrKZbz+M!7ItۚY:/5%#7%%E_3ߍ֞vy<7}}z7|N\w裡 -endstream -endobj -1076 0 obj << -/Length 132 -/Filter /FlateDecode ->> -stream -x3443T0P0bCK#CB.CCJr1 -s{*r;8+ -\= -endstream -endobj -1077 0 obj << -/Length 481 -/Filter /FlateDecode ->> -stream -xڕj@:ANI -)Sc
hz
\zThGv]__\\7jۮx}͓_}8gw<;lMEoSU0 u.a+1":; /%fߤ8_Qq('PP~P -PH -ue 3e[& -endstream -endobj -1078 0 obj << -/Length 534 -/Filter /FlateDecode ->> -stream -x;N@cM -{[7Fj&AZɆA7e1P7
5iK{|PkuѢ648 .Z#=)Y}r'o"좃i۽m}hQ0;N(R#Q.g4cs7QQDNSI=1vɒ
SeVp[vwT.TOdWE+:JV*' -' eLޮV?Tޞ*mN>||yƿF:2U` -endstream -endobj -1079 0 obj << -/Length 447 -/Filter /FlateDecode ->> -stream -xuN0;P)=BNƐ N'ؑQ
i&q'F"Һک%^^oϘ^o7ըwe+A;LݠGn
w렺6'g5쵅sG, -endstream -endobj -1080 0 obj << -/Length 144 -/Filter /FlateDecode ->> -stream -x; -1*4L!he!VjihD^!Rh1'{ G)A<'(|=@5)Fp-x1<_wTwTZu9pf8 -endstream -endobj -1081 0 obj << -/Length 184 -/Filter /FlateDecode ->> -stream -xԱ -@ -endstream -endobj -1082 0 obj << -/Length 140 -/Filter /FlateDecode ->> -stream -x3031W0P02 -F -)\\&f - 1 ,ɥ - -endstream -endobj -1083 0 obj << -/Length 159 -/Filter /FlateDecode ->> -stream -x˱ -0=Ž&ةP+AAAidiS;B5H+_ @KF2|C@1n~67P~+<ŏgp.ә+65)s*mBPPPPP[8LcXa6/ -endstream -endobj -1084 0 obj << -/Length 256 -/Filter /FlateDecode ->> -stream -xԽ -0 -endstream -endobj -1085 0 obj << -/Length 240 -/Filter /FlateDecode ->> -stream -xұ -0 -endstream -endobj -1086 0 obj << -/Length 359 -/Filter /FlateDecode ->> -stream -xڥӱN@`6<\jL0XF|º;;$5\ܿoN.63w&WojG[Oj;><Qu|v{{izCoG5LA\shP#4"J^ <QbD|A}ʮ/@5:%76"zF-Ԭ9Ym_!͏yX.ǰ# f͝D&+CǢ2l{g}'W;!%3R2#%3R2\[֣@c,|T
.pߏٱ8UÌJ2A Lhr2A L䄹xI]
ND6 -endstream -endobj -201 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F31 -/FontMatrix [0.00484 0 0 0.00484 0 0] -/FontBBox [ 2 -41 183 146 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 65 -/LastChar 255 -/Widths 1087 0 R -/Encoding 1088 0 R -/CharProcs 1089 0 R ->> endobj -1087 0 obj -[163.09 0 155.82 0 0 0 162.59 171.25 68.24 0 0 134.36 0 0 0 156.07 0 158.76 0 167.98 167.17 0 0 0 0 0 0 0 0 0 0 0 117.45 0 108.39 126.5 108.45 0 0 0 58.76 0 0 58.76 194.25 0 121.94 126.5 0 83.58 93.49 88.07 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 169.86 0 169.86 0 0 169.86 181.53 169.86 0 0 0 163.09 0 163.09 0 0 0 0 0 0 0 0 0 0 117.45 121.94 117.45 99.82 133.39 108.45 180.7 108.39 130.58 130.58 119.73 129.95 161.76 126.5 121.94 126.5 126.5 108.39 113.79 112.95 187.47 112.95 134.03 130.58 187.47 190.92 0 167.15 117.45 0 0 126.92 ] -endobj -1088 0 obj << -/Type /Encoding -/Differences [65/a65 66/.notdef 67/a67 68/.notdef 71/a71/a72/a73 74/.notdef 76/a76 77/.notdef 80/a80 81/.notdef 82/a82 83/.notdef 84/a84/a85 86/.notdef 97/a97 98/.notdef 99/a99/a100/a101 102/.notdef 105/a105 106/.notdef 108/a108/a109 110/.notdef 111/a111/a112 113/.notdef 114/a114/a115/a116 117/.notdef 200/a200 201/.notdef 202/a202 203/.notdef 205/a205/a206/a207 208/.notdef 211/a211 212/.notdef 213/a213 214/.notdef 224/a224/a225/a226/a227/a228/a229/a230/a231/a232/a233/a234/a235/a236/a237/a238/a239/a240/a241/a242/a243/a244/a245/a246/a247/a248/a249 250/.notdef 251/a251/a252 253/.notdef 255/a255] ->> endobj -1089 0 obj << -/a65 1029 0 R -/a67 1030 0 R -/a71 1031 0 R -/a72 1032 0 R -/a73 1033 0 R -/a76 1034 0 R -/a80 1035 0 R -/a82 1036 0 R -/a84 1037 0 R -/a85 1038 0 R -/a97 1039 0 R -/a99 1040 0 R -/a100 1041 0 R -/a101 1042 0 R -/a105 1043 0 R -/a108 1044 0 R -/a109 1045 0 R -/a111 1046 0 R -/a112 1047 0 R -/a114 1048 0 R -/a115 1049 0 R -/a116 1050 0 R -/a200 1051 0 R -/a202 1052 0 R -/a205 1053 0 R -/a206 1054 0 R -/a207 1055 0 R -/a211 1056 0 R -/a213 1057 0 R -/a224 1058 0 R -/a225 1059 0 R -/a226 1060 0 R -/a227 1061 0 R -/a228 1062 0 R -/a229 1063 0 R -/a230 1064 0 R -/a231 1065 0 R -/a232 1066 0 R -/a233 1067 0 R -/a234 1068 0 R -/a235 1069 0 R -/a236 1070 0 R -/a237 1071 0 R -/a238 1072 0 R -/a239 1073 0 R -/a240 1074 0 R -/a241 1075 0 R -/a242 1076 0 R -/a243 1077 0 R -/a244 1078 0 R -/a245 1079 0 R -/a246 1080 0 R -/a247 1081 0 R -/a248 1082 0 R -/a249 1083 0 R -/a251 1084 0 R -/a252 1085 0 R -/a255 1086 0 R ->> endobj -1090 0 obj << -/Length 241 -/Filter /FlateDecode ->> -stream -xڅj@'*4)9 i -HO={HHh>J!Gtv RT>ݙtTpz.=rކoZVyէ5/3WeTXD:"
(ΕR]#a9Ri@G&IV>JOѯA@Mlz<uHI/+m;%Y"1Y<FD0>G//ۢ -endstream -endobj -1091 0 obj << -/Length 251 -/Filter /FlateDecode ->> -stream -xڵj0/x0GȽ@*1i -PhS1CB2GG#x`z=T!,EX>IKȟ%YNEIeFXF9ו=j4Th^~Cz͚6_X -Qc^~:Ĵjo ܃PyƏ\ -UzUw>CSu(/1_Hl;Mߵw@ -endstream -endobj -1092 0 obj << -/Length 212 -/Filter /FlateDecode ->> -stream -xڍͿn0/P:2{j"BRJ%2T*bFVl?Zޤ~gC]Y=U/<㒧V|(-ٟnnx 2板~dW..y[lG͒0 -endstream -endobj -1093 0 obj << -/Length 181 -/Filter /FlateDecode ->> -stream -xUα -0C>%j3:9utPtG#tt-rTՒ#^8eL7J{ ->W5'UI-?|dǘ邭p4Z`= ^`Vc|-Cta@8cÙjKݦan%hiO_Pp -endstream -endobj -1094 0 obj << -/Length 145 -/Filter /FlateDecode ->> -stream -x3532T0 -endstream -endobj -1095 0 obj << -/Length 219 -/Filter /FlateDecode ->> -stream -xuϱJ0dAhZR^N⤎y>J!ci -f '?k|p[sSCo;BܕLnws
=7\?Pg$̀ȂB$È! U&c5*!N`)ESreX U&Dw5dd$T?2!DmnZ.{/yr -endstream -endobj -1096 0 obj << -/Length 134 -/Filter /FlateDecode ->> -stream -x3534T0P -endstream -endobj -1097 0 obj << -/Length 221 -/Filter /FlateDecode ->> -stream -xڕ0:TG_K9`H01@w+ɣQ;T1Ąd}8o=~RFc'~s<I3#=M~XVGFUGU(G5]N7Vs0 -endstream -endobj -1098 0 obj << -/Length 202 -/Filter /FlateDecode ->> -stream -xڕn@ĀG/ P):T"3$Jgx{{WlٟKs.R:fOtd^VdL{LrAׂ7ZL@&Ԣ( >dD/eV?pC{)ïa/D>dBL9;LpZCcG{Xi -endstream -endobj -1099 0 obj << -/Length 95 -/Filter /FlateDecode ->> -stream -xI;@@T)ޮ}zBBJ^@o~̨楣a\-abXv -Ua -endstream -endobj -1100 0 obj << -/Length 218 -/Filter /FlateDecode ->> -stream -xM;0u%GhN@X+bFzlET
y%Deّ2<#Uyy 'cKsNVSa:3wX̌ -endstream -endobj -1101 0 obj << -/Length 85 -/Filter /FlateDecode ->> -stream -x323P0PbCCB.MrW -%E\N -\. -ц -\. -Փ+ -endstream -endobj -1102 0 obj << -/Length 213 -/Filter /FlateDecode ->> -stream -xڽ;@@PLY@+?&ZY+hx3()0bm6yl;0'M鐢N^QԞh/8KPHV<F~{Q6s -P-hdA -ppJLs/uhzHadkAq?Z*Kb.
tBҪ&d n
a -endstream -endobj -1103 0 obj << -/Length 128 -/Filter /FlateDecode ->> -stream -x337U0P -endstream -endobj -1104 0 obj << -/Length 240 -/Filter /FlateDecode ->> -stream -xuJ@4iy7r +PK-GHbɺ !~03l;nJN[~)XRjޓd[z%{K.>2h"Zu3\oZc(0 <M߂KN 7_@#zP:AG]s&-I)wH$-ME˗Zet]= -endstream -endobj -1105 0 obj << -/Length 252 -/Filter /FlateDecode ->> -stream -xڍ1KAg"2ͶлK'IAPKEOOٟ}wI _1W]]LRH%Re2*gr=ܼY4yߟOgs)9_K)+7!DdT4RQҪѕړ\h<l0g)pl[$7%QC57w[d[v -endstream -endobj -164 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F20 -/FontMatrix [0.01004 0 0 0.01004 0 0] -/FontBBox [ 0 -16 60 71 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 46 -/LastChar 245 -/Widths 1106 0 R -/Encoding 1107 0 R -/CharProcs 1108 0 R ->> endobj -1106 0 obj -[27.08 0 48.75 48.75 48.75 48.75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64.71 0 0 0 0 0 0 0 0 0 0 0 0 0 0 62.29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46.68 0 46.68 0 52.21 43.33 0 0 0 0 0 51.11 0 0 48.75 0 0 43.33 44.83 0 0 44.6 ] -endobj -1107 0 obj << -/Type /Encoding -/Differences [46/a46 47/.notdef 48/a48/a49/a50/a51 52/.notdef 194/a194 195/.notdef 209/a209 210/.notdef 224/a224 225/.notdef 226/a226 227/.notdef 228/a228/a229 230/.notdef 235/a235 236/.notdef 238/a238 239/.notdef 241/a241/a242 243/.notdef 245/a245] ->> endobj -1108 0 obj << -/a46 1101 0 R -/a48 1102 0 R -/a49 1103 0 R -/a50 1104 0 R -/a51 1105 0 R -/a194 1090 0 R -/a209 1091 0 R -/a224 1092 0 R -/a226 1093 0 R -/a228 1094 0 R -/a229 1095 0 R -/a235 1096 0 R -/a238 1097 0 R -/a241 1098 0 R -/a242 1099 0 R -/a245 1100 0 R ->> endobj -1109 0 obj << -/Length 259 -/Filter /FlateDecode ->> -stream -xڥбN0`,<BVH! &7 -endstream -endobj -1110 0 obj << -/Length 257 -/Filter /FlateDecode ->> -stream -xѿN@%$(l<.Zg"VJ--4ZÛɣ#Pnqa%^N_og+nxGS ?Zz֢}=<Ӧ[KS_՛sFyw-t7JtBՁRu*U,4Xdԡ.ŒhrA)V)w`T.̫!1&0>6q`ÞpA -ăIyM>A3Kgw:fN~.(>F -endstream -endobj -1111 0 obj << -/Length 230 -/Filter /FlateDecode ->> -stream -x펿JAG8 [B:B0Xi9|Q@߈M:[ffi;wlfQ)osEƵS,ZKw;NHyPa鐈 -3\"oY{.z#}R!SeZu6W"h#;Dq?zJ -endstream -endobj -1112 0 obj << -/Length 262 -/Filter /FlateDecode ->> -stream -xՑ=N@FJai!spTBp -E!GI#tacfR ~ٟy3d(مLyrcLg'2v\'ٍ,VϜn/E9ҐVb([Ş,U#=TjBC6ACB7k(@??v:}ѱcV{LT^ZKWAPl>wejv&_>|wq6߂2O -endstream -endobj -1113 0 obj << -/Length 156 -/Filter /FlateDecode ->> -stream -x1 -@a!s7U FpA+r!e -qV
ͦ'X39Yr"']^5qfSlbٔr})D+T)jP1L Nc4@u"}^yQ@V -endstream -endobj -1114 0 obj << -/Length 254 -/Filter /FlateDecode ->> -stream -xڍ=N@F@Gع - -(#(>(7")Ӽb~v~tyd&Y.kYdyK98|nxr|9ޣ̱}w[IWܮHwDTDꈂUҹA1L+5QC]"uX98sofcj L1+3ix6gk}/̙S
~xc,-P -endstream -endobj -1115 0 obj << -/Length 222 -/Filter /FlateDecode ->> -stream -xѽ -0C>uIQg|l`:2x)\ kI;g(-f#KRv@ 3A͑!Zj/jaDlv -z9䌩 -tNsЈ}9])ި>~7u:ns|n6G5ȹ>پJX(o( -endstream -endobj -1116 0 obj << -/Length 259 -/Filter /FlateDecode ->> -stream -xڥбN0`,<BVH! &7 -endstream -endobj -1117 0 obj << -/Length 224 -/Filter /FlateDecode ->> -stream -x}10x 5D`qRGh#02G/-m`SV`gE7C3it8!g?$6$
?x`ErHɒi!,%Ym@ -a Ҳ.p>;{µյHY9g?=hs6nWܮzH@4 - -E5Uhnﭳ~[Z%
-endstream -endobj -1118 0 obj << -/Length 173 -/Filter /FlateDecode ->> -stream -x3731Q0P0V52V03S03RH1*@ha -Jr* -endstream -endobj -1119 0 obj << -/Length 270 -/Filter /FlateDecode ->> -stream -xڕ1J@'L#d.I +Puh()S3 ظ-??yҎ::kWlziJM7/Qӣ6>o.Fwv8A`eϙ'A*f6&Ex!u9c1iA>k2hN|&aX!ȶ[_[57kW~1 -endstream -endobj -1120 0 obj << -/Length 192 -/Filter /FlateDecode ->> -stream -xU1@%$p.K1D+cXXz"G,I&*b"T|Pt 7f4' &$%_/#t5cE2p<c] -H -X;iA)*d?GqZmF -1> -endstream -endobj -1121 0 obj << -/Length 276 -/Filter /FlateDecode ->> -stream -xMѽN@%[l2
>{v3D+.Wca#(^kRRÂ3*FeIxcJxʛgX7v c͝{=!7{Zyf3ahb$3K'
B1 iA1Jc#8Fp;~(eɷC*Ji - -V3:{tgi{i1
b?+Ԙv%VtW[ttŸ$:[%AՖi.""̲ -endstream -endobj -1122 0 obj << -/Length 163 -/Filter /FlateDecode ->> -stream -x3Գ4R0P -endstream -endobj -1123 0 obj << -/Length 272 -/Filter /FlateDecode ->> -stream -xm1N0PG),M#' -RYZHPQ * -JQ)SD13q6.FoƖK>OȢRղʇPn`@~# -C\חGwWg|/o4{iG'ƃ#! -sA߄01!> -5F! 4"sP=LiҬXF"1D#"KF`6@-`Y|11}} -endstream -endobj -1124 0 obj << -/Length 264 -/Filter /FlateDecode ->> -stream -xڭ1N0u%G/ -
=mÊB<GGm@%kzxFk?O8&&0` -endstream -endobj -1125 0 obj << -/Length 101 -/Filter /FlateDecode ->> -stream -x33Q0P04 -fF -)\\&f@IrW01 -s{*r;8+r(DUry(?D
$H.WO@. -endstream -endobj -1126 0 obj << -/Length 262 -/Filter /FlateDecode ->> -stream -xՑ=N@FJai!spTBp -E!GI#tacfR ~ٟy3d(مLyrcLg'2v\'ٍ,VϜn/E9ҐVb([Ş,U#=TjBC6ACB7k(@??v:}ѱcV{LT^ZKWAPl>wejv&_>|wq6߂2O -endstream -endobj -1127 0 obj << -/Length 247 -/Filter /FlateDecode ->> -stream -xڭj0xG@l'CB=CȔtңQ;+w:A%]g{ZPK5-5*ĺ"kyG|} -튶-v8 GUYB3N -endstream -endobj -1128 0 obj << -/Length 104 -/Filter /FlateDecode ->> -stream -x33Գ4T0P0bSK3#CB.SS -endstream -endobj -1129 0 obj << -/Length 299 -/Filter /FlateDecode ->> -stream -xmJ0 -:/=z ԣEvoCL'i~k4宂jwДRwl Kojߪ6[U*[zU -p|G,أ;VtI9 }bԈ|d323 ^Ib1iɁpBvu68aY03Y6,8=^q0`דzbQ@6_fl~22vX˱~{;ɱD)M$⮆X#*fbuz'qN.WK˯RW?! -endstream -endobj -1130 0 obj << -/Length 329 -/Filter /FlateDecode ->> -stream -x픱N0Se% -endstream -endobj -1131 0 obj << -/Length 114 -/Filter /FlateDecode ->> -stream -x373T0P04T52V -Ĺ -0\.'O.pSs.}BIQi*S!BA, 1J1H~\\\ -endstream -endobj -1132 0 obj << -/Length 184 -/Filter /FlateDecode ->> -stream -x333P0P04f -fF -)\\&@IrW0 -s{*r;8+r(DUry(o` -endstream -endobj -1133 0 obj << -/Length 88 -/Filter /FlateDecode ->> -stream -x3631W0P04F& - -)\\@NrW -%E\N -\. -ц -\. -!'W -endstream -endobj -163 0 obj << -/Type /Font -/Subtype /Type3 -/Name /F19 -/FontMatrix [0.00697 0 0 0.00697 0 0] -/FontBBox [ 2 -29 98 103 ] -/Resources << /ProcSet [ /PDF /ImageB ] >> -/FirstChar 46 -/LastChar 252 -/Widths 1134 0 R -/Encoding 1135 0 R -/CharProcs 1136 0 R ->> endobj -1134 0 obj -[37.47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64.68 0 0 69.4 0 0 0 0 0 0 0 0 106.87 0 0 69.4 0 45.94 51.71 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 86.01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64.68 0 64.68 0 70.44 59.95 0 0 72.17 0 65.66 69.92 89.92 0 67.44 69.4 69.4 59.95 61.91 61.91 103.13 0 72.69 0 0 0 0 0 64.68 ] -endobj -1135 0 obj << -/Type /Encoding -/Differences [46/a46 47/.notdef 97/a97 98/.notdef 100/a100 101/.notdef 109/a109 110/.notdef 112/a112 113/.notdef 114/a114/a115 116/.notdef 208/a208 209/.notdef 224/a224 225/.notdef 226/a226 227/.notdef 228/a228/a229 230/.notdef 232/a232 233/.notdef 234/a234/a235/a236 237/.notdef 238/a238/a239/a240/a241/a242/a243/a244 245/.notdef 246/a246 247/.notdef 252/a252] ->> endobj -1136 0 obj << -/a46 1133 0 R -/a97 1109 0 R -/a100 1110 0 R -/a109 1111 0 R -/a112 1112 0 R -/a114 1113 0 R -/a115 1114 0 R -/a208 1115 0 R -/a224 1116 0 R -/a226 1117 0 R -/a228 1118 0 R -/a229 1119 0 R -/a232 1120 0 R -/a234 1121 0 R -/a235 1122 0 R -/a236 1123 0 R -/a238 1124 0 R -/a239 1125 0 R -/a240 1126 0 R -/a241 1127 0 R -/a242 1128 0 R -/a243 1129 0 R -/a244 1130 0 R -/a246 1131 0 R -/a252 1132 0 R ->> endobj -1137 0 obj << -/Length1 787 -/Length2 773 -/Length3 0 -/Length 1312 -/Filter /FlateDecode ->> -stream -xڭRkPWՊat|W >@,2A-(HD&tM͆&"HE)c䡈P[8>ZR(VTh-6LQ -g}(%jogwιwwLi0$@i\ -Ē%X&P6Fu* DBx`+7FfpZjTgNP+L|N#%1xYwu2'O-oy[3)Qx͟rȰpB -sjB3TmjNβZeH[S_vןp,S.ܙ0MCWݮ<Rh,oH5g8gA\~;k_lcYWዀm+>^+Junmc'+Y6[}&5'r,=~~uycecTތViOоl:5 ;ԕ/&aG[Sw7r3;2lpNAcU-iho^3+XlrS@\xZ=/,Tw}:yo?ǶzϿrEyO8G+TbnpkfŚk94,ܱ*Ay]F`uF@Ԏ]eqm%_=1kFpR=k͜tSȟ^5$Lc%./7;?v6YղC:|Ԍen=ڢdї6/Dw*[wR.ɰF|\O^>rkϨ -
<5;_VLMQLMQ:s2&(6#F<)+f~]Ăd˧sO47Z<t{+?]㑺~MѬ;Ec~SQᶓ#Y-Iχ+9RD'ݸkcᵅ}iR{߸^"^,\}]M9\&,BXՕӡv6k]w? -endstream -endobj -1138 0 obj << -/Type /FontDescriptor -/FontName /WLBROP+CMSY10 -/Flags 4 -/FontBBox [-29 -960 1116 775] -/Ascent 750 -/CapHeight 683 -/Descent -194 -/ItalicAngle -14 -/StemV 85 -/XHeight 431 -/CharSet (/bullet/minus/similar) -/FontFile 1137 0 R ->> endobj -233 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /WLBROP+CMSY10 -/FontDescriptor 1138 0 R -/FirstChar 0 -/LastChar 24 -/Widths 627 0 R ->> endobj -165 0 obj << -/Type /Pages -/Count 6 -/Parent 1139 0 R -/Kids [158 0 R 199 0 R 212 0 R 218 0 R 229 0 R 236 0 R] ->> endobj -259 0 obj << -/Type /Pages -/Count 6 -/Parent 1139 0 R -/Kids [240 0 R 261 0 R 266 0 R 270 0 R 274 0 R 278 0 R] ->> endobj -286 0 obj << -/Type /Pages -/Count 6 -/Parent 1139 0 R -/Kids [283 0 R 288 0 R 292 0 R 296 0 R 300 0 R 304 0 R] ->> endobj -315 0 obj << -/Type /Pages -/Count 6 -/Parent 1139 0 R -/Kids [308 0 R 317 0 R 322 0 R 327 0 R 331 0 R 335 0 R] ->> endobj -342 0 obj << -/Type /Pages -/Count 6 -/Parent 1139 0 R -/Kids [339 0 R 344 0 R 360 0 R 376 0 R 385 0 R 389 0 R] ->> endobj -396 0 obj << -/Type /Pages -/Count 6 -/Parent 1139 0 R -/Kids [393 0 R 398 0 R 402 0 R 406 0 R 410 0 R 414 0 R] ->> endobj -421 0 obj << -/Type /Pages -/Count 6 -/Parent 1140 0 R -/Kids [418 0 R 423 0 R 427 0 R 431 0 R 435 0 R 439 0 R] ->> endobj -446 0 obj << -/Type /Pages -/Count 4 -/Parent 1140 0 R -/Kids [443 0 R 448 0 R 453 0 R 457 0 R] ->> endobj -1139 0 obj << -/Type /Pages -/Count 36 -/Parent 1141 0 R -/Kids [165 0 R 259 0 R 286 0 R 315 0 R 342 0 R 396 0 R] ->> endobj -1140 0 obj << -/Type /Pages -/Count 10 -/Parent 1141 0 R -/Kids [421 0 R 446 0 R] ->> endobj -1141 0 obj << -/Type /Pages -/Count 46 -/Kids [1139 0 R 1140 0 R] ->> endobj -1142 0 obj << -/Type /Outlines -/First 7 0 R -/Last 155 0 R -/Count 13 ->> endobj -155 0 obj << -/Title 156 0 R -/A 153 0 R -/Parent 1142 0 R -/Prev 151 0 R ->> endobj -151 0 obj << -/Title 152 0 R -/A 149 0 R -/Parent 1142 0 R -/Prev 147 0 R -/Next 155 0 R ->> endobj -147 0 obj << -/Title 148 0 R -/A 145 0 R -/Parent 1142 0 R -/Prev 143 0 R -/Next 151 0 R ->> endobj -143 0 obj << -/Title 144 0 R -/A 141 0 R -/Parent 1142 0 R -/Prev 123 0 R -/Next 147 0 R ->> endobj -139 0 obj << -/Title 140 0 R -/A 137 0 R -/Parent 123 0 R -/Prev 135 0 R ->> endobj -135 0 obj << -/Title 136 0 R -/A 133 0 R -/Parent 123 0 R -/Prev 131 0 R -/Next 139 0 R ->> endobj -131 0 obj << -/Title 132 0 R -/A 129 0 R -/Parent 123 0 R -/Prev 127 0 R -/Next 135 0 R ->> endobj -127 0 obj << -/Title 128 0 R -/A 125 0 R -/Parent 123 0 R -/Next 131 0 R ->> endobj -123 0 obj << -/Title 124 0 R -/A 121 0 R -/Parent 1142 0 R -/Prev 119 0 R -/Next 143 0 R -/First 127 0 R -/Last 139 0 R -/Count -4 ->> endobj -119 0 obj << -/Title 120 0 R -/A 117 0 R -/Parent 1142 0 R -/Prev 115 0 R -/Next 123 0 R ->> endobj -115 0 obj << -/Title 116 0 R -/A 113 0 R -/Parent 1142 0 R -/Prev 107 0 R -/Next 119 0 R ->> endobj -111 0 obj << -/Title 112 0 R -/A 109 0 R -/Parent 107 0 R ->> endobj -107 0 obj << -/Title 108 0 R -/A 105 0 R -/Parent 1142 0 R -/Prev 91 0 R -/Next 115 0 R -/First 111 0 R -/Last 111 0 R -/Count -1 ->> endobj -103 0 obj << -/Title 104 0 R -/A 101 0 R -/Parent 91 0 R -/Prev 99 0 R ->> endobj -99 0 obj << -/Title 100 0 R -/A 97 0 R -/Parent 91 0 R -/Prev 95 0 R -/Next 103 0 R ->> endobj -95 0 obj << -/Title 96 0 R -/A 93 0 R -/Parent 91 0 R -/Next 99 0 R ->> endobj -91 0 obj << -/Title 92 0 R -/A 89 0 R -/Parent 1142 0 R -/Prev 39 0 R -/Next 107 0 R -/First 95 0 R -/Last 103 0 R -/Count -3 ->> endobj -87 0 obj << -/Title 88 0 R -/A 85 0 R -/Parent 79 0 R -/Prev 83 0 R ->> endobj -83 0 obj << -/Title 84 0 R -/A 81 0 R -/Parent 79 0 R -/Next 87 0 R ->> endobj -79 0 obj << -/Title 80 0 R -/A 77 0 R -/Parent 39 0 R -/Prev 75 0 R -/First 83 0 R -/Last 87 0 R -/Count -2 ->> endobj -75 0 obj << -/Title 76 0 R -/A 73 0 R -/Parent 39 0 R -/Prev 67 0 R -/Next 79 0 R ->> endobj -71 0 obj << -/Title 72 0 R -/A 69 0 R -/Parent 67 0 R ->> endobj -67 0 obj << -/Title 68 0 R -/A 65 0 R -/Parent 39 0 R -/Prev 63 0 R -/Next 75 0 R -/First 71 0 R -/Last 71 0 R -/Count -1 ->> endobj -63 0 obj << -/Title 64 0 R -/A 61 0 R -/Parent 39 0 R -/Prev 59 0 R -/Next 67 0 R ->> endobj -59 0 obj << -/Title 60 0 R -/A 57 0 R -/Parent 39 0 R -/Prev 55 0 R -/Next 63 0 R ->> endobj -55 0 obj << -/Title 56 0 R -/A 53 0 R -/Parent 39 0 R -/Prev 51 0 R -/Next 59 0 R ->> endobj -51 0 obj << -/Title 52 0 R -/A 49 0 R -/Parent 39 0 R -/Prev 43 0 R -/Next 55 0 R ->> endobj -47 0 obj << -/Title 48 0 R -/A 45 0 R -/Parent 43 0 R ->> endobj -43 0 obj << -/Title 44 0 R -/A 41 0 R -/Parent 39 0 R -/Next 51 0 R -/First 47 0 R -/Last 47 0 R -/Count -1 ->> endobj -39 0 obj << -/Title 40 0 R -/A 37 0 R -/Parent 1142 0 R -/Prev 27 0 R -/Next 91 0 R -/First 43 0 R -/Last 79 0 R -/Count -8 ->> endobj -35 0 obj << -/Title 36 0 R -/A 33 0 R -/Parent 27 0 R -/Prev 31 0 R ->> endobj -31 0 obj << -/Title 32 0 R -/A 29 0 R -/Parent 27 0 R -/Next 35 0 R ->> endobj -27 0 obj << -/Title 28 0 R -/A 25 0 R -/Parent 1142 0 R -/Prev 11 0 R -/Next 39 0 R -/First 31 0 R -/Last 35 0 R -/Count -2 ->> endobj -23 0 obj << -/Title 24 0 R -/A 21 0 R -/Parent 11 0 R -/Prev 19 0 R ->> endobj -19 0 obj << -/Title 20 0 R -/A 17 0 R -/Parent 11 0 R -/Prev 15 0 R -/Next 23 0 R ->> endobj -15 0 obj << -/Title 16 0 R -/A 13 0 R -/Parent 11 0 R -/Next 19 0 R ->> endobj -11 0 obj << -/Title 12 0 R -/A 9 0 R -/Parent 1142 0 R -/Prev 7 0 R -/Next 27 0 R -/First 15 0 R -/Last 23 0 R -/Count -3 ->> endobj -7 0 obj << -/Title 8 0 R -/A 5 0 R -/Parent 1142 0 R -/Next 11 0 R ->> endobj -1143 0 obj << -/Names [(Doc-Start) 162 0 R (Item.1) 243 0 R (Item.10) 252 0 R (Item.11) 253 0 R (Item.12) 254 0 R (Item.13) 255 0 R] -/Limits [(Doc-Start) (Item.13)] ->> endobj -1144 0 obj << -/Names [(Item.14) 256 0 R (Item.15) 257 0 R (Item.16) 258 0 R (Item.17) 264 0 R (Item.18) 311 0 R (Item.19) 312 0 R] -/Limits [(Item.14) (Item.19)] ->> endobj -1145 0 obj << -/Names [(Item.2) 244 0 R (Item.20) 313 0 R (Item.21) 314 0 R (Item.22) 363 0 R (Item.23) 364 0 R (Item.24) 365 0 R] -/Limits [(Item.2) (Item.24)] ->> endobj -1146 0 obj << -/Names [(Item.25) 366 0 R (Item.26) 367 0 R (Item.27) 368 0 R (Item.28) 369 0 R (Item.29) 370 0 R (Item.3) 245 0 R] -/Limits [(Item.25) (Item.3)] ->> endobj -1147 0 obj << -/Names [(Item.30) 371 0 R (Item.31) 372 0 R (Item.32) 373 0 R (Item.33) 374 0 R (Item.4) 246 0 R (Item.5) 247 0 R] -/Limits [(Item.30) (Item.5)] ->> endobj -1148 0 obj << -/Names [(Item.6) 248 0 R (Item.7) 249 0 R (Item.8) 250 0 R (Item.9) 251 0 R (chapter*.1) 202 0 R (chapter.1) 6 0 R] -/Limits [(Item.6) (chapter.1)] ->> endobj -1149 0 obj << -/Names [(chapter.10) 142 0 R (chapter.11) 146 0 R (chapter.12) 150 0 R (chapter.13) 154 0 R (chapter.2) 10 0 R (chapter.3) 26 0 R] -/Limits [(chapter.10) (chapter.3)] ->> endobj -1150 0 obj << -/Names [(chapter.4) 38 0 R (chapter.5) 90 0 R (chapter.6) 106 0 R (chapter.7) 114 0 R (chapter.8) 118 0 R (chapter.9) 122 0 R] -/Limits [(chapter.4) (chapter.9)] ->> endobj -1151 0 obj << -/Names [(lstlisting.6.-1) 347 0 R (lstlisting.6.-2) 379 0 R (lstnumber.-1.1) 348 0 R (lstnumber.-1.10) 357 0 R (lstnumber.-1.11) 358 0 R (lstnumber.-1.2) 349 0 R] -/Limits [(lstlisting.6.-1) (lstnumber.-1.2)] ->> endobj -1152 0 obj << -/Names [(lstnumber.-1.3) 350 0 R (lstnumber.-1.4) 351 0 R (lstnumber.-1.5) 352 0 R (lstnumber.-1.6) 353 0 R (lstnumber.-1.7) 354 0 R (lstnumber.-1.8) 355 0 R] -/Limits [(lstnumber.-1.3) (lstnumber.-1.8)] ->> endobj -1153 0 obj << -/Names [(lstnumber.-1.9) 356 0 R (lstnumber.-2.1) 380 0 R (lstnumber.-2.2) 381 0 R (lstnumber.-2.3) 382 0 R (lstnumber.-2.4) 383 0 R (page.1) 161 0 R] -/Limits [(lstnumber.-1.9) (page.1)] ->> endobj -1154 0 obj << -/Names [(page.10) 276 0 R (page.11) 280 0 R (page.12) 285 0 R (page.13) 290 0 R (page.14) 294 0 R (page.15) 298 0 R] -/Limits [(page.10) (page.15)] ->> endobj -1155 0 obj << -/Names [(page.16) 302 0 R (page.17) 306 0 R (page.18) 310 0 R (page.19) 319 0 R (page.2) 214 0 R (page.20) 324 0 R] -/Limits [(page.16) (page.20)] ->> endobj -1156 0 obj << -/Names [(page.21) 329 0 R (page.22) 333 0 R (page.23) 337 0 R (page.24) 341 0 R (page.25) 346 0 R (page.26) 362 0 R] -/Limits [(page.21) (page.26)] ->> endobj -1157 0 obj << -/Names [(page.27) 378 0 R (page.28) 387 0 R (page.29) 391 0 R (page.3) 220 0 R (page.30) 395 0 R (page.31) 400 0 R] -/Limits [(page.27) (page.31)] ->> endobj -1158 0 obj << -/Names [(page.32) 404 0 R (page.33) 408 0 R (page.34) 412 0 R (page.35) 416 0 R (page.36) 420 0 R (page.37) 425 0 R] -/Limits [(page.32) (page.37)] ->> endobj -1159 0 obj << -/Names [(page.38) 429 0 R (page.39) 433 0 R (page.4) 231 0 R (page.40) 437 0 R (page.41) 441 0 R (page.42) 445 0 R] -/Limits [(page.38) (page.42)] ->> endobj -1160 0 obj << -/Names [(page.43) 450 0 R (page.44) 455 0 R (page.45) 459 0 R (page.5) 238 0 R (page.6) 242 0 R (page.7) 263 0 R] -/Limits [(page.43) (page.7)] ->> endobj -1161 0 obj << -/Names [(page.8) 268 0 R (page.9) 272 0 R (section.2.1) 14 0 R (section.2.2) 18 0 R (section.2.3) 22 0 R (section.3.1) 30 0 R] -/Limits [(page.8) (section.3.1)] ->> endobj -1162 0 obj << -/Names [(section.3.2) 34 0 R (section.4.1) 42 0 R (section.4.2) 50 0 R (section.4.3) 54 0 R (section.4.4) 58 0 R (section.4.5) 62 0 R] -/Limits [(section.3.2) (section.4.5)] ->> endobj -1163 0 obj << -/Names [(section.4.6) 66 0 R (section.4.7) 74 0 R (section.4.8) 78 0 R (section.5.1) 94 0 R (section.5.2) 98 0 R (section.5.3) 102 0 R] -/Limits [(section.4.6) (section.5.3)] ->> endobj -1164 0 obj << -/Names [(section.6.1) 110 0 R (section.9.1) 126 0 R (section.9.2) 130 0 R (section.9.3) 134 0 R (section.9.4) 138 0 R (subsection.4.1.1) 46 0 R] -/Limits [(section.6.1) (subsection.4.1.1)] ->> endobj -1165 0 obj << -/Names [(subsection.4.6.1) 70 0 R (subsection.4.8.1) 82 0 R (subsection.4.8.2) 86 0 R] -/Limits [(subsection.4.6.1) (subsection.4.8.2)] ->> endobj -1166 0 obj << -/Kids [1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R] -/Limits [(Doc-Start) (chapter.1)] ->> endobj -1167 0 obj << -/Kids [1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R] -/Limits [(chapter.10) (page.15)] ->> endobj -1168 0 obj << -/Kids [1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R] -/Limits [(page.16) (page.7)] ->> endobj -1169 0 obj << -/Kids [1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R] -/Limits [(page.8) (subsection.4.8.2)] ->> endobj -1170 0 obj << -/Kids [1166 0 R 1167 0 R 1168 0 R 1169 0 R] -/Limits [(Doc-Start) (subsection.4.8.2)] ->> endobj -1171 0 obj << -/Dests 1170 0 R ->> endobj -1172 0 obj << -/Type /Catalog -/Pages 1141 0 R -/Outlines 1142 0 R -/Names 1171 0 R -/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 1 << /S /D >> ] >> -/OpenAction 157 0 R ->> endobj -1173 0 obj << -/Author(\376\377\000V\000s\000e\000v\000o\000l\000o\000d\000\040\000S\000t\000a\000k\000h\000o\000v)/Title(\376\377\000R\000s\000p\000a\000m\000d)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() -/CreationDate (D:20100322194428+03'00') -/ModDate (D:20100322194428+03'00') -/Trapped /False -/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) ->> endobj -xref -0 1174 -0000000001 65535 f -0000000002 00000 f -0000000003 00000 f -0000000004 00000 f -0000000000 00000 f -0000000015 00000 n -0000021509 00000 n -0000328358 00000 n -0000000060 00000 n -0000000377 00000 n -0000024624 00000 n -0000328234 00000 n -0000000422 00000 n -0000000572 00000 n -0000024685 00000 n -0000328160 00000 n -0000000620 00000 n -0000000750 00000 n -0000024746 00000 n -0000328073 00000 n -0000000798 00000 n -0000000920 00000 n -0000026563 00000 n -0000327999 00000 n -0000000968 00000 n -0000001066 00000 n -0000028151 00000 n -0000327873 00000 n -0000001112 00000 n -0000001320 00000 n -0000028212 00000 n -0000327799 00000 n -0000001368 00000 n -0000001730 00000 n -0000032417 00000 n -0000327725 00000 n -0000001778 00000 n -0000002036 00000 n -0000038917 00000 n -0000327599 00000 n -0000002082 00000 n -0000002232 00000 n -0000038978 00000 n -0000327488 00000 n -0000002280 00000 n -0000002514 00000 n -0000041632 00000 n -0000327427 00000 n -0000002567 00000 n -0000002779 00000 n -0000041693 00000 n -0000327340 00000 n -0000002827 00000 n -0000003101 00000 n -0000043673 00000 n -0000327253 00000 n -0000003149 00000 n -0000003351 00000 n -0000045505 00000 n -0000327166 00000 n -0000003399 00000 n -0000003641 00000 n -0000045566 00000 n -0000327079 00000 n -0000003689 00000 n -0000003875 00000 n -0000047776 00000 n -0000326955 00000 n -0000003923 00000 n -0000004173 00000 n -0000049789 00000 n -0000326894 00000 n -0000004226 00000 n -0000004558 00000 n -0000052801 00000 n -0000326807 00000 n -0000004606 00000 n -0000004912 00000 n -0000055345 00000 n -0000326696 00000 n -0000004960 00000 n -0000005210 00000 n -0000055406 00000 n -0000326622 00000 n -0000005263 00000 n -0000005427 00000 n -0000058178 00000 n -0000326548 00000 n -0000005480 00000 n -0000005748 00000 n -0000061496 00000 n -0000326420 00000 n -0000005794 00000 n -0000005970 00000 n -0000061557 00000 n -0000326346 00000 n -0000006018 00000 n -0000006229 00000 n -0000064861 00000 n -0000326257 00000 n -0000006277 00000 n -0000006494 00000 n -0000070418 00000 n -0000326180 00000 n -0000006543 00000 n -0000006745 00000 n -0000073279 00000 n -0000326048 00000 n -0000006792 00000 n -0000007022 00000 n -0000073341 00000 n -0000325983 00000 n -0000007071 00000 n -0000007191 00000 n -0000081325 00000 n -0000325889 00000 n -0000007238 00000 n -0000007381 00000 n -0000084318 00000 n -0000325795 00000 n -0000007428 00000 n -0000007555 00000 n -0000087194 00000 n -0000325662 00000 n -0000007602 00000 n -0000007753 00000 n -0000087256 00000 n -0000325583 00000 n -0000007802 00000 n -0000008004 00000 n -0000089504 00000 n -0000325490 00000 n -0000008053 00000 n -0000008248 00000 n -0000094099 00000 n -0000325397 00000 n -0000008297 00000 n -0000008475 00000 n -0000096739 00000 n -0000325318 00000 n -0000008524 00000 n -0000008796 00000 n -0000099197 00000 n -0000325224 00000 n -0000008844 00000 n -0000008971 00000 n -0000102782 00000 n -0000325130 00000 n -0000009019 00000 n -0000009255 00000 n -0000108961 00000 n -0000325036 00000 n -0000009303 00000 n -0000009541 00000 n -0000112898 00000 n -0000324956 00000 n -0000009589 00000 n -0000009768 00000 n -0000010135 00000 n -0000010378 00000 n -0000009820 00000 n -0000010254 00000 n -0000010316 00000 n -0000320267 00000 n -0000311470 00000 n -0000323670 00000 n -0000012128 00000 n -0000012280 00000 n -0000012431 00000 n -0000012584 00000 n -0000012738 00000 n -0000012892 00000 n -0000013040 00000 n -0000013194 00000 n -0000013348 00000 n -0000013500 00000 n -0000013654 00000 n -0000013813 00000 n -0000013966 00000 n -0000014120 00000 n -0000014273 00000 n -0000014427 00000 n -0000014580 00000 n -0000014739 00000 n -0000014893 00000 n -0000015046 00000 n -0000015205 00000 n -0000015363 00000 n -0000015515 00000 n -0000015669 00000 n -0000015823 00000 n -0000015977 00000 n -0000016129 00000 n -0000016283 00000 n -0000016435 00000 n -0000017652 00000 n -0000017804 00000 n -0000017956 00000 n -0000016648 00000 n -0000011765 00000 n -0000010463 00000 n -0000304664 00000 n -0000016586 00000 n -0000278226 00000 n -0000255960 00000 n -0000018110 00000 n -0000018264 00000 n -0000018418 00000 n -0000018571 00000 n -0000018723 00000 n -0000018876 00000 n -0000019091 00000 n -0000017449 00000 n -0000016746 00000 n -0000019029 00000 n -0000215130 00000 n -0000193729 00000 n -0000021569 00000 n -0000021328 00000 n -0000019202 00000 n -0000021447 00000 n -0000189956 00000 n -0000023465 00000 n -0000023629 00000 n -0000023824 00000 n -0000024022 00000 n -0000024201 00000 n -0000024387 00000 n -0000024807 00000 n -0000023286 00000 n -0000021667 00000 n -0000024562 00000 n -0000181717 00000 n -0000323527 00000 n -0000156064 00000 n -0000026624 00000 n -0000026382 00000 n -0000024944 00000 n -0000026501 00000 n -0000029260 00000 n -0000027970 00000 n -0000026735 00000 n -0000028089 00000 n -0000028273 00000 n -0000028335 00000 n -0000028395 00000 n -0000028457 00000 n -0000028519 00000 n -0000028581 00000 n -0000028643 00000 n -0000028705 00000 n -0000028767 00000 n -0000028829 00000 n -0000028891 00000 n -0000028953 00000 n -0000029015 00000 n -0000029077 00000 n -0000029138 00000 n -0000029200 00000 n -0000323788 00000 n -0000032478 00000 n -0000032174 00000 n -0000029371 00000 n -0000032293 00000 n -0000032355 00000 n -0000035693 00000 n -0000035512 00000 n -0000032602 00000 n -0000035631 00000 n -0000037254 00000 n -0000037073 00000 n -0000035817 00000 n -0000037192 00000 n -0000039039 00000 n -0000038736 00000 n -0000037365 00000 n -0000038855 00000 n -0000041753 00000 n -0000041451 00000 n -0000039163 00000 n -0000041570 00000 n -0000120616 00000 n -0000043734 00000 n -0000043492 00000 n -0000041903 00000 n -0000043611 00000 n -0000323906 00000 n -0000045627 00000 n -0000045324 00000 n -0000043884 00000 n -0000045443 00000 n -0000047837 00000 n -0000047595 00000 n -0000045777 00000 n -0000047714 00000 n -0000049850 00000 n -0000049608 00000 n -0000047974 00000 n -0000049727 00000 n -0000052862 00000 n -0000052620 00000 n -0000049987 00000 n -0000052739 00000 n -0000055467 00000 n -0000055164 00000 n -0000052986 00000 n -0000055283 00000 n -0000058487 00000 n -0000057997 00000 n -0000055604 00000 n -0000058116 00000 n -0000058239 00000 n -0000058301 00000 n -0000058363 00000 n -0000058425 00000 n -0000324024 00000 n -0000059762 00000 n -0000059581 00000 n -0000058624 00000 n -0000059700 00000 n -0000064431 00000 n -0000061618 00000 n -0000061315 00000 n -0000059886 00000 n -0000061434 00000 n -0000064616 00000 n -0000064922 00000 n -0000064284 00000 n -0000061742 00000 n -0000064799 00000 n -0000067802 00000 n -0000067621 00000 n -0000065059 00000 n -0000067740 00000 n -0000070480 00000 n -0000070237 00000 n -0000067926 00000 n -0000070356 00000 n -0000071548 00000 n -0000071367 00000 n -0000070617 00000 n -0000071486 00000 n -0000324142 00000 n -0000074146 00000 n -0000073098 00000 n -0000071659 00000 n -0000073217 00000 n -0000073403 00000 n -0000073465 00000 n -0000073527 00000 n -0000073589 00000 n -0000073651 00000 n -0000073713 00000 n -0000073775 00000 n -0000073837 00000 n -0000073899 00000 n -0000073961 00000 n -0000074023 00000 n -0000074085 00000 n -0000077441 00000 n -0000076516 00000 n -0000074283 00000 n -0000076635 00000 n -0000076697 00000 n -0000076759 00000 n -0000076821 00000 n -0000076883 00000 n -0000076945 00000 n -0000077007 00000 n -0000077069 00000 n -0000077131 00000 n -0000077193 00000 n -0000077255 00000 n -0000077317 00000 n -0000077379 00000 n -0000079652 00000 n -0000079162 00000 n -0000077552 00000 n -0000079281 00000 n -0000079343 00000 n -0000079405 00000 n -0000079467 00000 n -0000079528 00000 n -0000079590 00000 n -0000081387 00000 n -0000081144 00000 n -0000079776 00000 n -0000081263 00000 n -0000082542 00000 n -0000082361 00000 n -0000081511 00000 n -0000082480 00000 n -0000084380 00000 n -0000084137 00000 n -0000082666 00000 n -0000084256 00000 n -0000324260 00000 n -0000085155 00000 n -0000084974 00000 n -0000084504 00000 n -0000085093 00000 n -0000087318 00000 n -0000087013 00000 n -0000085266 00000 n -0000087132 00000 n -0000089566 00000 n -0000089323 00000 n -0000087455 00000 n -0000089442 00000 n -0000092006 00000 n -0000091825 00000 n -0000089703 00000 n -0000091944 00000 n -0000094161 00000 n -0000093918 00000 n -0000092143 00000 n -0000094037 00000 n -0000096801 00000 n -0000096558 00000 n -0000094298 00000 n -0000096677 00000 n -0000324378 00000 n -0000097812 00000 n -0000097631 00000 n -0000096938 00000 n -0000097750 00000 n -0000099259 00000 n -0000099016 00000 n -0000097910 00000 n -0000099135 00000 n -0000101036 00000 n -0000100855 00000 n -0000099370 00000 n -0000100974 00000 n -0000102844 00000 n -0000102601 00000 n -0000101147 00000 n -0000102720 00000 n -0000105545 00000 n -0000105364 00000 n -0000102968 00000 n -0000105483 00000 n -0000106674 00000 n -0000106493 00000 n -0000105656 00000 n -0000106612 00000 n -0000324496 00000 n -0000109023 00000 n -0000108780 00000 n -0000106772 00000 n -0000108899 00000 n -0000110837 00000 n -0000111072 00000 n -0000110698 00000 n -0000109134 00000 n -0000111010 00000 n -0000112960 00000 n -0000112717 00000 n -0000111183 00000 n -0000112836 00000 n -0000113071 00000 n -0000113271 00000 n -0000113642 00000 n -0000113840 00000 n -0000114149 00000 n -0000114419 00000 n -0000114660 00000 n -0000114967 00000 n -0000115281 00000 n -0000115559 00000 n -0000115883 00000 n -0000116196 00000 n -0000116430 00000 n -0000116625 00000 n -0000116916 00000 n -0000117108 00000 n -0000117403 00000 n -0000117687 00000 n -0000117884 00000 n -0000118198 00000 n -0000118407 00000 n -0000118649 00000 n -0000118937 00000 n -0000119105 00000 n -0000119330 00000 n -0000119658 00000 n -0000119948 00000 n -0000120292 00000 n -0000120866 00000 n -0000121415 00000 n -0000121805 00000 n -0000122214 00000 n -0000122479 00000 n -0000122750 00000 n -0000123049 00000 n -0000123313 00000 n -0000123541 00000 n -0000123767 00000 n -0000124075 00000 n -0000124276 00000 n -0000124465 00000 n -0000124702 00000 n -0000125001 00000 n -0000125205 00000 n -0000125463 00000 n -0000125738 00000 n -0000125989 00000 n -0000126244 00000 n -0000126522 00000 n -0000126839 00000 n -0000127044 00000 n -0000127292 00000 n -0000127562 00000 n -0000127840 00000 n -0000128147 00000 n -0000128420 00000 n -0000128683 00000 n -0000128955 00000 n -0000129223 00000 n -0000129486 00000 n -0000129760 00000 n -0000130042 00000 n -0000130277 00000 n -0000130611 00000 n -0000130853 00000 n -0000131066 00000 n -0000131316 00000 n -0000131595 00000 n -0000131791 00000 n -0000132043 00000 n -0000132279 00000 n -0000132543 00000 n -0000132824 00000 n -0000133116 00000 n -0000133355 00000 n -0000133621 00000 n -0000133857 00000 n -0000134086 00000 n -0000134353 00000 n -0000134608 00000 n -0000134891 00000 n -0000135209 00000 n -0000135466 00000 n -0000135737 00000 n -0000135940 00000 n -0000136202 00000 n -0000136501 00000 n -0000136738 00000 n -0000136996 00000 n -0000137247 00000 n -0000137447 00000 n -0000137746 00000 n -0000137951 00000 n -0000138181 00000 n -0000138453 00000 n -0000138753 00000 n -0000139012 00000 n -0000139214 00000 n -0000139454 00000 n -0000139736 00000 n -0000140047 00000 n -0000140315 00000 n -0000140577 00000 n -0000140881 00000 n -0000141162 00000 n -0000141388 00000 n -0000141641 00000 n -0000141843 00000 n -0000142107 00000 n -0000142305 00000 n -0000142586 00000 n -0000142849 00000 n -0000143056 00000 n -0000143374 00000 n -0000143674 00000 n -0000143957 00000 n -0000144176 00000 n -0000144406 00000 n -0000144610 00000 n -0000144865 00000 n -0000145107 00000 n -0000145374 00000 n -0000145633 00000 n -0000145897 00000 n -0000146095 00000 n -0000146359 00000 n -0000146622 00000 n -0000146816 00000 n -0000147065 00000 n -0000147397 00000 n -0000147725 00000 n -0000147954 00000 n -0000148227 00000 n -0000148495 00000 n -0000148747 00000 n -0000148944 00000 n -0000149161 00000 n -0000149345 00000 n -0000149525 00000 n -0000149763 00000 n -0000149951 00000 n -0000150187 00000 n -0000150435 00000 n -0000150678 00000 n -0000150869 00000 n -0000151189 00000 n -0000151384 00000 n -0000151617 00000 n -0000151814 00000 n -0000152032 00000 n -0000152217 00000 n -0000152473 00000 n -0000152650 00000 n -0000152902 00000 n -0000153246 00000 n -0000153518 00000 n -0000153802 00000 n -0000154024 00000 n -0000154327 00000 n -0000154634 00000 n -0000154896 00000 n -0000155184 00000 n -0000155506 00000 n -0000155770 00000 n -0000156315 00000 n -0000157313 00000 n -0000158157 00000 n -0000159978 00000 n -0000160138 00000 n -0000160496 00000 n -0000160829 00000 n -0000161182 00000 n -0000161592 00000 n -0000161994 00000 n -0000162515 00000 n -0000162853 00000 n -0000163166 00000 n -0000163503 00000 n -0000163755 00000 n -0000164139 00000 n -0000164334 00000 n -0000164514 00000 n -0000164773 00000 n -0000165088 00000 n -0000165415 00000 n -0000165659 00000 n -0000165992 00000 n -0000166243 00000 n -0000166648 00000 n -0000167010 00000 n -0000167441 00000 n -0000167795 00000 n -0000168081 00000 n -0000168284 00000 n -0000168694 00000 n -0000168896 00000 n -0000169100 00000 n -0000169540 00000 n -0000169878 00000 n -0000170274 00000 n -0000170563 00000 n -0000170758 00000 n -0000171018 00000 n -0000171355 00000 n -0000171796 00000 n -0000172135 00000 n -0000172433 00000 n -0000172781 00000 n -0000173122 00000 n -0000173374 00000 n -0000173729 00000 n -0000173930 00000 n -0000174245 00000 n -0000174444 00000 n -0000174771 00000 n -0000175073 00000 n -0000175276 00000 n -0000175649 00000 n -0000176040 00000 n -0000176402 00000 n -0000176613 00000 n -0000176838 00000 n -0000177066 00000 n -0000177344 00000 n -0000177604 00000 n -0000177924 00000 n -0000178243 00000 n -0000178426 00000 n -0000178596 00000 n -0000178834 00000 n -0000179213 00000 n -0000179612 00000 n -0000179926 00000 n -0000180265 00000 n -0000180649 00000 n -0000180950 00000 n -0000181314 00000 n -0000181968 00000 n -0000182688 00000 n -0000183408 00000 n -0000184378 00000 n -0000184590 00000 n -0000184990 00000 n -0000185336 00000 n -0000185625 00000 n -0000186048 00000 n -0000186299 00000 n -0000186764 00000 n -0000187274 00000 n -0000187652 00000 n -0000188072 00000 n -0000188591 00000 n -0000188947 00000 n -0000189431 00000 n -0000190207 00000 n -0000190671 00000 n -0000190851 00000 n -0000191060 00000 n -0000191262 00000 n -0000191571 00000 n -0000191887 00000 n -0000192156 00000 n -0000192463 00000 n -0000192787 00000 n -0000193065 00000 n -0000193411 00000 n -0000193977 00000 n -0000194051 00000 n -0000194144 00000 n -0000194284 00000 n -0000194600 00000 n -0000194928 00000 n -0000195255 00000 n -0000195571 00000 n -0000195811 00000 n -0000196039 00000 n -0000196370 00000 n -0000196617 00000 n -0000196825 00000 n -0000197050 00000 n -0000197423 00000 n -0000197737 00000 n -0000198090 00000 n -0000198378 00000 n -0000198689 00000 n -0000199027 00000 n -0000199253 00000 n -0000199550 00000 n -0000199930 00000 n -0000200305 00000 n -0000200529 00000 n -0000200878 00000 n -0000201231 00000 n -0000201573 00000 n -0000201867 00000 n -0000202112 00000 n -0000202465 00000 n -0000202709 00000 n -0000203044 00000 n -0000203419 00000 n -0000203697 00000 n -0000204042 00000 n -0000204312 00000 n -0000204522 00000 n -0000204802 00000 n -0000205079 00000 n -0000205421 00000 n -0000205700 00000 n -0000205982 00000 n -0000206308 00000 n -0000206583 00000 n -0000206839 00000 n -0000207140 00000 n -0000207373 00000 n -0000207662 00000 n -0000207894 00000 n -0000208199 00000 n -0000208477 00000 n -0000208691 00000 n -0000209002 00000 n -0000209369 00000 n -0000209672 00000 n -0000209923 00000 n -0000210156 00000 n -0000210390 00000 n -0000210644 00000 n -0000210919 00000 n -0000211170 00000 n -0000211445 00000 n -0000211724 00000 n -0000211899 00000 n -0000212069 00000 n -0000212383 00000 n -0000212625 00000 n -0000212933 00000 n -0000213260 00000 n -0000213558 00000 n -0000213855 00000 n -0000214189 00000 n -0000214454 00000 n -0000214793 00000 n -0000215381 00000 n -0000216104 00000 n -0000216702 00000 n -0000217701 00000 n -0000218026 00000 n -0000218317 00000 n -0000218624 00000 n -0000218901 00000 n -0000219092 00000 n -0000219280 00000 n -0000219593 00000 n -0000219778 00000 n -0000219947 00000 n -0000220160 00000 n -0000220490 00000 n -0000220670 00000 n -0000220982 00000 n -0000221251 00000 n -0000221581 00000 n -0000221830 00000 n -0000222192 00000 n -0000222482 00000 n -0000222810 00000 n -0000222995 00000 n -0000223244 00000 n -0000223569 00000 n -0000223951 00000 n -0000224309 00000 n -0000224619 00000 n -0000224883 00000 n -0000225144 00000 n -0000225404 00000 n -0000225672 00000 n -0000225946 00000 n -0000226160 00000 n -0000226475 00000 n -0000226697 00000 n -0000226873 00000 n -0000227082 00000 n -0000227359 00000 n -0000227529 00000 n -0000227775 00000 n -0000227993 00000 n -0000228264 00000 n -0000228534 00000 n -0000228804 00000 n -0000229018 00000 n -0000229287 00000 n -0000229501 00000 n -0000229709 00000 n -0000229972 00000 n -0000230289 00000 n -0000230575 00000 n -0000230876 00000 n -0000231105 00000 n -0000231430 00000 n -0000231696 00000 n -0000231987 00000 n -0000232167 00000 n -0000232415 00000 n -0000232606 00000 n -0000232941 00000 n -0000233208 00000 n -0000233538 00000 n -0000233770 00000 n -0000234082 00000 n -0000234263 00000 n -0000234593 00000 n -0000234771 00000 n -0000235020 00000 n -0000235327 00000 n -0000235512 00000 n -0000235850 00000 n -0000236150 00000 n -0000236356 00000 n -0000236666 00000 n -0000236966 00000 n -0000237230 00000 n -0000237552 00000 n -0000237798 00000 n -0000237979 00000 n -0000238200 00000 n -0000238474 00000 n -0000238826 00000 n -0000239090 00000 n -0000239326 00000 n -0000239594 00000 n -0000239870 00000 n -0000240083 00000 n -0000240360 00000 n -0000240541 00000 n -0000240812 00000 n -0000240989 00000 n -0000241259 00000 n -0000241519 00000 n -0000241701 00000 n -0000242002 00000 n -0000242317 00000 n -0000242603 00000 n -0000242793 00000 n -0000242993 00000 n -0000243174 00000 n -0000243366 00000 n -0000243604 00000 n -0000243837 00000 n -0000244063 00000 n -0000244320 00000 n -0000244607 00000 n -0000244870 00000 n -0000245057 00000 n -0000245317 00000 n -0000245579 00000 n -0000245783 00000 n -0000245987 00000 n -0000246161 00000 n -0000246459 00000 n -0000246778 00000 n -0000247176 00000 n -0000247359 00000 n -0000247633 00000 n -0000247907 00000 n -0000248156 00000 n -0000248352 00000 n -0000248534 00000 n -0000248709 00000 n -0000248875 00000 n -0000249104 00000 n -0000249278 00000 n -0000249467 00000 n -0000249753 00000 n -0000249943 00000 n -0000250295 00000 n -0000250480 00000 n -0000250707 00000 n -0000250891 00000 n -0000251120 00000 n -0000251304 00000 n -0000251570 00000 n -0000251747 00000 n -0000252013 00000 n -0000252410 00000 n -0000252668 00000 n -0000252946 00000 n -0000253145 00000 n -0000253445 00000 n -0000253767 00000 n -0000254031 00000 n -0000254316 00000 n -0000254638 00000 n -0000254895 00000 n -0000255205 00000 n -0000255534 00000 n -0000255746 00000 n -0000256211 00000 n -0000257291 00000 n -0000258196 00000 n -0000260251 00000 n -0000260570 00000 n -0000260879 00000 n -0000261197 00000 n -0000261394 00000 n -0000261574 00000 n -0000261768 00000 n -0000262025 00000 n -0000262319 00000 n -0000262517 00000 n -0000262770 00000 n -0000263048 00000 n -0000263311 00000 n -0000263568 00000 n -0000263846 00000 n -0000264039 00000 n -0000264219 00000 n -0000264476 00000 n -0000264745 00000 n -0000265012 00000 n -0000265230 00000 n -0000265500 00000 n -0000265728 00000 n -0000266016 00000 n -0000266361 00000 n -0000266558 00000 n -0000266884 00000 n -0000267079 00000 n -0000267413 00000 n -0000267772 00000 n -0000268050 00000 n -0000268368 00000 n -0000268622 00000 n -0000268817 00000 n -0000269044 00000 n -0000269322 00000 n -0000269657 00000 n -0000269934 00000 n -0000270194 00000 n -0000270496 00000 n -0000270775 00000 n -0000271000 00000 n -0000271283 00000 n -0000271478 00000 n -0000271748 00000 n -0000271943 00000 n -0000272211 00000 n -0000272475 00000 n -0000272673 00000 n -0000272983 00000 n -0000273285 00000 n -0000273585 00000 n -0000273790 00000 n -0000274003 00000 n -0000274202 00000 n -0000274416 00000 n -0000274658 00000 n -0000274899 00000 n -0000275163 00000 n -0000275345 00000 n -0000275623 00000 n -0000275841 00000 n -0000276156 00000 n -0000276476 00000 n -0000276742 00000 n -0000277034 00000 n -0000277351 00000 n -0000277616 00000 n -0000277910 00000 n -0000278479 00000 n -0000279242 00000 n -0000279954 00000 n -0000280947 00000 n -0000281586 00000 n -0000282145 00000 n -0000282713 00000 n -0000282935 00000 n -0000283122 00000 n -0000283344 00000 n -0000283729 00000 n -0000284254 00000 n -0000284485 00000 n -0000284867 00000 n -0000285316 00000 n -0000285750 00000 n -0000286210 00000 n -0000286671 00000 n -0000286870 00000 n -0000287054 00000 n -0000287487 00000 n -0000287933 00000 n -0000288387 00000 n -0000288684 00000 n -0000289140 00000 n -0000289428 00000 n -0000289928 00000 n -0000290635 00000 n -0000290856 00000 n -0000291509 00000 n -0000291725 00000 n -0000292410 00000 n -0000293143 00000 n -0000293592 00000 n -0000294200 00000 n -0000294594 00000 n -0000294800 00000 n -0000295121 00000 n -0000295582 00000 n -0000296282 00000 n -0000296748 00000 n -0000297144 00000 n -0000297662 00000 n -0000298154 00000 n -0000298460 00000 n -0000298937 00000 n -0000299145 00000 n -0000299591 00000 n -0000299798 00000 n -0000300252 00000 n -0000300686 00000 n -0000300900 00000 n -0000301463 00000 n -0000302079 00000 n -0000302608 00000 n -0000302834 00000 n -0000303100 00000 n -0000303322 00000 n -0000303563 00000 n -0000303901 00000 n -0000304223 00000 n -0000304919 00000 n -0000305599 00000 n -0000306239 00000 n -0000307121 00000 n -0000307444 00000 n -0000307777 00000 n -0000308071 00000 n -0000308334 00000 n -0000308561 00000 n -0000308862 00000 n -0000309078 00000 n -0000309381 00000 n -0000309665 00000 n -0000309842 00000 n -0000310142 00000 n -0000310309 00000 n -0000310604 00000 n -0000310814 00000 n -0000311136 00000 n -0000311723 00000 n -0000312207 00000 n -0000312497 00000 n -0000312756 00000 n -0000313097 00000 n -0000313436 00000 n -0000313748 00000 n -0000314092 00000 n -0000314330 00000 n -0000314666 00000 n -0000314970 00000 n -0000315311 00000 n -0000315617 00000 n -0000315872 00000 n -0000316224 00000 n -0000316498 00000 n -0000316856 00000 n -0000317101 00000 n -0000317455 00000 n -0000317801 00000 n -0000317984 00000 n -0000318328 00000 n -0000318657 00000 n -0000318843 00000 n -0000319224 00000 n -0000319635 00000 n -0000319831 00000 n -0000320097 00000 n -0000320521 00000 n -0000321054 00000 n -0000321456 00000 n -0000321853 00000 n -0000323284 00000 n -0000324598 00000 n -0000324718 00000 n -0000324806 00000 n -0000324879 00000 n -0000328431 00000 n -0000328605 00000 n -0000328776 00000 n -0000328945 00000 n -0000329114 00000 n -0000329282 00000 n -0000329453 00000 n -0000329643 00000 n -0000329828 00000 n -0000330060 00000 n -0000330287 00000 n -0000330498 00000 n -0000330669 00000 n -0000330839 00000 n -0000331010 00000 n -0000331180 00000 n -0000331351 00000 n -0000331521 00000 n -0000331688 00000 n -0000331872 00000 n -0000332069 00000 n -0000332267 00000 n -0000332479 00000 n -0000332638 00000 n -0000332758 00000 n -0000332877 00000 n -0000332992 00000 n -0000333107 00000 n -0000333216 00000 n -0000333256 00000 n -0000333442 00000 n -trailer -<< /Size 1174 -/Root 1172 0 R -/Info 1173 0 R -/ID [<0E8EE6013E45B2563724A39F5DF447FF> <0E8EE6013E45B2563724A39F5DF447FF>] >> -startxref -333903 -%%EOF diff --git a/doc/rspamd.texi b/doc/rspamd.texi deleted file mode 100644 index 48e5740fa..000000000 --- a/doc/rspamd.texi +++ /dev/null @@ -1,1969 +0,0 @@ -\input texinfo -@settitle "Rspamd Spam Filtering System" -@titlepage - -@title Rspamd Spam Filtering System -@subtitle A User's Guide for Rspamd - -@author Vsevolod Stakhov - - -@end titlepage -@contents - -@chapter Rspamd purposes and features. - -@section Introduction. -Rspamd filtering system is created as a replacement of popular -@code{spamassassin} -spamd and is designed to be fast, modular and easily extendable system. Rspamd -core is written in @code{C} language using event driven paradigma. Plugins for rspamd -can be written in @code{lua}. Rspamd is designed to process connections -completely asynchronous and do not block anywhere in code. Spam filtering system -contains of several processes among them are: -@itemize @bullet -@item Main process -@item Workers processes -@item Controller process -@item Other processes -@end itemize -Main process manages all other processes, accepting signals from OS (for example -SIGHUP) and spawn all types of processes if any of them die. Workers processes -do all tasks for filtering e-mail (or HTML messages in case of using rspamd as -non-MIME filter). Controller process is designed to manage rspamd itself (for -example get statistics or learning rspamd). Other processes can do different -jobs among them now are implemented @code{LMTP} worker that implements -@code{LMTP} protocol for filtering mail and fuzzy hashes storage server. - -@section Features. -The main features of rspamd are: -@itemize @bullet -@item Completely asynchronous filtering that allows a big number of simultenious -connections. -@item Easily extendable architecture that can be extended by plugins written in -@code{lua} and by dynamicaly loaded plugins written in @code{c}. -@item Ability to work in cluster: rspamd is able to perform statfiles -synchronization, dynamic load of lists via HTTP, to use distributed fuzzy hashes -storage. -@item Advanced statistics: rspamd now is shipped with winnow-osb classifier that -provides more accurate statistics than traditional bayesian algorithms based on -single words. -@item Internal optimizer: rspamd first of all try to check rules that were met -more often, so for huge spam storms it works very fast as it just checks only -that rules that @emph{can} happen and skip all others. -@item Ability to manage the whole cluster by using controller process. -@item Compatibility with existing @code{spamassassin} SPAMC protocol. -@item Extended @code{RSPAMC} protocol that allows to pass many additional data -from SMTP dialog to rspamd filter. -@item Internal support of IMAP in rspamc client for automated learning. -@item Internal support of many anti-spam technologies, among them are -@code{SPF} and @code{SURBL}. -@item Active support and development of new features. -@end itemize - -@chapter Installation of rspamd. - -@section Obtaining of rspamd. - -The main rspamd site is @url{http://rspamd.sourceforge.net/, sourceforge}. Here -you can obtain source code package as well as pre-packed packages for different -operating systems and architectures. Also, you can use SCM -@url{http://mercurial.selenic.com, mercurial} for accessing rspamd development -repository that can be found here: -@url{http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd}. Rspamd is -shipped with all modules and sample config by default. But there are some -requirements for building and running rspamd. - -@section Requirements. - -For building rspamd from sources you need @code{CMake} system. CMake is very -nice source building system and I decided to use it instead of GNU autotools. -CMake can be obtained here: @url{http://cmake.org}. Also rspamd uses gmime and -glib for MIME parsing and many other purposes (note that you are NOT required -to install any GUI libraries - nor glib, nor gmime are GUI libraries). Gmime -and glib can be obtained from gnome site: @url{http://ftp.gnome.org/}. For -plugins and configuration system you also need lua language interpreter and -libraries. They can be easily obtained from @url{http://lua.org, official lua -site}. Also for rspamc client you need @code{perl} interpreter that could be -installed from @url{http://www.perl.org}. - -@section Building and Installation. - -Build process of rspamd is rather simple: -@itemize @bullet -@item Configure rspamd build environment, using cmake: -@example -$ cmake . -... --- Configuring done --- Generating done --- Build files have been written to: /home/cebka/rspamd -@end example -@noindent -For special configuring options you can use -@example -$ ccmake . - CMAKE_BUILD_TYPE - CMAKE_INSTALL_PREFIX /usr/local - DEBUG_MODE ON - ENABLE_GPERF_TOOLS OFF - ENABLE_OPTIMIZATION OFF - ENABLE_PERL OFF - ENABLE_PROFILING OFF - ENABLE_REDIRECTOR OFF - ENABLE_STATIC OFF -@end example -@noindent -Options allows building rspamd as static module (note that in this case -dynamicaly loaded plugins are @strong{NOT} supported), linking rspamd with -google performance tools for benchmarking and include some other flags while -building. -@item Build rspamd sources: -@example -$ make -[ 6%] Built target rspamd_lua -[ 11%] Built target rspamd_json -[ 12%] Built target rspamd_evdns -[ 12%] Built target perlmodule -[ 58%] Built target rspamd -[ 76%] Built target test/rspamd-test -[ 85%] Built target utils/expression-parser -[ 94%] Built target utils/url-extracter -[ 97%] Built target rspamd_ipmark -[100%] Built target rspamd_regmark -@end example -@noindent -@item Install rspamd (as superuser): -@example -# make install -Install the project... -... -@end example -@noindent -@end itemize - -After installation you would have several new files installed: -@itemize @bullet - -@item Binaries: -@itemize @bullet -@item PREFIX/bin/rspamd - main rspamd executable -@item PREFIX/bin/rspamc - rspamd client program -@end itemize -@item Sample configuration files and rules: -@itemize @bullet -@item PREFIX/etc/rspamd.xml.sample - sample main config file -@item PREFIX/etc/rspamd/lua/*.lua - rspamd rules -@end itemize -@item Lua plugins: -@itemize @bullet -@item PREFIX/etc/rspamd/plugins/lua/*.lua - lua plugins -@end itemize - -@end itemize -For @code{FreeBSD} system there also would be start script for running rspamd in -@emph{PREFIX/etc/rc.d/rspamd.sh}. - -@section Running rspamd. - -Rspamd can be started by running main rspamd executable - -@code{PREFIX/bin/rspamd}. There are several command-line options that can be -passed to rspamd. All of them can be displayed by passing --help argument: -@example -$ rspamd --help -Usage: - rspamd [OPTION...] - run rspamd daemon - -Summary: - Rspamd daemon version 0.3.0 - -Help Options: - -?, --help Show help options - -Application Options: - -t, --config-test Do config test and exit - -f, --no-fork Do not daemonize main process - -c, --config Specify config file - -u, --user User to run rspamd as - -g, --group Group to run rspamd as - -p, --pid Path to pidfile - -V, --dump-vars Print all rspamd variables and exit - -C, --dump-cache Dump symbols cache stats and exit - -X, --convert-config Convert old style of config to xml one -@end example -@noindent - -All options are optional: by default rspamd would try to read -@code{PREFIX/etc/rspamd.xml} config file and run as daemon. Also there is test -mode that can be turned on by passing @option{-t} argument. In test mode rspamd -would read config file and checks its syntax, if config file is OK, then exit -code is zero and non zero otherwise. Test mode is useful for testing new config -file without restarting of rspamd. With @option{-C} and @option{-V} arguments it is -possible to dump variables or symbols cache data. The last ability can be used -for determining which symbols are most often, which are most slow and to watch -to real order of rules inside rspamd. @option{-X} option can be used to convert -old style (pre 0.3.0) config to xml one: -@example -$ rspamd -c ./rspamd.conf -X ./rspamd.xml -@end example -@noindent -After this command new xml config would be dumped to rspamd.xml file. - -@section Managing rspamd with signals. -First of all it is important to note that all user's signals should be sent to -rspamd main process and not to its children (as for child processes these -signals may have other meanings). To determine which process is main you can use -two ways: -@itemize @bullet -@item by reading pidfile: -@example -$ cat pidfile -@end example -@noindent -@item by getting process info: -@example -$ ps auxwww | grep rspamd -nobody 28378 0.0 0.2 49744 9424 rspamd: main process (rspamd) -nobody 64082 0.0 0.2 50784 9520 rspamd: worker process (rspamd) -nobody 64083 0.0 0.3 51792 11036 rspamd: worker process (rspamd) -nobody 64084 0.0 2.7 158288 114200 rspamd: controller process (rspamd) -nobody 64085 0.0 1.8 116304 75228 rspamd: fuzzy storage (rspamd) - -$ ps auxwww | grep rspamd | grep main -nobody 28378 0.0 0.2 49744 9424 rspamd: main process (rspamd) -@end example -@noindent -@end itemize - -After getting pid of main process it is possible to manage rspamd with signals: -@itemize @bullet -@item SIGHUP - restart rspamd: reread config file, start new workers (as well as -controller and other processes), stop accepting connections by old workers, -reopen all log files. Note that old workers would be terminated after one minute -that should allow to process all pending requests. All new requests to rspamd -would be processed by newly started workers. -@item SIGTERM - terminate rspamd system. -@end itemize - -These signals may be used in start scripts as it is done in @code{FreeBSD} start -script. Restarting of rspamd is doing rather softly: no connections would be -dropped and if new config is syntaxically incorrect old config would be used. - -@chapter Configuring of rspamd. - -@section Principles of work. - -We need to define several terms to explain configuration of rspamd. Rspamd -operates with @strong{rules}, each rule defines some actions that should be done with -message to obtain result. Result is called @strong{symbol} - a symbolic -representation of rule. For example, if we have a rule to check DNS record for -a url that contains in message we may insert resulting symbol if this DNS record -is found. Each symbol has several attributes: -@itemize @bullet -@item name - symbolic name of symbol (usually uppercase, e.g. MIME_HTML_ONLY) -@item weight - numeric weight of this symbol (this means how important this rule is), may -be negative -@item options - list of symbolic options that defines additional information about -processing this rule -@end itemize - -Weights of symbols are called @strong{factors}. Also when symbol is inserted it -is possible to define additional multiplier to factor. This can be used for -rules that have dynamic weights, for example statistical rules (when probability -is higher weight must be higher as well). - -All symbols and corresponding rules are combined in @strong{metrics}. Metric -defines a group of symbols that are designed for common purposes. Each metric -has maximum weight: if sum of all rules' results (symbols) is bigger than this -limit then this message is considered as spam in this metric. The default metric -is called @emph{default} and rules that have not explicitly specified metric -would insert their results to this default metric. - -Let's impress how this technics works: -@enumerate 1 -@item First of all when rspamd is running each module (lua, internal or external -dynamic module) can register symbols in any defined metric. After this process -rspamd has a cache of symbols for each metric. This cache can be saved to file -for speeding up process of optimizing order of calling of symbols. -@item Rspamd gets a message from client and parse it with mime parsing and do -other parsing jobs like extracting text parts, urls, and stripping html tags. -@item For each metric rspamd is looking to metric's cache and select rules to -check according to their order (this order depends on frequence of symbol, its -weight and execution time). -@item Rspamd calls rules of metric till the sum weight of symbols in metric is -less than its limit. -@item If sum weight of symbols is more than limit the processing of rules is -stopped and message is counted as spam in this metric. -@end enumerate - -After processing rules rspamd is also does statistic check of message. Rspamd -statistic module is presented as a set of @strong{classifiers}. Each classifier -defines algorithm of statistic checks of messages. Also classifier definition -contains definition of @strong{statistic files} (or @strong{statfiles} shortly). -Each statfile contains of number of patterns that are extracted from messages. -These patterns are put into statfiles during learning process. A short example: -you define classifier that contains two statfiles: @emph{ham} and @emph{spam}. -Than you find 10000 messages that are spam and 10000 messages that contains ham. -Then you learn rspamd with these messages. After this process @emph{ham} -statfile contains patterns from ham messages and @emph{spam} statfile contains -patterns from spam messages. Then when you are checking message via this -statfiles messages that are like spam would have more probability/weight in -@emph{spam} statfile than in @emph{ham} statfile and classifier would insert -symbol of @emph{spam} statfile and would calculate how this message is like -patterns that are contained in @emph{spam} statfile. But rspamd is not limiting -you to define one classifier or two statfiles. It is possible to define a number -of classifiers and a number of statfiles inside a classifier. It can be useful -for personal statistic or for specific spam patterns. Note that each classifier -can insert only one symbol - a symbol of statfile with max weight/probability. -Also note that statfiles check is allways done after all rules. So statistic can -@strong{correct} result of rules. - -Now some words about @strong{modules}. All rspamd rules are contained in -modules. Modules can be internal (like SURBL, SPF, fuzzy check, email and -others) and external written in @code{lua} language. In fact there is no differ -in the way, how rules of these modules are called: -@enumerate 1 -@item Rspamd loads config and loads specified modules. -@item Rspamd calls init function for each module passing configurations -arguments. -@item Each module examines configuration arguments and register its rules (or -not register depending on configuration) in rspamd metrics (or in a single -metric). -@item During metrics process rspamd calls registered callbacks for module's -rules. -@item These rules may insert results to metric. -@end enumerate - -So there is no actual difference between lua and internal modules, each are just -providing callbacks for processing messages. Also inside callback it is possible -to change state of message's processing. For example this can be done when it is -required to make DNS or other network request and to wait result. So modules can -pause message's processing while waiting for some event. This is true for lua -modules as well. - -@section Rspamd config file structure. - -Rspamd config file is placed in PREFIX/etc/rspamd.xml by default. You can -specify other location by passing @option{-c} option to rspamd. Rspamd config file -contains configuration parameters in XML format. XML was selected for rather -simple manual editing config file and for simple automatic generation as well as -for dynamic configuration. I've decided to move rules logic from XML file to -keep it small and simple. So rules are defined in @code{lua} language and rspamd -parameters are defined in xml file (rspamd.xml). Configuration rules are -included by @strong{<lua>} tag that have @strong{src} attribute that defines -relative path to lua file (relative to placement of rspamd.xml): -@example -<lua src="rspamd/lua/rspamd.lua">fake</lua> -@end example -@noindent -Note that it is not currently possible to have empty tags. I hope this -restriction would be fixed in future. Rspamd xml config consists of several -sections: -@itemize @bullet -@item Main section - section where main config parameters are placed. -@item Workers section - section where workers are described. -@item Classifiers section - section where you define your classify logic -@item Modules section - a set of sections that describes module's rules (in fact -these rules should be in lua code) -@item Metrics section - a section where you can set weights of symbols in metrics and metrics settings -@item Logging section - a section that describes rspamd logging -@item Views section - a section that defines rspamd views -@end itemize - -So common structure of rspamd.xml can be described this way: -@example -<? xml version="1.0" encoding="utf-8" ?> -<rspamd> - <!-- Main section directives --> - ... - <!-- Workers directives --> - <worker> - ... - </worker> - ... - <!-- Classifiers directives --> - <classifier> - ... - </classifier> - ... - <!-- Logging section --> - <logging> - <type>console</type> - <level>info</level> - ... - </logging> - <!-- Views section --> - <view> - ... - </view> - ... - <!-- Modules settings --> - <module name="regexp"> - <option name="test">test</option> - ... - </module> - ... -</rspamd> -@end example - -Each of these sections would be described further in details. - -@section Rspamd configuration atoms. - -There are several primitive types of rspamd configuration parameters: -@itemize @bullet -@item String - common string that defines option. -@item Number - integer or fractional number (e.g.: 10 or -1.5). -@item Time - ammount of time in milliseconds, may has suffixes: -@itemize @bullet -@item @emph{s} - for seconds (e.g. @emph{10s}); -@item @emph{m} - for minutes (e.g. @emph{10m}); -@item @emph{h} - for hours (e.g. @emph{10h}); -@item @emph{d} - for days (e.g. @emph{10d}); -@end itemize -@item Size - like number numerci reprezentation of size, but may have a suffix: -@itemize @bullet -@item @emph{k} - 'kilo' - number * 1024 (e.g. @emph{10k}); -@item @emph{m} - 'mega' - number * 1024 * 1024 (e.g. @emph{10m}); -@item @emph{g} - 'giga' - number * 1024 * 1024 * 1024 (e.g. @emph{1g}); -@end itemize -@noindent -Size atoms are used for memory limits for example. -@item Lists - path to dynamic rspamd list (e.g. @emph{http://some.host/some/path}). -@end itemize - -While practically all atoms are rather trivial to understand rspamd lists may -cause some confusion. Lists are widely used in rspamd for getting data that can -be often changed for example white or black lists, lists of ip addresses, lists -of domains. So for such purposes it is possible to use files that can be get -either from local filesystem (e.g. @code{file:///var/run/rspamd/whitelsist}) or -by HTTP (e.g. @code{http://some.host/some/path/list.txt}). Rspamd constantly -looks for changes in this files, if using HTTP it also set -@emph{If-Modified-Since} header and check for @emph{Not modified} reply. So it -causes no overhead when lists are not modified and may allow to store huge lists -and to distribute them over HTTP. Monitoring of lists is done with some random -delay (jitter), so if you have many rspamd servers in cluster that are -monitoring a single list they would come to check or download it in slightly different -time. The two most common list formats are @emph{IP list} and @emph{domains -list}. IP list contains of ip addresses in dot notation (e.g. -@code{192.168.1.1}) or ip/network pairs in CIDR notation (e.g. -@code{172.16.0.0/16}). Items in lists are separated by newline symbol. Lines -that begin with @emph{#} symbol are considered as comments and are ignored while -parsing. Domains list is very like ip list with difference that it contains -domain names. - -@section Main rspamd configuration section. - -Main rspamd configurtion section contains several definitions that determine -main parameters of rspamd for example path to pidfile, temporary directory, lua -includes, several limits e.t.c. Here is list of this directives explained: - -@multitable @columnfractions .2 .8 -@headitem Tag @tab Mean - -@item @var{<tempdir>} -@tab Defines temporary directory for rspamd. Default is to use @env{TEMP} -environment variable or @code{/tmp}. - -@item @var{<pidfile>} -@tab Path to rspamd pidfile. Here would be stored a pid of main process. -Pidfile is used to manage rspamd from start scripts. - -@item @var{<statfile_pool_size>} -@tab Limit of statfile pool size: a total number of bytes that can be used for -mapping statistic files. Rspamd is using LRU system and would unmap the most -unused statfile when this limit would be reached. The common sense is to set -this variable equal to total size of all statfiles, but it can be less than this -in case of dynamic statfiles (for per-user statistic). - -@item @var{<filters>} -@tab List of enabled internal filters. Items in this list can be separated by -spaces, semicolons or commas. If internal filter is not specified in this line -it would not be loaded or enabled. - -@item @var{<raw_mode>} -@tab Boolean flag that specify whether rspamd should try to convert all -messages to UTF8 or not. If @var{raw_mode} is enabled all messages are -processed @emph{as is} and are not converted. Raw mode is faster than utf mode -but it may confuse statistics and regular expressions. - -@item @var{<lua>} -@tab Defines path to lua file that should be loaded fro configuration. Path to -this file is defined in @strong{src} attribute. Text inside tag is required but -is not parsed (this is stupid limitation of parser's design). -@end multitable - -@section Rspamd logging configuration. - -Rspamd has a number of logging variants. First of all there are three types of -logs that are supported by rspamd: console loggging (just output log messages to -console), file logging (output log messages to file) and logging via syslog. -Also it is possible to filter logging to specific level: -@itemize @bullet -@item error - log only critical errors -@item warning - log errors and warnings -@item info - log all non-debug messages -@item debug - log all including debug messages (huge amount of logging) -@end itemize -Also it is possible to turn on debug messages for specific ip addresses. This -ability is usefull for testing. - -For each logging type there are special mandatory parameters: log facility for -syslog (read @emph{syslog (3)} manual page for details about facilities), log -file for file logging. Also file logging may be buffered for speeding up. For -reducing logging noise rspamd detects for sequential identic log messages and -replace them with total number of repeats: -@example -#81123(fuzzy): May 11 19:41:54 rspamd file_log_function: Last message repeated 155 times -#81123(fuzzy): May 11 19:41:54 rspamd process_write_command: fuzzy hash was successfully added -@end example - -Here is summary of logging parameters: - - -@multitable @columnfractions .2 .8 -@headitem Tag @tab Mean -@item @var{<type>} -@tab Defines logging type (file, console or syslog). For each type mandatory -attriute must be present: -@itemize @bullet -@item @emph{filename} - path to log file for file logging type; -@item @emph{facility} - syslog logging facility. -@end itemize - -@item @var{<level>} -@tab Defines loggging level (error, warning, info or debug). - -@item @var{<log_buffer>} -@tab For file and console logging defines buffer in bytes (kilo, mega or giga -bytes) that would be used for logging output. - -@item @var{<log_urls>} -@tab Flag that defines whether all urls in message would be logged. Useful for -testing. - -@item @var{<debug_ip>} -@tab List that contains ip addresses for which debugging would be turned on. For -more information about ip lists look at config atoms section. -@end multitable - -@section Metrics configuration. - -Setting of rspamd metrics is the main way to change rules' weights. You can set -up weights for all rules: for those that have static weights (for example simple -regexp rules) and for those that have dynamic weights (for example statistic -rules). In all cases the base weight of rule is multiplied by metric's weight value. -For static rules base weight is usually 1.0. So we have: -@itemize @bullet -@item @math{w_{symbol} = w_{static} * factor} - for static rules -@item @math{w_{symbol} = w_{dynamic} * factor} - for dynamic rules -@end itemize -Also there is an ability to add so called "grow factor" - additional multiplier -that would be used when we have more than one symbol in metric. So for each -added symbol this factor would increment its power. This can be written as: -@math{w_{total} = w_1 * gf ^ 0 + w_2 * gf ^ 1 + ... + w_n * gf ^ {n - 1}} -Grow multiplier is used to increment weight of rules when message got many -symbols (likely spammy). Note that only rules with positive weights would -increase grow factor, those with negative weights would just be added. Also note -that grow factor can be less than 1 but it is uncommon use (in this case we -would have weight lowering when we have many symbols for this message). Metrics -can be set up with config section(s) @emph{metric}: -@example -<metric> - <name>test_metric</name> - <action>reject</action> - <symbol weight="0.1">MIME_HTML_ONLY</symbol> - <grow_factor>1.1</grow_factor> -</metric> -@end example - -Note that you basically need to add symbols to metric when you add additional rules. -The decision of weight of newly added rule basically depends on its importance. For -example you are absolutely sure that some rule would add a symbol on only spam -messages, so you can increase weight of such rule so it would filter such spam. -But if you increase weight of rules you should be more or less sure that it -would not increase false positive errors rate to unacceptable level (false -positive errors are errors when good mail is treated as spam). Rspamd comes with -a set of default rules and default weights of that rules are placed in -rspamd.xml.sample. In most cases it is reasonable to change them for your mail -system, for example increase weights of some rules or decrease for others. Also -note that default grow factor is 1.0 that means that weights of rules do not -depend on count of added symbols. For some situations it useful to set grow -factor to value more than 1.0. Also by modifying weights it is possible to -manage static multiplier for dynamic rules. - -@section Workers configuration. - -Workers are rspamd processes that are doing specific jobs. Now are supported 4 -types of workers: -@enumerate 1 -@item Normal worker - a typical worker that process messages. -@item Controller worker - a worker that manages rspamd, get statistics and do -learning tasks. -@item Fuzzy storage worker - a worker that contains a collection of fuzzy -hashes. -@item LMTP worker - experimental worker that acts as LMTP server. -@end enumerate - -These types of workers has some common parameters: -@multitable @columnfractions .2 .8 -@headitem Parameter @tab Mean -@item @emph{<type>} -@tab Type of worker (normal, controller, lmtp or fuzzy) -@item @emph{<bind_socket>} -@tab Socket credits to bind this worker to. Inet and unix sockets are supported: -@example -<bind_socket>localhost:11333</bind_socket> -<bind_socket>/var/run/rspamd.sock</bind_socket> -@end example -@noindent -Also for inet sockets you may specify @code{*} as address to bind to all -available inet interfaces: -@example -<bind_socket>*:11333</bind_socket> -@end example -@noindent -@item @emph{<count>} -@tab Number of worker processes of this type. By default this number is -equialent to number of logical processors in system. -@item @emph{<maxfiles>} -@tab Maximum number of file descriptors available to this worker process. -@item @emph{<maxcore>} -@tab Maximum size of core file that would be dumped in cause of critical errors -(in mega/kilo/giga bytes). -@end multitable - -Also each of workers types can have specific parameters: -@itemize @bullet -@item Normal worker: -@itemize @bullet -@item @var{<custom_filters>} - path to dynamically loaded plugins that would do real -check of incoming messages. These modules are described further. -@item @var{<mime>} - if this parameter is "no" than this worker assumes that incoming -messages are in non-mime format (e.g. forum's messages) and standart mime -headers are added to them. -@end itemize -@item Controller worker: -@itemize @bullet -@item @var{<password>} - a password that would be used to access to contorller's -privilleged commands. -@end itemize -@item Fuzzy worker: -@itemize @bullet -@item @var{<hashfile>} - a path to file where fuzzy hashes would be permamently stored. -@item @var{<use_judy>} - if libJudy is present in system use it for faster storage. -@item @var{<frequent_score>} - if judy is not turned on use this score to place hashes -with score that is more than this value to special faster list (this is designed -to increase lookup speed for frequent hashes). -@item @var{<expire>} - time to expire of fuzzy hashes after their placement in storage. -@end itemize -@end itemize - -These parameters can be set inside worker's definition: -@example -<worker> - <type>fuzzy</type> - <bind_socket>*:11335</bind_socket> - <count>1</count> - <maxfiles>2048</maxfiles> - <maxcore>0</maxcore> -<!-- Other params --> - <param name="use_judy">yes</param> - <param name="hashfile">/spool/rspamd/fuzzy.db</param> - <param name="expire">10d</param> -</worker> -@end example -@noindent - -The purpose of each worker's type would be described later. The main parameters -that could be defined are bind sockets for workers, their count, password for -controller's commands and parameters for fuzzy storage. Default config provides -reasonable values of this parameters (except password of course), so for basic -configuration you may just replace controller's password to more secure one. - -@section Classifiers configuration. - -@subsection Common classifiers options. - -Each classifier has mandatory option @var{type} that defines internal algorithm -that is used for classifying. Currently only @code{winnow} is supported. You can -read theoretical description of algorithm used here: -@url{http://www.siefkes.net/papers/winnow-spam.pdf} - -The common classifier configuration consists of base classifier parameters and -definitions of two (or more than two) statfiles. During classify process rspamd -check each statfile in classifier and select those that has more -probability/weight than others. If all statfiles has zero weight this classifier -do not add any symbols. Among common classifiers options are: -@multitable @columnfractions .2 .8 -@headitem Tag @tab Mean -@item @var{<tokenizer>} -@tab Tokenizer to extract tokens from messages. Currently only @emph{osb} -tokenizer is supported -@item @var{<metric>} -@tab Metric to which this classifier would insert symbol. -@end multitable - -Also option @var{min_tokens} is supported to specify minimum number of tokens to -work with (this is usefull to avoid classifying of short messages as statistic -is practically useless for small amount of tokens). Here is example of base -classifier config: -@example -<classifier type="winnow"> - <tokenizer>osb-text</tokenizer> - <metric>default</metric> - <option name="min_tokens">20</option> - <statfile> - ... - </statfile> -</classifier> -@end example - -@subsection Statfiles options. - -The most common statfile options are @var{symbol} and @var{size}. The first one defines -which symbol would be inserted if this statfile would have maximal weight inside -classifier and size defines statfile size on disk and in memory. Note that -statfiles are mapped directly to memory and you should practically note -parameter @var{statfile_pool_size} of main section which defines maximum ammount -of memory for mapping statistic files. Also note that statistic files are -of constant size: if you defines 100 megabytes statfile it would occupy 100 -megabytes of disc space and 100 megabytes of memory when it is used (mapped). -Each statfile is indexed by tokens and contains so called "token chains". This -mechanizm would be described further but note that each statfile has parameter -"free tokens" that defines how much space is available for new tokens. If -statfile has no free space the most unused tokens would be removed from -statfile. - -Here is list of common options of statfiles: -@multitable @columnfractions .2 .8 -@headitem Tag @tab Mean -@item @var{<symbol>} -@tab Defines symbol to insert for this statfile. -@item @var{<size>} -@tab Size of this statfile in bytes (kilo/mega/giga bytes). -@item @var{<path>} -@tab Filesystem path to statistic file. -@item @var{<normalizer>} -@tab Defines weight normalization structure. Can be lua function name or -internal normalizer. Internal normalizer is defined in format: -"internal:<max_weight>" where max_weight is fractional number that limits the -maximum weight of this statfile's symbol (this is so called dynamic weight). -@item @var{<binlog>} -@tab Defines binlog affinity: master or slave. This option is used for statfiles -binary sync that would be described further. -@item @var{<binlog_master>} -@tab Defines credits of binlog master for this statfile. -@item @var{<binlog_rotate>} -@tab Defines rotate time for binlog. -@end multitable - -Internal normalization of statfile weight works in this way: -@itemize @bullet -@item @math{R_{score} = 1} when @math{W_{statfile} < 1} -@item @math{R_{score} = W_statfile ^ 2} when @math{1 < W_{statfile} < max / 2} -@item @math{R_{score} = W_statfile} when @math{max / 2 < W_{statfile} < max} -@item @math{R_{score} = max} when @math{W_{statfile} > max} -@end itemize - -The final result weight would be: @math{weight = R_{score} * W_{weight}}. -Here is sample classifier configuration with two statfiles that can be used for -spam/ham classifying: - -@example - <symbol weight="-1.00">WINNOW_HAM</symbol> - <symbol weight="1.00">WINNOW_SPAM</symbol> -... - -<!-- Classifiers section --> -<classifier type="winnow"> - <tokenizer>osb-text</tokenizer> - <metric>default</metric> - <option name="min_tokens">20</option> - <statfile> - <symbol>WINNOW_HAM</symbol> - <size>100M</size> - <path>/var/run/rspamd/data.ham</path> - <normalizer>internal:3</normalizer> - </statfile> - <statfile> - <symbol>WINNOW_SPAM</symbol> - <size>100M</size> - <path>/var/run/rspamd/data.spam</path> - <normalizer>internal:3</normalizer> - </statfile> -</classifier> -<!-- End of classifiers section --> -@end example -@noindent -In this sample we define classifier that contains two statfiles: -@emph{WINNOW_SPAM} and @emph{WINNOW_HAM}. Each statfile has 100 megabytes size -(so they would occupy 200Mb while classifying). Also each statfile has maximum -weight of 3 so with such weights (-1 for WINNOW_HAM and 1 for WINNOW_SPAM) the -result weight of symbols would be 0..3 for @emph{WINNOW_SPAM} and 0..-3 for -@emph{WINNOW_HAM}. - -@section Composites config. - -Composite symbols are rules that allow combining of several other symbols by -using logical expressions. For example you can add composite symbol COMP1 that -would be added if SYMBOL1 and SYMBOL2 are presented after message checks. When -composite symbol is added the symbols that are in that composite are removed. So -if message has symbols SYMBOL1 and SYMBOL2 the composite symbol COMP1 would be -inserted in place of these two symbols. Not that if composite symbol is not -inserted the symbols that are inside it are not touched. So SYMBOL1 and SYMBOL2 -can be presented separately, but when COMP1 is added SYMBOL1 and SYMBOL2 would -be removed. Composite symbols can be defined in main configuration section. Here -is example of composite rules definition: - -@example -<composite name="ONCE_RECEIVED_PBL">ONCE_RECEIVED & RECEIVED_PBL</composite> -<composite name="SPF_TRUSTED">R_SPF_TRUSTED & R_SPF_ALLOW</composite> -<composite name="TRUSTED_FROM">R_TRUSTED_FROM & R_SPF_ALLOW</composite> -@end example - -Note that you need to insert xml entity (@emph{&}) instead of '&' symbol; - -@section Modules config. - -@subsection Lua modules loading. -For loading custom lua modules you should use @emph{<modules>} section: -@example -<modules> - <module>/usr/local/etc/rspamd/plugins/lua</module> -</modules> -@end example -@noindent -Each @emph{<module>} directive defines path to lua modules. If this is a -directory so all @code{*.lua} files inside that directory would be loaded. If -this is a file it would be loaded directly. - -@subsection Modules configuration. -Each module can have its own config section (this is true not only for internal -module but also for lua modules). Such section is called @emph{<module>} with -mandatory attribute @emph{"name"}. Each module can be configured by -@emph{<option>} directives. These directives must also have @emph{"name"} -attribute. So module configuration is done in @code{param = value} style: -@example -<module name="fuzzy_check"> - <option name="servers">localhost:11335</option> - <option name="symbol">R_FUZZY</option> - <option name="min_length">300</option> - <option name="max_score">10</option> -</module> -@end example -@noindent -The common parameters are: -@itemize @bullet -@item symbol - symbol that this module should insert. -@end itemize -But each module can have its own unique parameters. So it would be discussed -furhter in detailed modules description. Also note that for internal modules you -should edit @emph{<filters>} parameter in main section: this parameter defines -which internal modules would be turned on in this configuration. - -@section Views config. -It is possible to make different rules for different -networks/senders/recipients. For this purposes you can use rspamd views: maps of -conditions (ip, sender, recipients) and actions, associated with them. For -example you can turn rspamd off for specific conditions by using -@emph{skip_check} action or check only specific rules. Views are defined inside -@emph{<view>} xml section. Here is list of available tags inside section: -@multitable @columnfractions .2 .8 -@headitem Tag @tab Mean -@item @var{<skip_check>} -@tab Boolean flag (yes or no) that specifies whether rspamd checks should be -turned off for this ip -@item @var{<symbols>} -@tab Defines comma-separated list of symbols that should be checked for this -view -@item @var{<ip>} -@tab Map argument that defines path to list of ip addresses (may be with CIDR -masks) to which this view should be applied. -@item @var{<client_ip>} -@tab Map argument that defines path to list of ip addresses of rspamd clients -to which this view should be applied. Note that this is ip of rspamd client not -ip of message's sender. -@item @var{<from>} -@tab Map argument that defines path to list of senders to which this view should -be applied. -@end multitable -Here is an example view definition -@example -<view> - <skip_check>yes</skip_check> - <ip>file:///usr/local/etc/rspamd/whitelist</ip> -</view> -@end example - -@chapter Rspamd clients interaction. - -@section Introduction. -After you have basic config file you may test rspamd functionality by using -whether telnet like utility or @emph{rspamc} client. For testing newly installed -config it is possible to run config file test: -@example -$ rspamd -t -syntax OK -@end example - -Rspamc utility is written in @code{perl} language and uses perl modules that are -shipped with rspamd: @emph{Mail::Rspamd::Client} for client's protocol and -@emph{Mail::Rspamd::Config} for reading and writing configuration. The -documentation for these modules can be found by commands: -@example -$ perldoc Mail::Rspamd::Client -$ perldoc Mail::Rspamd::Config -@end example - -So other way to access rspamd is to use perl client API: -@example -use Mail::Rspamd::Client; -my $config = @{ - hosts => ['localhost:11333'], -@}; - -my $client = new Mail::Rspamd::Client(%config); - -if (! $client->ping()) @{ - die "Cannot ping rspamd: $client->@{error@}"; -@} - -my $result = $client->check($testmsg); - -if ($result->@{'default'@}->@{isspam@} eq 'True') @{ - # do something with spam message here -@} -@end example - -@section Rspamc protocol. -Rspamc protocol is an extension over traditional spamc protocol that is used by -spamassassin. This protocol looks like traditional HTTP session: first line is -method with version, headers can be passed by next lines and the message itself -is waited after empty line: -@example -<REQUEST> -SYMBOLS RSPAMC/1.1 -Content-Length: 2200 - -<message octets> - -<REPLY> -RSPAMD/1.1 0 OK -Metric: default; True; 10.40 / 10.00 / 0.00 -Symbol: R_UNDISC_RCPT -Symbol: ONCE_RECEIVED -Symbol: R_MISSING_CHARSET -Urls: -@end example -@noindent -The format of method line can be presented as: -@example -<COMMAND> RSPAMC/<version> -@end example -@noindent -Version can be 1.0 and 1.1. The main difference that in 1.1 metrics output also -has @emph{reject score} - hard limit of score for metric. This would be -discussed while describing user's options. Commands are: -@multitable @columnfractions .2 .8 -@headitem Command @tab Mean -@item CHECK -@tab Check a message and output results for each metric. But do not output -symbols. -@item SYMBOLS -@tab Same as @emph{CHECK} but output symbols. -@item PROCESS -@tab Same as @emph{SYMBOLS} but output also original message with inserted -X-Spam headers. -@item PING -@tab Do not do any processing, just check rspamd state: -@example -$ telnet localhost 11333 -Trying 127.0.0.1... -Connected to localhost. -Escape character is '^]'. -PING RSPAMC/1.1 - -RSPAMD/1.1 0 PONG -Connection closed by foreign host. -@end example -@noindent -@end multitable - -After command there should be one mandatory header: @strong{Content-Length} that -defines message's length in bytes and optional headers: -@multitable @columnfractions .2 .8 -@headitem Header @tab Mean -@item @var{Deliver-To:} -@tab Defines actual delivery recipient of message. Can be used for personalized -statistic and for user specific options. -@item @var{IP:} -@tab Defines IP from which this message is received. -@item @var{Helo:} -@tab Defines SMTP helo. -@item @var{From:} -@tab Defines SMTP mail from command data. -@item @var{Queue-Id:} -@tab Defines SMTP queue id for message (can be used instead of message id in -logging). -@item @var{Rcpt:} -@tab Defines SMTP recipient (it may be several @emph{Rcpt:} headers). -@item @var{Pass:} -@tab If this header has @emph{"all"} value, all filters would be checked for -this message. -@item @var{Subject:} -@tab Defines subject of message (is used for non-mime messages). -@item @var{User:} -@tab Defines SMTP user (this is currently unused in rspamd however). -@end multitable -So rspamc protocol allows to pass many data from MTA to rspamd. This is used to -increase speed of processing and for building filters (like SPF filter). Also -note that rspamd support spamassassin spamc protocol and you can even pass -rspamc headers in spamc mode, but reply of rspamd in spamc mode would be much -shorter: it would only use "default" metric and won't show additional options -for symbols. Rspamc reply looks like this: -@example -RSPAMD/1.1 0 OK -Metric: default; True; 10.40 / 10.00 / 0.00 -Symbol: R_UNDISC_RCPT -Symbol: ONCE_RECEIVED -Symbol: R_MISSING_CHARSET -Urls: -@end example -@noindent -First line is method reply: @code{<PROTOCOL>/<VERSION> <ERROR_CODE> <ERROR_REPLY>}. -Error code is 0 when no error occured. After first reply line there are metrics -output. For @emph{SYMBOLS} and @emph{PROCESS} commands there are symbols lines -after each metric. And for @emph{PROCESS} command there would be original -message after all metrics results. Metric result line looks like this: -@example -Metric: <name>; <result>; <score> / <required_score> / <reject_score> -@end example -@noindent -For 1.0 version of rspamc protocol @emph{reject_score} parameter is not printed. -Symbol line looks like this: -@example -Symbol: <Name>[; param1[, param2...]] -@end example -@noindent -Some symbols can have parameters attached. It is useful for example for RBL -checks (you can insert additional data after symbol name), for statistic and -fuzzy checks. Also rspamd inserts @emph{Urls} line in which all urls that are -contained in message are printed in comma-separated list. -Note that this protocol is used for normal workers. Controller, fuzzy storage -and lmtp/smtp workers are using other protocols. For example controller's -protocol is oriented on interactive sessions: you can pass many commands to -controller before disconnecting. Fuzzy storage is using UDP for making -interaction with storage faster. LMTP/SMTP workers are using lmtp and smtp -protocols. All of these protocols would be described in further chapters about -rspamd workers. - -@section Controller protocol. - -Rspamd controller can also be accessed by telnet, by rspamc client or by using -perl module Mail::Rspamd::Client. Controller protocol accepts commands and it is -possible to send several commands during a single session. Here is an example -telnet session: -@example ->telnet localhost 11334 -Trying 127.0.0.1... -Connected to localhost. -Escape character is '^]'. -Rspamd version 0.3.0 is running on spam1.rambler.ru -stat -Messages scanned: 1526901 -Messages treated as spam: 238171, 15.60% -Messages treated as ham: 1288730, 84.40% -Messages learned: 0 -Connections count: 1529758 -Control connections count: 15 -Pools allocated: 3059589 -Pools freed: 3056134 -Bytes allocated: 98545852799 -Memory chunks allocated: 8745374 -Shared chunks allocated: 7 -Chunks freed: 8737507 -Oversized chunks: 768784 -Fuzzy hashes stored: 0 -Fuzzy hashes expired: 0 -Statfile: WINNOW_SPAM (version 186); length: 100.0 MB; free blocks: 748504; total blocks: 6553581; free: 11.42% -Statfile: WINNOW_HAM (version 186); length: 100.0 MB; free blocks: 748504; total blocks: 6553581; free: 11.42% -END -@end example -@noindent - -So you can see that reply from controller is ended with line that contains word -@strong{END}. It is also possible to get summary help for controller's commands: -@example -help -Rspamd CLI commands (* - privilleged command): - help - this help message -(*) learn <statfile> <size> [-r recipient] [-m multiplier] [-f from] [-n] - learn message to specified statfile - quit - quit CLI session -(*) reload - reload rspamd -(*) shutdown - shutdown rspamd - stat - show different rspamd stat - counters - show rspamd counters - uptime - rspamd uptime -END -@end example -@noindent - -Note that some commands are privilleged ones - you are required to enter a -password for them: -@example ->telnet localhost 11334 -Trying 127.0.0.1... -Connected to localhost. -Escape character is '^]'. -Rspamd version 0.3.0 is running on spam1.rambler.ru -reload -not authorized -END - -password q1 -password accepted -END - -reload -reload request sent -END -Connection closed by foreign host. -@end example -@noindent - -This password is configured in rspamd.xml in worker section where you are -describing controller: -@example -<worker> - <type>controller</type> - ... -<!-- Other params --> - <param name="password">q1</param> -</worker> -@end example - -In many cases it is more easy to use rspamc to access controller. Here is -example of learning statfiles using rspamc CLI: -@example -% rspamc -h localhost:11334 -P q1 -s WINNOW_HAM learn < /tmp/exim.eml -Results for host localhost:11334: - -Learn succeed. Sum weight: 1.51 - -% rspamc -h localhost:11334 -P q1 -s WINNOW_SPAM learn < /tmp/bad.eml -Results for host localhost:11334: - -Learn succeed. Sum weight: 1.51 -@end example - -Note that rspamc handles password issues and other things like timeouts and -error handling inside and makes this tasks rather easy. - -@section More about rspamc client. - -Rspamc is small and simple client that allows to simplify common tasks for -rspamd manage. Rspamc is written in perl language and requires some modules for -its work: -@itemize @bullet -@item Mail::Rspamd::Client - a module that contains common function for -accessing rspamd, shipped with rspamd and installed automatically -@item Term::Cap - a module that allows basic interaction with terminal, can be -obtained via @url{http://www.cpan.org, cpan}. -@end itemize -Rspamc accepts several command line options: - -@example -% rspamc --help -Usage: rspamc.pl [-h host] [-H hosts_list] [-P password] [-c conf_file] [-s statfile] [-d user@@domain] [command] [path] --h host to connect (in format host:port) or unix socket path --H path to file that contains list of hosts --P define control password --c config file to parse --s statfile to use for learn commands - -Additional options: --d define deliver-to header --w define weight for fuzzy operations --S define search string for IMAP operations --i emulate that message was send from specified IP --p pass message throught all filters - -Notes: -imap format: imap:user:<username>:password:[<password>]:host:<hostname>:mbox:<mboxname> -Password may be omitted and then it would be asked in terminal -imaps requires IO::Socket::SSL - -IMAP search strings samples: -ALL - All messages in the mailbox; -FROM <string> - Messages that contain the specified string in the envelope structure's FROM field; -HEADER <field-name> <string> - Messages that have a header with the specified field-name and that - contains the specified string in the text of the header (what comes after the colon); -NEW - Messages that have the Recent flag set but not the Seen flag. - This is functionally equivalent to "(RECENT UNSEEN)". -OLD - Messages that do not have the Recent flag set. -SEEN - Messages that have the Seen flag set. -SENTBEFORE <date> - Messages whose [RFC-2822] Date: header (disregarding time and timezone) - is earlier than the specified date. -TO <string> - Messages that contain the specified string in the envelope structure's TO field. -TEXT <string> - Messages that contain the specified string in the header or body of the message. -OR <search-key1> <search-key2> - Messages that match either search key (same for AND and NOT operations). - -Version: 0.3.0 -@end example -@noindent - -After options you should specify command to execute, for example: -@example -% rspamc symbols < /tmp/exim.eml -@end example -@noindent -After command name you may specify objects to apply to: files, directories or -even imap folders: -@itemize @bullet -@item A single file: -@example -% rspamc symbols /tmp/exim.eml -@end example -@noindent -@item A list of files: -@example -% rspamc symbols /tmp/*.eml -@end example -@noindent -@item Directories: -@example -% rspamc symbols /tmp/*.eml /tmp/to_scan/ -@end example -@noindent -@item IMAP folder: -@example -% rspamc symbols imap:user:username:password::host:localhost:mbox:INBOX -Enter IMAP password: -@end example -@noindent -Note that it is possible to specify empty password and be prompted for a -password during execution (you also need perl module Term::ReadKey for turning -on noecho input of password). -@end itemize -For fetching imap messages you may also use search string by specifying -S -option. Some examples of IMAP search strings can be found in a help message. For -more complex things you may read rfc3501 about imap4 search strings. This may be -found for example here: @url{http://www.faqs.org/rfcs/rfc3501.html}. IMAP access -may be usefull for setting up automatic learning scripts. Also it is possible to -use SSL version of imap by specifying @strong{imaps} instead @strong{imap} as -first component. Note that for SSL access you need @emph{IO::Socket::SSL} perl -module. - -@chapter Statistics and hashes storage. - -@section Introduction. -First of all we need to strictly define purposes of hashes and statistic. Hashes -are used to find very close messages (for example messages where there are only -several words changed), while statistic can find @strong{probability} of -belonging message to specified class of messages. So when you learn rspamd with -message's hash you just add this hash to storage and when you learn rspamd -statistic you add tokens from message to specified class. So statistic is -probabilistic method to filter message, while fuzzy hashes can detect specific -patterns in messages and filter them. - -@section Classifiers and statistic. -@subsection Tokenization. -Now rspamd supports OSB-Winnow statistic algorithm. Let's describe it in -details. First of all message is separeted into a set of tokens. The algorithm -of extracting tokens is rather simple now: -@enumerate 1 -@item Extract graph symbols till first non-graph symbol (whitespace, punctuation -etc), the group of graph symbols forms a token, non-graphs are separators. -@item Fill an array with token till @strong{window size} is reached (currently -this size is 5 tokens). -@item Get pairs of tokens from array and extract their hashes: -@itemize @bullet -@item * . . . * -> token1 (h1, h5); -@item . * . . * -> token2 (h2, h5); -@item . . * . * -> token3 (h3, h5); -@item . . . * * -> token4 (h4, h5); -@end itemize -@noindent -@item Insert these tokens to statfile (indexed by first hash). -@item Shift window on next word. -@end enumerate -So after tokenizing process we would have tokens each of that contains 2 hashes of 2 -words from message. This mechanics allows to count not only words itself but -also its combinations into a message, so providing more accurate statistic. - -@subsection Classifying. -For classifying process @strong{winnow} algorithm is used. In this statistic -algtorithm we operate not with probabilities but with weights. Each token has -its own weight and when we learn some statfile with tokens rspamd does several -things: -@enumerate 1 -@item Try to find token inside statfile. -@item If a token found multiply its weight by so called @strong{promotion -factor} (that is now 1.23). -@item If token not found insert it into statfile with weight 1. -@end enumerate - -If it is needed to lower token weight, so its weight is multiplied with -@strong{demotion factor} (currently 0.83). Classify process is even more simple: -@enumerate 1 -@item Extract tokens from a message. -@item For each statfile check weight of obtained tokens and store summary -weight. -@item Compare sums for each statfile and select statfile with the most big sum. -@item Do weight normalization and insert symbol of selected statfile. -@end enumerate - -@subsection Statfiles synchronization. -Rspamd allows to make master/slave statfiles synchronization. This is done by -writing changes to statfiles to special @emph{binary log}. Binary log is a file -on filesystem named like statfile but with @emph{.binlog} suffix. Binary log -consist of two level indexes and binary changes to each statfile. So after each -learning process the version of affected statfiles is increased by 1 and a -record is written to binary log. Binary logs have fixed size limit and may have -time limit (rotate time). The process of synchronization may be described as: -@enumerate 1 -@item Slave rspamd periodically asks master for version of statfiles monitored. -@item If master has version that is larger than slave's one the synchronization -process starts. -@item During synchronization process master looks at version reported by client -in binary log. -@item If version is found all records that are @strong{after} client's version -are sent to client. -@item Client accepts changes and apply binary patches one-by-one incrementing -statfile's version. -@item If version that client reports is not found in binary log the completely -statfile is sent to client (slow way, but practically that would take place only -once for fresh slaves). -@end enumerate - -Here is example configuration for master statfile: -@example - <statfile> - <symbol>WINNOW_HAM</symbol> - <size>100M</size> - <path>/spool/rspamd/data.ham</path> - <normalizer>internal:3</normalizer> - <binlog>master</binlog> - <binlog_rotate>1d</binlog_rotate> - </statfile> -@end example -@noindent -Here we define binlog affinity (master) that automatically create binlog file -@file{/spool/rspamd/data.ham.binlog} and set up time limit for it (1 day). -For slaves you should first of all set up controller worker to accept network -connections (statfile synchronization is done via controller workers). The -second task is to define affinity for slave and master's address: -@example - <statfile> - <symbol>WINNOW_HAM</symbol> - <size>100M</size> - <path>/spool/rspamd/data.ham</path> - <normalizer>internal:3</normalizer> - <binlog>slave</binlog> - <binlog_master>spam10:11334</binlog_master> - </statfile> -@end example - -@subsection Conclusion. -Statfiles synchronization allows to set up rspamd cluster that uses the common -statfiles and easily learn the whole cluster without unnecessary overhead. - -@section Hashes and hash storage. -@subsection Fuzzy hashes. -Hashes that are used in rspamd for messages are not cryptoghraphic. Instead of -them fuzzy hashes are used. Fuzzy hashes is technics that allows to obtain -common hashes for common messages (for cryptographic hashes you usually get very -different hashes even if input messages are very common but not identical). The -main principle of fuzzy hashing is to break up text parts of message into small -pieces (blocks) and calculate hash for each block using so called @emph{rolling -hash}. After this process the final hash is forming by setting bytes in it from -blocks. So if we have 2 messages each of that contains 100 blocks and 99 of them -are identical we would have 2 hashes that differs only in one byte. So we can -consider that one message is 99% like other message. - -@subsection Fuzzy storage. -In rspamd hashes can be stored in fuzzy storage. Fuzzy storage is a special -worker that can store hashes and reply about score of hashes. Inside fuzzy -storage each hash has its own weight and list number. List number is integer -that specify to which list this hash is related. This number can be used in -fuzzy_check plugin inside rspamd to add custom symbol. There are two ways of -storing fuzzy hashes: store them in a set of linear linked lists and storing -hashes in very fast judy tree. First way is good for a relatively small number -of fuzzy hashes. Also in this case @emph{fuzzy match} is used, so you can find -not only identical hashes but also common hashes. But for large number of hashes -this method is very slow. The second way requires libJudy in system (can be -found at @url{http://judy.sourceforge.net}) and turns off @emph{fuzzy matching} -- only identical hashes would be found. On the other hand you may store millions -of hashes in judy tree not loosing nor memory, nor CPU. - -@subsection Conclusion. -Fuzzy hashes is efficient way to make up different black or white lists. Fuzzy -storage can be distributed over several machines (if you specify several storage -servers rspamd would select upstream by hash of fuzzy hash). Also storage can -contain several lists identified by number. Each hash has its own weight that -allows to set up dynamic rules that add different score from different hashes. - -@chapter Rspamd modules. - -@section Introduction. - -This chapter describes modules that are shipped with rspamd. Here you can find -details about modules configuration, principles of working, tricks to make spam -filtering effective. First sections describe internal modules written in C: -regexp (regular expressions), surbl (black list for URLs), fuzzy_check (checks -for fuzzy hashes), chartable (check for character sets in messages) and emails -(check for blacklisted email addresses in messages). Modules configuration can -be done in lua or in config file itself. - -@subsection Lua configuration. -You may use lua for setting configuration options for modules. With lua you can -write rather complex rules that can contain not only text lines, but also some -lua functions that would be called while processing messages. For loading lua -configuration you should add line to rspamd.xml: -@example -<lua src="/usr/local/etc/rspamd/lua/my.lua">fake</lua> -@end example -@noindent -It is possible to load several scripts this way. Inside lua file there would be -defined global table with name @var{config}. This table should contain -configuration options for modules indexed by module. This can be written this -way: -@example -config['module_name'] = @{@} -local mconfig = config['module_name'] - -mconfig['option_name'] = 'option value' - -local a = 'aa' -local b = 'bb' - -mconfig['other_option'] = string.format('%s, %s', a, b) -@end example -@noindent -In this simple example we defines new element of table that is associated with -module named 'module_name'. Then we assign to it an empty table (@code{@{@}}) -and associate local variable mconfig. Then we set some elements of this table, -that is equialent to setting module options like that: -@example -option_name = option_value -other_option = aa, bb -@end example -@noindent -Also you may assign to elements of modules tables some functions. That functions -should accept one argument - worker task object and return result specific for -that option: number, string, boolean. This can be shown on this simple example: -@example - -local function test (task) - if task:get_ip() == '127.0.0.1' then - return 1 - else - return 0 - end -end - -mconfig['some_option'] = test -@end example -In this example we assign to module option 'some_option' a function that check -for message's ip and return 1 if that ip is '127.0.0.1'. - -So using lua for configuration can help for making complex rules and for -structuring rules - you can place options for specific modules to specific files -and use lua function @code{dofile} for loading them (or add other @code{<lua>} -tag to rspamd.xml). - -@subsection XML configuration. - -Options for rspamd modules can be set up from xml file too. This can be used for -simple and/or temporary rules and should not be used for complex rules as this -would make xml file too hard to read and edit. Thought it is surely possible but -not recommended from points of config file understanding. Here is a simple -example of module config options: -@example -<module name="module_name"> - <option name="option_name">option_value</option> - <option name="other_option">aa, bb</option> -</module> -@end example -@noindent -Note that you need to encode xml entitles like @code{&} - @code{&} and so -on. Also only utf8 encoding is allowed. In sample rspamd configuration all -modules except regexp module are configured via xml as they have only settings -and regexp module has rules that are sometimes rather complex. - -@section Regexp module. - -@subsection Introduction. -Regexp module is one of the most important rspamd modules. Regexp module can -load regular expressions and filter messages according to them. Also it is -possible to use logical expressions of regexps to create complex rules of -filtering. It is allowed to use logical operators: -@itemize @bullet -@item & - logical @strong{AND} function -@item | - logical @strong{OR} function -@item ! - logical @strong{NOT} function -@end itemize -Also it is possible to use brackets for making priorities in expressions. Regexp -module operates with @emph{regexp items} that can be combined with logical -operators into logical @emph{regexp expresions}. Each expression is associated -with its symbol and if it evaluates to true with this message the symbol would -be inserted. Note that rspamd uses internal optimization of logical expressions -(for example if we have expression 'rule1 & rule2' rule2 would not be evaluated -if rule1 is false) and internal regexp cache (so if rule1 and rule2 have common -items they would be evaluated only once). So if you need speed optimization of -your rules you should take this fact into consideration. - -@subsection Regular expressions. -Rspamd uses perl compatible regular expressions. You may read about perl regular -expression syntax here: @url{http://perldoc.perl.org/perlre.html}. In rspamd -regular expressions must be enclosed in slashes: -@example -/^\\d+$/ -@end example -@noindent -If '/' symbol must be placed into regular expression it should be escaped: -@example -/^\\/\\w+$/ -@end example -@noindent -After last slash it is possible to place regular expression modificators: -@multitable @columnfractions 0.1 0.9 -@headitem Modificator @tab Mean -@item @strong{i} @tab Ignore case for this expression. -@item @strong{m} @tab Assume this expression as multiline. -@item @strong{s} @tab Assume @emph{.} as all characters including newline -characters (should be used with @strong{m} flag). -@item @strong{x} @tab Assume this expression as extended regexp. -@item @strong{u} @tab Performs ungreedy matches. -@item @strong{o} @tab Optimize regular expression. -@item @strong{r} @tab Assume this expression as @emph{raw} (this is actual for -utf8 mode of rspamd). -@item @strong{H} @tab Search expression in message's headers. -@item @strong{X} @tab Search expression in raw message's headers (without mime -decoding). -@item @strong{M} @tab Search expression in the whole message (must be used -carefully as @strong{the whole message} would be checked with this expression). -@item @strong{P} @tab Search expression in all text parts. -@item @strong{U} @tab Search expression in all urls. -@end multitable - -You can combine flags with each other: -@example -/^some text$/iP -@end example -@noindent -All regexp must be with type: H, X, M, P or U as rspamd should know where to -search for specified pattern. Header regexps (H and X) have special syntax if -you need to check specific header, for example @emph{From} header: -@example -From=/^evil.*$/Hi -@end example -@noindent -If header name is not specified all headers would be matched. Raw headers is -matching is usefull for searching for mime specific headers like MIME-Version. -The problem is that gmime that is used for mime parsing adds some headers -implicitly, for example @emph{MIME-Version} and you should match them using raw -headers. Also if header's value is encoded (base64 or quoted-printable encoding) -you can search for decoded version using H modificator and for raw using X -modificator. This is usefull for finding bad encodings types or for unnecessary -encoding. - -@subsection Internal function. -Rspamd provides several internal functions for simplifying message processing. -You can use internal function as items in logical expressions as they like -regular expressions return logical value (true or false). Here is list of -internal functions with their arguments: -@multitable @columnfractions 0.3 0.2 0.5 -@headitem Function @tab Arguments @tab Description -@item header_exists -@tab header name -@tab Returns true if specified header exists. - -@item compare_parts_distance -@tab number -@tab If message has two parts (text/plain and text/html) compare how much they -differs (html messages are compared with stripped tags). The difference is -number in percents (0 is identically parts and 100 is totally different parts). -So if difference is more than number this function returns true. - -@item compare_transfer_encoding -@tab string -@tab Compares header Content-Transfer-Encoding with specified string. - -@item content_type_compare_param -@tab param_name, param_value -@tab Compares specified parameter of Content-Type header with regexp or certain -string: -@example -content_type_compare_param(Charset, /windows-\d+/) -content_type_compare_param(Charset, ascii) -@end example -@noindent - -@item content_type_has_param -@tab param_name -@tab Returns true if content-type has specified parameter. - -@item content_type_is_subtype -@tab subtype_name -@tab Return true if content-type is of specified subtype (for example for -text/plain subtype is 'plain'). - -@item content_type_is_type -@tab type_name -@tab Return true if content-type is of specified type (for example for -text/plain subtype is 'text'): -@example -content_type_is_type(text) -content_type_is_subtype(/?.html/) -@end example -@noindent - -@item regexp_match_number -@tab number,[regexps list] -@tab Returns true if specified number of regexps matches for this message. This -can be used for making rules when you do not know which regexps should match but -if 2 of them matches the symbol shoul be inserted. For example: -@example -regexp_match_number(2, /^some evil text.*$/Pi, From=/^hacker.*$/H, header_exists(Subject)) -@end example -@noindent - -@item has_only_html_part -@tab nothing -@tab Returns true when message has only HTML part - -@item compare_recipients_distance -@tab number -@tab Like compare_parts_distance calculate difference between recipients. Number -is used as minimum percent of difference. Note that this function would check -distance only when there are more than 5 recipients in message. - -@item is_recipients_sorted -@tab nothing -@tab Returns true if recipients list is sorted. This function would also works -for more than 5 recipients. - -@item is_html_balanced -@tab nothing -@tab Returns true when all HTML tags in message are balanced. - -@item has_html_tag -@tab tag_name -@tab Returns true if tag 'tag_name' exists in message. - -@item check_smtp_data -@tab item, regexp -@tab Returns true if specified part of smtp dialog matches specified regexp. Can -check HELO, FROM and RCPT items. - -@end multitable - -These internal functions can be easily implemented in lua but I've decided to -make them built-in as they are widely used in our rules. In fact this list may -be extended in future. - -@subsection Dynamic rules. -Rspamd regexp module can use dynamic rules that can be written in json syntax. -Dynamic rules are loaded at runtime and can be modified while rspamd is working. -Also it is possible to turn dynamic rules for specific networks only and add rules -that does not contain any regexp (this can be usefull for dynamic lists for example). -Dynamic rules can be obtained like any other dynamic map via file monitoring or via -http. Here are examples of dynamic rules definitions: -@example -<module name="regexp"> - <option name="dynamic_rules">file:///tmp/rules.json</option> -</module> -@end example -@noindent -or for http map: -@example -<module name="regexp"> - <option name="dynamic_rules">http://somehost/rules.json</option> -</module> -@end example -@noindent -Rules are presented as json array (in brackets @emph{'[]'}). Each rule is json object. -This object can have several properties (properties with @strong{*} are required): -@multitable @columnfractions 0.3 0.7 -@headitem Property @tab Mean -@item symbol(*) -@tab Symbol for rule. -@item factor(*) -@tab Factor for rule. -@item rule -@tab Rule itself (regexp expression). -@item enabled -@tab Boolean flag that define whether this rule is enabled (rule is enabled if -this flag is not present by default). -@item networks -@tab Json array of networks (in CIDR format, also it is possible to add negation -by prepending @emph{!} symbol before item. -@end multitable -Here is an example of dynamic rule: -@example -[ - { - "rule": "/test/rP", - "symbol": "R_TMP_1", - "factor": 1.1, - "networks": ["!192.168.1.0/24", "172.16.0.0/16"], - "enabled": false - } -] -@end example -Note that dynamic rules are constantly monitored for changes and are reloaded -completely when modification is detected. If you change dynamic rules they -would be reloaded in a minute and would be applied for new messages. - -@subsection Conclusion. -Rspamd regexp module is powerfull tool for matching different patterns in -messages. You may use logical expressions of regexps and internal rspamd -functions to make rules. Rspamd is shipped with many rules for regexp module -(most of them are taken from spamassassin rules as rspamd originally was a -replacement of spamassassin) so you can look at them in ETCDIR/rspamd/lua/regexp -directory. There are many built-in rules with detailed comments. Also note that -if you add logical rule into XML file you need to escape all XML entitles (like -@emph{&} operators). When you make complex rules from many parts do not forget -to add brackets for parts inside expression as you would not predict order of -checks otherwise. Rspamd regexp module has internal logical optimization and -regexp cache, so you may use identical regexp many times - they would be matched -only once. And in logical expression you may optimize performance by putting -likely TRUE regexp first in @emph{OR} expression and likely FALSE expression -first in @emph{AND} expression. A number of internal functions can simplify -complex expressions and for making common filters. Lua functions can be added in -rules as well (they should return boolean value). - -@section SURBL module. - -Surbl module is designed for checking urls via blacklists. You may read about -surbls at @url{http://www.surbl.org}. Here is the sequence of operations that is -done by surbl module: -@enumerate 1 -@item Extract all urls in message and get domains for each url. -@item Check to special list called '2tld' and extract 3 components for domains -from that list and 2 components for domains that are not listed: -@example -http://virtual.somehost.domain.com/some_path --> somehost.domain.com if domain.com is in 2tld list --> domain.com if not in 2tld -@end example -@noindent -@item Remove duplicates from domain lists -@item For each registered surbl do dns request in form @emph{domain.surbl_name} -@item Get result and insert symbol if that name resolves -@item It is possible to examine bits in returned IP address and insert different -symbol for each bit that is turned on in result. -@end enumerate -All DNS requests are done asynchronously so you may not bother about blocking. -SURBL module has several configuration options: -@itemize @bullet -@item @emph{metric} - metric to insert symbol to. -@item @emph{2tld} - list argument of domains for those 3 components of domain name -would be extracted. -@item @emph{max_urls} - maximum number of urls to check. -@item @emph{whitelist} - map of domains for which surbl checks would not be performed. -@item @emph{suffix} - a name of surbl. It is possible to add several suffixes: -@example -suffix_RAMBLER_URIBL = insecure-bl.rambler.ru -or in xml: - <param name="suffix_RAMBLER_URIBL">insecure-bl.rambler.ru</param> -@end example -@noindent -It is possible to add %b to symbol name for checking specific bits: -@example -suffix_%b_SURBL_MULTI = multi.surbl.org -then you may define replaces for %b in symbol name for each bit in result: -bit_2 = SC -> sc.surbl.org -bit_4 = WS -> ws.surbl.org -bit_8 = PH -> ph.surbl.org -bit_16 = OB -> ob.surbl.org -bit_32 = AB -> ab.surbl.org -bit_64 = JP -> jp.surbl.org -@end example -@noindent -So we make one DNS request and check for specific list by checking bits in -result ip. This is described in surbl page: -@url{http://www.surbl.org/lists.html#multi}. Note that result symbol would NOT -contain %b as it would be replaced by bit name. Also if several bits are set -several corresponding symbols would be added. -@end itemize - -Also surbl module can use redirector - a special daemon that can check for -redirects. It uses HTTP/1.0 for requests and accepts a url and returns resolved -result. Redirector is shipped with rspamd but not enabled by default. You may -enable it on stage of configuring but note that it requires many perl modules -for its work. Rspamd redirector is described in details further. Here are surbl -options for working with redirector: -@itemize @bullet -@item @emph{redirector}: adress of redirector (in format host:port) -@item @emph{redirector_connect_timeout} (seconds): redirector connect timeout (default: 1s) -@item @emph{redirector_read_timeout} (seconds): timeout for reading data (default: 5s) -@item @emph{redirector_hosts_map} (map string): map that contains domains to check with redirector -@end itemize - -So surbl module is an easy to use way to check message's urls and it may be used -in every configuration as it filters rather big ammount of email spam and scam. - -@section SPF module. - -SPF module is designed to make checks of spf records of sender's domains. SPF -records are placed in TXT DNS items for domains that have enabled spf. You may -read about SPF at @url{http://en.wikipedia.org/wiki/Sender_Policy_Framework}. -There are 3 results of spf check for domain: -@itemize @bullet -@item ALLOW - this ip is allowed to send messages for this domain -@item FAIL - this ip is @strong{not} allowed to send messages for this domain -@item SOFTFAIL - it is unknown whether this ip is allowed to send mail for this -domain -@end itemize -SPF supports different mechanizms for checking: dns subrequests, macroses, -includes, blacklists. Rspamd supports the most of them. Also for security -reasons there is internal limits for DNS subrequests and inclusions recursion. -SPF module support very small ammount of options: -@itemize @bullet -@item @emph{metric} (string): metric to insert symbol (default: 'default') -@item @emph{symbol_allow} (string): symbol to insert (default: 'R_SPF_ALLOW') -@item @emph{symbol_fail} (string): symbol to insert (default: 'R_SPF_FAIL') -@item @emph{symbol_softfail} (string): symbol to insert (default: 'R_SPF_SOFTFAIL') -@end itemize - -@section Chartable module. - -Chartable is a simple module that detects different charsets in a message. This -module is aimed to protect from emails that contains symbols from different -character sets that looks like each other. Chartable module works differently -for raw and utf modes: in utf modes it detects different characters from unicode -tables and in raw modes only ASCII and non-ASCII symbols. Configuration of whis -module is very simple: -@itemize @bullet -@item @emph{metric} (string): metric to insert symbol (default: 'default') -@item @emph{symbol} (string): symbol to insert (default: 'R_BAD_CHARSET') -@item @emph{threshold} (double): value that would be used as threshold in expression -@math{N_{charset-changes} / N_{chars}} -(e.g. if threshold is 0.1 than charset change should occure more often than in 10 symbols), -default: 0.1 -@end itemize - -@section Fuzzy check module. - -Fuzzy check module provides a client for rspamd fuzzy storage. Fuzzy check can -work with a cluster of rspamd fuzzy storages and the specific storage is -selected by value of hash of message's hash. The available configuration options -are: -@itemize @bullet -@item @emph{metric} (string): metric to insert symbol (default: 'default') -@item @emph{symbol} (string): symbol to insert (default: 'R_FUZZY') -@item @emph{max_score} (double): maximum score to that weights of hashes would be -normalized (default: 0 - no normalization) -@item @emph{fuzzy_map} (string): a string that contains map in format @{ fuzzy_key => [ -symbol, weight ] @} where fuzzy_key is number of fuzzy list. This string itself -should be in format 1:R_FUZZY_SAMPLE1:10,2:R_FUZZY_SAMPLE2:1 etc, where first -number is fuzzy key, second is symbol to insert and third - weight for -normalization -@item @emph{min_length} (integer): minimum length (in characters) for text part to be -checked for fuzzy hash (default: 0 - no limit) -@item @emph{whitelist} (map string): map of ip addresses that should not be checked -with this module -@item @emph{servers} (string): list of fuzzy servers in format -"server1:port,server2:port" - these servers would be used for checking and -storing fuzzy hashes -@end itemize - -@section Forged recipients. - -Forged recipients is a lua module that compares recipients provided by smtp -dialog and recipients from @emph{To:} header. Also it is possible to compare -@emph{From:} header with SMTP from. So you may set @strong{symbol_rcpt} option -to set up symbol that would be inserted when recipients differs and -@strong{symbol_sender} when senders differs. - -@section Maillist. - -Maillist is a module that detects whether this message is send by using one of -popular mailing list systems (among supported are ezmlm, mailman and -subscribe.ru systems). The module has only option @strong{symbol} that defines a -symbol that would be inserted if this message is sent via mailing list. - -@section Once received. - -This lua module checks received headers of message and insert symbol if only one -received header is presented in message (that usually signals that this mail is -sent directly to our MTA). Also it is possible to insert @emph{strict} symbol -that indicates that host from which we receive this message is either -unresolveable or has bad patterns (like 'dynamic', 'broadband' etc) that -indicates widely used botnets. Configuration options are: -@itemize @bullet -@item @emph{symbol}: symbol to insert for messages with one received header. -@item @emph{symbol_strict}: symbol to insert for messages with one received -header and containing bad patterns or unresolveable sender. -@item @emph{bad_host}: defines pattern that would be count as "bad". -@item @emph{good_host}: defines pattern that would be count as "good" (no strict -symbol would be inserted), note that "good" has a priority over "bad" pattern. -@end itemize -You can define several "good" and "bad" patterns for this module. - -@section Received rbl. - -Received rbl module checks for all received headers and make dns requests to IP -black lists. This can be used for checking whether this email was transfered by -some blacklisted gateway. Here are options available: -@itemize @bullet -@item @emph{symbol}: symbol to insert if message contains blacklisted received -headers -@item @emph{rbl}: a name of rbl to check, it is possible to define specific -symbol for this rbl by adding symbol name after semicolon: -@example -rbl = pbl.spamhaus.org:RECEIVED_PBL -@end example -@end itemize - -@section Multimap. - -Multimap is lua module that provides functionality to operate with different types -of lists. Now it can works with maps of strings for extracting MIME headers and match -them using lists. Also it is possible to create ip (or ipnetwork) maps for -checking ip address from which we receive that mail. DNS black lists are also -supported. -Multimap module works with a set of rules. Each rule can be one of three types: -@enumerate 1 -@item @emph{ip}: is used for lists of ip addresses -@item @emph{header}: is used to match headers -@item @emph{dnsbl}: is used for dns lists of ip addresses -@end enumerate -Basically each rule is a line separated by commas containing rule parameters. -Each parameter has name and value, separated by equal sign. Here is list of -parameters (mandatory parameters are marked with @strong{*}): -@itemize @bullet -@item @strong{*} @emph{type}: rule type -@item @strong{*} @emph{map}: path to map (in uri format file:// or http://) or -name of dns blacklist -@item @strong{*} @emph{symbol}: symbol to insert -@item @emph{header}: header to use for header rules -@item @emph{pattern}: pattern that would be used to extract specific part of -header -@end itemize -@noindent -Here is an example of multimap rules: -@example -<module name="multimap"> - <option name="rule">type = header, header = To, pattern = @(.+)>?$, map = file:///var/db/rspamd/rcpt_test, symbol = R_RCPT_WHITELIST</option> - <option name="rule">type = ip, map = file:///var/db/rspamd/ip_test, symbol = R_IP_WHITELIST</option> - <option name="rule">type = dnsbl, map = pbl.spamhaus.org, symbol = R_IP_PBL</option> -</module> -@end example - -@section Conclusion. - -Rspamd is shipped with some ammount of modules that provides basic functionality -fro checking emails. You are allowed to add custom rules for regexp module and -to set up available parameters for other modules. Also you may write your own -modules (in C or Lua) but this would be described further in this documentation. -You may set configuration options for modules from lua or from xml depends on -its complexity. Internal modules are enabled and disabled by @strong{filters} -configuration option. Lua modules are loaded and usually can be disabled by -removing their configuration section from xml file or by removing corresponding -line from @strong{modules} section. - -@bye diff --git a/doc/why-rspamd.html b/doc/why-rspamd.html deleted file mode 100644 index aceb1228c..000000000 --- a/doc/why-rspamd.html +++ /dev/null @@ -1,392 +0,0 @@ -<html><head><title>Фильтрация спама при помощи системы rspamd.</title> -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" > -</head> -<body class='pod'> -<!-- - generated by Pod::Simple::HTML v3.13, - using Pod::Simple::PullParser v3.13, - under Perl v5.010000 at Thu Feb 4 17:55:58 2010 GMT. - - If you want to change this HTML document, you probably shouldn't do that - by changing it directly. Instead, see about changing the calling options - to Pod::Simple::HTML, and/or subclassing Pod::Simple::HTML, - then reconverting this document from the Pod source. - When in doubt, email the author of Pod::Simple::HTML for advice. - See 'perldoc Pod::Simple::HTML' for more info. - ---> - -<!-- start doc --> -<a name='___top' class='dummyTopAnchor' ></a> - -<h1><a class='u' href='#___top' title='click to go to top of document' -name="(1060)(1080)(1083)(1100)(1090)(1088)(1072)(1094)(1080)(1103)_(1089)(1087)(1072)(1084)(1072)_(1087)(1088)(1080)_(1087)(1086)(1084)(1086)(1097)(1080)_(1089)(1080)(1089)(1090)(1077)(1084)(1099)_rspamd." ->Фильтрация спама при помощи системы rspamd.</a></h1> - -<h2><a class='u' href='#___top' title='click to go to top of document' -name="1._(1048)(1089)(1090)(1086)(1088)(1080)(1103)_(1080)_(1087)(1088)(1077)(1076)(1087)(1086)(1089)(1099)(1083)(1082)(1080)_(1089)(1086)(1079)(1076)(1072)(1085)(1080)(1103)." ->1. -История и предпосылки создания.</a></h2> - -<p>Мы долгое время использовали для фильтрации спама spamassassin, -однако, -при наших объемах почтового трафика (9-10 миллионов писем в сутки) spamassassin не обеспечивал достаточной производительности. -После анализа исходного кода и принципов работы было выявлены следующие "врожденные" проблемы SA:</p> - -<ul> -<li>обработка письма осуществляется набором регулярных выражений, -однако, -количество этих выражений слишком велико и является ключевым моментом задумчивости SA (например, -для извлечения received заголовков письма, -SA проверяет оные на соответствие всем ему известным MTA, -очевидно, -что такое действие не является оптимальным);</li> - -<li>нет возможности явно получить ip адрес, -с которого нам отправили письмо (в SA это делается парсом received заголовков, -что я лично не считаю правильным, -а тем более оптимальным способом, -так как MTA всегда знает, -откуда ему пришло данное письмо)</li> - -<li>нет возможности передачи спам фильтру данных SMTP диалога</li> - -<li>MIME парсинг писем очень медленный, -так как опять же сделан на базе регулярных выражений</li> -</ul> - -<p>В итоге можно сказать, -что основная проблема SA - это излишняя увлеченность авторов регулярными выражениями и отсутствие оптимизации. -В итоге, -в качестве базовых принципов создания rspamd были принципы оптимизации времени обработки писем, -в числе которых:</p> - -<ul> -<li>полностью асинхронная работа с сетью (на базе libevent), -в том числе DNS запросы и работа с http</li> - -<li>быстрые механизмы выделения памяти</li> - -<li>компиляция всех регулярных выражений и вызов только тех из них, -которые наиболее возможны (то есть, -имеется механизм ведения статистики срабатывания различных правил, -и при обработке следующего письма учитывается обработка предыдущих, -что позволяет максимально быстро провести основные тесты)</li> - -<li>расширяемая архитектура: возможность написания плагинов на си, -lua, -возможность добавления новых типов фильтров, -расширений протокола rspamc, -возможность добавления новых типов статистических алгоритмов, -алгоритмов нормализации и парсинга текстов</li> - -<li>возможность динамической загрузки различных настроек, -списков ip адресов и прочей информации через HTTP протокол с поддержкой даты модификации таких списков</li> - -<li>использование везде, -где возможно, -специализированных конечных автоматов для разбора и анализа текстов</li> - -<li>использование быстрого mime парсера gmime</li> -</ul> - -<p>В результате перехода с SA на rspamd последний показал в среднем в 10 раз более быструю обработку сообщений. -В данный момент rspamd имеет статус бета версии, -но вполне пригоден для работы.</p> - -<h2><a class='u' href='#___top' title='click to go to top of document' -name="2._(1059)(1089)(1090)(1072)(1085)(1086)(1074)(1082)(1072)_(1080)_(1085)(1072)(1089)(1090)(1088)(1086)(1081)(1082)(1072)_rspamd" ->2. -Установка и настройка rspamd</a></h2> - -<p>Для сборки rspamd вам потребуются:</p> - -<ul> -<li>libevent <a href="http://www.monkey.org/~provos/libevent/" class="podlinkurl" ->http://www.monkey.org/~provos/libevent/</a> - библиотека для асинхронной обработки событий</li> - -<li>glib <a href="http://library.gnome.org/devel/glib/" class="podlinkurl" ->http://library.gnome.org/devel/glib/</a> - библиотека общего назначения, -содержащая многие вещи, -о которых разработчики libc, -увы, -забыли (glib не является графической библиотекой, -хотя и используется, -например, -gtk)</li> - -<li>gmime <a href="http://spruce.sourceforge.net/gmime/" class="podlinkurl" ->http://spruce.sourceforge.net/gmime/</a> - MIME парсер на базе библиотеки glib</li> - -<li>lua <a href="http://www.lua.org/" class="podlinkurl" ->http://www.lua.org/</a> - встраиваемый скриптовый язык (в принципе, -наличие lua необязательно, -но без lua многий функционал rspamd останется нереализованным)</li> - -<li>perl <a href="http://www.perl.org/" class="podlinkurl" ->http://www.perl.org/</a> - на перле написан, -например, -консольный клиент rspamc, -распознаватель редиректов в URL'ях, -поэтому наличие перла в системе крайне желательно</li> - -<li>cmake <a href="http://www.cmake.org/" class="podlinkurl" ->http://www.cmake.org/</a> - система сборки, -которая позволяет rspamd собираться (по крайней мере, -в теории) на всех Posix совместимых системах. -Использовать стандартные в данной ситуации autotools я не стал, -так как считаю их самой неудобной в использовании системой сборки исходников, -которую можно только придумать.</li> - -<li>mercurial <a href="http://mercurial.selenic.com/" class="podlinkurl" ->http://mercurial.selenic.com/</a> - система управления версиями (SCM), -используемая для разработки rspamd. -Так как в настоящее время rspamd находится в состоянии бета-версии, -то релизы выходят нечасто и зачастую являются менее стабильными, -чем текущая версия в репозитории, -поэтому для установки rspamd лучше использовать версию непосредственно из репозитория.</li> -</ul> - -<p>После установки всех требуемых программ и библиотек можно приступить непосредственно к установке rspamd.</p> - -<dl> -<dt><a name="1_(1089)(1082)(1072)(1095)(1080)(1074)(1072)(1077)(1084)_(1090)(1077)(1082)(1091)(1097)(1077)(1077)_(1089)(1086)(1089)(1090)(1086)(1103)(1085)(1080)(1077)_(1088)(1077)(1087)(1086)(1079)(1080)(1090)(1086)(1088)(1080)(1103):_$_hg_clone_http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd" ->1 скачиваем текущее состояние репозитория: $ hg clone http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd</a></dt> - -<dd> -<dt><a ->2 конфигурируем rspamd: $ cd rspamd && cmake . -(при необходимости изменить параметры можно вначале воспользоваться командой ccmake .)</a></dt> - -<dd> -<dt><a name="3_(1089)(1086)(1073)(1080)(1088)(1072)(1077)(1084):_$_make" ->3 собираем: $ make</a></dt> - -<dd> -<dt><a name="4_(1091)(1089)(1090)(1072)(1085)(1072)(1074)(1083)(1080)(1074)(1072)(1077)(1084):_#_make_install" ->4 устанавливаем: # make install</a></dt> -</dl> - -<h3><a class='u' href='#___top' title='click to go to top of document' -name="(1050)(1086)(1085)(1092)(1080)(1075)(1091)(1088)(1080)(1088)(1086)(1074)(1072)(1085)(1080)(1077)" ->Конфигурирование</a></h3> - -<p>В процессе установки ставятся конфигурационные файлы по умолчанию в каталог {PREFIX}/etc. -При этом, -в каталог etc/rspamd устанавливаются правила по умолчанию (headers, -html, -drugs, -loto и.т.п.), -а в каталог etc/rspamd.conf.sample устанавливается конфигурационный файл по умолчанию. -Его можно скопировать в файл etc/rspamd.conf и отредактировать в соответствии с собственными предпочтениями. -Конфигурационный файл по умолчанию снабжен комментариями к каждой директиве, -а также подробно описан в документации к rspamd, -находящейся в каталоге исходников doc/rspamd.pdf. -В данном же руководстве подробно изложен принцип работы rspamd и настройки всех модулей системы. -Для базовой работы достаточно исправить пути к файлам логов, -пидфайлу, -а также обратить внимание на разделы factors и classifiers. -Остановлюсь на этом несколько подробнее.</p> - -<p>Все директивы rspamd имеют формат param = value; где символ ';' является признаком окончания директивы. -Также файл разбит на секции, -каждая секция имеет имя (например worker {}) и внутренние директвы внутри фигурных скобок. -После каждой секции также обязателен символ ';'. -Также каждый модуль имеет особый формат секции:</p> - -<pre> -.module 'name' { - param = value; -}; -</pre> - - -<p>Все это может показаться сложным на первый взгляд, -но это позволяет лучше структурировать файл и облегчает расширяемость rspamd. -Для первоначальной настройки достаточно обратить внимание на раздел factors, -который описывает веса различных правил, -раздел metric, -который описывает максимальный вес, -чтобы письмо считалось спамом, -а также на раздел classifiers. -Раздел classifiers обеспечивает работу статистических алгоритмов. -В rspamd в настоящее время реализован алгоритм winnow, -который работает следующим образом:</p> - -<dl> -<dt><a name="1_(1090)(1077)(1082)(1089)(1090)_(1088)(1072)(1079)(1073)(1080)(1074)(1072)(1077)(1090)(1089)(1103)_(1085)(1072)_(1089)(1083)(1086)(1074)(1072),_(1090)(1072)(1082)(1078)(1077)_(1074)(1099)(1076)(1077)(1083)(1103)(1077)(1090)(1089)(1103)_(1086)(1082)(1085)(1086)_(1074)_(1087)(1103)(1090)(1100)_(1089)(1083)(1086)(1074)" ->1 текст разбивается на слова, -также выделяется окно в пять слов</a></dt> - -<dd> -<dt><a name="2_(1086)(1082)(1085)(1086)_(1087)(1077)(1088)(1077)(1084)(1077)(1097)(1072)(1077)(1090)(1089)(1103)_(1087)(1086)_(1089)(1083)(1086)(1074)(1072)(1084),_(1087)(1088)(1080)_(1101)(1090)(1086)(1084)_(1074)(1099)(1076)(1077)(1083)(1103)(1102)(1090)(1089)(1103)_(1089)(1083)(1086)(1074)(1086)(1089)(1086)(1095)(1077)(1090)(1072)(1085)(1080)(1103)_(1087)(1086)_(1086)(1087)(1088)(1077)(1076)(1077)(1083)(1077)(1085)(1085)(1086)(1084)(1091)_(1072)(1083)(1075)(1086)(1088)(1080)(1090)(1084)(1091)_(1080)_(1074)(1099)(1095)(1080)(1089)(1083)(1103)(1077)(1090)(1089)(1103)_(1080)(1093)_(1093)(1077)(1096)" ->2 окно перемещается по словам, -при этом выделяются словосочетания по определенному алгоритму и вычисляется их хеш</a></dt> - -<dd> -<dt><a ->3 каждый полученный таким образом хеш проверяется в файле статистики, -в котором хранятся хеши и их веса, -если хеш найден, -то его вес добавляется к суммарному весу данного файла</a></dt> - -<dd> -<dt><a name="4_(1092)(1072)(1081)(1083),_(1085)(1072)(1073)(1088)(1072)(1074)(1096)(1080)(1081)_(1074)_(1089)(1091)(1084)(1084)(1077)_(1073)(1086)(1083)(1100)(1096)(1077)_(1074)(1077)(1089)(1072)_(1089)(1095)(1080)(1090)(1072)(1077)(1090)(1089)(1103)_(1082)(1083)(1072)(1089)(1089)(1086)(1084)_(1087)(1080)(1089)(1100)(1084)(1072)" ->4 файл, -набравший в сумме больше веса считается классом письма</a></dt> -</dl> - -<p>Основная идея такого подхода в определении по словосочетаниям, -к какому классу принадлежит данное письмо. -В SA для этой цели используется вероятностный алгоритм bayes, -который достаточно похож на вышеописанный, -но считает не веса, -а вероятности. -Эффективность каждого из алгоритмов примерно одинакова и зависит в основном от эффективности обучения. -Однако, -в отличие от SA, -rspamd использует не отдельные слова, -а словосочетания, -что повышает его эффективность. -В секции classifiers можно установить различные классы писем, -а далее в секции factors указать их вес (задав, -например, -для заведомо безвредных писем - ham - отрицательный вес). -Размер файлов статистики должен быть разумно большим для хранения как можно большего числа хешей. -Однако, -необходимо учитывать, -что эти файлы целиком загружаются в память (хотя, -реализация отображения файла в памяти в различных ОС допускает загрузку и выгрузку страниц этого файла в своп системы, -но эффективность этого довольно низка), -поэтому необходимо соизмерять размер оперативной памяти и файлов статистики.</p> - -<h2><a class='u' href='#___top' title='click to go to top of document' -name="4._(1055)(1086)(1076)(1082)(1083)(1102)(1095)(1077)(1085)(1080)(1077)_(1080)_(1087)(1088)(1086)(1074)(1077)(1088)(1082)(1072)_(1088)(1072)(1073)(1086)(1090)(1086)(1089)(1087)(1086)(1089)(1086)(1073)(1085)(1086)(1089)(1090)(1080)_rspamd" ->4. -Подключение и проверка работоспособности rspamd</a></h2> - -<p>Для проверки работы системы rspamd проще всего воспользоваться командой rspamc:</p> - -<pre> -hostname:~> rspamc stat -Do rspamc command stat -Messages scanned: 1234040 -Messages learned: 59151 -Connections count: 1176623 -Control connections count: 59152 -Pools allocated: 2530714 -Pools freed: 2530699 -Bytes allocated: 66991793394 -Memory chunks allocated: 6453232 -Shared chunks allocated: 3 -Chunks freed: 6453090 -Oversized chunks: 468849 -Statfile: WINNOW_HAM (version 69); length: 100.0 MB; free blocks: 4563488; total blocks: 6553581; free: 69.63% -Statfile: WINNOW_SPAM (version 36383); length: 100.0 MB; free blocks: 760504; total blocks: 6553581; free: 11.60% -</pre> - - -<p>В данном случае выводится общая статистика. -Такого же эффекта можно достигнуть командой telnet на порт процесса controller (он описан в конфигурационном файле в секции worker, -type у которого controller). -По умолчанию это порт 11334 на адресе 127.0.0.1. -Работу правил и статистики можно также проверить по команде rspamc:</p> - -<pre> -~> rspamc symbols /tmp/mailman.eml -Processing /tmp/mailman.eml -Process file: /tmp/mailman.eml -Sending 4950 bytes... -RSPAMD/1.1 0 OK -Metric: default; False; -3.35 / 10.00 / 0.00 -Symbol: WINNOW_HAM; 5.00 -Symbol: RECEIVED_RBL; pbl.spamhaus.org,insecure-bl.rambler.ru -Urls: -</pre> - - -<p>В данном случае показываются баллы, -набранные письмом, -а также дополнительная информация. -Подробнее о протоколе rspamc в документации (doc/rspamd.pdf). -Для подключения rspamd к MTA лучше всего использовать milter, -если ваш MTA postfix или sendmail. -В качестве milter'а можно использовать, -например, -rmilter: <a href="https://www.milter.org/milter/71/" class="podlinkurl" ->https://www.milter.org/milter/71/</a>. -О настройке postfix + rmilter мной была написана следующая заметка: <a href="http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html" class="podlinkurl" ->http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html</a> Для MTA exim можно воспользоваться файлом local_scan.c в каталоге contrib/exim. -Инструкции по его установке описаны в самом файле, -однако, -это требует пересборки MTA. -Также rspamd "понимает" протокол SA, -поэтому для подключения rspamd можно использовать те же средства, -что и для подключения к MTA SA.</p> - -<p>Подробнее о командах rspamc и протоколе rspamc написано опять же в документации.</p> - -<h2><a class='u' href='#___top' title='click to go to top of document' -name="5._(1054)(1073)(1091)(1095)(1077)(1085)(1080)(1077)_rspamd" ->5. -Обучение rspamd</a></h2> - -<p>Процесс обучения важен для корректной работы статистики. -Для обучения используется команда rspamc learn. -Для указания файла (класса) письма используется ключ -s. -Пример использования:</p> - -<pre> -~> rspamc -s WINNOW_HAM learn /tmp/mailman.eml -Processing /tmp/mailman.eml -Process file: /tmp/mailman.eml -Do rspamc command learn -Sending 4950 bytes... -Learn succeed. Sum weight: 128.48 -</pre> - - -<p>В качестве параметров можно указывать несколько файлов, -целые каталоги, -а также imap папки:</p> - -<pre> -~> rspamc -s WINNOW_SPAM learn imaps:user:cebka:password::host:somehost.rambler.ru:mbox:abuse.spam -Processing imaps:user:cebka:password::host:mailsupport.rambler.ru:mbox:abuse.spam -Enter IMAP password: -Process imap: host: somehost.rambler.ru, mbox: abuse.spam -Do rspamc command learn -Sending 382650 bytes... -Learn succeed. Sum weight: 1850.24 -<skipped> -</pre> - - -<p>При обучении необходимо учитывать, -чтобы количество spam и ham писем было примерно равным. -Вес показывает суммарный вес словосочетаний текста, -который был до обучения данным письмом (то есть, -то, -насколько велика вероятность принадлежности данного письма к этому классу). -При обнаружении неверных срабатываний статистики можно несколько раз применить learn к заданному письму, -проверяя его суммарный вес.</p> - -<h2><a class='u' href='#___top' title='click to go to top of document' -name="6._(1055)(1086)(1076)(1076)(1077)(1088)(1078)(1082)(1072)_(1080)_(1076)(1072)(1083)(1100)(1085)(1077)(1081)(1096)(1080)(1077)_(1076)(1077)(1081)(1089)(1090)(1074)(1080)(1103)" ->6. -Поддержка и дальнейшие действия</a></h2> - -<p>Если вы решили использовать rspamd для обработки вашей почты, -то лучшим источником информации будет являться документация к rspamd, -а также примеры lua плагинов: etc/plugins/lua. -Целью же данной статьи является ознакомление с основными приемами по установке, -конфигурированию и обучению rspamd, -а также описание преимуществ rspamd по сравнению с SA. -Если на любом этапе работы с rspamd у вас возникает проблема, -то можно о ней сообщить мне: <b>vsevolod@highsecure.ru</b> или же в список рассылки rspamd на sourceforge (англоговорящий): <b>rspamd-devel@lists.sourceforge.net</b>. -Сама система rspamd находится в состоянии бета-версии, -поэтому ваша помощь в тестировании и запросы функциональности будут неоценимы в развитии rspamd.</p> - -<!-- end doc --> - -</body></html> diff --git a/doc/why-rspamd.pod b/doc/why-rspamd.pod deleted file mode 100644 index 0b2c71cb8..000000000 --- a/doc/why-rspamd.pod +++ /dev/null @@ -1,333 +0,0 @@ -=encoding utf8 - -=head1 Фильтрация спама при помощи системы rspamd. - -=head2 1. История и предпосылки создания. - -Мы долгое время использовали для фильтрации спама spamassassin, однако, при -наших объемах почтового трафика (9-10 миллионов писем в сутки) spamassassin -не обеспечивал достаточной производительности. После анализа исходного кода и -принципов работы было выявлены следующие "врожденные" проблемы SA: - -=over - -=item * -обработка письма осуществляется набором регулярных выражений, однако, -количество этих выражений слишком велико и является ключевым моментом -задумчивости SA (например, для извлечения received заголовков письма, SA -проверяет оные на соответствие всем ему известным MTA, очевидно, что такое -действие не является оптимальным); - -=item * -нет возможности явно получить ip адрес, с которого нам отправили письмо (в SA -это делается парсом received заголовков, что я лично не считаю правильным, а тем -более оптимальным способом, так как MTA всегда знает, откуда ему пришло данное -письмо) - -=item * -нет возможности передачи спам фильтру данных SMTP диалога - -=item * -MIME парсинг писем очень медленный, так как опять же сделан на базе регулярных -выражений - -=back - -В итоге можно сказать, что основная проблема SA - это излишняя увлеченность -авторов регулярными выражениями и отсутствие оптимизации. В итоге, в качестве -базовых принципов создания rspamd были принципы оптимизации времени обработки -писем, в числе которых: - -=over - -=item * -полностью асинхронная работа с сетью (на базе libevent), в том числе DNS запросы -и работа с http - -=item * -быстрые механизмы выделения памяти - -=item * -компиляция всех регулярных выражений и вызов только тех из них, которые наиболее -возможны (то есть, имеется механизм ведения статистики срабатывания различных -правил, и при обработке следующего письма учитывается обработка предыдущих, что -позволяет максимально быстро провести основные тесты) - -=item * -расширяемая архитектура: возможность написания плагинов на си, lua, возможность -добавления новых типов фильтров, расширений протокола rspamc, возможность -добавления новых типов статистических алгоритмов, алгоритмов нормализации и -парсинга текстов - -=item * -возможность динамической загрузки различных настроек, списков ip адресов и -прочей информации через HTTP протокол с поддержкой даты модификации таких -списков - -=item * -использование везде, где возможно, специализированных конечных автоматов для -разбора и анализа текстов - -=item * -использование быстрого mime парсера gmime - -=back - -В результате перехода с SA на rspamd последний показал в среднем в 10 раз более -быструю обработку сообщений. В данный момент rspamd имеет статус бета версии, но -вполне пригоден для работы. - -=head2 2. Установка и настройка rspamd - -Для сборки rspamd вам потребуются: - -=over - -=item * libevent -L<http://www.monkey.org/~provos/libevent/> - библиотека для асинхронной -обработки событий - -=item * glib -L<http://library.gnome.org/devel/glib/> - библиотека общего назначения, -содержащая многие вещи, о которых разработчики libc, увы, забыли (glib не -является графической библиотекой, хотя и используется, например, gtk) - -=item * gmime -L<http://spruce.sourceforge.net/gmime/> - MIME парсер на базе библиотеки glib - -=item * lua -L<http://www.lua.org/> - встраиваемый скриптовый язык (в принципе, наличие lua -необязательно, но без lua многий функционал rspamd останется нереализованным) - -=item * perl -L<http://www.perl.org/> - на перле написан, например, консольный клиент rspamc, -распознаватель редиректов в URL'ях, поэтому наличие перла в системе крайне -желательно - -=item * cmake -L<http://www.cmake.org/> - система сборки, которая позволяет rspamd собираться -(по крайней мере, в теории) на всех Posix совместимых системах. Использовать -стандартные в данной ситуации autotools я не стал, так как считаю их самой -неудобной в использовании системой сборки исходников, которую можно только -придумать. - -=item * mercurial -L<http://mercurial.selenic.com/> - система управления версиями (SCM), -используемая для разработки rspamd. Так как в настоящее время rspamd находится в -состоянии бета-версии, то релизы выходят нечасто и зачастую являются менее -стабильными, чем текущая версия в репозитории, поэтому для установки rspamd -лучше использовать версию непосредственно из репозитория. - -=back - -После установки всех требуемых программ и библиотек можно приступить -непосредственно к установке rspamd. - -=over - -=item 1 -скачиваем текущее состояние репозитория: $ hg clone http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd - -=item 2 -конфигурируем rspamd: $ cd rspamd && cmake . -(при необходимости изменить параметры можно вначале воспользоваться командой -ccmake .) - -=item 3 -собираем: $ make - -=item 4 -устанавливаем: # make install - -=back - -=head3 Конфигурирование - -В процессе установки ставятся конфигурационные файлы по умолчанию в каталог -{PREFIX}/etc. При этом, в каталог etc/rspamd устанавливаются правила по -умолчанию (headers, html, drugs, loto и.т.п.), а в каталог -etc/rspamd.conf.sample устанавливается конфигурационный файл по умолчанию. Его -можно скопировать в файл etc/rspamd.conf и отредактировать в соответствии с -собственными предпочтениями. Конфигурационный файл по умолчанию снабжен -комментариями к каждой директиве, а также подробно описан в документации к -rspamd, находящейся в каталоге исходников doc/rspamd.pdf. В данном же -руководстве подробно изложен принцип работы rspamd и настройки всех модулей -системы. Для базовой работы достаточно исправить пути к файлам логов, пидфайлу, -а также обратить внимание на разделы factors и classifiers. Остановлюсь на этом -несколько подробнее. - -Все директивы rspamd имеют формат param = value; где символ ';' является -признаком окончания директивы. Также файл разбит на секции, каждая секция имеет -имя (например worker {}) и внутренние директвы внутри фигурных скобок. После -каждой секции также обязателен символ ';'. Также каждый модуль имеет особый -формат секции: - -=begin html - -<pre> -.module 'name' { - param = value; -}; -</pre> - -=end html - -Все это может показаться сложным на первый взгляд, но это позволяет лучше -структурировать файл и облегчает расширяемость rspamd. Для первоначальной -настройки достаточно обратить внимание на раздел factors, который описывает веса -различных правил, раздел metric, который описывает максимальный вес, чтобы -письмо считалось спамом, а также на раздел classifiers. Раздел classifiers -обеспечивает работу статистических алгоритмов. В rspamd в настоящее время -реализован алгоритм winnow, который работает следующим образом: - -=over - -=item 1 -текст разбивается на слова, также выделяется окно в пять слов - -=item 2 -окно перемещается по словам, при этом выделяются словосочетания по определенному -алгоритму и вычисляется их хеш - -=item 3 -каждый полученный таким образом хеш проверяется в файле статистики, в котором -хранятся хеши и их веса, если хеш найден, то его вес добавляется к суммарному -весу данного файла - -=item 4 -файл, набравший в сумме больше веса считается классом письма - -=back - -Основная идея такого подхода в определении по словосочетаниям, к какому классу -принадлежит данное письмо. В SA для этой цели используется вероятностный -алгоритм bayes, который достаточно похож на вышеописанный, но считает не веса, а -вероятности. Эффективность каждого из алгоритмов примерно одинакова и зависит в -основном от эффективности обучения. Однако, в отличие от SA, rspamd использует -не отдельные слова, а словосочетания, что повышает его эффективность. В секции -classifiers можно установить различные классы писем, а далее в секции factors -указать их вес (задав, например, для заведомо безвредных писем - ham - -отрицательный вес). Размер файлов статистики должен быть разумно большим для -хранения как можно большего числа хешей. Однако, необходимо учитывать, что эти -файлы целиком загружаются в память (хотя, реализация отображения файла в памяти -в различных ОС допускает загрузку и выгрузку страниц этого файла в своп системы, -но эффективность этого довольно низка), поэтому необходимо соизмерять размер -оперативной памяти и файлов статистики. - -=head2 4. Подключение и проверка работоспособности rspamd - -Для проверки работы системы rspamd проще всего воспользоваться командой rspamc: - -=begin html - -<pre> -hostname:~> rspamc stat -Do rspamc command stat -Messages scanned: 1234040 -Messages learned: 59151 -Connections count: 1176623 -Control connections count: 59152 -Pools allocated: 2530714 -Pools freed: 2530699 -Bytes allocated: 66991793394 -Memory chunks allocated: 6453232 -Shared chunks allocated: 3 -Chunks freed: 6453090 -Oversized chunks: 468849 -Statfile: WINNOW_HAM (version 69); length: 100.0 MB; free blocks: 4563488; total blocks: 6553581; free: 69.63% -Statfile: WINNOW_SPAM (version 36383); length: 100.0 MB; free blocks: 760504; total blocks: 6553581; free: 11.60% -</pre> - -=end html - -В данном случае выводится общая статистика. Такого же эффекта можно достигнуть -командой telnet на порт процесса controller (он описан в конфигурационном файле -в секции worker, type у которого controller). По умолчанию это порт 11334 на -адресе 127.0.0.1. Работу правил и статистики можно также проверить по команде -rspamc: - -=begin html - -<pre> -~> rspamc symbols /tmp/mailman.eml -Processing /tmp/mailman.eml -Process file: /tmp/mailman.eml -Sending 4950 bytes... -RSPAMD/1.1 0 OK -Metric: default; False; -3.35 / 10.00 / 0.00 -Symbol: WINNOW_HAM; 5.00 -Symbol: RECEIVED_RBL; pbl.spamhaus.org,insecure-bl.rambler.ru -Urls: -</pre> - -=end html - -В данном случае показываются баллы, набранные письмом, а также дополнительная -информация. Подробнее о протоколе rspamc в документации (doc/rspamd.pdf). Для -подключения rspamd к MTA лучше всего использовать milter, если ваш MTA postfix -или sendmail. В качестве milter'а можно использовать, например, rmilter: -L<https://www.milter.org/milter/71/>. О настройке postfix + rmilter мной была -написана следующая заметка: L<http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html> -Для MTA exim можно воспользоваться файлом local_scan.c в каталоге contrib/exim. -Инструкции по его установке описаны в самом файле, однако, это требует -пересборки MTA. Также rspamd "понимает" протокол SA, поэтому для подключения -rspamd можно использовать те же средства, что и для подключения к MTA SA. - -Подробнее о командах rspamc и протоколе rspamc написано опять же в документации. - -=head2 5. Обучение rspamd - -Процесс обучения важен для корректной работы статистики. Для обучения -используется команда rspamc learn. Для указания файла (класса) письма -используется ключ -s. Пример использования: - -=begin html - -<pre> -~> rspamc -s WINNOW_HAM learn /tmp/mailman.eml -Processing /tmp/mailman.eml -Process file: /tmp/mailman.eml -Do rspamc command learn -Sending 4950 bytes... -Learn succeed. Sum weight: 128.48 -</pre> - -=end html - -В качестве параметров можно указывать несколько файлов, целые каталоги, а также -imap папки: - -=begin html - -<pre> -~> rspamc -s WINNOW_SPAM learn imaps:user:cebka:password::host:somehost.rambler.ru:mbox:abuse.spam -Processing imaps:user:cebka:password::host:mailsupport.rambler.ru:mbox:abuse.spam -Enter IMAP password: -Process imap: host: somehost.rambler.ru, mbox: abuse.spam -Do rspamc command learn -Sending 382650 bytes... -Learn succeed. Sum weight: 1850.24 -<skipped> -</pre> - -=end html - -При обучении необходимо учитывать, чтобы количество spam и ham писем было -примерно равным. Вес показывает суммарный вес словосочетаний текста, который был -до обучения данным письмом (то есть, то, насколько велика вероятность -принадлежности данного письма к этому классу). При обнаружении неверных -срабатываний статистики можно несколько раз применить learn к заданному письму, -проверяя его суммарный вес. - -=head2 6. Поддержка и дальнейшие действия - -Если вы решили использовать rspamd для обработки вашей почты, то лучшим -источником информации будет являться документация к rspamd, а также примеры lua -плагинов: etc/plugins/lua. Целью же данной статьи является ознакомление с -основными приемами по установке, конфигурированию и обучению rspamd, а также -описание преимуществ rspamd по сравнению с SA. Если на любом этапе работы с -rspamd у вас возникает проблема, то можно о ней сообщить мне: -B<vsevolod@highsecure.ru> или же в список рассылки rspamd на sourceforge -(англоговорящий): B<rspamd-devel@lists.sourceforge.net>. Сама система -rspamd находится в состоянии бета-версии, поэтому ваша помощь в тестировании и -запросы функциональности будут неоценимы в развитии rspamd. diff --git a/doc/why-rspamd.txt b/doc/why-rspamd.txt deleted file mode 100644 index dd0b09637..000000000 --- a/doc/why-rspamd.txt +++ /dev/null @@ -1,240 +0,0 @@ -Фильтрация спама при помощи системы rspamd. - 1. История и предпосылки создания. - Мы долгое время использовали для фильтрации спама spamassassin, однако, при - наших объемах почтового трафика (9-10 миллионов писем в сутки) spamassassin - не обеспечивал достаточной производительности. После анализа исходного кода - и принципов работы было выявлены следующие "врожденные" проблемы SA: - - * обработка письма осуществляется набором регулярных выражений, однако, - количество этих выражений слишком велико и является ключевым моментом - задумчивости SA (например, для извлечения received заголовков письма, SA - проверяет оные на соответствие всем ему известным MTA, очевидно, что - такое действие не является оптимальным); - - * нет возможности явно получить ip адрес, с которого нам отправили письмо - (в SA это делается парсом received заголовков, что я лично не считаю - правильным, а тем более оптимальным способом, так как MTA всегда знает, - откуда ему пришло данное письмо) - - * нет возможности передачи спам фильтру данных SMTP диалога - - * MIME парсинг писем очень медленный, так как опять же сделан на базе - регулярных выражений - - В итоге можно сказать, что основная проблема SA - это излишняя увлеченность - авторов регулярными выражениями и отсутствие оптимизации. В итоге, в - качестве базовых принципов создания rspamd были принципы оптимизации времени - обработки писем, в числе которых: - - * полностью асинхронная работа с сетью (на базе libevent), в том числе DNS - запросы и работа с http - - * быстрые механизмы выделения памяти - - * компиляция всех регулярных выражений и вызов только тех из них, которые - наиболее возможны (то есть, имеется механизм ведения статистики - срабатывания различных правил, и при обработке следующего письма - учитывается обработка предыдущих, что позволяет максимально быстро - провести основные тесты) - - * расширяемая архитектура: возможность написания плагинов на си, lua, - возможность добавления новых типов фильтров, расширений протокола - rspamc, возможность добавления новых типов статистических алгоритмов, - алгоритмов нормализации и парсинга текстов - - * возможность динамической загрузки различных настроек, списков ip адресов - и прочей информации через HTTP протокол с поддержкой даты модификации - таких списков - - * использование везде, где возможно, специализированных конечных автоматов - для разбора и анализа текстов - - * использование быстрого mime парсера gmime - - В результате перехода с SA на rspamd последний показал в среднем в 10 раз - более быструю обработку сообщений. В данный момент rspamd имеет статус бета - версии, но вполне пригоден для работы. - - 2. Установка и настройка rspamd - Для сборки rspamd вам потребуются: - - libevent <http://www.monkey.org/~provos/libevent/> - библиотека для - асинхронной обработки событий - glib <http://library.gnome.org/devel/glib/> - библиотека общего назначения, - содержащая многие вещи, о которых разработчики libc, увы, забыли (glib не - является графической библиотекой, хотя и используется, например, gtk) - gmime <http://spruce.sourceforge.net/gmime/> - MIME парсер на базе - библиотеки glib - lua <http://www.lua.org/> - встраиваемый скриптовый язык (в принципе, - наличие lua необязательно, но без lua многий функционал rspamd останется - нереализованным) - perl <http://www.perl.org/> - на перле написан, например, консольный клиент - rspamc, распознаватель редиректов в URL'ях, поэтому наличие перла в системе - крайне желательно - cmake <http://www.cmake.org/> - система сборки, которая позволяет rspamd - собираться (по крайней мере, в теории) на всех Posix совместимых системах. - Использовать стандартные в данной ситуации autotools я не стал, так как - считаю их самой неудобной в использовании системой сборки исходников, - которую можно только придумать. - mercurial <http://mercurial.selenic.com/> - система управления версиями - (SCM), используемая для разработки rspamd. Так как в настоящее время rspamd - находится в состоянии бета-версии, то релизы выходят нечасто и зачастую - являются менее стабильными, чем текущая версия в репозитории, поэтому для - установки rspamd лучше использовать версию непосредственно из репозитория. - - После установки всех требуемых программ и библиотек можно приступить - непосредственно к установке rspamd. - - 1) скачиваем текущее состояние репозитория: $ hg clone - http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd - 2) конфигурируем rspamd: $ cd rspamd && cmake . (при необходимости изменить - параметры можно вначале воспользоваться командой ccmake .) - 3) собираем: $ make - 4) устанавливаем: # make install - - Конфигурирование - В процессе установки ставятся конфигурационные файлы по умолчанию в каталог - {PREFIX}/etc. При этом, в каталог etc/rspamd устанавливаются правила по - умолчанию (headers, html, drugs, loto и.т.п.), а в каталог - etc/rspamd.conf.sample устанавливается конфигурационный файл по умолчанию. - Его можно скопировать в файл etc/rspamd.conf и отредактировать в - соответствии с собственными предпочтениями. Конфигурационный файл по - умолчанию снабжен комментариями к каждой директиве, а также подробно описан - в документации к rspamd, находящейся в каталоге исходников doc/rspamd.pdf. В - данном же руководстве подробно изложен принцип работы rspamd и настройки - всех модулей системы. Для базовой работы достаточно исправить пути к файлам - логов, пидфайлу, а также обратить внимание на разделы factors и classifiers. - Остановлюсь на этом несколько подробнее. - - Все директивы rspamd имеют формат param = value; где символ ';' является - признаком окончания директивы. Также файл разбит на секции, каждая секция - имеет имя (например worker {}) и внутренние директвы внутри фигурных скобок. - После каждой секции также обязателен символ ';'. Также каждый модуль имеет - особый формат секции: - -.module 'name' { - param = value; -}; - Все это может показаться сложным на первый взгляд, но это позволяет лучше - структурировать файл и облегчает расширяемость rspamd. Для первоначальной - настройки достаточно обратить внимание на раздел factors, который описывает - веса различных правил, раздел metric, который описывает максимальный вес, - чтобы письмо считалось спамом, а также на раздел classifiers. Раздел - classifiers обеспечивает работу статистических алгоритмов. В rspamd в - настоящее время реализован алгоритм winnow, который работает следующим - образом: - - 1) текст разбивается на слова, также выделяется окно в пять слов - 2) окно перемещается по словам, при этом выделяются словосочетания по - определенному алгоритму и вычисляется их хеш - 3) каждый полученный таким образом хеш проверяется в файле статистики, в - котором хранятся хеши и их веса, если хеш найден, то его вес добавляется к - суммарному весу данного файла - 4) файл, набравший в сумме больше веса считается классом письма - - Основная идея такого подхода в определении по словосочетаниям, к какому - классу принадлежит данное письмо. В SA для этой цели используется - вероятностный алгоритм bayes, который достаточно похож на вышеописанный, но - считает не веса, а вероятности. Эффективность каждого из алгоритмов примерно - одинакова и зависит в основном от эффективности обучения. Однако, в отличие - от SA, rspamd использует не отдельные слова, а словосочетания, что повышает - его эффективность. В секции classifiers можно установить различные классы - писем, а далее в секции factors указать их вес (задав, например, для - заведомо безвредных писем - ham - отрицательный вес). Размер файлов - статистики должен быть разумно большим для хранения как можно большего числа - хешей. Однако, необходимо учитывать, что эти файлы целиком загружаются в - память (хотя, реализация отображения файла в памяти в различных ОС допускает - загрузку и выгрузку страниц этого файла в своп системы, но эффективность - этого довольно низка), поэтому необходимо соизмерять размер оперативной - памяти и файлов статистики. - - 4. Подключение и проверка работоспособности rspamd - Для проверки работы системы rspamd проще всего воспользоваться командой - rspamc: - -hostname:~> rspamc stat -Do rspamc command stat -Messages scanned: 1234040 -Messages learned: 59151 -Connections count: 1176623 -Control connections count: 59152 -Pools allocated: 2530714 -Pools freed: 2530699 -Bytes allocated: 66991793394 -Memory chunks allocated: 6453232 -Shared chunks allocated: 3 -Chunks freed: 6453090 -Oversized chunks: 468849 -Statfile: WINNOW_HAM (version 69); length: 100.0 MB; free blocks: 4563488; total blocks: 6553581; free: 69.63% -Statfile: WINNOW_SPAM (version 36383); length: 100.0 MB; free blocks: 760504; total blocks: 6553581; free: 11.60% - В данном случае выводится общая статистика. Такого же эффекта можно - достигнуть командой telnet на порт процесса controller (он описан в - конфигурационном файле в секции worker, type у которого controller). По - умолчанию это порт 11334 на адресе 127.0.0.1. Работу правил и статистики - можно также проверить по команде rspamc: - -~> rspamc symbols /tmp/mailman.eml -Processing /tmp/mailman.eml -Process file: /tmp/mailman.eml -Sending 4950 bytes... -RSPAMD/1.1 0 OK -Metric: default; False; -3.35 / 10.00 / 0.00 -Symbol: WINNOW_HAM; 5.00 -Symbol: RECEIVED_RBL; pbl.spamhaus.org,insecure-bl.rambler.ru -Urls: - В данном случае показываются баллы, набранные письмом, а также - дополнительная информация. Подробнее о протоколе rspamc в документации - (doc/rspamd.pdf). Для подключения rspamd к MTA лучше всего использовать - milter, если ваш MTA postfix или sendmail. В качестве milter'а можно - использовать, например, rmilter: <https://www.milter.org/milter/71/>. О - настройке postfix + rmilter мной была написана следующая заметка: - <http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html> Для MTA exim - можно воспользоваться файлом local_scan.c в каталоге contrib/exim. - Инструкции по его установке описаны в самом файле, однако, это требует - пересборки MTA. Также rspamd "понимает" протокол SA, поэтому для подключения - rspamd можно использовать те же средства, что и для подключения к MTA SA. - - Подробнее о командах rspamc и протоколе rspamc написано опять же в - документации. - - 5. Обучение rspamd - Процесс обучения важен для корректной работы статистики. Для обучения - используется команда rspamc learn. Для указания файла (класса) письма - используется ключ -s. Пример использования: - -~> rspamc -s WINNOW_HAM learn /tmp/mailman.eml -Processing /tmp/mailman.eml -Process file: /tmp/mailman.eml -Do rspamc command learn -Sending 4950 bytes... -Learn succeed. Sum weight: 128.48 - В качестве параметров можно указывать несколько файлов, целые каталоги, а - также imap папки: - -~> rspamc -s WINNOW_SPAM learn imaps:user:cebka:password::host:somehost.rambler.ru:mbox:abuse.spam -Processing imaps:user:cebka:password::host:mailsupport.rambler.ru:mbox:abuse.spam -Enter IMAP password: -Process imap: host: somehost.rambler.ru, mbox: abuse.spam -Do rspamc command learn -Sending 382650 bytes... -Learn succeed. Sum weight: 1850.24 -<skipped> - При обучении необходимо учитывать, чтобы количество spam и ham писем было - примерно равным. Вес показывает суммарный вес словосочетаний текста, который - был до обучения данным письмом (то есть, то, насколько велика вероятность - принадлежности данного письма к этому классу). При обнаружении неверных - срабатываний статистики можно несколько раз применить learn к заданному - письму, проверяя его суммарный вес. - - 6. Поддержка и дальнейшие действия - Если вы решили использовать rspamd для обработки вашей почты, то лучшим - источником информации будет являться документация к rspamd, а также примеры - lua плагинов: etc/plugins/lua. Целью же данной статьи является ознакомление - с основными приемами по установке, конфигурированию и обучению rspamd, а - также описание преимуществ rspamd по сравнению с SA. Если на любом этапе - работы с rspamd у вас возникает проблема, то можно о ней сообщить мне: - <mailto:vsevolod@highsecure.ru> или же в список рассылки rspamd на - sourceforge (англоговорящий): <mailto:rspamd-devel@lists.sourceforge.net>. - Сама система rspamd находится в состоянии бета-версии, поэтому ваша помощь в - тестировании и запросы функциональности будут неоценимы в развитии rspamd. - |