From: Kazuhiro Yoshida Date: 2001-08-19T05:15:18+09:00 Subject: [ruby-list:30981] Re: file exist check method? This is multipart message. ----------------------4766089795545651 Content-Type: text/plain; charset=iso-2022-jp もりきゅうです。長文ごめんなさい。 Dir.glob はちょっとわかんないので 1. / と \ 2. ドライブ部分とネットワークドライブ部分 3. ルートディレクトリ 4. File.split, join について私なりの DOSISH (ってなに?)案を考えてみました。 1. / と \ File, Dir クラスのメソッドにファイル名として与える引数 (String) は セパレータとして / と \ を用いることができ,どちらの セパレータを用いても同じ返り値 ( セパレータは / ) を返すようにする。 つまり,任意の path で assert File.foo(path), File.foo(path.tr('\\', '/')) および assert File.foo(path), File.foo(path.tr('/', '\\')) が成り立つように foo (= dirname, basename, ...) を実装する。 # UNIX では成り立たないし,成り立たなくてかまわない。以下同様。 2. ドライブ部分とネットワークドライブ部分 =begin おまけ UNIX のファイル名には存在しない部分だから,新たにメソッド File.drivename を VCL の ExtractFileDrive 相当で作る。 assert File.drivename("C:\\"), "C:" assert File.drivename("\\\\server\\share"), "//server/share" =end File.dirname は VCL の ExtractFileDir 相当にすべき。 assert File.dirname("C:\\"), "C:/" assert File.dirname("\\\\server\\share"), "//server" 3. ルートディレクトリ DOS 感覚で C:\ は UNIX の / と同じ。 なので,C: よりも C:/ が望ましい。 『File.dirname は VCL の ExtractFileDir 相当』にも合う。 assert File.dirname("C:/"), "C:/" assert File.dirname("//server/share"), "//server" ドライブ部分の後に / が付いていないとか,おかしなパスを 考えると面倒なので VCL に合わせる。 4. File.split, join 基本的に, File.split して File.join すると元に戻る。 assert path, File.join(File.split(path)) File.split, join と Array#split, join は (File::SEPARATOR を Array#split, join の引数にして) 相互に 交換可能である。 pair = File.split(path) assert pair.join(File::SEPARATOR), File.join(pair) また,File.split して作られる配列の要素は File.dirname, File.basename と等しい。 assert pair, [ File.dirname(path), File.basename(path) ] これらを満たすように File.split, join を実装する。 C:/ は UNIX の / と同じように処理する。つまり, 現状のように def File.join(*args) args.join(File::SEPARATOR) end $ ruby -e 'p File.join("/", "/", "/")' "/////" であれば C:\ruby\bin>ruby -e 'p File.join("C:/", "/", "/")' "C://///" となるし def File.join(*args) args.each do |i| case i when %r'^/', %r'^\w:/', %r'^\w:\\' i.chop! end end args.join(File::SEPARATOR) end $ ruby -r myfile -e 'p File.join("/", "/", "/")' "//" であれば C:\ruby\bin>ruby -r myfile -e 'p File.join("C:/", "/", "/")' "C://" となる。 参考: VCL の ExtractFileDir と ExtractFileDrive とその効果 参考として,あまり知られていない^^; VCL の実装を挙げます。 まあ PASCAL なのがちょっとアレゲですけど,お察しください。 添付したのは ExtractFileDir と ExtractFileDrive の確認プログラム (これまた PASCAL) です。fn0.txt, fn1.txt がプログラムの出力で Path "\t" ExtractFileDir(Path) "\t" ExtractFileDrive(Path) という並びのデータです。 以下に Delphi5 SysUtils.pas からの抜粋を載せます(まずいかも..)。 ------ ... interface ... function ExtractFileDir(const FileName: string): string; { ExtractFileDrive extracts the drive part of the given filename. For filenames with drive letters, the resulting string is ':'. For filenames with a UNC path, the resulting string is in the form '\\\'. If the given path contains neither style of filename, the result is an empty string. } function ExtractFileDrive(const FileName: string): string; { ExtractFileName extracts the name and extension parts of the given filename. The resulting string is the leftmost characters of FileName, starting with the first character after the colon or backslash that separates the path information from the name and extension. The resulting string is equal to FileName if FileName contains no drive and directory parts. } ... implementation ... function ExtractFileDir(const FileName: string): string; var I: Integer; begin I := LastDelimiter('\:',Filename); if (I > 1) and (FileName[I] = '\') and (not (FileName[I - 1] in ['\', ':']) or (ByteType(FileName, I-1) = mbTrailByte)) then Dec(I); Result := Copy(FileName, 1, I); end; function ExtractFileDrive(const FileName: string): string; var I, J: Integer; begin if (Length(FileName) >= 2) and (FileName[2] = ':') then Result := Copy(FileName, 1, 2) else if (Length(FileName) >= 2) and (FileName[1] = '\') and (FileName[2] = '\') then begin J := 0; I := 3; While (I < Length(FileName)) and (J < 2) do begin if FileName[I] = '\' then Inc(J); if J < 2 then Inc(I); end; if FileName[I] = '\' then Dec(I); Result := Copy(FileName, 1, I); end else Result := ''; end; ... ------ ---- YOSHIDA Kazuhiro moriq@moriq.com http://www.moriq.com/ ----------------------4766089795545651 Content-Type: application/octet-stream; name="p.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="p.txt" Yzpca29ubmEgbmFtYWUgdHVrZW5qYW5lZXlvXHB1biBwdW5clVyMdo5aLnR4dA0K ----------------------4766089795545651 Content-Type: application/octet-stream; name="fn0.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="fn0.txt" Yzpca29ubmEgbmFtYWUgdHVrZW5qYW5lZXlvXHB1biBwdW5clVyMdo5aLnR4dAljOlxrb25u YSBuYW1hZSB0dWtlbmphbmVleW9ccHVuIHB1bgljOg0K ----------------------4766089795545651 Content-Type: application/octet-stream; name="fn0.dpr" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="fn0.dpr" cHJvZ3JhbSBmbjA7DQoNCnskQVBQVFlQRSBDT05TT0xFfQ0KDQp1c2VzIFN5c1V0aWxzOw0K DQp2YXINCiAgbjogSW50ZWdlciA9IDA7DQoNCnByb2NlZHVyZSBwKFBhdGg6IHN0cmluZyk7 DQpiZWdpbg0KICBXcml0ZUxuKFBhdGgsICM5LCBFeHRyYWN0RmlsZURpcihQYXRoKSwgIzks IEV4dHJhY3RGaWxlRHJpdmUoUGF0aCkpOw0KZW5kOw0KDQp2YXINCiAgRjogVGV4dEZpbGU7 DQogIFM6IHN0cmluZzsNCg0KYmVnaW4NCiAgQXNzaWduKEYsICdwLnR4dCcpOw0KICBSZXNl dChGKTsNCiAgd2hpbGUgbm90IEVvZihGKSBkbw0KICBiZWdpbg0KICAgIFJlYWRMbihGLCBT KTsNCiAgICBwKFMpOw0KICAgIGluYyhuKTsNCiAgZW5kOw0KICBDbG9zZUZpbGUoRik7DQpl bmQuDQo= ----------------------4766089795545651 Content-Type: application/octet-stream; name="fn1.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="fn1.txt" CQkNCkMJCQ0KOgk6CQ0KXAlcCQ0KIEMJCQ0KQ0MJCQ0KOkMJOgkNClxDCVwJDQogOgkgOgkg Og0KQzoJQzoJQzoNCjo6CTo6CTo6DQpcOglcOglcOg0KIFwJIAkNCkNcCUMJDQo6XAk6XAkN ClxcCVxcCVxcDQogIEMJCQ0KQyBDCQkNCjogQwk6CQ0KXCBDCVwJDQogQ0MJCQ0KQ0NDCQkN CjpDQwk6CQ0KXENDCVwJDQogOkMJIDoJIDoNCkM6QwlDOglDOg0KOjpDCTo6CTo6DQpcOkMJ XDoJXDoNCiBcQwkgCQ0KQ1xDCUMJDQo6XEMJOlwJDQpcXEMJXFwJXFxDDQogIDoJICA6CQ0K QyA6CUMgOgkNCjogOgk6IDoJDQpcIDoJXCA6CQ0KIEM6CSBDOgkNCkNDOglDQzoJDQo6QzoJ OkM6CQ0KXEM6CVxDOgkNCiA6OgkgOjoJIDoNCkM6OglDOjoJQzoNCjo6Ogk6OjoJOjoNClw6 OglcOjoJXDoNCiBcOgkgXDoJDQpDXDoJQ1w6CQ0KOlw6CTpcOgkNClxcOglcXDoJXFw6DQog IFwJICAJDQpDIFwJQyAJDQo6IFwJOiAJDQpcIFwJXCAJDQogQ1wJIEMJDQpDQ1wJQ0MJDQo6 Q1wJOkMJDQpcQ1wJXEMJDQogOlwJIDpcCSA6DQpDOlwJQzpcCUM6DQo6OlwJOjpcCTo6DQpc OlwJXDpcCVw6DQogXFwJIFxcCQ0KQ1xcCUNcXAkNCjpcXAk6XFwJDQpcXFwJXFxcCVxcDQog ICBDCQkNCkMgIEMJCQ0KOiAgQwk6CQ0KXCAgQwlcCQ0KIEMgQwkJDQpDQyBDCQkNCjpDIEMJ OgkNClxDIEMJXAkNCiA6IEMJIDoJIDoNCkM6IEMJQzoJQzoNCjo6IEMJOjoJOjoNClw6IEMJ XDoJXDoNCiBcIEMJIAkNCkNcIEMJQwkNCjpcIEMJOlwJDQpcXCBDCVxcCVxcIEMNCiAgQ0MJ CQ0KQyBDQwkJDQo6IENDCToJDQpcIENDCVwJDQogQ0NDCQkNCkNDQ0MJCQ0KOkNDQwk6CQ0K XENDQwlcCQ0KIDpDQwkgOgkgOg0KQzpDQwlDOglDOg0KOjpDQwk6Ogk6Og0KXDpDQwlcOglc Og0KIFxDQwkgCQ0KQ1xDQwlDCQ0KOlxDQwk6XAkNClxcQ0MJXFwJXFxDQw0KICA6QwkgIDoJ DQpDIDpDCUMgOgkNCjogOkMJOiA6CQ0KXCA6QwlcIDoJDQogQzpDCSBDOgkNCkNDOkMJQ0M6 CQ0KOkM6Qwk6QzoJDQpcQzpDCVxDOgkNCiA6OkMJIDo6CSA6DQpDOjpDCUM6OglDOg0KOjo6 Qwk6OjoJOjoNClw6OkMJXDo6CVw6DQogXDpDCSBcOgkNCkNcOkMJQ1w6CQ0KOlw6Qwk6XDoJ DQpcXDpDCVxcOglcXDpDDQogIFxDCSAgCQ0KQyBcQwlDIAkNCjogXEMJOiAJDQpcIFxDCVwg CQ0KIENcQwkgQwkNCkNDXEMJQ0MJDQo6Q1xDCTpDCQ0KXENcQwlcQwkNCiA6XEMJIDpcCSA6 DQpDOlxDCUM6XAlDOg0KOjpcQwk6OlwJOjoNClw6XEMJXDpcCVw6DQogXFxDCSBcXAkNCkNc XEMJQ1xcCQ0KOlxcQwk6XFwJDQpcXFxDCVxcXAlcXFxDDQogICA6CSAgIDoJDQpDICA6CUMg IDoJDQo6ICA6CTogIDoJDQpcICA6CVwgIDoJDQogQyA6CSBDIDoJDQpDQyA6CUNDIDoJDQo6 QyA6CTpDIDoJDQpcQyA6CVxDIDoJDQogOiA6CSA6IDoJIDoNCkM6IDoJQzogOglDOg0KOjog Ogk6OiA6CTo6DQpcOiA6CVw6IDoJXDoNCiBcIDoJIFwgOgkNCkNcIDoJQ1wgOgkNCjpcIDoJ OlwgOgkNClxcIDoJXFwgOglcXCA6DQogIEM6CSAgQzoJDQpDIEM6CUMgQzoJDQo6IEM6CTog QzoJDQpcIEM6CVwgQzoJDQogQ0M6CSBDQzoJDQpDQ0M6CUNDQzoJDQo6Q0M6CTpDQzoJDQpc Q0M6CVxDQzoJDQogOkM6CSA6QzoJIDoNCkM6QzoJQzpDOglDOg0KOjpDOgk6OkM6CTo6DQpc OkM6CVw6QzoJXDoNCiBcQzoJIFxDOgkNCkNcQzoJQ1xDOgkNCjpcQzoJOlxDOgkNClxcQzoJ XFxDOglcXEM6DQogIDo6CSAgOjoJDQpDIDo6CUMgOjoJDQo6IDo6CTogOjoJDQpcIDo6CVwg OjoJDQogQzo6CSBDOjoJDQpDQzo6CUNDOjoJDQo6Qzo6CTpDOjoJDQpcQzo6CVxDOjoJDQog Ojo6CSA6OjoJIDoNCkM6OjoJQzo6OglDOg0KOjo6Ogk6Ojo6CTo6DQpcOjo6CVw6OjoJXDoN CiBcOjoJIFw6OgkNCkNcOjoJQ1w6OgkNCjpcOjoJOlw6OgkNClxcOjoJXFw6OglcXDo6DQog IFw6CSAgXDoJDQpDIFw6CUMgXDoJDQo6IFw6CTogXDoJDQpcIFw6CVwgXDoJDQogQ1w6CSBD XDoJDQpDQ1w6CUNDXDoJDQo6Q1w6CTpDXDoJDQpcQ1w6CVxDXDoJDQogOlw6CSA6XDoJIDoN CkM6XDoJQzpcOglDOg0KOjpcOgk6Olw6CTo6DQpcOlw6CVw6XDoJXDoNCiBcXDoJIFxcOgkN CkNcXDoJQ1xcOgkNCjpcXDoJOlxcOgkNClxcXDoJXFxcOglcXFw6DQogICBcCSAgIAkNCkMg IFwJQyAgCQ0KOiAgXAk6ICAJDQpcICBcCVwgIAkNCiBDIFwJIEMgCQ0KQ0MgXAlDQyAJDQo6 QyBcCTpDIAkNClxDIFwJXEMgCQ0KIDogXAkgOiAJIDoNCkM6IFwJQzogCUM6DQo6OiBcCTo6 IAk6Og0KXDogXAlcOiAJXDoNCiBcIFwJIFwgCQ0KQ1wgXAlDXCAJDQo6XCBcCTpcIAkNClxc IFwJXFwgCVxcIA0KICBDXAkgIEMJDQpDIENcCUMgQwkNCjogQ1wJOiBDCQ0KXCBDXAlcIEMJ DQogQ0NcCSBDQwkNCkNDQ1wJQ0NDCQ0KOkNDXAk6Q0MJDQpcQ0NcCVxDQwkNCiA6Q1wJIDpD CSA6DQpDOkNcCUM6QwlDOg0KOjpDXAk6OkMJOjoNClw6Q1wJXDpDCVw6DQogXENcCSBcQwkN CkNcQ1wJQ1xDCQ0KOlxDXAk6XEMJDQpcXENcCVxcQwlcXEMNCiAgOlwJICA6XAkNCkMgOlwJ QyA6XAkNCjogOlwJOiA6XAkNClwgOlwJXCA6XAkNCiBDOlwJIEM6XAkNCkNDOlwJQ0M6XAkN CjpDOlwJOkM6XAkNClxDOlwJXEM6XAkNCiA6OlwJIDo6XAkgOg0KQzo6XAlDOjpcCUM6DQo6 OjpcCTo6OlwJOjoNClw6OlwJXDo6XAlcOg0KIFw6XAkgXDpcCQ0KQ1w6XAlDXDpcCQ0KOlw6 XAk6XDpcCQ0KXFw6XAlcXDpcCVxcOg0KICBcXAkgIFxcCQ0KQyBcXAlDIFxcCQ0KOiBcXAk6 IFxcCQ0KXCBcXAlcIFxcCQ0KIENcXAkgQ1xcCQ0KQ0NcXAlDQ1xcCQ0KOkNcXAk6Q1xcCQ0K XENcXAlcQ1xcCQ0KIDpcXAkgOlxcCSA6DQpDOlxcCUM6XFwJQzoNCjo6XFwJOjpcXAk6Og0K XDpcXAlcOlxcCVw6DQogXFxcCSBcXFwJDQpDXFxcCUNcXFwJDQo6XFxcCTpcXFwJDQpcXFxc CVxcXFwJXFxcDQogICAgQwkJDQpDICAgQwkJDQo6ICAgQwk6CQ0KXCAgIEMJXAkNCiBDICBD CQkNCkNDICBDCQkNCjpDICBDCToJDQpcQyAgQwlcCQ0KIDogIEMJIDoJIDoNCkM6ICBDCUM6 CUM6DQo6OiAgQwk6Ogk6Og0KXDogIEMJXDoJXDoNCiBcICBDCSAJDQpDXCAgQwlDCQ0KOlwg IEMJOlwJDQpcXCAgQwlcXAlcXCAgQw0KICBDIEMJCQ0KQyBDIEMJCQ0KOiBDIEMJOgkNClwg QyBDCVwJDQogQ0MgQwkJDQpDQ0MgQwkJDQo6Q0MgQwk6CQ0KXENDIEMJXAkNCiA6QyBDCSA6 CSA6DQpDOkMgQwlDOglDOg0KOjpDIEMJOjoJOjoNClw6QyBDCVw6CVw6DQogXEMgQwkgCQ0K Q1xDIEMJQwkNCjpcQyBDCTpcCQ0KXFxDIEMJXFwJXFxDIEMNCiAgOiBDCSAgOgkNCkMgOiBD CUMgOgkNCjogOiBDCTogOgkNClwgOiBDCVwgOgkNCiBDOiBDCSBDOgkNCkNDOiBDCUNDOgkN CjpDOiBDCTpDOgkNClxDOiBDCVxDOgkNCiA6OiBDCSA6OgkgOg0KQzo6IEMJQzo6CUM6DQo6 OjogQwk6OjoJOjoNClw6OiBDCVw6OglcOg0KIFw6IEMJIFw6CQ0KQ1w6IEMJQ1w6CQ0KOlw6 IEMJOlw6CQ0KXFw6IEMJXFw6CVxcOiBDDQogIFwgQwkgIAkNCkMgXCBDCUMgCQ0KOiBcIEMJ OiAJDQpcIFwgQwlcIAkNCiBDXCBDCSBDCQ0KQ0NcIEMJQ0MJDQo6Q1wgQwk6QwkNClxDXCBD CVxDCQ0KIDpcIEMJIDpcCSA6DQpDOlwgQwlDOlwJQzoNCjo6XCBDCTo6XAk6Og0KXDpcIEMJ XDpcCVw6DQogXFwgQwkgXFwJDQpDXFwgQwlDXFwJDQo6XFwgQwk6XFwJDQpcXFwgQwlcXFwJ XFxcIEMNCiAgIENDCQkNCkMgIENDCQkNCjogIENDCToJDQpcICBDQwlcCQ0KIEMgQ0MJCQ0K Q0MgQ0MJCQ0KOkMgQ0MJOgkNClxDIENDCVwJDQogOiBDQwkgOgkgOg0KQzogQ0MJQzoJQzoN Cjo6IENDCTo6CTo6DQpcOiBDQwlcOglcOg0KIFwgQ0MJIAkNCkNcIENDCUMJDQo6XCBDQwk6 XAkNClxcIENDCVxcCVxcIENDDQogIENDQwkJDQpDIENDQwkJDQo6IENDQwk6CQ0KXCBDQ0MJ XAkNCiBDQ0NDCQkNCkNDQ0NDCQkNCjpDQ0NDCToJDQpcQ0NDQwlcCQ0KIDpDQ0MJIDoJIDoN CkM6Q0NDCUM6CUM6DQo6OkNDQwk6Ogk6Og0KXDpDQ0MJXDoJXDoNCiBcQ0NDCSAJDQpDXEND QwlDCQ0KOlxDQ0MJOlwJDQpcXENDQwlcXAlcXENDQw0KICA6Q0MJICA6CQ0KQyA6Q0MJQyA6 CQ0KOiA6Q0MJOiA6CQ0KXCA6Q0MJXCA6CQ0KIEM6Q0MJIEM6CQ0KQ0M6Q0MJQ0M6CQ0KOkM6 Q0MJOkM6CQ0KXEM6Q0MJXEM6CQ0KIDo6Q0MJIDo6CSA6DQpDOjpDQwlDOjoJQzoNCjo6OkND CTo6Ogk6Og0KXDo6Q0MJXDo6CVw6DQogXDpDQwkgXDoJDQpDXDpDQwlDXDoJDQo6XDpDQwk6 XDoJDQpcXDpDQwlcXDoJXFw6Q0MNCiAgXENDCSAgCQ0KQyBcQ0MJQyAJDQo6IFxDQwk6IAkN ClwgXENDCVwgCQ0KIENcQ0MJIEMJDQpDQ1xDQwlDQwkNCjpDXENDCTpDCQ0KXENcQ0MJXEMJ DQogOlxDQwkgOlwJIDoNCkM6XENDCUM6XAlDOg0KOjpcQ0MJOjpcCTo6DQpcOlxDQwlcOlwJ XDoNCiBcXENDCSBcXAkNCkNcXENDCUNcXAkNCjpcXENDCTpcXAkNClxcXENDCVxcXAlcXFxD Qw0KICAgOkMJICAgOgkNCkMgIDpDCUMgIDoJDQo6ICA6Qwk6ICA6CQ0KXCAgOkMJXCAgOgkN CiBDIDpDCSBDIDoJDQpDQyA6QwlDQyA6CQ0KOkMgOkMJOkMgOgkNClxDIDpDCVxDIDoJDQog OiA6QwkgOiA6CSA6DQpDOiA6QwlDOiA6CUM6DQo6OiA6Qwk6OiA6CTo6DQpcOiA6QwlcOiA6 CVw6DQogXCA6QwkgXCA6CQ0KQ1wgOkMJQ1wgOgkNCjpcIDpDCTpcIDoJDQpcXCA6QwlcXCA6 CVxcIDpDDQogIEM6QwkgIEM6CQ0KQyBDOkMJQyBDOgkNCjogQzpDCTogQzoJDQpcIEM6Qwlc IEM6CQ0KIENDOkMJIENDOgkNCkNDQzpDCUNDQzoJDQo6Q0M6Qwk6Q0M6CQ0KXENDOkMJXEND OgkNCiA6QzpDCSA6QzoJIDoNCkM6QzpDCUM6QzoJQzoNCjo6QzpDCTo6QzoJOjoNClw6QzpD CVw6QzoJXDoNCiBcQzpDCSBcQzoJDQpDXEM6QwlDXEM6CQ0KOlxDOkMJOlxDOgkNClxcQzpD CVxcQzoJXFxDOkMNCiAgOjpDCSAgOjoJDQpDIDo6QwlDIDo6CQ0KOiA6OkMJOiA6OgkNClwg OjpDCVwgOjoJDQogQzo6QwkgQzo6CQ0KQ0M6OkMJQ0M6OgkNCjpDOjpDCTpDOjoJDQpcQzo6 QwlcQzo6CQ0KIDo6OkMJIDo6OgkgOg0KQzo6OkMJQzo6OglDOg0KOjo6OkMJOjo6Ogk6Og0K XDo6OkMJXDo6OglcOg0KIFw6OkMJIFw6OgkNCkNcOjpDCUNcOjoJDQo6XDo6Qwk6XDo6CQ0K XFw6OkMJXFw6OglcXDo6Qw0KICBcOkMJICBcOgkNCkMgXDpDCUMgXDoJDQo6IFw6Qwk6IFw6 CQ0KXCBcOkMJXCBcOgkNCiBDXDpDCSBDXDoJDQpDQ1w6QwlDQ1w6CQ0KOkNcOkMJOkNcOgkN ClxDXDpDCVxDXDoJDQogOlw6QwkgOlw6CSA6DQpDOlw6QwlDOlw6CUM6DQo6Olw6Qwk6Olw6 CTo6DQpcOlw6QwlcOlw6CVw6DQogXFw6QwkgXFw6CQ0KQ1xcOkMJQ1xcOgkNCjpcXDpDCTpc XDoJDQpcXFw6QwlcXFw6CVxcXDpDDQogICBcQwkgICAJDQpDICBcQwlDICAJDQo6ICBcQwk6 ICAJDQpcICBcQwlcICAJDQogQyBcQwkgQyAJDQpDQyBcQwlDQyAJDQo6QyBcQwk6QyAJDQpc QyBcQwlcQyAJDQogOiBcQwkgOiAJIDoNCkM6IFxDCUM6IAlDOg0KOjogXEMJOjogCTo6DQpc OiBcQwlcOiAJXDoNCiBcIFxDCSBcIAkNCkNcIFxDCUNcIAkNCjpcIFxDCTpcIAkNClxcIFxD CVxcIAlcXCBcQw0KICBDXEMJICBDCQ0KQyBDXEMJQyBDCQ0KOiBDXEMJOiBDCQ0KXCBDXEMJ XCBDCQ0KIENDXEMJIENDCQ0KQ0NDXEMJQ0NDCQ0KOkNDXEMJOkNDCQ0KXENDXEMJXENDCQ0K IDpDXEMJIDpDCSA6DQpDOkNcQwlDOkMJQzoNCjo6Q1xDCTo6Qwk6Og0KXDpDXEMJXDpDCVw6 DQogXENcQwkgXEMJDQpDXENcQwlDXEMJDQo6XENcQwk6XEMJDQpcXENcQwlcXEMJXFxDXEMN CiAgOlxDCSAgOlwJDQpDIDpcQwlDIDpcCQ0KOiA6XEMJOiA6XAkNClwgOlxDCVwgOlwJDQog QzpcQwkgQzpcCQ0KQ0M6XEMJQ0M6XAkNCjpDOlxDCTpDOlwJDQpcQzpcQwlcQzpcCQ0KIDo6 XEMJIDo6XAkgOg0KQzo6XEMJQzo6XAlDOg0KOjo6XEMJOjo6XAk6Og0KXDo6XEMJXDo6XAlc Og0KIFw6XEMJIFw6XAkNCkNcOlxDCUNcOlwJDQo6XDpcQwk6XDpcCQ0KXFw6XEMJXFw6XAlc XDpcQw0KICBcXEMJICBcXAkNCkMgXFxDCUMgXFwJDQo6IFxcQwk6IFxcCQ0KXCBcXEMJXCBc XAkNCiBDXFxDCSBDXFwJDQpDQ1xcQwlDQ1xcCQ0KOkNcXEMJOkNcXAkNClxDXFxDCVxDXFwJ DQogOlxcQwkgOlxcCSA6DQpDOlxcQwlDOlxcCUM6DQo6OlxcQwk6OlxcCTo6DQpcOlxcQwlc OlxcCVw6DQogXFxcQwkgXFxcCQ0KQ1xcXEMJQ1xcXAkNCjpcXFxDCTpcXFwJDQpcXFxcQwlc XFxcCVxcXA0KICAgIDoJICAgIDoJDQpDICAgOglDICAgOgkNCjogICA6CTogICA6CQ0KXCAg IDoJXCAgIDoJDQogQyAgOgkgQyAgOgkNCkNDICA6CUNDICA6CQ0KOkMgIDoJOkMgIDoJDQpc QyAgOglcQyAgOgkNCiA6ICA6CSA6ICA6CSA6DQpDOiAgOglDOiAgOglDOg0KOjogIDoJOjog IDoJOjoNClw6ICA6CVw6ICA6CVw6DQogXCAgOgkgXCAgOgkNCkNcICA6CUNcICA6CQ0KOlwg IDoJOlwgIDoJDQpcXCAgOglcXCAgOglcXCAgOg0KICBDIDoJICBDIDoJDQpDIEMgOglDIEMg OgkNCjogQyA6CTogQyA6CQ0KXCBDIDoJXCBDIDoJDQogQ0MgOgkgQ0MgOgkNCkNDQyA6CUND QyA6CQ0KOkNDIDoJOkNDIDoJDQpcQ0MgOglcQ0MgOgkNCiA6QyA6CSA6QyA6CSA6DQpDOkMg OglDOkMgOglDOg0KOjpDIDoJOjpDIDoJOjoNClw6QyA6CVw6QyA6CVw6DQogXEMgOgkgXEMg OgkNCkNcQyA6CUNcQyA6CQ0KOlxDIDoJOlxDIDoJDQpcXEMgOglcXEMgOglcXEMgOg0KICA6 IDoJICA6IDoJDQpDIDogOglDIDogOgkNCjogOiA6CTogOiA6CQ0KXCA6IDoJXCA6IDoJDQog QzogOgkgQzogOgkNCkNDOiA6CUNDOiA6CQ0KOkM6IDoJOkM6IDoJDQpcQzogOglcQzogOgkN CiA6OiA6CSA6OiA6CSA6DQpDOjogOglDOjogOglDOg0KOjo6IDoJOjo6IDoJOjoNClw6OiA6 CVw6OiA6CVw6DQogXDogOgkgXDogOgkNCkNcOiA6CUNcOiA6CQ0KOlw6IDoJOlw6IDoJDQpc XDogOglcXDogOglcXDogOg0KICBcIDoJICBcIDoJDQpDIFwgOglDIFwgOgkNCjogXCA6CTog XCA6CQ0KXCBcIDoJXCBcIDoJDQogQ1wgOgkgQ1wgOgkNCkNDXCA6CUNDXCA6CQ0KOkNcIDoJ OkNcIDoJDQpcQ1wgOglcQ1wgOgkNCiA6XCA6CSA6XCA6CSA6DQpDOlwgOglDOlwgOglDOg0K OjpcIDoJOjpcIDoJOjoNClw6XCA6CVw6XCA6CVw6DQogXFwgOgkgXFwgOgkNCkNcXCA6CUNc XCA6CQ0KOlxcIDoJOlxcIDoJDQpcXFwgOglcXFwgOglcXFwgOg0KICAgQzoJICAgQzoJDQpD ICBDOglDICBDOgkNCjogIEM6CTogIEM6CQ0KXCAgQzoJXCAgQzoJDQogQyBDOgkgQyBDOgkN CkNDIEM6CUNDIEM6CQ0KOkMgQzoJOkMgQzoJDQpcQyBDOglcQyBDOgkNCiA6IEM6CSA6IEM6 CSA6DQpDOiBDOglDOiBDOglDOg0KOjogQzoJOjogQzoJOjoNClw6IEM6CVw6IEM6CVw6DQog XCBDOgkgXCBDOgkNCkNcIEM6CUNcIEM6CQ0KOlwgQzoJOlwgQzoJDQpcXCBDOglcXCBDOglc XCBDOg0KICBDQzoJICBDQzoJDQpDIENDOglDIENDOgkNCjogQ0M6CTogQ0M6CQ0KXCBDQzoJ XCBDQzoJDQogQ0NDOgkgQ0NDOgkNCkNDQ0M6CUNDQ0M6CQ0KOkNDQzoJOkNDQzoJDQpcQ0ND OglcQ0NDOgkNCiA6Q0M6CSA6Q0M6CSA6DQpDOkNDOglDOkNDOglDOg0KOjpDQzoJOjpDQzoJ OjoNClw6Q0M6CVw6Q0M6CVw6DQogXENDOgkgXENDOgkNCkNcQ0M6CUNcQ0M6CQ0KOlxDQzoJ OlxDQzoJDQpcXENDOglcXENDOglcXENDOg0KICA6QzoJICA6QzoJDQpDIDpDOglDIDpDOgkN CjogOkM6CTogOkM6CQ0KXCA6QzoJXCA6QzoJDQogQzpDOgkgQzpDOgkNCkNDOkM6CUNDOkM6 CQ0KOkM6QzoJOkM6QzoJDQpcQzpDOglcQzpDOgkNCiA6OkM6CSA6OkM6CSA6DQpDOjpDOglD OjpDOglDOg0KOjo6QzoJOjo6QzoJOjoNClw6OkM6CVw6OkM6CVw6DQogXDpDOgkgXDpDOgkN CkNcOkM6CUNcOkM6CQ0KOlw6QzoJOlw6QzoJDQpcXDpDOglcXDpDOglcXDpDOg0KICBcQzoJ ICBcQzoJDQpDIFxDOglDIFxDOgkNCjogXEM6CTogXEM6CQ0KXCBcQzoJXCBcQzoJDQogQ1xD OgkgQ1xDOgkNCkNDXEM6CUNDXEM6CQ0KOkNcQzoJOkNcQzoJDQpcQ1xDOglcQ1xDOgkNCiA6 XEM6CSA6XEM6CSA6DQpDOlxDOglDOlxDOglDOg0KOjpcQzoJOjpcQzoJOjoNClw6XEM6CVw6 XEM6CVw6DQogXFxDOgkgXFxDOgkNCkNcXEM6CUNcXEM6CQ0KOlxcQzoJOlxcQzoJDQpcXFxD OglcXFxDOglcXFxDOg0KICAgOjoJICAgOjoJDQpDICA6OglDICA6OgkNCjogIDo6CTogIDo6 CQ0KXCAgOjoJXCAgOjoJDQogQyA6OgkgQyA6OgkNCkNDIDo6CUNDIDo6CQ0KOkMgOjoJOkMg OjoJDQpcQyA6OglcQyA6OgkNCiA6IDo6CSA6IDo6CSA6DQpDOiA6OglDOiA6OglDOg0KOjog OjoJOjogOjoJOjoNClw6IDo6CVw6IDo6CVw6DQogXCA6OgkgXCA6OgkNCkNcIDo6CUNcIDo6 CQ0KOlwgOjoJOlwgOjoJDQpcXCA6OglcXCA6OglcXCA6Og0KICBDOjoJICBDOjoJDQpDIEM6 OglDIEM6OgkNCjogQzo6CTogQzo6CQ0KXCBDOjoJXCBDOjoJDQogQ0M6OgkgQ0M6OgkNCkND Qzo6CUNDQzo6CQ0KOkNDOjoJOkNDOjoJDQpcQ0M6OglcQ0M6OgkNCiA6Qzo6CSA6Qzo6CSA6 DQpDOkM6OglDOkM6OglDOg0KOjpDOjoJOjpDOjoJOjoNClw6Qzo6CVw6Qzo6CVw6DQogXEM6 OgkgXEM6OgkNCkNcQzo6CUNcQzo6CQ0KOlxDOjoJOlxDOjoJDQpcXEM6OglcXEM6OglcXEM6 Og0KICA6OjoJICA6OjoJDQpDIDo6OglDIDo6OgkNCjogOjo6CTogOjo6CQ0KXCA6OjoJXCA6 OjoJDQogQzo6OgkgQzo6OgkNCkNDOjo6CUNDOjo6CQ0KOkM6OjoJOkM6OjoJDQpcQzo6Oglc Qzo6OgkNCiA6Ojo6CSA6Ojo6CSA6DQpDOjo6OglDOjo6OglDOg0KOjo6OjoJOjo6OjoJOjoN Clw6Ojo6CVw6Ojo6CVw6DQogXDo6OgkgXDo6OgkNCkNcOjo6CUNcOjo6CQ0KOlw6OjoJOlw6 OjoJDQpcXDo6OglcXDo6OglcXDo6Og0KICBcOjoJICBcOjoJDQpDIFw6OglDIFw6OgkNCjog XDo6CTogXDo6CQ0KXCBcOjoJXCBcOjoJDQogQ1w6OgkgQ1w6OgkNCkNDXDo6CUNDXDo6CQ0K OkNcOjoJOkNcOjoJDQpcQ1w6OglcQ1w6OgkNCiA6XDo6CSA6XDo6CSA6DQpDOlw6OglDOlw6 OglDOg0KOjpcOjoJOjpcOjoJOjoNClw6XDo6CVw6XDo6CVw6DQogXFw6OgkgXFw6OgkNCkNc XDo6CUNcXDo6CQ0KOlxcOjoJOlxcOjoJDQpcXFw6OglcXFw6OglcXFw6Og0KICAgXDoJICAg XDoJDQpDICBcOglDICBcOgkNCjogIFw6CTogIFw6CQ0KXCAgXDoJXCAgXDoJDQogQyBcOgkg QyBcOgkNCkNDIFw6CUNDIFw6CQ0KOkMgXDoJOkMgXDoJDQpcQyBcOglcQyBcOgkNCiA6IFw6 CSA6IFw6CSA6DQpDOiBcOglDOiBcOglDOg0KOjogXDoJOjogXDoJOjoNClw6IFw6CVw6IFw6 CVw6DQogXCBcOgkgXCBcOgkNCkNcIFw6CUNcIFw6CQ0KOlwgXDoJOlwgXDoJDQpcXCBcOglc XCBcOglcXCBcOg0KICBDXDoJICBDXDoJDQpDIENcOglDIENcOgkNCjogQ1w6CTogQ1w6CQ0K XCBDXDoJXCBDXDoJDQogQ0NcOgkgQ0NcOgkNCkNDQ1w6CUNDQ1w6CQ0KOkNDXDoJOkNDXDoJ DQpcQ0NcOglcQ0NcOgkNCiA6Q1w6CSA6Q1w6CSA6DQpDOkNcOglDOkNcOglDOg0KOjpDXDoJ OjpDXDoJOjoNClw6Q1w6CVw6Q1w6CVw6DQogXENcOgkgXENcOgkNCkNcQ1w6CUNcQ1w6CQ0K OlxDXDoJOlxDXDoJDQpcXENcOglcXENcOglcXENcOg0KICA6XDoJICA6XDoJDQpDIDpcOglD IDpcOgkNCjogOlw6CTogOlw6CQ0KXCA6XDoJXCA6XDoJDQogQzpcOgkgQzpcOgkNCkNDOlw6 CUNDOlw6CQ0KOkM6XDoJOkM6XDoJDQpcQzpcOglcQzpcOgkNCiA6Olw6CSA6Olw6CSA6DQpD OjpcOglDOjpcOglDOg0KOjo6XDoJOjo6XDoJOjoNClw6Olw6CVw6Olw6CVw6DQogXDpcOgkg XDpcOgkNCkNcOlw6CUNcOlw6CQ0KOlw6XDoJOlw6XDoJDQpcXDpcOglcXDpcOglcXDpcOg0K ICBcXDoJICBcXDoJDQpDIFxcOglDIFxcOgkNCjogXFw6CTogXFw6CQ0KXCBcXDoJXCBcXDoJ DQogQ1xcOgkgQ1xcOgkNCkNDXFw6CUNDXFw6CQ0KOkNcXDoJOkNcXDoJDQpcQ1xcOglcQ1xc OgkNCiA6XFw6CSA6XFw6CSA6DQpDOlxcOglDOlxcOglDOg0KOjpcXDoJOjpcXDoJOjoNClw6 XFw6CVw6XFw6CVw6DQogXFxcOgkgXFxcOgkNCkNcXFw6CUNcXFw6CQ0KOlxcXDoJOlxcXDoJ DQpcXFxcOglcXFxcOglcXFwNCiAgICBcCSAgICAJDQpDICAgXAlDICAgCQ0KOiAgIFwJOiAg IAkNClwgICBcCVwgICAJDQogQyAgXAkgQyAgCQ0KQ0MgIFwJQ0MgIAkNCjpDICBcCTpDICAJ DQpcQyAgXAlcQyAgCQ0KIDogIFwJIDogIAkgOg0KQzogIFwJQzogIAlDOg0KOjogIFwJOjog IAk6Og0KXDogIFwJXDogIAlcOg0KIFwgIFwJIFwgIAkNCkNcICBcCUNcICAJDQo6XCAgXAk6 XCAgCQ0KXFwgIFwJXFwgIAlcXCAgDQogIEMgXAkgIEMgCQ0KQyBDIFwJQyBDIAkNCjogQyBc CTogQyAJDQpcIEMgXAlcIEMgCQ0KIENDIFwJIENDIAkNCkNDQyBcCUNDQyAJDQo6Q0MgXAk6 Q0MgCQ0KXENDIFwJXENDIAkNCiA6QyBcCSA6QyAJIDoNCkM6QyBcCUM6QyAJQzoNCjo6QyBc CTo6QyAJOjoNClw6QyBcCVw6QyAJXDoNCiBcQyBcCSBcQyAJDQpDXEMgXAlDXEMgCQ0KOlxD IFwJOlxDIAkNClxcQyBcCVxcQyAJXFxDIA0KICA6IFwJICA6IAkNCkMgOiBcCUMgOiAJDQo6 IDogXAk6IDogCQ0KXCA6IFwJXCA6IAkNCiBDOiBcCSBDOiAJDQpDQzogXAlDQzogCQ0KOkM6 IFwJOkM6IAkNClxDOiBcCVxDOiAJDQogOjogXAkgOjogCSA6DQpDOjogXAlDOjogCUM6DQo6 OjogXAk6OjogCTo6DQpcOjogXAlcOjogCVw6DQogXDogXAkgXDogCQ0KQ1w6IFwJQ1w6IAkN CjpcOiBcCTpcOiAJDQpcXDogXAlcXDogCVxcOiANCiAgXCBcCSAgXCAJDQpDIFwgXAlDIFwg CQ0KOiBcIFwJOiBcIAkNClwgXCBcCVwgXCAJDQogQ1wgXAkgQ1wgCQ0KQ0NcIFwJQ0NcIAkN CjpDXCBcCTpDXCAJDQpcQ1wgXAlcQ1wgCQ0KIDpcIFwJIDpcIAkgOg0KQzpcIFwJQzpcIAlD Og0KOjpcIFwJOjpcIAk6Og0KXDpcIFwJXDpcIAlcOg0KIFxcIFwJIFxcIAkNCkNcXCBcCUNc XCAJDQo6XFwgXAk6XFwgCQ0KXFxcIFwJXFxcIAlcXFwgDQogICBDXAkgICBDCQ0KQyAgQ1wJ QyAgQwkNCjogIENcCTogIEMJDQpcICBDXAlcICBDCQ0KIEMgQ1wJIEMgQwkNCkNDIENcCUND IEMJDQo6QyBDXAk6QyBDCQ0KXEMgQ1wJXEMgQwkNCiA6IENcCSA6IEMJIDoNCkM6IENcCUM6 IEMJQzoNCjo6IENcCTo6IEMJOjoNClw6IENcCVw6IEMJXDoNCiBcIENcCSBcIEMJDQpDXCBD XAlDXCBDCQ0KOlwgQ1wJOlwgQwkNClxcIENcCVxcIEMJXFwgQw0KICBDQ1wJICBDQwkNCkMg Q0NcCUMgQ0MJDQo6IENDXAk6IENDCQ0KXCBDQ1wJXCBDQwkNCiBDQ0NcCSBDQ0MJDQpDQ0ND XAlDQ0NDCQ0KOkNDQ1wJOkNDQwkNClxDQ0NcCVxDQ0MJDQogOkNDXAkgOkNDCSA6DQpDOkND XAlDOkNDCUM6DQo6OkNDXAk6OkNDCTo6DQpcOkNDXAlcOkNDCVw6DQogXENDXAkgXENDCQ0K Q1xDQ1wJQ1xDQwkNCjpcQ0NcCTpcQ0MJDQpcXENDXAlcXENDCVxcQ0MNCiAgOkNcCSAgOkMJ DQpDIDpDXAlDIDpDCQ0KOiA6Q1wJOiA6QwkNClwgOkNcCVwgOkMJDQogQzpDXAkgQzpDCQ0K Q0M6Q1wJQ0M6QwkNCjpDOkNcCTpDOkMJDQpcQzpDXAlcQzpDCQ0KIDo6Q1wJIDo6QwkgOg0K Qzo6Q1wJQzo6QwlDOg0KOjo6Q1wJOjo6Qwk6Og0KXDo6Q1wJXDo6QwlcOg0KIFw6Q1wJIFw6 QwkNCkNcOkNcCUNcOkMJDQo6XDpDXAk6XDpDCQ0KXFw6Q1wJXFw6QwlcXDpDDQogIFxDXAkg IFxDCQ0KQyBcQ1wJQyBcQwkNCjogXENcCTogXEMJDQpcIFxDXAlcIFxDCQ0KIENcQ1wJIENc QwkNCkNDXENcCUNDXEMJDQo6Q1xDXAk6Q1xDCQ0KXENcQ1wJXENcQwkNCiA6XENcCSA6XEMJ IDoNCkM6XENcCUM6XEMJQzoNCjo6XENcCTo6XEMJOjoNClw6XENcCVw6XEMJXDoNCiBcXENc CSBcXEMJDQpDXFxDXAlDXFxDCQ0KOlxcQ1wJOlxcQwkNClxcXENcCVxcXEMJXFxcQw0KICAg OlwJICAgOlwJDQpDICA6XAlDICA6XAkNCjogIDpcCTogIDpcCQ0KXCAgOlwJXCAgOlwJDQog QyA6XAkgQyA6XAkNCkNDIDpcCUNDIDpcCQ0KOkMgOlwJOkMgOlwJDQpcQyA6XAlcQyA6XAkN CiA6IDpcCSA6IDpcCSA6DQpDOiA6XAlDOiA6XAlDOg0KOjogOlwJOjogOlwJOjoNClw6IDpc CVw6IDpcCVw6DQogXCA6XAkgXCA6XAkNCkNcIDpcCUNcIDpcCQ0KOlwgOlwJOlwgOlwJDQpc XCA6XAlcXCA6XAlcXCA6DQogIEM6XAkgIEM6XAkNCkMgQzpcCUMgQzpcCQ0KOiBDOlwJOiBD OlwJDQpcIEM6XAlcIEM6XAkNCiBDQzpcCSBDQzpcCQ0KQ0NDOlwJQ0NDOlwJDQo6Q0M6XAk6 Q0M6XAkNClxDQzpcCVxDQzpcCQ0KIDpDOlwJIDpDOlwJIDoNCkM6QzpcCUM6QzpcCUM6DQo6 OkM6XAk6OkM6XAk6Og0KXDpDOlwJXDpDOlwJXDoNCiBcQzpcCSBcQzpcCQ0KQ1xDOlwJQ1xD OlwJDQo6XEM6XAk6XEM6XAkNClxcQzpcCVxcQzpcCVxcQzoNCiAgOjpcCSAgOjpcCQ0KQyA6 OlwJQyA6OlwJDQo6IDo6XAk6IDo6XAkNClwgOjpcCVwgOjpcCQ0KIEM6OlwJIEM6OlwJDQpD Qzo6XAlDQzo6XAkNCjpDOjpcCTpDOjpcCQ0KXEM6OlwJXEM6OlwJDQogOjo6XAkgOjo6XAkg Og0KQzo6OlwJQzo6OlwJQzoNCjo6OjpcCTo6OjpcCTo6DQpcOjo6XAlcOjo6XAlcOg0KIFw6 OlwJIFw6OlwJDQpDXDo6XAlDXDo6XAkNCjpcOjpcCTpcOjpcCQ0KXFw6OlwJXFw6OlwJXFw6 Og0KICBcOlwJICBcOlwJDQpDIFw6XAlDIFw6XAkNCjogXDpcCTogXDpcCQ0KXCBcOlwJXCBc OlwJDQogQ1w6XAkgQ1w6XAkNCkNDXDpcCUNDXDpcCQ0KOkNcOlwJOkNcOlwJDQpcQ1w6XAlc Q1w6XAkNCiA6XDpcCSA6XDpcCSA6DQpDOlw6XAlDOlw6XAlDOg0KOjpcOlwJOjpcOlwJOjoN Clw6XDpcCVw6XDpcCVw6DQogXFw6XAkgXFw6XAkNCkNcXDpcCUNcXDpcCQ0KOlxcOlwJOlxc OlwJDQpcXFw6XAlcXFw6XAlcXFw6DQogICBcXAkgICBcXAkNCkMgIFxcCUMgIFxcCQ0KOiAg XFwJOiAgXFwJDQpcICBcXAlcICBcXAkNCiBDIFxcCSBDIFxcCQ0KQ0MgXFwJQ0MgXFwJDQo6 QyBcXAk6QyBcXAkNClxDIFxcCVxDIFxcCQ0KIDogXFwJIDogXFwJIDoNCkM6IFxcCUM6IFxc CUM6DQo6OiBcXAk6OiBcXAk6Og0KXDogXFwJXDogXFwJXDoNCiBcIFxcCSBcIFxcCQ0KQ1wg XFwJQ1wgXFwJDQo6XCBcXAk6XCBcXAkNClxcIFxcCVxcIFxcCVxcIFwNCiAgQ1xcCSAgQ1xc CQ0KQyBDXFwJQyBDXFwJDQo6IENcXAk6IENcXAkNClwgQ1xcCVwgQ1xcCQ0KIENDXFwJIEND XFwJDQpDQ0NcXAlDQ0NcXAkNCjpDQ1xcCTpDQ1xcCQ0KXENDXFwJXENDXFwJDQogOkNcXAkg OkNcXAkgOg0KQzpDXFwJQzpDXFwJQzoNCjo6Q1xcCTo6Q1xcCTo6DQpcOkNcXAlcOkNcXAlc Og0KIFxDXFwJIFxDXFwJDQpDXENcXAlDXENcXAkNCjpcQ1xcCTpcQ1xcCQ0KXFxDXFwJXFxD XFwJXFxDXA0KICA6XFwJICA6XFwJDQpDIDpcXAlDIDpcXAkNCjogOlxcCTogOlxcCQ0KXCA6 XFwJXCA6XFwJDQogQzpcXAkgQzpcXAkNCkNDOlxcCUNDOlxcCQ0KOkM6XFwJOkM6XFwJDQpc QzpcXAlcQzpcXAkNCiA6OlxcCSA6OlxcCSA6DQpDOjpcXAlDOjpcXAlDOg0KOjo6XFwJOjo6 XFwJOjoNClw6OlxcCVw6OlxcCVw6DQogXDpcXAkgXDpcXAkNCkNcOlxcCUNcOlxcCQ0KOlw6 XFwJOlw6XFwJDQpcXDpcXAlcXDpcXAlcXDpcDQogIFxcXAkgIFxcXAkNCkMgXFxcCUMgXFxc CQ0KOiBcXFwJOiBcXFwJDQpcIFxcXAlcIFxcXAkNCiBDXFxcCSBDXFxcCQ0KQ0NcXFwJQ0Nc XFwJDQo6Q1xcXAk6Q1xcXAkNClxDXFxcCVxDXFxcCQ0KIDpcXFwJIDpcXFwJIDoNCkM6XFxc CUM6XFxcCUM6DQo6OlxcXAk6OlxcXAk6Og0KXDpcXFwJXDpcXFwJXDoNCiBcXFxcCSBcXFxc CQ0KQ1xcXFwJQ1xcXFwJDQo6XFxcXAk6XFxcXAkNClxcXFxcCVxcXFxcCVxcXA0K ----------------------4766089795545651 Content-Type: application/octet-stream; name="fn1.dpr" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="fn1.dpr" cHJvZ3JhbSBmbjA7DQoNCnskQVBQVFlQRSBDT05TT0xFfQ0KDQp1c2VzIFN5c1V0aWxzOw0K DQp2YXINCiAgQzogYXJyYXlbMC4uM10gb2YgQ2hhciA9ICcgQzpcJzsNCg0KcHJvY2VkdXJl IFByaW50KFM6IHN0cmluZyk7DQpiZWdpbg0KICBXcml0ZUxuKFMsICM5LCBFeHRyYWN0Rmls ZURpcihTKSwgIzksIEV4dHJhY3RGaWxlRHJpdmUoUykpOw0KZW5kOw0KDQpmdW5jdGlvbiBV UGF0aChkOiBJbnRlZ2VyKTogc3RyaW5nOw0KYmVnaW4NCiAgcmVzdWx0IDo9ICcnOw0KICB3 aGlsZSBkID4gMCBkbw0KICBiZWdpbg0KICAgIHJlc3VsdCA6PSByZXN1bHQgKyBDW2QgbW9k IDRdOw0KICAgIGQgOj0gZCBkaXYgNDsNCiAgZW5kOw0KZW5kOw0KDQp2YXINCiAgbjogSW50 ZWdlcjsNCg0KYmVnaW4NCiAgZm9yIG4gOj0gMCB0byAxMDI0LTEgZG8NCiAgICBQcmludChV UGF0aChuKSk7DQplbmQuDQo= ----------------------4766089795545651--