Криптографическая защита информации домашнего компьютера от несанкционированного доступа при работе в сети internet

Криптографическая защита информации домашнего компьютера от несанкционированного доступа при работе в сети internet: принципы разработки собственных программ

Почуев Сергей Иванович

Введение

“Как защитить конфиденциальные данные, хранящиеся на несъемных носителях информации моего персонального компьютера (например, письма к любимой девушке, адреса, домашнюю бухгалтерию, фотоальбом и т.п.), от посторонних глаз?” Этот вопрос все чаще задают себе т.н. “продвинутые” пользователи сети INTERNET, отчетливо понимая, что любые способы защиты, кроме исключения непосредственного физического контакта компьютера с сетью, не дают 100 % гарантии...

В настоящее время, в соответствии с действующим российским законодательством в области информации, гражданам РФ доступны для свободного приобретения и легитимного применения в личных целях компьютерные программы защиты информации, не имеющие официально установленного государственного грифа секретности. Ввиду многочисленности их легко можно “скачать” в сети, купить на СD, позаимствовать у друзей, самостоятельно разработать и т.п. Ряд программ защиты информации штатно входят в состав средств операционной системы (ОС) домашнего компьютера.

Вместе с тем известно, что любая “чужая” и тем более не сертифицированная “публичная” программа такого класса, применяемая Вами в виде исполняемого модуля, является “черным ящиком”. Это может таить в себе неприятные неожиданности, несмотря на возможную широкую рекламу и искренние заверения авторов, в том числе зарубежных, в эффективности и безопасности распространяемого ими программного продукта… Поэтому у людей, знакомых с основами программирования, возникает искушение написать собственную программу для защиты информации - простую, надежную, прозрачную для себя и недоступную для посторонних.

Некоторым принципам создания подобных программ посвящен настоящий очерк.

Принципы создания программ кодирования

Очевидно, что одним из наиболее действенных способов защиты информации является ее хранение в закодированном виде. Допускаю, что читатель, в отличие от автора данного очерка, является криптографом, поэтому все последующие рассуждения могут показаться ему наивными или давно и хорошо известными... Однако большинство людей, пользующихся INTERNET (в том числе и хакеров), все-таки не являются профессионалами в области шифрования, поэтому нижеизложенные принципы разработки личных криптографических программ зашиты информации, как мне кажется, позволяют самостоятельно создавать достаточно эффективные (по крайней мере, против любопытствующих сетевых дилетантов!) программные продукты.

По мнению автора, эффективное кодирование/декодирование информации может осуществляться, штатными средствами операционной системы Windows любых версий, установленной на большинстве домашних персональных компьютеров. Такими средствами являются встроенные в операционную систему датчики псевдослучайных (RND) чисел.

Рассмотрим принципы шифрования информации с использованием RND датчика на примере файла часто используемого *.rtf формата (международная ASCII кодировка алфавита из 256 символов, имеющих собственные уникальные номера).

1). Автором предлагаются два базовых подхода (для каждой конкретной программы, в зависимости от фантазии и опыта разработчика-программиста, возможны любые их ad hoc модификации и комбинации, вплоть до “вкрапления“ алгоритма быстрого преобразования Фурье и.т. п.) к кодированию/декодированию информации:

псевдослучайное (с помощью RND датчика) изменение значений символов исходного файла на фиксированных позициях; 

псевдослучайное (с помощью RND датчика) изменение позиций символов исходного файла без изменения их значений. 

В первом случае, например, исходный символ “Х”, находящийся на i-той позиции кодируемого файла, становится символом “Y” (или любым другим из 256 возможных, за счет псевдослучайного приращения значения ASCII кода) на той же позиции.

Во втором случае, меняются местами символы “X” и “Y”, находящиеся соответственно на i-той и на j-той псевдослучайных позициях в пределах кодируемого файла.

Как было отмечено ранее, при разработке конкретного алгоритма оба подхода или любые их разновидности могут использоваться в различной последовательности и, в принципе, неограниченное число раз для повышения криптостойкости кодирования.

2). Ключом для раскрытия закодированной информации в рассматриваемом случае является знание начальных значений использованных псевдослучайных последовательностей, автоматически сгенерированных ОС Windows и изменивших значения и месторасположение символов исходного файла. Тогда для расшифровки файла достаточно восстановить результирующую последовательность псевдослучайных чисел (совокупность нескольких детерминированных последовательностей с псевдослучайными начальными значениями) и просто повторить ее в обратном порядке.

Начальные значения для каждой из использованных последовательностей могут формироваться на основе задания и запоминания пользователем ключевого слова-пароля. При этом пароль в компьютере, в программе кодирования и в создаваемых ею файлах не хранится!

Например, задав (и запомнив!!!) с клавиатуры компьютера пароль из 6-ти символов, мы получаем 18-ти значное (как максимум) или 6-ти значное (как минимум) целое число в строковом представлении: каждому символу пароля соответствует в ASCII кодировке 3-х значное (как максимум) или однозначное (как минимум) целое число. Затем на основе данного целого числа формируется начальное значение (первое число) псевдослучайной RND последовательности. Последующие числа данной последовательности автоматически генерируются ОС Windows по некоторому детерминированному алгоритму (не важно, по какому именно!) на основе предыдущего значения. 

Оценка потенциальной криптостойкости

Как следует из вышеизложенного, для “лобового” (путем перебора всех возможных вариантов) вскрытия пароля, при наличии у взломщика созданной Вами программы кодирования, ему необходимо перебрать P = (L ^ N) ^ M комбинаций. Здесь: L - объем алфавита клавиатуры компьютера; N - длина пароля; M - число псевдослучайных последовательностей, использованных при кодировании; ^ - знак возведения в степень.

Даже в простейшем случае, когда L=256 (используется стандартный набор символов клавиатуры компьютера), N=6 (задан пароль из 6 символов для определения начального значения каждой из псевдослучайных последовательностей), М=2 (для кодирования использованы лишь 2 псевдослучайные последовательности) число возможных комбинаций Р составляет ~ 10 ^ 29! Если предположить, что для “лобового” взлома закодированного соответствующей программой файла используется не существующий в природе суперкомпьютер, позволяющий провести обработку одной комбинации (декодирование файла средних {~100 Кб} размеров и проверку результата за 1 ^ -12 сек.), то для перебора всех возможных комбинаций потребуется ~ 1 миллиарда лет!

Предположим теперь, что злоумышленнику полностью известен алгоритм работы Вашей программы кодирования. Он точно знает (хотя не тут-то было, ведь программа то эксклюзивная - лично Ваша и хранится, например, на съемном носителе информации в виде *.exe файла!) число, последовательность, авторские особенности и уникальные модификации описанных способов кодирования. Поэтому хакер предпринимает более хитроумную попытку - не “уродуясь” с лобовым взломом пароля непосредственно подобрать последовательность необходимых ключевых чисел в течение приемлемого времени, используя свойство псевдослучайности начальных значений RND последовательностей.

Поясним данное свойство. Дело в том, что количество генерируемых ОС Windows псевдослучайных чисел, используемых для задания начальных значений последовательностей на основе введенных паролей хотя и огромно, но конечно. Это теоретически является “слабым звеном” в предложенной цепи кодирования информации, т.к. число проверяемых комбинаций уменьшается и составляет P = R ^ M. Здесь: R - общее количество неповторяющихся псевдослучайных чисел, генерируемых операционной системой для задания начальных значений псевдослучайных RND последовательностей; М - число используемых в алгоритме последовательностей.

Однако если предположить, что число R, например, при использовании 6-ти символьного пароля превышает 10 ^ 6 (в этом, при желании, каждому нетрудно убедиться лично путем теоретической оценки или, написав простейшую программу и соответствующим образом протестировав встроенный в Windows датчик RND чисел методом статистических испытаний), то все равно необходимо проверить, как минимум, P = (10 ^ 6) ^ M возможных комбинаций. Иными словами, нужно одновременно подобрать последовательность из М конкретных псевдослучайных чисел, выбранных из конечного множества RND чисел, генерируемого ОС Windows при задании начальных значений на основе введенных паролей.

Для вышерассмотренного примера (при М=2) будет необходимо проверить как минимум 10 ^ 12 возможных комбинаций. Таким образом, для суперкомпьютера с быстродействием 10 ^ 10 операций в секунду (если такой имеется в наличии у взломщика!) при размере взламываемого файла ~100 Кб (пусть время выполнения декодирования для одной комбинации ~ 0.0001 сек.), потребное машинное время гарантировано превысит 300 лет! Вновь напомню, что применение данного способа взлома потребует детального знания злоумышленником авторского алгоритма кодирования, что на практике маловероятно. 

Принципы защиты e-mail

Очевидным приложением рассмотренного методического подхода к кодированию является его возможное применение для решения задачи обеспечения конфиденциальности личной электронной почты. Данная задача, безусловно, является существенно более сложной, чем задача защиты файлов собственного винчестера от несанкционированного сетевого просмотра. Детальное ее рассмотрение выходит за рамки настоящего очерка. Поэтому в иллюстративных целях ограничимся лишь описанием очевидных возможных схем защиты электронной корреспонденции.

В тривиальном случае Ваш корреспондент может просто использовать созданную Вами программу кодирования/декодирования, имея соответствующий идентичный *.exe модуль. При этом Вы должны предварительно передать ему свою программу и договориться об использовании общего пароля. Как мне кажется, для сферы личной переписки с друзьями это вполне приемлемый вариант!

В более сложном случае может быть использована разновидность схемы шифрования с открытым ключом. Реализация данной схемы потребует от Вас создания и передачи Вашему корреспонденту программы, которая будет автоматически шифровать вводимый им пароль по известному только Вам RND алгоритму и хитро маскировать пароль в кодируемом файле. Тогда, получив от корреспондента по E-MAIL зашифрованный файл, Вы сначала декодируйте произвольный пароль, использованный корреспондентом. Затем, расшифровав данный пароль, вы декодируете само информационное сообщение.

Недостатком данной схемы является теоретическая возможность вскрытия и использования хакером Вашего алгоритма шифрования пароля. Правда для реализации данной возможности злоумышленник будет вынужден: похитить *.exe файл с программой у Вашего корреспондента, восстановить исходный текст программы по исполняемому файлу (а это не просто!), понять использованный Вами алгоритм шифрования (а это тоже не просто!) и написать соответствующие программы декодирования. 

Заключение

В силу простоты и прозрачности изложенных принципов шифрования информации для защиты домашнего компьютера от несанкционированного доступа к конфиденциальным файлам, написание соответствующей личной программы кодирования/ декодирования является чисто технической процедурой и, как мне кажется, не представляет большой сложности для программирующего пользователя. Поэтому пример исходного текста подобной программы настоящем очерке не приводится. (За пару дней программист средней квалификации, используя изложенный методический подход и быструю среду проектирования типа DELPHI, VISUAL BASIC и т.п., в состоянии самостоятельно “сваять” собственную уникальную и вполне приличную по эффективности версию “шифровалки”!) Кроме того, любые конкретные алгоритмы и создаваемые на их основе программные продукты все же считаются авторским ноу–хау и могут представлять самостоятельную ценность...

Кстати, если Вы не поленитесь написать еще несколько вспомогательных строк программы кодирования, придающих дополнительный блеск Вашему “нетленному программному произведению” и изменяющих атрибуты создаваемого зашифрованного файла (например, делая его графическим или звуковым), то будущий сетевой взломщик Ваших “секретных” файлов будет “приятно” удивлен! При попытке открытия данных файлов с помощью обычных программ-редакторов (графических или звуковых) вместо вожделенной адресной книги, пикантного фотоальбома или номера кредитной карты с текущим балансом он услышит из динамиков компьютера Ваше “злобное шипение” или увидит на экране монитора произведение “абстрактной живописи”...

Что же касается эффективности предложенного методического подхода к созданию криптографических программ защиты информации для домашнего применения с использованием “подручных” средств ОС Windows, то автор настоящего очерка пребывает в состоянии понятной эйфории преуспевшего дилетанта (тестовые программы написаны, надежно работают с неплохим быстродействием, а закодированные файлы не взламываются известными ему средствами).

Справедливости ради необходимо отметить, что, скорее всего, существуют и более эффективные, чем рассмотренные выше, способы взлома файлов, зашифрованных с помощью предложенных принципов кодирования информации. О подобных способах декодирования, основанных на специализированных криптографических методах анализа, имеется достаточно много “туманных” и, по понятным причинам не раскрывающих сути декодирования, статей в INTERNET. Поэтому приведенные мной оценки криптостойкости могут оказаться, мягко говоря, оптимистичными (конечно, если за дело дешифрирования возьмется профессионал!), а предложенный подход к кодированию и создаваемые на его основе программы, по-видимому, требуют дополнительной оценки и тестирования специалистами. 

Приложение

Для тех, кого заинтересовали изложенные соображения (несмотря на то, что сама по себе идея применения RND датчика для кодирования не нова и не очень убедительно, но критиковалась в ряде публикаций) и у кого появилось желание лично убедиться в эффективности предложенных принципов шифрования далее приведен упрощенный (диапазон псевдослучайного приращения ASCII кодов уменьшен более чем в 30 раз против максимально возможного, а для кодирования использованы всего лишь две псевдослучайные последовательности!) наглядный пример результата работы одной из демонстрационных программ.

С помощью имени (которому соответствует начальное псевдослучайное число 0.7058184) и фамилии (которой соответствует начальное псевдослучайное число 0.5759676) автора в качестве пароля закодировано название очерка, который Вы, надеюсь, дочитали до конца. Название очерка дословно (с сохранением всех шрифтов, пунктуации и настроек) повторено в редакторе Word и сохранено в отдельном файле формата *.rtf. Далее этот файл целиком закодирован тестовой программой. 

ИСХОДНЫЙ RTF ФАЙЛ (текст с названием настоящего очерка)

{\rtf1\ansi\ansicpg1251\uc1 \deff0\deflang1049\deflangfe1049{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Arial;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}

{\f116\froman\fcharset238\fprq2 Arial CE;}{\f117\froman\fcharset204\fprq2 Arial Cyr;}{\f119\froman\fcharset161\fprq2 Arial Greek;}{\f120\froman\fcharset162\fprq2 Arial Tur;}

{\f121\froman\fcharset177\fprq2 Arial (Hebrew);}{\f122\froman\fcharset178\fprq2 Arial (Arabic);}{\f123\froman\fcharset186\fprq2 Arial Baltic;}{\f124\fswiss\fcharset238\fprq2 Arial CE;}

{\f125\fswiss\fcharset204\fprq2 Arial Cyr;}{\f127\fswiss\fcharset161\fprq2 Arial Greek;}{\f128\fswiss\fcharset162\fprq2 Arial Tur;}{\f129\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f130\fswiss\fcharset178\fprq2 Arial (Arabic);}

{\f131\fswiss\fcharset186\fprq2 Arial Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;

\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0

\fs24\lang1049\langfe1049\cgrid\langnp1049\langfenp1049 \snext0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs32\lang1049\langfe1049\kerning32\cgrid\langnp1049\langfenp1049

\sbasedon0 \snext0 heading 1;}{\*\cs10 \additive Default Paragraph Font;}}{\info

{\title \'ca\'d0\'c8\'cf\'d2\'ce\'c3\'d0\'c0\'d4\'c8\'d7\'c5\'d1\'ca\'c0\'df \'c7\'c0\'d9\'c8\'d2\'c0 \'c8\'cd\'d4\'ce\'d0\'cc\'c0\'d6\'c8\'c8 \'c4\'ce\'cc\'c0\'d8\'cd\'c5\'c3\'ce \'ca\'ce\'cc\'cf\'dc\'de\'d2\'c5\'d0\'c0 \'cf\'d0\'c8 \'d0\'c0\'c1\'ce\'d2

\'c5 \'c2 \'d1\'c5\'d2\'c8 INTERNET: \'ef\'f0\'e8\'ed\'f6\'e8\'ef\'fb \'f0\'e0\'e7\'f0\'e0\'e1\'ee\'f2\'ea\'e8 \'f1\'ee\'e1\'f1\'f2\'e2\'e5\'ed\'ed\'fb\'f5 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec}{\author Person}{\operator Person}

{\creatim\yr2004\mo4\dy3\hr11\min18}{\revtim\yr2004\mo4\dy3\hr11\min27}{\version1}{\edmins7}{\nofpages1}{\nofwords0}{\nofchars0}{\*\company Home}{\nofcharsws0}{\vern8249}}\paperw11906\paperh16838\margl1134\margr567\margt851\margb851

\deftab708\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1134\dgvorigin851\dghshow1\dgvshow1

\jexpand\viewkind1\viewscale75\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule \fet0\sectd \linex0\headery680\footery709\colsx708\endnhere\sectlinegrid360\sectdefaultcl {\*\pnseclvl1

\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5

\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang

{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s1\qc \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0

\b\f1\fs32\lang1049\langfe1049\kerning32\cgrid\langnp1049\langfenp1049 {\f117\fs28 \'ca\'d0\'c8\'cf\'d2\'ce\'c3\'d0\'c0\'d4\'c8\'d7\'c5\'d1\'ca\'c0\'df \'c7\'c0\'d9\'c8\'d2\'c0 \'c8\'cd\'d4\'ce\'d0\'cc\'c0\'d6\'c8\'c8 \'c4\'ce\'cc\'c0\'d8\'cd\'c5\'c3\'ce

\'ca\'ce\'cc\'cf\'dc\'de\'d2\'c5\'d0\'c0 \'cf\'d0\'c8 \'d0\'c0\'c1\'ce\'d2\'c5 \'c2 \'d1\'c5\'d2\'c8 }{\f0\fs28\lang1033\langfe1049\langnp1033 INTERNET}{\f0\fs28 : }{\f117\fs28 \'ef\'f0\'e8\'ed\'f6\'e8\'ef\'fb \'f0\'e0\'e7\'f0\'e0\'e1\'ee\'f2\'ea\'e8 \'f1

\'ee\'e1\'f1\'f2\'e2\'e5\'ed\'ed\'fb\'f5 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec}{\f0\fs28

\par }}

Результат кодирования исходного файла

VV'/d&x2&n5a3`Jck.^"rb^,p%Zk]4]a7`ceb_c[bi[1k$2mVZZ-bo`33,_$p*_0s]jmac":i]mY+`sd_mr/jdmkh,#gfjmn+W.ailepcmy,4`ap"1r.^xw,s]olf:t5pegWLV-Whi/sZlvbW&Xqa,b-%ab[1b`o_a4e+Xn2v6_fl``:w`Y"p+YV/3VrW{l+_-qumf/,b?c5/&n1%ZVaW-r1l3mvbfcZpa.cpZ]1,la[-hmy]_lvmtm]bladz..Zl@Bp`f&nl1mEms\ls^dZ`0bj_ldpSoc2hme_+%Zk.+_WolsYbYWs`#a`+{k+V&n`,n&$`-W[4N[\r%`3oiwY+Wo_pePl^anv1Zdeo+XWomme`k,`4Xq/la5loaankXaq_kpZX\.06X]kt^W&g_ccl^hnu5Za1g+Habj0__"bV__M,^pnih4n_.$b^o_qooqmd#slWd_Xc1l_do[k_/znd]ap`.oi?bnccfZ*+z&&mYm/^hVekXdjY_oiju4_-_q_Wbyem[*ccs_gL-d`]`p.1[Z,(4w$_cW.xW{VQl^i+a^Z&-5nnmWnVb[{_l_0_eXq+i_^_Zju%^_<0ebma\x_X-V,`qVrm\qnb{cg%m-_Wb(+1r-^1lg___h^YVgdp

!wWd.Z8omd-``pgr^/\`q2lbn.ookm5Vn0c2_i.pXmXi$l2ylm.#p5Y$/o7r_pa_-W-V2bVg_hb-XdXh`--\acz{uZYaY3GZck%cq[]abl"``0-4"2,j19/4_cnbqYld%do&d++fdgn,dYq0?4cb\k0a_-y5_aqV+^=X5^W_VqVonqh%q#]-c

V-X&YZY-9`ehl]WWl`692`nnWqheh0a{^{p0,[x_r0q_q fqbcb+cW]:g#]io\5W-_`."aocdbVso.mNogR_mClfkjZ3cuz\[d/\o+zoopg!_d1pv*h^dn\hn+[#n0-N[h/`.j+Wl5[$]0Z*i ]j\"o^c[k`_q`__o%|0Xd&ed_.YZmZiNoV__ff0d&`cZm_W2+Vc#cldh,>fW&YhZmrpt`Vix^i[caV[seVZXpa_aab0`*aXg$cYpik.Xl_w`Z$X-^84^_%olZ_pn4b1ho_0YkxWia_Xb03n"xaX\_&^mcfiqZ3Y5X+coaob]j[W*Ri0i`p_{+5caZV7b]h4,1h_ygY^06XYu__+b["V`&[+#Xhqz&WecX/`_]llejf_ek,1d+ob_d-fbb2-jldoo-d_1o$-Zob[`VlZ`\chbY-by-ldg^lWmih__fZXnc$+lW,5n_>6l1Z`{aa`V`0ddn//j_/qspmflbg.6Z$`-k[n+k0vpas_k`XIncsn_j3iV`-,jckb[XbphiYf|`/.W&[c1o_Vofl!cdrWg1d\n[_^Z1[+y[g^]2.bXa[V-ka0oXsmZhbbjZa

i9s1_dxm[40%n[5hi"mZYZ *17owkk.__uVpWibx\gk`dfa.3g 8X\^]lX-bYpn^_3og]Z_g,kna+W0XchV-polds24-!q""q`h%"d5nd0.o/V0r7x8dX!an%$ohiYdn.,#1d`g`)c[YYam+Z4Yh[,cbrZh\lcm1naPuhg.nn^t_^`3/`fg&^%r^fmj,dlk[an&W_VYmXh47^qZZn,-fi]j`p*.e]_q%k`YX[`.aaV/6opb5#[kYhlXZrsWj#noj8_bi-anm$.o

*zhca_BclX7xv^7f$am_+zooz]q`_o&qX0%o`%il4.&p0_Q*[i$saZ/bii$Cbm^jb/WV0YZV2j+[|XlZg0#[0Y^k&%jhg_!jbz_#Z5q[qe3!oL_w^4m+.jsjdb3/jj!$#dga,g]iq_7-qpduZannVm]VcncV]wx^^.Yl|`2bq^X`0Yb`s\kn#t,ajYpjorra"Yqd0]ca_#Zjj#_h-u-[Zqn^-,__ja XZ1ie3/Z+$`+0VW_q`jbdlW^^_Vu_j_=p^Ydue]Xs^binY_wr03c4eclkZq&{]_ab6Zk3]2h"d_:[ZXVYPhbnn3hdrl",[Z1W`drd7c#,kVhb0#t^WXVWVl,ao/7a`ne_nl/dc2,klXlb^b]ecY]#o$_!du[$^^bX/wjl5YxV#_doXn0-/#OY4d-`"c ._jZr@d,Zlaf^rdar3_m[V$gf/aqtu&[qhg-``]Z[^[Z_m+f_``Y`oZbj_mimq4bbWb1fb^dxcW\$_qlnen%`m_^,WZu`c!p#_r%/2dh_1ap[Zih*_{ig/![m[i.__cB*_cp`uBn#&nmkh-Z^Wr_pth-kwq0Z_YfYrakjc3iW|!j`lo`g-vf&Vh`wyhpV5`z`lml\doW7hY^e[jlc5e_-qcruot[ojmp1aahlh`+_`_nmq9^XY[0_`wmo_gW7n03zv+Z]`_aw$_,,hXjlqmW&Z/_6rj-r:`V^hbd!AZe[Vu_Y-uMjks4mmr/qdZ6agooa1,r,qjjWWmX.h^poC%xp `i6Y1Y^aot0oj,Wbm\`o_mn-hZV-1n-krYZ^lok[wkif_kbm`Xhcr_]jXhf,Wb#kVlVk_Zb*0/cY`_/-[/c#,ja4_nlCXVcaV_sbc`u$dYrpoj#p^lVbmm2d`2d^0_y^[#--Wqqjdp_Ziap]f3dV8&e.c[",e_WncZnpak.4V[h__a!6ebkj.k_Vmt]kxkahbj$b[Xe4lI_X2_u_j|soqpbl`1`jj]Vt^[jlc$`_dhwj---rXWmn,-w`[n_lqlmqYecmV]-sdkcXh0/0YVj0,]ZV0qtYV]l1pc`s],YndVi`[_blqf^%48`o.Zcb__gbf.taclbobc[`WXb"*`-*`mZa`43-no-r yqV_d[Z$n-gvud*o-i2V,mP^arXuWb"_oco``[Wb,q_arYmX`\[+Vp^-1)qa*l!d`uk*cdVnc0caWW_Xqr'11"/jd`0lv0L@Xk'maf_p2+'.h5Wih_^ty/kXmlg0-[i|glipclgpo+Wj`hh[_Yyejiij0[[_lm+0V`idi"x[a/%lwY_!izwd(scqlpox_kqcjJc__X_V_f&x".mqhibblm[2ac&akm`mHxcj._Y%``,sl_a7dnhoa`W$olcndqwplW`mud[bgnd]*_Yolsk&0zZo"_yX%nj.2p`p^-]_,_Y[,F2[__4uf1^bXZS^l3a3XMaV/sa3_kh!aZoW`v_Xl.b__c`Xa-2^q^b[ob%a_p0_$aqs-`2bO/srcZ.tV^W_ah^>4^^YbJsDhVqMi,b,la2niYi*2kdol.xXh_nts.*p`xw`[hZa-apq_X|`a7it.^XkmeX/0m`c_.oan-Qs1fnX`[j a#.o1W,i,_]pagg_lp\n`_-^#!gfrw]a6zz_y+&odnt/$ZvZ--\hj*[x^`^m`&_Lo40llck^c&k6/^..#$5Vk1b_1m_ww.alYxcnhl+rr-bVze/a\pq0WZnk67'{X%[aiV;`pck`h-^u]/efbVg[c67bk.br-czlfi4il`eXhaYoabdn^_bfj[6ol.e``n(V-s_-Z_lm[2$ccqadZX+2e0a_`@kcqlk/Zo!k`azp%2,Y0V"1V_qack[ZZ__.,w^q!Zp]spWmal,[!,]fa/bnZd`[$rnZV,ahncox_o7nc[0eov00_d!o[Wap&kd0dbzzZYfpXXp`_Zm$`bg[i85fm/Y_,nZ#[$0mfm+.n_dZ/jqacej^-1[zpou+r2bd%0f0n_+_]m13Xqj!`!j-ZZmZo0^d]wX/_rXp_mopA7\oY2Z-X.aff3X46nWXZcg_ltc-b#Wh^j|Vs/^oc^r6l]+oj_VVh7zb`VW9"_^/4k#/`kah$"z-_/6ki[]^t6b/zh%r`%Y`7"&4b [koo,!do%0,bm4a_5b(cjka_`bL^a`^Yp+pq%qYg__W_gYaa%$>bn#dbZ^cebXqVQ^n/r,kpq5Y"ht[cb$@c_Y``sZ.k2^%WkXYecankb^m+c_&i]L^:jXa,noq&djqYc,^[eig-&X[X*`pd]mWlaa_^\aa-W"b/.f.d0`4ph#cij%e[[1a+RnYbrdy

Z1_XipVc=`w.`Y`caPVNksV-c$8ca%r"/+^[a!pbf`zqrdgkrpX0_m]^d!pv,h!s[/cZ,&!|_X\mpp"[l/.[x-W\^tb`0_jd+bXkuWcjV1-^Z&"4l-``gXsqjm/8cw2i2.X[YiZhqq^3h!ff3plcmsy[r.dYqjs1X|abVl\maQq]d.dv`_i#_pboVhds/uoq&jlf