==Phrack Inc.== Volume 0x0b, Issue 0x3b, Phile #0x06 of 0x12 |=--------------=[ Defeating Forensic Analysis on Unix ]=----------------=| |=-----------------------------------------------------------------------=| |=-------------=[ the grugq ]=----------------=| |=--------------------[ www.anti-forensics.com ]=------------------------=| --[ 目次 1 - はじめに 1.1 - 一般的な UNIX ファイルシステム 1.2 - フォレンシック 2 - 対フォレンシック 3 - runefs 3.1 - 隠し領域の作成 3.2 - 隠し領域の使用 3.3 - TCT は ext2fs の実装を適切に行っていない 4 - Defiler のツールキット 4.1 - necrofile 4.1.1 - TCT は削除された inode を検出する 4.1.2 - necrofile は削除された inode を検出して初期化する 4.1.3 - TCT は存在しないデータを検出できない 4.2 - klismafile 4.2.1 - fls による削除されたディレクトリエントリの一覧 4.2.2 - klismafile による削除されたディレクトリエントリの初期化 4.2.3 - fls が存在しないデータを発見できないところ 5 - 総括 6 - Greets 7 - 参考情報 8 - 付録 A 8.1 - ext2fs 8.2 - runefs.tar.gz (uuencoded) 8.3 - tdt.tar.gz (uuencoded) --[ 1 - はじめに 対フォレンシック(anti-forensic): フォレンシック調査の有効性を低減す るために行なわれる証拠(evidence)の秘匿、秘匿 電子的フォレンシック分析(digital forensic analysis)は、急速にイン シデントレスポンスにとって欠くことのできない要素となりつつある。訓練を 受けたフォレンシック調査員が増加し、フォレンシック・ツールキットも利用 可能となる中で投資も順調に増加してきている。情報セキュリティ業界内でも フォレンシックに関する関心が高まってきており、注目を浴びてきているにも 関わらず、対フォレンシックに関しての議論は驚くほど少ない。この状況をい くばくかでも改善するため、この文書では UNIX ファイルシステムに対する電 子的フォレンシック解析から守るための対フォレンシック戦略について記述し ている。対フォレンシック戦略の実例として挙げているのは、Linux でもっと も一般的なファイルシステムである ext2fs である。 対フォレンシック戦略に関する一般的な議論を促進するためには、読者が 背景となる情報についてある程度知っておくことが鍵となる。特に対フォレン シックのためのファイルシステムのサニタイズ(浄化)について理解するために は、基本的な UNIX ファイルシステムの仕組みについて知っておくことが必要 である。また対フォレンシックの手法について理解するためには、少なくとも 電子的フォレンシック手法およびその実施について、基本的な概要は知ってお くことが必要である。本文書では UNIX ファイルシステムと電子的フォレンシッ クについての一部を説明しているに過ぎず、文書量の問題により、これらの点 について網羅的に説明することができない。興味を持った読者は、より細部に ついての解説が行なわれている参考情報を参照してほしい。 ----[ 1.1 - 一般的な UNIX ファイルシステム 本セクションでは、基本的な UNIX ファイルシステムの常識(特定の実装 に特化しないもの)について説明し、ファイルシステムを構成するのに内部的 に使われているメタデータの構造について議論する。なお、UNIX 系 OS のファ イルとは、任意の長さの連続するバイトストリームであり、I/O に用いられる 主たる枠組であるが、本文書ではディスク上に格納され、ファイルシステムに より構成されたデータという、より一般的な意味でのファイルに着目している。 UNIX ファイルシステムを構成するディスク上のデータは、通常ファイル の情報とファイル内のデータという 2 つのグループに分けられる。構成情報 およびアカウンティング情報(通常カーネルからのみアクセスできる)は「メタ データ」と呼ばれ、スーパーブロック、inode、ディレクトリファイルなどか らなる。ファイル内に格納された情報は、単に「データ」と呼ばれる。 ファイルの枠組を生成する際に、カーネルは、格納されるデータをハード ディスク上の複数のセクタに対して、連続するバイトストリームであるかのよ うに透過的に書き込んでいく必要がある。ファイルシステムは、セクタ群がファ イルを構成する組合せやその順番の情報を保持するために使われる。加えて、 各セクタの組合せが独立しており、個別に OS から認識することができるよう にしておく必要もある。これらの様々な機能を実現するため、幾つかのメタデー タが存在する。 ファイルの内容は、ハードディスクのセクタの論理的なクラスタであるデー タブロックに格納される。データブロックあたりのセクタ数が多いほどディス ク I/O の速度が高速になり、ファイルシステムのパフォーマンスが向上する。 一方、データブロックが大きくなればなるほど、ブロックの終端まで利用して いないファイルにより無駄に消費されるディスクの領域が増加する。現在のファ イルシステムにおけるブロックサイズは通常 4096 もしくは 8192 バイトといっ たあたりに落ち着いており、「フラグメント(ここでは扱わない)」によるディ スク領域の無駄と闘っている。データブロックに割り当てられたディスクの領 域は、配列の形に構造化されており、各ブロックは配列内のオフセットとして 参照される。あるブロックが解放中か、割当済かという状態は、「ブロックビッ トマップ」というビットマップに格納されている。 データブロックは inode 単位でクラスタ化され、ファイルとして構成さ れている。inode はユーザから見えるファイルを示すメタデータ構造体であり、 各ファイル毎に存在する。各 inode にはブロックへのポインタの配列(これは データブロック配列に対するインデックスである)とファイルに関する雑多な 情報が含まれている。ファイルに含まれる雑多な情報とは、UID、GID、サイズ、 パーミッション、最終更新/アクセス作成時刻、その他の情報である。inode で利用可能な空き領域が限られているため、ブロックへのポインタの配列に含 められるポインタの数には限りがある。ファイルのサイズを充分な大きさにで きるように、inode には「間接ブロック(indirect block)」という機能がある。 間接ブロックはブロックの配列を拡張し、追加のポインタを格納できるように する。二重三重の間接ブロックは、各々間接ブロックへのポインタおよび二重 間接ブロックへのポインタを格納する。inode は inode テーブルという配列 に格納され、0 から始まるインデックスにより参照される。ブロックが解放中 か、割当済かという inode の状態は、「inode ビットマップ」というビット マップに格納されている。 ファイルと inode はディレクトリファイルに格納されるディレクトリエ ントリと呼ばれる特殊な構造体によりファイル名とリンクされる。この構造体 はディレクトリファイル内に格納されている。ディレクトリエントリは基本的 に以下のような構造体である: struct dirent { int inode; short rec_size; short name_len; char file_name[NAME_LEN]; }; dirent 構造体の「inode」は、「file_name」に格納されているファイル 名にリンクされている inode 番号を格納する。領域を節約するため、ファイ ル名の実際の長さは「name_len」に格納され、file_name 配列の使われていな い部分は、次のディレクトリエントリの構造体によって使われる。dirent 構 造体のサイズは通常 2 の階乗に切り上げられ、「rec_size」に格納される。 ファイル名と inode とのリンクが削除された場合、inode の値は 0 となり、 1つ前の dirent 構造体の rec_size は削除された dirent を含むように拡大 される。このため、ディレクトリファイル内に削除されたファイル名が格納さ れたままになってしまうという問題がある。 あるファイル名が別のファイル名にリンクされる度に、inode 内のカウン タが増加していく。同様にリンクが削除される度にこのカウンタは減らされて いく。カウンタが 0 になった場合、ディレクトリ構造体からの、その inode に対する参照はなくなったことになり、ファイルは削除される。削除されたファ イルは、自身のリソース、データブロックや inode 自身を適切に解放する。 これはビットマップの情報を適切に変更することにより行なわれる。 ディレクトリファイル自身はルートディレクトリを起点としたツリー構造 に論理的に構成されている。ルートディレクトリファイルは、特定の inode (inode 2)に割り当てられており、これによりカーネルがその位置を特定し、 ファイルシステムをマウントすることが可能になる。 ファイルシステムをマウントするために、カーネルはメタデータのサイズ と位置を知る必要がある。メタデータの最初の部分、スーパーブロック (super-block)は特定の位置に格納される。スーパーブロックには inode やブ ロックの数、ブロックのサイズ、その他多くの情報が格納されている。スーパー ブロック内のデータに基づいて、カーネルは inode テーブルの位置やサイズ、 ディスク上のデータ領域を算出することが可能になる。 パフォーマンス上の理由により、現在のファイルシステムで inode テー ブルとブロックの配列を 1 つずつしか持たないということはありえない。 inode もブロックも幾つかのグループ単位でクラスタ化され、ディスク中に分 散している。こうしたグループには、通常自身の inode やブロックに関する ビットマップとともに、壊滅的なデータ破損が発生した際のリカバリを手助け するためにスーパーブロックのコピーが含まれている。 これで一般的な UNIX ファイルシステムについての簡単な説明を終える。 別の実装については付録 A: ext2fs で記述する。次のセクションでは、ファ イルシステムに対する電子的フォレンシックの概要について説明を行なってい く。 ----[ 1.2 - フォレンシック ファイルシステムに対する電子的フォレンシック分析は、何らかの目的で 証拠を収集するために行なわれる。すでに説明したように、この目的は以降の 説明に影響しない。対フォレンシックの手法は証拠の使用意図に左右されるよ うなものではなく、証拠が収集されることを妨げること自体が注目すべきこと であるためである。とはいえ、分析の背後にある理由を無視しても何のメリッ トもないので、ここでは調査の背後にある二つの主要な動機について考察して みよう。 ファイルシステムに対するインシデントレスポンスの分析の目的には、私 的な(casual)ものと法的なものの両方が考えられる。この用語は動機を記述す るという一般的な意味で用いられていない。両者の間に重要な違いがあるた め、以下で順に説明を行なう。 法的調査(legal investigation)は刑事告訴を補助するためのものである。 法廷に提出する証拠とするためには厳格な要件を満たすことが必要なため、法 的なフォレンシック調査を阻止することは非常に容易である。例えばファイル システムをランダムなデータで上書きしただけでも収集されたデータは証拠と して提出する上で充分信頼できるものとはいえなくなってしまう。 私的な調査(casual investigation)は刑事告訴のために行なうものではな い。この調査はフォレンシック・アナリストが関心をもった点について行なわ れるものであり、用いられる技術、ツール、手法の自由度も高いのが一般的で ある。私的なフォレンシック分析を阻止するには、証拠の質や量に関する第 三者の厳格な要件を満たす必要がない分だけ、より多くの努力と技術が必要と なる。 フォレンシック調査の目的に関わらず、以下で説明する手順は基本的に同 一である: * ファイルシステムをそのまま取得することが必要である * そこに含まれる情報を収集する * そのデータから証拠が取得する * その証拠を検証する ここでいう証拠とはファイルの内容(データ)とファイルの情報(メタデー タ)の両方である。ファイルシステムから収集された証拠を元に、調査員は以 下のようなことを実施する: * 関連する人間に関する情報を収集する [who] * 露見したイベントの本来の姿を断定する [what] * イベントの時系列的な経緯を再構築する [when] * 不正操作(exploit)に使われたツールを特定する [how] フォレンシック作業がどのように行なわれるかの例として、削除されたファ イルの復元について説明する。 UNIX のファイルシステムにおけるファイルの削除は、inode への内部的 なリンクカウントが 0 にすることにより行なわれる。これは全てのディレク トリエントリのファイル名と inode のリンクを削除することにより行なわれ る。inode が削除された場合、カーネルは全てのリソースを別のファイルが使 用可能なものとしてマークする - それだけである。inode 内には参照してい るファイルに関するデータの全ての残っており、参照先のデータブロックには ファイルの内容がそのまま残っている。この状態は再割り当てが行なわれ、残っ ているデータが上書きされるまで続く。 これがもたらす最悪の問題は、フォレンシック・アナリストにとって削除 されたファイルを復元させることは簡単であるという点である。データの格納 されている(未使用でない) inode の中でリンクカウントが 0 のものが削除さ れた inode になる。ブロックへのポインタを辿ることで、ファイルの内容が (うまくいけば)復元できる。ファイルの内容が復元できなかったとしても、フォ レンシック・アナリストは、ディレクトリエントリや inode 内のメタデータ だけから、ファイルシステムに何が発生したかについて多くを知ることが可能 である。このメタデータはカーネルのシステムコールのインタフェースからは アクセスできないため、一般的なシステムツールからは変更できない (これは 厳密には正しくないが、フォレンシックの観点からは、こう考えてよいだろう)。 残念なことに、フォレンシック・アナリストが敵意を持った対フォレンシッ ク要員と対峙した際には、不可能でない場合であっても、これを行なうのは非 常に困難である。電子的フォレンシック業界は対フォレンシックの情報やツー ルが存在しないに等しかったため、最近まで楽な仕事であったが、それは(明 らかに)変化しつつある。 --[ 2 - 対フォレンシック 前セクションにおいてフォレンシック分析についての概要を説明するとと もに、フォレンシック作業を阻止するためのヒントについても提示した。本セ クションでは対フォレンシック手法について話を広げていく。対フォレンシッ クは、調査員が確認可能な情報の質や量を低減させるための行為である。分析 の各段階において、フォレンシック作業は抵抗や阻止に対する懸念がある。本 文書では主に電子的フォレンシック調査におけるデータ収集段階における阻止 について着目し、2つの手法について詳細に説明する。1つはデータの破壊であ り、もう1つはデータの秘匿である。分析作業を通じての不正操作に関する問 題点(vulnerability)についても同時に言及していく。 電子的フォレンシック処理は、生データ(ファイルシステムのビット単位 の複製)を証拠(電子メールなど)に変換する際の誤操作に非常に敏感である。 こうした変換処理では、大抵データに対する情報落ちが発生してしまうため、 ほとんど全ての段階に懸念すべき点がある。情報落ちが発生した場合、詳細は 失われる。しかし詳細なもの*こそ*データである。情報落ちによりデータが失 われるため、不正操作を証明し得る証拠との間の乖離が発生する。しかし情報 落ちは、フォレンシック分析中に発生したミスだけが原因とは限らない。利用 されるツールそれ自身にしばしば欠陥があったり、不完全なものだったりする 場合もある。フォレンシック・ツールの実装におけるバグは、対フォレンシッ ク要員による不正操作の機会を非常に増大させている。 遠隔地の対フォレンシック要員がファイルシステムの取得(capture)を妨 げるために行なえることはほとんどないため、以下フォレンシック調査の次の 段階における不正操作、ファイルシステムからの証拠収集の阻止について着目 する。データの取得を防止するには、データの破壊とデータの秘匿という2つ の手法が考えられる。データの破壊を行ない、分析を行なう調査員に何の情報 も残さない方がより確実である。データの破壊は、秘匿すべき証拠が存在した 痕跡を安全に消去する方法を提供し、痕跡を効果的に隠蔽することを可能とす る。 一方データの秘匿は、アナリストが捜索すべき場所を知らない場合に限り 有効である。データ格納領域の整合性を長時間にわたり確保することは保証で きない。このため、データの秘匿は解析段階(独自のファイルフォーマットな ど)や調査段階(暗号化など)での阻止策と併せて用いるべきである。データの 秘匿がもっとも有効なのは、必要不可欠なデータ (例: photographs of young women in artistic poses) を短期間格納しなければならない場合である。 データの破壊およびデータの秘匿の手法を実際に例示するために、2つの ツールキットを本文書に添付している。ツールキットは、以下で詳細に説明す るデータの破壊や秘匿に関する調査を行なった際の例を示すために用いられて いる。最初に詳細に解説する対フォレンシック手法は、データの秘匿の方であ る。 --[ 3 - runefs UNIX ファイルシステムのフォレンシック分析用ツールとしてもっとも著 名なものは、Dan Farmer と Wietse Venema が開発した「The Coronor's Toolkit」[1](TCT) である。何年もの間 UNIX の電子的フォレンシック・アナ リストの頼みの綱として信頼されており、幾つかの拡張[2][3] の基礎となっ てきたが、このツールは初期リリース時の問題を抱えたまま今日も用いられて いる。主要なファイルシステムの実装に存在するバグのため、攻撃者は TCT ツールが調査できない場所に任意の量のデータを格納することができてしまう。 Berkley Fast File System (FFS もしくは UFS と呼ばれることもある) や Second Extended File System (ext2fs) に関する TCT の実装では、ファ イルシステムの特徴を適切に再現できていない。TCT はルート inode の前の inode にデータブロックを割り当てることができないという誤った仮定に基づ いている他、不良ブロック(bad block)の inode を考慮しない問題がある。 歴史的に不良ブロックの inode はハードディスクの不良セクタが存在す るデータブロックを示し、このブロックが実際のファイルにより使われないよ うにするために用いられてきた。FFS は、前述の問題による不正操作を妨げる ため、不良ブロックの inode を廃止したが、 ext2fs では依然として用いら れている。ファイルシステムのデータ秘匿攻撃が成功するということは、対フォ レンシック要員からみると、チェックツールである fsck のチェック範囲外で、 ファイルシステムが操作できてしまうということに他ならない。フォレンシッ ク分析手法において、ファイルシステムが実際に変更されていないことを確認 するために fsck を用いているものがないということは興味深い。 ext2fs の fsck は、不良ブロックの識別に、未だに不良ブロックの情報 を利用しているため、任意のブロックを不良ブロックの inode として割り当 てることができてしまう。残念なことに TCT のファイルシステムのコードは、 不良ブロックの inode を調査対象とはしていない。不良ブロックの inode の バグは悪用が簡単であるが、直すのも簡単な筈である。TCT のファイルシステ ムのコードのあちこちに、以下のようなチェックのミスともいうべきコードが 散在している: /* * Sanity check. */ if (inum < EXT2_ROOT_INO || inum > ext2fs->fs.s_inodes_count) error("invalid inode number: %lu", (ULONG) inum); ext2 ファイルシステムにおいて、ブロックのリソースを割り当て可能な 先頭の inode は、実際の所不良ブロックの inode (inode 1)であり、ルート inode (inode 2)では*ない*。この ext2fs の実装ミスのため、不良ブロック の inode として割り当てられたブロックにデータを格納し、TCT や TASK を 用いるアナリストからデータを秘匿することが可能となってしまっている。こ の攻撃の重要性を示すため、runefs ツールキットを用いた以下のデモでは、 隠しストレージ空間を作成し、データをその領域とやりとりした上で、その領 域がフォレンシック・アナリストからいかに安全であるかを示す。 ----[ 3.1 - 例: 隠し領域の作成 # df -k /dev/hda6 Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda6 1011928 20 960504 1% /mnt # ./bin/mkrune -v /dev/hda6 +++ bb_blk +++ bb_blk->start = 33275 bb_blk->end = 65535 bb_blk->group = 1 bb_blk->size = 32261 +++ rune size: 126M # df -k /dev/hda6 Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda6 1011928 129196 831328 14% /mnt # e2fsck -f /dev/hda6 e2fsck 1.26 (3-Feb-2002) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/hda6: 11/128768 files (0.0% non-contiguous), 36349/257032 blocks # 最初の例は、隠しストレージ領域として割り当てた 126 メガバイトのディ スク領域が、どのような形でカーネルによって利用可能なディスク領域の損失 という形で認識されるかのデモである。隠しストレージ領域は ext2 ファイル システムの実装を逸脱するものではなく、fsck も何ら異常を検知しえないこ とは自明である。 ----[ 3.2 - 例: 隠し領域の利用 # cat readme.tools | ./bin/runewr /dev/hda6 # ./bin/runerd /dev/hda6 > f # diff f readme.tools # 次の例は、どのようにしてデータの欠損なしに隠しストレージ領域にデー タを挿入したり、あるいは取り出したりすることができるかについてのもので ある。この例では隠しデータ領域の使い方について包括的に示すものではなく、 runefs によってどのようにデータが挿入され、また取り出されるかを示すこ とを目的としたデモである。 ----[ 3.3 - 例: TCT は ext2fs の実装を適切に行っていない # ./icat /dev/hda6 1 /icat: invalid inode number: 1 # 最後の例では、TCT ツールを用いても、フォレンシック・アナリストがこ のストレージ領域を発見できないことのデモである。利用しているツールによ るファイルシステムの調査が適切に実装されていないことが、多くの問題を引 き起こすことは自明であろう。 これらの例からいえるのは、runefs には問題があることである。runefs の実装は初歩的で古く(このツールは 2000 年 11 月に作成されている)、暗号 化も標準ではサポートされていない。runefs の現バージョンではディレクト リ構造を完全にサポートした動的なサイズ変更可能なファイルシステムや、完 全に暗号化されたファイルシステムをサポートし、4ギガバイトまでの大きさ まで拡張することができる(これは私的な版であり、一般に公開はしていない)。 runefs に関する最後の問題は、プライベートな実装においても同様だが、 不良ブロックにデータを秘匿するというテクニックが一般的に知られてしまっ ていることであろう。このデータ秘匿のテクニックに関する問題は、結局この テクニックは時代遅れのものであるということである。このため、データの秘 匿は、少なくとも 1 つ以上の暗号化など別の対フォレンシック技術と組み合 わせて用いるべきである。 フォレンシック・アナリストの詮索に対して、ファイルシステム上にデー タを安全に格納するための方法は他にも幾つかあり、調査報告書には、多くの 方法が詳細に記述されている筈である。しかし、データの秘匿についての説明 はこれで終わりとし、以降ではデータの破壊について着目していきたい。 --[ 4 - Defiler のツールキット ファイルシステムにはコンピュータのファイル I/O 操作の記録が(おそら く)含まれており、フォレンシック・アナリストは調査のためにその記録を解 読しようとする。所持しているフォレンシック・ツールがデータを正しく報告 していないのであれば、レポートされるべきデータはそこにあるかどうかを調 べる役にはたたない。本セクションではファイルシステム上の証拠を徹底的に 皆無にするための手法について説明する。これらの手法は、本ドキュメントに 添付されている Defiler のツールキット(TDT)に実装されている。 データの取得に関する主な問題点は、フォレンシック・アナリストが調査 を開始した際にそこに収集された証拠が存在していなければならないことであ る。存在していないデータが収集されないことは自明であり、そうした決定的 な情報なしにはフォレンシック・アナリストは調査を進めることができない。 ファイルシステムのサニタイズ(浄化)とはこのデータ(証拠)を消去し、証 拠が存在したという痕跡も残さない(「証拠の抹消」自体が存在しない)ように する)という対フォレンシックの戦略である。Defiler のツールキットは手術 のような精密さでファイルシステムからデータを消去するツールを提供する。 証拠となるかも知れないデータを選択して抹消することによって、対フォレン シック要員はフォレンシック作業そのものを開始される前に阻止することが可 能となる。 UNIX ファイルシステムにおいて、以下の全ての位置にファイルの存在し た痕跡が含まれる。それらは証拠となる: * inode * ディレクトリエントリ * データブロック 残念なことに、ほとんどの安全な削除ツールはデータブロックにある証拠 のみを削除し、inode やディレクトリエントリはそのままである。本文書には、 完全なファイルシステムのサニタイズを行なう対フォレンシック・ツールキッ トの実装例が含まれている。Defiler のツールキットは necrofile と klismafile という2つのツールを提供する。これらは協調してファイルの存在 した全ての痕跡を安全に消しさる。 Defiler のツールキットは、necrofile と klismafile という2つの無償 ツールからなっている。これらのデザインおよび実装の目標は以下で記述する。 ----[ 4.1 - necrofile necrofile は洗練された dirty inode の選択および初期化ツールである。 それは指定された期間内に削除された dirty inode の全てを確認し、それら の inode を初期化するために使われる。初期化された inode は、そのディス クに含まれているファイルシステムの調査を行なっているフォレシック・アナ リストに対する証拠を残さない。 necrofile は dirty inode が参照しているデータブロック上にある全て の内容をセキュアに消去するような機能を持つように作られている。しかし、 カーネルを経由せずにファイルシステムリソースを操作するツールには競合が 発生するため、これはツールの理想的な使い方とはいえない。 necrofile が実行される際には、チェックを行うファイルシステムと検出 された dirty inode を初期化するかどうかを判断するのに使われる期間とが 指定される。necrofile は inode テーブルを順に確認し、各 inode の状態を チェックし、dirty inode かどうかを確認する。指定された期間内に削除され た dirty inode は初期化されて inode テーブルに書き戻され、確認作業が続 行する。 ------[ 4.1.1 - 例: TCT は削除された inode を検出する # ./ils /dev/hda6 class|host|device|start_time ils|XXX|/dev/hda6|1026771982 st_ino|st_alloc|st_uid|st_gid|st_mtime|st_atime|st_ctime|st_dtime|st_mode|\ st_nlink|st_size|st_block0|st_block1 12|f|0|0|1026771841|1026771796|1026771958|1026771958|100644|0|86|545|0 13|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|546|0 14|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|547|0 15|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|548|0 16|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|549|0 17|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|550|0 18|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|551|0 19|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|552|0 20|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|553|0 21|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|554|0 22|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|555|0 23|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|556|0 24|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|557|0 25|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|558|0 26|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|559|0 27|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|560|0 28|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|561|0 29|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|562|0 30|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|563|0 31|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|564|0 32|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|565|0 33|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|566|0 34|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|567|0 35|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|568|0 36|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|569|0 37|f|0|0|1026771842|1026771796|1026771958|1026771958|100644|0|86|570|0 # ------[ 4.1.2 - 例: necrofile は削除された inode を検出して初期化する # ./necrofile -v -v -v -v /dev/hda6 Scrubbing device: /dev/hda6 12 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 13 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 14 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 15 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 16 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 17 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 18 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 19 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 20 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 21 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 22 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 23 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 24 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 25 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 26 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 27 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 28 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 29 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 30 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 31 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 32 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 33 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 34 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 35 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 36 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f 37 = m: 0x3d334d4d a: 0x3d334d4d c: 0x3d334d4f d: 0x3d334d4f # ------[ 4.1.3 - 例: TCT は存在しないデータを検出できない # ./ils /dev/hda6 class|host|device|start_time ils|XXX|/dev/hda6|1026772140 st_ino|st_alloc|st_uid|st_gid|st_mtime|st_atime|st_ctime|st_dtime|st_mode|\ st_nlink|st_size|st_block0|st_block1 # これらの例については少し説明が必要だろう。「ils」ツールは TCT の一 部であり、復元可能な可能性のある削除された inode を一覧するものである。 necrofile のツールは最も冗長な形式で実行されていて、ils によって発見さ れたのと同じ inode を発見して、上書きしている。necrofile の方がより効 果的であろう。ある期間内に削除された inode を対象にする場合、それ以外 の削除された inode はそのままである。この処理により、消去の証拠、すな わち証拠が消去されたことを示すものが消去される。削除された inode が初 期状態の inode に変換されたあとでは、当然 ils もそれらを発見することは できない。有意なフォレンシックのデータを含む inode の消去以外にサニタ イズが必要な箇所にはディレクトリエントリがある。 ----[ 4.2 - klismafile klismafile は削除されたディレクトリエントリをセキュアに上書きする 方法を提供する。ファイル名と inode とのリンクが切断された際にも、ディ レクトリエントリの内容は上書きされず、単に先行するエントリのゴミ領域に 含まれるだけである。Klismafile はディレクトリファイル内のこうした「削 除された」エントリを捜し出し、それらを上書きする。消去するディレクトリ エントリを制限するために、正規表現を使うことができる。 klismafile が実行される際には、検索対象のディレクトリファイルが与 えられるが、オプションで検出した全てのディレクトリファイルに対して再帰 的に実行させることもできる。Klismafile はディレクトリエントリに対して 繰返し、削除されたディレクトリエントリを検索する。削除されたディレクト リエントリが発見されたら、klismafile はファイル名と実行時に与えられた 正規表現(デフォルトは「*」)との比較を行なう。合致した場合、klismafile はディレクトリエントリを 0 の値で上書きする。 klismafile は完全にセキュアなものというわけではない。技術力のある フォレンシック・アナリストであれば、先行するディレクトリエントリの rec_len フィールドが本来あるべき長さよりも長いことに気づき、klismafile のようなツールが巧みにディレクトリファイルの内容を操作したと推断するか も知れない。現在の所、このチェックを行なうツールはないが、この状況はす ぐに変化することだろう。 ------[ 4.2.1 - 例: fls による削除されたディレクトリエントリの一覧 # ./fls -d /dev/hda6 2 ? * 0: a ? * 0: b ? * 0: c ? * 0: d ? * 0: e ? * 0: f ? * 0: g ? * 0: h ? * 0: i ? * 0: j ? * 0: k ? * 0: l ? * 0: m ? * 0: n ? * 0: o ? * 0: p ? * 0: q ? * 0: r ? * 0: s ? * 0: t ? * 0: u ? * 0: v ? * 0: w ? * 0: x ? * 0: y ? * 0: z # ------[ 4.2.2 - 例: klismafile による削除されたディレクトリエントリの初期化 # ./klismafile -v /mnt Scrubbing device: /dev/hda6 cleansing / -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> k -> l -> m -> n -> o -> p -> q -> r -> s -> t -> u -> v -> w -> x -> y -> z Total files found: 29 Directories checked: 1 Dirents removed : 26 # ------[ 4.2.3 - 例: fls が存在しないデータを発見できないところ # ./fls -d /dev/hda6 2 # この例は見てのとおりである。「fls」ユーティリティは、TCT-UTILS パッ ケージの一部であり、ディレクトリファイルを調査するものである。上記は、 ファイルシステムのルートディレクトリにある全ての削除されたディレクトリ エントリを一覧するものである。klismafile は冗長モードで実行され、発見 した各ディレクトリエントリを表示するとともに上書きする。klismafile を 実行した後では、fls もディレクトリファイル内に何ら不具合を発見できない。 注意: Linux 2.4 カーネルはカーネルメモリ内にディレクトリをキャッシュ し、ディスク上のファイルシステムを直ちに更新することは行なわない。この ため、klismafile が調査し、clean にするディレクトリファイルは、現在の ものではなく、修正がカーネルによって上書きされる可能性がある。通常別の ディレクトリに対するディスク操作を実行することにより、キャッシュがフラッ シュされ、klismafile が適切に動作するようになる。 Defiler のツールキットは、すべての電子的フォレンシック手法や技術に 内在する問題点をデモするためのユーティリティとして作成されている。この ツールキットは、対象となるコンピュータに事前に準備作業を行っていない限 り、侵入後のフォレンシック分析は極めて疑わしいということを証明するとい う設計当初の目的を充分達成している。 --[ 5 - 総括 電子的フォレンシック・ツールはバグが多く、エラーも多く、内在する問 題点も多い。しかしこうした問題があっても、これらのツールは侵入されたコ ンピュータを調査するために、より頻繁に用いられ、信頼されていくようにな るであろう。こうした本質的に問題のあるソフトウェアがインシデントレスポ ンスの中で中核的な役割を担っているにも関わらず、誰も対フォレンシック技 術やそれに対抗する手段(対-対フォレンシック)の開発手法に関してドキュメ ント化していないというのは、驚愕せざるを得ない。対-対フォレンシック手 法に関して、セキュリティのコミュニティに対フォレンシックの闘いの足場を 提供するため、ここでは幾つかの提案を示している。 Defiler のツールキットはファイルシステムを直接修正して、OS 実行中 に記録された証拠を消去する。Defiler のツールキットに対抗する方法は、ロー カルファイルシステムにのみ記録されたディスク操作に依存しないことである。 たとえば、ファイルシステムの修正に関する記録を二重化し、その記録を安全 な場所に保存するとよいだろう。最も単純なソリューションはすべての inode の更新を別のマシン上にあるログファイルに記録するという方法である。カー ネルの VFS レイヤに対する簡単な機能追加と syslog サーバの組み合わせが、 対-対フォレンシック・ツール手法として初期の対策となるであろう。 対フォレンシックに対抗する効果的な唯一の防止策は、こうした可能性に 対してインシデントが発生する前に準備しておくことである。しかし、ツール なしでは、効果的な準備を行なうことはできないため、コンピュータの世界は 匿名性が確保される攻撃者に対しては脆弱なままである。この文書はセキュリ ティ業界が効果的なツールの開発を行なうきっかけとなることを目指している。 うまくいけば、次世代の電子的フォレンシック調査を行なうツールキットは、 防御側にとって更に頼れるものとなり、攻撃者との闘いに有効なものとなるで あろう。 --[ 6 - Greets Shout outs to my homies! East Side: stealth, scut, silvio, skyper, smiler, halvar, acpizer, gera West Side: blaadd, pug, srk, phuggins, fooboo, will, joe Up Town: mammon_, a_p, _dose Down Town: Grendel, PhD. --[ 7 - 参考情報: [1] Dan Farmer, Wietse Venema "TCT" www.fish.com/security [2] Brian Carrier "TCTUTILS" www.cerias.purdue.edu/homes/carrier/forensics [3] Brian Carrier "TASK" www.cerias.purdue.edu/homes/carrier/forensics [4] Theodore T'so "e2fsprogs" e2fsprogs.sourceforge.net --[ 8 - 付録 A ----[ 8.1 - Ext2fs phrack の尊重すべき伝統であるコメントのついたヘッダファイルの形で、 以下で Second Extended File System についての紹介を行なう。 Second Extended File System (ext2fs) は Linux で標準的なファイルシ ステムである。この資料ではファイルシステムの概要を提供するものである。 本資料を参照しても、カーネルや ext2fs ライブラリのソースの参照の代わり とはならない。 以下は ext2 ファイルシステムのボトムアップ的な説明である; ブロック に関する説明にはじまり、以下 inode や総括と続き、最後はディレクトリに ついて説明を行なう。 . o O ( ブロック ) O o . ファイルシステムの基本的な構成要素はデータブロックであり、ファイル の内容を格納するのに用いられる。通常ハードディスクで最小の格納単位はセ クタ(sector)(512 バイト)であるが、これは I/O 処理の単位としては小さ過 ぎる。パフォーマンス向上のため、複数のセクタがクラスタ化され、1つの単 位、データブロックとして扱われる。ext2fs システムにおける典型的なデー タブロックのサイズは 4096 バイトであるが、2048 バイトや 1024 バイトな どの値 (8 セクタ、4 セクタ、2 セクタなど)にすることも可能である。 . o O ( inode ) O o . ファイルシステムのもう一つの基本的な要素は inode であり、UNIX ファ イルシステムの中核をなすものである。これには格納されている各ファイルに 関するメタデータである、データブロックへのポインタ、ファイルのパーミッ ション、サイズ、所有者、グループ、その他の重要な情報が含まれている。 ext2 の inode のフォーマットは以下のとおりである: --------------------------------------------------------------------------- struct ext2_inode { __u16 i_mode; /* File mode */ __u16 i_uid; /* Owner Uid */ __u32 i_size; /* Size in bytes */ __u32 i_atime; /* Access time */ __u32 i_ctime; /* Creation time */ __u32 i_mtime; /* Modification time */ __u32 i_dtime; /* Deletion Time */ __u16 i_gid; /* Group Id */ __u16 i_links_count; /* Links count */ __u32 i_blocks; /* Blocks count */ __u32 i_flags; /* File flags */ union { struct { __u32 l_i_reserved1; } linux1; struct { __u32 h_i_translator; } hurd1; struct { __u32 m_i_reserved1; } masix1; } osd1; /* OS dependent 1 */ __u32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ __u32 i_version; /* File version (for NFS) */ __u32 i_file_acl; /* File ACL */ __u32 i_dir_acl; /* Directory ACL */ __u32 i_faddr; /* Fragment address */ union { struct { __u8 l_i_frag; /* Fragment number */ __u8 l_i_fsize; /* Fragment size */ __u16 i_pad1; __u32 l_i_reserved2[2]; } linux2; struct { __u8 h_i_frag; /* Fragment number */ __u8 h_i_fsize; /* Fragment size */ __u16 h_i_mode_high; __u16 h_i_uid_high; __u16 h_i_gid_high; __u32 h_i_author; } hurd2; struct { __u8 m_i_frag; /* Fragment number */ __u8 m_i_fsize; /* Fragment size */ __u16 m_pad1; __u32 m_i_reserved2[2]; } masix2; } osd2; /* OS dependent 2 */ }; --------------------------------------------------------------------------- 共用体(union)が2つ定義されているが、これは ext2fs が幾つかの異なる 特徴を持った OS をサポートすることを想定しているためである。例外的な場 合を除き、これに該当する共用体は linux1 および linux2 という構造体のみ である。これらは現在の ext2fs の実装では無視され、単なるパディングとし て扱われる。inode の残りの部分の値の意味について、以下で説明する。 * i_mode ファイルのモード。これは通常 UNIX で一般的に使われてい る 8 進数のパーミッションである。 * i_uid ファイルの所有者を示す UID。 * i_size バイト単位のファイルサイズ。最大のサイズは符合なし 32 ビット整数の最大値である 4G である。64 ビットファイル サイズのサポートは、高位 32 ビットのサポートは、以下の 暫定策により実現されている。 #define i_size_high i_dir_acl * i_atime ファイルが最後にアクセスされた時刻。時刻は UNIX の慣習 に従い、UNIX 紀元時からの秒単位の時間で格納される。 * i_ctime ファイルの作成時刻。 * i_mtime ファイルが最後に変更された時刻。 * i_dtime ファイルが削除された時刻。ファイルが有効に存在している 場合、この時刻は 0x00000000 になる。 * i_gid ファイルの GID。 * i_links_count ファイルが高レベルのファイルシステムから参照されている 回数。すなわち、ファイルに対するハードリンクにより、こ の値が増加する。ファイルに対する最後のリンクが FS から 削除され、リンクカウントが 0 になると、ファイルは削除 される。inode によって参照されるブロックはビットマップ 状で未使用とマークされる。 * i_blocks inode によって参照されるブロック数。これには間接ブロッ クは含まれない。実際にファイルの内容に含まれているブロッ クのみが計算される。 * i_flags ext2fs の拡張属性を実現する値。以下のフラグの組合せが 有効な値となる: --------------------------------------------------------------------------- #define EXT2_SECRM_FL 0x00000001 /* Secure deletion */ #define EXT2_UNRM_FL 0x00000002 /* Undelete */ #define EXT2_COMPR_FL 0x00000004 /* Compress file */ #define EXT2_SYNC_FL 0x00000008 /* Synchronous updates */ #define EXT2_IMMUTABLE_FL 0x00000010 /* Immutable file */ #define EXT2_APPEND_FL 0x00000020 /* append only */ #define EXT2_NODUMP_FL 0x00000040 /* do not dump file */ #define EXT2_NOATIME_FL 0x00000080 /* do not update atime */ /* Reserved for compression usage... */ #define EXT2_DIRTY_FL 0x00000100 #define EXT2_COMPRBLK_FL 0x00000200 /* compressed clusters */ #define EXT2_NOCOMP_FL 0x00000400 /* Don't compress */ #define EXT2_ECOMPR_FL 0x00000800 /* Compression error */ /* End compression flags --- maybe not all used */ #define EXT2_BTREE_FL 0x00001000 /* btree format dir */ #define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ --------------------------------------------------------------------------- * i_block[] ブロックポインタ。配列の要素は 15 個存在する。先頭から 12 個は直接ブロックへのポインタであり、ファイルの内容 そのものが格納される。13 番目の要素は配列の拡張として 機能するブロックへのポインタとなる。このブロックは間接 ブロックであり、格納されるポインタは拡張される直接ブロッ クへのポインタである。14 番目の要素は間接ブロックへの ブロックの配列へのポインタを格納するブロックとなる。こ れは、二重の間接ブロックである。最後の要素は三重の間接 ブロックである。このブロックには二重の間接ブロックへの ポインタが含まれる。 --------------------------------------------------------------------------- #define EXT2_NDIR_BLOCKS 12 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) --------------------------------------------------------------------------- * i_version ファイルのバージョン。利用されているようには見えない。 * i_file_acl ACL リストへのポインタ。ext2 ファイルシステムのこのバー ジョンでは ACL の実装が行なわれていないため、この値は 使われない。 * i_dir_acl ACL リストへのポインタ。ext2 ファイルシステムでは、こ の値は ACL ポインタとしては用いられず、[ i_size_high ] の値として用いられる。これによりファイルサイズが 32 ビッ ト拡張され、64 ビット符合なし整数のファイルサイズを扱 うことが可能となる。この値は通常 ext2fs では使われない。 * i_faddr フラグメントアドレス。フラグメントは ext2fs においては 用いられないため、この値は常に 0 である。 inode によってはファイルシステム中で特別な意味を持つものもある。 --------------------------------------------------------------------------- #define EXT2_BAD_INO 1 /* Bad blocks inode */ #define EXT2_ROOT_INO 2 /* Root inode */ #define EXT2_ACL_IDX_INO 3 /* ACL inode */ #define EXT2_ACL_DATA_INO 4 /* ACL inode */ #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ --------------------------------------------------------------------------- 不良ブロック inode にはハードディスクの不良セクタを含むデータブロッ クへのブロックのポインタが含まれる。ルート inode はファイルシステムの ツリーの頂点に位置するルートディレクトリを示す。それ以外の inode は商 用ベースのシステムでは通常使われない。ユーザのファイルに使われる先頭の inode は inode 11 である。この inode は「lost+found」ディレクトリであ り、mkfs ツールによって作成される。 . o O ( スーパーブロック ) O o . スーパーブロックはカーネルがファイルシステムの状態を判断する基本的 な手段であり、inode 数、ブロック数、グループ数に加え、それ以外の多様な 情報を提供する。スーパーブロックの構造体に存在する要素は inode やグルー プのデータよりも頻繁に変更される。これは libext2fs が ext2fs に対して カーネルに実装されていない機能を追加したためである(訳注: この文書の訳 はちょっと問題あるかも)。調査したフォーマットは e2fsprogs-1.19 による ものである。 スーパーブロックのサイズは 1024 バイトであり、パーティションの先頭 から 1024 バイトの位置に存在する。 スーパーブロックのフォーマットは以下のとおりである: --------------------------------------------------------------------------- struct ext2fs_sb { __u32 s_inodes_count; /* Inodes count */ __u32 s_blocks_count; /* Blocks count */ __u32 s_r_blocks_count; /* Reserved blocks count */ __u32 s_free_blocks_count; /* Free blocks count */ __u32 s_free_inodes_count; /* Free inodes count */ __u32 s_first_data_block; /* First Data Block */ __u32 s_log_block_size; /* Block size */ __s32 s_log_frag_size; /* Fragment size */ __u32 s_blocks_per_group; /* # Blocks per group */ __u32 s_frags_per_group; /* # Fragments per group */ __u32 s_inodes_per_group; /* # Inodes per group */ __u32 s_mtime; /* Mount time */ __u32 s_wtime; /* Write time */ __u16 s_mnt_count; /* Mount count */ __s16 s_max_mnt_count; /* Maximal mount count */ __u16 s_magic; /* Magic signature */ __u16 s_state; /* File system state */ __u16 s_errors; /* Behaviour when detecting errors */ __u16 s_minor_rev_level; /* minor revision level */ __u32 s_lastcheck; /* time of last check */ __u32 s_checkinterval; /* max. time between checks */ __u32 s_creator_os; /* OS */ __u32 s_rev_level; /* Revision level */ __u16 s_def_resuid; /* Default uid for reserved blocks */ __u16 s_def_resgid; /* Default gid for reserved blocks */ /* * These fields are for EXT2_DYNAMIC_REV superblocks only. * * Note: the difference between the compatible feature set and * the incompatible feature set is that if there is a bit set * in the incompatible feature set that the kernel doesn't * know about, it should refuse to mount the filesystem. * * e2fsck's requirements are more strict; if it doesn't know * about a feature in either the compatible or incompatible * feature set, it must abort and not try to meddle with * things it doesn't understand... */ __u32 s_first_ino; /* First non-reserved inode */ __u16 s_inode_size; /* size of inode structure */ __u16 s_block_group_nr; /* block group # of this superblock */ __u32 s_feature_compat; /* compatible feature set */ __u32 s_feature_incompat; /* incompatible feature set */ __u32 s_feature_ro_compat; /* readonly-compatible feature set */ __u8 s_uuid[16]; /* 128-bit uuid for volume */ char s_volume_name[16]; /* volume name */ char s_last_mounted[64]; /* directory where last mounted */ __u32 s_algorithm_usage_bitmap; /* For compression */ /* * Performance hints. Directory preallocation should only * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on. */ __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ __u16 s_padding1; /* * Journaling support. */ __u8 s_journal_uuid[16]; /* uuid of journal superblock */ __u32 s_journal_inum; /* inode number of journal file */ __u32 s_journal_dev; /* device number of journal file */ __u32 s_last_orphan; /* start of list of inodes to delete */ __u32 s_reserved[197]; /* Padding to the end of the block */ }; --------------------------------------------------------------------------- * s_inodes_count ファイルシステム内の inode の総数。 * s_blocks_count ファイルシステム内のブロックの総数。 * s_r_blocks_count スーパーユーザ用に予約されているブロック数。ファ イルシステムがいっぱいになった際にも、ここで予 約されたブロックはファイルシステムが利用不能に なることを避けるため、保持される。 * s_free_blocks_count 未使用ブロック数。この値はブロックが解放された り確保されたりする度に定常的に更新される。 * s_free_inodes_count 未使用の inode 数。この値は inode が解放された り確保されたりする度に定常的に更新される。 * s_first_data_block データブロックの先頭へのポインタ。このブロック は inode テーブル、ビットマップ、グループに割 り当てられたブロックの後に位置する。この値は 0 か適切な値である。 * s_log_block_size ブロックのサイズ。この値はシフトする値を格納す る。シフトされる数値は 1024 である。そのため、 実際のブロックサイズは以下のように算出する: bs = 1024 << sb.s_log_block_size; * s_log_frag_size フラグメントのサイズ。この値はシフトする値を格 納する。フラグメントは ext2fs では使われていな い。そのためこの値は無視される。 * s_blocks_per_group グループ内のブロック数。 * s_frags_per_group グループ内のフラグメント数。 * s_inodes_per_group グループ内の inode 数。 * s_mtime ファイルシステムが最後にマウントされた時刻。時 刻は UNIX 紀元からの秒単位の時刻で格納される。 * s_wtime ファイルシステムが最後に書き込まれた時刻。 * s_mnt_count ファイルシステムがマウントされた回数。 * s_max_mnt_count fsck を行なうまでに可能なファイルシステムのマ ウント回数。デフォルト値は 20 である。 * s_magic ファイルシステムのマジックナンバーである 0xEF53。 * s_state ファイルシステムの状態: clean もしくは dirty。 このフラグは以下のとおりである: --------------------------------------------------------------------------- #define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */ #define EXT2_ERROR_FS 0x0002 /* Errors detected */ --------------------------------------------------------------------------- * s_errors エラーが発生した際のレスポンス。以下が有効な値 である: --------------------------------------------------------------------------- #define EXT2_ERRORS_CONTINUE 1 /* Continue execution */ #define EXT2_ERRORS_RO 2 /* Remount fs read-only */ #define EXT2_ERRORS_PANIC 3 /* Panic */ #define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE --------------------------------------------------------------------------- * s_minor_rev_level ext2fs のマイナーバージョン番号。この値は無視 しても構わない。 * s_lastcheck ファイルシステムが最後に fsck された時刻で、一 般的な UNIX 紀元のフォーマットで格納される。 * s_checkinterval fsck を行なうまでの最大間隔。この値を超過する か、s_max_mnt_count を超過したファイルシステム は fsck が行なわれる必要がある。 * s_creator_os このファイルシステムを作成した OS 。有効な値は 以下のとおり: --------------------------------------------------------------------------- #define EXT2_OS_LINUX 0 #define EXT2_OS_HURD 1 #define EXT2_OS_MASIX 2 #define EXT2_OS_FREEBSD 3 #define EXT2_OS_LITES 4 --------------------------------------------------------------------------- * s_rev_level ファイルシステムのリビジョン。この値が関連する のは inode サイズだけである。現在のバージョン では 128 バイト固定である。有効な値は以下のと おり: --------------------------------------------------------------------------- #define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */ #define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ #define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV --------------------------------------------------------------------------- * s_def_resuid 予約ブロックのデフォルトの UID。デフォルトは 0。 * s_def_resgid 予約ブロックのデフォルトの GID。デフォルトは 0。 * s_first_ino 予約されていない先頭の inode。10 以下の inode は予約されているため、有効な inode 番号の先頭 は 11 であり、ほとんどの場合「lost+found」に使 われている。 * s_inode_size inode のサイズ。現在の ext2fs の実装では、この サイズは 128 バイトである。 * s_block_group_nr このスーパーブロックが格納されているブロックグループ。 * s_feature_compat ext2fs がサポートする機能を示すフラグ。有効な 値は以下のとおり: --------------------------------------------------------------------------- #define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001 --------------------------------------------------------------------------- * s_feature_incompat ext2fs がサポートしない機能を示すフラグ。有効 な値は以下のとおり: --------------------------------------------------------------------------- #define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001 #define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 --------------------------------------------------------------------------- * s_feature_ro_compat この ext2fs が読みとり専用機能をサポートするか どうかのフラグ。有効な値は以下のとおり: --------------------------------------------------------------------------- #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 #define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 #define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 --------------------------------------------------------------------------- * s_uuid この ext2fs のユニークID。 * s_volume_name ボリューム名 (これが何に使われるのか知らない。 おそらく重要ではないだろう)。 * s_last_mounted このファイルシステムが最後にマウントされたディ レクトリ。 * s_algorithm_usage_bitmap (これがどのように使われるのか知らない。 ファイルシステムの圧縮とは無関係である) * s_prealloc_blocks あるファイルのためににあらかじめ確保が行なわれ るブロック数。 * s_prealloc_dir_blocks あるディレクトリファイルのためにあらかじめ確保 が行なわれるブロック数。 * s_padding1 パディング。 * s_journal_* (わたしのファイルシステムではジャーナル機能が サポートされておらず、値をどう使うべきか不明) * s_reserverd[] これはスーパーブロックを 1024 バイトにするため のパディングである . o O ( グループ ) O o . ext2fs のグループはブロックや inode のクラスタを構成化するために用い られる。各グループには使用可能な inode と使用可能なブロックのビットマッ プが含まれている。また、各ブロックには破滅的なデータの損失を防ぐために、 スーパーブロックのコピーも格納されている。グループ記述子はスーパーブロッ クの直後におかれ、その後にビットマップと inode テーブルが続き、その後 にデータブロックがおかれている。 グループ記述子のフォーマットは以下のとおりである。 ----------------------------------------------------------------------------- struct ext2_group_desc { __u32 bg_block_bitmap; /* Blocks bitmap block */ __u32 bg_inode_bitmap; /* Inodes bitmap block */ __u32 bg_inode_table; /* Inodes table block */ __u16 bg_free_blocks_count; /* Free blocks count */ __u16 bg_free_inodes_count; /* Free inodes count */ __u16 bg_used_dirs_count; /* Directories count */ __u16 bg_pad; __u32 bg_reserved[3]; }; ----------------------------------------------------------------------------- * bg_block_bitmap ブロックビットマップのブロックへのポインタ。ビッ トマップ中の各ビットは解放/使用中を示す。 * bg_inode_bitmap inode ビットマップのブロックへのポインタ。ビッ トマップ中の各ビットは解放/使用中を示す。 * bg_inode_table inode テーブルの先頭ブロックへのポインタ * bg_free_blocks_count グループ内にある使用可能なブロック数 * bg_free_inodes_count グループ内にある使用可能な inode 数 * bg_used_dirs_count ディレクトリファイルに使われているグループの inode 数 * bg_pad パディング * pg_reserved[] パディング . o O ( ディレクトリ ) O o . ディレクトリは OS レベルでファイルを構造化するために使われる。ディ レクトリファイルの内容は、ディレクトリエントリ構造体の配列である。各々 には、ディレクトリ内に存在するファイルの名前やファイルの inode 情報が 含まれる。 ext2 のディレクトリエントリのフォーマットは以下のとおりである: --------------------------------------------------------------------------- struct ext2_dir_entry_2 { __u32 inode; /* Inode number */ __u16 rec_len; /* Directory entry length */ __u8 name_len; /* Name length */ __u8 file_type; char name[EXT2_NAME_LEN]; /* File name */ }; --------------------------------------------------------------------------- * inode ディレクトリに含まれるファイルの inode 番号。ファイル が削除された場合、inode 番号は 0 に設定される。 * rec_len ディレクトリエントリのサイズ。名前の最大長は 255 文字 までのため、どちらかというとディレクトリファイル内の空 き領域の有効利用の方で役立つであろう。 * name_len ファイル名の長さ。これは 255 バイトまでの長さである。 * file_type ファイルのタイプ(シンボリックリンク、デバイスなど)。以 下有効な値を示す: --------------------------------------------------------------------------- #define EXT2_FT_UNKNOWN 0 #define EXT2_FT_REG_FILE 1 #define EXT2_FT_DIR 2 #define EXT2_FT_CHRDEV 3 #define EXT2_FT_BLKDEV 4 #define EXT2_FT_FIFO 5 #define EXT2_FT_SOCK 6 #define EXT2_FT_SYMLINK 7 --------------------------------------------------------------------------- この付録には ext2 ファイルシステムの物理的な配置に関する概要を記述 した。詳細な情報は、http://e2fsprogs.sourceforge.net より入手すること が可能である。 ----[ 8.2 - runefs.tar.gz (uuencoded) begin 600 runefs.tar.gz M'XL(`$LK.3T``^P\87?C-G+Y2O\*W.9=(OELKZ7UVKENDU=9IKWJVI(KR;M) M>WT\2H0L=BE2)2E[?9?VMW=F`)`@"5)RLIM>7T\O64N8P/CTY.3VOD_S>;_^.STY!3P MNZ^[9U^QXR\B3>GS_WS^O][;MAC7`^+5PTPKP:V$L99@N[-`^Z&=1(3L%9F`U23V@#5Y#9!O5IH6?8, M_G+FAR^![.&"[?\WV_O?GG^Y_OUP'FP\_F7V@=W]?[?;>2W6?Z?[=___6WQ* M\\\_I=U%SP\)"M8__!33E;.&'1@GY<#>_8[686^'.D<>W/>9CP(^)@AYY&_^7> MWM?2JMD+,;ZCY8N]/3'@<]>;!='\8P+C25)"!]:;>4J#=,1W9Z:P',1B?]VS M_#"U5NZ]/W\COH>;E?R6^'_A\'46?'12:Q_Q)2`GL@C<^^3-WG^]V6MFYL.( M4?^27\:P*(XUFTD.UCJ-!5DYN@L_YO,TBD&MB,\$09A!#X*\T$_]**P;,G#0 MAIKS)AR8K>0IL:Q%HEK\,(+AJL'K3?-H$RH5`$(4PZ3"3YVE-W-XF(*4^Y;0 M%PY!C.`2A1/=*D![,RC,`52**[.&T"*L]2Y-5^ZL67MSS8+`6&M_<4F MG+=;6C_H=K!G60P^V)=D4PT%N8&S%!QE#%.]5[18)+S0(N8,-*0:2184134\ M1+YG[>.R3:%%')W"3M-PF#4"VQ7RAIK^&.^K/VJ>O MU051PBO/+OPQ$;;H7Z43=@FSBX8.WBQ*H_1IS1-R"M"!QR%.C/1Z#B#,>9+0 MM-)=)S)14SS[AA7$.X%U4U3Q,$4S0N;"+0C]0C&"10X3*$)!; MCF851;/8^^SQHG'__[S;_Y;]_PRS_6S_AT@1]W](!/^^__\6'WW_E]N_^%&[ MP;\ZP']/Z-_7]._IW]*6OP`B"^;8/TZ[EQ/UY^W>U[3U\2H`NU`/9[X.-@G^ MKWS$B_X+\#U?\]#S%\K/#J/P$`7JLWFT6L-0XH0]1N&W*8-$$[R(&_O!DQ@) M&%;HP?H.@"])!YQ8ZW="$*_E.$"G[SAMS!&UU@^]:7]T@X!V)O5PY`R&UX.A M[5S>#?N3DDSG&S]`1BS9K->PT5*P-GM*^6'RZ*[7?GA/2@=OEG)0*TCQR$FS M"^[*;8(MW00FA(S- M:J]ACWZZ!%`(.@K=U'_@)`70`6T<92I00[6'O?-KVYE\Z-U>3MKLYY\SR(?1 M^&+BG`^N[.'%H#?,]:`F3^]94L:')8_%Z%:P3X$]S<&`E2F!@G@L8R((_:(Y MA%G>`<-Y6D:/;.;?(XD<*X$AMCA)I=(Y?=6DJ<,SA?5O.174,H\O+B3VU.L?= M$Q.8ABB@4MNP\!G&`])IP()^\%%0%O`''BB18)1R`$H9,HN0\KDS<`F@7&F_ M1?%PSIWKP;G3OQN/[>'4&=OO+6J\^&G8NQGTL2%;QF][[\$P?IHXTY]N;5KX M*@GX1[#_EQ0''"U_R(Q&`Z<>2(4PLE+B<'G=F\+*ZU_?7=@3/9_H.I+2"Z`4 MP(3G=(0F:"=U2NP8Q"55NN2X$%.XH?;PV-!,=""R* MH.3T!$!YQ/)FAR&#NW,@[J01%_(JQX\,C0JUK)ST94;HAQJE(;TZF.I86/*W M8#/NS`_\]`ERUF!-_N_&G\=1$BU2]MY/-F[`^G_X@W)!I(6;2=]Y;X^+=O8O MD]%X2K9#$2)L"AZ?!VH8]9B91$K),CR5694>4.YK/XJ!+\2B$O^>ASSVY\[, M3U?NF@+@+/@W9&1,9&1RSC&@20\8")2WQ=P-'-$BL@_+X\D\]M<8(N>-@E\A MUYBY"4>U1YAM87R=DTQX_,"]?SO[=Q%TEYST36_\SK''X]&86<=EX-U0!W?* MX*D]F0J@U:WHM%%5^Q):;'[SBVB(/.374"`GG%%0IE=Q7@7#NAR,)[@"1Q=V M*VE;Q39H,1EC8Y\B*B&1)T=,W*"B1:N23+5+2VQ6J)=H=021DIN44U-$$>9? M;#0JM[XN4B8AVT7>%T$H!!(]0Z!?)XM)#*7P\]X%;9P3]*I7SL5@//T)C'TO M#[I5O26/"#`6<6?PVZ7T-8$`@$.X06A'\W8EI<^**,4L623)(NW,##3]J&H@)7.%Z.W#>#"U+>OX$^2`'0.\ M/[9[@$#PKHG`36_R3O2_O#3!S^\NI&5?$+QK@`N=$?C$`!;Z(O!W!C`$:I+` M\:=.6>>(<*XA=$T(&-8[YS_!'F#1S#6B@/_LX>Q]MP5-6!N*9$($4YK:8V=R M[HR&US\)8S"@78[&?=L24AGY8:@L2)!()IQ_'MV-A[UKY\)^[XS>"8E,>(.; MWI5-5FIEQBEL9;+FB\N@ M&[*.1]$'4IK61"809'N/,3@SL1.TVFSNAG1^2:87NX)T$+JT;.O=E+8^O8T[96IN][S#96S5Q^?%8*MO`#N1PX$26'(`VCTH[S8J5>813'5@R1HSIW07?%2 MH9+D%5&!M<\L^IE3R@K%&O$8B(L6$>%CXWT<;=8.!G".*K-NPL2_A]29\CL2 M`8""7DF$O#,(F__(6.2BG%%6RUOX]3R63 M=J'>ND@.6+Z/H7T>B.HIVY?H)4+S)0<&V6'!-FKE[L+4A;054 MUE:='8,51;%_[RA;+D@&BX<[2X_6A?Q!U3J=XV;E)AB?@(NPP!.,95I![!<; MVOGXIS5X,#RULDB4K&^6@WP'.8B9!'K'39)58>9N$ Q%VO`Q\<"A`]DE3S MTQ#MU"4CJAVP2/R:(PO+VO>U@XU=:@E@?=&ZJ9B@$,J9[YB#?D+:"?+HH73F MMY`'(4G!18J"C@H%.J5V$=EU2ZTB("3R@C81)"NG.!3_M8[_86(IT# M+"9JK6]'U_8!]/5P#GB2UZXDN2A&,DITEBRC#>QF,S%_6)H,F(R%M;_PF&K1HNP,_VVPAC=[4@$4696'G@/V."KM984HU_/D_J@V%VH- ML^URD-*NZ`8)]2/*J/]U'-W'[DH.Z-$-4XVR).-!+BY*I525%:AXDNG"9OYB M&4';BR-5?M=T-AWWWMOCB6U46WFVE34@#<1'[WC`O&@S"YZT!I[.CY0F*TIV M%U@_A>](1*X?B2O%Q6JM"D$4486"E5-YM,:]\CPL-@'6EI^B#>'=1[@FA:90 M/529I8*SH+6(HQ6H7PP&9Z!J9Q>]:8]"K]W4DPT6RX\3V7AB#.$=!8 MYG.^3H76RDM66U2599LM+<:$;X&KT*G*5SN`&PR3V M0JQ!BDI>L%AXIP(+AUV#5#IP+ZJ@8Z M[@TGX);!J[4.3]K"61]7@E4Y?:OH0<5%U6CS_&;TWG:N;!"(DF.9UUHFK`O[ M_.Y*);8[./3J18@:IPYY%1;(JUY=`LIN738+O_ZJ>GLD9R=]NY;(R[XB5Q&[ MFF/?W%*!HPEG;*,.*/4MH5V,IC+?J5!`4`:NR#^:OH6TBV"O*CWM:WMJ7PCH M2?&V1((NO%RI:"B*B$V>>NUKNSXVO-&+(%@61*1<:\7L_Q)FZ)V3%8>,)1!` M`@293)U?O\O,Q8`$W\<]F3$3VDD%;?)N<.O<#":3P1"F8HK'9P+UNY+@(IKV M%V#ML(;1*9H'<7/IW.`:PCI"IP(:3,:CT=2RNA4(INO2NY1!F*U;5B:0#0*] MA%AM\XFM<+9(D,+A&ZR-%:/M7YU^/0),'L9R+]MNU[#$,&+`M32:?`L[W5/R M,DG=]&AYP!*(M3AVE$?2XE@7]QX\YD0:>)QY37*($]2BI[H>#.]^=";.X/)F MRAC,X]FQGM#GX`G,-<.K#6;P]?"=!>!N#7AL7P'USG$-&"P$F9_6@&$Q(+B. M=_\M@>MX#RY'-#(S>'(WN$#P\8D9?"7!73/X_?1'`HO-I`(??_CQ#L!GIK[C MN\E8C*H*^R!@71/L1P'KU#&\0GG.3`ROQK=BI`:&$M8U,92P3@W#$:.+,`88 MN#:"G1@8*EC7P%#!.@:&$S"UUJIMM5KP+_NF8,%M]OWW1:-L&PB`,>Y(`#!- M!,`>=R0`F"8"8+$[$@!,$P%8,#L2`$P3`5P5.U(`3!,%=`@[4D#4=J'.[E., MY:3Z64'52P]$G#.ZI7;GK8M1VT[MU M>M>PJ^6G`GDO*@#$1_.:X(4*GF,5+,"V!\2TK44'3VY[$+^*DFY7OS)*NQ?= MBLBJYE2_DUEA4I+MK>+@T597$_B2$'HJ1#W&^HS-/E!`+2F]NQ/9E`J`(&U[NX M&`-3JGNUV?&GA?SD9H11OL)L.;,V8.._8#7'>)-&_:BEGEG3I;@#E"CA1(K< M<&?#?#GCTNY-[\8V<>I-L=YZ:[5$W:,(@07M@"QD)3__B8I9%C,A#FA"A"E, M=,Q79"<%K-X/"O.&B=XF@,0Y MUU%^D4!>1E(J'HR&V2VT@?-N./K@3-\"[/'F/LS_W;6UP'D^\/+W9D\2UFZ4`IQOX\?/#C M*%SAW5I1>A`WOECJK_@1#HU]K41XT:_:+^J#?UKSV$<2;O!")3&U5@'.I]8N M,AB&Z'B?PCR'&9HV2K-59)C:4E7)^&U)8.8U&]6"U\*E@Q56[`P\-/>8=3;:#>50BIIP*Z(59TE"V'O+@B"'+2O`,HY%2=Y<3$B8^&5%)/P'+ M*M$70VR25(P<_BT*F>L@Q>INTFSWLJC))7+UH&EK1W%81]TK(HK#048HTBIH M_";#P;!-BI^=##7+7CQ1;J`[L`W#*]%V/<](>#;+ MR6;SD9/5'N/`_:6)NH[32'>M3:J(HGGN;:KVA"VX\%4;=$%_\^- M&]0HNZ-[[BJXJVQ^YF!L!X&/R>+-IFZR\D;C-EAUU3CJ#-EDP;OUKA6@:*Q- M=LK8+D9:8YTUAEEOD@VVN,T,3?UQQZV.+I]X<7C4Z.LV:X\4-3-'*?E^7+4P M^JN8B0L%S;RT8W_IG'??%N2]!=VQ[]XYO\?P"_OJ?'_)5E:X+MNB\_Q","2. M^/$.<[%!W6-6K9"[@.I%K$(WFA4@"\.*]W)WB)'_77=R`.A&%OB.OU`VFAE MY4FULAM(67PM+L#IC>74H8A??/*Z;-66>E:V^(@MMNL7F//6\K/3.C=QHT=_ M@+99!97,8B]S]J71E\9M'/'6L>8/!I<&6WZ@N#3JO)]XGOAC,>*N/DUL?,A< M@*HJ(ML!L]IB.@:_5)N'U=U6.V`92B7=I"@#?4"N9FV9BX>HU4)?+Y]P)C_2 M$]+J#!]Z1P];-GOM2+_6_$VK6MX[:T82N6'FIY3YTWA`TOS@G\DKC."^F\7- M\ M4^BN8,^.^4/-,%=K9Z?XBN+\V+"=5U/BSO:LN=N@)<5I^Y9BY%1"4:F*>NI# M?W&!L=(4;E9XCZVQR(+[?H;8,!2\#2%OB)K)J6=#D)[XWA30>%[YQ0JRO_AC MOM[*"DM=UEV4%VS@)F@6=[0B.\/+/[3QF=].XF$NL(CJWM9QL,=JMYL:.1-4 MW6^F%BD0J.RRAE>^%.*B[+TOA2#%%,"8=V:08X?` MCH)*\_M,]()FX44DF0&#@%LCSV?0MG2J<@AJMIM'43$+C4U>X]56BIKB/-8L M!0_&T+0:F>YF`X;Y-\]]==Z-<_Y<)Z*IIUH2_Z+ZJ5E5A9UT(LJ6.D]6#3$ M)0_G12P*/]=14II!`2Q/('J19T]&4M>Q((<\`1"V"RZ`/Q2,5ZR_C&RH2J?B M&<$6_,$%3S\4%4RX9LTK('D*YXH$6;=W(*T<^RI",2\G@[H'H5IY75Y71BQ7 M;(UY2T.U+#\*?TZQK$+A5U7LB((A#"[G,`UG98WG"V!H:`S-,X?6*)\/)=O2 MZ[?"MK*@7MOZ\K/W[!E(Y)C=J&M@*!Z[$THJ+G@]-\\-2!0G=J%6<%:_G)AX MEO!SB2:H?2;19!7Z<\DFR>TL'$TQ/IO@!EOM*L)AS M[<;N*O>]D;-R0S0R)O^60J"8=L=,UJVG:^2@'/%\Y.XU*-SKM8) MZZ-P$JP_MH'RXK>ZFCYLVA5&6O]B5W,I!N,>[>BPU+M8DBG=5FEXJK=^WA5Y M!W;\2(R?*FUF]EG=G$)L0C3K`G<_]51K$,S<^<<]JXZD)E9KWXM">5?%7/:N M3$HNE^$:BPQ&6"'$EXTYIU*JI!4L-/W0"JB9%#K+1ULNK!)L%><\VQ9X?J!: M/DFMK8H;)IMMFVW]O0Q?D$W^;/ZS'\VO(UEZ2G_[0_KD4*C.U!C!R&OJ`N>SI=& M+374&AUGTSG=D8$?PICP/O`SF%C/XN#Q+\TA`=/DOTQ)98/+L;4UI=AD287! M8&M$>_B?]KZU/8TC6?C].OR*CK-QP$8(T,UKQ3E'EI!7)S)XA11OUO'#,\`( MC04,RX!E9Y/][6]=NGNZ9WH`>64YFX7=6#!377VOKJJN"YSM?:T(R[0.#73% M([5M8NF\M\IM4N+JE\.+/AKQ`EI"`1D;PTXB*%BT31.0Y*^#*/H>K[P0I),BC.L$5%)$FKA%]2H%"9T!9DZJ1>23&KC MHOHQ?K#UH'?#5BQ9=LU9K[/"SF4T'$8WGU2O5/BM5GL>.T?5@QPTSBJ"5VF# MO:GZ0?K"2I[?>AU@3%E>",81SX]I/17Q>%#0PKLNW5T]';WGB. MEWY$_+2J[9&ZX,0VC*Z7-H%`%E7-5:0(D+0,=\^AKER&25I"!O@HDK"=)*12 MKH&&--?"4RDM6NBM#`.!O/:[N+OD?&T561.[FF*0-OJEA M3HM?*'DLTQ>3)G*1T,6'N![79.:TJ-^1@YD5MS2LV7A;[,*39>+/KK#:YK5+D`;*L+',&EWPCM$+U;OLIH!"9%T4X M'H@MR3?EPD]R7VT]EN>LWP(QY9N4`6PRGUECU^XRPT-J@Z52M5NPN%K%G]JF*ZM4 M:>F!/Z%*ES=+[NF&M@^VPC@U3!DK"(?9L''3AQ=O"[3J="_'-E"Y.C8^"W+4 M+E@^"D(>=F\[ M0-UE)=(M6EI%NL!M:F`2&)'5<[Z?YN*B0'-64C^J_!9^;X;Y`WAS]8W=982. MHEA$<3!\'\@8$Q1EZC*=N`4]Y]EYNR]]^F\"&?8-#6,P6E$D=,88HRI_AN;$ M7R5I9"26H@JK9=9"N51T1IE4$S"K#`FE+ER.'5-'C0` M<"<0!`OBUM[DH!BO_5DO&HE#,XI$NK@<`>7NKE-U<%0%CMEQT3YOO>R\;+QL MG?W4.6M=G`."MIPU<2#=:`30FTB&K$@J^4126/AGP<,OXAE(9UA!4=[]>Y37 MAV'0^)[B@5`K&^<8+X\;"7#R576_\)L.OP%4=+56NN@M-HGNI"5I5.VKIBKS MU,"<$1E>K<+52?92HEW0R>8P#8(W@29..R(IDY<_Q8$#VRA^.!I0D38K7D*J\I M*QZ4V!(5,2=IT<-L@TK+!H1.OB7#X3P=%PP&Q;9?5G&S=;ZL\D5'N5W]PV?B M7_GU+YR*T#D&*S$(RV>!6I*9`X[SBIR[\G%9;:_D\00+ID+E$5AEKR1A16_7 MK#S.8T&SGJ_6K$43]VULCV'H;.RJ;-7RJ50C65J]?=9@KM:^16.YN'W/'>V3 M<5!Q8HEO$U]C%"I?AV-V-V1%[M!L$OP6&P(;1O0<_D"9*?HD^#-?.BN)S8+G M62!2:#.BXR]KN0P=+0.1+>_!"DRJV0WX#=VH05/MOE"EJ89^/><4B;)ZD[_J MIQ(A_I:\U`G,TAD4L2M?.HOE^O.IGU3^5_[Y&?*_[B[,_[XC\[_6Z[6=;'B9:G4KW+B--X&%C1;K7P=7;1;,"NQXUOR'_64^'I1"M5"@.I M),TV2`LDOQHI%]/)_I(LC,FS^3B$Q_8SD-FBR)=V6.3S][1>GDL7LO#P[/6K)S2;S*=H='!8-[BB(%^30(,X61 M?'/6>=FY>(N!&O%;LW,!H`\?>A23+;?`4::`6%+BW"AQODH5?S4*_+54$O\C M9!7G9Q<-\50<'YRV&P+$-!Z`PU:S?7[0/%<3K%8%]@X>55$F.R/*(D[ZP7@6 M7LK4&YP?M@K'63_X(%)%FUSX0W7/*/_2".=95L7-<:<1@G*U)976\BJ5N:UV M%E=:RU1Z#N7J2RJMYU5Z3I76_KRXTGJFTK]"N:TEE6[E5?I7JO1)?7&E6W;` M5(H5;T7C;U\<_M!N_%T4JZ4$#A>*$;V5%HQ';OEM>'6HEHK*P\3GC@JT3N3G MGP5*]/+$NR1;ES>U^EN=-N92)IS'#"NI0+8.3/B(ONWGU$<[`!,_>;)*3VV& M[;?[WN:FA^#`6%G!9!-08IUE*B:$5JEY*0TS,:Q+V\DMH(;*1#H&QV53U[ME MMQSYWSMWS0`LSO^^O;>U4Y7G?VVKMK>#YW]]N[X^_^_C(_6"%&=?KP+^I=>" M5&=G,L'7RYE\\"P!C3Z*0W_:%\4>_/N_(S\.*V%W4KF<8LHX<>IW(TPK$4X# M.#K;)R"XG(SC63B;S\3SH1_&@7CEQSW*#2A4&4TP&-4.A/PS$ MX1S_+;Z"'['X\:0DFTG)8M1W5[]&X3C\8'8LV[,:]:8N!,;]C\5Y-'WO#_NQ MS0IU.#XW"[)6COGTBR79H4DW?LCZ,DYUPPV5[PV])5Y'Q$$O&I,>`P@$%D@T M0G17Z8]GF-U`QK_6L5DILX<5IE7HS@=BA)G(![*@E!7- M$@YD.J#SP7F#$:H"R7QPUC@\N3L\U0$>FSWBR M;'0D)ZLNF%WAMX\PU:CWX,\[F]4GF]4_/TB_QX0Y)ZTF@%0K.]T'Z52,+&:K M*.-F!9R+5Z;R\#Q!;,ESOZ^&1-Z#I\8`LV?(`GPZ`_')`3TX/.V<'/V-H`6Q M`O!D`2SE]R'@[<7`S[$-IZV#H\89PQ-']!Q;,HQ(6G"7NV@>-4XIS#>5VL52 M%S`7PV!FI;)Q=[R!F8EEUYGO4\G<6)NBTE9'T[RQ4W&5J?8GB.+_9+9(#8]L MR#%J>2BWATHB)]_C(L4DPKA%C>'<.0/V=X<-4MH\193=C+"[XK.WL3@]G\#1M',(OK2 M[TVCC7#,E((N&2F+&6!BVT-H/FP8J(J5@^U# MU1;$=O7/NWDX3ELO))00F#Q6::1^:)PU85&!P"FL):K18BYK$&?B4J*=PQLE M=6VYL)2C'^*[[X1$-HP&G<1&TQV#&S91HX,S1A@,K%958E-PNFUA6<+XO2'' M12B5[('#,/VWPDJ\<7*_N\*P=9Z?G+<1+V8(G',(G)B&5; ME=_;%.9YA:VHNA6RZYUVM#65:J>5]<)*<>Y`(=V_>#[-DF:>=5=!5@V3\M41 M*=ZNMZ@&91J\[PQA+PU50H:$&P4Q?MIRH8$);].')(27'9P5W\PF'S9#YC(WG\(_S.2]"?,N)5ITT ME5B<;(-$@P/1V*T*C%;5=OD)3-LHWC?0X(.0TF'$*A>M@D5^G4#/X0L.1:!J ML:#\`0%=Q#A>4\G7A*2XF66@)WZ_MF^U$1V,"<&KB#)/8IXR?"9K4RIT.+%O=?6K-U&8Y9F8\MYPZ8 M@KPX:UV\8E@X2RE)N$462.TZ4-2=]P+F[(`K[";LPR M_L?9KD\;EI4YQ62+E58?*^<(673^4&D-Q#08DB\=KB%*/)K([EF9MHDBGA3! MO5K=?GG2/.)W0('2T#;DD0E:M`LC`YEBBL^SX$>+X)NZB1+Z/`5M903-)+MD M).W&X=G+SO&I9]YLH6:V'?204))PB_KV=,&+9J9<79CR<+H`)3=*E=C&$BH- M$PN1&7GQI^9AJM03:M_'<>]J&HVC.1`'BJZ:%6-/7KZ\H(2@A$"5KU6Q_,EH M-&<:ZJR6TQ#;%=>I(-FZDUA*!3&W)F9&QK3KF(PSC0A6[\7+5S:B;4+4CT!& MGXG^?#1QMZ'9.C@_>=FPRSXQRW+'A8]W@5C<5"K@:6EF^IJCZJM2J62J(0L5 MJY*:D5HRF;OGIS^8XP@2-[:D-::C=Q1-`UT=U-X;SF,XP;-STFRIA9!%0X<$QZZ+)[73@0'36:#?.?FP@L4A)&S4,N_9E'-M0 M=2X`1^?'D_8)IO65[3DZ/CX6BLU\'\8A[6*:SW0;%(:7K:.3XY,#`\F3JH%D M%,&A$?H6'DD]PZ@WHY1YP'GT'03TI'6(N;$I:9WGP<^SXK>7WY9%K4P&PZ4L M=-N$?LW0]5QHP*TUM(S]_3+L)OQKAM?XG9RPLN"2B83[87R=88(9XI^*EPL[ MF+^,.=)CHH-2`:G?S\,^OSZ-;D1M%UG<&&MKW8QAQ"_"OL'GABR>$'@;U2LA M7_#&%@R1.5-@461/0_0TQ"&Z?N,^S\",-,Q+FO5>#EQ?PQVI,_#<@*$^#G+Z M^(+8TY.^!4SJ3(-5/B7UIL4D4\7,E>P;`D46AE;IOAY\O6B]^1@;BO>]O%&3,8N372%.9#(O*\EE$,M,\ M;I?L,42I'.3.!![5`M82"*<:($D=GX:Z1+6=E)=8`R3P"2[0A3/RQ,/Y0&V' M79@UYU+*3>!XAYB`I(C48+3&I$RM'F!!V(>=JW!P165A>\=H;'$9!L-^C&9" M9GD$'YC@-YB!7,UH_4WU;0(.73>74]U83G7'\GCB7:W8V:L5.XMP(W+&Q-;: MSW6?[<>#U&/H`S[VY[,K13E3RF*82G!C*]ISW0M89LEY1Z]P$P@8ZH/"Q`883.8QN^#@QG@_T\X'U7$U\!K%ZD<+AA!UD M8?6\9(#U&S1K&5H#_*)Y@>-HH$F(*8\D$=.*36;=(TGKLJ+W4,Y(&E"L[\L; MF01PZ<`DH(YQX:V3!N2GV0&AM9P:DM3:XO.B,EJ^MGAC5$:+UY8)E5I;J3DU M(*TY59Y7Z8V3LVT,UO'8N!3%])N!@WTD9Y3.<5LQVS6^4Y9QJRA$'PJ7Z6)D MJV84HZOT!HH[Z(4Y@Y.*&7*E4",&(J,"D%<+E$B=,H6;C3B*!+5B@S@CBH&5 MY:^Y[(NS5R='LNRVYKY8LH[%33B[2@2<;Y7"U8V*[#`D*KKA;DB7F7LV;'& M@K1E3IKG(.4>G$I;X"/R>)['*,(`M_H>[1G((2G9C,^#*_]]"/(WQ?Z6VQ77 M-B^,;".-17W2O&A(`V"]IH,/06^>TM%9!7$U2_M=8R4'?G\CLFF+54HNX*UD M[>8`2N,ESW,UUBEPXDIFL]#$Z2DOI(B^<8E3]Q/&74A:/HI3]Q\+1*FX,\U> MEF@=FNO"A`K=\I(E*;/Z'0N723EL25D%[7N.4*'S/'5AE+932*3(A`'M=&(- MJ>]:+,5!Q MA+@.IF,8\7X4Q'#*4=GK,1R3?C>:8W#3F5(,3X-+/`)GDH74CE?*[PI+TC]! M_3+N77^+Q]$_YB''P.4AI`L%]&CJS?:Q[8!D>%C1Y2TT=S6-)HOTWC2KIM&;AD%/3[@`3Y6#G?+U/&4MS@? MHX;#+C0_-H-"6(WE09%IQ!E!SJIP%5.#S`5S%Y2KZ#2R*D7V!#?)QF(43P## M'';WF]KN6]ZVM?H38G'G:L^_CX9S2>LIR5+I^SJ`GKX(IW2@A M&<`(W'%%&/K'Q`0=B\D=AV-%9:_H'E+N=GD)TC@XOSAKT"W>P3G9+RM#*9I M`TU-<@GOF0>I-+>I_7F/^_M*^G-)JPB\P);\N>XTZ17S#%SE'?USE.2\XL.T M1%=29B8H4<4Q;C`Z3.;RTBU`!XW!U!\QS9_XL!6@-4#'_;&,&V!&ET6BC,*$ MKTXB*308\@+LE'.D;S?A<$AI:F^@,NP>IGK@+LR#,\"]5S M]"2"`O7,B^.S1N-Y&\IL.2HY1Z?D[21V@\DT.1IFVLVR*(MV_H,HZI/+0!'( MV""$95E2E]T9B3AA=;P:4? M+U*?N!!>6CBPG9=49]KV#?ET72D=%U8`SSH'Y^=G2JVX$#AQTSEJ2`WBTMZ2 MC8?2&.8,3C*[[5<'9^T&.\(L')^DR.G!V8L&!==TC(^K`-NK0-O4^+@+Z#5! MYC2--ID-+&I2LHB@+><_O5+F%#D3IL'/&H>M'QMJ!LCLJQD$?>3[>]'[(&/W MXD"AC5R0/GU09F#*`4J>HED3$GNVD&*D*6^F)@):W.VE>B MJ5\*JB>]9#@RD@P+;-) M\"NWL77",I-A=O8``N+=Z)PVFJ*^LV.;O"?I5;4RD$Z1?2]1`IH7L2D9MJ^>I4_]<,_5DR41Q5`75T/U/F[D&&J0E\\1F;^2P+$0+ M->8X1LA9;K'!#[*N:#9(O"<-541*"/W2,G<;1S>5[.H_/N]<-']HMEXW,YSA M,9+/%TS]TV29SI\,:WB,UWEG2"C3G"&\>7[Z`[P1R!NF7QV?'+<\;R?SO$TV MR;O9YS^]1!=,S]M+4]US=LO4+)8R-.V\.CB2EZ:Q8SN@UT`7Q.@^>L''TH>] MV3IO/!4G4D/3#8"8C("HA9,AD99MQZT.5P24,MU)?'/6NF@>"1@`:.V0ZY>9:3?;)TUSCMX**(YT>8C\QUR M72?/.P2"H?XQ:7((S0HZ'1C%B$.\F1;_C.P`Y@<_"J),;LU^;^@,H-Y)_):T M4X'4J%&0=QG.O$OZ!C>&[H!"NEO![:VX]GAIB="IK()V;%B%"@A<9]#OW@:1 M;@FF!V!0&<$]W2&K2A7CGNWO'I63+Y2-RA'[VKRYNE45Z4BX"P=!)F8SJW(- MAJM]G&Q+WC=)MZ@EA?,2"<@GPS&L3X59),?-)3I@E.39PLN&M!J1VLK.1JRZ.:6^\):;4U[1 M+MFJ!BR-#.>1(4$):),4;5\7%WWPE-($DS9/IKY3O-&-8$V MTI;FK81,FD<9FD;T@7!O)7:/6+8[38J: M),!RTI)L1D03=T>J6)'WT80K_49FL\'UZ$YFPW?H[I5KY]!*_ZI4*B64,@Q& M1A2+4LM9G$RA?Y=EL546VR4CO9/!(AFK@&QJ5FF#BD6_2E,2!FI9HXPU[$_' MJ`*XM_%(JF8'MHY4#N--O[L59JX]>R.Q'='*%(SWZTJ%C$.,;[%SQH=(B3J! M,L3)9C02"K.@"67.)U!VGSW2^"^G,>JIM!"4FPH>CI&!S]D.ZK5[^VL?TI@T M#FS4F>PV):5DF!.#!CBW;7K#9KB(A1N?T&9W_@IUIQY*:O%Q9&3Z6Z5^O(R3 MI5P4R,8A'4(Z\<3O97'YT23>-VV-$^F0-9K)BU3\-7S]I>/L_5X_,OXC_IGV M-S]/'6CSDQ?_F;]S_.>MW1K&?X2_>_]/['R>YMB?__+XC_;\O_2O`]SY M=UO'DOC?M=UJ'>:_OEVK[>SMUO>L^\0:]7.&1/\&?>QFNT3]F8!'U_/`.Y8&,@-DXJ%17?M7!Z MI"&'07TBX%\VC_D:OEVBP6BAT#Y#M$SO*KU"X?E)$WX#DFXXEF2P4(!JG@KU M@_\^%7\J0EE@Y/]4/#PLP2]N%GS[3FQ$\!LPX6/9B%*A0'Y)3PL>HQZ)C4OQ MZ%\@&Z`]8D65^,*-\[].]!^.@37]OX=/$IE8I?[X M/KFF>GYQ?-PX:__=VZG5"P40K@IDH"F*,G8WBT#2_B>BKS7/\^^B<4FFRULTATD0);%&(&##^&L6..D M0=2VD1]2)AP0)*:#GI(U'\&/]]10)=?$'V-/7,;[\LDPNKSLS#RAC$4Q"]UX MYGEH+=&YY/3#8HSB*'^=13-U9>JA5NV-&J6W]/X1MY8,9S'7'6:TP_:(KYZ) M.B:VHR[CH_=OJF]1>/0V-\4[O+7C8#1C#'8][GVD:^=K"D8S@@_]*..5TSM_ MXH^#.$`C:J,R\4P0TMI;B1/STM/U(<\LH4?)/AP/N%E,'#E_O8&HK**"'+SH MG+TN5^%_8HXALY/T]&7Q\#(NE()I%['B! MWMIR?(H\U-"#;%M:G;.C5O/T)ZCM.U%=KUS6JZXL MVHW&#QB8!#H*2T4]MSJ<]+?GHT4]H<([R6^JP[]1EXOS#JD)=7%GOV$)8Z?R MN[&-?O4P.C=7E#\!U<24`D$JAF9]="EX^%"%5B)E`3D.>URB6*0-PVD>^[JS ML%O*,K)9$;Z7H*O?JSG%,<)V;?!>2UYX5&FQ)HO36^H6=6/C&3_A.`!H1NLJ M!)!UP3+(Z'R9U51AX0C!,?UA+X4'[R:1MUA,(*IB*YC,0ROB5#]/*.% MK`HR`?K25/S3/\;YWYM\8?E_MU:K[^SND?R_5UW+__?QL>(3T?73\1-<*]#F(R^B#U@WP@8I8AA$$8_1J*'BH5\?:AI@\P'@_F7XD/N,C MY=X6!60JQFS^AZ_)QPY[@7W"?LA_1C1!]+BD>0Y]#,:`ID`=L MV##"4'>C:\D@(`[E/8&C,D:[?PRPEM@O:E@X"GM7T&YV-J+*;J+IM;@)AH@# MV]F4GGAL>T3.@-$P1K\?]'A")V-VG3*X.*AU$(5XV8L/9],YM%-5B.X<71IG MF;/(O,MA>I"=A]H+GK86XZL+&!QL)_XE"S3IF$#9.U1/";(B M*)J@#/X%#``V0L:\@]Z(2Q_="J7KS.4<[38K_\'GY1_MDZ+_].=^Y?]:#?YO MG/];)/_7MM;T_SX^?'/I`U>.>]A]$+"+\GL9'I/]SI!Z(PE`LRRZKY-Q$1/[ M27Q8X9LYAX[!2,CX$=,5^93+L6!>25)<,D##5T%[;F(H%BE47F ML0"I4WPW^77PO7B#5LAH1/U6O#&5%V]1?$`I3=>?P@"?C0G]FE?$O4+-`?1@4!*GIO/1)ZHO:\!T>L[#PYE6:EG M$$6&IW7\3(S(G*>8X`!Y]-DST;PX/5TH=N,(CT`P))=<"I%-ME4Y*@X/0%'+ M8-1=%M6R,*HU&LA#]XST(-B?C"[D]9E#$Y)N(:E^I!8DA<6I$DC'C[$I2N7ZG?&3&'*4VJT M45@\-E00LHSQ"+4,/"Y<")M1-89$#R)K+!(@<[E82Q2&T/B=,XCHW@+#R':A M2*S1RP:+E85H1]/IQTJN1DZJ-B0U2/0B\CG%+I()SY?0J0JY>2@U))T%2%70 M(NEV5(5/`5YXZ:BG3',2DJ,I3F+DPYPJ?,FG.3P)EPADS,%#5;`D%JY670S&VABI9)/!/-X M#O',',_]/,!M`U".\VW(*GG7^T/6.#Z6!1,Y3.=4P2?2Q]5 MX$!ID=`B&DEIF?$E1+P.4Z3V$6`D4IMZSON5]_B^Q48E]$%J]*V2I4_@I;BD M-25TA3Z?F)2AR*=85=\DI.K=3S%[QEY,>L^[\-=6Y_"L<7"^XFY\JEDJA]I&VD+[)>&306R(]Y`5#O_8=*V?1-:APWH/2-:@U M@!XMDGU,A4V\?(\H(I[SP+.7\5((IXP6@)0!6:$V]`?$-%''JY@'FY@#R1HD M0(&Z.TT6HUQ>SNM33#IY^H`)0:-U+$_0^":<]:X$ ME))W2#T?AO7;P;=/B;P#GL>/Z3Z(1A?:61*RA_N:_JNF08U0%3_7UT<2X40B MA,(F0L!?$FHD5D389R]TQI>^(_8<5U=8T5?)2G3<+'L,!/6%8[Q0HVMHS-SN M`'5<)'.YQX_?JAVUVGVQ6'!A?$?WQ09=,_8T,6NE4JI0(9EB=7Q5I#MS%XUA5PL"4IF1I=HV$=`)#]$'Q+/H M1%$7F#RN<`J/.!^`X_XRH1U?6A&U_GR1CZW__:+VO[5J;6^KOE-C_>_:_O=> M/G=GKWFGF.[.KG6-:35,=S=W=X3IL]O_XD67P_ZW-S'L?_$'__UCV_]B"S]; M'2O[_^SN;&W5X9RHU7:WM];V/_?Q,>V_1U_4_@O/__KVWG9U[?]UCQ][_OG/ M/=O_5W=W:WK^R1<`^+_M]?W_O7R<]O\92W\QL:[*M=5^QCZ?K[>U>3Z)EWR? M_$FJJ97,Y\VK%=)-*#OXE&(""E=);WAGQNS*"%AU4[%4*/PK9:5+/5Q.E)?. M]R5#O"\J^5Z4/H><;N__+R+_@0"XE^S_;=[_6]OK_7\?'^1T"\AEBR7,-?*X MII?<2*C#(F&SB>O.87NMLFMMT^_E(_<_&ZW^'NS_MVK,_VVO^;_[^-CS_T7H M/Q!^TO_M[NSNU+:V=M?^__?XN3M]S9UBNCN]UAK3:ICN;N[N"%/AJ''<]IY] M[6T]GR!1O`U7Z#E,R]_*B*V4JZ&4.D%F0Y6>A3M7_[JC*Y!+K(?=;NH M.VP]_[^D3)0M$Z7+1(7"7X[.VDFAJY0"DA]+!:3Z4>E5(J5^A#^(P:&&W.B1 M&O)_Q9^^*Q2X*!:"-BXH)-__Y^HOUY]_[V.?_VKYWVT=2\[_K=VM'8/_JZ[E MOWO\;#ZZF\_/A3M"].@18KJ#)868?36I^":95*DVQ!S'5 M"I=7T1XO9;SZ6&8A8[M,(76K&%L2U9ZINA._'C*:2SO[2.4KO4/5ZR99"V5= M@C;>JQ[(EZY&DII613&@MBV+HL)&@?L.,T+VPKJ]!=_[Q'S/LMYCX[WTX"C3 MN_?2]$[V49G?22LY9U^=1G:EQ-1KF;G<*G9R&%H8`$7J[YU:T/4C%9OW`<[6 M@[)326VKJ.NE_8Q1&H58Y0#5Z(F@W`\RZ,6#0[*!)5-Z";\`^\B_#CHVI/YG>Z^&<,#_[>RL^;_[^*SYOS6FWRVF.UI/ M=\I),C=R=M%L4&SI),EK\H@S[]'-)I\0)\W#TXNC1AOS*1&OJ7W?9_TP2KG# MS_K#L)M^!FS=P'X&[`&`VL^8N[*?7?;&LZ']"#/-VT\X*9+,VL$A`/4[/O5L M>'[VBB"IAR\/#L]:;=D].2#=X?4OY%=8')7%AQ),*S"!\'<#6`0K/V8X[LQC M">6I@QXSS^(Y+8I0IHQ%2I2Q#[.'83XGS'Z.ARZE0`^&P<#':"G^QQA=4OH1 M!Y4)XS(E>#J!)Y*#&0XQK1Y`8L;U"/[&&+L&1D0&,!@9X5WB^>5EV`LQ#@L? MXV&L$D(Y9`;5''[2:HI79ZWS%B:#:%-#,-DY::92(A3'YYUK M7!"Y&C07N2I(>J4HL[;JL^&\;AW"KLS\;W&-$.55VDTFE@CD],W/W\ MX(@#5G1.3]KGAJB/`R%5;RZR3F$Q7`,-G:?(&$2F4?%%7W[11[+GA67Q;C^C M/TLRY6C=F5M=IG#_0H[,^H`DU\>J,0<$4UII'B0ZCX"9?"8/TE^4BSV]H]`6\`Y(CGB,IQB#/])A9W%P]!)B`!I/O4;XF2L< MT-+^251YJRTOTH4J2,:ING**QH%:N'?D>2U"J\?$?L&S[XR'R(6)=X\?`^SC MQZC84HC?O,-P!++O(MPO9%8%#H;2%D.;2>EI\@-%-<]JK=PFH`%2@L)"%D2N M9E>K<)>KQEP6:3/SF"K/6/7F$::6[*+HZ%"&"[40GHEOAG-A1:.0KUPE9*`4 M*)(I889#^4H-M-U2O1R2YK([L1OJFPE5HG'MVWW+5^*GA]ADX-3J6#"\\KW9 M)BJ9+-VD(8\?/Y88!7YU#C2^3:+/I,7[;CY/_8QGJSNI8PO_M;56KB?U?#>,_[U37 M\7_OY[/6_ZXQ_1=H;1W2RS+UD,`[Q$7B2_HXM=0\P'[OWX;9EK*0DIYN)^/@ MB8TE95@H:$)&Q)'<6'+-+84-8N>ADB6U('\K2W3BX!_,V1+.G%H*PKRUE1E, MJ9E1/UBQ4NJ:&T-^WRAZ%N=6Q6!H0-TYPC5%)HSFLW!,*56Z0__*^,?4[;MX MXN]MEAB8*WVGGX#4I0\9,NW$KE>)0U>\YSZQY1POAN96%$/Q#4@J=`F=]3U[ M\//XFTIU>SA_*F#X0PX#E`'Z9BX,IO%-^%89-*2CS,A8K_I"7;:;&T2)KV)Z,(JF'_FZ'%MKGI>$ M;*0'T&'-+6O1NAL.<-W]0L&O3ED#C/&19^$@FL1.C"K6S1%TH:&L(6<+FT>>9YHZR+BW_`A^ MPU=ZODCR%\LD?[RS2D+0H8DU;I_W_C3TNQ@=GH!4;PW)V=:6:"4_R=MJ&%<# MYUE/JF!A!(T^$CQ*-D\KR_$F2<`2C*$?Q#W.-D_T0=K@J$E'DRE=T6.[(GD>869C=>OBR3A5NOCW MSB)47R4+-%X\OZ&?5("FC? MZ]E7\7AE>#<-IH2_,+O^/1=%M]4%CVM/N:@E']2O64:7TA11(>NV=3SX;8%$]((66L88/,_*8H:C(8'I($3(0$ M>[1P>"VMLY#ML+K6NH:18\><7L> MAX]5G'T;F!:]!5E\MU$KY4#+#9!J$D/]QDV&U^]PH.GA;\ID\S]/W_)[^RC_ M_Y'\\CGJ6#G^3WVONE?'_$_UO:W:VO_W/C[I^5=?[O(">%G\ORU<&WM;N_7= MO=U:C>+_[6W7U_J_^_BL:(NVR%;,92JF+(P\K_6JT>RPTV71M'+_-?EQW#H[ M;)06AHC)#U[LU,X,=4:-)':,.[KS!7M3?!-SJA;.TT(2JQE]5UND[^PX;-+) MG%_'G$DZ3$+$XG@S=JA69<#/!N>ZVEJV2KO#'4Y=5GS8'>+=K`LU02#N(LM, M=.1BV>4F]T[ES=!9"X%B+2I964974]Q:T:A?6]F[ZM&1_F032OE[)L& ME..+K"Y((IE$0"J#:9RDD>+L(_V@@ON;\C*B":W<80A0H!2)(-I0&NMXAOHO MS*,1"/\24&&QL;+,Y5R*ZSWY93_I_?\Y(L`LC?]Y% MPV%`X0OH_IPR4W-.Z_@*TPMR0FD1C2D+-XN@!13()D/_(V?1]C$$P4=XA^H! MN>,*A=>8*?QC-$>7FJI$ M);WEQ)^L6A?B9,9CAWG1N4UA//YV5O#B^60237$X06Q%Y<8,_@OZG*B<(\NG M^XW)TWO1Y*/,Q$UY%5$YP-F6DE3@9AYR07<]!8]'&I&513JC-Y`;=%4'.)A? M:!&4_PDF`:NC1.WZ1H*S``J9M=U983?H^7C783O6B^$G.>)P&G5`=G?H`,28WC.;C/EZH]ZZ"WC6E.@\O:;V`?#*5*2TI M?SGJ,*PA(2B:60.TX''"MW'V*EYVB+)EBG_,$7H2Q9A9_B/F+Z?%2__`:JH4 MO"/J:S\2X:S"LS<=);.'[O_!,)@E.=L6#J$<,IR2<1#T@W[!4Z.*6XJF!9,R M?Z2^)+TFQ+B[(LJ]*9/;44)Y:E'?:A'%;+"*A6-SP&B_HDX,^H3P\:R/F?$4 MMIMI%AMM0=06CJDTMXQ+&XBQ/M5;+`[32:,,PTH&'E07+HUX'&+V7#&,!G&V M@4`?O*]%'(V"C@+<"$4PNZJ*7P6WD*.@7/7]6J&0;`A<96.]S/!R'VN\`H)U M@^0'A[>+_I5C'A6#IE"OB`ID:<@?3EPUXC_?3+]P_-?MK5IM=P_]O^K;M9WU M_<]]?.SYYS_W'?]MJV[._Q;%_]A;QW^[EX\S_K]R#W]^<7S<.&O_W=NIU1U9 M`<9T(Y.Y4JE4HJC54L2YU8HBG62))1>YP=F+_.(I41DC-@ M8M[X-VJ,WSK37ZZ0_F!SD^U)T%Z$U*XS$'0_?AN+V+\F4]<1?.A'&\EF42<&FXGN"9(*D[M0E*1I!;7 M+4M$'S+&@K:8,A"Q^,BEHP^7%`@7Y+&V\L+G9[&&INSG7-=^AF2F%(DDGGK M[Q33W=UKK#&MANGNYNZ.,'WV_)\HZ#KR?]Y,C?R?^(/__L'N?=:?]6?]67_6 1G_5G_?GO_?Q_V;3+G`"0`0`` ` end ----[ 8.3 - tdt.tar.gz (uuencoded) begin 600 tdt.tar.gz M'XL(`%LK.3T``^P\:W/;.)+Y*OT*1'E)MMZ6["LK<3:QY1G?.G;*5F8R-W&I M*!*4.*9('4G)\=[F?OMU-QX$*ZV M_+_HD\#\QY']76G@&^9_J].!]U:KU6D]S/]]/&K^?2].ZO;W:0/XN;G=Z:R; M__;V3AOFO[.]L[7=[&QO`WQ[J[GSB#6_#SK9Y__Y_#_Q`MN?.YR]C!/'"^N3 MO6(FR?=&^;3("\:89B02]63`@*X(I@CPL:GE^Z%=CKU_\-`M;T1^I5)AKUZQDP_' MQY5BH1#Q9!X%]-DK%J9\&O,$2E99\W.S665F.:BY$/FU/4R#FEO-7MI2;8^0 MU>UIN`U5A3T!LMDP6V?0@X(;<>@15-];0N:+@8^H7V&UOG;"4=2"0_&E6/2" M)!U!RW'*2P.,O17E(8W&%;\*&QNA[Q`(X`*U%!CSJNP/;$%T&[$(YE.V]THC M)/JDRC&1(:K`[BFT-W'TFCV9I$!Y.G2BLS=W4^,@RIN#FK94TRV93:4=HPPQ M7N5:BR;A"XX\]%!BCSVLL5;/F&I,>OR*-2OL^7-6/A^<[;][KS'YW;NH`C95 M'&"8[716L^2"=;RB.O[YS]5UO%154)=TEBR\N7D!"'X&"&<^PSDU":C9$WWX M(^T#I+AAQ,K8K6:/>>RESF'>YJ9H!+&[L3OF<#6IQ75%]F0),1^(B$>S,()I MOM3#7#"P2M%A>T!FS*O5*F;'O0N#GG[W:JT+Q9"4\`=F0Y,]D49#9'!#DY@! M)0=+V0&9;Q4_$!,@R7M:FD"B'B+5INS<[>,JV-P<(!J[?.^)P MUPLX.SP?O'D[/#PZ[K-28Q:%=F,:SH,D+A570O`$`!)K5-(V")#W$.F5FDEGLV6JYEPR^D5-0!*J"*HZ2&` M*-$D1I5M3$VCQ\2DBL)A@\VTM)(2>5K;0[S<&/$08KP4A`$O&7H)962`JB1G M*06H90N!J`'+&^I&U@L4(&%47Y=A1-L5I?NPM]+P0:DY@P(T`&P&,A,'E&&2 M_"!U0SI:)D!6@&*-<3_FD(Q%19HIZ-10HN7C!5Z"0QDO&8UB4''FH$8D`1Q! M-[4>750G/!%@99-48!"CTDHK4I@0Q<+5!*FF7`85S\:Z#A?*/$[+J$F>4A$> M.!K,4%ND9;^L(Q\PCH&.135V&(!B$`;2S$HF-!_K"*9GV,X66G9DY"%$4H`O M!,-*]6@\IGF3ZB\=TXQ!('2.@,=:RQJ+*GL.&JS"\A8N*'_9$*GN>IS(1@5Q M!)HX`OC#>99DH14Q-6.0GVQH!5($GK:FFHO@RP0/3*4I"\/H%\6P%I72^];! M5C2%G=`3EI9;OR#1J"BN,CHK",/$#&O\9CH@:86DCX,C)1B:/D`&/O]SN#0!01U)TT!%6*WR:B@]62?&%KX`&O#(=J&#$A3P"G)JVZ MII87(+"-B[Z-&GE$T] M,V]S$VQ5S6]EP:J:#0`POYXM"$'+EC#M1Q$T?^4EDUWV+"94L3C9M3..F66J M1:X-5#VRFM+OSYP+*,?"`$='5^%1+55,J\A>F@;_$Q"KGGM'IN_#\RBU_]]9 MEQSIX'NT<8O]WVIU=LC^[VYUVNU6!_U_VZW6@_U_'\_@]'WA5:%>+Q;W]^'% MMHO[I^\'Y_!:^Q4,2%:;<<<*T%:I_4I)Y]?M8O'T M[7_F@<,4.#2`PV(1L-V%AJ`,:(:_,=MACF5'UV17@2*9`H$S@)%Y`;>C<$W> M)50_M59E`A+0ZWWJ.PU)A=5@ M$$/V]&_LZ4M0]#ZW@EU0JB,O:$135G/9QO^R#>C).N2IQ%KTS=P5'1#910<& M3K2<*;#8D6C*_3QFW[/]UV!^5_:ZNS`Z!M ME/^@`![D_WT\J<<%I'N0\^NX=I#X=^?]21RP09<]0EYH+[4"R>3<^09/$:PD M.=B):)]35W"I([PO00!5V5SN-KC3I,KJ]3K9[`M+[#19,[$/`M](#TG9`B,4 M(-$(E9;K(F\"4T46F;Q0#"S3,GUD7!>$P)45!;.!3X9R\I]S\>#8:';XZ./YSU,VM]M1`U5_K9G3M<0J>[33P1 MZV>U4919LHLA+HELYEJ@CAWLDMY%Q)K4S@FT;7@)APEMRXD)@6SI@12MSK)[ MKRL;%?EFHW*_N0\XD]!&& M,QZ4#9@J.QV>'9R>'/^F_`@`]I(U4S>&7@,W. M%L9_;;5:#_%?]_(LS__=>P)NL?^:39SSG0XL_>&OB_$_G6ZG^6#_W<>#JV:] MBAW\I(?;P_,O/,O^?]=\+ MF<-G$;>MA#OHTG*M13B/6.BR$1@W_)JSJXEG3Y@]CS!2P+]FLRA<>`Z/V32, M>-$.IS.?)YR-O,"**#?A=N*%09T]B)-_TT?QO_;O_3C[K[4-5E^WN2WLOZT' M^^\^GN7Y]Q(>@0BX0V?@;?)_:WM'V7_-G6V4_YV=UO:#_+^/)_6C:0H0<=L4 M;2-(83CB8R]((VX(LK8W"V,*DER.;I&.#0SNH/""M0'>8F\\)J9;Y/Z6#NY(` MM_!_=ZN#_^WA4Z.1!__#HI#_\Z?CT[9OC\^(:L?!D M'@!\'G@Y0,]*K)3I1;@15K-T?D/*`]W&\G$*X5G5BE_+4(QMP.`P?-X%M171<< M2'L',#G>BO&4PYD/U5+]R'8#\[,Q\KG\]?&6\]@:\[1IO952+)0^)?7PM(PQ M/)73L/XI*$$:@>\R\<'@@=R7GNL'\<))#@9[[/<&M-F8.%;K(GUO&^\G%Z+P MIZ3FL4\).P*"FR43L5L=>\%89[N8?8@KE_@Z3OB4B=[H_`GF_\S]V6.=Y&/2 M,0;<>T&(ZY8R!:U9,:L%K+:`OXJ#V)&17$C<(XKBT<\)E/$02[>M_#I.^9%<5\"*W$MX?6V4;THMF68-/(GD1E*E)E+QHO MLL&Y&7@\2%)0(8'YFM[]=O+F73\3KO<*@Q$QTH28(1,1;(N(X'"6E`7FHOV2 ML^NYNQ.@^V1WL;M[L#O8+0F$^J>'0G#$5UX"B^FR+3YM"]!YX;S8Q?@Y;/GH M?'C>'Y2=H>M;8Q$#FR(`[X2_.(PBY5DRA3]Q#D4*O^?)%$2?(?F2J3QK185F M"4QR&7`'I#'V<-IXYC2>_5:J,B@H3[2<#]Z<#8:#HW=]/.4UO:0B.IL.MOS4 M'QPJ/&EHC5-!HEN>Z!8!>C% M,1[9$<9NRAFGYB3S;8@TL/&!0:&XR/R**3I8&KV#'\QE_9.#KQB^@YLZ-5CJ MU.!'DL37]6BPND=@8UIS/UG/N_),)PI;;`#P\`*G1PDVGA%5":D0KZ@C*K8X MV(=!V)@.;YN;-$0W"AP*GK8O\I;2UX6%*XN82J<*S]`8V@`E,V?HRJ,8RK@, MY[Z#]B7E4KBVM'E$L$)J(W[[9O3R^N_>]_]:K6XK[__I=A[._]W+H^)_&_5Z M\R$MV2CF"&O$H:;"R^<7=F-/?\I%0LBA05ZPP_9R+F680;UZ1U MC9'&HF@6#G[EX%;8'04LKX@J-H!DAWXTH3\\*Y^;_'^3.VKCMOC?'8SY0/_? M%GRTMX7_[T'^W\OSQ'/)I7?2WS\[Q>.PPY^'^CRUF8@NM)89=_MU\<)B<7RG M)\AO#@QN8+3D?\^]B#L,#3YMK%;P]*'JV7#XX;P__'CZOG]BAA(#G.'F-($R ME]T$\\^DQ\!0R^(AE-1RVE#TM]'(@[Y?'^T9&ETJ/!=]/!\)CDQ MKC@8E9Q%\R"@$RHQG;N4QQ/)XB98+^]:,\""%"P(`W*"62-H%%,-L#@%BX4C M+%-IMDXG!:8%(W.L:R,[R6?C;!CYBS1_05XT+[G.XW.0PL`")-?`()NIJ\>7 MH3@T;47)$#]%C\C+M@S&`R<%0E]9#M%9&/<*F*>\R#/$U8-A1)CE.X[45E=: MA(F+2QITTX`D66.175#+DQ3ABJ9LM?#20`K=BJZ*T=J+5EX:BKXT@%Q!K@(Q M87X].QKTRP!!%4JB815Q$8Y&'`!_Z9^]/3TW0!<&:"O3[B_K8?<05,,*1UVA MI#FB1(=U5^Q/Y%F'+GN`]U[Q"5T\($\.W`1&QTY1MFBC$Z<'%WUZQ49.\AX! M:5M4`:W82.W)75*6W245%2AS596G[R$YFW.=K>)\;^=[9V'^]_N MY5F[_V]L`HVM:&2-^6KZ@R6,H,"-41#A%V]C&#]8`DB5\)-"1-S%+$Q`HL;/ MT'5CGE31$2].),PB3[A-@'JO)E:"RHQN$KL&1@&5CMLPH8A5`YZ:HB"XXLF$ M1Y@S#ED(BP]@*@O$\B2<<3(!\':"$<<;R$("^P/FG(W"Z8B%\Z2.\%0&6`8: ML]'94F4S'DVLF=D,UI)<0Y6AR\3B5SA:N*-;!)``*H@B#G($6_:@3:_.ZY#+ MCDYE,6P$O@F+2\YG5'P'+HA@\I86SVU&O7[\6ZLEE95.2D/C`:6/D;=*;>Z6CAL1UESWSYW2J M!<'0"==H*/SG,6=BSO!0_X(VBVB?%1:JKBLF)($N8']"0/7*BQ).%P:@@V'- MGB?=;@>U#\4&78[8B#"$/16$I(MQ(R^]_$1E`3F+'3ZZ2`>@@KD_%)`IR!#; MP4S\U1=GH$`&8.B"L=DD$O`.!=R\MLIN7-NC(5P^"I,[):)VH44-:A\Z6SX] M)_-`5F,9D`$\$?DO6,#!WD M-N2Q&&<.".TJC"Z!XY"C`/Y(\Y_E((&Z_`KK",:H@JS8LX%#HVG-HN-0O8K> M(FNEUTU(9&%),"2E1PB7$4=`E;K]7'8/Y4$>9T0":D%\Q10'\^D(R`SZ\`\> MAE'=JP,5U[TA53BT<=5"2-AAD,`2@BL\ M/G[\2!P$!L(NHO^"9`>,$CN;!_SP'&1!8J%[5^Y:U^MU*J@Q@?%W!,O'LC>( MT,1:2$&`,S2'N0U%WV3OP0:=*,E!UR$)!B$@%>59;.%%8`^EK"J$BQB":>B#R)8@V&?(\OTJ]$*( M5KIHTPJNK\#&UV@]1KEI3V=E04A`4)JC)"])`LOAG0ZG%&Z6'RM"A[4DR%)[ MPN%_;-B2"+-%S.(0+/\X!.X)7=EWDS31C-\U*M=4,9Q:B3W!=\$=D"=PY7LRN*JLCQRS!&'4P+;M\"`@*M65RUD8U(9[-%!UYLQD"N5$XQ>"F><1KT91E MY]C+S]2$@VT-H@)6M3[*"Q*;V*I,0R$#$A>I];$H(@L"EX,P/!)"#("!\"QA M#V*'K!$8%(#7=(KWZ$W1?5$%8%E6&%9>X``=@]!U<&1$PW1O1TBGJ>5,Z@:U MW+%QW(G"`$T\RAH3H#P#+%686&W)55V;U"T*&;$!_?;X=/_O0W2A#P_Z[P<_ M#P=G;V!1>]ZODI4@H3)&=549'15-!RH^Q-S.-D)%FKO+>\`M2DO-N'II52XR._]KE:;B=:;5:4XA;Y\_#@KWZ]0ZVF1B`IC=EVN$&%%H.47 MR%J(Z/4YM&-9X06"Q_60(8H_,T#[_/0"T'S!4#V ML*9Y#O:\(&BZ'Z%D5E$Q#Y&O")B4`RCQR@[>N1W-1R.45:+W^FXQXZ(]>:NA ML=!`9#0J#JS*4@]FBLJJAB7:='X=:\G/FTI;+DF'U--C[QH]4@QR3&C!2$"( MB;#F2JNF/IUSU[@;DR;>N(`NXX;*!+*)F^"T+RH;/9=&)DB"PNO9EM#4`R:` M5J'YH[T=#T_^6?;_*=_CW;5QF_^OVZ+]OYU6I]/'_U7G_V'=NF??'@W?/_F_+RPU=5I,2SK1]<)+Y.C`]\JRJ^A M4_*N#]V**AQ+V!;\:\._K0K5*_/(W9W+)W_Y^>#LP_[@G*Q4W/=#(Y6#"`:[ M>1PW?&\DPT[^K[TK;VHCR?)_JSY%6AMM2U@('0C:T#:##9YF;(,#U%?8#D6A M`RJL:U02-M/M_>S[KKSJD'`WS4SO4+/;1GE55AXO7[[C]S;P%(HF+%@7L0H= M3-T0+GAP&"EYB'`ZSQH)A/2OQ3B&NSZ\:#@!8+MML%&ZZ#]\T6&>46Z@7 MS>;7._7\`M&X`[=P+,'XT[;SP@61"9CS#;J!40CL=;I=.A.2B7ABQ^GDS"]( MCQ_]]YU=,1\\K&R-91..>\CJOM.+"*'R?Z6S1GU)(F<[DY_4>S!30\L!NXF% MZO;/AOVSZ<'_I]9D/4,>9Y%5.02`5P`#`3QM,NN"WT%8__3.79WRN*[3FKL) MV/Z4LXP>CT%_EBGOI(XCJTSH-^FP#WH8.3Z!G-8E,\K4._&Z62*WS)`0U@K8 M".PDN'7-%GS-IHQZ7D8C+Z.9F6$HAET3FQ\J2M4^MUHX"QGY+<[?WW?S8_NU M6YS_I($BU,TG^-_&9D[9;2ZK2U6H7D[9;[FL+L6MY_3Q"9>MU7+RZ[4/6+]> MS\NO4WZCD9??H/QF,R^_2?F;FWGYFY2?.\;U%N5O;>7E;U'^]G9>_C;E?_MM M7OZWE/\D;_SJ3RC?GV,GO\'C]_QY7CZ/WXL7>?D\?@<'>?D\?H>'>?D\?B]? MYJR5!H_?C=9@@\?R1FNPP>.:OP;=LCS&6P ME^)ZHA=JYM*%9CYAN#%E:/*H\ZZ"([\-Y\TPC.&J'L8DR&+54[\;HF)J-(GG M6B1.$LU>%'\DD5K8G2]0G2V.]B,5G$ MU(KNZ4`5I8"(A]AMD.M3VZ@6N)A-%E.27ER0ZI,_!07JTTD<1Z@?9`@.>/>< M).US!7NB(3),%1YX<;_?XQA3_;!'H&P/,P=O?B8@_((HS./GW:&0&@7B`L(;KJP\2SO%/F+HII M`"N!D37Z(E123D=XG*-PLD\-C">?C(*XFHAAY'!':BV0=_RKG\_O&*Y@C8)K MD.O!6EEIE:7+2^L!L]9H#49]FD412DV98"K9E?*O.(/7O^;7"5<`*8+6F[*8JZQ[$ MTWXW&D1(SJF%BEB%L`9)._UR]6A.AB+5*O^6Q`%]\R8JJC#"6;.&L-<14K3F M)A4#3T+I1*U*Z"4U'*90V%$+)/C0<8@=EK3\I4+BA40 MMG.XE9WN,#VU4_W[VG<;-&+[W[MP80U=`@DE]6;(^E^1.:):MJ+ZEWMJ=[W, MV\M=Y49KL&I]LZX$5_473\3L5TB+Z'U8U7^W-.?KGV7V__5;>L>J^&^U5L/@ M/VUNM]#^O[YYC_]S)T^U_;UR3&A5L0[_7ZM^"__%T]YU-@0*/!G&Q:!Z!E70 M]A;^?/U6!=8D_?TZ;(31Y*H?LSA+%'!G1V_;1R;$T22<`"OQF(6JHPUGW,D9C#9;\L3D>HSZ0\062]VY_ M-D?OS:"+]&P6A=:*3W\'_!A5U?O!<]/C]X-3LA,B1CF`]I@1A>-)X/#@&9I M.Z!JD.P/FJS$T&IW'EWA&]`MMV]0+L1V*4#;NP@O0V2*,)B1C@[H*O*H;"C` M&E]M$!(1Q\]#&9#I"_17&M.V2#P;)S019S(3U3;\![KX?CW"SN$3I'`\JNKE MA"\6;)DPG0#K"/P=VS_.8;U-Y_C^P`P;&1$2!Z#M.![%CD%#Z?W@Z'@RQ_'8 M(>U]0#9&L["+I@)P\>%O&@N3/@=6H1^3.1';]HA5"7/(`5M/]6DEO%]GNS_X M['+5^;J!_CKXOOU>3X:0#/AI:<,D+,A"`2UO+L6J'^Y=SI[2MG8T+&@Z9EN_ M=%HG&!,G;^CD9>*9O$?\$H0<6;\J5]5;C=.(IC\"TBB=H35HE-NQ6$R8'<)* M\7\N^C'.N=XF;C?'3E=.IOVQ.PIX>0.&:WCM5HB="BO04V`!5=6!GB9___0# MW`H5V!3^XHAQ:G&E$S?NOOC*>?'1&*V'T()5NY)4U0NVXJ,[_@BV081=PZT2 MNZWTG%;,N-X`P<5I8I[?Q#+8%:>%`].";6`ER(M3OYW5@U6P+T)Y#W_>?_/V M]:'>[%FDZ)R0<*ILR*ILVL2DUJA"(BN-.DR6!3;XA.N MZAOUC4:M5HD%`K4]'_!E2G>S>A.1Y9BF/A(X&FHY6)+0:>2#I3OU:KS2_R#SN_]#^ M_N34T&PZH@\/U?[KLQ-)LQ%]2O5[!][_GT^:_V^?')S<[CM6^?]NUAG_M;;5 MVFHV,?Y/47@T'0 M_SQ%XBE<`AR;[(,3"9DB]I6,Z+3,I3OJH04ZMAG\ZMX%P-.'0V8AM'&Z./"1E?0U&7SCJZ7N)[POA#UM;CL*S"5"F^^R"3G; M&9N6L+_H#43B6DD=7^SAZX&-ZE&?XFD?F$(H>$1S\Y$YWQ"8,33)AF%@6\;S MOG%KZDW,^P+[*A4$^\-X4F%9/M]&\!@6WX<0<0O_Q5:Q:F\/^A`@1)90LV+.3B5/'"X-L+'\$\!CPL>]C6Y6@T(A-UM61*9%K4"3"* MTD$96>:-H5GQY4;9'A]I574VFV7FT MZQ^'P^L8+XIPA8/;SR>R"R9Y;9=X)Y\;=LRL^0"N!/:*2!H#9*FUW1NU654_ M]>4U?:?#J(,)Q1X]GK"M-0E%M6KF(VIWM,<;\B%\'V%S:;S&HKRKZL8R]\.8 M*QO"7%S3*0IPO*NM`+T0YKHB^E&)&S+^X]F6Z#QZ#\4'0A]I-(`P@'SC.?V- MOEAN`S]=7F.O46XZ9G'N3E`P"A8]HI]P!N7.>TZQ%./YA.QW+L/A`&=P?CE# M9Y2@()?4BO!*.":OX%N-Y-,0A)/FB,Y=!P34^)RZI(L1M MUM_[K^5N]/EO>;W;!X"_*?Y["R-!.___E/QOS?.@#8*ORO1I/L M/[>VFZW-&L:"K&]N-S?O^;^[>/XP_M=%[_P_``&,?LIM5_^TB&#TTZYPG3(; M]:(9"0\I(1,:S&MX4DA`A24;GB0;IH1;QPRS;[P'#;M__M"30?_--KJM=ZS2 M_[5J+4W_M[<:B/_8JFW?W__OY+'V_PX98[PIH@CV@H&7F+5`0FX*&KX;LM1S M+_.JF0"F7@334J+I;&,HYM)@Y M#3TS"3S;9.?4N>R'/>DO6O2@R50R>U?U8&3P>JDP6WZ0#049:$@"9.&[\4OP M7Y,HWR.)TQDYF_6L09$YT^P;35/9YG(X`.$4!24=F(KD`/0JREV:N*CMVA0_ MA(&)EM"3Z71GCF:Z=]-YOM'<)OP8"XZA26DPAK?0^3\-YYF56^E[2F!^A_NL3]=#X+Q_%H,KN(!M>95&+9!*56+=GB MB><#.RIFK$\HI#@3_BOK4_NGG[5/7[QY6^(,>OO3IXY#J&=/Z*PJ*%!1SER0 MG>&:`50(X9]/>LU)IQEO*(H-X$[)],FAF_;-6=/KE[V)+ZQ#"L@UTVFLJS$^ M$,W">F8N"T.R=`3$+!1:ZY!F:,4^\Z1.@1V2CI!9S?/>:,GC4"X;#)W@K3[' M'=F\POL,[22==Y;IM^2T6MPHEM-Q+61&:%>QZ#!%H[+7^M0,4\]2HAX332$V MO2F38$S:Y01#:369-A9W7)MW@U=;%Z/:FB3;1AF$P(L:P]2#1MY01DW9]6'7 MXPVF"\DL/;`_7U'S$PYAYE!D3:1E@ M*.R/2,;_[N9N#_P9/#_MPX`N(+_;[;J+2O_J=>)_V_=\_]W\N3R M_]HS]_1-Y^#H]/"X?58B*(O9B"SDK8S#2T:(V]45T]42C&U_VJ%5F.,$@53( M"R<8,GRKU6OP2\B8'U[8P1)$$#30FJ0EK@22*IAC/$UP4Y-SDM'YPUCDZ@[&!MJI`8D8,>68;^H;MG7!\N_/)[/H!@E<(X=T\,W)S\< MMWET(9G2"1F[='#X8P?-,ANF2AN21:^[,A77*6 M<2ZHB]<]']&$^!-&-&%.U@$UL9R5I35(7W!W>%78Y\NWPX M&H_<)/)6+)YL%!O<=UESGH:R<6=<?+ M]E^M%NG_6K7MQCW_=Q=/+O^W+`!TMEAQF?`P)3;L>?&CW1J2`OF#: MW?0K.IKL(P+VFSMW0A3)O3&70].)7CK0=8884D[Y#,S_(?=DJ,55?+YK88X) M=3U,![H>2IAK7>SQXS\2X3IC_SMJT=M98ZOPG[::S83]1VNS>;__[^3)V_]. M4)8-XET)@50Y.VAV,+(!2E!*!^R`(^%D`C4_HZ`A8)"D5G<=N>'XU?' M)S\=(SRE23L]_#M]AI<(ER+O]XOO3X%7\I*>OWZ53'IY]/+$2S@[>?'*3_CE MS>NCXU=%-ZZ'>GMZ!)S7RW;I,PTD_O,,W>)Q)/#'=TI7?[/_1GA^_.4'<2Z^)R,_X*47`I`XGJ\_8X3DW40Y M&&TH=^D6A'L83D*RJ)X<*%ZK-MP*.B=9PWR/X>K-F'!%4Z"<]3*HM19GO,;] MG:R'(06DDSVJ2F,,\PX+XD7G]>%Q*=%EA\02Y=]8"]2:.A'K:;9C5D=BODIV ML?`J1B=&C-$X9H-BMD<<=_`=O3)8#RLX/3>43FSUU"R8XG\$)Z53371K;W5E*B;-.K4$_AG2Q2BQ#B4?$YZ`9['?^ MN']@#@&U+B_(2X\<$ON"*&`AD,FEC?0N"+E291R2)#X!]H3.4P>@@*Y93.%* MG$^':_3!73WHAV[!*@J9=U7WMKK^S&*..BM05]7\A02V>08TC!JP>Q;'B,N+ MP`I3M+#J!DO5JK/JNQ@'YB>+[P[C\X#]Y/TK3(T*PJ`*Y#);V(878814-1Q? MRWJ-^TK8`PI0%.BM@-$"+B<(*Z[79%6'O8EIT5IYEH+:)+\A9!YV6TJM*[F% M\9N6!!W!VAF!1S#YAL%'`C?V".-_.$R;(TE$)`F25SK6"UYV69DF=M-)!*[Y;*/_V.O!TO_J(C:'U_T MA]$X5/^8#"-R>L,68@/^P!V_2:P.9;^``;OWGY^I(%>K![6A5ET M",Z"@#RYC>E;$>\7>AL`H_RJVHBWSWE.OJ=/P.X57@U_#]P*4B%B74(+0&M2"3HB`YGC(L1 M$*A,F^!SX$A&/WH=^6B&'J@QN2XMQN/K!\ZN#Q_U,Y_PAWQ6@)S((R2AZ)SYZY3^C+`PVL8_U>//R)X60RK9@83>2HRY&A M!@N4\U>YOHF5Q!_.>$%P=DE4"(2+.68!.0)@9\H+[PV>*\:?JF0RZO*T)U`*6$9XMFG./ MNW/9#79+`VNV,,) M*W8QH4-R7C=``HN-0FF)85$$\JQC@YI#KE.Z*^&5NQ?W8X$'D[;)ZX MHGM9\X)_>-QM1968_RPKW>^[TR9DR/]<0="MO&.5_7<=9?YD_['5J-<(_ZFU MU;R7_]W%H^,_OWI]=/9F/QD`VDM5MQ3^F043?W)$:$PFE;V7:@(\YT2.=KD- M*4+7W-L(_IP1U#D5]YDZ\?SP[T?'ZF"_O2^X]C^<'IZI@D6L%_5"AGY#+-B2 MR6+3EZ&&0*V#L3$0UV`Q0""MB/Z!0A/7-]BEMM`/#Q`?C1U9D9,.ZZ[#?<=IVPNF@)6(F4/971$@,;%K0.YBPE9[:DY?;2Q5(1K!/Q MM*'(J=L2+6LW:+2K12>M%983P!>\)>-%,K*H+SJ*=&9U4JH1L*(($RUN4[JF MLV0\B46>C`1_L+I#&N'$L898[=(GL-`I:\+$;2&CNQ-HOX-I?'MO9 M3C=TD7]D1W?.*:@#)ONM$RNH::&QEOA<+J!@7L1Z@1OGV@3$SC2UJ>?%Q$X( M!/=4'6,K^:7SBP.'GZYBK3YL^=-$\Y;8O#T]:9^@P0>-M8KK, M"JOP75-HF*;`\,\'J+&M3DY*JIAL"%+*)Y.J1F/6Q14UL\/)-A6?;V+U;CB^^J"^6^^K M1\3-/'H&/X"4H4?=QGQ"?OC/BGA3+Q(G6V,0./P,;'J,@-M$MJ#"`RQ.^5+D5K+[L)6(KIBH-E?,0"JB!_UP? MJ_6KZ*M3%J.F2UVYI7YDAC99R@2RC.:EPY^/VIV7^T>O M@:=+.TS!,HGHR+&3;W6EZ0CK6GZ35J254WY+&662U8T;K''_B?VZID#"#B`9 MS2G]!>835*:#L]T(.4[.;.!+*@!IH)SC_2:Z8FXQV]O9?=M2UUK@T6BX)'8H M_9V8%'=`,YQGLPK=U)%6P-TIP#/[G*S!CRO';J%KO1E]4L`?.>M>SDI8Y1T&S'FT\8AMMOVB)`F5 MD`"I1A*$3B]8[).)O,[$TK-ZATS%A+S$W<=.5%2QM]/?&>P,Q[.KTR+;1!^> MO.0QUY&&NTYXX4>]1SM:".[PZ]`LM">B[`$L]6&IZ&0G[*7]N,./^GZ3O+RR M6L1P]I2;W<[`;X?N&WD=H\SEW1IR&>[QXB_/XEJ1^^GTDG/\;CHG`I)/0M-<2D/T4<%LBZ4[=M.:S]<7;^J( M]..%]NI.ZR&Y0_8X]106*3\%Y/]O'?`K\:RR_V\UMHC_W]R"JT`=\5\;M<9] M_-<[>?[G:YZ`_D_I]6),#'KTD(B(V/M(TSX9(RW#@&?2I=/PU&M_6\6 M7E6RGBGQ%Y*`X/[7P&Q_UCMNBO^XU6BT:IM-VO^UQCW^XUT\[OR3$NI/>,D")P@6%.H7V]X<=%.R\/CP] MZ[1/3EZ_@GN\51+GY>/]LVXE0`+!`_?2TXHZ+Q?PEM8=33'AO*Q.'=T%%CUV MRE;4N$R7NK$N3RE4Q6AMYQ,$3B1QMTC?#;*,JV1`$4]"RV!1E_*4%O@.`F&D MYDFC8*Q$I/0(;I75:E4K'(@G364A/\C\6W:M-?79$1%TYDK"44M'-2*9VTU( MT@U;7V&C3T'MB'R#$=?GS=:]W/Z_\G'I/YLEW/X[5O+_!O]EJ[;9VD+\Y_KF M/?[+G3S:_J?S]O3HQ\[KHS,@!H80NXF:G&OI=)&XA:(QN#`./[\:SP7'GD0L M2.1O#T2>[4RXRIK%D-^P7E%,=U..14EAHM+J5R2'G@PP517^&E8\$DH$V!<; ;9]9R2:D_/O<$]/ZY?^Z?O];S?S5