From 651e27420aa103a037874423a1b16d9ec3e24467 Mon Sep 17 00:00:00 2001 From: Felix Schumacher Date: Wed, 6 Jan 2010 14:50:44 +0100 Subject: [PATCH] jcifs-1.3.13 from tgz jcifs-1.3.13 Locking throughout the transport layer has been rewritten. This should fix the long standing deadlock that has been reported in the past. Doubled size of transient input buffer to accommodate SMB_COM_NEGOTIATE response security blob (as observed with OSX Snow Leopard). A signing issue reading data from an EMC server has been fixed. NTLMSSP logging has been improved. --- README.txt | 8 + build.xml | 4 +- examples/AclCrawler.class | Bin 0 -> 1544 bytes examples/AllocInfo.class | Bin 0 -> 546 bytes examples/Append.class | Bin 0 -> 1007 bytes examples/AuthListFiles.class | Bin 0 -> 1815 bytes examples/CallNamedPipe.class | Bin 0 -> 1431 bytes examples/CopyTo.class | Bin 0 -> 445 bytes examples/CountPerms.class | Bin 0 -> 2932 bytes examples/CreateFile.class | Bin 0 -> 425 bytes examples/Delete.class | Bin 0 -> 404 bytes examples/Equals.class | Bin 0 -> 636 bytes examples/Exists.class | Bin 0 -> 762 bytes examples/FileInfo.class | Bin 0 -> 4248 bytes examples/FileOps.class | Bin 0 -> 7889 bytes examples/FilterFiles$BigFileFilter.class | Bin 0 -> 502 bytes examples/FilterFiles$ShortFilenameFilter.class | Bin 0 -> 524 bytes examples/FilterFiles.class | Bin 0 -> 1325 bytes examples/Format.class | Bin 0 -> 8247 bytes examples/Get.class | Bin 0 -> 1313 bytes examples/GetDate.class | Bin 0 -> 831 bytes examples/GetDfsPath.class | Bin 0 -> 552 bytes examples/GetGroupMemberSidsFromURL.class | Bin 0 -> 1663 bytes examples/GetSecurity.class | Bin 0 -> 651 bytes examples/GetShareSecurity.class | Bin 0 -> 801 bytes examples/GetType.class | Bin 0 -> 1590 bytes examples/GetURL.class | Bin 0 -> 784 bytes examples/GrowWrite.class | Bin 0 -> 1066 bytes examples/HttpURL.class | Bin 0 -> 633 bytes examples/Interleave$IThread.class | Bin 0 -> 940 bytes examples/Interleave.class | Bin 0 -> 990 bytes examples/InterruptTest.class | Bin 0 -> 1356 bytes examples/IsDir.class | Bin 0 -> 533 bytes examples/LargeListFiles.class | Bin 0 -> 1427 bytes examples/Length.class | Bin 0 -> 749 bytes examples/List.class | Bin 0 -> 977 bytes examples/ListACL.class | Bin 0 -> 1420 bytes examples/ListFiles.class | Bin 0 -> 1103 bytes examples/ListTypes.class | Bin 0 -> 1366 bytes examples/Mkdir.class | Bin 0 -> 395 bytes examples/NodeStatus.class | Bin 0 -> 598 bytes examples/OpenExclusive.class | Bin 0 -> 779 bytes examples/PeekNamedPipe$ReceiverThread.class | Bin 0 -> 1229 bytes examples/PeekNamedPipe.class | Bin 0 -> 1282 bytes examples/PipeTalk$ReceiverThread.class | Bin 0 -> 823 bytes examples/PipeTalk.class | Bin 0 -> 1391 bytes examples/Put.class | Bin 0 -> 1305 bytes examples/Query.class | Bin 0 -> 796 bytes examples/RenameTo.class | Bin 0 -> 451 bytes examples/SetAttrs.class | Bin 0 -> 760 bytes examples/SetTime.class | Bin 0 -> 479 bytes examples/SidCacheTest.class | Bin 0 -> 919 bytes examples/SidCrawler.class | Bin 0 -> 1932 bytes examples/SlowRead.class | Bin 0 -> 680 bytes examples/SlowWrite.class | Bin 0 -> 820 bytes examples/SmbCrawler.class | Bin 0 -> 1468 bytes examples/SmbShell.class | Bin 0 -> 4776 bytes examples/SmbTableFile.class | Bin 0 -> 2375 bytes examples/SmbTableFileRecord.class | Bin 0 -> 345 bytes examples/T2Crawler$CrawlerThread.class | Bin 0 -> 1328 bytes examples/T2Crawler$Semaphore.class | Bin 0 -> 742 bytes examples/T2Crawler.class | Bin 0 -> 1540 bytes examples/TestRandomAccess$TestRecord.class | Bin 0 -> 2092 bytes examples/TestRandomAccess.class | Bin 0 -> 1885 bytes examples/TestSmbURL.class | Bin 0 -> 4023 bytes examples/TestUnicode.class | Bin 0 -> 1907 bytes examples/ThreadedNbtQuery$QThread.class | Bin 0 -> 985 bytes examples/ThreadedNbtQuery.class | Bin 0 -> 719 bytes examples/ThreadedSmbCrawler$DirEntry.class | Bin 0 -> 502 bytes examples/ThreadedSmbCrawler$SmbCrawlerThread.class | Bin 0 -> 2087 bytes examples/ThreadedSmbCrawler.class | Bin 0 -> 1909 bytes examples/ThreadedUniQuery$QThread.class | Bin 0 -> 1167 bytes examples/ThreadedUniQuery.class | Bin 0 -> 873 bytes examples/Torture1.class | Bin 0 -> 3005 bytes examples/Torture2.class | Bin 0 -> 3481 bytes examples/TortureTest5.class | Bin 0 -> 924 bytes examples/TransactNamedPipe.class | Bin 0 -> 1439 bytes examples/URLTest.class | Bin 0 -> 1616 bytes examples/VerifyGuest.class | Bin 0 -> 1442 bytes examples/VerifyIO.class | Bin 0 -> 2139 bytes examples/VerifyReads.class | Bin 0 -> 2215 bytes examples/Worker.class | Bin 0 -> 451 bytes examples/runtests.sh | 2 +- patches/SetAccessTime.patch | 101 ++++++ src/jcifs/dcerpc/DcerpcHandle.java | 6 +- src/jcifs/ntlmssp/Type1Message.java | 26 +- src/jcifs/ntlmssp/Type2Message.java | 53 +-- src/jcifs/ntlmssp/Type3Message.java | 62 +--- src/jcifs/smb/BufferCache.jav | 83 +++++ src/jcifs/smb/BufferCache.java | 58 ++- src/jcifs/smb/NtlmContext.java | 46 +++ src/jcifs/smb/SmbFile.java | 10 +- src/jcifs/smb/SmbSession.java | 399 +++++++++++---------- src/jcifs/smb/SmbTransport.java | 17 +- src/jcifs/smb/SmbTree.java | 120 ++++--- src/jcifs/smb/TestLocking.java | 124 +++++++ src/jcifs/util/transport/Transport.java | 56 ++- 97 files changed, 732 insertions(+), 443 deletions(-) create mode 100644 examples/AclCrawler.class create mode 100644 examples/AllocInfo.class create mode 100644 examples/Append.class create mode 100644 examples/AuthListFiles.class create mode 100644 examples/CallNamedPipe.class create mode 100644 examples/CopyTo.class create mode 100644 examples/CountPerms.class create mode 100644 examples/CreateFile.class create mode 100644 examples/Delete.class create mode 100644 examples/Equals.class create mode 100644 examples/Exists.class create mode 100644 examples/FileInfo.class create mode 100644 examples/FileOps.class create mode 100644 examples/FilterFiles$BigFileFilter.class create mode 100644 examples/FilterFiles$ShortFilenameFilter.class create mode 100644 examples/FilterFiles.class create mode 100644 examples/Format.class create mode 100644 examples/Get.class create mode 100644 examples/GetDate.class create mode 100644 examples/GetDfsPath.class create mode 100644 examples/GetGroupMemberSidsFromURL.class create mode 100644 examples/GetSecurity.class create mode 100644 examples/GetShareSecurity.class create mode 100644 examples/GetType.class create mode 100644 examples/GetURL.class create mode 100644 examples/GrowWrite.class create mode 100644 examples/HttpURL.class create mode 100644 examples/Interleave$IThread.class create mode 100644 examples/Interleave.class create mode 100644 examples/InterruptTest.class create mode 100644 examples/IsDir.class create mode 100644 examples/LargeListFiles.class create mode 100644 examples/Length.class create mode 100644 examples/List.class create mode 100644 examples/ListACL.class create mode 100644 examples/ListFiles.class create mode 100644 examples/ListTypes.class create mode 100644 examples/Mkdir.class create mode 100644 examples/NodeStatus.class create mode 100644 examples/OpenExclusive.class create mode 100644 examples/PeekNamedPipe$ReceiverThread.class create mode 100644 examples/PeekNamedPipe.class create mode 100644 examples/PipeTalk$ReceiverThread.class create mode 100644 examples/PipeTalk.class create mode 100644 examples/Put.class create mode 100644 examples/Query.class create mode 100644 examples/RenameTo.class create mode 100644 examples/SetAttrs.class create mode 100644 examples/SetTime.class create mode 100644 examples/SidCacheTest.class create mode 100644 examples/SidCrawler.class create mode 100644 examples/SlowRead.class create mode 100644 examples/SlowWrite.class create mode 100644 examples/SmbCrawler.class create mode 100644 examples/SmbShell.class create mode 100644 examples/SmbTableFile.class create mode 100644 examples/SmbTableFileRecord.class create mode 100644 examples/T2Crawler$CrawlerThread.class create mode 100644 examples/T2Crawler$Semaphore.class create mode 100644 examples/T2Crawler.class create mode 100644 examples/TestRandomAccess$TestRecord.class create mode 100644 examples/TestRandomAccess.class create mode 100644 examples/TestSmbURL.class create mode 100644 examples/TestUnicode.class create mode 100644 examples/ThreadedNbtQuery$QThread.class create mode 100644 examples/ThreadedNbtQuery.class create mode 100644 examples/ThreadedSmbCrawler$DirEntry.class create mode 100644 examples/ThreadedSmbCrawler$SmbCrawlerThread.class create mode 100644 examples/ThreadedSmbCrawler.class create mode 100644 examples/ThreadedUniQuery$QThread.class create mode 100644 examples/ThreadedUniQuery.class create mode 100644 examples/Torture1.class create mode 100644 examples/Torture2.class create mode 100644 examples/TortureTest5.class create mode 100644 examples/TransactNamedPipe.class create mode 100644 examples/URLTest.class create mode 100644 examples/VerifyGuest.class create mode 100644 examples/VerifyIO.class create mode 100644 examples/VerifyReads.class create mode 100644 examples/Worker.class create mode 100644 patches/SetAccessTime.patch create mode 100644 src/jcifs/smb/BufferCache.jav create mode 100644 src/jcifs/smb/TestLocking.java diff --git a/README.txt b/README.txt index 04d014e..92e79d4 100644 --- a/README.txt +++ b/README.txt @@ -1,3 +1,11 @@ +jcifs-1.3.13 + +Locking throughout the transport layer has been rewritten. This should +fix the long standing deadlock that has been reported in the past. Doubled +size of transient input buffer to accommodate SMB_COM_NEGOTIATE response +security blob (as observed with OSX Snow Leopard). A signing issue reading +data from an EMC server has been fixed. NTLMSSP logging has been improved. + Fri Aug 14 13:45:57 EDT 2009 jcifs-1.3.12 diff --git a/build.xml b/build.xml index 0fae674..ac701a2 100644 --- a/build.xml +++ b/build.xml @@ -1,7 +1,7 @@ - - + + diff --git a/examples/AclCrawler.class b/examples/AclCrawler.class new file mode 100644 index 0000000000000000000000000000000000000000..c12c07abcf5f4a857dd244f0fd5b5f2fe17ec42b GIT binary patch literal 1544 zcmZ`(OHUhD6#gzAd+cF&IdzBw0n+qgn}-upoCaJP7o60MffNG?ftHSk!5Q!a&5To` zN>!z1(^b}VQwdc?-BcoKOw>p$yXcQ<`i))eqNp0p+qo9~+CBBL z!f>}_q!he`Puz$ze$2Y&v_j#wf;;$BM#gpfOvYXJOjgF6fWM^e%^JJTBLR^S@FmT% z=}ZeqkxX=j%S>g{5a`O9Wn;ct${W^_mM>D{cP#C(VcFdFMzY(wxn;-gQa+w5YX=YjAd}J-Vtv%M_MXg+j=N!u{7p9^sG8P1sT%~I1h8u&h zDZMyjX4ifTPU#3ma|*c6@i{NNOTQMx4XsF zLVnxO9f5(ms%$v%Ijy)=u}a3~@?y4`+-b^ne*dHOMBJVRil*(j1lw*aqU^;R-8%!C zdty6ANx)O75<1jq9oe|YzB%lkp_Qgi5zndxR`_W+6#u0GxVxu zI!^?GXY)zTq#4><55hLJ5~YDMkEV3puMpNJqmp zc;-C`Y4lJ05|Tzw4)D`+NTVTXyasP$@lAR?317$;_R_jeYuFp|(JcSF`V(?U4hFv6 z$91j>*LFGu+iOrMcbv+d4Y})7?xsw?8hW1k#Nq3M23T+(oiTUYFKyOv?hwkPH|(t; z^i-nL`VkAffS+;5A5^2%EreN24~q)Iix3p_(j!cwE@GGzCeV)*|5JA{fE)>3Bbhp_ zJ0#L3S>KSF?-9ih^nJz?`xs&Tt3(*XuZZI}#`~Q=zX(x$q%cb40LdS2(8>Gjt&=?- zJMkW%>p9K`duzBLy+k-Bjlaaj8_8p^tZsZj%t;Rg##~A2iZLM|9WrVMLkMKq2cJkdyG z6viC0l-p6O>4{^h$k~10kGzxcHri5T6B!r`BXv*S##S7-mL0eXsSf5i=1nYM(Zmv# zIaW-pVvQlw)nFLzwQ%m%g_khodZlhB4Ef^!-To4=ALB#>iR4hmcgIa3?1tl!DSEKepL_q}8F)jneR?pxcv`Ar5uE-)jTFcV3|a>$o28x6 z-nY>Kd!m5Bq&59j)Cf3;EKwA62RcPS;T5T?4Q;yvt?~?gvyHws(mie#8lgCG`jIDv PATrzaSEfKP;GGr literal 0 HcmV?d00001 diff --git a/examples/Append.class b/examples/Append.class new file mode 100644 index 0000000000000000000000000000000000000000..eadb65a36ad0c908aa1d05f1929b94a07c233887 GIT binary patch literal 1007 zcmZ`%T~iWK7=8{cyRa?_2HKb9SGgcUS!sp&foW-^&0x)-R|_6-9d?&tm&*HoLqDLK zuImDtnCY^MepK}yX)?ji?7r_g@7MEw{rLIy8-O&PsTjt%f(aEqOe(mcLc&c2Qwnqy z3dVy-2%Z#VT9A|q8Iyv{2-|cB8QfBF8|eT=q%##!F^fAwc~`+b1#=AYf@z!HB7ArLmw#;ju z>DaD{dutZ*-P>~WVStS9zz41qUw)1#RM^u3(O?B7-& zyB@b_Rh$Nu9`E3qPUZz|!Jqk1$WBYniqC}EIiyMM6M|diye5D*1yG<|bzF`y4AJ6? z;{y}BLi94dMu;=wfn*Ep6J4lyqVkDQLI_vM#CKx)o)%oJ{B9e*V$wg`fe1N_{U!c!XyLJL3A$pN>=Ipc2-fOMB&&l8aJ%0gU3Z90P4uz`` zyn|^S*Kj?Icg1o;hWB*5kDEHK;HnHW8fJBz!Yvs-kRx+pd?=0|iDh2LZ7j%eM@Jls zI__dAjE`lpEap$b_*53@Fjge;s)o;W3}a2hJq_!!mC4)a` zW~yj9g;d6?+D>6sA+%85;cl-ut=3B0R`tHQU8F@{{4r-$JiF|;3f;GC$M)tF29ggt zql|7U3>PeK)hm|POxOLPT-}+kdApY5**Q}}C?q9)&d$3jx3ryly{AAbnKn=8nR2a~ zv+ml0CMxmLw(H5#of0AhbCS>PT0U=84J5IlVbj1CKG%>n@C6ekl`m-)%{tdc@N)Q>gFY?o8ZPNn9tUo5l4;xy8?n^`jHvwFy7Hj7!Q zSPqv%$%W3IYt)F5!d|)2h3z2fjme0diA8rU?~au>Yei2Xo;=Y)ZH#7xPK+)mn_TRX z;!*EN50A2mk9+a3^>{a1ihHT;?hvo=KHewr!8SH+yOfY&S1i{x3&hgbmSbZ*&2kkjr{L`> z+)| zceHD7eDGHv-CK`e{yXkN^AX%nOwnE+eUq`!w2w3Vsw0U0 z98!;8{zE4p{ZAONfhIw6K$Kbfi73YL9M0ncsSjeF^Aav%g&3RYLKwq1Pm36T5?he- zMl<)AkF!2vOdB2Gz~#9k2tfZ?nfpV-Hxy|mh+ z1PT66tW%OD+^f$G&|{PjtWSb4r&yb5f|=oJj>0Wcx+MZ!#{@Fmjc`5^GeNL?HATdD amV#d1Y6_v(t9p(8*IURcOwvDqss91tcdlmu literal 0 HcmV?d00001 diff --git a/examples/CallNamedPipe.class b/examples/CallNamedPipe.class new file mode 100644 index 0000000000000000000000000000000000000000..1378730bf5290adb5a5ec21ac11dd26643940649 GIT binary patch literal 1431 zcmaJ>TTc@~6#j;8yUVf&6k1yFQtzb&swk)hQNRmT1hk4)yky%B&64f5*>1f&`A>ZC z!3Q5qyktqN(RY88dWK@VO^8i;&di+4obNkl_Sf%kKLAYPxr!K)GR755sOZ9^5BT#( zMoL8hlQPbzP=r3KLdBF2=Y%*f%+uYN!37x?RrDjN;F8d3A!ZfK34K|`Jg%s?iUk#m zm{zbP^3f)MYhp#>Dz3@6F5?D6V9u}%XP&_qAKPG%mMTTg(6?e(e6?QAbNjxYH|azw z>xRV;j&H7P>o4?_savH~*0Bw%G%Ett>#qvD>KGNPCgUdUvz5AC;5Q5r99+^(b5$?% z;<{1glOlnJqd3NJteq@ln!Kc&3wEhq=9bgS$1ttirCK^RS1af1wmBc0+oG&R-O-&& zja$XN1E=!RHXLsA!V6)W7dI?34Da4xR8pdpj8&~WR5jPj3=ywot?qbC;q8L4RZG!@ zscbpls$8VZXt;&j8dh*e!z$KftZTT7d&Er}OOu$z`qmb=85B_%5f#&r#eE?j5b?46 zYlqh~Y~Z1cM;dZimho7_CZ5Q6%HXFeixl!q@YLJEAVYuquC@F&FE|W??IRC&q4@s& z3h#5C5si$LxYGjM$x0+X)=WlhdM&fWvNx)O_z_Bf_~mp5#b)GrLr`5_xzbzk*3)O_O$nJ`>{C1tuN~$>X#; zM4FNICw9O-(SqRw$-wTRjBcF7DGDK1)(?r^JMcB}!~YJw4Rqy#z8y$EgZ}TzN&|sh zLYmrve5U~=m+;fFd$j>Im+(yuFmmikOHs*%mi7zPn+}X8T^yK^KclaK{@e}*f#I5^?rP}J|@a2wez1PMbAA=K#e z)`t+u7zU8UAkws3Kp4x2U=2}N7{N=7;tdYsEm8HJNc=$FABn&(MB!=5BoR|_`j64N G3yHs6ZCU34 literal 0 HcmV?d00001 diff --git a/examples/CopyTo.class b/examples/CopyTo.class new file mode 100644 index 0000000000000000000000000000000000000000..1eec53621b9c646345d616c77e9c75d7cc68ba4b GIT binary patch literal 445 zcmZutO;3YB5Pb_26wrQI{HPwh(P~QKRbxyVJ)s_GOpGT$Y?c&gfExW-UTmU?KfoVl zoW(>Ay2;MWzMVJk?S6i}eE=AtuR}#!Lq~^%t_T|%dKxSS^@OLqJY|sW!3~2l&h8_I zrpwdlYLNs{KJkMYAxh%&l)43}UpRM49!sud_xivg1;qV)_4 xWXikmkZyax%ZrV z&$;`YedT|=_m{f>da)eBVVrA5KhCR2Yq+3cO2b7BpVaWIhEHjj)?jMLXvk{FX%HIn z8fG+H(qPGbvr=3Rp$7#iigId8QEEmRS5!D5bmCkH6}VEXYM7Jbb0N&*s)kR?U7wMY z&r0ocA#QzM?tejw7gf9@y+0p9H@=`^LHc|#1RuVn;mgwU6%Ak2@HGuz*YFJu-;`0m zrQzie$8U%59eh{C_vE49m*NL1eyBhzn)Ab=>|Ro!BssOK#b>O7s3>TqI&3*2>y{i# zE~s1>6|SkEZACk0xtESQS?&#&g;TUD6{}<)FI8=q?oCrXuWfyO%q+@N9+(=LHRsGk z!L(-*Dc7;=nE?gCLCdz>AqD4Z|Hs*@Em0+aG?IKc~7dgXySPU00E!#F`4Hb+pM)R`2`=e_Xxt3dR^bMAkUD6>_axZPQ6iJ7u zBd&NBZxXZYY@s)5vU=SOi;kNTs=d{UIV1X`>&+7#WYnSPAQ_mG3>?z&XCzhJ(y@fP zS3xq#>oa+=q>c%R-G&w$&&-mZ3ifzN*}_eXnuR>OMC8t%9$5oz6-tkC8&-WW+1t$p ztKzP3epjrU4A?>{1uZkeJ?fIJnW`&U%&lbihE!Jj*;lGEp-6*itlb0&?vm!hERyC% z1MesY&LAqc0As)qtS_sskx=qvvGQ$u@5! z^}LZh_eN6P8~L(%Bi{s$ety}FQ1EeT*APGx$7*~TN<19?YiJ2g9N&a5?KAwTwBHD% z(g7owN(T)!l~xTcmDY^rR5~0qLX@hpgHkhe%4Va5GGw$;?l9UYbt6pKVzg7X8U|&X z@jz+`JL8>8h%7R&f=^KHVj94sOfC!^21(~FRAfT*n^c0~B>c z>v)8FB3(Io*z0Jgzp=ne?U!lo zuQjrb$w{n+?*72$9O7Q^jzAp*p^?PC1;0{z@7+bhxf^fe9{kg+WYlmZx6eL;f;j#tn{du!olUtMWH`{*&eS zH_P@GOY=5&-NQKE!Gy9Chm?nq!Wbh4S+sFx0r}{y6z~|cklpug{0@532bOVALPrpM zhr47Q#=~t~*xAJ*_U48jUO_V<(ex3`|E}Y(>eeU&XH8wbb$rOH$G(Lo7H)Cf**HX$ z=o4G>*kEHUY1_Y@?TM9r(muVN!-pFVySKAF*|2r2+18uAAFV`TlC6H8wMet=FA%9I zR^}qB@htz&BZq0c2$T3{@FueO4_E#N;bH4%ZBL__NS|pS%l$t70rB|Vz;(3UM4#~# zJI;R_ABp=Pzm2B{@1Q^3xr~9)p16;99$e36kN1{Xtk^8`x=ixf=pX_2^1se*T-gv& L!CA&=!sPz}=AOTe literal 0 HcmV?d00001 diff --git a/examples/CreateFile.class b/examples/CreateFile.class new file mode 100644 index 0000000000000000000000000000000000000000..9ae7ab11a0b5817a43e89af2a332bbbbdde7e860 GIT binary patch literal 425 zcmZXQ%}T>S6otrHPesnKKN>k3qs;xS#TT;fJb}`Qls$ovYVaER`(s%Elh)u&B#e zTuU8xXQkk3Ev7o%g^dowD2e5B2l;=YBg+ zb$q^S2AzZN9d(iGB+evOn75OD+EMSd86H2l><7JU+f2F`hbu7E?dY@2&!W(8N1*|RVNpi8J7O25vX|oR{R%1`zp&- zL=TcaX)1$$o%o-4y_}a+LA3ju{%Ki2UYMpHy?JubKvQ9jrP7qbRpG&Z+D_=OcTzvX z3dZ<;<|~25!R7jlS&b-&BaJ(VYX$<(xt5Ef#i0pIa>TTLfenlJ_5r2ihP87Ct5t-y y2|wJxZr);quvtL4NtCx39kMQv7mz%D6jgH9C~1|MPdQWEv3cq={~5+5%sv9)o`Tx| literal 0 HcmV?d00001 diff --git a/examples/Exists.class b/examples/Exists.class new file mode 100644 index 0000000000000000000000000000000000000000..9f03ca417afe4374e04737b4e28b539767d3f8c1 GIT binary patch literal 762 zcmZuv+iuf95IvhXUdJ&sy(CbeB`G&2EpaLERKx?Qybu9W5K_yNoouR&;&l{nQ27+T zfM<9}Br5R%d=z3fmKv4Rl4oaU=FFKn+CP7P{RYs&a~IdK$#Kg?4!4cDQ^XdwIqtf! zv1v@rLEW4?F7DyJg9jWBIUX_CFQk(CB}3kCd}6R(Cq2Qi(w0iRo5YbAe+;7`MXWfK zilOR%ZV$pQVK5BUY0%MQsZI|K&^l1P(KB8(4dl5jKiT*6~Pi`wl3iuon&G&Z1|0(I;zO_xJ*bAjST%zp^j_x zO3ar7NrW=lRl04_$>=OJXJ9|bVOS$;&x3gsv5pObm{JXkJfMA!+;KC1Fhjn*JB9TP z^`9u5!#AyjK H4mbY+w@9e8 literal 0 HcmV?d00001 diff --git a/examples/FileInfo.class b/examples/FileInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..fbdcf1118793d4167e624a715c705037cca2b12d GIT binary patch literal 4248 zcmaJ@3wRV)75?weX6I&EAZ!T`!egPdgizRml-4Ch(mWs`At4)}3lx}SCz}cT2)h$V zDz?<(quMG}tXj1qKCrb_ptwO|)B32|+G?vlqm z-v69)|9kGtKl|vLr$zxR#=pJT0z*Zg#7-|%S_ z1CzrCO0gSzR1A7C35LWF`|J5af$zj#iFa|r4LozB#6BL}B=K(cH}m9viT9{@FOT2n zMF8*Ts<%jdfM-6)5w}X*#)A(@e3<0}`VW52|=b#kT}XIwS23VS$UbwDf7a zwP0LJ#)4rpZ6sqW1UxlH(lA#FC{+tK3b^Z1QC(nSi;>jV4J5ksbf?x8rx|xbGm-*R zs?Jk|6TJ>pG-xiQH-Eq6JH=G(sck7J?*BQ^QDcO@+%w&AnhV25=En=oV zXa>VZqCc+JYo^|qN+&dvc(=9&qtW2dP@uOrlt_d!nShn|9f3+KZ@@I-!PRL!mP#91 zvQCTZ$*7hVm|NU#Q#`K6w0LbgHjvPhW`V1~?179H(?fwgtw7B{I=(Vclj=8;QGJja zGpVoJ=*a{#iLPKc(Zz8-d>0Qh_3x?pz7IdZBR)KeAF6oFhsW_F>QZs#T%)fU=;_gk zl0RVo%v25t1$_81o>1|m4?h8IsSrVdW@$C(h_u(l#>_h_8 zfSB3K$j|XKC;ozAN@&qCW@{>H^cZ?H6cCtD>>qdBhi5o`8-D4-v-p*xrjc1=M5B6= zYd(kPx#q7Oa3El0xG@a>2G8daBU5jr^=>nj9%AITMT9ojt7UrmVPoWXIKw4>pHF12 z8eq7$)_@{9e+ ziBL{E)k>P2^XCE*AJa!4Uc%GFfP(9d%+AKNu7~@zZi~Uo7Lq@8CdZBDYJbV+)TNRp zt&oYMSal7m>I72w=um9bZf~DU86Jh;qPM*0yd?M z9D{%GL7v4w=@HKp4C~zk1P_H&yjtw3)z3h?o=${(c#RY6r!UAF z$^x{#uC29|gvGjVY-(u;N5Y*Ag_(7=tqt|t+nd@O1bkLZdq>l{&V~+wan>;0(6Nz6 z-rQ(SZ3jh8um+pjI@Yf4Xxq?Es*`_>#}H}j>Z7NSl%&Ybp#bGo=jtLWn#{kW0+Xv2 zoEsxB|2&!J#&NAl#g&`rv}3FVvR_MQND7JAc_}o})-(JN)_aO0%|`OkJIO& z#F8u`ly6v4H-jW%lsaam+=;BXz)C7TTdZ%yH794*7pj>wzpD8HX%i{UsdDt;qIhbN zr^o)B%yV{;U&iyWAi6RydDgm{dELzySl5#iKsqvq=uwrt%2`$DL@TSBE>Oiw>}}nn zuF`;Yj;hd|^$yaz#J84;Jt4!D10$%>l&z;aiw0C`A{#>0jLria1ICCrbhM;0Rn1 zzcLJW$UTCR$S^#ilIqct!x%pTHR6}UD1ESc)N=^cBk)G5m8HWN7gG7YLe0Wg?WT$G zAy0M5(vz5Q^$|>Qgn0<%*$Q_>Nfr}lL{`>R-a~|l_iL5|Z3HmM4w9W9J56?$hzH14 zk?kPcM|OzpA+j@o%S|?qtez}Nc7W_C*|TJCQ0*CHHDp`K_L4nw9AzVzM0@l5FUn$a zg@=ff&!RkwDMyqZ2R_xtr)5!*#~U5^bQ`a9#zPML z4hO!1@j}0A-r8@`=ZL-9uC=mwcB0vVzhg|TRp->2<%q4dYh6?9E#7qCbv9m4-tH}) zbKng&-dH?4j5_euHonGz-{ruYY`ocl-%#OkXR$VWfXNt#a=K2#bW~s-W}uqnY&m9OHD+TyN#AvtizqI^PRvIN3vdPt1${k*8;ivp z1jRfo5w%z<>ak2{xI#p6rML}Oi313U`>;YB#ns|*tQ1dRm3SGo;uX}n#-rX`#QGvN0;+Lht_o DEBq}Z literal 0 HcmV?d00001 diff --git a/examples/FileOps.class b/examples/FileOps.class new file mode 100644 index 0000000000000000000000000000000000000000..9a0e1763e78839b8fafb72ce489ab1bd13b3c75d GIT binary patch literal 7889 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 literal 0 HcmV?d00001 diff --git a/examples/FilterFiles$BigFileFilter.class b/examples/FilterFiles$BigFileFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..1cd17108333b57ce2b83c8736afbee6a13dc3a44 GIT binary patch literal 502 zcmZWlJx>Bb5Pbs&i{~Mr2%@4C7N80D12h&AO*BLcjD_9Zx#E%IFt>;ChgjR%*w|=d z;ScafiL(%mV6pS@=DpdO`TTnS0MJCuL>h}GmQYMF0MKY8P!gyJtP;|De(1;hgk-&O zK`>f_D@n+;{ZO6``>u@69XDVk?RcKNjR~cCyXX1W%2s{X?)2RwKajhPOM-cLuNnRz zR03<9cLu}Ale$jGvx{Y<6V>cFcaDV&<^`ZPQhoOvG zfuodE++BCH11Id-XKqh=JZAadkUzajQw#^*U9%ukx=nnDdJ zJ}p7;Q4{=lAxFp|$R bvIQ(KVz4;Jf;`6w6tKeHWGsbcl#%%cAGc|K literal 0 HcmV?d00001 diff --git a/examples/FilterFiles$ShortFilenameFilter.class b/examples/FilterFiles$ShortFilenameFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..0b43d229219ae075fa3b0769e1e764433163dbfa GIT binary patch literal 524 zcmZutO;5r=6r81ng;D`U@dFVLCW0~a2VlGqO-P6yYCL#r>k1|9*0ja=d%Sq@;zbh= z{s4cJ@hv7=qK9VQo6fv_^FBV`-U0NmV?amEz%o`iRyo!=HW&&=zVy>$2CdV*WY7oE zwP2`@d@0Ump)2AG#|?-nIG!hNQ-)4wH1+(O#7aWfvP1XO4@7@7b?zK1aOBvs)7Y2e ze)o#OIJs9IKavT@CiQkSi#?$n3^jsO#HvYp%5I_n&aq{piEWM+LpvkcvnNrUDz$V% zHG;eh^?zA&D5Z!8fs-U6p_hJ_J9nqTqY%wM5wcSo3x9t?EKK^2Nq3=z#_42!zac|8 zvody}(a9O|bpITEl#jY1RV_kBm_K+0d!~Y+G#4mRi42sR$IOK@;GD#69+ z9T9i!!0D+35i=6*;Xe1AbrUxyU|vEGCPX~o^dYw_a4sfc5lj47=Hep}k2!rJVudSL z1*{2JXXswh@*7$~rN5aYnj0w3Lh{y zR*Q!!Lr+38)MQ1^sO5bnQy`5)S2Tmc7kZO8R^BSnf@0*ODXXj*`4|tB*575-lBE?5 zQ@{qvsbZy^<=0SfZ=)nGnA1F5#wf-Z`i`?&&WxIRCYsVS+{_J|4E~mY@wT=`T5TPB z8f>OrE1EoQBZPrP_yt=6;xe}JR7L_jGLqP(&f42rspN7TMi!K@hi5XLBPC-WDFH8J z9AHz%ON?>bD{42G?kYTbzso_gqHGrl#A+K6V+D(Rm&}BDr5UpZk z<<2qt_i6@bi5Ehd&S-%aHV}$mPIYl(Ahi8oD=o@3dd~c31LF%z=M9oZi87+jNDb^O zF%08$^7l$gdhs&cxQSaNbNAn*=_2~64qG~6pQ*u~sKb%2!MRh1i>Q#SLrif8;Si#p!^GPV!3a?gaSnoUn7(%|qCtp%0m#-lN&o-= literal 0 HcmV?d00001 diff --git a/examples/Format.class b/examples/Format.class new file mode 100644 index 0000000000000000000000000000000000000000..998801f08ea5a024e8b0cd951e24fb65205ec37a GIT binary patch literal 8247 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 D`vG*p literal 0 HcmV?d00001 diff --git a/examples/GetGroupMemberSidsFromURL.class b/examples/GetGroupMemberSidsFromURL.class new file mode 100644 index 0000000000000000000000000000000000000000..5334b1f1bcb6dda5893b599144a71ba4bd527690 GIT binary patch literal 1663 zcmZ`(%~u;$6#qRk$xMcUlt8E>Ev9}ZK#4^~oghjfU|L8pp&(SPlkf;blT4hC+U$Fd zdso^eo331x;|ZSj9F7ZD{t>QR>HnbKmlTk%oRjk7tIr0}*%!VMV{DnfWikaq=nPsXG;-&gSgJ`BS^S|u_ixQ_&x7D+yq@rjBkMulxg za5ojq3Smw`M#!WzFt1=ioSzC!R>3V9w`D9cgr=;zFFb*uY&GUugIeU&*+q;cHNnC6qO63XTi1C3+n^4aQA>Yl}M?Dx%~zEQYRlLc7g8cCmLOc=UXeQwI8_=* zB+rI0XyhVFm#v0L01O>^xxDN1Tt=+?Y3C6C#y6|(smphOPbW91^lTwBvyv~|%dh1! z1u9)!FRo;0`2)63peUZ*c_3sl8x3CHWEeXS$1^x}mWcX|c=nv-HmYXxFjJJScj_rI z+&(Ak|E_cKrl+$f5bb~@Q;C&kgWfHD6S87P*|Vd3(IUOCSLk~teqCVV9TR@5=0>F!x(z8X8H@#W>0lR6btx8{FhY8$1meL_ zF@gwgpbt}|okc%xk?(z6MjbkSzz}wE1wWDZ<uZ#Q#aYf6)xyqKpy&ouGe`_%4k6 E2aF(-aR2}S literal 0 HcmV?d00001 diff --git a/examples/GetSecurity.class b/examples/GetSecurity.class new file mode 100644 index 0000000000000000000000000000000000000000..0f1b2d2c0ac5be6e6f59e3f6de1054a65f6dd808 GIT binary patch literal 651 zcmZuu-A)rh6#k~W?Ue0eTcIdO#iHo;Cv3uP4GAIWO+}M61mtRW9h+&oyQDica_^IH z!!=x#M3X*%ui`s^XCSsTx|==c%$fOq_RO#AA7cQUXjz!UB1gqS21`0Tn!{r(TUfyp z3#+JdJmpwp$i0@aRND-OQ$JuZcazV8q1chJ*dIoL7<}}DK6T8=LpkvVD@TURhTO>+eEov~eQjn7cIM7CAk8X-3V|8B7Jo8ME$72*Uq3FlEJ1Itux UP;Qc5iFQmI@eC0M1j5S^xk5 literal 0 HcmV?d00001 diff --git a/examples/GetShareSecurity.class b/examples/GetShareSecurity.class new file mode 100644 index 0000000000000000000000000000000000000000..6d0f992ed5babe632767b6628a2b51976f9cea61 GIT binary patch literal 801 zcmZ`%%Wl&^6g?BCapJnKloSdCn)0ZVrZuFy234x6f{;?EWI!rq3}PL(={sRBYRUVaN-jK*iSycxq$69s z$V-mbRSgqUm=>7pw7gfb9s5n&@tZ0^U96a}P}Wf~v5KldevrSkFC*WJW7TF;$C}Bp zS9I7W?%=LK?oa(q6E&0tX3sY!G@}2w*^#Y8V15LhO+nJuzbBn-pBsh+tmkFwayG~I z&Tf6IlXDy=(x=E_kNpb6!d__aQ@?~NO4nz?kjFSIpdYEAF2$c3>mZO#!r>PXxL}q4 zW-BnMxc=50B~0=MQBMjihH36I^oq2CcA|0u@regg=bjmW8giIJo+&EyJ zRJ7U&w8m<>kM!PWOyo0t=-O7Xdintc`qg5sk1Vlwn)vwhyNbxsQ}M>$|KmmsY6H3% n(pDS{Eb>$$wnn=_`gL;JCfA3&eM)sxZIfaE^C&IGV literal 0 HcmV?d00001 diff --git a/examples/GetType.class b/examples/GetType.class new file mode 100644 index 0000000000000000000000000000000000000000..10281774ee27857489d830931fc89880a9781ad1 GIT binary patch literal 1590 zcmZ`(%XS+@5WQ_ZW+YE+d15*7BS8j|$WO&iaKLtgACVpTB}F4UOdbeH9{Y?Vjf^x3 zWX~65&juD*a99vHG6x@$Jzv0r6)V01xGmXHg3Y3;yQ`~iSKX?a-~RsPC4g~k2Qi44 zf~!HaVM3}&1=kc@55kX_iVx&ECDje7J`BQ#i2y#rbN~^|1Tl-7Qr!yD_OXngQ!y_s z3n~_6$ZZvI1xqTHRoqdLP_d$7RmGZ$bp;y=k^(;W>AqDJIQw92FZU!DE9RWtnBi7z zXLm-xKWjU-drQC*9oiD`E|#|~fzCDCu{LU@yj98M@5H^YR+WiA@t$0dQTy@I_{ja5tem{H10KY4Li zLmGxaUn}c$&2jCL_4+C1)4FVyv{2jGu`0aSbRIk9FPuo#sywj^Rz$Ke9np}%rc_%R z?%@*!riS}?py6G-r{JN6NAlfAxTN7zWHo$-oPc0h9(P$}WQWOBBev53DhRZd$ZY7p zNsz#dnTltZ5^Hh8G&1pZfsTgdUNXJ9oK9|%q4tKsh^M#WX+k$ocjnXa4->6m{F{V6t-4l;36*OsC)`A}%dr&a z*CmXVD>0y1=G$hLvoD>B9NVr!tx~ZZH^b>!w~IxaUE{#7aIU$Rz|o;o2AdyG1434` zax&ASdijw@D1g9uIY-=ixaVk7U*_ooSHaacd;sx7!|@8WziC7OQ4I0prmJ`cFV7Gi zhiEg0J(CCUtc}#+{f_^IY2~OB63PkqS2M^&h58*ctpy+BH0r_wp!8+OxpuKv5GcV9FFj+?@w{?VmM%Mye z^l2Y=gVqhdXG#sLy}p;<;4(dqk~(`H$8fhUwP_3{%lB7^bRUG|Z4+f5-R{9j!u|%~uFJM))?2{|hRm BS>gZy literal 0 HcmV?d00001 diff --git a/examples/GetURL.class b/examples/GetURL.class new file mode 100644 index 0000000000000000000000000000000000000000..e473c4234680bd4195f19a4bd706e806072d5028 GIT binary patch literal 784 zcmZ`%U2hUW6g|T(EG%20A3*&;Y5iI#uv!&AYWh%8l?1C1HEH^^z?4k0%#vlX>We?c zN1ye98Z|!p;7{>KsCP;%HqlLH?#!8c&OLi)zW@C66+jhtOw3@>#7UeoaN2~1Giu74 zIE!-$6tHAs8Rz4;pyEXZUovpnfXxuQE2Ie588o~2oI$VqUCxkd3dy%d{WcGtx^0gT zz3&RikhOQ3d+rO@@m$$+T45k$Z%q-+&6gcM2!$_)28y(A`Jb~3+J%&ucdtw;!pw(}ap9ik& zdORT9{?A|g11_lxWQZYW7bjW5cN%gq3MU6^e`+6xsij2gGDPj2jbh`N=hiFoK#H0_ zBIlVS)yLHCf2jTiliYqFLh89evWB%d=^GiEouF zW5l*=dgLt@KftJH8GVfSyI((OGnW{{ERT_#7AnCc$v8b-lUyaK*bH*C%2UZAS*c+G V>&Rk*&;`oW$ykO)mevvEegi@YrN;mO literal 0 HcmV?d00001 diff --git a/examples/GrowWrite.class b/examples/GrowWrite.class new file mode 100644 index 0000000000000000000000000000000000000000..2d0ecbbdb7adb105f6fe39fa920f86420aeee9db GIT binary patch literal 1066 zcmZ`&TT|0e5dKcvG;IjBqi7o`Grh5={Fpp_Ssl0uj^>Et5vsN=8j z&7YtT>5Mo&_~@fQNZivZD3^!q$$tCop8a-{AHTkQ1CYg23EdbLF(M&^t0JyRh~Ro0 zH=s%w#Ta*Qax>1|2@zQd9T?^&7sD-n-sWbKhwq4(5^mLGu(u3`#ENMdtA1TKoOMmF5fZ6urp1s}H&=GG*IKTo zS=+gi=a|-Zo+nC+Zz@K^GwBKu_sB2VzEd%lOrCsU*|GPYJEmu3d9sX4$S|aKD`wTr zxph5Ps_UG|1NRyFPX*R|ui<-iouSn^>4AucGNzFiF(YFZb28@fNXBDiWGwLF>62Y9 z_|>Z6$SB|mL)W0b?-}l(=V+Eou(6fpkwqCxSmqU|i}+E~49VkaYx=HH@ff;~p(E)G zz3SQHNfUljZEJ4-R4(nio>8Yw*gnTAMN?S_x=wv2n|l6HK_%@4PlQD zn?Y1J7mCFeQmy&!4k0aKjaC`e8V$qRVo=oL=&7#T oP0;}6N>NUnAk`B>M#k*P&pCbiF0^70Ql~)&Y73={@tybbUU3li@o z76tMjw9)pXfLGo+6!7=bmJ*n(X`{aOlZMKE#ElLSKZ&&wm@EIT9mgke)QL?ys@qJP zcGWcopZ_#f*Xq>tB$jxtr~Ry{zG&AR?pxda`MtK|T0;aVNGyj~L4kJzI-_jF0(ZCS z!kWZ-hz)E?ltXNxA|Qt(0>zPnZ;fNsv;s3D=uwE{ZtA06w3nJA-4-Zis;zrgW%Z=N zVf(RZbyP;Y{QR3%hxkxj_4%s*)YSiyJ)xIrpPEV!^*W6XXp^N`Do(2Zv_6ITysj(i z(Bmg^9v(=Gv5ay4RQKgTe^Fozd0Jo=%wv@ch*NF^UNGhdpvRV%m}HA9{X{g!ymX1& vHN0PLRlMB`_!XaVtagU{_BrH;Wg7l~%j58QaxHRjk%&+BDXwYmbC|gY)Ln?_ literal 0 HcmV?d00001 diff --git a/examples/Interleave$IThread.class b/examples/Interleave$IThread.class new file mode 100644 index 0000000000000000000000000000000000000000..12d7d518f0f6cd2c90b47ec5bc33810f853897ca GIT binary patch literal 940 zcmZuw>rN9v6#k|ccDs%gS}tk@sv`D+UGJBIpb$+6O)+U>!q06xt&7{;W_Omzd-x9i z#%OCK@d11&;~5K7t=Y_(nRETVb7p`1{PrC{3EKwJSWF;=C4)pZfor&~;f8@Y7L{gM zoo?z_QTr_eIpj4I3~&^cSk-Y`L&?AtObvH6JYa~1zQd5J99V~z=~!;ZtV!Q?J8KLR z>$Ypl4Tjm=xHm^i495&+IUXXT;StAUJYkso7tdDMZVR8|DasscSZ7F-vw^gHDOw!QP}Z=) zv59$xg@dNu4$Pq2Fl*h0D!doUUMPu}u)3<`JjZinh+#R~@?64|9+i9fzA1Xr_FRq^ z3egsIXM}orr~a0*v>3GW6W?)N;cq)u5Qu@+tX@yJlzR1lGa8E+c99b6(i_hCjQiiEsd7&N zacGS3rsD-_cE2?>X*J)~eXB_tW7HR9>G`GUl`>j1PLdH?)N0aPqEmtHN@ElTV1?or zM2_jkaGB&Jq9k?1kf6^X?G9N^7c0d+CdYk~=e{4IE1&6OssZexNz>% literal 0 HcmV?d00001 diff --git a/examples/Interleave.class b/examples/Interleave.class new file mode 100644 index 0000000000000000000000000000000000000000..4ea28d5eba64f4be5eaca725540d8e871debccda GIT binary patch literal 990 zcmZ`&-EI<55dIDP zdZV}X0*sA)0Iz%&A3&WWv76dyaTNZa#yN2s>mmyp= zEz_$p1ohlY25Gh5<_ys_)8fwuy(V`yjAoZSQqM3ghJ^llZQIx}N?pV1lp3C6TAhjr zR3E=_&g!wD=QK1V`(Z$DJ-Wc6d=lYnVY?Mp?rR++;`#U&hB|+NP7S z2E8$5%6Ch{Z7j>Uqv0;@F~ofA{9$2<|9L$cY;AEzLj_eTuVi}Sc%MosdOcf14J(4j zvW5qU6Jb9m!=#_J&G6m49iD zx@kPN0ClOsasA}}PWjghq8;uqD7N9aoXk_g>NH-%wz)-PFPxP3*j3|}5zVAt&z=5P z@%rP@GtB76aTFhNJ;U*k#U#C8@dZFw#7QQ|%93WJL-`Td9vv9YkyHr=1R)`W2+rdI z*#iEF9<@Zeoj(ZeLi>zBEI5R;mzT<45UM7>A^a>@OC@))R7mY3ytxl~a|9(HEDsTh zsU%WEoQY|47~<>*6O9i+_VM?RaZt37B3$&Z>!;7A42|x*NNbeD1ZEMXJxm}&R+ct# n4o^w1(>lJw0^X2rVUf@vrqn-TK1=5SQkW*Kk}pinh(Y-SS{&k1 literal 0 HcmV?d00001 diff --git a/examples/InterruptTest.class b/examples/InterruptTest.class new file mode 100644 index 0000000000000000000000000000000000000000..65da543e8a8b46847bbd8730b820c466d7d88cce GIT binary patch literal 1356 zcmZ`(&vV;E7=7y>m95CJ>$pkNCTT(mv7H}ELm(wh3N&r0Lz0Ht19W;|WJd`Kwq&Fg z&>6VU{u8}$=*8zU#bGGJz>VR5;l_az<*nU1?ojN}uJ+say?y)kTmA9RPrm?Iz%3o) zm`!2?a~kG#M6sY6Q#FekE+nyp*ArOQ@dn=1u%crC7d5=4Bc=M)1TLx2TAXbBiN6%z zx`xX-PGL>M+d8R9If8edLGZg8y{qAhKs5C00@kG@QTke5bmcHX2ToO33=D3c$ zEO09S-|51K0R1Q8mkrs!A!j%}`Rl zZ8a2d%D@J$8n}jOfr-ur9nb8M+Iyv&y|p!5H}D>AQ0V^wN(MGDMZgQ|_81Jjk1c_j z?rbQXx+#6j4Vs=W&C2t)9{jnYj^%wz_5senEIjGBlQnuJ{jerI-@vvqWCu3|hK|p$ zk0sS(Q7#(TRrn8-C7EM<fuz=Q7pgOC;II!g{&yyQgsQ5?ng}&mT81G9}NF+*kQp(b*eMS#! z#KwcVZ8s@3zp2VA9!Sflk|deC#eyjo_qe(Vd{`-LqkLyQuziK2A|m_)dhrONIQs)4 zk2n%I&vuYlAc+`swgZg5is^2iILA44gYHGw&Sv%=;+rRk-Yz~yBqp>yyRVe)cg9@7IK*xzZ znM3wR;W@xQ4`C}?nR_32z81 o^yl#rOmI)?yEp)onir|>0<|o0{YA1bb3Krowa2Hx_Xvvr0(;0R@&Et; literal 0 HcmV?d00001 diff --git a/examples/IsDir.class b/examples/IsDir.class new file mode 100644 index 0000000000000000000000000000000000000000..712a60e4da64b9693918b884e92bef3535e1d9f6 GIT binary patch literal 533 zcmZut+e*Vg5Ix(ZjZI@O*3@g&dQB@d;Dav}U%Y@&RHz8nr=-TRrAbPXiv28oXhFdb z@T0`pidMme-MQ>Jb7toK0A z$tYhl$VdL2!;q1au!Vc|hS6v73stH-c1uhP*pOe2Bz^n}#&5kRnN)L^Bl0R4+?6M}7=5 EpQ1W!HUIzs literal 0 HcmV?d00001 diff --git a/examples/LargeListFiles.class b/examples/LargeListFiles.class new file mode 100644 index 0000000000000000000000000000000000000000..83f6e764484a8e477439a771f19e6c454684a716 GIT binary patch literal 1427 zcmZ`&Yg5xu5IwgIq>Z82qM(9O#7A3d>-$wiMZs6WM-jz$S}&bAP0A#xqkl)g`b9?z zBQyR0f0TM|D;5MkB)NBY&+a+9o1eeF{{WD~s|b#Tf#1Ik3?UaqAM#Ng#|a%L4RqsF z1gF*ajDa}Ls?#|G=W#*BT#TTgF5?C-mvl_1n9Dk@7|e1?8LukKq>8zwpw}aqQs3za zZs@ov&{e57+(1Cw66hYcT|1Z%2&dBX0@}6uYbnrMv|TydaLUq~v&uDE`cuU>)>|uI zv)pRF6nM5RIhO6J z_@|pwrss9sCZtqvconHq2=o;#uPTeSAE>*ZQ#?pMV`3PiCidfijyoobm|@cYNlrEv z7p12{lf)!V%;K(zd$@1n0q*N4nV7>v6Y~l^-0-ccyqMfrFgZ>|4X-v~n0TaOA7eov zzDcYq@=zeQ5pCiLo|<@u=L+2-@PY!9i%Ltm-9KtPMERzt4&@#fA@Hc3mTZn^v$LI$PM4+PwJ6hP$zt}8& z%4=rEhPFfY@L$)7ixG1OhY@O3y-8e%$kZ2ft)hEj8G0hpM0BhPgP$gLG?{hbD>UsD z>4ZNqR-nTtPE83Mp|&IRC`CsRMGEP^`9IR8(^JX(&_1B|3wjc|8~BArn5i zj6`u2eXP7|W(B(^$FfcIKjLXbp6ep3CI&j(vLw>Pp2S{q>!)j9VsMRRZ>Lo`$^-@| ncn{_7CBY%Kd_P4GlUNdYN>cn5_8fjw&C5G8< zOSU673VgR2_&QAosvI>N+t{H>|CaeMY`4Y0#xCj%Q(IA`HzuvfsA9v#OC8y>v5!|A zuWh_Rm8MGzGn6K5$9`9|VutyN>v!)AW#{4f{vc?6i((PbjfF#^DW~}|bWi9qV!9IH z1qW2x>-UAaWY~F#@m`U1I*m)m8ZYFKVc9vX{y#Y%hv^O&7M%NeM3+wacXtfDuY2t& ztYM0tkNz^CwWCCGmaG*z8J*eM2<$s4409xNW2b=v=CME!oq7b5GVC$XKNkibe%Okhtqr(qD9qli3huz)gICe>M_{}JgKJpKhdIi}_S literal 0 HcmV?d00001 diff --git a/examples/List.class b/examples/List.class new file mode 100644 index 0000000000000000000000000000000000000000..2d2e7b08a66648b4b896ef14a2f5274f3fc33b7c GIT binary patch literal 977 zcmZ`%T~8B16g|^!nRZ!hDYS|ODSp7VV5?O?0YN?!o2n!wCd8+0nUZO`+oroE`tC3B z#bC)S-*Q`> zT1~VWSlYldtQ*+CbB;{|TUa!(jid_iPzUK6o$IEhb4lD~2-vP7ERq`45JRkY_UlSr zR4Fvp3tcHQNse5#NzGXrKwq-IC$ zb_>a7exGLR(S(I%uhKnPt(I_(7#0S#($`&gNR$`$n%!Gs7&kM0JYsYe|6PzF)KcXc z_$4;z>Qm;6{`{*tDYN+BUCdyNeqZ$jKoXH8d!1HOgp4qhJp=np4#N$yL){=En7~a+ zQPfjt2os*1BXF1v7S0eXeSx+)?<2ILk(UQBySEe a><|_a$3DsJkl++CHPSLk-xT=)-1-HFZrCmW literal 0 HcmV?d00001 diff --git a/examples/ListACL.class b/examples/ListACL.class new file mode 100644 index 0000000000000000000000000000000000000000..6c591f9ecbd8267830601810ec891ea11ee95dff GIT binary patch literal 1420 zcmZux$x;(h6g`iGbkj6b7-TRKN0JZ;;sgQFFljIhnt&osozSG3O1e`?$AZ0k|ACDg zH@FB@QpH;R5LfyO>V2IV(pBl(@0@$?ySe9e|NQ&y6u=l12`+eA;Dt}bs02T53K)~n zi~zrlbLJL@CnVg)9RYVGw8A6e9*_4WOk#>ZO^FEd#k7bS9v^UUR>VWTcqAgkXOFAazx9Sq4~%dm&&+=VF6EMgt5%f zpU){tHRvv-xMy|JM5y1*W*Iq)~%>{@EMALCzlGj*~v5GYr>saP_&jdV| z5k-ueJlo-1es@>RGIYAF%QT9O2i-C@uqoh$jF;Fd@Hs91W_r6lF6w04uii@ zJLftqx=Xs6O|05t*=U9yzRlTlOXu7)7PMR@r5qF;r&&;A++*v72r~?M!snHh9r;{% zHaDL3r&ZN(hIU%lIE~A=NUu7-n!xy5KzBE-Tof6_X5TT`5j`+U1soP=Lkq6pDoNZ# zgkYy{0`SLoYCnYh6-`cC0rsO4G;jHA6UT5wMhg&DY_l%^=^?&?)DYMr3!1>?xr4oU*S(UTCE3FOdU{$iWghR3Sgw z*yn$f)sf7h(;AEe0@@*>0}=-5GdBzwBWS}op_7DeP+k^Y_yi}upc_BXgI|>M8-2J& Q73?(H>-4)p&rKNl4?-A8f&c&j literal 0 HcmV?d00001 diff --git a/examples/ListFiles.class b/examples/ListFiles.class new file mode 100644 index 0000000000000000000000000000000000000000..996f03a835990c7dc40308e7d686f612f5b6afda GIT binary patch literal 1103 zcmZ`%-BQy)6#h0XO&Y>qp%tuXL6Nk!R1rabL@k1Xr8-l_8OHG<4JotOq@6T%^qyP2 z(I@bRYrF`Kj68rZ;A{8<>e+UnDwxddIeX4`&iVG+{r2;<{LFi0!0;o5D^hxFv$qGG=7lW(X~C zhkJ_*0X_MQA-GiCvKV^u+_4G`yJWc=MyW!Pplxu6A*Mgi?-;L)Y{hW4vqjJ4&i1@0 zRF_|yR?Xv8r%sz8U``M(6?jqay?tOOWC4b5^0f`l`*Gb z9t#@ofJpVXXPxxda2G=w?%_VsY3Ey9a*cA?av4}cLk>$C9$;C+3YKL&)bI$i8dgPh z4r@d+Q5Lik+-ag8Ge~w_0A?A&C#)HI+f$yDb}Z9li0Ws{@CUT`rtVoboz!f&uH|?e z+_u(vrNT)d5}W3S$!{qmgiVsN|7tQ%S5YI4y`pEBFE?DnBtZk!hG5Vlz^mD(Er4qo zHsM1?t!6n}4C%8do?_h+jOyfV%PSZ*^&ilar(gt7ylPA1<7@eQG($&|DRpYv3cZ%N zzIwXV$;7z6_TMZ<5ToZWJ_$@b8CuWNZkQ}1+mSi|+b4&n&>Ct5>4je)h}4AsK#=yp zhrmKSb@UPM0$(8&4k2x(;*$pmtbayuCYbioQP_hz7a9urkSP`mS~H=*v=UV^RHc7{ za)|Ke0n|vR4=oc_CVg~~=cC(4&#uDuetjp9kKQ&kbL68h5+PKKy7or~j`7i5MtFCh z_zq(fV@>Ab1UdB58is;SbkRSE9zygHW`Ix;jH4fEL@`COEK>FbS(DDm>HKf0?meL| PQimXQ7HV7~Uqa$HEvfb> literal 0 HcmV?d00001 diff --git a/examples/ListTypes.class b/examples/ListTypes.class new file mode 100644 index 0000000000000000000000000000000000000000..6da499c26338051f421be1fb68940bc31fb66f58 GIT binary patch literal 1366 zcmZ`(OK%fb6#lL=&WxSO%ZW`xN^736Lx|h7B`u*8CrpBaU$sqA3sGd7Ni>mXY}sQ3 z>vq>omzBC}rLw40i7uQz5UWZ^Y$|ohs=uW0-ImCe&^ity60T`$$x)50x*wi z7;j@nMIwvUA3CswJIAvR2ov z+-sZNdFia<7~T;W-)UG|-Bj1Er^xuOQ9x10=P0Tu=_td{QNeZQxKXJVja#dktWmC(D@N|7jtv+BWB$fwp>%DnRJdNe zDKPA-%0_9!C{fn;;{#J6~| zZrpObQoj%g*j<6peoGkn;Bnl5w3w44UT0=8JTB#xj?Q+~^&F1c4t=%@A+X8cM zD(Fy+{;=q$ZkuktX7ff&CX$EDXrQ?*|4zN=z^kbRf^AudA4y&)?@$@ap1#Q&I-STI z4!vK&bYlH~cX1rk{Qb!%03q)vzwc5y##L|)&hA1yAQ6c3JLoGBqT>m=&{W)k0*&k7 zp9oZE2NrfQko^rx`fMM;3kq4>TnrAJSEK5b^5_RV{1voRtGm!5p+3S>N>p9wV~Dg5 zy^rBN#mLXh_YI*EvXnFtAhLu)Y!b|iIx$ArM4Y%wTqeF^qR40;WB0Kv>9|K1C5?D= zPSOdF9+z~|qcKUN9vzZ2M*6iX?mv@3_6p}g`ZyAKi#5lBeN07;zNmiepjThw2&)KT zi0>$LL@~@(k79<^u3;SCVglb`65k_+A8Gp&rtk}n;sLFG=KvnEyMOUSkJ;(JaT5RF aG@jD`UnE74|BfdaU14WV5vR!mIP)CDo+{=5 literal 0 HcmV?d00001 diff --git a/examples/Mkdir.class b/examples/Mkdir.class new file mode 100644 index 0000000000000000000000000000000000000000..4c965368798ed52c717b94e557951c048460a523 GIT binary patch literal 395 zcmZut%Syvg5Ir|fjp@tU`T!U1Vipa!RosZKsxBgexJuGkZftH!l8V3O#)5($;75rw zS(uF%?mW(%Gc(Nh&&L;l2@V`s7}(f$pkc^n$HvIUSim}yO4jEBx_5jpU|bZlRG>GN zD!p0daa!I*@q!Q|kE9Y9dymsBdWnKXq~<|bmr~77S?FB8Ch4-4g{o}qQXUqoGD)u_ zi=FG|nJgzPbYWvdV2~y9sS2t*4#GTU78mwh>~qy@_yYZQ)NP!lNi8sJp}&a&Bk%vM z%$x_~2qqnXp9aATklm#0kh~yo`fG?c3TRcbRs-rp*@8wW^DiJd&MSkGevn>jo~F^>|SOOz#E z2xJd+pv`*$tG;_8kUk3gN}$lzf$EG$o{ElL&nJ=|xjGOi)lb_)_uO@SHyAiw6X{@Z zkQC-We($L>qr)JUc*%P=97jF%NhigH4q3a#HRHIMRNIhPl6YmKf~rK##ui>nY}lQo68illJYiE872IcNoXhocHOduL0%2HU9zF7Gd@G* zOi_l*bKSjg$RowDG>2yL8M@8$EnbAoly_B}>;+l&DIE`XbM=u+C89uk(Q0dN>h$1@ zeA?#Jw0|V^zhsIh42E`j`J|jk{kEJn-1@8cEKH*zI|kDMwiyahoMvRXuKE9*NDS6+ ziTu@{0rCh{S{LZlpq1 z7=`_<35uQXu#ZrBw|Ru}X{b}4wL>)Lg6zDU2ZtUmQJFGUC|)JC>!jBsosS89N}_g2 T$}1AHL`;k1U7>%OVgvO*bd0WV literal 0 HcmV?d00001 diff --git a/examples/PeekNamedPipe$ReceiverThread.class b/examples/PeekNamedPipe$ReceiverThread.class new file mode 100644 index 0000000000000000000000000000000000000000..642652c682f0c96ff5bda82d82ddc310113e85d5 GIT binary patch literal 1229 zcmZ`(TT|0O6#lliq#;l!1*)J{1x*W5M8yk;S_CattQ0TEQ)sskNz+W5GCHHb!x^7^ z>oblNMjhYvZ}>mNvn@i4nwgwUzH`}gzH@ee{QCS2z$lg#9E0XZ7*Qc&3WhNvzApGl z8<#Pr;3CGoWK2)nu0pCy5-uxHp$TzC#)Md}3UN)iUzc!0K{qBPOeyHWO&QY?ZcCV9 za2XauPwJ(@JzOkSecrI<&d{ktkB7z|m z1301LIQk{rRWXY>6(?~@!aWuDLFu%OMab4LMSKbKDjp!E;vp6odh0cry0sRkf(&ad zQOW0dNyQ_iY5PMzfjm~Rh>VIQJYncO>M3%el)De{*;iR^J4Vq`@eD%@DpeNA6E)>^ zo|EvLVW6d?!9||s#wIbbPTb}gI*tNr(z1AI#?;GYUT(?Zk4t0w)+RCd59+ToOPn;P z|GMn(0x60Wr@75(;^VN*2Z5Vl2FVsirWlX?RyT1uDO%_)o1EL!Z*5-u`gGgo7S-0T zC8LeuX!2;VPeV2GuW0`_mz`pxeGDP(@30im(_qxAtt6sUzC>#>DH00QE66x{c4Mie zXKBvbTbe>$4bx!*-1O3ni324DuD;Tk(dwc%g419)Lthj0FOXnt2Q1bZ`YLb36&v1$ zdy7zpvqA?C$## z?g*+k#2)V+T)Zg=#B^=gg!zeB&Ud+G!c^_QcOaMboOkb#UVo85Fsv{ TBOe#eBSEV|k;1rzJCJ_^pdb?z literal 0 HcmV?d00001 diff --git a/examples/PeekNamedPipe.class b/examples/PeekNamedPipe.class new file mode 100644 index 0000000000000000000000000000000000000000..dcbf77f938134b1067962f9de976353c19b6b439 GIT binary patch literal 1282 zcmZ`(OIOoC6#k|(NgKmcUKMH-woKr=r3aRWPMsnxXCq&vJ8z z7oTnxxv|Ee#Vv~$=e7;o<~D;oZCa)?%TS|-ml*tW`8Cc^pD-<+Eafs3XJod?hKN zW`Pfi1RBnvgYs=<&2>9s=Q5F0E^~ZD?9OVqiCY?OBgW8Km7%-3C~toUa96`T?kTvhA&v(c9wI?S^IcQHBMnI`XjsH!1y3}j@KnPyENNKAa}8;cx3&rZ zL&FIR3z;pRbr{Z`xQ@vXjQvemTrk$Q!JXrR<5r>M5S`q}(T*Oj#F+VrXJd+?-5aw| zay&upo*?gzi24oTR5}4dvK^yH*gfT>_H2g}3ZMAjE&l;hskJ&GiKHSil2V)@;N&a% zU}*k>&8wQ~OUp_k*_83v%ciqQm;Zyh@Cs!n7Gisjkgs14uaZ2P%hVGbZ{<|otD@@hCaMkE+(~e2LnQa><-Z^sg#x#zFFN$O->iE;R>VUTO4;qa&C!KcYFzR8z=VRy zcG9YgMnegfHD&Ga?_LCei1@|A>r~ zJcOL?KY$YThx{%AhX|$*phl%nIO9S~k1M|Sm~K%T)DH-UBp0<&IV3mLxu|~!c^_Q^ zA=yQPi^h;tZyS#t&rQb#KfQyzBnDb~PP*1=WV_2dG<^?9OiAgw^#x7>?8nYAwDvS{uK3t}`4_6SPQ6-;DS=$l# E1?;&hKmY&$ literal 0 HcmV?d00001 diff --git a/examples/PipeTalk$ReceiverThread.class b/examples/PipeTalk$ReceiverThread.class new file mode 100644 index 0000000000000000000000000000000000000000..d05ca7abfe4675034196f2d913cc5ae601d02b54 GIT binary patch literal 823 zcmZuvU2hUW6g{&G46MV4E!9%1)>;)73$0rG!1&Nc6B1$@Atu_Vg^qRGWg*LMqrb+- zKGz6M)c6DZ0sb8I&I$#M4|8Ycew=&mnfdwiY0ZrmcTNu zbF3KPxMAQXZgJ!d7$|TQIZ6zg?J~^O53D1rYE;ffUjlWq~!U3(R1aU{8S6;}rw2z46Tbg>0A@#3A)Ld73TaMN5%l=<| z$0d_i6ZuGnKX}pn?q-3Mo96qz@5>G;(GC1*^>=8DiTa!hYc-|S8U9oP1MjJHN4?+Z zEvCe%s=9QT(eSPIVbinPBy@Z{HkRmrBP2;=}fyuD~mZWT%c2h?#eS` zo`RW~?AQ1Jnpqq`KOrv(s$z(cO_DVTJw<3~ip(Q7!Z<)I#Hg6&C+M`aAtJ8_h-x3O z_z|%$;IEWdg`%g350N{T2vMbm*tJ$v({ zH_mbx-jnzI0sanuhghAk3@&r1p02K{{_5+h`tj@AcK`!e)DcFPhHf1J7*a%}=+V%t zLq(qy{Tc>z)S{~vQJmFr4(H|eLI{I8E@DWkFX_09D{>ptF^myua8-(H(tcFxMm1d5 zaD$h5(j1Slpy4sc z6FlX3hUXk6G8|cXNoWTML&F{iQ<)W!br}xrsdlN5eEm&VLh{wNEZp6k6Lzue5}Crx z(}@wO`dEdi?_ijr-S0D1c70CmJ}3W)^xB5-M>q*Waa^-R*nR1w-Z-ux6ao3#E&l;h z&2@i3Dv@e|Q6VLWEVodt4u<9(Z2p?re`%$TsAwv9oO#QAL6`r7y2vAXy+WBF??IcU z8r&w2vfYK|Q!{8qX_S*G{VOU_5h8BmZ(P|DK_jw272I5TP)gFzCvo<=WVuw+im?!v z9M(F*O$vKiLJk_0w^hwzQP|XLM~t!UxAdi6Elq-|WOD^apabnR7UUNIldVDWIPE%U zWwa_i8(?4Qhv5WCIWa(kB8U)m{7EtkRLp-?G{A>V1kyb<=hY3=BzrvsCrBuhn^4nz z8_;6GaL_|&6Se6L=rLs-2R!ifkQVriJ1ts+{sn_!#Y0_84XaJ{9u9tjx`w`WG*r|c z8vDblhb9k)!b**Y=C!TwVWma;=%HnPZEL;HLuwmrn-Xd=YNzzJs~<tby~QBj(Xe}uA@Ty{$#9yo?xgUl<& literal 0 HcmV?d00001 diff --git a/examples/Put.class b/examples/Put.class new file mode 100644 index 0000000000000000000000000000000000000000..43b1e70341208fcacc74bd7a284c56d66ae3f921 GIT binary patch literal 1305 zcmaJ=*-{fh6g|y^^kf``00|B3iWoPqQ-Kn=62t6x4!3gfBO3VBY-g!H0;DM$B2dwBsoUqI;J5c zm6QgKgBlLuutbhX^=O3DV;aUWA;ocy6B@cOEX7F`lX5-PNxA7$zDVt~iZdF{;+%@} zQlFA>(=y?VOgO`Ff#V`W_>}G1{uu_vOk8IOO;<{Sp(|^f0691mTNl7g2R_i{M5SF7OjSRz3Tiin3|INw3EJs$y9OiW_ zU{S{vT-A}o62~geENaL~; zw;6Q96UB;K@(jy2IPU1Ui+j}cY%?%LMjiK&k<~8iuw+SvIAG}BD7;Wu6Gei0H=th} z(izNu^UPO;KW{liYM+^Ccaamywz1Tl&~K%4Pdr~ZG>2lnRuitjWIJNcE|+buc@K!` z5V2lj=rot75@}i=)ohGq~tv!SfXe{s^r!7ukgGxMKhTQ+E)v-}6tkz+lU9cMBLB0%*k zt=mmdv0U*4c3}s-TKRQ=$$Lz4H)%t(GFm%_8(?o}!?1^BxCJ7Dz1T+~*&Z2D~B6Uvg-)tM*?&<5T08H&yO^q&c8!sA`~_7K|L8(#?|CNIDnQP=g+WXbRew6 zcz{hYHOB9ct8bxq?+LK^#kbEC6%UDt2tfh1kX%PszJczT8X(%!6QDO9=|i6rAl}nY zT1<^9U&>Fl7Wxibo0b8x1lSf}Fd1O`Xn>)Orl!zM$B$4G8v02Z*i6lJAxU@&QB0x- oGw8)E`slUw)2kRj3ES`-+wqc^dPN-Wrwkz?=K%dC?K_b84vTaoE&u=k literal 0 HcmV?d00001 diff --git a/examples/Query.class b/examples/Query.class new file mode 100644 index 0000000000000000000000000000000000000000..01127902eeeddc354dcf26ba0f34fa2aab2d6296 GIT binary patch literal 796 zcmZuv*>2N76g`v8i8C~%Z9-WJ6lihM5JTA>3P`jnPiX;#MHNquJ&C6B64_(ad=@;U z2qa#S_zQjnxI;ukLu}2xGk5Mecbo4&KYs<#!b1~hux#QyE@*MFgiBa4aM?s2%SBw# z`l=SICa&SS_PJqT&A>WC;gJlbdcu&k>TeiwJCP?CDs35x{WR!`_?6T3$&w2k88XzY zckM&xy<_`M*ta_>mSKNO1I^tdR}7Sl!oba?GJ(z~ZQ* z!Lfm+fm@u4u!(${c{}a(M9ffj9p4w;z7vSY9Jg_YV^ag~a@@mxjt6KmDUM!M?q0|>@d#K|utXnfGZBJvis98N3Cu-*;MTRA- z{y+9qW}RW8L_l4SQp&G7_Lh2BJ>!VvvZjm#JF9AE2?Nbn!lx= zW@a!3I*v~RtnbYW-S&d!_nc0WE}-vRW|bx=gZM$>_TmJTa6+BQ0b;-OSBKO&g!&Nab0N$v!p z=1V0mrg13JVGvHZV#R?}gpPabkAug+n*?g)4f0f~(Sas9r%#c1$Yr838>@UCB-1n! zXHt`^S3(7`7$$wqt-wZ!&=^PZKJ&6T^agRL8}-Fn1?$)#lzu3L`aCMKeFr}+bHlC>1BYlKaNX$+Tu){3%wcWnE}6yV{u+IxuuK>Q*`Sw yESQ`(-(cMI%>5Zme-14T&v*A;U@ayzxf?80W~mPIyF9nb6^kb?^R6*AQ2zqjFuwT36#fPlW?8pfT0yNv=}lo#*5W@)NQ}{h1gpuKCXK&#af(aWh3w8Y^>uuM z`lA?|^Z|S*;~6TFT6eND=X~>>`~3X%;}Sp%&kdNklfzxy)3I*gJ~lY21~PcS@z4NA z&A=wM6tc~+!?DYd?f9WDyA0`iP12L8UB#b#8k?u^AXdvGB%6P>Q@}-nf+)}nCR*>g-Y@&_^ z!)6k@L-C@v;M6*C;3d(xTkCulrzh^X%VC*l;t4}(H1LmOn+UcOc*?nQMi(15E_&fK zk(8it1I2mD(K2DRFTHi&2s(!&8!gqZ=v%pmzH_;LMeuVg6mT^iUp}^Iye3G8a*07 zd^G^yOQeWtn)P1eklw;AdNJxtfjG$1ULdVXC!;fC&A`q`pwem2&cQTtC}EXM6!jPy zEud{(X1>DwhSX~M9NO6hGDlXrJwvvC0e;k+L4Rv$?PBpea@}V29LCb`7WBFIEWOY? d$puPlof6wtqa|&RqOTD{qxiS!FO!@?`*H3)_spI5ua`FfT{P3!MoB|CjRY#v?5R|s^Z6mOeGOF&HHNJ-5s0|Q zkThCD2IV3gafYlV0)DgbT|OT;?u-z{cSOKYG48FY^XQl}CzzOaJQu;_R1(vdPac1W zMHoaH4k)+7#oXgpLXvfx#{=Q>uB7TnBg2rNdSV=zk?)$e@5(+|IMh+ck&a_D7_=W6 zLvEva>rS~BGZZ(_uQWs1`2Ts?36Cu&im$_w7z;jH@7t$EqrbRf^jkwTk)jWjCjnXp z8L~QMb@Gh7+FpS@Q^2r8c54kPMA=1_D6+K&6$<&rN9v6#k~SS(XLLr6>YI5p|2TYw?0|6KU`V!AnwNg8tfWr#MY_x7nQ3&z$dkv%mlR`~{$dEfZsy<+yDkfjJZN$ZKn1fUG+lizYZ` z4cyiGo)-5F*aiv)mbCZ4L=g`;N*oSDW?cqSZ89Y7!Uu*_C9DgEkv$oRw;jJGqJ6j4 zqDabjWxz0Lf7)xhUtFi<28T{nMKU;C(~aiNktfgLg^tXEv` zv)C80D(QX;W^=rCVC(0bl79Qh?g{OFCVFk}=^8aJEJB@~j2w7c~ zH!QrssupVu>0(_iZ!oZVf^jr211}P8Oee2ngJaXeOOzR`i-Q5QtoVnhc%y#I+*Eh3iu`pLJeuV*( zbmJ6>gQev136iV)2U1&8Jk>>d)gXKOg1wUdj?5|e!3m79fiBGaoakb3%p!9#o$uL0 z{jhd@of{^W B%fkQw literal 0 HcmV?d00001 diff --git a/examples/SidCrawler.class b/examples/SidCrawler.class new file mode 100644 index 0000000000000000000000000000000000000000..ba712c5bb68b92891f7c88d749a1c6830f02c121 GIT binary patch literal 1932 zcmb7F+fy5L6#kZ6Hd&T(DWQa0DXldGN?K}Zo1|z1RHINRp;e&TZjvP|quAdLm<9SR_1HQ1BGbWPC26Au-2gIVQoA)3zq{qO~eP zic3(6rjfT2MJ=UEa0cRo&$vw#(!4cK8+rY4IhWMU1udDS#2q#AhBZzQ%hWb>vqagY z!1P+mSSf`{xnwAjOFlBPdc=lNrnXXaWEAox8D9`Krx|$(9f9TPHElx+Wwm@Jl(6VO z6B%Tfi^PqlvNacufCxoN6v}2w7oZF%VWcNaZ8NKzBLYFi6%5E&Qn8HZGQL#t6<(+q z#Hfm^xTfMIsPi7Kt4JcHA`OCcyz4twURlvivNP1LVg(r)t11kv3H@~yS>#j%F(l!l zZD|xj@!6Bigavbw!YT?Vs(6Lx5(dg8Eu)9~>*4lC$xhkKj`v5?g8Ok9riv0Qk>N>F zBJ}GLTF>z*9@Zs{^#8A)jIxRiY)WXU=RBKS(^GWYXN&T>6`IkqD+M#Br=QMGpX7C% ztzDy2(o;x@?UJSEBsdCX;`ypIB|CF=Ls_P-9+7 zD04}4$RJzfTvJJC%;;7^PnBuBP3XYV8NG)SQ*4)i3L=IY#9T55g4w1>B|md#nN?Tj6|$p&w&vk}i*dPX$8r>Jp?dHs)I`44fr zTcTD@)+)w1?BYKh(11=clRQC8AXgVWVge!Iecm3x$rIr3+JkiTBRpb@ z?4g0XqpJePE*~WXxVBLhXrlQAuFV8);hh6gg9_4F10_muAI@O+uW;3EFTlZySE!F+0(S^L#`@l6eebhQVTK%`o2czrw8~A^>J|g3w$Byr;^%GatKjm_km`VL N`$^$?n+gs1;9sHyplkpD literal 0 HcmV?d00001 diff --git a/examples/SlowRead.class b/examples/SlowRead.class new file mode 100644 index 0000000000000000000000000000000000000000..8e87e1049bc132057064f636aeeb3928554ef3d4 GIT binary patch literal 680 zcmZuu%Wl&^6g?B$nZ|Y7K%4St4U|XfJcywZm7u5#5J*7*s=7j|y1{maGLavV?NIm` zwya^1B0ziqf5DFcchr_piLrcV=FGk4o;ma5*O%`AI#@Gd;T*?#6D3?w;bH|#ST1C`iKhNFTwg&(V&8y4zVO|P{U?9SRVSWPr)yGhC{(lFZI`Tc2fj}>p6 zbUO_b-9aV`GJz9qx2wGRN9fM$?19RlVbS@L*X>eQ)C$Q?rNVu2#4E29;8 JMe7n4{{V*vh@$`i literal 0 HcmV?d00001 diff --git a/examples/SlowWrite.class b/examples/SlowWrite.class new file mode 100644 index 0000000000000000000000000000000000000000..84a1cff484d7700e25d019e2dce9178aade0620c GIT binary patch literal 820 zcmZ`%U2hUW6g|VTEG#Rn6zWF-TR#`5Q0r%n*3{6p#;o3z^2N#@==cg~q}=gxfp`Slxs3bu4CprGN3jtG`DtZ2BZLq#Eu zYtmnr=7uykbwsf&%`J&FRpQgA4|Eh!lBu$WRSmZpVw<*Wizf_|K}p!uH%iLxt8&Z!+%k z=e8uLnvQqyW^4;ykz@lIWEt|quH6f&!KhPhjye*#I}!dw(5c)SNl=wx{-he!a57b& z^m=^Epbog>cm~#RN1Am5cX7|aeLOJm5RWu$7I+#{MJ~BybUzh$5ka{+>eq=?sxpNm-vlX((Gc^&{5GGelc6sI4htX)Q!N7a|ct zpCTE;2yrfh)ECTuh_Fw;ew0I;KUOM0qcb%mNh=MV9yN&#ino!%4(4!~cB53y63raN H5#)aZo}IER literal 0 HcmV?d00001 diff --git a/examples/SmbCrawler.class b/examples/SmbCrawler.class new file mode 100644 index 0000000000000000000000000000000000000000..efdb5e3d1189da5fb1bd03d7f2bd3cae5464a4a0 GIT binary patch literal 1468 zcmaJ>OLyB;5dLl~TehO6v0LYXLoqE6TZv;xAwV1oBx%9Lc~GYTr@Ula2@1AsB&DSL zF4%R+q36&Ao2=L_YWv>^h@wDb-ga#Nl7NyaW;eJkw(6F^>5}bO zE4$6A<*u961~pONHE&w3M{zV$+Ns%FUfyd~^W|psirugZU2pC3UX9px%kflPAzIV4 z9f6U|jna;J)66$aXFFf^UEA3%WH(fND4>;FyKc>r7z|6aMc4ekVY$=NLC5p>NJk12 zI*Pce;$s~pEE71*pNbV7t5{=zr_mR7x3(--$0xYPI@3}p>sZHiDQ)QZ6rbs+U`@xS z)V+xF0%y7)b}L_8eOv~e=XBh_=PJI?@g=^J2|vzJrgu&t-p7V~!L)`?(ps(VST$eZ zTvz2-ety|(Y_;5`Rlk0%)DthrqDxedHk6Ugi8XA`mrQw*(=18tYr_*k%eOq=Y6^r} zy9}KSdcXqL*Z`kxu*_zmr|urLK)5Z9=*4FDw~m8jw%e9d7ntfb2+AyE`+S0iFxnI5 z|Bb@4%_G(xYi7MX#k9FT+>bLr)({SO5S3 literal 0 HcmV?d00001 diff --git a/examples/SmbShell.class b/examples/SmbShell.class new file mode 100644 index 0000000000000000000000000000000000000000..b9096fac954c71d971b4356c1bcb2b86bb6a73e4 GIT binary patch literal 4776 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 literal 0 HcmV?d00001 diff --git a/examples/SmbTableFileRecord.class b/examples/SmbTableFileRecord.class new file mode 100644 index 0000000000000000000000000000000000000000..b5d68ff5a3f77908b2ac677eace17e10bfd0ad09 GIT binary patch literal 345 zcmZWk%SyvQ6g{_jX{`34)s+i()kX6G6*rrC7whO z#m${_&*Ki~Jhu1IRg!7d2zE1N?&_#6l8A|)pWOrWSQ20_xbTP^BA(`4 oV!Z literal 0 HcmV?d00001 diff --git a/examples/T2Crawler$CrawlerThread.class b/examples/T2Crawler$CrawlerThread.class new file mode 100644 index 0000000000000000000000000000000000000000..0b40e5c09c71acea9cbb8349b52233d2a2d69853 GIT binary patch literal 1328 zcmZux-%}G;6#i}!Sa-Ps3IT14)i$lk5{SiLEg)JEN;E2%Xv80#*(BR$A-iFAH@3X@ zk7)bQhrTd<)G=|UopJiy7a#inlzw+Z1679M+2@;lN_0{aHur46-0{vm#2~y_- z2KEyXq8GQlux^J=m5_PIbHW9I%jpA{Lo)B*9-xxXJYc1Z%^JB6u{`@u%dOac$*MGX z68BpkZCZhhVzcE}ZADUGuvgZ!Qb!_%jKmpyBr$Ys@?nxA}Lh+&}8kYBMZt43fC3BjdL`m_ukBkOV z9`CVC?KPoP_id{taP%#Ict6>Hkdgi1UgxNVRbzNE-5rYP^}Ce~yBf}A9tmhpu;gxq z+mUAU`+eJOKBHdAbUyQL2pg$pOi9XF8B1p#AJR5~1LTU^L1?>7-)wO-liid~Gq>tH zURVrSoXhd(O7s6?lG{?C1{-=Ped;yf1UDR?#Wa1EFcjg7p;g^1`Bs%x2x9b}EI7?? zE6IU!p(TfmSxB+Bjk+6K&|v87Xj<_7pVQS?HL`Q7N|wbp9C7?o5mNS2?o7^-k}3E0Gr?mAn*iyO)s}Dx*V6Ug=1i*8&@rB~A5M zAk&HmW2589!!uiSh`>QbU~7Rach#93595SJ z?o#ZvqevyKk(^A_L}2qj{(b*cg@(gjNX>^oPIP3tMuuN{i42L!MzPVKF3DTCpu`h* z`598Y*fgVib^>rZ#z2O*k4^6HGI}xB0o%2o5ViU>QnmCo((~ntdBJM1GR?I}?jGYJ zV;@^f1e;wY>=Ls|DBTiD*vB@4Tf#BvDG~~`lOITD2G*a!H~6&~GT)Kw)MvO?n91_l?I#>oJ3~+F*mQCPzGCLk}oV P5qQ97p2ayH?GxZ1A<28) literal 0 HcmV?d00001 diff --git a/examples/T2Crawler.class b/examples/T2Crawler.class new file mode 100644 index 0000000000000000000000000000000000000000..4176b41fa421024452f436fb9435a32dd0139b4e GIT binary patch literal 1540 zcmZuxU2_vv7=BK($tKIv(AK0zS_xVqS)|d3ph+o83KFSMNTme4*(AsI)a)kiZlLvR z{OF*g7u>=ydcjSZVY~oll8&9}jW_Ba@ZSjUNis=`z1ef#_dM_Oe(yj3{jmjL64y1v za7e{r4FgE1NNP}ENa08buj8mjn3NRXke@f@Yg)xy8gv|!pSM*U*AT`D`TUMFc{hlR zw90BEOsP1jVH&42MDd=A_Zjx)9P?(CJM&8pH!BQ!-nO}utD3IMU4~GBTV{Q!=5U6< zl(2<2%`lpnT{dr+sj6u&rV5@T?8R(8pS;4L%J&~jOP>ZV+)lqy&yiIfjH zhLIk8q8GY+n$d9vXH|Tl;~erTKGbm@vpPP)1sxaVXHN2t_RV(`Mp9hTaam$U`pNgQ z(ow)^9rKdtW8@jmPsAlGesrcC>15rh)w$yd?w+)SS*>!LRP}hzU3{t{oay+K-LT?b zyB97=6{^|Nv@oNfvYL@yx+V4D#B7f% z+wNYdDqK(2l6n+PB&j>k7dgAbPhr*dxJ7_3tGU$|RrUTZU zp`gR%LHS=CibnVZ2jrOKK0=)$=^;>MFl4phD2vhN2 z!K3)kC mexz)E!Z3cO41U?>X#f+17{F`TPvV#{6g?x2HPWa7V-VOFFd`(#WAFmT3pNHU;ULE>L56^{Y8e|j@(3iEC1l?h z$Ocpjs#2x5yzr8$NL1w^mAvMoQaQIJj4=;7=k)DG=ia&9|Ni&qUjTY>-^L4=3L%P@ z1x^Yi1*QdF5ttD;C2(5cjKEoeS8bd_N?=ytyuby4*90yKToRZQcwOKPfj0%-5_ntS z9f7n!Mj$JY6L1CQEnK$oE(#Ww4EW{;3>b4F4p2;rI7pEcF-VaTaY$f@qqvA+ff0_T zMT}BR8Su{!^iw6Y;+btTi|K3WzCzkt=u1^fd2eCNKwv!YF7ju7M3R zdCxt)yp(ZEv*}EMk*?U>WHObEC#RWU0QcD@VZz^AK$7IqzaU<(q zspN}Z*@DN#Ik&Mm;9gx$7s>`Au~o;O$t=3r%2+q6V5f@9rK~F_anY<>uAEDIx#H6C zY}PH8dnF}>5sWJA!HWtnVXs0A-3ktR6!wYQk6wj7QT-TDIDmr+gE*uxgkcLsg)6wK zP(oRuBCsrQP2f6iDBQ$*3b*jS!Uywb?8uo9&l6J0$}NzZdj@j|*>c3H7|3X|ZMZd+a0bIpxg z7PI;Ja$k8V)5qzRLK{%4S95s1l&`px#bUut^Anh{Ir%c7M)YQd^+eKJ3C|S01=%+JblX&+nC840o03>q??@DvbrYGfgajMMoS$WnKJ(R^ zO{w>l+;ncmDtnWi5Y#bklmXt0RtcQ<%J~J)%}qX;;5`Y+MAJW)^1^Ify|g)_&ub*c zMXatRi*$B+s*xP0c&YS>&D0p7b6XZaNsJ+0GreD@wK>+ks+(6XTkF~eU=C~VB;TAU zpDQ5DA6uFT>1xevY|ZR#&1`SY>~PI&a?R{>&1`ke>~_s;cybF2xiQ4U97V~7M4iVl zey1=nMzrB0Zia~nBO@3m%JSRrV?8+`%bm^|e9rb7{LYRVOebR2cuu6HhJX_Z)L=Og ztA?PnC0Ikq*=pBdJMG~b!cND!8r0K&8^SuC+0K9KKnUCT51rVA?Huhu7k07?T}*iw z(~2^M-8jM$#aSMMYJyJ1*{^gao-g${f52DAI$?hu>xIoGx74vg#(^eVb+pPjSjR@; zP#tZ;b{(69!*y&HR&_+4+C2cpKiZ2RpPE+Iyq&MjE*gyS!RhCFGs5q2j8D!lN%Et#kQ literal 0 HcmV?d00001 diff --git a/examples/TestRandomAccess.class b/examples/TestRandomAccess.class new file mode 100644 index 0000000000000000000000000000000000000000..5fdf0df9107f3751a4db7fa389686693f6abec6d GIT binary patch literal 1885 zcmaJ?%~u;$6#qRk`CyzDk`h`9l>w_J;Ufa2RszUZ(O^ump;VxLOp=#mAejj>6H?vi z#-+>dT(oXH$6b3g@yIzG-FS{J^j~n}!o4dO9`8#IB@O6X+?RLf-rxOrzjyP?Ki?k# z7)Mn`2-BUoj#quSA>%d7$cSOqi#eCyKRoRA(;B8F&HeH770<%g>XcYM%**iLbuSit zSd`I)B_Wmt(25r~W%OX$hgGq^A;gxv1GTw;4RMx}iJs46aaklR;WGvz(zT zp&L9|DW$o!p{0wYkxH6wF!Y9Y61&=g7A?fy2I6~?i5t2CCl&6hrPI`;61$W#Rm#LgvQX{j(WAVC+bFlt9Hf8 zX&J8SwrZD5li-T_9#`|CQzF$g^)6LPH~P^mtHY{_4;ckna0NM0MQ?j|mMXa%w;0Yj zR>jC@4$rENsVc~$AcU@97kdo;-He{Iqjo7Br62-dKo^B5DKKC%crCN4XJ^Q_jC}@X zDX@e-U`>qk{fbt!L#j2YhSfPTvEc~#ih=`-GIY1sPpXqlZ>4v6#$mW{qI!Cr&lsjY zvK?L`vT%z^3O1>ro6&XRfkSNIS}Ar6^Q@ZEFAJk0kti5Cn?wGS@NvW8dC@jsS+i_T z$NzAPGYp2dm*T1Ta(r!da839jQ#^Zv>oi=w8+{ilxB7JC0s9a`+!h5uGnH%(i zM$bSCpMq=NJ9VQ!6#t*EKF4gnB8HyOX*=?tJtJJ=ge^&@SXw8FR_S#wR-6Ji9Gz%J z4>8uLN7UXDXNsoHF@%?Cri#@8Mx-AlIYy@;+8OQcNFD4k{a`eI0h!DI7bLjRi6~y7 zGnumoH22)JUx^&Kzl8Dx9RXJj(&LCU`5oMIhwyAk-GT0FG@kuaD}L$6fVT&}fZT)U z0_W;DpB(T!#KIxEwj!>{K)1_}PwVg}B5vV+T^b2WpVbg}f(wV}*{UNL=&j*mP^#fl z4Sf{oD?A#I9%AJXmjwco>gb=51YVyM=x(45Bu2(+xYC00JYkG|gTWS*oyd`=HUHy` z)Z>gqC3OtVNPSW>xo+EZqU@6gN7v1^d&>HG>ebH@d*vN&uOfDfdU>u#}C-UPblJ7l<*r&{7$3kPwe9_ nnoNJgW|wfl22jNWMUm+0Ch3}{=ywOMAws)MIuG4^7@hwD&9l>; literal 0 HcmV?d00001 diff --git a/examples/TestSmbURL.class b/examples/TestSmbURL.class new file mode 100644 index 0000000000000000000000000000000000000000..d73dd32109fdd266a18d48408d6ee058fc5ce8ed GIT binary patch literal 4023 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 b++kygvnkwV4-sLHsnW@5GpY?b?K}Sgu#l8% literal 0 HcmV?d00001 diff --git a/examples/ThreadedNbtQuery$QThread.class b/examples/ThreadedNbtQuery$QThread.class new file mode 100644 index 0000000000000000000000000000000000000000..1259b6d9a113331270ab8fbd7ba417e24fd6b023 GIT binary patch literal 985 zcmZ`&ZBNrs7(E>u?P_IXFdT|H5oK(+`Hl`mVG(0oh-8b#kKKB~;?^$hopJxbf8uA1 z4x))az#nBir2=8YH21mpKCkCF&+YF&KYjryVqM2LX5vWVvQBX&j;qM3xTYh9nLsle zoUUt_3-%j2Zem_X4htIcDhfKru&AP_;*Nr-W448YRCU+8jds}!09%9MBBRp0RFK2yedQw;h z%2-mdY+wax6;BMT;wif*XD!!Z?TM3Q&p$OqN7}Aq;8{>_O+jW5+1ysBQJ@~5jF*lh zyh_XTec>xeo@6}ojrDBNvQC+5Jzt78>2SM}41`qLZs|2?mLyx4ZIZ3-2)TJUi^<%= zFx~9K>~w^~)Qe|LV<;kIiitJph7&zv;B;wL?gT(u99U+zX>a=_N63cl`X$b2&9Xe< zv(-4^t@lEJ#j^qYCzcQrhZSnlY<{SFW|Ol>4zi6b-|aY`x5CATKpEkhM4Fl@p7Oj0 z8a=-cC13cC$R2MBE>MnPgi=Ekaeg|r8BG6+`%GI9S3SVUS44jz_HG}e`99P>v{am; z5513b`EQ6Ez<4|CbN<-p3$$vXkHj8x0~Ktra)@A-)k7Q!{)|b?vzH3dZ?Kma?B*5w Uh~Of9BDjRx+yj(J+(HT3UsNIClK=n! literal 0 HcmV?d00001 diff --git a/examples/ThreadedNbtQuery.class b/examples/ThreadedNbtQuery.class new file mode 100644 index 0000000000000000000000000000000000000000..0d21e06d432f3c9789b79273e15c32b6966e3133 GIT binary patch literal 719 zcmZuuO-~b16g{t<>9pfi5NzdRfGP4(hGa@unV@VC5|aicB_@V+@!Gz?kj@)2^J-+T ze}s)|SU{q&Kfs^j&Oe~u2S}xH7Wck;=G@Qo{nwX1fB-8t3Md!w1QU5o+L*$$1=og& z8Es}Q%vtaltiAoCMDPxS^GZsQY;}2>ij*PuJd~l@WXM)m-ZB_laYrzW)I%wDdr?ay z`@Gd9#E5t(8Oqgz`Z0gcYh5l6YYmlz@^C{Z+S?!6;zWh9Of6I>Zp6K$Ep|ekT)Js4 zI=d~k*AvNUpldjAP_!`b;3*aut}$1VOXew6N%43Cj!?1u|pVOBm;V{~OGD_J!;B&rn`zA;uv7du>0Ul7%Nh&@?ZKi32S(Gq`8F=u?uVEg~NYYL6FR_R*VjDE-IF0p~-Wg)+ M3N~RTZE7R`2klg!EdT%j literal 0 HcmV?d00001 diff --git a/examples/ThreadedSmbCrawler$DirEntry.class b/examples/ThreadedSmbCrawler$DirEntry.class new file mode 100644 index 0000000000000000000000000000000000000000..f849d9333078bf17b127329a034dcf574826e198 GIT binary patch literal 502 zcmZut%TB^j5Iw`IP^(};Q4yakuo&vnMB@fEAtAbexNqszUQ&v=EgC+{1u=2q2l!FO zDH|8CxMv>soSBpP`ThC^(8i&T94ZB5v6aAf0#yyW8ukfkPbxyWHyX<4$d1OY-5AxFA$|178Wp6CM*g%6SijVs4>73u9lza>(3k8Or#E&}yzC zuh`W+dm>~y6HgF|JsFCJ>DU!&;J5*I^!{Y3h9YrAs4lN>kDNEhzy|6D)?gUWkT+0( zuHk@CTNX5KrMe4aH6!HzQ==P(LUjTsibO;xB~$Id3193-cO-@}AFG-8G?xeBh;N$X zYp40~c19!y7|p~I2av9b&0b}q>$lQu|7doYmSt4K1bTB&yo4yK4Fv5TyTzg Z-U(|@QAUGxCjX>3uW{6wnZ*wFfIn)YYTy6> literal 0 HcmV?d00001 diff --git a/examples/ThreadedSmbCrawler$SmbCrawlerThread.class b/examples/ThreadedSmbCrawler$SmbCrawlerThread.class new file mode 100644 index 0000000000000000000000000000000000000000..a95e9889a839633e48c36eba7eae1c8252aaba18 GIT binary patch literal 2087 zcmaJ@OK%fb6#lMXW19(q5EIO!q&ylYF*rP$mH?rU1QOyTfI}WUTE_MynZzEaGh;%! zV!@)@vV*S5#!`1sFjbL~ib$2(6@Q@XuDYmHiA_cN-Em$eR!8!jd(S!dJKwqI+&lj5 z-A@Yuj^e8@K13pfMzkq77KXPnIUd3ZoDAb*w9C;aeme6}-h}ZfPDy=-g3}??pi{oi zh4C5AOV0}uqAQ4QDSJY=h)Z(R8%7^4ORxSg{gV=5Kw=Fl7z$%At|+(~#s^YfQ!p&x zvC{&(lGEB;HnKyZDi_L-(`b>%eM)@>DO+)|N2R)MZ!0+TAHq{hHBGi~IfVg@+{ zc@-uKax$ynOBEKl*pXbCP*iajb1Lp3F0jK*#3&^ChI;O0^jXI!m@4MiO>T+SOace1 zFki1v#VD|?ifVn!R=w&rV+kl(!%7;q!%eO#QK^yv}whg z(fwI&(-eb{C^s-UoiQftgq=?(n6zvm`fT5%6bR+WUfRiIXRP^V)rG;lcCWjFAF_2P zshg8BmXBN{H*I!SH?soq*al{m19W;L+4s)WhNM&Twxj3CUbo0TQh{Opuka8$T&8Pz z^8XM1O6LEAzt%+?P*{&yiJ9Xmi)^I33del57&cp-MJUL&Z>@TWt8A0I7hWyPji`#u z+6T;nV@wdV)+Ld0w9L$~rDb$ph>g4%0S|vXt$f$XGYx@{IIifM5aYa=vtzvDq-Uh% zB}7Z>3wT;y!8`sEz8CO6r9q&D@38CCgb)`o5yUIYJw+(AL5#ONhvzv0;{&f(MrA0E zu=g2)j}eG3Jzde(BUHwg((>;sb8i{y&!|bZKF8L_2*#I6%Rh3B@6HeI1i``h(vd}4 zYs=U+P+7EHI%hk*?Y{Ugcogx)7oOlDO@4yadE5OF|Gp>KAr*By%BUZG;1{LkKjRVK z@ecnpCQ3upU&hWd8l>Fy2;CLnz<5VsmHsQ#xH(1rGMX>@645etkFGeDu_qc>Dq%~9 zLK#&SO9*$ksQVuH7|mD%^u3npWSLIX=Pr;k8eA;Bdy`ys8d&pT{saoem!hG?)-v{& z-hGd)+~EBfV-XtB>&kvycjXu_Ua9{Tf8#CXTm0k7`&bqp>=nDkVG(0-V&aIDeD;eI z{8SOgmHnbkO3^8LML+%e#gLRMC4cPpOBtZ)X!~u+oHryt=F>w;(q7yg7McfqEa7&CZng>V7)5E_3XDRDAsv*NO95+&?fPVq1 Ch4!BS literal 0 HcmV?d00001 diff --git a/examples/ThreadedSmbCrawler.class b/examples/ThreadedSmbCrawler.class new file mode 100644 index 0000000000000000000000000000000000000000..e0747bfca524f037270da760ebfedae290f289e6 GIT binary patch literal 1909 zcmZ`)TUQ%Z6#j->CX8b#;id#?YD*2F5=E=E!PXY222-d8Thn@*B!@5|Gl?^k0_}@- zdHElG@yQ1-1ePrO1N;#_``~X-zcWJ#G?=w=_L;rU-upY>-h1Yce|~!mU>XlJOyEi{ zM(~bYuBx~u<(!In4bi}|pyIlUcQt5uPeU(q(z2-GedJZ#(9nk^4Ph+H75>Cks|- z&M`LX!dY2!gi%qT=WJUzb9KXYg{vSoZ#oOM=WHoBvC(kWO}iSLq)o{wP%EaBH(gJ` zaK2{TGcqmDtY`A3y)G(JpJfQk*qj$lZ%u(_x2ywq)$>y_(7@fmw{F1;iUUfWz5)YxxSy64peA`M$0LS>!u7m62KFc4s+A;-a1~ztd5tF)>-^C zsrA`7bR!)ZyrN+6IF@uw;k<%Gckr_v{`+fXbJfkbRw={e5{^t-kqdXLsH#}gVdA2K zGsgt#01k}Oucl*N!mi830%@6Uxkgo7N_GcGveLe#}@AEn0$)l zB)$H`(|eNfU;}=?Lz5 zRLya0%0qQ}hsCBTW2JoL{T)_vwkN8R@mSMvT*1euuJmLUINedB*%UVKeEvB8x~4Ly zCBY?9i>HHq)O`pK30{I)+{KBjq1glz zg&rYE5lQT!uSjGk3;xqg8~xuX$`Akkd2lTL#1Qule=|l>{K#klqI1LnPF)xd(YP4n zd`)ma#UZ(X4P2(2$NfXddhr&q2IM^8H>QXF%jw6_N9g+*1M$H&hQhlT-or>S9hymp zXLj*iIwIE{JfG*0J&cmEM0~7`@u@aW4dMl>jnnZL`P{}C`gaH$Wdh(Uu3r=0L&Whd ztN0z3@cki3F=R2z3(0zoQ_5c?^b5{*0!4jwf@t5Sv4{71i89Vz9~c2VpMG! zg^SjW6=ZESU)(m;JdG#R zI0X#SUG&fqF#2dqNVd>NOGBC~^qPgIuIW#F0eg9ZmeCqKVK0dqT2J6hjDCW2OhDQc zk{twhFRG2)71CbCz*(qo@Yb!x5AdG_OVki>;>m8j8rnRmzEJQzhEJhH&|W+|MKJLZ zlJ^v$7f0}~kJS)<$Jo)YAI(v^&Z7`ALxo0;O0ykJf+odgLd-s#< z#aHLUW;F5v{3yQp1=Mo~jzMgbbME=w^XH!5J@?1&uYCX}9;nc8DS^wl5=TbGRa{eW zU4@LS5IG?hRNTO#5H}SpDabP@8(Z&uZnYS+b=T$oYS#(^9x%in*{&T{7@~S%n?YLj zTAU$SwO#(K=QOy#Wi`5lNRDN@40HNUwPU@vN?prsmujJJyX_Sbs6O3m^4-w(+(3a& zcFpVgO}=J};Pjw4Z@qNwjUM;+O_4)G5-9}*4F-w~Cs=mUGwWIo&+eR+rfJsebp^LH z+=j_8KN+()Y*rL7HI$Ija7UC{)=4fk-LAvGCB(5SWNjSg>y46`HXw8JsS+I|pn zhxqe)Ax!lpzGsUx`g&m-IZV+Ii7x`WYotg{la(XQNXy1C*dZ+#W=N{! z21xYBkiaZ1kS*LlksT%d*67Oz&^{wF6Fq`-X!O5Bu0|hcjQ#=UikWYaUmKb7F=Dk3 z5%%%V&*4_Gm?1qn*1j!sgc!-`|Zuz>S4-bpMWjXXU9on|Ocmu%o6 ril~r&Lc>v|2eV1~745viGWm)=Xo{(Wi?ohlp7Mwe89kdRoJ0ICpwPp4 literal 0 HcmV?d00001 diff --git a/examples/Torture1.class b/examples/Torture1.class new file mode 100644 index 0000000000000000000000000000000000000000..72d5f777eb6ed9e5e3e098e7ba72333240edf417 GIT binary patch literal 3005 zcma)8X?GJ<7=DH}nMoK>LJNe=B8cf47THq31x3LUz*cGzg*2I#!6XxACP3YA-}fE& zea8hc5qge(@%TYM`b|H{NBs}#^UkDAO5!=5oZRKP_r3SM&-=Xh&d-0J{T@IM&W5oG z$q?3JXBYwOl47@t8>H@+Vj#@18$;NGK@B&BF@(JW->hMu)VFB3HH`f@pduB52|=5jP-a}ibte)G{oXD z6^|=uD%b@DbNUXYj-=v6*UZLu*;c`@UDI%S6$Ce$dDGpjAR22trG1Zr<}FsnP;fz? znKzQf+^}H}q=vIZ)U=f=q-?g@X`VJmoVb%4j`!z=x0+d_w*e%}g|9i5HVUq3rt#rya0zJmE#BR}dMtoOs8|AB%?h2EZwzT_((xZ?MTrv zY}xrdxR7$3qn4dfu&l~r(#_^}RR*psx(AKCYo=2YQQ`FC^Y-MzN916$YPWL^db(+? z#U{C@E~%qLJTA+9Lgh`&a_n?Z(as9YFuaXV6$IM4yEl`P&+xg5lRCb@>pH%a*ncHb z_!_4aOy6P^#s;jmjFtB!V>oWx7D_j3xN_b`xuIaL2b)%0gtjeTD7w_3k;-wo33r%V zI=;ba1=>JGhT__l^ncK@Z!>J^eXFA+o|L8d4rdfxSPlKo;X{<0g4tDQGCR1D>0CXb zM=v|}DhOpw#}$_xNs)HuNL}7BrA7@m=?62`UY|t@VvX}vE{PgRdg)fmZD#)ZP6T7u?)ttXk&~*Hq7Vig`KHibHP2tPG2FR~* zxR}b4f+>snZ1%R3reLa2F!GdbSEJqPDDjhz&TFnUxrd)xo)_DBHN>{pQ#oljojzA? z)-eUk|JSD6ZbO5Kb5^GgyN^ zunt?fN;5gWmi2YC@);c@qhTU{b)3eu$ovu(^m(m?Z0+z`i`YtzWARXDS9ci~B~%Y> zBT8b$Xo)lfUh`sU28I8~(x_U-vVaJ)=s&0vC4|%Ul>F{Aq;5gwbwRq*v4B+DROHn!t9`uI_kMUd3j&ZCX>MCPH zvb%%?|GnL(vGFHpQvFc%e>oEb47`S0(285>|9)JG0~AAwA{b^8rqN69tG*~a0qDz) Fe*p#1{rms` literal 0 HcmV?d00001 diff --git a/examples/Torture2.class b/examples/Torture2.class new file mode 100644 index 0000000000000000000000000000000000000000..e688b4fdf5889f72d13f241b8bd9351ed75e4239 GIT binary patch literal 3481 zcma)8X?q)26@EvStnqlfL|)=Jbs|$Yl@%|EL*2wqT#|Hiu-$-Fr%o3#md4Jwl13ek zN(^nGP@t@Z5(+6a0kfE;P*PIa)UCtX^6(e<1AO7>2R=i2kH(VaNCCXu^_+9xv%L4t zU;q8)27m$lMZ-xv7{rVQAI{Wa7!OG^tFbv7#KRhbctrLdmF6*NJ|@jM5isg7hj~KiUsMqQ$#J3dq=N&txpk-n)Zp~*0v#Ghk z>D1i4R?-|*;B##SwMVVA<&G)1Jup71TJnG~0-11mkupV>lG)}Z99}wP_t{24Je~L>AI_4=}UH@nJ zIrrVAOx67$exc)4{E{MRBUM#I$FK03g3hFwUU1J>KV%ud)^Sx%>M~pw$z0B@YAcA> zb^Hd`bi9Grg2?Mw#hQY>amO^M;aWF?@LPexL!zLql$qjwdch0c zn=HHVQw-la-l99jLI@wtICjQ#T+7UcC5&S_-o}Q4)?^ z8Sm(LSBkA6X3|+HiKOYWa+|jbC|0mbU#oCa7}As>O$p10KOS?8IF;+I?A^sOE3oe@ z@g%LRD^8G=?U7!xr-FgRxL~?dEDVMt(p$+d1(E8^z46KrSY;keFJ)abMI@#}3bc8K z8Pn4qaET{xqFN)9G1CbJebpSTK;tordb=ZME3uY#RoC_ySS0lJbLn#-d`aFZwN_RF zaBT``hNLE}~#O&acbqA})Z-%m6Ir3=F* zHwkt_+>5Ti?7i^2Rl}0z;$&-ASef;P3&ld6mu$A|eMCHyn zN5|nu4g0R>DwOCte6#ykQS%1;g>heD9JopW1*h1CC=O_B>(LAyx1a$Z=8B*DLHx-vdIWo4e_LQEkNQ>UBmSsNcKP#YcrKu(&7mE6gt$}BF4W?U>+)y~wQ(%c9Ou!V$4&}$aG_(n`mRd#jxu!_m()9{ z-gyQ4%TC{2roMTiAStQTQ-uq+yu3}T>wjqNq1K*@m$v!2w@hc#&pmmBi+;+ubZR&C zyRYD`GN2!*RPPS1;Z`meO%&%PGd(oZW3J)0R_wcYc^jHYrMaFmG%_xk>7|+8>SkD5 zHzu#Q%#4gZGb@Nrm3hNlie6u+p97lbpQM;GuS9(#zGI~lO=CC9u@jB#ThPVdJ^VHg z<1j~KxRur3gQu|%&*OHyg?#j=hGTvTyM#fnbEWr}<~?c1)? zRiIbgo>vzewq%*Ax}M+jL{)VCVonxlAdZBANyJoS4P3!h6*&WWTvKt~Kmj)toE~-Z zhuOeQBoxF)Th&*duo?=CzjH|XDFa2B;2#yr|HhE#xRY^u1?sj;)~2Lm$MU4s z5_Nx7DjpjkD!x^JUG=Owl?-=%%VWi%mMhO9BzA1MN^fSicu_Ro2SDMVu(UxA3PH~_ z|4an<0lIkr#ms&}V4o{iM>{#dMi3&02A$qBNDSjPhH=Rc2$~-eI7FzA@E#(iY#-`A zQ9zV=CWc%|ga?dKW{$HCX%nnKLlS4nC2M&{w5+ZipZ`jt;9AN&dXHo_^#$5$lb$#X99ZLMJe X>zp^SgvVGW8tk91g=2>Q0nGjeodCTk literal 0 HcmV?d00001 diff --git a/examples/TransactNamedPipe.class b/examples/TransactNamedPipe.class new file mode 100644 index 0000000000000000000000000000000000000000..faea61554bb7a4bbd15435ce8ab69057432b78b4 GIT binary patch literal 1439 zcmaJ>SyK~15dJ3FWS3=?5J?~+81V`T5Jf=^h#Z0h5zycf@u*EQq?SrHsm;dY$$#R5 z4?g%{l}9aA#?p6xl-NU%EG1>C(mgYMOn+bZ?62S7egGK3a}`k}WDF@7R^h>j7uea6 zkyPQwh>Qy=6rnGwP%$dRB_S>g^H>|kaYe>e6#*m^ToXDa#Ds!Lp|7i$!VMMEm{Bo{ zF$HrXA8q`&DOMz=aZ|>;j0Fb&q+uHN6oWT5_<%v0s}wjx$FgDam3leHt#v(Dq7$jC z8zw_Iwz0gWztEE<-7F?Ewq=;b2@$ByzsmEfZB)#fj9awNRO(iqFBl>?yl&}cP0!ma zdYKp2j4B@yNi>|o0K-5lVY*b}MZGj*73*bg+WR>f#&oM#OGPJZq$nqCR_iuZ&h;`wkK3|Zw_T?2R^HgG zCF#OsrkvZaT%=5ESi)@$%ebRq1*1OmI-3o9d&@|ZdZ`YKrxa4NmyeWvxDgakTS1p zHm5FmD|G@E+P`#-#%`~L6z|uoRT=??p+m6jRq7hoW=ANlHnd>iZ&Ef~&_^zR-{&**3%kljXS zFzDb|NOsT_4AII#*g<#1m+*?So`|3PBM1DCAL2jUbnhKU6vYSzFd9Jurxl!uAcV6l&b49; z=M`LtK*6Yri>xm(bD6Cx5sc%iiffEqS8;>&O%=CT-)4^q6?gbyQpFVOyDFwxCso{I zeP2b2^#c_%tSRFd9x6yHcqGtr)v_(`x*_kaF(UO-jrp_nMyG$-8my$AS7Hg zEL)%__AIq(yfqR9!_Fr%o@?3paSn`3uH|IOvmCpuV3wXUPQ}g1DT{-(`PtN*EPJCI zs^K^W6=XEbVUW05I$L@Pa$;_t#e#yz8lGU0O8#H(cEvQME6}d%x>4~~9M|&RUC}i> z#WM}hv83SzmK40y@Cx(3AGzwfNrz!S14|9)ic|I&&HjUy9Jhw%u*`|+CAeJeDjD7i z2bhfkZz|HQ9U|X|>bfgU_Fbu?m9nI!nGT~?4V7!2bZw(xI&P8C)w-{)munqn^fd|s z%2p!rlP*&J_Xnfi#4_-6P6`ht9jZD-t%OMOAhHz7q^g0*X zz|ozt+(Rb~rTU#4N7=8yrcC&0b1cC*uAlf!iU=_8MQhO9?F->WMRK(LJOmJ{_6ZfF@-e2NP zuj@t9N1lft;2-ecsPAl^lG>nqG4suLeCK<=oj?Bi{TRS9supIkXkiJ<7RKS^D7|Cg zT?+$PG_j)h_q64GEq!3&GOp<5Lw#H|aaHeYCa!7aM+UB2$m52An&a?J~dDh$X-){imwaw7w2~bGItvLQee2G0$EP{stmW?sz*)6 zQ&B81Q7j$SR6TMczv@){>W1>v(Q(;8fyJ1qZ3!TK~Bwo3UyH zk$_ccBwL$72J#Hom}~jW02$ZC|nIY@PL@Srw$-Ukmj4k#^V<80%&}!D-_g%n6M4 z+?Va)?XNnHuUyZQ!HT01v(|ZBV5(Pa&7|rGyxq-Gjy-?NjiR3#;r^{8{!Rw5s=2x| zBw@edv)4(aZIVctTAQ`K;`NN7x2rR%S8c-&@F2Kxew9E%>-dsH2| z7-t;Fxa|5Qf4n%~<3#obn#wqi4!E##m)b* z4yRcvv0M9oJ9KNryLw8!-V5|<^e?h@YV1kV|9dX@191Rm_+IF*AA+Yju5a;lj=SJK zu+WBhMuD@&HQP}lr-zcVc0EQ02KVqe`fe_?&|ju7Bd=uoFJ}wcrQ=^w{0*5S4D7a% z%^NM4ONH!83pq+HSS<|xk`+(?{*z8E*j?A9;}*{3hv+py!*G7&h5zVNn59cCj6F-y zD0qCLI`~##6G@JUEUtqX!5K_p2&>$0@U)ImD85rV!p9hXK!JW2QAA&QmkpR{&I?Bv z-^~}=n0SuYQu*u=CU^5w`RV-YZJcZ44H~+A8Djf@v#dVJ&P-vRrwlV`Tnm)@aOodg Cs#M_s literal 0 HcmV?d00001 diff --git a/examples/VerifyIO.class b/examples/VerifyIO.class new file mode 100644 index 0000000000000000000000000000000000000000..116847762843f2e9755c32aeddc8c3c92652e248 GIT binary patch literal 2139 zcmah~OM4Sl7=BNabf)7#n?MV_08=g{jcL;Ya!CQPh0@eE#fFQa-X_VUos!JNWCBza z?{{$J#*GU%Y?VdAV|;L>3x9!sK=-cPiQhL#+wm#Sd+3OYIJih>|} zcd~a7NnVjp5Gff~IqI51@h?kAOSrC}A2SO2u*AbF5?)oX4;OfNO~&gyzriuOgbYI? z-{+9!RgOXCBp5RC?6xdpML`5JGE8<_m2pExfxU_{ED5%Rl0f@u(=wg20>1F@RRRB$ zoihYF=S<5;R*M;L&Ljgn*9Rz<>_6kDoNY|m3;xn@x}E#6;hCMxLGaxCSPO>23AF)1m#TFx4rTwvQ( zqip8a5(}eTRK*FL6i~eYRFqNS4XU}@yRlGp2nZ!M^dj$91qQZsld%5db56xg+){BH zYZBg4aR+Zpct^!uysP3puD#1!!V@j9XG?M~0)Z3r)rzB)%Jxk&XJ~n9PqXt{YJO6? zvN%`KbStOjjEZAgI#a3T%(9Vn?DCq5_u;7c03Q-*>(wW#`Mgm!a*KwZGs*&?^$n)2 zY2=e=>v0~YoAD|>!KVUkaZSZ%%;H^UF}S4>6%#nE;&Xf<(C1ciQ!Q34$1EBf z$1kv#%WDP0T6R_{TF%xi+tG@;lU<2x`LQ!x?@LlZG(UbuK*Ur$k8}SM#hw&!go5wk zKB-HyZwScix)A8v1hkM@CC&tPY??gaB+_(JFOsTuhFc=`Fft*~O_F74d#$XZbBQ$H5-3$~f~FcC zGbJvu6HySJ;;eye!LD!}*Ib}`VSDuZjj9nSv{tB! ziV(J80NXKyE{xM7eu^yT(TxOpki>4BAy01QEMX)qw=muzTYz?^T#SUPvxTvX@CF%K zDDEGL*07@mEXu%kGB83*!2YDEn{oAQk}-r1N;yEV_7aGFv>GH>`|0m>fM5*~l*5=r z*aN8pFObEhO)OCy(I$M6$ARzANu@%&YS`_6gx&`F(hc;dBfcYb4Aik_?%5jlrssdf z@8s6NzH}WLfgKF(r=f-eH5_c<5K}#r9C?JpappM8Tn>Nz4MrP?P(C**M41M8vxaDh z=0VqqJ}65aqd#++mTSa+giFMl0X~{spP{(Fmq3oWfy_vlO2oV+#yx36oWu3ntih2- zuW`f2sNn}s4sB98O()8~|8~UajK_%9qd16T7$IR!6R8WN!Yib_43T=DPWK@ZTE`TA XAr1V6i})Keq7Abi$_4F$C_n!%lMwB@ literal 0 HcmV?d00001 diff --git a/examples/VerifyReads.class b/examples/VerifyReads.class new file mode 100644 index 0000000000000000000000000000000000000000..ff0d0a12c12ea000be6786cf562b5825c7495fe6 GIT binary patch literal 2215 zcmZ`)S##4?6#i}^N4BDn4F?Pa#9GG*Hl#EZ2SS>J#o!Q1SZV@oW&1i2Sdx+CB<{Y@ zy@mFXJoJHKhQ|(_Vlz!AkA3J&r!#$N|3Lpn>A8+WOal)(chS*zzw@1QkAD02=OqA9 ze5W9SqXF!~urRME@MA=nQH7RcVs=c%aTzBR1aMTClYS%=?7=CqI4wMq3dV6p>`e%B zR($%Z*gNOPq!`c3xS(JIF3Py1AcWV%A|+;*#cWE=3L$5MM&W*WdIyPyh ztM8Y+^SU)1oAeyRnjWm4qa2&h5Fx|1Tp8D7T&JT=-LM$C!c%L%=^;V#49cWkbTV83 zGqhdgj*%;!<9gPO3Qj6wFjeeDR7EfPR9LW86mUbui#Q;R&7jt^r_-v-I(j3;T#h>` z9JnM_OofM{idkV|n3FNDqJ+0pye+Wb!MiG6!hnkR@IFNlB{5ZefDakAtdSyN6^b5d zz;z-S!$%Ao>$yx6y{Fz2;g4}s#V7bw#b+>Oe6HdPe9167UUWUpEpQUMq|uQYWrk-w z+bL;zJEIF#wJ?uPM>WbsJQg!cS=+oaSai7)FX*m2Y?U&5_a90his^-d+oR>|eBPeR zYUz^Z&2Wv1#W0Je<~jN-cU(QMWkv1C_)5jsm{ai$_Q|-V;x@izXs%0xh-)9!$eP$0 zcAqEYg6_@Kh#Nes8Lnp8o~EzzC&{Cf+0~>>q_0tA3|p&P7WZP~dOl}6CeL0tmwZx0 z44o@lCMMSGR?}Oz+ZYyA+r;M$*P|@c@-joqH22Qx4!68od4+qPu5|i>gr~&=3Te7TuOrsGC`lwO{&@TE1-35`&`-9b`jJA`j}|o3 zTBTiTPc@JuHIPv6uh`IAhO~gT2#vlnnrM(O{U558K-$oWc5EaI(Txa#_^<=;(L3Pp z?gdB>7U54VB9N*;=_{kTLnT9iEi{y|u7cLMz;9`bmeDrgqiOpc4AamN_csnmK`G>4 zx{KS9kUuE(KOd)C%9hc2Q)2fY{}J>__i$B!28sRpj$j#GcaV$-CVg}uMYM=Y>F$PK;$Phl(9KAAbpRHkRq0iL8*)__aFZg3Y5_uQp(u6s>CUh5!ghc zZl;*GB8+V$>2}1i6T{ez)AT#MLE{{~xkb5Lpe){_9R5JrTcZ5^PTqe~3jQMP4iZum zDfluD(O)}`!DTh6^Gem!B_d0{yJ-Cp+d8x|wo8w&BO>)b!p@;Z>`HZ4usgYkJ*h}z ze+4g$lho}C%iiIdcW+-uPdACQN3q zEVlIGVTXP5c4pq&@1M^v06lEGkZ4s)+E*?HUvZ_;D&?LWVzA%ha|K> zJG_gYqW&aGZu)1>BmJ1gX~JIVC{E(+SfJKjNOrFTil^zAx_THV`XYZAYBPw26EX#p zC&aFOcreateTime() method. ++ *

++ * This method does not apply to workgroups, servers, or shares. ++ * ++ * @param time the create time as milliseconds since Jan 1, 1970 ++ */ ++ public void setAccessTime( long time ) throws SmbException { ++ if( getUncPath0().length() == 1 ) { ++ throw new SmbException( "Invalid operation for workgroups, servers, or shares" ); ++ } ++ ++ setPathInformation( 0, 0L, time, 0L ); ++ } ++/** + * Set the last modified time of the file. The time is specified as milliseconds + * from Jan 1, 1970 which is the same as that which is returned by the + * lastModified(), getLastModified(), and getDate() methods. +--- jcifs_1.3.12/src/jcifs/smb/Trans2SetFileInformation.java ++++ jcifs/src/jcifs/smb/Trans2SetFileInformation.java +@@ -25,6 +25,7 @@ + private int fid; + private int attributes; + private long createTime, lastWriteTime; ++ private long accessTime; + + Trans2SetFileInformation( int fid, int attributes, long createTime, long lastWriteTime ) { + this.fid = fid; +@@ -38,6 +39,19 @@ + maxSetupCount = (byte)0x00; + } + ++ Trans2SetFileInformation( int fid, int attributes, long createTime, long accessTime, long lastWriteTime ) { ++ this.fid = fid; ++ this.attributes = attributes; ++ this.accessTime = accessTime; ++ this.createTime = createTime; ++ this.lastWriteTime = lastWriteTime; ++ command = SMB_COM_TRANSACTION2; ++ subCommand = TRANS2_SET_FILE_INFORMATION; ++ maxParameterCount = 6; ++ maxDataCount = 0; ++ maxSetupCount = (byte)0x00; ++ } ++ + int writeSetupWireFormat( byte[] dst, int dstIndex ) { + dst[dstIndex++] = subCommand; + dst[dstIndex++] = (byte)0x00; +@@ -58,13 +72,22 @@ + int writeDataWireFormat( byte[] dst, int dstIndex ) { + int start = dstIndex; + ++ // create time + writeTime( createTime, dst, dstIndex ); dstIndex += 8; +- writeInt8( 0L, dst, dstIndex ); dstIndex += 8; ++ ++ // access time ++ writeInt8( accessTime, dst, dstIndex ); dstIndex += 8; ++ ++ // last write time [modification] + writeTime( lastWriteTime, dst, dstIndex ); dstIndex += 8; ++ ++ // change time + writeInt8( 0L, dst, dstIndex ); dstIndex += 8; ++ + /* Samba 2.2.7 needs ATTR_NORMAL + */ + writeInt2( 0x80 | attributes, dst, dstIndex ); dstIndex += 2; ++ + /* 6 zeros observed with NT */ + writeInt8( 0L, dst, dstIndex ); dstIndex += 6; + diff --git a/src/jcifs/dcerpc/DcerpcHandle.java b/src/jcifs/dcerpc/DcerpcHandle.java index 72bd37b..279dd16 100644 --- a/src/jcifs/dcerpc/DcerpcHandle.java +++ b/src/jcifs/dcerpc/DcerpcHandle.java @@ -140,11 +140,7 @@ public abstract class DcerpcHandle implements DcerpcConstants { isDirect = msg instanceof DcerpcBind; - try { - stub = jcifs.smb.BufferCache.getBuffer(); - } catch (InterruptedException ie) { - throw new IOException(ie.getMessage()); - } + stub = jcifs.smb.BufferCache.getBuffer(); try { int off, tot, n; diff --git a/src/jcifs/ntlmssp/Type1Message.java b/src/jcifs/ntlmssp/Type1Message.java index 754575b..450fb2b 100644 --- a/src/jcifs/ntlmssp/Type1Message.java +++ b/src/jcifs/ntlmssp/Type1Message.java @@ -169,29 +169,9 @@ public class Type1Message extends NtlmMessage { public String toString() { String suppliedDomain = getSuppliedDomain(); String suppliedWorkstation = getSuppliedWorkstation(); - int flags = getFlags(); - StringBuffer buffer = new StringBuffer(); - if (suppliedDomain != null) { - buffer.append("suppliedDomain: ").append(suppliedDomain); - } - if (suppliedWorkstation != null) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("suppliedWorkstation: ").append(suppliedWorkstation); - } - if (flags != 0) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("flags: "); - buffer.append("0x"); - buffer.append(Integer.toHexString((flags >> 28) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 24) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 20) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 16) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 12) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 8) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 4) & 0x0f)); - buffer.append(Integer.toHexString(flags & 0x0f)); - } - return buffer.toString(); + return "Type1Message[suppliedDomain=" + (suppliedDomain == null ? "null" : suppliedDomain) + + ",suppliedWorkstation=" + (suppliedWorkstation == null ? "null" : suppliedWorkstation) + + ",flags=0x" + jcifs.util.Hexdump.toHexString(getFlags(), 8) + "]"; } /** diff --git a/src/jcifs/ntlmssp/Type2Message.java b/src/jcifs/ntlmssp/Type2Message.java index 355a0b3..26fe976 100644 --- a/src/jcifs/ntlmssp/Type2Message.java +++ b/src/jcifs/ntlmssp/Type2Message.java @@ -276,53 +276,12 @@ public class Type2Message extends NtlmMessage { byte[] challenge = getChallenge(); byte[] context = getContext(); byte[] targetInformation = getTargetInformation(); - int flags = getFlags(); - StringBuffer buffer = new StringBuffer(); - if (target != null) { - buffer.append("target: ").append(target); - } - if (challenge != null) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("challenge: "); - buffer.append("0x"); - for (int i = 0; i < challenge.length; i++) { - buffer.append(Integer.toHexString((challenge[i] >> 4) & 0x0f)); - buffer.append(Integer.toHexString(challenge[i] & 0x0f)); - } - } - if (context != null) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("context: "); - buffer.append("0x"); - for (int i = 0; i < context.length; i++) { - buffer.append(Integer.toHexString((context[i] >> 4) & 0x0f)); - buffer.append(Integer.toHexString(context[i] & 0x0f)); - } - } - if (targetInformation != null) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("targetInformation: "); - buffer.append("0x"); - for (int i = 0; i < targetInformation.length; i++) { - buffer.append(Integer.toHexString((targetInformation[i] >> 4) & - 0x0f)); - buffer.append(Integer.toHexString(targetInformation[i] & 0x0f)); - } - } - if (flags != 0) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("flags: "); - buffer.append("0x"); - buffer.append(Integer.toHexString((flags >> 28) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 24) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 20) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 16) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 12) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 8) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 4) & 0x0f)); - buffer.append(Integer.toHexString(flags & 0x0f)); - } - return buffer.toString(); + + return "Type2Message[target=" + target + + ",challenge=" + (challenge == null ? "null" : "<" + challenge.length + " bytes>") + + ",context=" + (context == null ? "null" : "<" + context.length + " bytes>") + + ",targetInformation=" + (targetInformation == null ? "null" : "<" + targetInformation.length + " bytes>") + + ",flags=0x" + jcifs.util.Hexdump.toHexString(getFlags(), 8) + "]"; } /** diff --git a/src/jcifs/ntlmssp/Type3Message.java b/src/jcifs/ntlmssp/Type3Message.java index 8bfe930..5f74054 100644 --- a/src/jcifs/ntlmssp/Type3Message.java +++ b/src/jcifs/ntlmssp/Type3Message.java @@ -489,60 +489,14 @@ public class Type3Message extends NtlmMessage { byte[] lmResponse = getLMResponse(); byte[] ntResponse = getNTResponse(); byte[] sessionKey = getSessionKey(); - int flags = getFlags(); - StringBuffer buffer = new StringBuffer(); - if (domain != null) { - buffer.append("domain: ").append(domain); - } - if (user != null) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("user: ").append(user); - } - if (workstation != null) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("workstation: ").append(workstation); - } - if (lmResponse != null) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("lmResponse: "); - buffer.append("0x"); - for (int i = 0; i < lmResponse.length; i++) { - buffer.append(Integer.toHexString((lmResponse[i] >> 4) & 0x0f)); - buffer.append(Integer.toHexString(lmResponse[i] & 0x0f)); - } - } - if (ntResponse != null) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("ntResponse: "); - buffer.append("0x"); - for (int i = 0; i < ntResponse.length; i++) { - buffer.append(Integer.toHexString((ntResponse[i] >> 4) & 0x0f)); - buffer.append(Integer.toHexString(ntResponse[i] & 0x0f)); - } - } - if (sessionKey != null) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("sessionKey: "); - buffer.append("0x"); - for (int i = 0; i < sessionKey.length; i++) { - buffer.append(Integer.toHexString((sessionKey[i] >> 4) & 0x0f)); - buffer.append(Integer.toHexString(sessionKey[i] & 0x0f)); - } - } - if (flags != 0) { - if (buffer.length() > 0) buffer.append("; "); - buffer.append("flags: "); - buffer.append("0x"); - buffer.append(Integer.toHexString((flags >> 28) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 24) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 20) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 16) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 12) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 8) & 0x0f)); - buffer.append(Integer.toHexString((flags >> 4) & 0x0f)); - buffer.append(Integer.toHexString(flags & 0x0f)); - } - return buffer.toString(); + + return "Type3Message[domain=" + domain + + ",user=" + user + + ",workstation=" + workstation + + ",lmResponse=" + (lmResponse == null ? "null" : "<" + lmResponse.length + " bytes>") + + ",ntResponse=" + (ntResponse == null ? "null" : "<" + ntResponse.length + " bytes>") + + ",sessionKey=" + (sessionKey == null ? "null" : "<" + sessionKey.length + " bytes>") + + ",flags=0x" + jcifs.util.Hexdump.toHexString(getFlags(), 8) + "]"; } /** diff --git a/src/jcifs/smb/BufferCache.jav b/src/jcifs/smb/BufferCache.jav new file mode 100644 index 0000000..1dea6bf --- /dev/null +++ b/src/jcifs/smb/BufferCache.jav @@ -0,0 +1,83 @@ +/* jcifs smb client library in Java + * Copyright (C) 2000 "Michael B. Allen" + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package jcifs.smb; + +import jcifs.Config; + +public class BufferCache { + + private static final int MAX_BUFFERS = Config.getInt( "jcifs.smb.maxBuffers", 16 ); + + static Object[] cache = new Object[MAX_BUFFERS]; + private static int freeBuffers = 0; + + private static byte[] getBuffer0() { + byte[] buf; + + if (freeBuffers > 0) { + for (int i = 0; i < MAX_BUFFERS; i++) { + if( cache[i] != null ) { + buf = (byte[])cache[i]; + cache[i] = null; + freeBuffers--; + return buf; + } + } + } + + buf = new byte[SmbComTransaction.TRANSACTION_BUF_SIZE]; + + return buf; + } + + static void getBuffers( SmbComTransaction req, + SmbComTransactionResponse rsp ) throws InterruptedException { + synchronized( cache ) { + if (freeBuffers < 2) { + /* The first time this is called we always wait because freeBuffers + * will be 0. But after a few calls to releaseBuffer, threads will + * no longer wait. + */ + cache.wait(100); + } + req.txn_buf = getBuffer0(); + rsp.txn_buf = getBuffer0(); + } + } + static public byte[] getBuffer() throws InterruptedException { + synchronized( cache ) { + if (freeBuffers < 1) { + cache.wait(100); + } + return getBuffer0(); + } + } + static public void releaseBuffer( byte[] buf ) { + synchronized( cache ) { + for (int i = 0; i < MAX_BUFFERS; i++) { + if (cache[i] == null) { + cache[i] = buf; + freeBuffers++; + cache.notify(); + return; + } + } + } + } +} diff --git a/src/jcifs/smb/BufferCache.java b/src/jcifs/smb/BufferCache.java index 14fa4fa..dce2525 100644 --- a/src/jcifs/smb/BufferCache.java +++ b/src/jcifs/smb/BufferCache.java @@ -25,55 +25,43 @@ public class BufferCache { private static final int MAX_BUFFERS = Config.getInt( "jcifs.smb.maxBuffers", 16 ); static Object[] cache = new Object[MAX_BUFFERS]; - private static int numBuffers = 0; private static int freeBuffers = 0; - private static byte[] getBuffer0() { - byte[] buf; + static public byte[] getBuffer() { + synchronized( cache ) { + byte[] buf; - if (freeBuffers > 0) { - for (int i = 0; i < MAX_BUFFERS; i++) { - if( cache[i] != null ) { - buf = (byte[])cache[i]; - cache[i] = null; - freeBuffers--; - return buf; + if (freeBuffers > 0) { + for (int i = 0; i < MAX_BUFFERS; i++) { + if( cache[i] != null ) { + buf = (byte[])cache[i]; + cache[i] = null; + freeBuffers--; + return buf; + } } } - } - buf = new byte[SmbComTransaction.TRANSACTION_BUF_SIZE]; - numBuffers++; - - return buf; - } + buf = new byte[SmbComTransaction.TRANSACTION_BUF_SIZE]; - static void getBuffers( SmbComTransaction req, - SmbComTransactionResponse rsp ) throws InterruptedException { - synchronized( cache ) { - while ((freeBuffers + (MAX_BUFFERS - numBuffers)) < 2) { - cache.wait(); - } - req.txn_buf = getBuffer0(); - rsp.txn_buf = getBuffer0(); + return buf; } } - static public byte[] getBuffer() throws InterruptedException { + static void getBuffers( SmbComTransaction req, SmbComTransactionResponse rsp ) { synchronized( cache ) { - while ((freeBuffers + (MAX_BUFFERS - numBuffers)) < 1) { - cache.wait(); - } - return getBuffer0(); + req.txn_buf = getBuffer(); + rsp.txn_buf = getBuffer(); } } static public void releaseBuffer( byte[] buf ) { synchronized( cache ) { - for (int i = 0; i < MAX_BUFFERS; i++) { - if (cache[i] == null) { - cache[i] = buf; - freeBuffers++; - cache.notify(); - return; + if (freeBuffers < MAX_BUFFERS) { + for (int i = 0; i < MAX_BUFFERS; i++) { + if (cache[i] == null) { + cache[i] = buf; + freeBuffers++; + return; + } } } } diff --git a/src/jcifs/smb/NtlmContext.java b/src/jcifs/smb/NtlmContext.java index 9484dd6..84217a7 100644 --- a/src/jcifs/smb/NtlmContext.java +++ b/src/jcifs/smb/NtlmContext.java @@ -21,6 +21,8 @@ package jcifs.smb; import java.io.IOException; import java.security.*; import jcifs.ntlmssp.*; +import jcifs.util.LogStream; +import jcifs.util.Hexdump; /** For initiating NTLM authentication (including NTLMv2). If you want to add NTLMv2 authentication support to something this is what you want to use. See the code for details. Note that JCIFS does not implement the acceptor side of NTLM authentication. @@ -28,6 +30,7 @@ For initiating NTLM authentication (including NTLMv2). If you want to add NTLMv2 public class NtlmContext { + NtlmPasswordAuthentication auth; int ntlmsspFlags; String workstation; @@ -35,6 +38,7 @@ public class NtlmContext { byte[] serverChallenge = null; byte[] signingKey = null; int state = 1; + LogStream log; public NtlmContext(NtlmPasswordAuthentication auth, boolean doSigning) { this.auth = auth; @@ -48,6 +52,29 @@ public class NtlmContext { NtlmFlags.NTLMSSP_NEGOTIATE_KEY_EXCH; } this.workstation = Type1Message.getDefaultWorkstation(); + log = LogStream.getInstance(); + } + + public String toString() { + String ret = "NtlmContext[auth=" + auth + + ",ntlmsspFlags=0x" + Hexdump.toHexString(ntlmsspFlags, 8) + + ",workstation=" + workstation + + ",isEstablished=" + isEstablished + + ",state=" + state + + ",serverChallenge="; + if (serverChallenge == null) { + ret += "null"; + } else { + ret += Hexdump.toHexString(serverChallenge, 0, serverChallenge.length * 2); + } + ret += ",signingKey="; + if (signingKey == null) { + ret += "null"; + } else { + ret += Hexdump.toHexString(signingKey, 0, signingKey.length * 2); + } + ret += "]"; + return ret; } public boolean isEstablished() { @@ -67,12 +94,25 @@ public class NtlmContext { case 1: Type1Message msg1 = new Type1Message(ntlmsspFlags, auth.getDomain(), workstation); token = msg1.toByteArray(); + + if (log.level >= 4) { + log.println(msg1); + if (log.level >= 6) + Hexdump.hexdump(log, token, 0, token.length); + } + state++; break; case 2: try { Type2Message msg2 = new Type2Message(token); + if (log.level >= 4) { + log.println(msg2); + if (log.level >= 6) + Hexdump.hexdump(log, token, 0, token.length); + } + serverChallenge = msg2.getChallenge(); ntlmsspFlags &= msg2.getFlags(); @@ -84,6 +124,12 @@ public class NtlmContext { ntlmsspFlags); token = msg3.toByteArray(); + if (log.level >= 4) { + log.println(msg3); + if (log.level >= 6) + Hexdump.hexdump(log, token, 0, token.length); + } + if ((ntlmsspFlags & NtlmFlags.NTLMSSP_NEGOTIATE_SIGN) != 0) signingKey = msg3.getMasterKey(); diff --git a/src/jcifs/smb/SmbFile.java b/src/jcifs/smb/SmbFile.java index 8ff3a44..07fdf22 100644 --- a/src/jcifs/smb/SmbFile.java +++ b/src/jcifs/smb/SmbFile.java @@ -423,7 +423,7 @@ public class SmbFile extends URLConnection implements SmbConstants { protected static Dfs dfs; NtlmPasswordAuthentication auth; // Cannot be null - SmbTree tree = null; // Initially null; may be !tree.treeConnected + SmbTree tree = null; // Initially null String unc; // Initially null; set by getUncPath; never ends with '/' int fid; // Initially 0; set by open() int type; @@ -889,7 +889,7 @@ int addressIndex; String hostName = getServerWithDfs(); tree.inDomainDfs = dfs.resolve(hostName, tree.share, null, auth) != null; if (tree.inDomainDfs) { - tree.treeConnected = true; + tree.connectionState = 2; } try { @@ -912,7 +912,7 @@ int addressIndex; tree = ssn.getSmbTree(share, null); tree.inDomainDfs = dfs.resolve(hostName, tree.share, null, auth) != null; if (tree.inDomainDfs) { - tree.treeConnected = true; + tree.connectionState = 2; } tree.treeConnect(null, null); } else { @@ -950,7 +950,7 @@ int addressIndex; } } boolean isConnected() { - return tree != null && tree.treeConnected; + return tree != null && tree.connectionState == 2; } int open0( int flags, int access, int attrs, int options ) throws SmbException { int f; @@ -994,7 +994,7 @@ if (this instanceof SmbNamedPipe) { tree_num = tree.tree_num; } boolean isOpen() { - boolean ans = opened && isConnected() && tree_num == tree.tree_num; + boolean ans = opened && isConnected() && tree_num == tree.tree_num; return ans; } void close( int f, long lastWriteTime ) throws SmbException { diff --git a/src/jcifs/smb/SmbSession.java b/src/jcifs/smb/SmbSession.java index 1f48337..60646f3 100644 --- a/src/jcifs/smb/SmbSession.java +++ b/src/jcifs/smb/SmbSession.java @@ -70,48 +70,48 @@ public final class SmbSession { if( DOMAIN == null ) { throw new SmbException( "A domain was not specified" ); } - synchronized (DOMAIN) { +synchronized (DOMAIN) { long now = System.currentTimeMillis(); -int retry = 1; - -do { - if (dc_list_expiration < now) { - NbtAddress[] list = NbtAddress.getAllByName( DOMAIN, 0x1C, null, null ); - dc_list_expiration = now + CACHE_POLICY * 1000L; - if (list != null && list.length > 0) { - dc_list = list; - } else { /* keep using the old list */ - dc_list_expiration = now + 1000 * 60 * 15; /* 15 min */ - if (SmbTransport.log.level >= 2) { - SmbTransport.log.println( "Failed to retrieve DC list from WINS" ); + int retry = 1; + + do { + if (dc_list_expiration < now) { + NbtAddress[] list = NbtAddress.getAllByName( DOMAIN, 0x1C, null, null ); + dc_list_expiration = now + CACHE_POLICY * 1000L; + if (list != null && list.length > 0) { + dc_list = list; + } else { /* keep using the old list */ + dc_list_expiration = now + 1000 * 60 * 15; /* 15 min */ + if (SmbTransport.log.level >= 2) { + SmbTransport.log.println( "Failed to retrieve DC list from WINS" ); + } } } - } - int max = Math.min( dc_list.length, LOOKUP_RESP_LIMIT ); - for (int j = 0; j < max; j++) { - int i = dc_list_counter++ % max; - if (dc_list[i] != null) { - try { - return interrogate( dc_list[i] ); - } catch (SmbException se) { - if (SmbTransport.log.level >= 2) { - SmbTransport.log.println( "Failed validate DC: " + dc_list[i] ); - if (SmbTransport.log.level > 2) - se.printStackTrace( SmbTransport.log ); + int max = Math.min( dc_list.length, LOOKUP_RESP_LIMIT ); + for (int j = 0; j < max; j++) { + int i = dc_list_counter++ % max; + if (dc_list[i] != null) { + try { + return interrogate( dc_list[i] ); + } catch (SmbException se) { + if (SmbTransport.log.level >= 2) { + SmbTransport.log.println( "Failed validate DC: " + dc_list[i] ); + if (SmbTransport.log.level > 2) + se.printStackTrace( SmbTransport.log ); + } } + dc_list[i] = null; } - dc_list[i] = null; } - } -/* No DCs found, for retieval of list by expiring it and retry. - */ - dc_list_expiration = 0; -} while (retry-- > 0); + /* No DCs found, for retieval of list by expiring it and retry. + */ + dc_list_expiration = 0; + } while (retry-- > 0); dc_list_expiration = now + 1000 * 60 * 15; /* 15 min */ - } +} throw new UnknownHostException( "Failed to negotiate with a suitable domain controller for " + DOMAIN ); @@ -158,9 +158,14 @@ do { } } - private int uid; + /* 0 - not connected + * 1 - connecting + * 2 - connected + * 3 - disconnecting + */ + int connectionState; + int uid; Vector trees; - private boolean sessionSetup; // Transport parameters allows trans to be removed from CONNECTIONS private UniAddress address; private int port, localPort; @@ -179,6 +184,7 @@ do { this.localPort = localPort; this.auth = auth; trees = new Vector(); + connectionState = 0; } synchronized SmbTree getSmbTree( String share, String service ) { @@ -208,31 +214,32 @@ do { } void send( ServerMessageBlock request, ServerMessageBlock response ) throws SmbException { +synchronized (transport()) { if( response != null ) { response.received = false; } - synchronized(transport.setupDiscoLock) { - expiration = System.currentTimeMillis() + SmbTransport.SO_TIMEOUT; - sessionSetup( request, response ); - if( response != null && response.received ) { - return; - } - request.uid = uid; - request.auth = auth; - try { - transport.send( request, response ); - } catch (SmbException se) { - if (request instanceof SmbComTreeConnectAndX) { - logoff(true); - } - request.digest = null; - throw se; + expiration = System.currentTimeMillis() + SmbTransport.SO_TIMEOUT; + sessionSetup( request, response ); + if( response != null && response.received ) { + return; + } + request.uid = uid; + request.auth = auth; + try { + transport.send( request, response ); + } catch (SmbException se) { + if (request instanceof SmbComTreeConnectAndX) { + logoff(true); } + request.digest = null; + throw se; } +} } void sessionSetup( ServerMessageBlock andx, - ServerMessageBlock andxResponse ) throws SmbException { + ServerMessageBlock andxResponse ) throws SmbException { +synchronized (transport()) { NtlmContext nctx = null; SmbException ex = null; SmbComSessionSetupAndX request; @@ -240,166 +247,187 @@ do { byte[] token = new byte[0]; int state = 10; -synchronized( transport() ) { - if( sessionSetup ) { - return; + while (connectionState != 0) { + if (connectionState == 2 || connectionState == 3) // connected or disconnecting + return; + try { + transport.wait(); + } catch (InterruptedException ie) { + throw new SmbException(ie.getMessage(), ie); + } } + connectionState = 1; // trying ... - transport.connect(); - - /* - * Session Setup And X Request / Response - */ - - if( transport.log.level >= 4 ) - transport.log.println( "sessionSetup: accountName=" + auth.username + ",primaryDomain=" + auth.domain ); - - /* We explicitly set uid to 0 here to prevent a new - * SMB_COM_SESSION_SETUP_ANDX from having it's uid set to an - * old value when the session is re-established. Otherwise a - * "The parameter is incorrect" error can occur. - */ - uid = 0; - - do { - switch (state) { - case 10: /* NTLM */ - if (auth != NtlmPasswordAuthentication.ANONYMOUS && - transport.hasCapability(SmbConstants.CAP_EXTENDED_SECURITY)) { - state = 20; /* NTLMSSP */ - break; - } - - request = new SmbComSessionSetupAndX( this, andx, auth ); - response = new SmbComSessionSetupAndXResponse( andxResponse ); + try { + transport.connect(); - /* Create SMB signature digest if necessary - * Only the first SMB_COM_SESSION_SETUP_ANX with non-null or - * blank password initializes signing. - */ - if (transport.isSignatureSetupRequired( auth )) { - if( auth.hashesExternal && NtlmPasswordAuthentication.DEFAULT_PASSWORD != NtlmPasswordAuthentication.BLANK ) { - /* preauthentication - */ - transport.getSmbSession( NtlmPasswordAuthentication.DEFAULT ).getSmbTree( LOGON_SHARE, null ).treeConnect( null, null ); - } else { - byte[] signingKey = auth.getSigningKey(transport.server.encryptionKey); - request.digest = new SigningDigest(signingKey, false); + /* + * Session Setup And X Request / Response + */ + + if( transport.log.level >= 4 ) + transport.log.println( "sessionSetup: accountName=" + auth.username + ",primaryDomain=" + auth.domain ); + + /* We explicitly set uid to 0 here to prevent a new + * SMB_COM_SESSION_SETUP_ANDX from having it's uid set to an + * old value when the session is re-established. Otherwise a + * "The parameter is incorrect" error can occur. + */ + uid = 0; + + do { + switch (state) { + case 10: /* NTLM */ + if (auth != NtlmPasswordAuthentication.ANONYMOUS && + transport.hasCapability(SmbConstants.CAP_EXTENDED_SECURITY)) { + state = 20; /* NTLMSSP */ + break; } - } - - request.auth = auth; - - try { - transport.send( request, response ); - } catch (SmbAuthException sae) { - throw sae; - } catch (SmbException se) { - ex = se; - } - - if( response.isLoggedInAsGuest && - "GUEST".equalsIgnoreCase( auth.username ) == false && - transport.server.security != SmbConstants.SECURITY_SHARE) { - throw new SmbAuthException( NtStatus.NT_STATUS_LOGON_FAILURE ); - } - - if (ex != null) - throw ex; - - uid = response.uid; - - if( request.digest != null ) { - /* success - install the signing digest */ - transport.digest = request.digest; - } - - sessionSetup = true; - state = 0; - - break; - case 20: - if (nctx == null) { - boolean doSigning = (transport.flags2 & ServerMessageBlock.FLAGS2_SECURITY_SIGNATURES) != 0; - nctx = new NtlmContext(auth, doSigning); - } - - if (nctx.isEstablished()) { - sessionSetup = true; - state = 0; - break; - } - - try { - token = nctx.initSecContext(token, 0, token.length); - } catch (SmbException se) { - /* We must close the transport or the server will be expecting a - * Type3Message. Otherwise, when we send a Type1Message it will return - * "Invalid parameter". + + request = new SmbComSessionSetupAndX( this, andx, auth ); + response = new SmbComSessionSetupAndXResponse( andxResponse ); + + /* Create SMB signature digest if necessary + * Only the first SMB_COM_SESSION_SETUP_ANX with non-null or + * blank password initializes signing. */ - try { transport.disconnect(true); } catch (IOException ioe) {} - uid = 0; - throw se; - } - - if (token != null) { - request = new SmbComSessionSetupAndX(this, null, token); - response = new SmbComSessionSetupAndXResponse(null); - if (transport.isSignatureSetupRequired( auth )) { - byte[] signingKey = nctx.getSigningKey(); - if (signingKey != null) - request.digest = new SigningDigest(signingKey, true); + if( auth.hashesExternal && NtlmPasswordAuthentication.DEFAULT_PASSWORD != NtlmPasswordAuthentication.BLANK ) { + /* preauthentication + */ + transport.getSmbSession( NtlmPasswordAuthentication.DEFAULT ).getSmbTree( LOGON_SHARE, null ).treeConnect( null, null ); + } else { + byte[] signingKey = auth.getSigningKey(transport.server.encryptionKey); + request.digest = new SigningDigest(signingKey, false); + } } - - request.uid = uid; - uid = 0; - + + request.auth = auth; + try { transport.send( request, response ); } catch (SmbAuthException sae) { throw sae; } catch (SmbException se) { ex = se; - /* Apparently once a successfull NTLMSSP login occurs, the - * server will return "Access denied" even if a logoff is - * sent. Unfortunately calling disconnect() doesn't always - * actually shutdown the connection before other threads - * have committed themselves (e.g. InterruptTest example). - */ - try { transport.disconnect(true); } catch (Exception e) {} } - + if( response.isLoggedInAsGuest && - "GUEST".equalsIgnoreCase( auth.username ) == false) { + "GUEST".equalsIgnoreCase( auth.username ) == false && + transport.server.security != SmbConstants.SECURITY_SHARE) { throw new SmbAuthException( NtStatus.NT_STATUS_LOGON_FAILURE ); } - + if (ex != null) throw ex; - + uid = response.uid; - - if (request.digest != null) { + + if( request.digest != null ) { /* success - install the signing digest */ transport.digest = request.digest; } + + connectionState = 2; - token = response.blob; - } + state = 0; + + break; + case 20: + if (nctx == null) { + boolean doSigning = (transport.flags2 & ServerMessageBlock.FLAGS2_SECURITY_SIGNATURES) != 0; + nctx = new NtlmContext(auth, doSigning); + } + + if (SmbTransport.log.level >= 4) + SmbTransport.log.println(nctx); + + if (nctx.isEstablished()) { - break; - default: - throw new SmbException("Unexpected session setup state: " + state); - } - } while (state != 0); + connectionState = 2; + + state = 0; + break; + } + + try { + token = nctx.initSecContext(token, 0, token.length); + } catch (SmbException se) { + /* We must close the transport or the server will be expecting a + * Type3Message. Otherwise, when we send a Type1Message it will return + * "Invalid parameter". + */ + try { transport.disconnect(true); } catch (IOException ioe) {} + uid = 0; + throw se; + } + + if (token != null) { + request = new SmbComSessionSetupAndX(this, null, token); + response = new SmbComSessionSetupAndXResponse(null); + + if (transport.isSignatureSetupRequired( auth )) { + byte[] signingKey = nctx.getSigningKey(); + if (signingKey != null) + request.digest = new SigningDigest(signingKey, true); + } + + request.uid = uid; + uid = 0; + + try { + transport.send( request, response ); + } catch (SmbAuthException sae) { + throw sae; + } catch (SmbException se) { + ex = se; + /* Apparently once a successfull NTLMSSP login occurs, the + * server will return "Access denied" even if a logoff is + * sent. Unfortunately calling disconnect() doesn't always + * actually shutdown the connection before other threads + * have committed themselves (e.g. InterruptTest example). + */ + try { transport.disconnect(true); } catch (Exception e) {} + } + + if( response.isLoggedInAsGuest && + "GUEST".equalsIgnoreCase( auth.username ) == false) { + throw new SmbAuthException( NtStatus.NT_STATUS_LOGON_FAILURE ); + } + + if (ex != null) + throw ex; + + uid = response.uid; + + if (request.digest != null) { + /* success - install the signing digest */ + transport.digest = request.digest; + } + + token = response.blob; + } + + break; + default: + throw new SmbException("Unexpected session setup state: " + state); + } + } while (state != 0); + } catch (SmbException se) { + logoff(true); + connectionState = 0; + throw se; + } finally { + transport.notifyAll(); + } } } void logoff( boolean inError ) { -synchronized( transport() ) { - if( sessionSetup == false ) { +synchronized (transport()) { + + if (connectionState != 2) // not-connected return; - } + connectionState = 3; // disconnecting for( Enumeration e = trees.elements(); e.hasMoreElements(); ) { SmbTree t = (SmbTree)e.nextElement(); @@ -410,7 +438,7 @@ synchronized( transport() ) { /* * Logoff And X Request / Response */ - + SmbComLogoffAndX request = new SmbComLogoffAndX( null ); request.uid = uid; try { @@ -420,13 +448,14 @@ synchronized( transport() ) { uid = 0; } - sessionSetup = false; + connectionState = 0; + transport.notifyAll(); } } public String toString() { return "SmbSession[accountName=" + auth.username + ",primaryDomain=" + auth.domain + ",uid=" + uid + - ",sessionSetup=" + sessionSetup + "]"; + ",connectionState=" + connectionState + "]"; } } diff --git a/src/jcifs/smb/SmbTransport.java b/src/jcifs/smb/SmbTransport.java index 342ac47..42c0982 100644 --- a/src/jcifs/smb/SmbTransport.java +++ b/src/jcifs/smb/SmbTransport.java @@ -92,7 +92,7 @@ public class SmbTransport extends Transport implements SmbConstants { int port, mid; OutputStream out; InputStream in; - byte[] sbuf = new byte[255]; /* small local buffer */ + byte[] sbuf = new byte[512]; /* small local buffer */ SmbComBlankResponse key = new SmbComBlankResponse(); long sessionExpiration = System.currentTimeMillis() + SO_TIMEOUT; LinkedList referrals = new LinkedList(); @@ -470,10 +470,13 @@ public class SmbTransport extends Transport implements SmbConstants { /* WordCount thru dataOffset always 27 */ readn( in, BUF, 4 + off, 27 ); off += 27; resp.decode( BUF, 4 ); - if (r.dataLength > 0) { - readn( in, BUF, 4 + off, r.dataOffset - off); /* pad */ + /* EMC can send pad w/o data */ + int pad = r.dataOffset - off; + if (r.byteCount > 0 && pad > 0 && pad < 4) + readn( in, BUF, 4 + off, pad); + + if (r.dataLength > 0) readn( in, r.b, r.off, r.dataLength ); /* read direct */ - } } else { readn( in, BUF, 4 + 32, size - 32 ); resp.decode( BUF, 4 ); @@ -586,7 +589,7 @@ public class SmbTransport extends Transport implements SmbConstants { makeKey( req ); } - synchronized (response_map) { + synchronized (this) { response.received = false; resp.isReceived = false; try { @@ -607,7 +610,7 @@ public class SmbTransport extends Transport implements SmbConstants { long timeout = RESPONSE_TIMEOUT; resp.expiration = System.currentTimeMillis() + timeout; while( resp.hasMoreElements() ) { - response_map.wait( timeout ); + wait( timeout ); timeout = resp.expiration - System.currentTimeMillis(); if (timeout <= 0) { throw new TransportException( this + @@ -635,8 +638,6 @@ public class SmbTransport extends Transport implements SmbConstants { } } catch( SmbException se ) { throw se; - } catch( InterruptedException ie ) { - throw new SmbException( ie.getMessage(), ie ); } catch( IOException ioe ) { throw new SmbException( ioe.getMessage(), ioe ); } diff --git a/src/jcifs/smb/SmbTree.java b/src/jcifs/smb/SmbTree.java index 7ecabb5..3a65248 100644 --- a/src/jcifs/smb/SmbTree.java +++ b/src/jcifs/smb/SmbTree.java @@ -28,14 +28,20 @@ class SmbTree { private static int tree_conn_counter; - private int tid; + /* 0 - not connected + * 1 - connecting + * 2 - connected + * 3 - disconnecting + */ + int connectionState; + int tid; String share; String service = "?????"; String service0; SmbSession session; - boolean treeConnected, inDfs, inDomainDfs; - int tree_num; + boolean inDfs, inDomainDfs; + int tree_num; // used by SmbFile.isOpen SmbTree( SmbSession session, String share, String service ) { this.session = session; @@ -44,6 +50,7 @@ class SmbTree { this.service = service; } this.service0 = this.service; + this.connectionState = 0; } boolean matches( String share, String service ) { @@ -60,6 +67,7 @@ class SmbTree { } void send( ServerMessageBlock request, ServerMessageBlock response ) throws SmbException { +synchronized (session.transport()) { if( response != null ) { response.received = false; } @@ -120,57 +128,74 @@ class SmbTree { } throw se; } +} } void treeConnect( ServerMessageBlock andx, ServerMessageBlock andxResponse ) throws SmbException { - String unc; - SmbTransport transport = session.transport(); -synchronized(transport.setupDiscoLock) { -synchronized(transport) { +synchronized (session.transport()) { + String unc; - if (treeConnected) { - return; + while (connectionState != 0) { + if (connectionState == 2 || connectionState == 3) // connected or disconnecting + return; + try { + session.transport.wait(); + } catch (InterruptedException ie) { + throw new SmbException(ie.getMessage(), ie); + } } + connectionState = 1; // trying ... - /* The hostname to use in the path is only known for - * sure if the NetBIOS session has been successfully - * established. - */ - - session.transport.connect(); - - unc = "\\\\" + session.transport.tconHostName + '\\' + share; - - /* IBM iSeries doesn't like specifying a service. Always reset - * the service to whatever was determined in the constructor. - */ - service = service0; - - /* - * Tree Connect And X Request / Response - */ - - if( session.transport.log.level >= 4 ) - session.transport.log.println( "treeConnect: unc=" + unc + ",service=" + service ); - - SmbComTreeConnectAndXResponse response = - new SmbComTreeConnectAndXResponse( andxResponse ); - SmbComTreeConnectAndX request = - new SmbComTreeConnectAndX( session, unc, service, andx ); - session.send( request, response ); - - tid = response.tid; - service = response.service; - inDfs = response.shareIsInDfs; - treeConnected = true; - tree_num = tree_conn_counter++; -} + try { + /* The hostname to use in the path is only known for + * sure if the NetBIOS session has been successfully + * established. + */ + + session.transport.connect(); + + unc = "\\\\" + session.transport.tconHostName + '\\' + share; + + /* IBM iSeries doesn't like specifying a service. Always reset + * the service to whatever was determined in the constructor. + */ + service = service0; + + /* + * Tree Connect And X Request / Response + */ + + if( session.transport.log.level >= 4 ) + session.transport.log.println( "treeConnect: unc=" + unc + ",service=" + service ); + + SmbComTreeConnectAndXResponse response = + new SmbComTreeConnectAndXResponse( andxResponse ); + SmbComTreeConnectAndX request = + new SmbComTreeConnectAndX( session, unc, service, andx ); + session.send( request, response ); + + tid = response.tid; + service = response.service; + inDfs = response.shareIsInDfs; + tree_num = tree_conn_counter++; + + connectionState = 2; // connected + } catch (SmbException se) { + treeDisconnect(true); + connectionState = 0; + throw se; + } } } void treeDisconnect( boolean inError ) { -synchronized( session.transport ) { - if (treeConnected && !inError && tid != 0) { +synchronized (session.transport()) { + + if (connectionState != 2) // not-connected + return; + connectionState = 3; // disconnecting + + if (!inError && tid != 0) { try { send( new SmbComTreeDisconnect(), null ); } catch( SmbException se ) { @@ -179,9 +204,12 @@ synchronized( session.transport ) { } } } - treeConnected = false; inDfs = false; inDomainDfs = false; + + connectionState = 0; + + session.transport.notifyAll(); } } @@ -191,6 +219,6 @@ synchronized( session.transport ) { ",tid=" + tid + ",inDfs=" + inDfs + ",inDomainDfs=" + inDomainDfs + - ",treeConnected=" + treeConnected + "]"; + ",connectionState=" + connectionState + "]"; } } diff --git a/src/jcifs/smb/TestLocking.java b/src/jcifs/smb/TestLocking.java new file mode 100644 index 0000000..ca2c02b --- /dev/null +++ b/src/jcifs/smb/TestLocking.java @@ -0,0 +1,124 @@ +package jcifs.smb; + +import java.io.InputStream; +import java.io.IOException; + +public class TestLocking implements Runnable +{ + + int numThreads = 1; + int numIter = 1; + long delay = 100; + String url = null; + int numComplete = 0; + long ltime = 0L; + + public void run() + { + try { + SmbFile f = new SmbFile(url); + SmbFile d = new SmbFile(f.getParent()); + byte[] buf = new byte[1024]; + + for (int ii = 0; ii < numIter; ii++) { + + synchronized (this) { + ltime = System.currentTimeMillis(); + wait(); + } + + try { + double r = Math.random(); + if (r < 0.333) { + f.exists(); +// System.out.print('e'); + } else if (r < 0.667) { + d.listFiles(); +// System.out.print('l'); + } else if (r < 1.0) { + InputStream in = f.getInputStream(); + while (in.read(buf) > 0) { +// System.out.print('r'); + } + in.close(); + } + } catch (IOException ioe) { + System.err.println(ioe.getMessage()); +//ioe.printStackTrace(System.err); + } + + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + numComplete++; + } + } + + public static void main(String[] args) throws Exception + { + if (args.length < 1) { + System.err.println("usage: TestLocking [-t ] [-i ] [-d ] url"); + System.exit(1); + } + + TestLocking t = new TestLocking(); + t.ltime = System.currentTimeMillis(); + + for (int ai = 0; ai < args.length; ai++) { + if (args[ai].equals("-t")) { + ai++; + t.numThreads = Integer.parseInt(args[ai]); + } else if (args[ai].equals("-i")) { + ai++; + t.numIter = Integer.parseInt(args[ai]); + } else if (args[ai].equals("-d")) { + ai++; + t.delay = Long.parseLong(args[ai]); + } else { + t.url = args[ai]; + } + } + + Thread[] threads = new Thread[t.numThreads]; + int ti; + + for (ti = 0; ti < t.numThreads; ti++) { + threads[ti] = new Thread(t); + System.out.print(threads[ti].getName()); + threads[ti].start(); + } + + while (t.numComplete < t.numThreads) { + long delay; + + do { + delay = 2L; + + synchronized (t) { + long expire = t.ltime + t.delay; + long ctime = System.currentTimeMillis(); + + if (expire > ctime) + delay = expire - ctime; + } + +if (delay > 2) +System.out.println("delay=" + delay); + Thread.sleep(delay); + } while (delay > 2); + + synchronized (t) { + t.notifyAll(); + } +//System.out.println("numComplete=" + t.numComplete + ",numThreads=" + t.numThreads); + } + + for (ti = 0; ti < t.numThreads; ti++) { + threads[ti].join(); + System.out.print(threads[ti].getName()); + } + + System.out.println(); + } +} diff --git a/src/jcifs/util/transport/Transport.java b/src/jcifs/util/transport/Transport.java index e244384..56eec39 100644 --- a/src/jcifs/util/transport/Transport.java +++ b/src/jcifs/util/transport/Transport.java @@ -57,12 +57,9 @@ public abstract class Transport implements Runnable { protected abstract void doRecv( Response response ) throws IOException; protected abstract void doSkip() throws IOException; - public Object setupDiscoLock = new Object(); - - public void sendrecv( Request request, + public synchronized void sendrecv( Request request, Response response, long timeout ) throws IOException { - synchronized (response_map) { makeKey( request ); response.isReceived = false; try { @@ -70,7 +67,7 @@ public abstract class Transport implements Runnable { doSend( request ); response.expiration = System.currentTimeMillis() + timeout; while (!response.isReceived) { - response_map.wait( timeout ); + wait( timeout ); timeout = response.expiration - System.currentTimeMillis(); if (timeout <= 0) { throw new TransportException( name + @@ -92,7 +89,6 @@ public abstract class Transport implements Runnable { } finally { response_map.remove( request ); } - } } private void loop() { while( thread == Thread.currentThread() ) { @@ -100,7 +96,7 @@ public abstract class Transport implements Runnable { Request key = peekKey(); if (key == null) throw new IOException( "end of stream" ); - synchronized (response_map) { + synchronized (this) { Response response = (Response)response_map.get( key ); if (response == null) { if (log.level >= 4) @@ -109,7 +105,7 @@ public abstract class Transport implements Runnable { } else { doRecv( response ); response.isReceived = true; - response_map.notifyAll(); + notifyAll(); } } } catch( Exception ex ) { @@ -201,31 +197,27 @@ public abstract class Transport implements Runnable { } } } - public void disconnect( boolean hard ) throws IOException { - synchronized(setupDiscoLock) { - synchronized(this) { - switch (state) { - case 0: /* not connected - just return */ - return; - case 2: - hard = true; - case 3: /* connected - go ahead and disconnect */ - if (response_map.size() != 0 && !hard) { - break; /* outstanding requests */ - } - doDisconnect( hard ); - case 4: /* in error - reset the transport */ - thread = null; - state = 0; - break; - default: - if (log.level >= 1) - log.println("Invalid state: " + state); - thread = null; - state = 0; - break; + public synchronized void disconnect( boolean hard ) throws IOException { + switch (state) { + case 0: /* not connected - just return */ + return; + case 2: + hard = true; + case 3: /* connected - go ahead and disconnect */ + if (response_map.size() != 0 && !hard) { + break; /* outstanding requests */ } - } + doDisconnect( hard ); + case 4: /* in error - reset the transport */ + thread = null; + state = 0; + break; + default: + if (log.level >= 1) + log.println("Invalid state: " + state); + thread = null; + state = 0; + break; } } public void run() { -- 2.11.0