SSH: Scp abort mechanism improved, experimental SFtpFileSystemInfo class added. SFtp now uses the new Upp::CopyStream() functiion. Cosmetics.

git-svn-id: svn://ultimatepp.org/upp/trunk@12204 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
oblivion 2018-08-30 21:17:32 +00:00
parent 60426689d7
commit 2f2376e3b1
10 changed files with 138 additions and 70 deletions

View file

@ -130,7 +130,7 @@ bool SshChannel::GetEof()
return Run([=]() mutable {
int rc = libssh2_channel_wait_eof(*channel);
if(!WouldBlock(rc) && rc < 0) SetError(rc);
if(!rc) LLOG("EOF message is acknowledged by the server.");
if(!rc) LLOG("EOF message is acknowledged by the server.");;
return !rc;
});
}
@ -272,7 +272,7 @@ int SshChannel::Read(void *ptr, int size, int sid)
if(rc > 0) {
done += rc;
ssh->start_time = msecs();
LLOG("Read stream #" << sid << ": " << rc << " bytes read.");
VLOG("Read stream #" << sid << ": " << rc << " bytes read.");
}
return rc;
}
@ -294,7 +294,7 @@ int SshChannel::Write(const void *ptr, int size, int sid)
if(rc > 0) {
done += rc;
ssh->start_time = msecs();
LLOG("Write stream #" << sid << ": " << rc << " bytes written.");
VLOG("Write stream #" << sid << ": " << rc << " bytes written.");
}
return rc;
}
@ -332,10 +332,12 @@ bool SshChannel::ProcessEvents(String& input)
}
bool SshChannel::Shut(const String& msg)
bool SshChannel::Shut(const String& msg, bool nowait)
{
PutGetEof();
if(Close())
bool eof = false;
if(PutEof() && !nowait)
eof = GetEof();
if(Close() && eof)
WaitClose();
if(!IsNull(msg))
ReportError(-1, msg);

View file

@ -63,7 +63,7 @@ protected:
bool ProcessEvents(String& input);
virtual void ReadWrite(String& in, const void* out, int out_len) {}
bool Shut(const String& msg);
bool Shut(const String& msg, bool nowait = true);
One<LIBSSH2_CHANNEL*> channel;
int done;

View file

@ -182,12 +182,15 @@ bool SFtp::CopyData(Stream& dest, Stream& src, int64 maxsize)
{
int64 size = src.GetSize();
String err;
if(IsError())
return false;
if(size < 0 || size >= maxsize) {
err = Format("Buffer overflow. size = %d (allowed size >= 0 && < %d", size, maxsize);
goto Bailout;
}
if(CopyStream(dest, src) < 0) {
if(CopyStream(dest, src, src.GetSize(), WhenProgress, ssh->chunk_size) < 0) {
err = "File transfer is aborted.";
goto Bailout;
}
@ -200,28 +203,6 @@ Bailout:
return false;
}
int64 SFtp::CopyStream(Stream& dest, Stream& src)
{
// Note: This is a modified version of Upp::CopyStream (Core/Stream.cpp, ln: 1397-1412.
// This variant reports the correct size via WhenProgress & allows us to adjsut the chunk size.
int64 count = src.GetSize();
int block = (int)min<int64>(count, ssh->chunk_size);
Buffer<byte> temp(block);
int loaded;
int64 done_ = 0;
int64 total_ = count;
while(count > 0 && (loaded = src.Get(~temp, (int)min<int64>(count, block))) > 0) {
dest.Put(~temp, loaded);
count -= loaded;
done_ += loaded;
if(WhenProgress(done_, total_))
return -1;
}
LLOG(Format("%d of %d bytes successfully transferred.", done_, total_));
return done_;
}
bool SFtp::SaveFile(const char *path, const String& data)
{
StringStream in(data);
@ -585,6 +566,23 @@ String SFtp::DirEntry::ToXml() const
.Text(GetName());
}
FileSystemInfo::FileInfo SFtp::DirEntry::ToFileInfo() const
{
FileSystemInfo::FileInfo fi;
fi.filename = GetName();
fi.length = GetSize();
fi.unix_mode = GetPermissions();
fi.creation_time = GetLastModified();
fi.last_access_time = GetLastAccessed();
fi.last_write_time = GetLastModified();
fi.is_file = IsFile();
fi.is_directory = IsDirectory();
fi.is_symlink = IsSymLink();
fi.is_read_only = IsReadOnly();
fi.root_style = FileSystemInfo::ROOT_FIXED;
return pick(fi);
}
bool SFtp::DirEntry::CanMode(dword u, dword g, dword o) const
{
return a->flags & LIBSSH2_SFTP_ATTR_PERMISSIONS &&
@ -612,4 +610,48 @@ SFtp::DirEntry::DirEntry(const String& path, const SFtpAttrs& attrs)
filename = path;
*a = attrs;
}
// Experimental stuff!
Array<FileSystemInfo::FileInfo> SFtpFileSystemInfo::Find(String mask, int max_count, bool unmounted) const
{
ASSERT(browser);
// TODO: Handle wildcards and "root" properly.
Array<FileInfo> fi;
if(!browser->InProgress()) {
if(IsNull(mask)) { // || mask.StartsWith("/media/*")) {
String dir;
if(!browser->RealizePath(".", dir))
return pick(fi);
mask = dir;
}
mask.Replace("*", "");
auto e = browser->GetInfo(mask);
if(e) {
if(e.IsDirectory()) {
if(max_count == 1) {
fi.Add(e.ToFileInfo());
}
else {
SFtp::DirList ls;
if(browser->ListDir(mask, ls))
for(const auto& ee : ls)
fi.Add(ee.ToFileInfo());
}
}
else
fi.Add(e.ToFileInfo());
}
}
return pick(fi);
}
bool SFtpFileSystemInfo::CreateFolder(String path, String& error) const
{
ASSERT(browser);
if(!browser->MakeDir(path, 0))
error = browser->GetErrorDesc();
return !browser->IsError();
}
}

View file

@ -37,10 +37,12 @@ public:
int64 GetSize() const { return a->flags & LIBSSH2_SFTP_ATTR_SIZE ? a->filesize : -1; }
Time GetLastModified() const { return a->flags & LIBSSH2_SFTP_ATTR_ACMODTIME ? TimeFromUTC(a->mtime) : Null; }
Time GetLastAccessed() const { return a->flags & LIBSSH2_SFTP_ATTR_ACMODTIME ? TimeFromUTC(a->atime) : Null; }
dword GetPermissions() const { return a->permissions; }
SFtpAttrs& GetAttrs() { return *a; }
const SFtpAttrs& operator~() const { return *a; }
SFtpAttrs& operator*() { return *a; }
operator bool() const { return valid; }
bool IsFile() const { return LIBSSH2_SFTP_S_ISREG(a->permissions); }
bool IsDirectory() const { return LIBSSH2_SFTP_S_ISDIR(a->permissions); }
@ -56,6 +58,7 @@ public:
String ToString() const;
String ToXml() const;
FileSystemInfo::FileInfo ToFileInfo() const;
DirEntry(const String& path);
DirEntry(const String& path, const SFtpAttrs& attrs);
@ -154,7 +157,6 @@ private:
bool Read(SFtpHandle handle, void* ptr, int size);
bool Write(SFtpHandle handle, const void* ptr, int size);
bool CopyData(Stream& dest, Stream& src, int64 maxsize = INT64_MAX);
int64 CopyStream(Stream& dest, Stream& src);
One<LIBSSH2_SFTP*> sftp_session;
int done;
@ -226,3 +228,20 @@ public:
SFtpFileIn(SFtp& sftp, const char *fn) { Open(sftp, fn); }
SFtpFileIn() {}
};
// Experimental stuff!
class SFtpFileSystemInfo : public FileSystemInfo {
public:
SFtpFileSystemInfo& Mount(SFtp& sftp) { browser = &sftp; return *this; }
int GetStyle() const final { return STYLE_POSIX; }
operator FileSystemInfo&() { return static_cast<FileSystemInfo&>(*this); }
bool CreateFolder(String path, String& error) const final;
Array<FileSystemInfo::FileInfo> Find(String mask, int max_count = INT_MAX, bool unmounted = false) const final;
SFtpFileSystemInfo(SFtp& sftp) { Mount(sftp); }
SFtpFileSystemInfo() { browser = nullptr; }
private:
SFtp *browser = nullptr;
};

View file

@ -18,11 +18,11 @@ namespace Upp {
INITIALIZE(SSH);
using SFtpHandle = LIBSSH2_SFTP_HANDLE*;
using SFtpAttrs = LIBSSH2_SFTP_ATTRIBUTES;
using ScpAttrs = libssh2_struct_stat;
using SshHost = libssh2_knownhost;
using SshAgent = LIBSSH2_AGENT;
using SFtpHandle = LIBSSH2_SFTP_HANDLE*;
using SFtpAttrs = LIBSSH2_SFTP_ATTRIBUTES;
using ScpAttrs = libssh2_struct_stat;
using SshHost = libssh2_knownhost;
using SshAgent = LIBSSH2_AGENT;
using SshX11Handle = LIBSSH2_CHANNEL*;
namespace SSH {

View file

@ -40,6 +40,7 @@ bool Scp::OpenWrite(const String& path, int64 size, long mode)
bool Scp::Load(Stream& s, ScpAttrs a, int64 maxsize)
{
bool nowait = false;
int64 done_ = 0;
int64 size = a.st_size;
String msg;
@ -55,21 +56,22 @@ bool Scp::Load(Stream& s, ScpAttrs a, int64 maxsize)
if(n > 0) {
done_ += n;
s.Put(chunk, n);
if(WhenProgress(done_, size)) {
if((nowait = WhenProgress(done_, size))) {
msg = "File transfer aborted.";
break;
}
}
}
return Shut(msg);
return Shut(msg, nowait);
}
bool Scp::Save(Stream& s)
{
bool nowait = false;
int64 done_ = 0;
int64 size = s.GetSize();
String msg;
Buffer<char> chunk(ssh->chunk_size, 0);
while(done_ < size && !IsEof() && !IsError()) {
@ -79,13 +81,13 @@ bool Scp::Save(Stream& s)
done_ += n;
if(n < l)
s.Seek(n);
if(WhenProgress(done_, size)) {
if((nowait = WhenProgress(done_, size))) {
msg = "File transfer aborted.";;
break;
}
}
}
return Shut(msg);
return Shut(msg, nowait);
}
bool Scp::SaveFile(const char *path, const String& data)

View file

@ -60,7 +60,7 @@ object. &]
[s1;:Upp`:`:SFtpFileIn`:`:class: [@(0.0.255)3 class][3 _][*3 SFtpFileIn][3 _:_][@(0.0.255)3 publ
ic][3 _][*@3;3 SFtpStream]&]
[s2;%% A simple helper class that represents SFtpStream in read mode.&]
[s0; &]
[s3; &]
[ {{10000F(128)G(128)@1 [s0;%% [* Public Method List]]}}&]
[s3; &]
[s5;:Upp`:`:SFtpFileIn`:`:Open`(Upp`:`:SFtp`&`,const char`*`): [@(0.0.255) bool]_[* Open](

View file

@ -1,9 +1,9 @@
TITLE("SFtpStream")
COMPRESSED
120,156,229,88,11,79,219,86,20,254,43,87,162,160,36,74,195,125,249,173,73,233,152,40,213,54,81,141,77,154,100,153,248,198,190,33,94,29,219,181,157,85,21,130,223,190,115,175,77,98,32,148,164,162,168,101,8,197,216,247,60,191,243,157,227,19,252,132,115,219,19,212,240,62,252,122,234,120,20,189,122,69,134,120,143,89,132,217,6,35,156,154,240,65,24,161,6,101,156,216,212,225,54,99,54,118,163,84,84,85,224,167,212,182,181,18,29,210,61,106,25,148,88,220,230,54,97,150,77,65,151,98,76,177,69,13,194,153,77,13,55,150,85,20,248,24,196,25,248,112,76,230,96,130,177,69,8,102,212,194,204,224,132,48,10,38,168,69,9,54,92,153,197,129,127,98,122,74,129,131,2,54,76,140,177,9,214,56,199,96,93,169,113,70,24,166,204,32,142,97,186,83,121,145,100,129,127,63,37,227,209,148,44,236,38,181,92,180,25,9,238,13,198,134,71,64,213,28,154,123,22,184,229,6,56,115,84,70,12,212,40,53,13,135,24,28,66,226,152,186,165,252,184,76,74,185,
144,89,221,90,72,8,161,196,155,18,203,131,16,174,175,175,71,132,227,6,41,11,98,33,24,226,166,4,158,65,30,22,49,28,236,24,54,177,49,179,56,53,44,72,189,16,165,88,180,153,76,57,245,218,60,236,161,189,103,18,19,16,197,54,196,111,56,96,0,67,18,112,5,32,13,248,101,182,91,183,202,74,79,41,57,67,103,15,64,98,6,182,28,108,113,203,224,144,9,37,38,1,32,177,202,31,202,224,102,121,185,16,105,224,43,5,172,176,126,228,199,253,69,206,196,50,133,116,47,39,87,200,71,151,151,68,61,30,247,160,132,35,78,71,184,143,252,10,123,251,251,200,31,140,45,143,163,179,227,186,56,171,75,9,145,5,87,87,7,129,95,49,15,169,11,241,220,191,138,34,116,67,119,45,162,238,52,195,92,228,143,123,120,132,71,144,108,159,161,150,117,12,77,2,127,192,186,54,213,51,23,158,118,165,139,229,52,77,162,27,241,49,243,24,250,57,205,163,15,173,138,114,78,85,132,127,206,147,170,49,141,146,69,145,234,50,86,168,158,75,148,23,178,20,117,146,
103,21,202,164,140,101,140,234,28,45,68,38,46,36,170,180,21,37,39,106,36,74,137,196,52,149,234,28,30,199,72,100,49,250,84,2,165,208,84,185,172,80,62,67,177,168,5,154,149,249,66,219,246,207,235,188,72,34,72,245,48,60,60,202,75,25,30,158,157,157,132,135,85,25,133,135,10,145,201,89,53,135,15,200,49,156,200,44,124,189,172,194,189,14,82,43,140,206,53,14,1,154,37,224,191,250,92,1,141,81,62,253,71,70,117,53,130,208,74,8,5,92,22,121,149,168,76,70,104,141,253,77,213,142,123,132,218,253,183,250,115,76,214,133,67,239,53,130,232,119,89,207,243,24,253,150,84,245,157,226,25,15,20,175,1,46,47,209,52,207,211,176,23,246,35,192,176,118,149,205,155,163,137,58,10,122,253,73,167,102,72,139,173,43,243,135,172,151,37,128,95,151,75,137,146,153,198,173,193,29,65,201,192,82,54,234,4,195,191,28,211,41,136,135,189,46,130,7,225,80,59,68,209,92,148,225,32,28,182,135,241,167,188,140,195,97,146,213,97,255,22,3,117,58,193,4,
178,80,198,130,158,63,57,239,216,107,11,209,149,15,15,148,244,152,161,106,6,39,67,116,63,215,219,233,67,28,193,36,28,104,21,85,207,76,44,164,82,91,249,209,161,157,35,125,105,77,47,242,88,222,49,13,145,183,135,34,90,128,193,159,192,11,67,216,228,60,232,175,192,85,41,84,72,0,95,23,57,240,244,62,125,128,51,96,8,72,63,253,140,252,253,215,183,98,2,23,168,42,100,148,204,18,16,104,79,117,36,168,39,42,20,203,89,146,193,1,72,109,224,185,166,120,91,152,21,181,59,173,217,161,118,183,97,251,195,166,173,146,122,126,227,59,66,239,79,207,222,253,13,105,70,18,218,183,76,46,230,192,250,219,188,201,33,210,165,62,87,7,122,80,171,180,255,21,105,178,138,92,151,167,77,251,166,67,0,162,45,88,245,86,214,39,16,85,42,187,44,191,69,139,230,184,33,71,243,183,102,208,74,113,219,30,0,238,3,36,121,148,8,85,19,21,113,83,179,185,182,210,109,132,45,187,251,72,57,42,151,145,234,211,88,214,34,73,183,236,238,206,221,215,244,211,
160,59,184,127,236,30,58,130,28,106,77,39,61,230,111,134,83,41,11,32,25,188,70,146,236,226,165,118,216,246,141,180,77,27,117,41,181,129,36,107,196,219,189,163,169,124,67,222,209,125,206,127,121,15,57,6,140,223,101,107,178,183,157,126,123,19,105,132,118,216,68,90,171,91,110,34,157,236,86,185,189,65,149,94,64,208,92,166,240,150,108,119,18,189,96,172,24,85,117,52,85,241,245,182,161,104,161,81,192,223,228,189,190,134,226,241,119,232,247,240,194,220,229,29,167,185,126,175,247,102,48,18,21,178,170,127,191,249,251,166,75,194,167,30,218,235,210,117,238,30,45,224,160,75,232,151,91,180,29,107,179,121,134,109,70,120,3,140,143,207,48,188,227,12,59,93,222,237,219,251,35,12,100,118,156,97,202,234,51,15,177,230,155,210,106,138,109,221,12,95,49,199,90,60,182,248,50,240,29,173,255,79,191,218,63,220,65,170,22,47,98,236,181,149,238,222,238,48,248,84,23,252,80,147,111,167,186,61,217,228,219,4,242,38,36,159,126,129,123,83,20,234,31,132,143,205,
191,70,108,199,17,216,218,126,230,41,40,180,215,231,88,230,214,160,252,159,22,186,6,223,23,49,219,214,5,188,243,100,135,9,215,146,252,37,151,240,201,198,220,195,120,63,0,234,54,203,30,28,6,193,127,23,113,244,7,
120,156,229,88,11,79,219,86,20,254,43,87,162,160,36,74,195,125,249,173,73,233,152,90,170,109,162,26,155,52,201,50,241,141,125,67,188,58,182,107,59,171,42,4,191,125,231,94,155,196,64,40,73,149,86,45,67,40,198,190,231,249,157,239,28,159,224,39,156,219,158,160,134,247,254,215,51,199,163,232,197,11,50,196,7,204,34,204,54,24,225,212,132,15,194,8,53,40,227,196,166,14,183,25,179,177,27,165,162,170,2,63,165,182,173,149,232,144,30,80,203,160,196,226,54,183,9,179,108,10,186,20,99,138,45,106,16,206,108,106,184,177,172,162,192,199,32,206,192,135,99,50,7,19,140,45,66,48,163,22,102,6,39,132,81,48,65,45,74,176,225,202,44,14,252,83,211,83,10,28,20,176,97,98,140,77,176,198,57,6,235,74,141,51,194,48,101,6,113,12,211,157,202,203,36,11,252,135,41,25,79,166,100,97,55,169,229,162,205,72,112,111,48,54,60,2,170,230,208,60,176,192,45,55,192,153,163,50,98,160,70,169,105,56,196,224,16,18,199,212,45,229,135,101,82,202,
133,204,234,214,66,66,8,37,222,148,88,30,132,112,115,115,51,34,28,55,72,89,16,11,193,16,55,37,240,12,242,176,136,225,96,199,176,137,141,153,197,169,97,65,234,133,40,197,162,205,100,202,169,215,230,97,15,237,3,147,152,128,40,182,33,126,195,1,3,24,146,128,43,0,105,192,47,179,221,186,85,86,122,74,201,25,58,7,0,18,51,176,229,96,139,91,6,135,76,40,49,9,0,137,85,254,80,6,55,203,203,133,72,3,95,41,96,133,245,19,63,238,47,114,38,150,41,164,123,53,185,70,62,186,186,34,234,241,184,7,37,28,113,58,194,125,228,87,216,59,60,68,254,96,108,121,28,157,191,174,139,243,186,148,16,89,112,125,125,20,248,21,243,144,186,16,207,253,171,40,66,55,116,215,34,234,78,51,204,69,254,184,135,71,120,4,201,246,25,106,89,199,208,36,240,7,172,107,83,61,115,225,105,87,186,88,78,211,36,186,21,31,51,143,161,159,211,60,122,223,170,40,231,84,69,248,231,60,169,26,211,40,89,20,169,46,99,133,234,185,68,121,33,75,81,39,
121,86,161,76,202,88,198,168,206,209,66,100,226,82,162,74,91,81,114,162,70,162,148,72,76,83,169,206,225,113,140,68,22,163,143,37,80,10,77,149,203,10,229,51,20,139,90,160,89,153,47,180,109,255,162,206,139,36,130,84,143,195,227,147,188,148,225,241,249,249,105,120,92,149,81,120,172,16,153,156,87,115,248,128,28,195,137,204,194,151,203,42,60,232,32,181,194,232,66,227,16,160,89,2,254,171,79,21,208,24,229,211,127,100,84,87,35,8,173,132,80,192,101,145,87,137,202,100,132,214,216,223,86,237,117,143,80,187,255,70,127,142,201,186,112,232,157,70,16,253,46,235,121,30,163,223,146,170,190,87,60,227,145,226,53,192,229,37,154,230,121,26,246,194,126,4,24,214,174,178,121,123,52,81,71,65,175,63,233,212,12,105,177,117,101,254,144,245,178,4,240,235,114,41,81,50,211,184,53,184,35,40,25,88,202,70,157,96,248,231,99,58,3,241,176,215,69,240,40,28,106,135,40,154,139,50,28,132,195,246,48,254,152,151,113,56,76,178,58,236,223,97,160,78,39,152,
64,22,202,88,208,243,39,23,29,123,109,33,186,242,225,145,146,30,51,84,205,224,100,136,30,230,122,55,125,136,35,152,132,3,173,162,234,153,137,133,84,106,43,63,58,180,11,164,47,173,233,69,30,203,123,166,33,242,246,80,68,11,48,248,19,120,97,8,155,156,7,253,21,184,42,133,10,9,224,235,34,7,158,62,164,15,112,6,12,1,233,167,159,144,127,248,242,78,76,224,2,85,133,140,146,89,2,2,237,169,142,4,245,68,133,98,57,75,50,56,0,169,13,60,215,20,111,11,179,162,118,167,53,59,212,238,54,108,127,216,180,85,82,207,111,125,71,232,221,217,249,219,191,33,205,72,66,251,150,201,229,28,88,127,151,55,57,68,186,212,231,234,64,15,106,149,246,191,34,77,86,145,235,242,180,105,223,118,8,64,180,5,171,222,200,250,20,162,74,101,151,229,119,104,209,28,55,228,104,254,214,12,90,41,110,219,3,192,125,128,36,143,18,161,106,162,34,110,106,54,215,86,186,141,176,101,119,159,40,71,229,50,82,125,26,203,90,36,233,150,221,221,185,251,146,126,
26,116,7,247,143,221,67,39,144,67,173,233,164,199,252,237,112,42,101,1,36,131,215,72,146,93,62,215,14,219,190,145,182,105,163,46,165,54,144,100,141,120,187,119,52,149,111,200,59,122,200,249,207,239,33,175,1,227,183,217,154,236,109,167,223,221,68,26,161,29,54,145,214,234,150,155,72,39,187,85,110,175,80,165,23,16,52,151,41,188,37,219,157,68,47,24,43,70,85,29,77,85,124,189,109,40,90,108,64,97,95,239,245,53,20,79,191,67,191,135,23,230,46,239,56,205,245,7,189,55,131,145,168,144,85,253,251,213,223,55,93,18,238,123,104,175,75,215,185,123,178,128,131,46,161,159,111,209,118,172,205,230,25,182,25,225,13,48,62,61,195,240,142,51,236,108,121,191,111,31,142,48,144,217,113,134,41,171,223,120,136,53,223,148,58,83,108,203,102,248,130,57,214,226,177,197,151,129,239,104,253,223,255,106,255,120,7,169,90,60,139,177,215,86,186,123,187,195,224,83,93,240,67,77,190,157,234,182,183,201,183,9,228,77,72,238,127,129,123,85,20,234,31,132,79,205,
191,70,108,199,17,216,218,254,198,83,80,104,175,235,49,136,191,218,50,183,6,229,255,180,208,53,248,62,139,217,182,46,224,189,39,59,76,184,150,228,207,185,132,123,27,115,143,227,253,8,168,219,44,123,112,24,4,255,1,64,135,244,10,

View file

@ -18,7 +18,10 @@ sh]&]
for a range of operations on remote file system objects, such
as file/directory creation, deletion, renaming, file transfers,
directory listings etc. SFtp class is derived from [^topic`:`/`/Core`/SSH`/src`/Upp`_Ssh`_Base`_en`-us`#Upp`:`:Ssh`:`:class^ S
sh] base class, and has pick semantics.&]
sh] base class, and has pick semantics. See also [^topic`:`/`/Core`/SSH`/src`/Upp`_Ssh`_SFtpStream`_en`-us`#Upp`:`:SFtpStream`:`:class^ S
FtpStream], and [^topic`:`/`/Core`/SSH`/src`/Upp`_Ssh`_SFtp`_en`-us`#Upp`:`:SFtp`:`:DirEntry`:`:class^ S
Ftp`::DirEntry] classes. &]
[s0;#l288; &]
[s3;%- &]
[ {{10000F(128)G(128)@1 [s0; [* Public Method List]]}}&]
[s3;%- &]
@ -539,7 +542,7 @@ irEntry]([@(0.0.255) const]_[_^Upp`:`:String^ String][@(0.0.255) `&]_[*@3 path],
[s3; &]
[s0;%- &]
[ {{10000@(113.42.0) [s0; [*@7;4 SFtp`::DirList]]}}&]
[s4;%- &]
[s3;%- &]
[s5;:Upp`:`:SFtp`:`:DirList`:`:typedef:%- [@(0.0.255) typedef]_[_^Upp`:`:Vector^ Vector]<
[_^Upp`:`:SFtp`:`:DirEntry^ DirEntry]>_[* DirList]&]
[s2; SFtp`::DirList is a Vector containing SFtp`::DirEntry elements.&]

View file

@ -1,22 +1,22 @@
TITLE("SFtp")
COMPRESSED
120,156,221,93,13,83,227,56,210,254,43,170,154,219,61,152,10,25,219,73,72,72,246,182,96,128,101,168,227,171,8,236,204,91,84,32,78,172,16,31,142,157,179,108,102,216,189,157,223,126,221,146,108,203,137,157,56,137,89,246,222,169,25,18,108,117,75,253,116,171,37,181,90,154,59,187,94,111,117,76,163,209,121,250,231,229,94,199,32,127,251,155,94,209,222,213,154,122,173,213,168,233,117,99,23,126,232,53,221,104,24,181,186,222,50,246,234,173,90,173,165,181,135,142,201,88,239,206,49,90,45,78,100,84,140,119,70,179,97,232,205,122,171,222,210,107,205,150,1,180,134,166,25,90,211,104,232,245,90,203,104,180,45,202,134,189,59,13,138,215,160,142,189,221,218,158,166,107,90,83,215,181,154,209,212,106,141,186,174,215,12,96,97,52,13,93,107,180,169,107,245,238,62,237,118,144,160,14,4,90,99,87,211,180,93,224,86,175,107,192,29,201,234,53,189,166,25,181,134,190,215,216,109,15,232,163,237,246,238,230,69,106,44,21,169,169,181,237,128,78,164,68,102,189,243,126,
191,209,209,129,116,183,178,251,174,9,213,214,27,80,217,30,74,84,3,50,195,216,109,236,233,141,58,52,169,174,25,109,159,254,59,180,125,58,161,110,32,57,216,186,110,232,157,129,222,236,64,19,190,127,255,94,213,235,154,64,170,9,109,209,53,104,183,161,195,51,144,163,169,55,246,180,189,70,75,111,105,181,102,221,104,52,65,244,169,233,155,19,41,201,160,110,116,164,28,173,74,235,221,174,190,11,136,106,45,104,127,99,15,24,104,32,4,124,2,144,13,248,91,107,181,3,73,140,116,72,180,87,217,123,7,32,213,26,90,115,79,107,214,155,141,58,72,98,232,187,58,0,169,161,252,160,134,182,235,249,19,211,233,221,33,129,134,88,47,249,211,62,162,35,51,116,64,220,223,31,254,248,225,248,98,231,182,75,238,200,239,191,235,248,114,127,11,20,89,173,27,85,109,155,220,49,173,67,238,222,239,55,59,117,210,253,37,152,246,122,127,252,241,99,239,142,213,58,63,236,16,252,162,119,218,183,211,105,191,221,111,227,107,252,228,182,213,134,215,119,251,91,90,85,171,130,
160,219,53,34,45,174,70,30,122,119,239,107,156,23,193,95,219,240,187,90,110,26,14,28,123,24,21,220,175,117,160,44,27,247,176,42,173,243,142,43,135,220,140,109,38,24,18,234,14,205,41,11,29,51,160,140,152,46,233,118,63,25,192,252,230,138,176,112,192,94,24,24,69,149,156,6,196,116,28,239,43,35,35,207,39,38,241,77,247,145,18,111,68,188,41,245,205,192,246,92,70,60,151,128,5,120,1,37,35,219,161,68,144,18,111,240,47,58,12,88,5,184,13,199,196,100,252,229,7,11,140,101,24,120,254,11,25,250,148,211,87,136,69,29,42,190,249,212,53,39,182,251,88,17,156,2,168,141,141,168,15,76,18,58,199,102,1,20,129,246,7,195,170,0,67,200,3,130,89,212,183,159,169,69,70,190,55,33,119,247,129,55,181,135,128,235,135,254,135,67,207,167,253,15,32,98,255,3,243,135,253,15,8,252,3,160,211,127,248,104,50,218,127,160,110,127,39,100,253,119,145,66,224,77,164,143,123,142,34,25,64,57,81,83,5,208,178,200,24,68,2,246,79,132,209,137,
233,6,246,144,85,85,237,70,22,241,203,150,110,180,182,79,248,207,125,61,50,10,114,197,117,69,206,105,48,246,44,114,6,50,205,153,71,99,206,60,110,236,9,245,194,160,191,101,187,65,127,155,219,201,195,189,82,230,94,216,153,98,20,164,255,99,239,1,170,147,148,189,45,245,29,112,193,151,251,53,50,97,189,109,172,210,232,144,46,13,24,9,68,113,242,108,58,33,133,114,100,98,3,236,116,232,185,22,171,98,17,212,0,9,198,116,166,100,224,145,139,208,113,192,18,145,9,188,230,234,17,150,128,213,121,100,224,120,195,39,36,158,120,22,21,226,114,97,235,249,82,31,142,67,247,169,107,255,70,215,144,59,166,205,147,156,253,54,35,57,52,122,136,68,132,1,21,10,116,247,195,142,44,200,187,128,101,6,208,11,168,105,49,110,5,95,125,112,158,128,201,13,208,89,194,49,168,244,96,147,187,245,127,146,107,26,132,62,244,148,254,251,0,251,31,242,153,8,205,15,199,166,237,2,30,213,98,88,156,208,224,19,84,235,0,22,253,109,80,7,11,36,26,103,167,31,
177,255,130,77,67,7,238,63,124,58,184,56,58,59,190,39,153,143,211,64,189,231,64,197,140,123,91,219,15,234,123,94,73,79,66,20,201,97,146,169,7,24,82,31,1,66,200,28,123,192,216,216,32,108,4,250,102,148,49,232,206,208,67,144,33,186,7,112,1,67,138,29,231,226,246,236,12,31,140,76,219,9,125,154,234,49,139,228,190,156,66,7,221,226,109,33,209,171,192,7,220,250,63,246,43,242,129,245,213,243,173,126,197,241,224,105,134,145,8,241,132,169,72,81,81,112,228,156,54,14,33,241,131,66,205,107,2,74,254,153,97,102,96,30,83,51,24,247,42,74,149,188,53,247,132,127,200,50,35,199,124,100,88,72,97,128,173,141,58,33,244,8,97,140,90,71,56,107,108,155,48,73,213,191,162,17,198,222,208,12,34,3,229,45,32,95,237,0,156,45,71,59,122,33,170,229,214,42,159,240,154,170,138,54,57,223,12,117,33,205,172,202,200,47,73,97,240,253,131,0,12,24,92,110,200,132,75,0,243,150,166,61,9,65,89,3,108,187,67,193,119,38,69,40,57,116,
60,70,183,182,163,146,95,199,20,248,67,63,96,99,106,85,165,173,201,15,172,77,142,40,89,98,181,149,210,77,152,123,192,252,168,99,194,220,163,125,24,248,14,247,30,199,23,55,199,215,109,62,17,105,26,0,42,146,31,2,253,245,241,193,81,111,231,63,2,99,14,128,237,242,142,205,225,169,230,50,60,59,254,229,38,102,247,61,205,243,243,245,233,205,241,28,83,238,35,150,112,189,62,61,249,148,203,246,224,234,234,248,98,190,177,230,20,126,93,214,220,155,203,171,60,182,135,0,1,111,238,33,14,197,52,98,60,34,118,64,44,143,50,183,255,247,128,208,111,48,54,165,216,231,112,59,254,114,120,118,219,61,253,149,51,52,67,112,2,68,154,238,191,67,10,150,0,158,2,77,8,249,227,99,24,232,113,160,198,26,77,7,97,127,17,85,129,47,21,237,226,10,22,70,100,58,204,67,75,98,83,58,180,71,54,208,113,38,232,73,177,12,124,66,117,86,62,6,31,47,111,110,46,207,243,96,184,185,190,189,56,60,152,213,27,154,126,224,135,48,71,66,100,108,222,254,
223,168,239,145,45,152,218,13,94,184,211,63,151,22,142,181,139,158,167,52,93,245,232,139,236,152,119,70,70,182,96,62,53,177,185,227,100,219,89,86,157,180,30,126,75,126,224,108,2,165,56,189,190,237,94,87,200,233,103,241,241,69,124,92,127,254,114,11,114,221,50,112,213,74,5,153,250,76,16,57,189,62,185,190,66,94,226,227,139,248,0,94,39,192,235,196,247,194,169,202,108,25,175,203,155,79,200,75,124,124,17,31,192,235,18,120,93,37,92,248,160,232,129,101,248,203,91,119,112,118,6,196,215,216,87,37,150,124,114,234,56,203,40,63,11,202,207,188,67,174,70,250,69,144,30,127,163,195,48,48,7,96,33,131,151,34,116,32,233,1,106,192,245,161,19,248,246,48,160,153,141,94,62,244,163,109,162,200,121,195,224,106,67,30,114,42,107,216,139,38,80,162,247,200,161,42,53,42,161,164,216,199,113,162,243,87,30,118,138,105,129,155,79,57,106,224,172,254,92,61,224,104,196,245,192,1,253,106,195,116,29,208,226,171,49,225,88,231,189,255,255,182,202,56,139,254,
214,156,66,164,170,20,56,159,61,219,18,203,6,36,1,181,20,80,35,96,43,36,140,225,231,196,98,218,198,209,146,26,144,165,242,80,225,195,7,106,14,132,5,45,225,183,35,219,143,37,103,249,32,37,56,174,131,206,53,46,185,115,173,185,178,200,200,21,228,6,158,231,112,228,4,187,18,44,218,115,172,104,78,189,41,43,151,126,77,245,15,209,198,216,154,83,243,105,17,57,16,26,139,154,160,172,2,35,86,73,151,128,57,130,218,19,170,164,24,236,71,24,243,88,226,68,178,240,21,116,101,123,12,193,85,177,217,153,101,69,190,184,197,164,237,190,184,195,66,61,48,150,19,41,214,237,128,72,59,246,61,23,22,224,138,72,98,197,106,225,176,157,238,145,209,26,86,58,76,6,118,96,62,226,106,254,217,30,210,141,37,167,244,41,75,242,104,209,10,109,218,173,175,22,211,64,150,171,66,163,174,76,121,149,247,132,127,68,198,224,49,27,35,112,74,44,132,62,49,197,238,227,2,124,221,145,90,142,230,226,90,45,53,236,113,229,177,124,11,202,149,141,8,202,117,45,
41,214,61,70,133,66,223,167,110,16,67,65,182,0,10,190,16,216,22,94,3,11,241,56,60,10,134,33,210,162,56,21,159,121,192,136,80,206,188,3,24,149,234,67,230,35,22,185,33,138,183,154,77,148,48,147,56,55,159,232,2,21,168,161,167,44,159,38,201,75,140,54,45,11,36,225,108,68,174,237,205,92,141,144,94,70,208,104,38,68,180,158,243,187,6,243,127,94,132,216,162,121,132,36,125,173,161,46,238,156,75,13,117,77,225,49,166,207,69,207,119,254,241,100,192,246,177,244,66,64,36,187,77,28,255,76,117,247,68,126,201,70,13,247,89,98,212,36,46,252,153,116,135,30,120,51,112,135,224,231,230,128,84,92,93,238,44,56,119,254,116,163,78,104,113,117,226,43,90,160,207,208,107,121,215,85,70,236,164,98,160,164,147,105,240,82,116,22,22,235,104,113,100,121,61,61,149,30,82,222,64,127,151,207,212,119,60,211,170,22,210,100,177,169,95,57,154,42,186,3,128,206,243,204,118,159,150,234,106,185,111,137,88,149,177,74,241,237,199,180,142,10,16,5,166,255,
72,131,12,15,205,94,38,3,15,183,5,29,104,93,52,45,141,22,35,88,147,237,154,124,231,109,126,159,117,115,87,109,90,37,193,27,177,122,149,46,176,58,188,215,148,193,72,50,15,239,236,206,9,192,109,7,12,86,120,223,226,23,146,83,9,216,58,176,22,185,130,106,202,129,55,226,246,23,66,216,17,16,15,189,201,212,161,223,112,39,223,1,83,125,230,171,107,192,29,17,167,86,38,224,116,52,2,251,197,162,229,162,14,51,255,131,32,240,51,87,13,170,99,23,133,22,33,30,113,218,116,236,229,76,68,113,193,47,19,92,147,191,138,176,61,137,54,165,241,177,61,8,209,81,128,163,158,119,0,185,235,11,210,75,150,113,130,119,121,200,46,31,54,87,66,247,85,70,204,215,69,125,118,42,93,54,214,221,69,86,156,134,191,16,218,221,245,109,121,161,118,214,4,186,155,13,116,60,107,44,102,226,189,234,235,193,94,40,46,186,42,244,175,176,254,123,35,149,100,140,162,101,251,154,83,119,228,173,16,245,144,51,228,99,55,240,95,132,232,253,118,252,32,242,56,200,
179,236,149,101,18,214,136,106,139,64,10,198,0,19,78,179,77,27,222,219,80,183,63,225,185,111,196,28,96,242,84,10,193,185,56,8,38,84,205,165,204,20,48,224,44,220,102,240,89,102,175,69,96,154,131,60,198,58,19,50,202,95,45,49,182,12,67,243,233,212,167,140,206,244,127,193,45,207,200,54,1,16,140,68,228,156,21,50,188,172,184,227,124,218,89,121,54,134,144,241,4,51,0,43,215,122,250,59,250,90,134,179,72,238,172,184,117,142,241,148,41,255,146,248,53,66,49,111,83,81,230,30,226,212,155,1,170,4,191,116,102,178,224,220,179,236,209,11,102,87,22,52,20,44,122,207,211,49,35,51,73,179,121,77,131,113,160,38,12,236,217,35,123,40,220,15,102,111,74,84,230,16,82,48,217,204,15,21,195,41,61,162,242,146,75,156,211,235,0,183,100,84,85,244,151,189,52,194,55,115,150,56,143,124,180,214,129,226,175,101,155,7,156,102,99,219,76,216,188,186,109,202,16,52,7,229,53,173,113,57,50,235,89,99,249,80,189,158,53,42,88,231,121,128,77,237,
16,55,108,142,121,78,223,234,241,255,132,246,213,172,14,101,178,103,172,44,158,101,68,187,83,5,69,61,138,2,155,235,202,59,195,224,237,132,142,67,180,133,183,246,39,24,236,91,87,238,20,249,219,73,157,10,13,22,149,220,27,62,209,96,109,193,21,234,55,148,155,183,162,160,192,87,246,116,237,254,156,208,190,157,176,34,229,120,10,45,41,40,240,71,60,172,178,174,196,10,241,219,137,204,143,219,136,188,105,211,89,197,161,117,5,201,38,46,124,142,197,219,193,48,28,155,190,57,196,243,42,107,64,1,243,160,35,207,157,57,113,51,127,152,136,200,114,133,14,208,240,12,248,112,50,128,22,193,160,203,179,72,200,212,247,112,112,5,19,181,66,68,0,157,49,30,54,138,78,193,85,201,41,110,212,89,80,32,224,233,240,67,211,113,162,195,110,159,199,212,253,108,218,176,78,246,194,192,118,139,159,172,65,194,43,223,123,4,176,88,122,58,120,98,6,48,185,192,159,189,159,114,86,95,185,203,178,159,17,16,149,117,4,192,233,8,143,73,97,230,70,69,36,109,60,154,
152,138,45,142,24,130,164,226,112,24,96,146,18,93,30,176,26,217,62,88,32,63,228,73,81,153,128,216,179,109,201,36,47,115,226,133,98,23,83,144,98,204,5,207,232,69,167,11,6,20,247,34,37,67,159,90,130,165,56,212,166,240,156,152,47,17,95,113,192,205,11,192,92,102,153,115,252,21,102,21,50,8,3,220,212,228,146,196,26,210,162,41,20,207,81,65,51,229,251,164,230,192,243,131,84,82,81,90,209,34,163,166,208,57,194,27,73,35,79,18,178,212,41,194,124,131,206,12,39,99,250,107,255,125,191,146,156,178,203,182,242,205,98,199,34,201,182,255,94,244,231,192,159,121,173,28,205,195,69,253,67,255,31,15,167,23,55,253,135,243,131,47,73,191,231,167,239,112,69,197,2,117,149,223,147,61,137,163,25,231,100,165,206,78,201,168,37,131,129,207,230,9,207,60,247,101,38,33,144,159,84,228,233,92,225,8,177,157,143,59,139,118,7,254,11,87,172,71,44,15,134,210,184,73,226,168,108,114,90,69,30,146,172,46,236,254,224,159,66,176,158,23,158,160,13,253,
188,232,160,28,102,43,83,120,235,66,42,189,10,55,84,105,228,202,215,214,114,164,89,158,14,191,130,106,23,234,39,81,227,202,22,240,215,80,109,215,124,166,56,122,70,67,47,142,98,168,204,149,7,98,201,39,123,252,85,31,65,5,137,210,74,202,190,70,141,37,107,80,243,153,206,101,157,72,236,185,106,113,3,109,181,44,148,130,199,188,57,168,115,199,188,51,6,193,251,212,184,69,122,124,128,26,154,110,124,208,11,141,10,7,170,12,167,93,32,227,200,51,173,12,157,206,238,99,164,113,229,121,69,146,112,13,37,102,102,179,38,240,43,61,36,13,249,255,22,178,121,189,37,129,148,154,147,87,236,39,170,242,160,38,174,60,138,183,81,100,117,10,219,45,212,37,160,24,201,238,16,228,255,97,143,152,213,84,37,163,139,100,166,220,37,93,99,37,37,224,133,8,75,7,178,149,187,211,188,178,72,143,143,68,81,34,87,184,40,183,229,47,168,188,37,51,208,67,196,204,15,49,102,4,83,251,192,180,157,2,55,89,240,207,88,225,108,220,21,87,6,196,221,243,189,56,
253,160,42,52,46,196,239,227,144,223,179,21,43,47,32,72,50,236,146,38,86,201,71,219,181,148,203,41,108,120,101,186,195,212,85,15,146,92,53,224,217,233,248,162,139,94,212,253,230,24,10,206,101,254,198,151,120,39,182,93,240,246,151,100,119,21,158,20,184,1,230,220,123,166,120,92,21,31,254,52,199,225,231,7,121,61,140,114,59,140,75,25,78,139,198,212,153,194,36,38,190,91,197,86,22,159,204,158,76,29,123,36,210,123,97,237,196,228,162,45,227,254,23,178,133,15,149,27,92,108,252,37,21,111,131,223,241,46,151,109,153,63,154,36,14,39,151,187,84,147,61,117,209,160,55,184,125,69,85,21,172,130,46,248,177,185,244,45,28,249,195,183,36,40,30,28,128,194,100,11,189,199,246,130,236,139,101,185,2,133,163,0,51,178,221,194,170,33,91,180,172,141,110,40,93,88,174,16,79,162,219,214,220,252,187,160,128,153,91,218,43,139,119,178,146,120,39,43,136,247,200,15,199,191,181,124,98,3,191,176,128,98,163,190,160,132,81,214,65,134,48,209,121,168,124,169,
54,17,42,222,238,133,101,87,142,112,11,54,215,129,168,176,136,217,251,228,27,116,195,13,36,22,91,138,43,74,28,17,173,38,241,204,238,235,159,43,171,204,182,203,74,232,42,144,196,166,36,145,110,255,25,213,137,203,207,60,152,150,202,10,103,241,148,215,33,201,179,180,113,106,147,152,133,0,76,60,142,144,141,240,90,8,198,13,250,158,27,166,94,55,65,48,17,246,251,66,123,58,16,49,92,254,12,70,228,200,156,162,99,12,185,80,172,37,239,41,19,75,134,28,89,227,165,129,40,87,172,31,200,93,132,28,187,183,103,118,132,87,109,111,188,193,91,164,209,113,225,210,90,62,187,173,187,106,243,229,62,109,145,198,203,162,165,53,61,107,111,118,229,230,139,109,159,66,205,23,69,75,107,254,194,189,167,85,229,224,155,138,69,164,224,5,75,147,33,119,27,113,213,246,227,54,112,145,230,99,185,210,90,63,183,239,187,178,245,240,93,242,66,198,195,75,150,103,250,234,246,252,170,173,198,109,18,92,249,21,105,119,84,182,164,150,251,146,221,154,45,231,219,0,69,155,
30,23,46,169,237,24,163,223,160,237,136,228,165,235,20,114,243,81,217,50,90,142,11,98,132,189,191,227,1,71,57,250,174,41,67,114,201,85,17,41,146,210,37,105,128,198,12,215,106,255,141,39,247,68,10,47,206,35,138,194,243,101,53,133,63,231,92,16,159,46,240,66,129,105,225,108,135,223,185,116,25,6,211,80,70,221,147,195,179,240,141,217,19,219,49,249,125,154,183,174,253,141,56,56,147,154,76,96,134,221,255,59,195,152,33,144,173,137,198,151,137,179,10,20,80,188,100,28,92,242,109,226,196,16,92,71,65,30,241,32,190,129,10,188,29,252,10,12,176,112,96,62,86,146,133,51,15,134,44,56,131,194,248,65,194,128,126,11,218,51,177,186,186,94,171,181,27,173,221,230,79,24,223,250,185,81,175,119,156,15,198,174,15,255,130,15,122,125,0,255,246,245,29,17,24,250,7,70,134,240,2,211,54,78,150,68,244,174,221,134,226,13,40,222,128,226,13,40,222,216,55,136,172,65,188,76,243,218,210,155,173,109,201,237,32,158,236,66,73,249,236,202,99,204,198,203,
227,126,197,251,114,183,216,118,126,13,216,156,67,18,188,192,64,24,209,147,187,67,46,191,114,29,114,37,58,93,89,145,131,69,133,15,116,21,49,100,247,119,228,152,93,73,166,33,202,51,126,221,94,47,105,29,86,24,218,86,170,190,131,72,79,113,66,13,79,77,113,69,8,65,220,251,59,195,226,113,115,22,124,203,119,67,30,147,104,221,175,242,57,203,94,219,219,46,249,63,248,211,62,63,199,224,237,17,249,244,9,190,182,187,93,217,133,103,56,155,209,250,122,142,179,186,134,94,141,167,114,161,98,138,173,255,245,155,248,59,23,161,44,24,235,92,43,62,175,122,144,248,251,86,28,156,143,67,200,241,234,247,40,186,251,88,9,181,175,227,174,146,202,22,237,114,171,45,40,55,167,44,62,140,239,138,251,9,148,43,11,184,75,72,219,95,106,191,180,216,118,215,42,194,46,59,101,88,62,12,175,116,166,16,80,13,204,244,29,52,75,208,76,101,101,200,163,132,27,109,199,168,65,254,197,234,225,87,124,192,87,116,189,22,29,205,206,124,228,99,21,150,95,185,76,247,
68,124,170,217,114,11,78,199,253,44,211,190,121,195,162,189,224,84,115,197,26,64,48,141,142,15,34,78,51,123,76,132,58,252,255,95,152,153,237,1,82,189,222,127,1,43,73,213,181,
120,156,221,93,13,83,227,56,210,254,43,170,154,219,61,152,10,25,219,73,72,72,246,182,96,128,101,168,227,171,8,236,204,91,84,32,78,172,16,31,142,157,179,101,102,216,189,157,223,126,221,146,108,203,137,157,56,137,89,246,222,169,25,18,108,169,213,253,116,171,37,181,90,154,59,187,94,111,117,76,163,209,121,250,231,229,94,199,32,127,251,155,94,209,222,213,154,122,173,213,168,233,117,99,23,126,232,53,221,104,24,181,186,222,50,246,234,173,90,173,165,181,135,142,25,4,189,59,199,104,181,120,37,163,98,188,51,154,13,67,111,214,91,245,150,94,107,182,12,168,107,104,154,161,53,141,134,94,175,181,140,70,219,162,193,176,119,167,65,241,26,180,177,183,91,219,211,116,77,107,234,186,86,51,154,90,173,81,215,245,154,1,36,140,166,161,107,141,54,117,173,222,221,167,221,14,86,168,67,5,173,177,171,105,218,46,80,171,215,53,160,142,213,234,53,189,166,25,181,134,190,215,216,109,15,232,163,237,246,238,230,69,106,44,21,169,169,181,109,70,39,82,34,179,222,121,
191,223,232,232,80,117,183,178,251,174,9,205,214,27,208,216,30,74,84,131,106,134,177,219,216,211,27,117,96,169,174,25,109,159,254,59,180,125,58,161,46,147,20,108,93,55,244,206,64,111,118,128,133,239,223,191,87,245,186,38,144,106,2,47,186,6,124,27,58,60,3,57,154,122,99,79,219,107,180,244,150,86,107,214,141,70,19,68,159,154,190,57,145,146,12,234,70,71,202,209,170,180,222,237,234,187,128,168,214,2,254,27,123,64,64,3,33,224,19,128,108,192,223,90,171,205,100,101,172,135,149,246,42,123,239,0,164,90,67,107,238,105,205,122,179,81,7,73,12,125,87,7,32,53,148,31,212,208,118,61,127,98,58,189,59,172,160,33,214,75,254,180,143,232,200,12,29,16,247,247,135,63,126,56,190,216,185,237,146,59,242,251,239,58,190,220,223,2,69,86,235,70,85,219,38,119,129,214,33,119,239,247,155,157,58,233,254,194,166,189,222,31,127,252,216,187,11,106,157,31,118,8,126,209,59,237,219,233,180,223,238,183,241,53,126,114,219,106,195,235,187,253,45,173,170,85,
65,208,237,26,145,22,87,35,15,189,187,247,53,78,139,224,175,109,248,93,45,55,13,7,142,61,140,10,238,215,58,80,54,24,247,176,41,173,243,142,43,135,220,140,237,64,16,36,212,29,154,211,32,116,76,70,3,98,186,164,219,253,100,0,241,155,43,18,132,131,224,37,0,163,168,146,83,70,76,199,241,190,6,100,228,249,196,36,190,233,62,82,226,141,136,55,165,190,201,108,207,13,136,231,18,176,0,143,81,50,178,29,74,68,85,226,13,254,69,135,44,168,0,181,225,152,152,1,127,249,193,2,99,25,50,207,127,33,67,159,242,250,21,98,81,135,138,111,62,117,205,137,237,62,86,4,37,6,173,5,35,234,3,145,164,158,99,7,12,138,0,255,108,88,21,96,8,121,64,48,139,250,246,51,181,200,200,247,38,228,238,158,121,83,123,8,184,126,232,127,56,244,124,218,255,0,34,246,63,4,254,176,255,1,129,127,0,116,250,15,31,205,128,246,31,168,219,223,9,131,254,187,72,33,240,38,210,199,61,71,145,12,160,156,104,169,2,104,89,100,12,34,1,249,39,18,
208,137,233,50,123,24,0,55,148,2,92,129,87,180,109,228,190,203,0,136,201,60,7,201,43,133,145,248,97,79,48,177,66,59,153,45,224,231,145,237,31,187,204,127,153,105,167,223,142,223,244,132,220,20,36,76,25,147,106,205,81,15,248,101,75,55,90,219,39,252,231,190,30,117,2,114,197,109,147,156,83,54,246,44,114,6,58,156,235,14,141,185,238,112,99,79,168,23,178,254,150,237,178,254,54,239,23,15,247,74,25,193,168,218,9,72,255,199,222,3,52,39,107,246,182,212,119,64,5,95,238,215,200,36,232,109,99,147,70,7,84,198,2,194,68,113,242,108,58,33,133,114,100,98,131,153,209,161,231,90,92,171,12,45,142,176,49,157,41,201,60,114,17,58,14,244,60,36,2,175,185,57,10,203,199,230,60,50,112,188,225,19,86,158,120,22,21,226,114,97,235,249,82,31,142,67,247,169,107,255,70,215,144,59,174,155,39,121,240,219,140,228,192,244,16,43,145,0,106,161,64,119,63,236,200,130,188,203,91,38,131,94,79,77,43,224,6,247,213,135,193,2,48,185,129,122,
150,112,132,106,125,232,131,187,245,127,146,107,202,66,31,60,67,255,61,67,127,131,116,38,66,243,195,177,105,187,128,71,181,24,22,39,148,125,130,102,29,192,162,191,13,234,8,152,68,227,236,244,35,250,43,52,237,155,171,254,195,167,131,139,163,179,227,123,146,249,56,13,212,123,14,84,76,184,183,181,253,160,190,231,141,244,36,68,145,28,38,153,122,128,33,245,17,32,132,204,177,7,65,48,54,72,48,2,125,67,199,8,192,125,129,71,64,130,232,14,193,229,13,41,58,138,139,219,179,51,124,48,50,109,39,244,105,53,101,240,11,228,190,156,66,103,221,226,188,144,232,21,243,1,183,254,143,253,138,124,96,125,245,124,171,95,113,60,120,154,97,36,66,60,97,42,82,84,20,28,41,167,141,67,72,252,160,212,230,45,65,77,254,153,97,102,96,30,83,147,141,193,7,37,149,56,55,247,132,127,200,50,35,199,124,12,176,144,66,0,185,141,58,33,244,8,97,140,90,71,248,19,228,77,152,164,58,158,160,17,198,222,223,100,145,129,114,14,200,87,155,193,224,194,209,142,
94,136,102,133,123,20,79,120,75,85,69,155,156,110,134,186,176,206,172,202,200,47,73,97,24,235,6,12,12,24,134,152,48,16,46,1,204,91,154,246,36,4,101,13,144,119,135,194,88,145,20,161,228,208,241,2,186,181,29,149,252,58,166,64,31,250,65,48,166,86,85,218,154,252,192,214,228,8,154,37,86,91,41,221,132,185,22,204,7,59,38,204,181,218,135,204,119,184,247,56,190,184,57,190,110,243,137,87,211,0,80,177,250,33,212,191,62,62,56,234,237,252,71,96,204,1,176,93,222,177,57,60,213,92,130,103,199,191,220,196,228,190,167,105,126,190,62,189,57,158,35,202,125,196,18,170,215,167,39,159,114,201,30,92,93,29,95,204,51,107,78,225,215,101,236,222,92,94,229,145,61,4,8,56,187,135,56,245,160,17,225,17,177,25,177,60,26,184,253,191,51,66,191,193,216,148,34,159,67,237,248,203,225,217,109,247,244,87,78,208,12,193,9,16,105,186,255,14,41,88,2,120,10,52,33,164,143,143,97,98,131,19,19,108,209,116,16,246,23,209,20,248,82,193,23,87,
176,48,34,62,133,0,75,10,166,116,104,143,108,168,199,137,160,39,197,50,240,9,205,89,249,24,124,188,188,185,185,60,207,131,225,230,250,246,226,240,96,86,111,104,250,204,15,97,78,136,200,216,156,255,223,168,239,145,45,152,202,14,94,184,211,63,151,22,142,173,139,158,167,176,174,122,244,69,118,204,59,99,64,182,96,254,56,177,185,227,12,182,179,172,58,225,30,126,75,126,224,108,2,165,56,189,190,237,94,87,200,233,103,241,241,69,124,92,127,254,114,11,114,221,6,224,170,149,6,50,245,153,32,114,122,125,114,125,133,180,196,199,23,241,1,180,78,128,214,137,239,133,83,149,216,50,90,151,55,159,144,150,248,248,34,62,128,214,37,208,186,74,168,240,65,209,3,203,240,151,115,119,112,118,6,149,175,177,175,74,44,249,100,220,113,150,213,252,44,106,126,230,29,114,181,170,95,68,213,227,111,116,24,50,115,0,22,50,120,41,82,15,36,61,64,13,184,62,116,2,223,30,50,154,201,244,242,161,31,109,19,69,206,27,6,87,27,242,144,82,89,195,94,52,129,18,
189,71,14,85,169,81,9,37,197,62,142,19,157,191,242,176,83,76,11,220,124,202,81,3,39,245,231,234,1,71,35,174,7,14,232,87,27,166,235,128,22,95,125,10,199,58,239,253,255,183,85,198,73,244,183,230,20,34,85,165,192,249,236,217,150,88,54,96,21,80,75,1,53,2,182,66,194,24,126,94,89,76,219,56,90,82,3,178,84,30,42,124,248,64,205,129,176,160,37,252,6,203,205,88,242,32,31,164,4,199,117,208,185,198,16,67,174,53,87,22,25,185,130,220,192,243,28,142,156,32,87,130,69,123,142,21,205,169,55,37,229,210,175,169,254,33,120,140,173,57,53,159,22,145,18,161,177,136,5,101,21,24,145,74,186,4,204,17,212,158,80,37,197,96,63,194,24,207,18,39,146,133,175,168,87,182,199,16,84,21,155,157,89,86,228,139,91,76,218,238,139,59,44,212,3,99,57,177,198,186,29,16,235,142,125,207,133,5,184,34,146,88,177,90,56,108,167,123,100,180,134,149,14,51,0,59,48,31,113,53,255,108,15,233,198,146,83,250,148,37,121,180,104,5,158,118,
235,171,197,52,144,228,170,208,168,43,83,222,228,61,225,31,145,49,120,129,141,17,71,37,22,66,159,2,197,238,227,2,124,221,145,90,142,230,226,90,45,53,236,113,229,5,249,22,148,43,27,17,53,215,181,164,88,247,24,21,10,125,159,186,44,134,130,108,1,20,124,33,176,45,188,6,22,226,251,14,40,24,134,132,139,226,84,124,230,1,35,66,57,243,14,32,84,170,15,153,143,88,228,134,40,222,106,54,81,194,76,226,220,124,162,11,84,160,134,158,178,124,154,172,94,98,180,105,89,32,9,103,35,114,109,111,230,106,132,244,50,130,70,51,33,162,245,156,223,53,152,255,243,34,196,22,205,35,100,213,215,26,234,226,206,185,212,80,215,20,30,99,250,92,244,124,231,175,236,56,96,233,133,128,72,114,155,56,254,153,230,238,137,252,146,141,26,238,43,197,168,73,92,248,51,233,14,61,240,102,224,14,193,207,205,1,169,184,186,220,89,112,238,252,233,70,157,208,226,234,196,87,180,64,159,161,215,242,174,171,140,216,73,195,80,147,78,166,236,165,232,44,44,214,209,226,
200,242,122,122,42,61,164,188,129,254,46,159,169,239,120,166,85,45,164,201,98,83,191,114,52,85,116,7,0,157,231,153,237,62,45,213,213,114,223,18,145,42,99,149,226,219,143,105,29,21,168,196,76,255,145,178,12,15,29,188,76,6,30,110,11,58,192,93,52,45,141,22,35,216,146,237,154,124,231,109,126,95,121,115,87,109,90,37,193,27,145,122,149,46,176,58,188,215,52,128,145,100,30,222,217,157,19,128,219,102,1,172,240,190,197,47,36,165,18,176,117,96,45,114,5,205,148,3,111,68,237,47,132,176,35,32,30,122,147,169,67,191,97,230,130,3,166,250,204,87,215,128,59,34,78,173,76,192,233,104,4,246,139,69,203,69,29,102,254,7,140,249,153,171,6,213,177,139,66,139,16,143,40,109,58,246,114,34,162,184,160,151,9,174,201,95,69,216,158,68,155,210,248,216,30,132,232,40,192,81,207,59,128,220,245,5,233,37,203,56,65,187,60,100,151,15,155,43,161,251,42,35,230,235,162,62,59,149,46,27,235,238,34,43,78,195,95,8,237,238,250,182,188,80,59,107,
2,221,205,6,58,158,53,22,51,241,94,245,245,96,47,20,23,93,21,250,87,88,255,189,145,74,50,70,209,178,125,205,169,59,242,86,136,122,200,25,50,79,212,154,207,220,146,30,7,105,150,189,178,76,194,26,81,107,17,72,108,12,48,225,52,219,180,225,189,13,109,251,19,158,235,71,204,1,38,79,165,16,156,139,131,96,66,213,92,202,76,1,3,206,194,109,54,197,109,137,189,22,129,105,14,242,24,235,76,200,40,127,181,196,216,50,12,205,167,83,159,6,116,166,255,11,106,121,70,182,9,128,96,36,34,231,172,144,225,101,197,29,231,211,206,202,179,49,132,140,39,152,1,88,185,214,211,223,209,215,50,156,69,114,103,197,173,115,140,167,76,249,151,196,175,17,138,121,155,138,50,247,16,167,222,12,80,37,248,165,51,51,96,231,158,101,143,94,48,187,178,160,161,96,209,123,158,142,25,153,73,154,204,107,26,140,3,45,97,96,207,30,217,67,225,126,48,123,83,162,50,135,144,130,201,102,126,168,24,78,233,17,149,151,92,226,156,94,7,184,37,163,170,162,191,236,
165,17,190,153,179,196,121,228,163,181,14,20,127,45,219,60,224,117,54,182,205,132,204,171,219,166,12,65,115,80,94,211,26,151,35,179,158,53,150,15,213,235,89,163,130,117,158,7,216,212,14,113,195,230,152,231,244,173,30,255,79,234,190,154,213,161,76,246,140,149,197,179,140,104,119,170,160,168,71,81,96,115,93,121,103,8,188,157,208,113,136,182,240,214,254,4,131,125,235,202,157,170,254,118,82,167,66,131,69,37,247,134,79,148,173,45,184,82,251,13,229,230,92,20,20,248,202,158,174,221,159,147,186,111,39,172,72,57,158,2,39,5,5,254,136,135,85,214,149,88,169,252,118,34,243,227,54,34,111,218,116,86,113,104,93,81,101,19,23,62,71,226,237,96,24,142,77,223,28,226,121,149,53,160,128,121,208,145,231,206,156,184,153,63,76,68,100,185,66,7,104,120,6,124,56,25,0,71,48,232,242,44,18,50,245,61,28,92,193,68,173,16,17,64,103,140,135,141,162,83,127,85,114,138,27,117,22,20,96,60,29,126,104,58,78,116,184,239,243,152,186,159,77,27,214,201,
94,200,108,183,248,201,26,172,120,229,123,143,0,86,144,158,14,158,152,12,38,23,248,179,247,83,206,234,43,119,89,246,51,2,162,146,142,0,56,29,225,49,41,204,220,168,136,164,141,71,19,83,177,197,145,74,144,84,28,14,3,76,82,162,203,3,86,35,219,7,11,228,135,90,41,42,19,16,123,182,45,153,228,101,78,188,80,236,98,138,170,24,115,193,51,137,209,233,130,1,197,189,72,73,208,167,150,32,41,14,181,41,52,39,230,75,68,87,28,112,243,24,152,203,44,113,142,191,66,172,66,6,33,195,77,77,46,73,172,33,45,154,66,241,28,21,52,83,190,79,106,14,60,159,165,146,138,210,138,22,25,53,133,206,17,222,200,58,242,36,97,144,58,69,152,111,208,153,225,100,76,127,237,191,239,87,146,83,118,217,86,190,89,236,88,36,217,246,223,139,254,204,252,153,215,202,209,60,92,212,63,244,255,241,112,122,113,211,127,56,63,248,146,244,123,126,250,14,87,84,1,83,87,249,61,217,147,56,154,113,78,86,234,236,148,140,90,6,48,240,217,60,225,153,231,190,
204,36,4,242,147,138,60,157,43,28,33,182,243,113,103,193,55,243,95,184,98,61,98,121,48,148,198,44,137,163,193,201,105,21,121,72,178,186,176,251,131,127,10,193,122,94,120,130,54,244,243,162,131,114,152,173,76,225,173,11,169,244,42,220,80,165,145,43,95,91,203,145,102,121,58,252,10,170,93,168,159,68,141,43,91,192,95,67,181,93,243,153,226,232,25,13,189,56,138,161,50,87,30,136,37,157,236,241,87,125,4,13,36,74,43,41,251,26,53,150,172,65,205,103,58,151,117,34,177,231,170,197,13,180,213,178,80,202,56,242,173,142,84,247,169,113,139,244,248,0,53,52,221,248,160,23,26,21,14,84,25,78,187,64,198,145,103,90,25,58,157,221,199,72,227,202,243,138,100,197,53,148,152,153,205,154,192,175,244,144,52,228,255,91,200,230,245,150,4,82,188,59,224,245,250,137,170,60,104,137,43,15,47,38,200,236,20,182,91,168,75,64,49,146,221,33,200,255,195,30,49,171,169,74,70,23,201,76,185,75,186,198,74,74,192,11,17,150,14,100,43,119,167,121,101,145,
30,31,137,162,68,174,112,81,110,203,95,80,121,75,102,160,135,136,153,31,98,204,8,166,246,204,180,157,2,55,89,240,207,88,225,193,184,43,174,12,136,187,231,123,113,250,65,85,104,92,136,223,63,34,191,103,43,86,94,64,144,100,216,37,44,86,201,71,219,181,148,203,41,108,120,101,186,195,212,85,15,178,186,106,192,179,211,241,69,23,219,168,251,205,49,20,156,202,252,13,55,115,151,141,44,187,237,38,217,93,133,39,5,110,188,57,247,158,41,30,87,197,135,63,205,81,248,249,65,94,135,163,220,134,227,210,0,167,69,99,234,76,97,18,19,223,37,99,43,139,207,192,158,76,29,123,36,210,123,97,237,20,200,69,91,198,125,55,100,11,31,42,55,214,216,248,75,42,222,6,191,227,221,53,219,50,127,52,73,28,230,10,226,12,84,147,61,117,193,80,198,109,51,170,201,189,198,237,43,170,170,96,21,116,193,143,205,165,111,225,200,31,190,101,133,226,193,1,40,76,182,208,123,108,47,200,190,88,150,43,80,56,10,48,35,219,45,172,26,178,69,203,218,232,134,210,
133,229,10,241,36,186,109,205,205,191,11,10,152,185,165,189,178,120,39,43,137,119,178,130,120,143,252,112,252,91,203,39,54,240,11,11,40,54,234,11,74,24,101,29,100,8,19,157,135,202,151,106,19,161,226,237,94,88,118,229,8,183,96,115,29,42,21,22,49,123,159,124,131,110,184,129,196,98,75,113,69,137,163,74,171,73,60,179,251,250,231,202,42,179,237,178,18,186,10,36,177,41,73,164,219,127,70,115,226,178,55,15,166,165,178,193,89,60,229,117,72,242,44,109,156,218,36,102,33,0,19,143,35,100,35,188,22,130,49,67,223,115,195,212,235,38,8,38,194,126,95,104,79,7,34,134,203,159,193,136,28,153,83,116,140,33,23,138,181,228,61,13,196,146,33,71,214,120,105,32,202,21,235,7,114,23,33,199,238,237,153,29,225,85,249,141,55,120,139,48,29,23,46,141,243,217,109,221,85,217,151,251,180,69,152,151,69,75,99,61,107,111,118,101,246,197,182,79,33,246,69,209,210,216,95,184,247,180,170,28,124,83,177,136,20,188,96,105,50,228,110,35,174,202,63,110,
3,23,97,31,203,149,198,253,220,190,239,202,214,195,119,201,11,25,15,47,89,158,233,171,219,243,171,114,141,219,36,184,242,43,194,119,84,182,36,206,125,73,110,77,206,249,54,64,81,214,227,194,37,241,142,49,250,13,120,71,36,47,93,167,144,155,143,202,150,193,57,46,136,17,246,254,142,7,20,229,232,187,166,12,201,37,87,69,164,72,74,151,164,1,26,19,92,139,255,27,79,238,137,20,94,156,71,53,10,207,151,213,20,254,156,115,65,124,186,192,11,49,211,194,217,14,191,115,233,50,100,211,80,70,221,147,195,179,240,45,176,39,182,99,242,251,52,111,93,251,27,113,112,38,53,153,192,12,187,255,247,0,99,134,80,109,77,52,190,76,156,85,160,128,226,37,227,224,146,111,19,39,134,224,58,10,242,136,7,241,13,84,224,237,224,87,32,128,133,153,249,88,73,22,206,60,24,178,224,12,74,192,15,18,50,250,141,181,103,98,117,117,189,86,107,55,90,187,205,159,48,190,245,115,163,94,239,56,31,140,93,31,254,177,15,122,125,0,255,246,245,29,17,24,250,7,
70,134,240,2,211,54,78,150,68,244,174,221,134,226,13,40,222,128,226,13,40,222,216,55,136,108,65,188,76,211,218,210,155,173,109,73,237,32,158,236,66,73,249,236,202,11,2,27,47,143,251,21,239,203,221,10,182,243,91,64,118,14,9,123,129,129,48,170,79,238,14,185,252,202,245,207,149,232,116,101,69,14,22,21,62,208,85,196,144,221,223,145,99,118,37,153,134,40,207,248,117,123,189,132,59,108,48,180,173,84,123,7,145,158,226,132,26,158,154,226,138,16,130,184,247,119,134,196,227,230,36,248,150,239,134,52,38,209,186,95,165,115,150,189,182,183,93,242,127,240,167,125,126,142,193,219,35,242,233,19,124,109,119,187,178,11,207,80,54,163,245,245,28,101,117,13,189,26,77,229,66,197,20,89,255,235,55,241,119,46,66,89,48,214,185,86,124,94,245,32,241,247,173,56,56,31,135,144,227,213,239,81,116,247,177,18,106,95,199,93,37,141,45,218,229,86,57,40,55,167,44,62,140,239,138,251,9,148,43,11,184,75,72,219,95,106,191,180,216,118,215,42,194,46,59,101,
88,62,12,175,116,166,16,80,101,102,250,14,154,37,104,166,178,50,228,81,194,141,182,99,138,7,249,249,21,31,240,21,93,175,69,71,179,51,31,249,88,133,229,87,46,211,61,17,159,106,182,220,130,211,113,63,203,180,111,206,88,180,23,156,98,87,172,1,4,209,232,248,32,226,52,179,199,68,168,195,255,191,137,153,217,30,32,213,235,253,23,204,177,41,184,